summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/main
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-01-24 08:58:34 +0100
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-01-24 08:58:34 +0100
commit905c922511909c0ebf5ca8df7afc89e558b750b7 (patch)
tree205c66c333fc494740ad073110c7b3512654cfe1 /android/app/src/main
parente0307dd96d1233816029b809ffecd8c0976b81ec (diff)
parent57d13750893a99bfdfc99fddfd170f554ce4e60f (diff)
downloadmullvadvpn-905c922511909c0ebf5ca8df7afc89e558b750b7.tar.xz
mullvadvpn-905c922511909c0ebf5ca8df7afc89e558b750b7.zip
Merge branch 'split-tunneling-icon-rendering-crash-droid-607'
Diffstat (limited to 'android/app/src/main')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt28
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/PackageManagerExtensions.kt18
4 files changed, 20 insertions, 33 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt
deleted file mode 100644
index e1ff07022c..0000000000
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package net.mullvad.mullvadvpn.applist
-
-import android.content.pm.PackageManager
-import android.graphics.Bitmap
-import android.os.Looper
-import androidx.annotation.WorkerThread
-import androidx.collection.LruCache
-import androidx.core.graphics.drawable.toBitmap
-
-class ApplicationsIconManager(private val packageManager: PackageManager) {
- private val iconsCache = LruCache<String, Bitmap>(500)
-
- @WorkerThread
- @Throws(PackageManager.NameNotFoundException::class)
- fun getAppIcon(packageName: String): Bitmap {
- check(!Looper.getMainLooper().isCurrentThread) { "Should not be called from MainThread" }
- iconsCache.get(packageName)?.let {
- return it
- }
- return packageManager.getApplicationIcon(packageName).toBitmap().also {
- iconsCache.put(packageName, it)
- }
- }
-
- fun dispose() {
- iconsCache.evictAll()
- }
-}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt
index 3396739491..5164fe0a3d 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt
@@ -23,7 +23,6 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
-import androidx.core.graphics.drawable.toBitmapOrNull
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import net.mullvad.mullvadvpn.R
@@ -42,6 +41,7 @@ import net.mullvad.mullvadvpn.compose.state.SplitTunnelingUiState
import net.mullvad.mullvadvpn.compose.transitions.SlideInFromRightTransition
import net.mullvad.mullvadvpn.lib.theme.AppTheme
import net.mullvad.mullvadvpn.lib.theme.Dimens
+import net.mullvad.mullvadvpn.util.getApplicationIconBitmapOrNull
import net.mullvad.mullvadvpn.viewmodel.SplitTunnelingViewModel
import org.koin.androidx.compose.koinViewModel
@@ -93,7 +93,7 @@ fun SplitTunneling(navigator: DestinationsNavigator) {
onIncludeAppClick = viewModel::onIncludeAppClick,
onBackClick = navigator::navigateUp,
onResolveIcon = { packageName ->
- packageManager.getApplicationIcon(packageName).toBitmapOrNull()
+ packageManager.getApplicationIconBitmapOrNull(packageName)
}
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt
index 56d6b71a2d..5e51cc99d4 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt
@@ -7,7 +7,6 @@ import android.os.Messenger
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import net.mullvad.mullvadvpn.BuildConfig
-import net.mullvad.mullvadvpn.applist.ApplicationsIconManager
import net.mullvad.mullvadvpn.applist.ApplicationsProvider
import net.mullvad.mullvadvpn.constant.IS_PLAY_BUILD
import net.mullvad.mullvadvpn.dataproxy.MullvadProblemReport
@@ -67,7 +66,6 @@ import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.qualifier.named
import org.koin.dsl.bind
import org.koin.dsl.module
-import org.koin.dsl.onClose
val uiModule = module {
single<SharedPreferences>(named(APP_PREFERENCES_NAME)) {
@@ -78,7 +76,6 @@ val uiModule = module {
single<String>(named(SELF_PACKAGE_NAME)) { androidContext().packageName }
viewModel { SplitTunnelingViewModel(get(), get(), Dispatchers.Default) }
- single { ApplicationsIconManager(get()) } onClose { it?.dispose() }
single { ApplicationsProvider(get(), get(named(SELF_PACKAGE_NAME))) }
single { (messenger: Messenger, dispatcher: EventDispatcher) ->
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/PackageManagerExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/PackageManagerExtensions.kt
new file mode 100644
index 0000000000..ea8ce1f4e1
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/PackageManagerExtensions.kt
@@ -0,0 +1,18 @@
+package net.mullvad.mullvadvpn.util
+
+import android.content.pm.PackageManager
+import android.graphics.Bitmap
+import androidx.core.graphics.drawable.toBitmapOrNull
+
+fun PackageManager.getApplicationIconBitmapOrNull(packageName: String): Bitmap? =
+ try {
+ getApplicationIcon(packageName).toBitmapOrNull()
+ } catch (e: Exception) {
+ // Name not found is thrown if the application is not installed
+ // IllegalArgumentException is thrown if the application has an invalid icon
+ when (e) {
+ is PackageManager.NameNotFoundException,
+ is IllegalArgumentException -> null
+ else -> throw e
+ }
+ }