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" /> - - + + - - + + - - + +