diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-01-24 08:58:34 +0100 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-01-24 08:58:34 +0100 |
| commit | 905c922511909c0ebf5ca8df7afc89e558b750b7 (patch) | |
| tree | 205c66c333fc494740ad073110c7b3512654cfe1 /android/app/src/main | |
| parent | e0307dd96d1233816029b809ffecd8c0976b81ec (diff) | |
| parent | 57d13750893a99bfdfc99fddfd170f554ce4e60f (diff) | |
| download | mullvadvpn-905c922511909c0ebf5ca8df7afc89e558b750b7.tar.xz mullvadvpn-905c922511909c0ebf5ca8df7afc89e558b750b7.zip | |
Merge branch 'split-tunneling-icon-rendering-crash-droid-607'
Diffstat (limited to 'android/app/src/main')
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 + } + } |
