corrigir os novos erros amnhã e adicionar qual tipo de sexo a pessoa é no register
This commit is contained in:
@@ -11,10 +11,15 @@ import android.provider.MediaStore;
|
||||
import android.util.Base64;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
@@ -28,12 +33,12 @@ import retrofit2.Response;
|
||||
public class FotoActivity extends AppCompatActivity {
|
||||
|
||||
private ImageView ivFotoComida;
|
||||
private Button btnTirarFoto, btnGaleria, btnAnalisarIA, btnIrParaChat;
|
||||
private Button btnTirarFoto, btnGaleria, btnAnalisarIA, btnIrParaChat, btnCorrigir;
|
||||
private TextView tvResultadoIA;
|
||||
private Bitmap imagemCapturada;
|
||||
private String textoAnalise = "";
|
||||
|
||||
// MANTÉM A TUA CHAVE (cuidado para não partilhar no futuro)
|
||||
// MANTÉM A TUA CHAVE AQUI
|
||||
private final String MINHA_API_KEY = "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";
|
||||
|
||||
@Override
|
||||
@@ -46,6 +51,7 @@ public class FotoActivity extends AppCompatActivity {
|
||||
btnGaleria = findViewById(R.id.btnGaleria);
|
||||
btnAnalisarIA = findViewById(R.id.btnAnalisarIA);
|
||||
btnIrParaChat = findViewById(R.id.btnIrParaChat);
|
||||
btnCorrigir = findViewById(R.id.btnCorrigir); // Ligado ao XML
|
||||
tvResultadoIA = findViewById(R.id.tvResultadoIA);
|
||||
|
||||
ActivityResultLauncher<Intent> camLauncher = registerForActivityResult(
|
||||
@@ -85,7 +91,8 @@ public class FotoActivity extends AppCompatActivity {
|
||||
galLauncher.launch(intent);
|
||||
});
|
||||
|
||||
btnAnalisarIA.setOnClickListener(v -> enviarParaIA());
|
||||
// Clique para analisar pela primeira vez
|
||||
btnAnalisarIA.setOnClickListener(v -> enviarParaIA(null));
|
||||
|
||||
btnIrParaChat.setOnClickListener(v -> {
|
||||
Intent intent = new Intent(FotoActivity.this, ChatActivity.class);
|
||||
@@ -93,6 +100,9 @@ public class FotoActivity extends AppCompatActivity {
|
||||
startActivity(intent);
|
||||
});
|
||||
|
||||
// NOVO: Clique para corrigir erro
|
||||
btnCorrigir.setOnClickListener(v -> mostrarPopupCorrecao());
|
||||
|
||||
findViewById(R.id.btnVoltarFoto).setOnClickListener(v -> finish());
|
||||
}
|
||||
|
||||
@@ -103,26 +113,42 @@ public class FotoActivity extends AppCompatActivity {
|
||||
ivFotoComida.setImageBitmap(imagemCapturada);
|
||||
btnAnalisarIA.setVisibility(View.VISIBLE);
|
||||
btnIrParaChat.setVisibility(View.GONE);
|
||||
btnCorrigir.setVisibility(View.GONE); // Esconde a correção até analisar
|
||||
tvResultadoIA.setText("Pronto para analisar.");
|
||||
}
|
||||
}
|
||||
|
||||
private void enviarParaIA() {
|
||||
// Função melhorada que aceita a comida certa se o utilizador corrigir
|
||||
private void enviarParaIA(String comidaCerta) {
|
||||
tvResultadoIA.setText("A processar... ⏳");
|
||||
btnAnalisarIA.setEnabled(false);
|
||||
btnIrParaChat.setVisibility(View.GONE);
|
||||
btnCorrigir.setVisibility(View.GONE);
|
||||
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
imagemCapturada.compress(Bitmap.CompressFormat.JPEG, 50, os);
|
||||
String base64 = Base64.encodeToString(os.toByteArray(), Base64.NO_WRAP);
|
||||
|
||||
String ordemParaIA = "És um nutricionista prático. Identifica a comida e dá os valores de forma SUPER RESUMIDA. " +
|
||||
"REGRAS: 1. Português de Portugal. 2. SEM asteriscos. 3. Máximo 4 linhas. " +
|
||||
"Formato exato: \n" +
|
||||
"Prato: [Nome]\n" +
|
||||
"Calorias: [Valor] kcal\n" +
|
||||
"Macros: [X]g Proteína, [X]g Hidratos, [X]g Gordura\n" +
|
||||
"Dica: [Uma frase curta].";
|
||||
String ordemParaIA;
|
||||
if (comidaCerta == null) {
|
||||
// Análise normal
|
||||
ordemParaIA = "És um nutricionista prático. Identifica a comida e dá os valores de forma SUPER RESUMIDA. " +
|
||||
"REGRAS: 1. Português de Portugal. 2. SEM asteriscos. 3. Máximo 4 linhas. " +
|
||||
"Formato exato: \n" +
|
||||
"Prato: [Nome]\n" +
|
||||
"Calorias: [Valor] kcal\n" +
|
||||
"Macros: [X]g Proteína, [X]g Hidratos, [X]g Gordura\n" +
|
||||
"Dica: [Uma frase curta].";
|
||||
} else {
|
||||
// Análise forçada com a correção do utilizador
|
||||
ordemParaIA = "Atenção: A tua análise anterior falhou. O prato na imagem é na verdade: '" + comidaCerta + "'. " +
|
||||
"Esquece tudo o resto e foca-te em dar os valores reais APENAS para '" + comidaCerta + "'. " +
|
||||
"Usa este formato exato: \n" +
|
||||
"Prato: " + comidaCerta + "\n" +
|
||||
"Calorias: [Valor] kcal\n" +
|
||||
"Macros: [X]g Proteína, [X]g Hidratos, [X]g Gordura\n" +
|
||||
"Dica: [Frase de saúde curta e sem asteriscos].";
|
||||
}
|
||||
|
||||
AiRequest request = new AiRequest(Collections.singletonList(
|
||||
new Message("user", java.util.Arrays.asList(
|
||||
@@ -142,9 +168,17 @@ public class FotoActivity extends AppCompatActivity {
|
||||
String resposta = response.body().choices.get(0).message.content;
|
||||
textoAnalise = resposta.replace("**", "").replace("*", "");
|
||||
tvResultadoIA.setText(textoAnalise);
|
||||
btnIrParaChat.setVisibility(View.VISIBLE);
|
||||
|
||||
// A MAGIA ACONTECE AQUI!
|
||||
// Mostra os botões
|
||||
btnIrParaChat.setVisibility(View.VISIBLE);
|
||||
btnCorrigir.setVisibility(View.VISIBLE);
|
||||
|
||||
// Se ele estiver a corrigir, apagamos o erro passado!
|
||||
if (comidaCerta != null) {
|
||||
desfazerUltimoErro();
|
||||
}
|
||||
|
||||
// Guarda a nova resposta
|
||||
extrairEGuardarDados(textoAnalise);
|
||||
|
||||
} catch (Exception e) { tvResultadoIA.setText("Erro na resposta."); }
|
||||
@@ -158,7 +192,34 @@ public class FotoActivity extends AppCompatActivity {
|
||||
});
|
||||
}
|
||||
|
||||
// Função que "lê" a resposta da IA e guarda os números E A DICA
|
||||
// --- POPUP PARA CORREÇÃO MANUAL ---
|
||||
private void mostrarPopupCorrecao() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle("Corrigir a IA 🤔");
|
||||
builder.setMessage("A IA enganou-se? O que estava realmente no teu prato?");
|
||||
|
||||
final EditText input = new EditText(this);
|
||||
input.setHint("Ex: Hambúrguer de Frango");
|
||||
|
||||
LinearLayout layout = new LinearLayout(this);
|
||||
layout.setPadding(50, 20, 50, 0);
|
||||
layout.addView(input);
|
||||
builder.setView(layout);
|
||||
|
||||
builder.setPositiveButton("Re-Analisar", (dialog, which) -> {
|
||||
String comidaCerta = input.getText().toString().trim();
|
||||
if (!comidaCerta.isEmpty()) {
|
||||
enviarParaIA(comidaCerta); // Manda o texto escrito pelo user
|
||||
} else {
|
||||
Toast.makeText(FotoActivity.this, "Tens de escrever a comida!", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
|
||||
builder.setNegativeButton("Cancelar", null);
|
||||
builder.show();
|
||||
}
|
||||
|
||||
// --- FUNÇÃO PARA SALVAR OS DADOS E A DICA ---
|
||||
private void extrairEGuardarDados(String texto) {
|
||||
try {
|
||||
int indexNomeStart = texto.indexOf("Prato: ") + 7;
|
||||
@@ -170,7 +231,6 @@ public class FotoActivity extends AppCompatActivity {
|
||||
int hidratos = extrairNumero(texto, "Proteína, ", "g Hidratos");
|
||||
int gordura = extrairNumero(texto, "Hidratos, ", "g Gordura");
|
||||
|
||||
// EXTRAIR A DICA DA IA
|
||||
String dicaIA = "Continua a registar refeições para ver dicas.";
|
||||
if (texto.contains("Dica: ")) {
|
||||
int indexDica = texto.indexOf("Dica: ") + 6;
|
||||
@@ -181,17 +241,39 @@ public class FotoActivity extends AppCompatActivity {
|
||||
SharedPreferences.Editor editor = prefs.edit();
|
||||
|
||||
editor.putString("ultimo_prato", nomePrato);
|
||||
editor.putString("ultima_dica_ia", dicaIA); // Guarda a dica
|
||||
editor.putString("ultima_dica_ia", dicaIA);
|
||||
|
||||
editor.putInt("cal_hoje", prefs.getInt("cal_hoje", 0) + calorias);
|
||||
editor.putInt("prot_hoje", prefs.getInt("prot_hoje", 0) + proteina);
|
||||
editor.putInt("hidr_hoje", prefs.getInt("hidr_hoje", 0) + hidratos);
|
||||
editor.putInt("gord_hoje", prefs.getInt("gord_hoje", 0) + gordura);
|
||||
|
||||
// GUAAAAARDA O ERRO PARA PODERMOS APAGAR SE O GAJO CLICAR EM "CORRIGIR"
|
||||
editor.putInt("ultimo_erro_cal", calorias);
|
||||
editor.putInt("ultimo_erro_prot", proteina);
|
||||
editor.putInt("ultimo_erro_hidr", hidratos);
|
||||
editor.putInt("ultimo_erro_gord", gordura);
|
||||
|
||||
editor.apply();
|
||||
} catch (Exception e) {
|
||||
// Ignora se a IA responder noutro formato para não crashar
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
// --- FUNÇÃO PARA REMOVER O ÚLTIMO PRATO QUE FOI MAL LIDO ---
|
||||
private void desfazerUltimoErro() {
|
||||
SharedPreferences prefs = getSharedPreferences("DadosSaude", MODE_PRIVATE);
|
||||
SharedPreferences.Editor editor = prefs.edit();
|
||||
|
||||
int calAntiga = prefs.getInt("ultimo_erro_cal", 0);
|
||||
int protAntiga = prefs.getInt("ultimo_erro_prot", 0);
|
||||
int hidrAntiga = prefs.getInt("ultimo_erro_hidr", 0);
|
||||
int gordAntiga = prefs.getInt("ultimo_erro_gord", 0);
|
||||
|
||||
editor.putInt("cal_hoje", prefs.getInt("cal_hoje", 0) - calAntiga);
|
||||
editor.putInt("prot_hoje", prefs.getInt("prot_hoje", 0) - protAntiga);
|
||||
editor.putInt("hidr_hoje", prefs.getInt("hidr_hoje", 0) - hidrAntiga);
|
||||
editor.putInt("gord_hoje", prefs.getInt("gord_hoje", 0) - gordAntiga);
|
||||
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
private int extrairNumero(String texto, String inicio, String fim) {
|
||||
|
||||
Reference in New Issue
Block a user