From 21c25a326b27699a1b60faaff350b1817f6533d3 Mon Sep 17 00:00:00 2001 From: Fahim Masud Choudhury Date: Wed, 16 Oct 2024 17:22:16 +0600 Subject: [PATCH 1/2] feat: allow exodus reports' web URLs to open in (supported) system languages Currently supported languages are: English, French, German, Italian, Spanish, and Greek. If the device's language is any of the above, then Exodus will open in that language. Otherwise, the URL will switch to English. --- .../ui/application/ApplicationFragment.kt | 20 +++--- .../foundation/e/apps/utils/ExodusUtil.kt | 65 +++++++++++++++++++ 2 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/foundation/e/apps/utils/ExodusUtil.kt diff --git a/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt b/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt index 3d25bf9ee..cc605c219 100644 --- a/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt @@ -22,7 +22,6 @@ import android.annotation.SuppressLint import android.content.Intent import android.graphics.Color import android.graphics.drawable.Drawable -import android.net.Uri import android.os.Bundle import android.text.Html import android.text.format.Formatter @@ -52,7 +51,6 @@ import com.google.android.material.button.MaterialButton import com.google.android.material.snackbar.Snackbar import com.google.android.material.textview.MaterialTextView import dagger.hilt.android.AndroidEntryPoint -import foundation.e.apps.ui.MainActivity import foundation.e.apps.R import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.application.data.shareUri @@ -71,6 +69,7 @@ import foundation.e.apps.install.download.data.DownloadProgress import foundation.e.apps.install.pkg.AppLoungePackageManager import foundation.e.apps.install.pkg.PWAManager import foundation.e.apps.ui.AppInfoFetchViewModel +import foundation.e.apps.ui.MainActivity import foundation.e.apps.ui.MainActivityViewModel import foundation.e.apps.ui.PrivacyInfoViewModel import foundation.e.apps.ui.application.ShareButtonVisibilityState.Hidden @@ -78,6 +77,7 @@ import foundation.e.apps.ui.application.ShareButtonVisibilityState.Visible import foundation.e.apps.ui.application.model.ApplicationScreenshotsRVAdapter import foundation.e.apps.ui.application.subFrags.ApplicationDialogFragment import foundation.e.apps.ui.parentFragment.TimeoutFragment +import foundation.e.apps.utils.ExodusUtil import foundation.e.apps.utils.isValid import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collectLatest @@ -144,11 +144,7 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) { companion object { private const val PRIVACY_SCORE_SOURCE_CODE_URL = "https://gitlab.e.foundation/e/os/apps/-/blob/main/app/src/main/java/foundation/e/apps/data/exodus/repositories/PrivacyScoreRepositoryImpl.kt" - private const val EXODUS_URL = "https://exodus-privacy.eu.org" - private const val EXODUS_REPORT_URL = "https://reports.exodus-privacy.eu.org/" private const val PRIVACY_GUIDELINE_URL = "https://doc.e.foundation/privacy_score" - private const val REQUEST_EXODUS_REPORT_URL = - "https://reports.exodus-privacy.eu.org/en/analysis/submit#" } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -417,9 +413,11 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) { private fun openRequestExodusReportUrl() { val openUrlIntent = Intent(Intent.ACTION_VIEW) - openUrlIntent.data = - Uri.parse("${REQUEST_EXODUS_REPORT_URL}${applicationViewModel.getFusedApp()?.package_name}") - startActivity(openUrlIntent) + val packageName = applicationViewModel.getFusedApp()?.package_name + if (!packageName.isNullOrBlank()) { + openUrlIntent.data = ExodusUtil.buildRequestReportUri(packageName) + startActivity(openUrlIntent) + } } private fun showPrivacyScoreCalculationLoginDialog() { @@ -987,11 +985,11 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) { // if app info not loaded yet, pass the default exodus homePage url val fusedApp = applicationViewModel.getFusedApp() if (fusedApp == null || fusedApp.permsFromExodus == LIST_OF_NULL) { - return EXODUS_URL + return ExodusUtil.DEFAULT_URL } val reportId = applicationViewModel.applicationLiveData.value!!.first.reportId - return "$EXODUS_REPORT_URL${Locale.getDefault().language}/reports/$reportId" + return ExodusUtil.buildReportUri(reportId).toString() } private fun fetchAppTracker(application: Application) { diff --git a/app/src/main/java/foundation/e/apps/utils/ExodusUtil.kt b/app/src/main/java/foundation/e/apps/utils/ExodusUtil.kt new file mode 100644 index 000000000..21f0bcc32 --- /dev/null +++ b/app/src/main/java/foundation/e/apps/utils/ExodusUtil.kt @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2024 MURENA SAS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package foundation.e.apps.utils + +import android.net.Uri +import java.util.Locale + +object ExodusUtil { + const val DEFAULT_URL = "https://exodus-privacy.eu.org" + + fun buildReportUri(reportId: Long): Uri { + val language = getLanguage(Locale.getDefault().language) + + return Uri.Builder() + .scheme("https") + .authority("reports.exodus-privacy.eu.org") + .appendPath(language) + .appendPath("reports") + .appendPath(reportId.toString()) + .build() // Example: https://reports.exodus-privacy.eu.org/es/reports/511980/ + } + + fun buildRequestReportUri(packageName: String): Uri { + val language = getLanguage(Locale.getDefault().language) + + return Uri.Builder() + .scheme("https") + .authority("reports.exodus-privacy.eu.org") + .appendPath(language) + .appendPath("analysis") + .appendPath("submit") + .fragment(packageName) + .build() // Example: https://reports.exodus-privacy.eu.org/en/analysis/submit/#packagename + } + + private fun getLanguage(param: String): String { + return SupportedLanguage.values().find { it.language == param }?.language + ?: SupportedLanguage.English.language + } + + private enum class SupportedLanguage(val language: String) { + English("en"), + French("fr"), + German("de"), + Italian("it"), + Spanish("es"), + Greek("el") + } +} -- GitLab From 6a7326c8cebc97fc962d2b2d509cbe875472629e Mon Sep 17 00:00:00 2001 From: Fahim Masud Choudhury Date: Thu, 17 Oct 2024 10:05:18 +0600 Subject: [PATCH 2/2] refactor: rename ExodusUtil to ExodusUriGenerator with minor improvements --- .../e/apps/ui/application/ApplicationFragment.kt | 15 +++++++++------ .../{ExodusUtil.kt => ExodusUriGenerator.kt} | 12 +++++++----- 2 files changed, 16 insertions(+), 11 deletions(-) rename app/src/main/java/foundation/e/apps/utils/{ExodusUtil.kt => ExodusUriGenerator.kt} (88%) diff --git a/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt b/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt index cc605c219..126bc7d0e 100644 --- a/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/application/ApplicationFragment.kt @@ -77,7 +77,7 @@ import foundation.e.apps.ui.application.ShareButtonVisibilityState.Visible import foundation.e.apps.ui.application.model.ApplicationScreenshotsRVAdapter import foundation.e.apps.ui.application.subFrags.ApplicationDialogFragment import foundation.e.apps.ui.parentFragment.TimeoutFragment -import foundation.e.apps.utils.ExodusUtil +import foundation.e.apps.utils.ExodusUriGenerator import foundation.e.apps.utils.isValid import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collectLatest @@ -414,10 +414,13 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) { private fun openRequestExodusReportUrl() { val openUrlIntent = Intent(Intent.ACTION_VIEW) val packageName = applicationViewModel.getFusedApp()?.package_name - if (!packageName.isNullOrBlank()) { - openUrlIntent.data = ExodusUtil.buildRequestReportUri(packageName) - startActivity(openUrlIntent) + + if (packageName.isNullOrBlank()) { + return } + + openUrlIntent.data = ExodusUriGenerator.buildRequestReportUri(packageName) + startActivity(openUrlIntent) } private fun showPrivacyScoreCalculationLoginDialog() { @@ -985,11 +988,11 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) { // if app info not loaded yet, pass the default exodus homePage url val fusedApp = applicationViewModel.getFusedApp() if (fusedApp == null || fusedApp.permsFromExodus == LIST_OF_NULL) { - return ExodusUtil.DEFAULT_URL + return ExodusUriGenerator.DEFAULT_URL } val reportId = applicationViewModel.applicationLiveData.value!!.first.reportId - return ExodusUtil.buildReportUri(reportId).toString() + return ExodusUriGenerator.buildReportUri(reportId).toString() } private fun fetchAppTracker(application: Application) { diff --git a/app/src/main/java/foundation/e/apps/utils/ExodusUtil.kt b/app/src/main/java/foundation/e/apps/utils/ExodusUriGenerator.kt similarity index 88% rename from app/src/main/java/foundation/e/apps/utils/ExodusUtil.kt rename to app/src/main/java/foundation/e/apps/utils/ExodusUriGenerator.kt index 21f0bcc32..1bafab68f 100644 --- a/app/src/main/java/foundation/e/apps/utils/ExodusUtil.kt +++ b/app/src/main/java/foundation/e/apps/utils/ExodusUriGenerator.kt @@ -21,15 +21,17 @@ package foundation.e.apps.utils import android.net.Uri import java.util.Locale -object ExodusUtil { +object ExodusUriGenerator { const val DEFAULT_URL = "https://exodus-privacy.eu.org" + private const val SCHEME = "https" + private const val AUTHORITY = "reports.exodus-privacy.eu.org" fun buildReportUri(reportId: Long): Uri { val language = getLanguage(Locale.getDefault().language) return Uri.Builder() - .scheme("https") - .authority("reports.exodus-privacy.eu.org") + .scheme(SCHEME) + .authority(AUTHORITY) .appendPath(language) .appendPath("reports") .appendPath(reportId.toString()) @@ -40,8 +42,8 @@ object ExodusUtil { val language = getLanguage(Locale.getDefault().language) return Uri.Builder() - .scheme("https") - .authority("reports.exodus-privacy.eu.org") + .scheme(SCHEME) + .authority(AUTHORITY) .appendPath(language) .appendPath("analysis") .appendPath("submit") -- GitLab