This commit is contained in:
2026-04-21 17:15:25 +01:00
parent d112cd50d7
commit a74f0e4260
16 changed files with 445 additions and 31 deletions

View File

@@ -10,11 +10,14 @@ import android.view.ViewGroup;
import com.example.lifegrid.R;
/**
* AtivosFragment diz respeito à janela do ecossistema dedicada à gestão
* do património estático ou em avaliação progressiva na bolsa/bancos.
*/
public class AtivosFragment extends Fragment {
public AtivosFragment() {
// Required empty public constructor
// Construtor público vazio obrigatório
}
@Override
@@ -25,7 +28,7 @@ public class AtivosFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// Inflaciona o layout para este fragmento
View root = inflater.inflate(R.layout.fragment_ativos, container, false);

View File

@@ -10,11 +10,14 @@ import android.view.ViewGroup;
import com.example.lifegrid.R;
/**
* DefinicoesFragment carrega os menus base de configurações do utilizador,
* sendo o local ideal para definir opções de acessibilidade, mudança de password e logout.
*/
public class DefinicoesFragment extends Fragment {
public DefinicoesFragment() {
// Required empty public constructor
// Construtor público vazio obrigatório
}
@Override
@@ -25,7 +28,7 @@ public class DefinicoesFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// Inflaciona o layout para este fragmento
View root = inflater.inflate(R.layout.fragment_definicoes, container, false);

View File

@@ -10,11 +10,14 @@ import android.view.ViewGroup;
import com.example.lifegrid.R;
/**
* DocumentosFragment é a área orientada ao scan, compilação de faturas e arquivo seguro.
* Foca-se unicamente nas componentes não contabéis mas sim em anotações em anexo faturado.
*/
public class DocumentosFragment extends Fragment {
public DocumentosFragment() {
// Required empty public constructor
// Construtor público vazio obrigatório
}
@Override
@@ -25,7 +28,7 @@ public class DocumentosFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// Inflaciona o layout para este fragmento
View root = inflater.inflate(R.layout.fragment_documentos, container, false);

View File

@@ -10,10 +10,14 @@ import android.view.ViewGroup;
import com.example.lifegrid.R;
/**
* GraficosFragment tem como único propósito compilar a informação da aplicação sob uma
* componente puramente matemática exibida de forma ilustrativa. Tarta da visão de Dashboard de estatística.
*/
public class GraficosFragment extends Fragment {
public GraficosFragment() {
// Required empty public constructor
// Construtor público vazio obrigatório
}
@Override
@@ -24,7 +28,7 @@ public class GraficosFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// Inflaciona o layout para este fragmento
View root = inflater.inflate(R.layout.fragment_graficos, container, false);

View File

@@ -10,10 +10,14 @@ import android.view.ViewGroup;
import com.example.lifegrid.R;
/**
* MetasFragment projeta objetivos futuros onde o utilizador fixa montantes e datas a alcançar
* sendo apresentada percentagem de sucesso à medida que deposita fundos dedicados.
*/
public class MetasFragment extends Fragment {
public MetasFragment() {
// Required empty public constructor
// Construtor público vazio obrigatório
}
@Override
@@ -24,7 +28,7 @@ public class MetasFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// Inflaciona o layout para este fragmento
View root = inflater.inflate(R.layout.fragment_metas, container, false);

View File

@@ -8,15 +8,40 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Calendar;
import java.util.Locale;
import com.example.lifegrid.R;
import com.example.lifegrid.models.Transacao;
import com.google.firebase.Firebase;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
/**
* TransacoesFragment controla a aba pertencente às listagens e histórico de carteira e gestão de dados base.
* É responsável por permitir o lançamento do pop-up para a construção de novas entradas financeiras (receitas/despesas).
*/
public class TransacoesFragment extends Fragment {
public TransacoesFragment() {
// Required empty public constructor
// Construtor público vazio obrigatório
}
@@ -29,10 +54,93 @@ public class TransacoesFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// Inflaciona o layout para este fragmento
View root = inflater.inflate(R.layout.fragment_transacoes, container, false);
Button novaTransacaoButton = root.findViewById(R.id.novaTransacaoButton);
novaTransacaoButton.setOnClickListener(v -> showNovaTransacaoDialog());
return root;
}
/**
* Cria e monta manualmente uma janela Modal (Pop-up) a fim do utilizador preencher
* os detalhes referentes a uma recém aquisição de receita ou encargo para alimentar a base de dados.
*/
private void showNovaTransacaoDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
View dialogView = getLayoutInflater().inflate(R.layout.dialog_nova_transacao, null);
builder.setView(dialogView);
AlertDialog dialog = builder.create();
if (dialog.getWindow() != null) {
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
ImageView btnFechar = dialogView.findViewById(R.id.btnFechar);
btnFechar.setOnClickListener(v -> dialog.dismiss());
EditText etData = dialogView.findViewById(R.id.etData);
etData.setOnClickListener(v -> {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(requireContext(),
(view, selectedYear, selectedMonth, selectedDay) -> {
String formattedDate = String.format(Locale.getDefault(), "%02d/%02d/%04d", selectedDay, selectedMonth + 1, selectedYear);
etData.setText(formattedDate);
}, year, month, day);
datePickerDialog.show();
});
Button btnAdicionarTransacao = dialogView.findViewById(R.id.btnAdicionarTransacao);
EditText etValor = dialogView.findViewById(R.id.etValor);
EditText etDescricao = dialogView.findViewById(R.id.etDescricao);
Spinner spinnerCategoria = dialogView.findViewById(R.id.spinnerCategoria);
Spinner spinnerTipo = dialogView.findViewById(R.id.spinnerTipo);
spinnerTipo.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
int arrayResId = position == 0 ? R.array.categoria_receita : R.array.categoria_despesa;
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(requireContext(),
arrayResId, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerCategoria.setAdapter(adapter);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
btnAdicionarTransacao.setOnClickListener(v -> {
String valor = etValor.getText().toString().trim();
String descricao = etDescricao.getText().toString().trim();
String data = etData.getText().toString().trim();
String tipo = spinnerTipo.getSelectedItem().toString();
String categoria = spinnerCategoria.getSelectedItem().toString();
Transacao transacao = new Transacao(tipo, valor, categoria, descricao, data);
if (valor.isEmpty() || descricao.isEmpty() || data.isEmpty() || spinnerCategoria.getSelectedItemPosition() == 0) {
Toast.makeText(requireContext(), "Por favor, preencha todos os campos.", Toast.LENGTH_SHORT).show();
} else {
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();
String key = databaseReference.child("users").child(userId).child("transacoes").push().getKey();
databaseReference.child("users").child(userId).child("transacoes").child(key).setValue(transacao);
dialog.dismiss();
Toast.makeText(requireContext(), "Transação adicionada com sucesso!", Toast.LENGTH_SHORT).show();
}
});
dialog.show();
}
}