diff options
| author | Aleksandr Granin <aleksandr@mullvad.net> | 2021-03-22 13:27:22 +0100 |
|---|---|---|
| committer | Aleksandr Granin <aleksandr@mullvad.net> | 2021-03-23 08:22:19 +0100 |
| commit | 44fa7173f45d12e9267d15534a83d86dcf185034 (patch) | |
| tree | 10c9b1330dd28e1c7cfd0019710201400ad70a89 /android/src/main | |
| parent | d07025afe68ff8d21a9ab51b0075d5fdb5fc47b7 (diff) | |
| download | mullvadvpn-44fa7173f45d12e9267d15534a83d86dcf185034.tar.xz mullvadvpn-44fa7173f45d12e9267d15534a83d86dcf185034.zip | |
Create ApplicationsProvider and AppplicationsIcon cache
Diffstat (limited to 'android/src/main')
3 files changed, 68 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/AppData.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/AppData.kt new file mode 100644 index 0000000000..5bed89c149 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/AppData.kt @@ -0,0 +1,3 @@ +package net.mullvad.mullvadvpn.applist + +data class AppData(val packageName: String, val iconRes: Int, val name: String) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt new file mode 100644 index 0000000000..e266f3d044 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt @@ -0,0 +1,26 @@ +package net.mullvad.mullvadvpn.applist + +import android.content.pm.PackageManager +import android.graphics.drawable.Drawable +import android.os.Looper +import androidx.annotation.WorkerThread +import androidx.collection.LruCache + +class ApplicationsIconManager(private val packageManager: PackageManager) { + private val iconsCache = LruCache<String, Drawable>(500) + + @WorkerThread + fun getAppIcon(packageName: String): Drawable { + check(!Looper.getMainLooper().isCurrentThread) { "Should not be called from MainThread" } + iconsCache.get(packageName)?.let { + return it + } + return packageManager.getApplicationIcon(packageName).also { + iconsCache.put(packageName, it) + } + } + + fun dispose() { + iconsCache.evictAll() + } +} diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt new file mode 100644 index 0000000000..a097ffd231 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt @@ -0,0 +1,39 @@ +package net.mullvad.mullvadvpn.applist + +import android.Manifest +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager + +class ApplicationsProvider( + private val packageManager: PackageManager, + private val thisPackageName: String +) { + private val applicationFilterPredicate: (ApplicationInfo) -> Boolean = { appInfo -> + hasInternetPermission(appInfo.packageName) && + isLaunchable(appInfo.packageName) && + !isSelfApplication(appInfo.packageName) + } + + fun getAppsList(): List<AppData> { + return packageManager.getInstalledApplications(PackageManager.GET_META_DATA) + .asSequence() + .filter(applicationFilterPredicate) + .map { info -> + AppData(info.packageName, info.icon, info.loadLabel(packageManager).toString()) + } + .toList() + } + + private fun hasInternetPermission(packageName: String): Boolean { + return PackageManager.PERMISSION_GRANTED == + packageManager.checkPermission(Manifest.permission.INTERNET, packageName) + } + + private fun isLaunchable(packageName: String): Boolean { + return packageManager.getLaunchIntentForPackage(packageName) != null + } + + private fun isSelfApplication(packageName: String): Boolean { + return packageName == thisPackageName + } +} |
