a acabar
This commit is contained in:
@@ -19,6 +19,9 @@
|
||||
<activity
|
||||
android:name=".DefinicoesActivity"
|
||||
android:exported="false" />
|
||||
<activity
|
||||
android:name=".TermosPoliticasActivity"
|
||||
android:exported="false" />
|
||||
<activity
|
||||
android:name=".TelaInicialActivity"
|
||||
android:exported="false" />
|
||||
|
||||
@@ -116,6 +116,24 @@ public class DefinicoesActivity extends AppCompatActivity {
|
||||
});
|
||||
}
|
||||
|
||||
TextView tvTerms = findViewById(R.id.tvTerms);
|
||||
if (tvTerms != null) {
|
||||
tvTerms.setOnClickListener(v -> {
|
||||
Intent intent = new Intent(DefinicoesActivity.this, TermosPoliticasActivity.class);
|
||||
intent.putExtra("tipo_documento", "terms");
|
||||
startActivity(intent);
|
||||
});
|
||||
}
|
||||
|
||||
TextView tvPrivacy = findViewById(R.id.tvPrivacy);
|
||||
if (tvPrivacy != null) {
|
||||
tvPrivacy.setOnClickListener(v -> {
|
||||
Intent intent = new Intent(DefinicoesActivity.this, TermosPoliticasActivity.class);
|
||||
intent.putExtra("tipo_documento", "privacy");
|
||||
startActivity(intent);
|
||||
});
|
||||
}
|
||||
|
||||
btnBack.setOnClickListener(v -> {
|
||||
finish();
|
||||
});
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.example.lifegrid;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import androidx.activity.EdgeToEdge;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.graphics.Insets;
|
||||
import androidx.core.text.HtmlCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
|
||||
public class TermosPoliticasActivity extends AppCompatActivity {
|
||||
|
||||
private ImageView btnBack;
|
||||
private TextView tvTitle;
|
||||
private TextView tvContent;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
EdgeToEdge.enable(this);
|
||||
setContentView(R.layout.activity_termos_politicas);
|
||||
|
||||
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
|
||||
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
|
||||
return insets;
|
||||
});
|
||||
|
||||
btnBack = findViewById(R.id.btnBack);
|
||||
tvTitle = findViewById(R.id.tvTitle);
|
||||
tvContent = findViewById(R.id.tvContent);
|
||||
|
||||
btnBack.setOnClickListener(v -> finish());
|
||||
|
||||
String tipoDocumento = getIntent().getStringExtra("tipo_documento");
|
||||
if (tipoDocumento != null) {
|
||||
if (tipoDocumento.equals("terms")) {
|
||||
tvTitle.setText(R.string.terms_title);
|
||||
String htmlText = getString(R.string.terms_content);
|
||||
tvContent.setText(HtmlCompat.fromHtml(htmlText, HtmlCompat.FROM_HTML_MODE_LEGACY));
|
||||
} else if (tipoDocumento.equals("privacy")) {
|
||||
tvTitle.setText(R.string.privacy_title);
|
||||
String htmlText = getString(R.string.privacy_content);
|
||||
tvContent.setText(HtmlCompat.fromHtml(htmlText, HtmlCompat.FROM_HTML_MODE_LEGACY));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
73
app/src/main/res/layout/activity_termos_politicas.xml
Normal file
73
app/src/main/res/layout/activity_termos_politicas.xml
Normal file
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/branco"
|
||||
tools:context=".TermosPoliticasActivity">
|
||||
|
||||
<!-- Header -->
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/headerLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="16dp"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/btnBack"
|
||||
android:layout_width="32dp"
|
||||
android:layout_height="32dp"
|
||||
android:src="@drawable/diagonalarrowleftdownoutline_110924"
|
||||
app:tint="@color/preto"
|
||||
android:rotation="45"
|
||||
android:padding="4dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:contentDescription="Voltar" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvTitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Documento"
|
||||
android:textColor="@color/preto"
|
||||
android:textSize="22sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<!-- Scrollable content area -->
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:fillViewport="true"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/headerLayout">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="24dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvContent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@color/preto"
|
||||
android:textSize="15sp"
|
||||
android:lineSpacingMultiplier="1.25"
|
||||
android:linksClickable="true"
|
||||
android:autoLink="all" />
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -43,4 +43,52 @@
|
||||
<item>USD ($)</item>
|
||||
<item>BRL (R$)</item>
|
||||
</string-array>
|
||||
<string name="terms_title">Termos e Condições</string>
|
||||
<string name="terms_content"><![CDATA[
|
||||
<h3><b>1. Introdução</b></h3>
|
||||
<p>Bem-vindo ao <b>LifeGrid</b>. Ao descarregar, instalar ou utilizar a nossa aplicação, o utilizador concorda e aceita cumprir integralmente os presentes Termos e Condições de Serviço.</p>
|
||||
|
||||
<h3><b>2. Descrição do Serviço</b></h3>
|
||||
<p>O LifeGrid é uma aplicação de gestão de finanças pessoais concebida para ajudar os utilizadores a registar e categorizar transações financeiras, gerir e monitorizar ativos, estabelecer metas financeiras e guardar faturas ou outros documentos comprovativos associados às suas finanças.</p>
|
||||
|
||||
<h3><b>3. Registo e Segurança da Conta</b></h3>
|
||||
<p>Para usufruir de todas as funcionalidades da aplicação, é necessária a criação de uma conta de utilizador através de um endereço de correio eletrónico válido e uma palavra-passe. O utilizador é o único responsável por manter a confidencialidade das suas credenciais de acesso, bem como por qualquer atividade realizada sob a sua conta.</p>
|
||||
|
||||
<h3><b>4. Propriedade Intelectual</b></h3>
|
||||
<p>Todo o design, código-fonte, elementos gráficos, logótipos e conteúdos da aplicação LifeGrid são propriedade exclusiva da equipa de desenvolvimento e protegidos por leis de direitos de autor nacionais e internacionais.</p>
|
||||
|
||||
<h3><b>5. Uso Aceitável e Proibições</b></h3>
|
||||
<p>O utilizador compromete-se a não utilizar o LifeGrid para qualquer fim ilegal, fraudulento ou não autorizado. É estritamente proibido interferir com a segurança dos servidores e bases de dados da infraestrutura (Firebase), ou tentar contornar quaisquer mecanismos de segurança da aplicação.</p>
|
||||
|
||||
<h3><b>6. Limitação de Responsabilidade</b></h3>
|
||||
<p>O LifeGrid é fornecido "tal como está" e "conforme disponível". Não garantimos que a aplicação funcione de forma ininterrupta ou isenta de erros. As decisões financeiras tomadas com base nas informações apresentadas na aplicação são da inteira e exclusiva responsabilidade do utilizador. O LifeGrid não constitui ou substitui qualquer aconselhamento financeiro profissional.</p>
|
||||
|
||||
<h3><b>7. Alterações aos Termos</b></h3>
|
||||
<p>Reservamo-nos o direito de alterar ou atualizar estes Termos e Condições a qualquer momento. Quaisquer atualizações serão publicadas nesta secção e o uso continuado da aplicação constitui a aceitação tácita das novas condições.</p>
|
||||
]]></string>
|
||||
<string name="privacy_title">Política de Privacidade</string>
|
||||
<string name="privacy_content"><![CDATA[
|
||||
<h3><b>1. Informações que Recolhemos</b></h3>
|
||||
<p>Recolhemos os dados que nos faculta ativamente ao registar-se e utilizar a aplicação. Estes incluem:</p>
|
||||
<ul>
|
||||
<li>Dados de Registo: Nome de utilizador e endereço de correio eletrónico.</li>
|
||||
<li>Dados Financeiros: Transações registadas, montantes, categorias, ativos introduzidos e metas estabelecidas.</li>
|
||||
<li>Documentos: Faturas e outros comprovativos fotográficos que decida associar às suas transações.</li>
|
||||
</ul>
|
||||
|
||||
<h3><b>2. Finalidade do Tratamento de Dados</b></h3>
|
||||
<p>Os dados recolhidos destinam-se única e exclusivamente a permitir o funcionamento adequado da aplicação LifeGrid, permitindo-lhe gerir a sua carteira, analisar gráficos de despesas/receitas, acompanhar o progresso de metas e guardar comprovativos digitais.</p>
|
||||
|
||||
<h3><b>3. Armazenamento e Segurança dos Dados</b></h3>
|
||||
<p>Para garantir o armazenamento seguro dos seus dados, o LifeGrid utiliza a plataforma cloud <b>Google Firebase</b> (incluindo Firebase Authentication para gestão de identidade, Firebase Realtime Database para sincronização de dados e Firebase Storage para armazenamento de imagens). Implementamos práticas de segurança adequadas para prevenir o acesso não autorizado, alteração ou eliminação dos seus dados.</p>
|
||||
|
||||
<h3><b>4. Partilha de Dados com Terceiros</b></h3>
|
||||
<p>O LifeGrid não partilha, vende, aluga ou comercializa os seus dados pessoais com terceiros para quaisquer fins comerciais ou de marketing. Os dados são transferidos apenas para os servidores do Firebase para efeitos estritos de alojamento e sincronização.</p>
|
||||
|
||||
<h3><b>5. Direitos do Utilizador</b></h3>
|
||||
<p>O utilizador tem controlo total sobre os seus dados, podendo adicionar, editar ou apagar as suas transações, faturas e detalhes de conta a qualquer momento. Se desejar eliminar permanentemente a sua conta e todos os dados associados dos nossos servidores, pode fazê-lo contactando-nos ou solicitando a eliminação.</p>
|
||||
|
||||
<h3><b>6. Alterações a esta Política</b></h3>
|
||||
<p>Podemos atualizar esta Política de Privacidade periodicamente para refletir mudanças nas nossas práticas ou por razões operacionais/legais. Recomendamos a consulta regular desta secção para se manter informado.</p>
|
||||
]]></string>
|
||||
</resources>
|
||||
37
fluxograma_aplicacao.md
Normal file
37
fluxograma_aplicacao.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# Sistemas e Aplicações da LifeGrid (Super Simplificado)
|
||||
|
||||
Este diagrama mostra apenas as aplicações, serviços e bases de dados externas utilizadas no funcionamento do **LifeGrid** e como a informação passa entre elas.
|
||||
|
||||
## Fluxo de Informação entre Serviços (Mermaid)
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
%% Aplicação Central
|
||||
App[Aplicação Android <br/> LifeGrid]
|
||||
|
||||
%% Serviços de Autenticação
|
||||
App <-->|1. Autenticação e Sessão| Auth[Firebase Authentication]
|
||||
|
||||
%% Inteligência Artificial
|
||||
App -->|2. Imagem da Fatura| Gemini[Gemini API <br/> Google AI SDK]
|
||||
Gemini -->|Dados Extraídos| App
|
||||
|
||||
%% Alojamento de Imagens
|
||||
App -->|3. Ficheiro de Fatura| Storage[Firebase Storage]
|
||||
Storage -->|URL do Ficheiro| App
|
||||
|
||||
%% Base de Dados
|
||||
App <-->|4. Transações, Ativos e Metas| Database[Firebase Realtime Database]
|
||||
|
||||
%% Estilos simples com fundo branco
|
||||
classDef whiteBackground fill:#FFFFFF,stroke:#000000,stroke-width:1.5dp,color:#000000;
|
||||
class App,Auth,Gemini,Storage,Database whiteBackground;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Como a informação passa:
|
||||
1. **Firebase Authentication**: Controla o acesso à aplicação (Login/Registo).
|
||||
2. **Gemini API (Google AI)**: Recebe a imagem da fatura enviada pela app e devolve os dados estruturados (valor, data, descrição).
|
||||
3. **Firebase Storage**: Recebe e armazena os ficheiros de imagem das faturas digitalizadas.
|
||||
4. **Firebase Realtime Database**: Guarda e sincroniza em tempo real todos os dados financeiros (saldos, metas, ativos e referências dos documentos).
|
||||
Reference in New Issue
Block a user