diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e186a9e --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# Android Studio +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/app/build +/captures +.externalNativeBuild +.cxx +*.apk +*.aar +*.keystore + +# Gradle +.gradle/ +build/ +app/build/ + +# IDE +.idea/ +.vscode/ + +# Build logs +build_error.txt +build_log.txt +build_output.txt +build_output_2.txt +build_output_3.txt +build_output_4.txt diff --git a/.gradle/9.3.1/checksums/checksums.lock b/.gradle/9.3.1/checksums/checksums.lock deleted file mode 100644 index 4d6afdd..0000000 Binary files a/.gradle/9.3.1/checksums/checksums.lock and /dev/null differ diff --git a/.gradle/9.3.1/checksums/md5-checksums.bin b/.gradle/9.3.1/checksums/md5-checksums.bin deleted file mode 100644 index a4accfc..0000000 Binary files a/.gradle/9.3.1/checksums/md5-checksums.bin and /dev/null differ diff --git a/.gradle/9.3.1/checksums/sha1-checksums.bin b/.gradle/9.3.1/checksums/sha1-checksums.bin deleted file mode 100644 index 60c006f..0000000 Binary files a/.gradle/9.3.1/checksums/sha1-checksums.bin and /dev/null differ diff --git a/.gradle/9.3.1/executionHistory/executionHistory.bin b/.gradle/9.3.1/executionHistory/executionHistory.bin deleted file mode 100644 index 6026ec5..0000000 Binary files a/.gradle/9.3.1/executionHistory/executionHistory.bin and /dev/null differ diff --git a/.gradle/9.3.1/executionHistory/executionHistory.lock b/.gradle/9.3.1/executionHistory/executionHistory.lock deleted file mode 100644 index 0516f52..0000000 Binary files a/.gradle/9.3.1/executionHistory/executionHistory.lock and /dev/null differ diff --git a/.gradle/9.3.1/fileChanges/last-build.bin b/.gradle/9.3.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd23..0000000 Binary files a/.gradle/9.3.1/fileChanges/last-build.bin and /dev/null differ diff --git a/.gradle/9.3.1/fileHashes/fileHashes.bin b/.gradle/9.3.1/fileHashes/fileHashes.bin deleted file mode 100644 index 4524ef0..0000000 Binary files a/.gradle/9.3.1/fileHashes/fileHashes.bin and /dev/null differ diff --git a/.gradle/9.3.1/fileHashes/fileHashes.lock b/.gradle/9.3.1/fileHashes/fileHashes.lock deleted file mode 100644 index 3ee525a..0000000 Binary files a/.gradle/9.3.1/fileHashes/fileHashes.lock and /dev/null differ diff --git a/.gradle/9.3.1/fileHashes/resourceHashesCache.bin b/.gradle/9.3.1/fileHashes/resourceHashesCache.bin deleted file mode 100644 index e0fc7b1..0000000 Binary files a/.gradle/9.3.1/fileHashes/resourceHashesCache.bin and /dev/null differ diff --git a/.gradle/9.3.1/gc.properties b/.gradle/9.3.1/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 1305941..0000000 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and /dev/null differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 6c5c31b..0000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Wed Mar 25 11:05:18 WET 2026 -gradle.version=9.3.1 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index a7534ee..0000000 Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and /dev/null differ diff --git a/.gradle/config.properties b/.gradle/config.properties deleted file mode 100644 index e856aab..0000000 --- a/.gradle/config.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Wed Mar 18 09:24:04 WET 2026 -java.home=/Applications/Android Studio.app/Contents/jbr/Contents/Home diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe deleted file mode 100644 index 0cbfad9..0000000 Binary files a/.gradle/file-system.probe and /dev/null differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/app/src/main/java/com/fluxup/app/ConnectivityUtils.java b/app/src/main/java/com/fluxup/app/ConnectivityUtils.java new file mode 100644 index 0000000..b550674 --- /dev/null +++ b/app/src/main/java/com/fluxup/app/ConnectivityUtils.java @@ -0,0 +1,27 @@ +package com.fluxup.app; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkCapabilities; + +public class ConnectivityUtils { + + /** + * Verifica se existe uma ligação ativa à internet (Wi-Fi ou Dados Móveis). + */ + public static boolean isNetworkAvailable(Context context) { + ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivityManager != null) { + Network activeNetwork = connectivityManager.getActiveNetwork(); + if (activeNetwork != null) { + NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork); + return networkCapabilities != null && ( + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)); + } + } + return false; + } +} diff --git a/app/src/main/java/com/fluxup/app/SettingsActivity.java b/app/src/main/java/com/fluxup/app/SettingsActivity.java new file mode 100644 index 0000000..66d5189 --- /dev/null +++ b/app/src/main/java/com/fluxup/app/SettingsActivity.java @@ -0,0 +1,169 @@ +package com.fluxup.app; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ImageButton; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import com.google.android.material.switchmaterial.SwitchMaterial; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import java.util.Locale; + +public class SettingsActivity extends AppCompatActivity { + + private ImageButton btnBack; + private SwitchMaterial switchDarkMode, switchPrivacy, switchNotifications; + private TextView tvEmail, btnChangePassword; + private Spinner spinnerLanguage; + private View btnLogout; + private SharedPreferences sharedPreferences; + private static final String PREFS_NAME = "FluxupSettings"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + sharedPreferences = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); + + // Aplicar o idioma guardado antes de carregar o layout + String lang = sharedPreferences.getString("language", "pt"); + updateLocaleSilent(lang); + + // Aplicar tema guardado + applyTheme(sharedPreferences.getBoolean("darkMode", false)); + + setContentView(R.layout.activity_settings); + + initViews(); + setupListeners(); + loadSettings(); + } + + private void applyTheme(boolean isDarkMode) { + if (isDarkMode) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + } else { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + } + } + + private void initViews() { + btnBack = findViewById(R.id.btnBack); + switchDarkMode = findViewById(R.id.switchDarkMode); + switchPrivacy = findViewById(R.id.switchPrivacy); + switchNotifications = findViewById(R.id.switchNotifications); + tvEmail = findViewById(R.id.tvEmail); + btnChangePassword = findViewById(R.id.btnChangePassword); + spinnerLanguage = findViewById(R.id.spinnerLanguage); + btnLogout = findViewById(R.id.btnLogout); + + // Configurar Spinner de Idiomas + String[] languages = {"Português", "English", "Español"}; + ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, languages); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerLanguage.setAdapter(adapter); + + // Mostrar email do utilizador + FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); + if (user != null) { + tvEmail.setText(user.getEmail()); + } + } + + private void setupListeners() { + btnBack.setOnClickListener(v -> finish()); + + switchDarkMode.setOnCheckedChangeListener((buttonView, isChecked) -> { + applyTheme(isChecked); + saveSetting("darkMode", isChecked); + }); + + switchPrivacy.setOnCheckedChangeListener((buttonView, isChecked) -> saveSetting("privacy", isChecked)); + switchNotifications.setOnCheckedChangeListener((buttonView, isChecked) -> saveSetting("notifications", isChecked)); + + btnLogout.setOnClickListener(v -> { + FirebaseAuth.getInstance().signOut(); + Intent intent = new Intent(SettingsActivity.this, LoginActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + finish(); + }); + + spinnerLanguage.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + String selectedLang = "pt"; + if (position == 1) selectedLang = "en"; + else if (position == 2) selectedLang = "es"; + + String currentLang = sharedPreferences.getString("language", "pt"); + if (!selectedLang.equals(currentLang)) { + saveSetting("language", selectedLang); + updateLocale(selectedLang); + } + } + + @Override + public void onNothingSelected(AdapterView parent) {} + }); + + btnChangePassword.setOnClickListener(v -> { + FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); + if (user != null && user.getEmail() != null) { + FirebaseAuth.getInstance().sendPasswordResetEmail(user.getEmail()) + .addOnCompleteListener(task -> { + if (task.isSuccessful()) { + Toast.makeText(this, "Email de redefinição enviado!", Toast.LENGTH_SHORT).show(); + } + }); + } + }); + } + + private void loadSettings() { + switchDarkMode.setChecked(sharedPreferences.getBoolean("darkMode", false)); + switchPrivacy.setChecked(sharedPreferences.getBoolean("privacy", false)); + switchNotifications.setChecked(sharedPreferences.getBoolean("notifications", true)); + + String lang = sharedPreferences.getString("language", "pt"); + if (lang.equals("en")) spinnerLanguage.setSelection(1, false); + else if (lang.equals("es")) spinnerLanguage.setSelection(2, false); + else spinnerLanguage.setSelection(0, false); + } + + private void updateLocaleSilent(String langCode) { + Locale locale = new Locale(langCode); + Locale.setDefault(locale); + Resources resources = getResources(); + Configuration config = resources.getConfiguration(); + config.setLocale(locale); + resources.updateConfiguration(config, resources.getDisplayMetrics()); + } + + private void updateLocale(String langCode) { + updateLocaleSilent(langCode); + Intent intent = new Intent(this, SettingsActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + finish(); + } + + private void saveSetting(String key, boolean value) { + sharedPreferences.edit().putBoolean(key, value).apply(); + } + + private void saveSetting(String key, String value) { + sharedPreferences.edit().putString(key, value).apply(); + } +} diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml new file mode 100644 index 0000000..4f91ba3 --- /dev/null +++ b/app/src/main/res/drawable/ic_back.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..e594cb1 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml new file mode 100644 index 0000000..eb80ab2 --- /dev/null +++ b/app/src/main/res/layout/activity_settings.xml @@ -0,0 +1,303 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml new file mode 100644 index 0000000..9dc7b89 --- /dev/null +++ b/app/src/main/res/values-en/strings.xml @@ -0,0 +1,21 @@ + + Fluxup + Today is a good day + Hello! Ready for your productivity day? + + + Settings + Preferences + Dark Mode + Account + Username + Email + Change Password + Privacy + Private Account + Notifications + App + Language + Log out + Back + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml new file mode 100644 index 0000000..196d036 --- /dev/null +++ b/app/src/main/res/values-es/strings.xml @@ -0,0 +1,21 @@ + + Fluxup + Hoy es un buen día + ¡Hola! ¿Preparado para tu día de productividad? + + + Configuraciones + Preferencias + Modo Oscuro + Cuenta + Usuario + Email + Cambiar contraseña + Privacidad + Cuenta Privada + Notificaciones + App + Idioma + Cerrar sesión + Volver + diff --git a/build/reports/problems/problems-report.html b/build/reports/problems/problems-report.html deleted file mode 100644 index b5f66d9..0000000 --- a/build/reports/problems/problems-report.html +++ /dev/null @@ -1,659 +0,0 @@ - - - - - - - - - - - - - Gradle Configuration Cache - - - -
- -
- Loading... -
- - - - - -