From 83b49d0be0aa0a1adc3dfa1511261a73f3729531 Mon Sep 17 00:00:00 2001 From: Pablo Fraile Alonso Date: Sat, 18 Nov 2023 08:45:20 +0100 Subject: [PATCH 1/2] fix: make implicit intents safe --- .../ui/dashboard/RiskDetailFragment.kt | 2 +- .../IgnoreBatteryOptimizationFragment.kt | 3 ++- .../ui/settings/InformationFragment.kt | 8 +++---- .../ui/settings/SettingsFragment.kt | 3 ++- .../util/SafeImplicitIntent.kt | 24 +++++++++++++++++++ .../util/ble/BLEScanner.kt | 3 ++- app/src/main/res/values/strings.xml | 1 + 7 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/de/seemoo/at_tracking_detection/util/SafeImplicitIntent.kt diff --git a/app/src/main/java/de/seemoo/at_tracking_detection/ui/dashboard/RiskDetailFragment.kt b/app/src/main/java/de/seemoo/at_tracking_detection/ui/dashboard/RiskDetailFragment.kt index 7d2cfef2..a824a74a 100644 --- a/app/src/main/java/de/seemoo/at_tracking_detection/ui/dashboard/RiskDetailFragment.kt +++ b/app/src/main/java/de/seemoo/at_tracking_detection/ui/dashboard/RiskDetailFragment.kt @@ -55,7 +55,7 @@ class RiskDetailFragment : Fragment() { // Intent.ACTION_VIEW, // Uri.parse("https://support.apple.com/en-us/HT212227") // ) -// startActivity(intent) +// startActivitySafe(intent) // } view.findViewById(R.id.card_trackers_found).setOnClickListener { diff --git a/app/src/main/java/de/seemoo/at_tracking_detection/ui/onboarding/IgnoreBatteryOptimizationFragment.kt b/app/src/main/java/de/seemoo/at_tracking_detection/ui/onboarding/IgnoreBatteryOptimizationFragment.kt index c2fc7364..b0a34d45 100644 --- a/app/src/main/java/de/seemoo/at_tracking_detection/ui/onboarding/IgnoreBatteryOptimizationFragment.kt +++ b/app/src/main/java/de/seemoo/at_tracking_detection/ui/onboarding/IgnoreBatteryOptimizationFragment.kt @@ -18,6 +18,7 @@ import androidx.fragment.app.Fragment import dagger.hilt.android.AndroidEntryPoint import de.seemoo.at_tracking_detection.R import de.seemoo.at_tracking_detection.databinding.FragmentIgnoreBatteryOptimizationBinding +import de.seemoo.at_tracking_detection.util.startActivitySafe @AndroidEntryPoint class IgnoreBatteryOptimizationFragment : Fragment() { @@ -64,7 +65,7 @@ class IgnoreBatteryOptimizationFragment : Fragment() { intent.action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS intent.data = Uri.parse("package:$packageName") } - requireContext().startActivity(intent) + requireContext().startActivitySafe(intent) } companion object { diff --git a/app/src/main/java/de/seemoo/at_tracking_detection/ui/settings/InformationFragment.kt b/app/src/main/java/de/seemoo/at_tracking_detection/ui/settings/InformationFragment.kt index c843677a..873d1491 100644 --- a/app/src/main/java/de/seemoo/at_tracking_detection/ui/settings/InformationFragment.kt +++ b/app/src/main/java/de/seemoo/at_tracking_detection/ui/settings/InformationFragment.kt @@ -16,6 +16,7 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import de.seemoo.at_tracking_detection.R +import de.seemoo.at_tracking_detection.util.startActivitySafe class InformationFragment : Fragment() { @@ -84,7 +85,7 @@ class InformationFragment : Fragment() { Intent.ACTION_VIEW, Uri.parse("https://twitter.com/AirGuardAndroid") ) - startActivity(intent) + startActivitySafe(intent) } } @@ -102,7 +103,7 @@ class InformationFragment : Fragment() { private fun openAttributionLink(link: String) { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(link)) - startActivity(intent) + startActivitySafe(intent) } private fun getAttributions(): List { @@ -119,8 +120,7 @@ class InformationFragment : Fragment() { putExtra(Intent.EXTRA_SUBJECT, "Subject of the email") putExtra(Intent.EXTRA_TEXT, "Body of the email") } - - startActivity(emailIntent) + startActivitySafe(emailIntent) } } diff --git a/app/src/main/java/de/seemoo/at_tracking_detection/ui/settings/SettingsFragment.kt b/app/src/main/java/de/seemoo/at_tracking_detection/ui/settings/SettingsFragment.kt index d2602127..1c7c8b7b 100644 --- a/app/src/main/java/de/seemoo/at_tracking_detection/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/de/seemoo/at_tracking_detection/ui/settings/SettingsFragment.kt @@ -16,6 +16,7 @@ import de.seemoo.at_tracking_detection.ATTrackingDetectionApplication import de.seemoo.at_tracking_detection.R import de.seemoo.at_tracking_detection.util.SharedPrefs import de.seemoo.at_tracking_detection.util.Utility +import de.seemoo.at_tracking_detection.util.startActivitySafe import de.seemoo.at_tracking_detection.worker.BackgroundWorkScheduler import timber.log.Timber import javax.inject.Inject @@ -52,7 +53,7 @@ class SettingsFragment : PreferenceFragmentCompat() { Intent.ACTION_VIEW, Uri.parse("https://tpe.seemoo.tu-darmstadt.de/privacy-policy.html") ) - startActivity(intent) + startActivitySafe(intent) return@OnPreferenceClickListener true } diff --git a/app/src/main/java/de/seemoo/at_tracking_detection/util/SafeImplicitIntent.kt b/app/src/main/java/de/seemoo/at_tracking_detection/util/SafeImplicitIntent.kt new file mode 100644 index 00000000..405cf39d --- /dev/null +++ b/app/src/main/java/de/seemoo/at_tracking_detection/util/SafeImplicitIntent.kt @@ -0,0 +1,24 @@ +package de.seemoo.at_tracking_detection.util + +import android.content.Context +import android.content.Intent +import android.widget.Toast +import androidx.fragment.app.Fragment +import de.seemoo.at_tracking_detection.R + +inline fun Context.startActivitySafe(intent: Intent, onError: () -> Unit = { showNotAppFound() }) { + if (intent.resolveActivity(packageManager) != null) + startActivity(intent) + else + onError() +} + +fun Context.showNotAppFound() { + val message = getString(R.string.app_handler_not_found) + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() +} + +fun Fragment.startActivitySafe(intent: Intent, onError: (() -> Unit)? = null) { + val context = requireContext() + context.startActivitySafe(intent, onError ?: { context.showNotAppFound() }) +} \ No newline at end of file diff --git a/app/src/main/java/de/seemoo/at_tracking_detection/util/ble/BLEScanner.kt b/app/src/main/java/de/seemoo/at_tracking_detection/util/ble/BLEScanner.kt index f0bc565e..5a91a923 100644 --- a/app/src/main/java/de/seemoo/at_tracking_detection/util/ble/BLEScanner.kt +++ b/app/src/main/java/de/seemoo/at_tracking_detection/util/ble/BLEScanner.kt @@ -13,6 +13,7 @@ import de.seemoo.at_tracking_detection.ATTrackingDetectionApplication import de.seemoo.at_tracking_detection.database.models.device.DeviceManager import de.seemoo.at_tracking_detection.detection.LocationRequester import de.seemoo.at_tracking_detection.util.Utility +import de.seemoo.at_tracking_detection.util.startActivitySafe import timber.log.Timber @@ -159,6 +160,6 @@ object BLEScanner { fun openBluetoothSettings(context: Context) { val intentOpenBluetoothSettings = Intent() intentOpenBluetoothSettings.action = Settings.ACTION_BLUETOOTH_SETTINGS - context.startActivity(intentOpenBluetoothSettings) + context.startActivitySafe(intentOpenBluetoothSettings) } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4d87ddce..533bb24d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -109,6 +109,7 @@ Information & Contact Get information about us + App for opening this content isn\'t found Delete study data Request deletion of study data From 852cb777d0bfe3789ee421149d05b57d617ea1f1 Mon Sep 17 00:00:00 2001 From: Pablo Fraile Alonso Date: Sat, 18 Nov 2023 09:09:57 +0100 Subject: [PATCH 2/2] perf: use inline function for implicit intent from fragment --- .../IgnoreBatteryOptimizationFragment.kt | 2 +- .../util/SafeImplicitIntent.kt | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/de/seemoo/at_tracking_detection/ui/onboarding/IgnoreBatteryOptimizationFragment.kt b/app/src/main/java/de/seemoo/at_tracking_detection/ui/onboarding/IgnoreBatteryOptimizationFragment.kt index b0a34d45..f4327066 100644 --- a/app/src/main/java/de/seemoo/at_tracking_detection/ui/onboarding/IgnoreBatteryOptimizationFragment.kt +++ b/app/src/main/java/de/seemoo/at_tracking_detection/ui/onboarding/IgnoreBatteryOptimizationFragment.kt @@ -65,7 +65,7 @@ class IgnoreBatteryOptimizationFragment : Fragment() { intent.action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS intent.data = Uri.parse("package:$packageName") } - requireContext().startActivitySafe(intent) + startActivitySafe(intent) } companion object { diff --git a/app/src/main/java/de/seemoo/at_tracking_detection/util/SafeImplicitIntent.kt b/app/src/main/java/de/seemoo/at_tracking_detection/util/SafeImplicitIntent.kt index 405cf39d..9bb2f00d 100644 --- a/app/src/main/java/de/seemoo/at_tracking_detection/util/SafeImplicitIntent.kt +++ b/app/src/main/java/de/seemoo/at_tracking_detection/util/SafeImplicitIntent.kt @@ -1,5 +1,6 @@ package de.seemoo.at_tracking_detection.util +import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.widget.Toast @@ -7,10 +8,11 @@ import androidx.fragment.app.Fragment import de.seemoo.at_tracking_detection.R inline fun Context.startActivitySafe(intent: Intent, onError: () -> Unit = { showNotAppFound() }) { - if (intent.resolveActivity(packageManager) != null) + try { startActivity(intent) - else + } catch (e: ActivityNotFoundException) { onError() + } } fun Context.showNotAppFound() { @@ -18,7 +20,9 @@ fun Context.showNotAppFound() { Toast.makeText(this, message, Toast.LENGTH_SHORT).show() } -fun Fragment.startActivitySafe(intent: Intent, onError: (() -> Unit)? = null) { - val context = requireContext() - context.startActivitySafe(intent, onError ?: { context.showNotAppFound() }) +inline fun Fragment.startActivitySafe( + intent: Intent, + onError: () -> Unit = { context?.showNotAppFound() } +) { + context?.startActivitySafe(intent, onError) } \ No newline at end of file