diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml
new file mode 100644
index 0000000..4787784
--- /dev/null
+++ b/.idea/dictionaries/project.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 74dd639..b2c751a 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,3 @@
-
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5cce8b9..959f6cc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
+
+
-
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/app/src/main/java/com/example/finzora/HomeActivity.java b/app/src/main/java/com/example/finzora/HomeActivity.java
index c2fcd97..21e2cde 100644
--- a/app/src/main/java/com/example/finzora/HomeActivity.java
+++ b/app/src/main/java/com/example/finzora/HomeActivity.java
@@ -1,11 +1,43 @@
package com.example.finzora;
+import androidx.appcompat.app.AppCompatActivity;
+import android.content.Intent;
import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class HomeActivity extends AppCompatActivity {
-public class HomeActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_home);
+
+ // Criar layout SIMPLES programaticamente
+ TextView textView = new TextView(this);
+ textView.setText("Bem-vindo ao Finzora!");
+ textView.setTextSize(24);
+ textView.setPadding(50, 100, 50, 50);
+
+ Button logoutBtn = new Button(this);
+ logoutBtn.setText("LOGOUT");
+ logoutBtn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(HomeActivity.this, "Logout realizado", Toast.LENGTH_SHORT).show();
+ finish(); // Volta para MainActivity
+ }
+ });
+
+ androidx.appcompat.widget.LinearLayoutCompat layout = new androidx.appcompat.widget.LinearLayoutCompat(this);
+ layout.setOrientation(androidx.appcompat.widget.LinearLayoutCompat.VERTICAL);
+ layout.setGravity(android.view.Gravity.CENTER);
+ layout.addView(textView);
+ layout.addView(logoutBtn);
+
+ setContentView(layout);
+
+ Toast.makeText(this, "Home Activity carregada!", Toast.LENGTH_SHORT).show();
}
}
diff --git a/app/src/main/java/com/example/finzora/MainActivity.java b/app/src/main/java/com/example/finzora/MainActivity.java
index 3cc27f9..b3ccd2d 100644
--- a/app/src/main/java/com/example/finzora/MainActivity.java
+++ b/app/src/main/java/com/example/finzora/MainActivity.java
@@ -1,57 +1,175 @@
package com.example.finzora;
+import androidx.activity.OnBackPressedCallback;
import androidx.appcompat.app.AppCompatActivity;
+
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
+import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
- EditText inputEmail, inputPassword;
- Button btnLogin;
+ // Declaração das variáveis
+ private EditText inputEmail, inputPassword;
+ private Button btnLogin;
+ private TextView btnRegister;
- // Credenciais de exemplo (podes mudar)
- private final String USER_EMAIL = "admin@gmail.com";
- private final String USER_PASSWORD = "123456";
+ // Credenciais para teste
+ private final String TEST_EMAIL = "teste@email.com";
+ private final String TEST_PASSWORD = "123456";
+
+ // Para controlar o double back press
+ private boolean doubleBackToExitPressedOnce = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
- inputEmail = findViewById(R.id.inputEmail);
- inputPassword = findViewById(R.id.inputPassword);
- btnLogin = findViewById(R.id.btnLogin);
+ // Configurar o botão voltar (nova forma)
+ setupBackButton();
- btnLogin.setOnClickListener(new View.OnClickListener() {
+ // Inicializar views
+ initializeViews();
+
+ // Configurar botão de Login
+ setupLoginButton();
+
+ // Configurar link de Registro
+ setupRegisterButton();
+ }
+
+ private void setupBackButton() {
+ // Nova forma de tratar o botão voltar (Android 13+)
+ getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
@Override
- public void onClick(View v) {
- String email = inputEmail.getText().toString().trim();
- String password = inputPassword.getText().toString().trim();
-
- if (email.isEmpty() || password.isEmpty()) {
- Toast.makeText(MainActivity.this, "Preencha todos os campos", Toast.LENGTH_SHORT).show();
- return;
- }
-
- // Verificação simples
- if (email.equals(USER_EMAIL) && password.equals(USER_PASSWORD)) {
-
- Toast.makeText(MainActivity.this, "Login efetuado!", Toast.LENGTH_SHORT).show();
-
- // Ir para a próxima página
- Intent intent = new Intent(MainActivity.this, HomeActivity.class);
- startActivity(intent);
+ public void handleOnBackPressed() {
+ // Para sair do app com double back press
+ if (doubleBackToExitPressedOnce) {
+ // Se já pressionou uma vez, sai do app
finish();
-
} else {
- Toast.makeText(MainActivity.this, "Email ou palavra-passe incorretos", Toast.LENGTH_SHORT).show();
+ // Primeira vez que pressiona
+ doubleBackToExitPressedOnce = true;
+ Toast.makeText(MainActivity.this,
+ "Pressione VOLTAR novamente para sair",
+ Toast.LENGTH_SHORT).show();
+
+ // Reset após 2 segundos
+ getWindow().getDecorView().postDelayed(() ->
+ doubleBackToExitPressedOnce = false, 2000);
}
}
});
-
}
-}
+
+ private void initializeViews() {
+ inputEmail = findViewById(R.id.inputEmail);
+ inputPassword = findViewById(R.id.inputPassword);
+ btnLogin = findViewById(R.id.btnLogin);
+ btnRegister = findViewById(R.id.btnRegister);
+ }
+
+ private void setupLoginButton() {
+ btnLogin.setOnClickListener(v -> realizarLogin());
+ }
+
+ private void setupRegisterButton() {
+ btnRegister.setOnClickListener(v -> abrirTelaRegistro());
+ }
+
+ private void realizarLogin() {
+ // Obter valores dos campos
+ String email = inputEmail.getText().toString().trim();
+ String password = inputPassword.getText().toString().trim();
+
+ // Validar campos vazios
+ if (email.isEmpty()) {
+ inputEmail.setError("Digite seu email");
+ inputEmail.requestFocus();
+ return;
+ }
+
+ if (password.isEmpty()) {
+ inputPassword.setError("Digite sua senha");
+ inputPassword.requestFocus();
+ return;
+ }
+
+ // Validar formato do email
+ if (!isValidEmail(email)) {
+ inputEmail.setError("Digite um email válido");
+ inputEmail.requestFocus();
+ return;
+ }
+
+ // Verificar credenciais
+ if (email.equals(TEST_EMAIL) && password.equals(TEST_PASSWORD)) {
+ // Login bem-sucedido
+ Toast.makeText(this, "Login realizado com sucesso!", Toast.LENGTH_SHORT).show();
+
+ // Ir para HomeActivity
+ Intent intent = new Intent(MainActivity.this, HomeActivity.class);
+ startActivity(intent);
+
+ // Fechar esta activity
+ finish();
+ } else {
+ // Credenciais incorretas
+ Toast.makeText(this, "Email ou senha incorretos", Toast.LENGTH_SHORT).show();
+ inputPassword.setText("");
+ inputPassword.requestFocus();
+ }
+ }
+
+ private boolean isValidEmail(String email) {
+ return email.contains("@") && email.contains(".");
+ }
+
+ private void abrirTelaRegistro() {
+ try {
+ Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
+ startActivityForResult(intent, 100);
+ } catch (Exception e) {
+ Toast.makeText(this, "Erro ao abrir registro", Toast.LENGTH_LONG).show();
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ if (requestCode == 100 && resultCode == RESULT_OK && data != null) {
+ String novoEmail = data.getStringExtra("EMAIL");
+ String novoPassword = data.getStringExtra("PASSWORD");
+
+ if (novoEmail != null && novoPassword != null) {
+ inputEmail.setText(novoEmail);
+ inputPassword.setText(novoPassword);
+ Toast.makeText(this, "Conta criada! Faça login.", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ // Limpar campo da senha quando voltar
+ if (inputPassword != null) {
+ inputPassword.setText("");
+ }
+
+ // Dar foco ao campo de email
+ if (inputEmail != null) {
+ inputEmail.requestFocus();
+ }
+
+ // Resetar o double back press
+ doubleBackToExitPressedOnce = false;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/finzora/OnboardingActivity.java b/app/src/main/java/com/example/finzora/OnboardingActivity.java
new file mode 100644
index 0000000..ad9350a
--- /dev/null
+++ b/app/src/main/java/com/example/finzora/OnboardingActivity.java
@@ -0,0 +1,138 @@
+package com.example.finzora;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.viewpager2.widget.ViewPager2;
+
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+
+import com.example.finzora.MainActivity;
+
+public class OnboardingActivity extends AppCompatActivity {
+
+ private ViewPager2 viewPager;
+ private Button btnSkip, btnNext;
+ private ImageButton btnPrev;
+ private LinearLayout dotsLayout;
+ private int currentPage = 0;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_onboarding);
+
+ // Inicializar views
+ viewPager = findViewById(R.id.viewPager);
+ btnSkip = findViewById(R.id.btnSkip);
+ btnNext = findViewById(R.id.btnNext);
+ btnPrev = findViewById(R.id.btnPrev);
+ dotsLayout = findViewById(R.id.dotsLayout);
+
+ // Configurar ViewPager
+ OnboardingAdapter adapter = new OnboardingAdapter();
+ viewPager.setAdapter(adapter);
+
+ // Configurar dots indicadores
+ setupDots();
+
+ // Configurar botões
+ setupButtons();
+
+ // Ouvir mudanças de página
+ viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+ @Override
+ public void onPageSelected(int position) {
+ currentPage = position;
+ updateDots(position);
+ updateButtons(position);
+ }
+ });
+ }
+
+ private void setupDots() {
+ dotsLayout.removeAllViews();
+
+ for (int i = 0; i < 5; i++) {
+ View dot = new View(this);
+ dot.setBackgroundColor(Color.GRAY);
+
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(16, 16);
+ params.setMargins(8, 0, 8, 0);
+ dot.setLayoutParams(params);
+
+ dotsLayout.addView(dot);
+ }
+
+ updateDots(0);
+ }
+
+ private void updateDots(int position) {
+ for (int i = 0; i < dotsLayout.getChildCount(); i++) {
+ View dot = dotsLayout.getChildAt(i);
+ if (i == position) {
+ dot.setBackgroundColor(Color.parseColor("#2196F3")); // Azul Finzora
+ dot.animate().scaleX(1.5f).scaleY(1.5f).setDuration(200).start();
+ } else {
+ dot.setBackgroundColor(Color.GRAY);
+ dot.animate().scaleX(1f).scaleY(1f).setDuration(200).start();
+ }
+ }
+ }
+
+ private void setupButtons() {
+ btnSkip.setOnClickListener(v -> skipTutorial());
+ btnNext.setOnClickListener(v -> nextPage());
+ btnPrev.setOnClickListener(v -> previousPage());
+ }
+
+ private void updateButtons(int position) {
+ if (position == 4) { // Última página
+ btnNext.setText("COMEÇAR");
+ btnPrev.setVisibility(View.VISIBLE);
+ btnSkip.setVisibility(View.GONE);
+ } else if (position == 0) { // Primeira página
+ btnNext.setText("PRÓXIMO");
+ btnPrev.setVisibility(View.INVISIBLE);
+ btnSkip.setVisibility(View.VISIBLE);
+ } else { // Páginas do meio
+ btnNext.setText("PRÓXIMO");
+ btnPrev.setVisibility(View.VISIBLE);
+ btnSkip.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void nextPage() {
+ if (currentPage < 4) {
+ viewPager.setCurrentItem(currentPage + 1, true);
+ } else {
+ startMainApp();
+ }
+ }
+
+ private void previousPage() {
+ if (currentPage > 0) {
+ viewPager.setCurrentItem(currentPage - 1, true);
+ }
+ }
+
+ private void skipTutorial() {
+ startMainApp();
+ }
+
+ private void startMainApp() {
+ Intent intent = new Intent(OnboardingActivity.this, MainActivity.class);
+ startActivity(intent);
+ finish();
+ }
+
+ @Override
+ public void onBackPressed() {
+ // Pressionar back pula direto para o app
+ startMainApp();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/finzora/OnboardingAdapter.java b/app/src/main/java/com/example/finzora/OnboardingAdapter.java
new file mode 100644
index 0000000..be95471
--- /dev/null
+++ b/app/src/main/java/com/example/finzora/OnboardingAdapter.java
@@ -0,0 +1,88 @@
+package com.example.finzora;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+public class OnboardingAdapter extends RecyclerView.Adapter {
+
+ // Títulos das páginas
+ private final String[] titles = {
+ "Bem-vindo ao Finase!",
+ "Registe as Suas Transações",
+ "Planeie o Seu Orçamento",
+ "Visualize os Seus Dados",
+ "Receba Dicas Personalizadas"
+ };
+
+ // Descrições das páginas
+ private final String[] descriptions = {
+ "A sua aplicação pessoal de gestão financeira. Controle as suas finanças de forma simples e intuitiva.",
+ "Adicione receitas e despesas facilmente. Organize tudo por categorias para ter uma visão clara dos seus gastos.",
+ "Defina limites e controle os gastos. Crie orçamentos mensais e receba alertas quando exceder os limites.",
+ "Veja gráficos interativos com a distribuição dos seus gastos, tendências mensais e comparações detalhadas.",
+ "Conselhos baseados nos seus hábitos. O Finase analisa os seus gastos e fornece dicas para melhorar a sua saúde financeira."
+ };
+
+ // Cores para os ícones (vamos usar círculos coloridos)
+ private final int[] colors = {
+ android.R.color.holo_blue_dark, // Azul
+ android.R.color.holo_green_dark, // Verde
+ android.R.color.holo_orange_dark, // Laranja
+ android.R.color.holo_purple, // Roxo
+ android.R.color.holo_red_dark // Vermelho
+ };
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_onboarding, parent, false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ // Configurar título e descrição
+ holder.title.setText(titles[position]);
+ holder.description.setText(descriptions[position]);
+
+ // Criar um círculo colorido como "ícone"
+ View circle = holder.itemView.findViewById(R.id.circleView);
+ if (circle != null) {
+ circle.setBackgroundColor(holder.itemView.getContext()
+ .getResources().getColor(colors[position]));
+ }
+
+ // Animação de entrada
+ holder.itemView.setAlpha(0f);
+ holder.itemView.setTranslationY(50f);
+ holder.itemView.animate()
+ .alpha(1f)
+ .translationY(0f)
+ .setDuration(500)
+ .setStartDelay(position * 100L)
+ .start();
+ }
+
+ @Override
+ public int getItemCount() {
+ return 5; // 5 páginas do tutorial
+ }
+
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ TextView title;
+ TextView description;
+
+ ViewHolder(View itemView) {
+ super(itemView);
+ title = itemView.findViewById(R.id.title);
+ description = itemView.findViewById(R.id.description);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/finzora/RegisterActivity.java b/app/src/main/java/com/example/finzora/RegisterActivity.java
new file mode 100644
index 0000000..e440abd
--- /dev/null
+++ b/app/src/main/java/com/example/finzora/RegisterActivity.java
@@ -0,0 +1,132 @@
+package com.example.finzora;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+public class RegisterActivity extends AppCompatActivity {
+
+ // Declaração SIMPLES
+ EditText inputNome, inputEmail, inputPassword, inputConfirmPassword;
+ Button btnRegister, btnLogin;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_register);
+
+ // Mensagem de debug
+ Toast.makeText(this, "RegisterActivity iniciada", Toast.LENGTH_SHORT).show();
+
+ // Inicializar views
+ initViews();
+
+ // Configurar botões
+ setupButtons();
+ }
+
+ private void initViews() {
+ inputNome = findViewById(R.id.inputName);
+ inputEmail = findViewById(R.id.inputEmail);
+ inputPassword = findViewById(R.id.inputPassword);
+ inputConfirmPassword = findViewById(R.id.inputConfirmPassword);
+ btnRegister = findViewById(R.id.btnRegister);
+ btnLogin = findViewById(R.id.btnLogin);
+
+ // Verificar se encontrou TODAS as views
+ checkViews();
+ }
+
+ private void checkViews() {
+ String mensagem = "Views encontradas: ";
+
+ if (inputNome != null) mensagem += "Nome ✓ ";
+ if (inputEmail != null) mensagem += "Email ✓ ";
+ if (inputPassword != null) mensagem += "Password ✓ ";
+ if (inputConfirmPassword != null) mensagem += "ConfirmPassword ✓ ";
+ if (btnRegister != null) mensagem += "BtnRegister ✓ ";
+ if (btnLogin != null) mensagem += "BtnLogin ✓ ";
+
+ Toast.makeText(this, mensagem, Toast.LENGTH_LONG).show();
+ }
+
+ private void setupButtons() {
+ // Botão Registrar
+ btnRegister.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ registrarConta();
+ }
+ });
+
+ // Botão Voltar
+ btnLogin.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish(); // Volta para MainActivity
+ }
+ });
+ }
+
+ private void registrarConta() {
+ // Obter valores
+ String nome = inputNome.getText().toString().trim();
+ String email = inputEmail.getText().toString().trim();
+ String password = inputPassword.getText().toString();
+ String confirmPassword = inputConfirmPassword.getText().toString();
+
+ // Validar
+ if (nome.isEmpty()) {
+ Toast.makeText(this, "Digite seu nome", Toast.LENGTH_SHORT).show();
+ inputNome.requestFocus();
+ return;
+ }
+
+ if (email.isEmpty()) {
+ Toast.makeText(this, "Digite seu email", Toast.LENGTH_SHORT).show();
+ inputEmail.requestFocus();
+ return;
+ }
+
+ if (password.isEmpty()) {
+ Toast.makeText(this, "Crie uma palavra-passe", Toast.LENGTH_SHORT).show();
+ inputPassword.requestFocus();
+ return;
+ }
+
+ if (confirmPassword.isEmpty()) {
+ Toast.makeText(this, "Confirme a palavra-passe", Toast.LENGTH_SHORT).show();
+ inputConfirmPassword.requestFocus();
+ return;
+ }
+
+ if (!password.equals(confirmPassword)) {
+ Toast.makeText(this, "As palavras-passe não são iguais", Toast.LENGTH_SHORT).show();
+ inputConfirmPassword.requestFocus();
+ return;
+ }
+
+ if (password.length() < 6) {
+ Toast.makeText(this, "A palavra-passe deve ter pelo menos 6 caracteres", Toast.LENGTH_SHORT).show();
+ inputPassword.requestFocus();
+ return;
+ }
+
+ // Sucesso!
+ Toast.makeText(this, "Conta criada com sucesso!", Toast.LENGTH_SHORT).show();
+
+ // Pode passar os dados de volta para o login
+ Intent data = new Intent();
+ data.putExtra("EMAIL", email);
+ data.putExtra("PASSWORD", password);
+ setResult(RESULT_OK, data);
+
+ // Fechar esta activity
+ finish();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/anim/pulse.xml b/app/src/main/res/anim/pulse.xml
new file mode 100644
index 0000000..f5a07d2
--- /dev/null
+++ b/app/src/main/res/anim/pulse.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml
new file mode 100644
index 0000000..a9ca690
--- /dev/null
+++ b/app/src/main/res/anim/slide_in_right.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/slide_out_left.xml b/app/src/main/res/anim/slide_out_left.xml
new file mode 100644
index 0000000..e9162d7
--- /dev/null
+++ b/app/src/main/res/anim/slide_out_left.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/slide_up.xml b/app/src/main/res/anim/slide_up.xml
new file mode 100644
index 0000000..a46f42c
--- /dev/null
+++ b/app/src/main/res/anim/slide_up.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/color/colors.xml b/app/src/main/res/color/colors.xml
new file mode 100644
index 0000000..245a314
--- /dev/null
+++ b/app/src/main/res/color/colors.xml
@@ -0,0 +1,47 @@
+
+
+
+ #2196F3
+ #1976D2
+ #BBDEFB
+
+
+ #FF9800
+ #F57C00
+
+
+ #4CAF50
+ #F44336
+ #FFC107
+ #009688
+
+
+ #212121
+ #757575
+ #BDBDBD
+ #FFFFFF
+
+
+ #F5F5F5
+ #FFFFFF
+ #263238
+
+
+ #E0E0E0
+ #BDBDBD
+
+
+ #9E9E9E
+ #D32F2F
+ #388E3C
+
+
+ #FF9800
+ #3F51B5
+ #795548
+ #9C27B0
+ #E91E63
+ #4CAF50
+ #2196F3
+ #607D8B
+
\ No newline at end of file
diff --git a/app/src/main/res/color/strings.xml b/app/src/main/res/color/strings.xml
new file mode 100644
index 0000000..85383b3
--- /dev/null
+++ b/app/src/main/res/color/strings.xml
@@ -0,0 +1,99 @@
+
+
+
+ Finzora
+ Sua gestão financeira inteligente
+
+
+ Bem-vindo ao Finzora
+ Email
+ Palavra-passe
+ ENTRAR
+ Esqueceu a palavra-passe?
+ Não tem conta?
+ Registre-se aqui
+
+
+ Criar Nova Conta
+ Nome completo
+ Confirmar palavra-passe
+ REGISTRAR
+ Já tem uma conta?
+ Faça login
+
+
+ Bem-vindo ao Finzora!
+ A sua aplicação pessoal de gestão financeira. Controle as suas finanças de forma simples e intuitiva.
+
+ Registe as Suas Transações
+ Adicione receitas e despesas facilmente. Organize tudo por categorias para ter uma visão clara dos seus gastos.
+
+ Planeie o Seu Orçamento
+ Defina limites e controle os gastos. Crie orçamentos mensais e receba alertas quando exceder os limites.
+
+ Visualize os Seus Dados
+ Veja gráficos interativos com a distribuição dos seus gastos, tendências mensais e comparações detalhadas.
+
+ Receba Dicas Personalizadas
+ Conselhos baseados nos seus hábitos. O Finzora analisa os seus gastos e fornece dicas para melhorar a sua saúde financeira.
+
+ Saltar Tutorial
+ Próximo
+ Começar
+
+
+ Dashboard
+ Saldo Total
+ Receitas do Mês
+ Despesas do Mês
+ Transações Recentes
+ Ver Tudo
+ Adicionar Transação
+
+
+ Alimentação
+ Transporte
+ Moradia
+ Entretenimento
+ Compras
+ Saúde
+ Educação
+ Outros
+
+
+ Receita
+ Despesa
+
+
+ Por favor, preencha este campo
+ Digite um email válido
+ A palavra-passe deve ter pelo menos 6 caracteres
+ As palavras-passe não coincidem
+ Login realizado com sucesso!
+ Conta criada com sucesso!
+ Transação adicionada!
+ A carregar…
+ Nenhuma transação registada
+
+
+ Início
+ Transações
+ Orçamento
+ Relatórios
+ Perfil
+ Sair
+
+
+ Jan
+ Fev
+ Mar
+ Abr
+ Mai
+ Jun
+ Jul
+ Ago
+ Set
+ Out
+ Nov
+ Dez
+
\ No newline at end of file
diff --git a/app/src/main/res/color/styles.xml b/app/src/main/res/color/styles.xml
new file mode 100644
index 0000000..125c4b2
--- /dev/null
+++ b/app/src/main/res/color/styles.xml
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/btn_primary.xml b/app/src/main/res/drawable/btn_primary.xml
new file mode 100644
index 0000000..aab734d
--- /dev/null
+++ b/app/src/main/res/drawable/btn_primary.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/card_bg.xml b/app/src/main/res/drawable/card_bg.xml
new file mode 100644
index 0000000..a8b409b
--- /dev/null
+++ b/app/src/main/res/drawable/card_bg.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/category_background.xml b/app/src/main/res/drawable/category_background.xml
new file mode 100644
index 0000000..f7397c0
--- /dev/null
+++ b/app/src/main/res/drawable/category_background.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/chatgpt_image_19_11_2025__09_17_01.png b/app/src/main/res/drawable/chatgpt_image_19_11_2025__09_17_01.png
new file mode 100644
index 0000000..7661d51
Binary files /dev/null and b/app/src/main/res/drawable/chatgpt_image_19_11_2025__09_17_01.png differ
diff --git a/app/src/main/res/drawable/dot_selected.xml b/app/src/main/res/drawable/dot_selected.xml
new file mode 100644
index 0000000..423497f
--- /dev/null
+++ b/app/src/main/res/drawable/dot_selected.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/dot_unselected.xml b/app/src/main/res/drawable/dot_unselected.xml
new file mode 100644
index 0000000..f991c9c
--- /dev/null
+++ b/app/src/main/res/drawable/dot_unselected.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/edittext_background.xml b/app/src/main/res/drawable/edittext_background.xml
new file mode 100644
index 0000000..3013c82
--- /dev/null
+++ b/app/src/main/res/drawable/edittext_background.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/edittext_bg.xml b/app/src/main/res/drawable/edittext_bg.xml
new file mode 100644
index 0000000..a8b409b
--- /dev/null
+++ b/app/src/main/res/drawable/edittext_bg.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/gradient_primary.xml b/app/src/main/res/drawable/gradient_primary.xml
new file mode 100644
index 0000000..cdab9d7
--- /dev/null
+++ b/app/src/main/res/drawable/gradient_primary.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml
new file mode 100644
index 0000000..6a5fe83
--- /dev/null
+++ b/app/src/main/res/drawable/ic_add.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_budget.xml b/app/src/main/res/drawable/ic_budget.xml
new file mode 100644
index 0000000..218acdf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_budget.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_charts.xml b/app/src/main/res/drawable/ic_charts.xml
new file mode 100644
index 0000000..425872f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_charts.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_prev.xml b/app/src/main/res/drawable/ic_prev.xml
new file mode 100644
index 0000000..eee392b
--- /dev/null
+++ b/app/src/main/res/drawable/ic_prev.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_tips.xml b/app/src/main/res/drawable/ic_tips.xml
new file mode 100644
index 0000000..95fd9cb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_tips.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_transactions.xml b/app/src/main/res/drawable/ic_transactions.xml
new file mode 100644
index 0000000..59a6fb4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_transactions.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_welcome.xml b/app/src/main/res/drawable/ic_welcome.xml
new file mode 100644
index 0000000..e2fcfb7
--- /dev/null
+++ b/app/src/main/res/drawable/ic_welcome.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/logo_finzora.xml b/app/src/main/res/drawable/logo_finzora.xml
new file mode 100644
index 0000000..a8b409b
--- /dev/null
+++ b/app/src/main/res/drawable/logo_finzora.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_dashboard.xml b/app/src/main/res/layout/activity_dashboard.xml
new file mode 100644
index 0000000..fab5637
--- /dev/null
+++ b/app/src/main/res/layout/activity_dashboard.xml
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml
index 77d9ef6..e16fbea 100644
--- a/app/src/main/res/layout/activity_home.xml
+++ b/app/src/main/res/layout/activity_home.xml
@@ -1,6 +1,17 @@
-
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:gravity="center"
+ android:padding="20dp">
-
\ No newline at end of file
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 1444a34..9504afc 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,115 +1,64 @@
-
+ android:orientation="vertical"
+ android:gravity="center"
+ android:padding="20dp">
-
+
+ android:text="Finzora"
+ android:textSize="32sp"
+ android:textStyle="bold"
+ android:textColor="#2196F3"
+ android:layout_marginBottom="40dp" />
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_onboarding.xml b/app/src/main/res/layout/activity_onboarding.xml
new file mode 100644
index 0000000..5b89753
--- /dev/null
+++ b/app/src/main/res/layout/activity_onboarding.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml
new file mode 100644
index 0000000..d7bfbb7
--- /dev/null
+++ b/app/src/main/res/layout/activity_register.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_onboarding.xml b/app/src/main/res/layout/item_onboarding.xml
new file mode 100644
index 0000000..a122acf
--- /dev/null
+++ b/app/src/main/res/layout/item_onboarding.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_transaction.xml b/app/src/main/res/layout/item_transaction.xml
new file mode 100644
index 0000000..811c5fc
--- /dev/null
+++ b/app/src/main/res/layout/item_transaction.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index c8524cd..15111a9 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,5 +1,20 @@
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
#FF000000
#FFFFFFFF
+
+
+ #2196F3
+ #1976D2
+ #03DAC6
+ #212121
+ #757575
+ #F5F5F5
+ #F44336
+ #4CAF50
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..4a8825a
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file