From 6a910facafe9c2110b57502942b761a311db9136 Mon Sep 17 00:00:00 2001 From: Shihaam Abdul Rahman Date: Thu, 4 Jun 2026 23:12:27 +0500 Subject: [PATCH] add an about page #25 --- app/build.gradle.kts | 14 ++ .../ui/home/SettingsAboutFragment.kt | 80 +++++++ .../sar/basedbank/ui/home/SettingsFragment.kt | 1 + app/src/main/res/drawable/ic_info.xml | 10 + .../res/layout/fragment_settings_about.xml | 222 ++++++++++++++++++ app/src/main/res/values/strings.xml | 10 + 6 files changed, 337 insertions(+) create mode 100644 app/src/main/java/sh/sar/basedbank/ui/home/SettingsAboutFragment.kt create mode 100644 app/src/main/res/drawable/ic_info.xml create mode 100644 app/src/main/res/layout/fragment_settings_about.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8c7eebd..01b57f1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,8 +1,18 @@ +import java.util.Properties + plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) } +val localProps = Properties().also { props -> + val f = rootProject.file("local.properties") + if (f.exists()) props.load(f.inputStream()) +} + +fun localOrEnv(key: String, envKey: String) = + localProps.getProperty(key) ?: System.getenv(envKey) ?: "" + android { namespace = "sh.sar.basedbank" compileSdk = 36 @@ -15,6 +25,9 @@ android { versionName = "1.0.17" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + + buildConfigField("String", "ACCOUNT_MVR", "\"${localOrEnv("account.mvr", "ACCOUNT_MVR")}\"") + buildConfigField("String", "ACCOUNT_USD", "\"${localOrEnv("account.usd", "ACCOUNT_USD")}\"") } signingConfigs { @@ -49,6 +62,7 @@ android { } buildFeatures { viewBinding = true + buildConfig = true } } diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/SettingsAboutFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/SettingsAboutFragment.kt new file mode 100644 index 0000000..07f9665 --- /dev/null +++ b/app/src/main/java/sh/sar/basedbank/ui/home/SettingsAboutFragment.kt @@ -0,0 +1,80 @@ +package sh.sar.basedbank.ui.home + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.fragment.app.Fragment +import sh.sar.basedbank.BuildConfig +import sh.sar.basedbank.R +import sh.sar.basedbank.databinding.FragmentSettingsAboutBinding + +class SettingsAboutFragment : Fragment() { + + private var _binding: FragmentSettingsAboutBinding? = null + private val binding get() = _binding!! + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + _binding = FragmentSettingsAboutBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + (binding.root as? android.widget.ScrollView)?.clipToPadding = false + val basePaddingBottom = binding.root.paddingBottom + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets -> + val isBottomNav = requireContext().getSharedPreferences("prefs", Context.MODE_PRIVATE).getBoolean("bottom_nav", false) + val navBar = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(v.paddingLeft, v.paddingTop, v.paddingRight, basePaddingBottom + if (isBottomNav) 0 else navBar.bottom) + insets + } + binding.tvAppName.text = getString(R.string.app_name) + binding.tvVersion.text = getString(R.string.about_version, BuildConfig.VERSION_NAME) + + binding.rowMibTerms.setOnClickListener { openUrl("https://faisanet.mib.com.mv/terms") } + binding.rowBmlTerms.setOnClickListener { openUrl("https://www.bankofmaldives.com.mv/storage/file/121/10289/terms-conditions-online-banking-en.pdf") } + binding.rowFahipayTerms.setOnClickListener { openUrl("https://fahipay.mv/tos/") } + + val hasMvr = BuildConfig.ACCOUNT_MVR.isNotEmpty() + val hasUsd = BuildConfig.ACCOUNT_USD.isNotEmpty() + + if (!hasMvr && !hasUsd) { + binding.sectionDonate.visibility = View.GONE + } else { + if (!hasMvr) binding.btnDonateMvr.visibility = View.GONE + else binding.btnDonateMvr.setOnClickListener { openDonate(BuildConfig.ACCOUNT_MVR) } + if (!hasUsd) binding.btnDonateUsd.visibility = View.GONE + else binding.btnDonateUsd.setOnClickListener { openDonate(BuildConfig.ACCOUNT_USD) } + } + } + + private fun openUrl(url: String) { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) + } + + private fun openDonate(accountNumber: String) { + val fragment = TransferFragment.newInstance( + accountNumber = accountNumber, + displayName = getString(R.string.app_name), + subtitle = accountNumber, + colorHex = "#607D8B", + imageHash = null + ) + (requireActivity() as HomeActivity).showWithBackStack(fragment) + } + + override fun onResume() { + super.onResume() + requireActivity().title = getString(R.string.settings_about) + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/SettingsFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/SettingsFragment.kt index 5701811..8ec0ad0 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/SettingsFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/SettingsFragment.kt @@ -28,6 +28,7 @@ class SettingsFragment : Fragment() { SettingsItem(R.drawable.ic_settings_appearance, R.string.settings_appearance, R.string.settings_desc_appearance) { SettingsAppearanceFragment() }, SettingsItem(R.drawable.ic_lock, R.string.settings_privacy_security, R.string.settings_desc_privacy_security) { SettingsSecurityFragment() }, SettingsItem(R.drawable.ic_settings_storage, R.string.settings_storage, R.string.settings_desc_storage) { SettingsStorageFragment() }, + SettingsItem(R.drawable.ic_info, R.string.settings_about, R.string.settings_desc_about) { SettingsAboutFragment() }, ) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..5085c14 --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_settings_about.xml b/app/src/main/res/layout/fragment_settings_about.xml new file mode 100644 index 0000000..b43a4d1 --- /dev/null +++ b/app/src/main/res/layout/fragment_settings_about.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ff467f3..160ef72 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -191,6 +191,16 @@ Theme, language, and display options App lock, PIN, and security preferences Manage cached data and storage usage + About + App info, version, and legal + Version %s + Thijooree is a native Android client for Maldivian banking services. + Terms of Service + Support Development + If you find this app useful, a small donation goes a long way in keeping it alive and improving. + Donate in MVR + Donate in USD + Thijooree is an independent, third-party app. It is not affiliated with, endorsed by, or officially supported by any bank or financial institution.\n\nThis app works by logging into your internet banking services directly using your credentials and communicating with bank APIs. It is built using techniques derived from reverse-engineered official bank apps. Behaviour may change or break without notice if banks update their systems.\n\nDhiraagu and Ooredoo APIs are used to look up details about phone numbers.\n\nThis app does not collect any analytics, telemetry, or personal data, and does not transmit any information about you or your usage to the developer. Everything stays entirely on your device. Log out Log out of %s? All cached data will be cleared and remaining accounts will be refreshed.