From 48703ed04e1fafe00d5eeadb003af3b2c21e5dd0 Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 26 Dec 2022 11:45:10 +0800 Subject: [PATCH] manager: use AppIconLoader --- manager/app/build.gradle.kts | 4 +++ .../me/weishu/kernelsu/KernelSUApplication.kt | 15 +++++++++++ .../me/weishu/kernelsu/ui/screen/SuperUser.kt | 26 ++++++++++++++++--- .../ui/viewmodel/SuperUserViewModel.kt | 21 ++++++++++----- 4 files changed, 56 insertions(+), 10 deletions(-) diff --git a/manager/app/build.gradle.kts b/manager/app/build.gradle.kts index 91eeb3bc..ab02dc4e 100644 --- a/manager/app/build.gradle.kts +++ b/manager/app/build.gradle.kts @@ -72,6 +72,10 @@ dependencies { implementation("com.google.accompanist:accompanist-swiperefresh:$accompanistVersion") implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion") implementation("io.github.raamcosta.compose-destinations:animations-core:$composeDestinationsVersion") + + implementation("io.coil-kt:coil-compose:2.2.2") + implementation("me.zhanghai.android.appiconloader:appiconloader-coil:1.5.0") + ksp("io.github.raamcosta.compose-destinations:ksp:$composeDestinationsVersion") testImplementation("junit:junit:4.13.2") diff --git a/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt b/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt index 2fdd49fb..1f068535 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt @@ -1,6 +1,10 @@ package me.weishu.kernelsu import android.app.Application +import coil.Coil +import coil.ImageLoader +import me.zhanghai.android.appiconloader.coil.AppIconFetcher +import me.zhanghai.android.appiconloader.coil.AppIconKeyer lateinit var ksuApp: KernelSUApplication @@ -9,5 +13,16 @@ class KernelSUApplication : Application() { override fun onCreate() { super.onCreate() ksuApp = this + + val context = this + val iconSize = resources.getDimensionPixelSize(android.R.dimen.app_icon_size) + Coil.setImageLoader( + ImageLoader.Builder(context) + .components { + add(AppIconKeyer()) + add(AppIconFetcher.Factory(iconSize, false, context)) + } + .build() + ) } } diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/SuperUser.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/SuperUser.kt index 07427f40..575d12c3 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/SuperUser.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/SuperUser.kt @@ -1,5 +1,10 @@ package me.weishu.kernelsu.ui.screen +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.drawable.Drawable +import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn @@ -8,10 +13,21 @@ import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import com.google.accompanist.drawablepainter.rememberDrawablePainter +import coil.ImageLoader +import coil.compose.AsyncImage +import coil.compose.rememberAsyncImagePainter +import coil.compose.rememberImagePainter +import coil.decode.DataSource +import coil.fetch.DrawableResult +import coil.fetch.FetchResult +import coil.fetch.Fetcher +import coil.request.CachePolicy +import coil.request.ImageRequest +import coil.request.Options import com.google.accompanist.swiperefresh.SwipeRefresh import com.google.accompanist.swiperefresh.rememberSwipeRefreshState import com.ramcosta.composedestinations.annotation.Destination @@ -21,6 +37,7 @@ import me.weishu.kernelsu.R import me.weishu.kernelsu.ui.component.SearchAppBar import me.weishu.kernelsu.ui.util.LocalSnackbarHost import me.weishu.kernelsu.ui.viewmodel.SuperUserViewModel +import me.zhanghai.android.appiconloader.coil.AppIconKeyer import java.util.* @OptIn(ExperimentalMaterial3Api::class) @@ -87,8 +104,11 @@ private fun AppItem( headlineText = { Text(app.label) }, supportingText = { Text(app.packageName) }, leadingContent = { - Image( - painter = rememberDrawablePainter(app.icon), + AsyncImage( + model = ImageRequest.Builder(LocalContext.current) + .data(app.icon) + .crossfade(true) + .build(), contentDescription = app.label, modifier = Modifier .padding(4.dp) diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt index b14f08e1..6691a0a3 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt @@ -1,6 +1,9 @@ package me.weishu.kernelsu.ui.viewmodel +import android.content.pm.ApplicationInfo +import android.content.pm.PackageInfo import android.graphics.drawable.Drawable +import android.os.SystemClock import android.util.Log import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue @@ -25,7 +28,7 @@ class SuperUserViewModel : ViewModel() { class AppInfo( val label: String, val packageName: String, - val icon: Drawable, + val icon: PackageInfo, val uid: Int, val onAllowList: Boolean, val onDenyList: Boolean @@ -62,16 +65,20 @@ class SuperUserViewModel : ViewModel() { val denyList = Natives.getDenyList().toSet() Log.i(TAG, "allowList: $allowList") Log.i(TAG, "denyList: $denyList") - apps = pm.getInstalledApplications(0).map { + val start = SystemClock.elapsedRealtime() + apps = pm.getInstalledPackages(0).map { + val appInfo = it.applicationInfo + val uid = appInfo.uid AppInfo( - label = it.loadLabel(pm).toString(), + label = appInfo.loadLabel(pm).toString(), packageName = it.packageName, - icon = it.loadIcon(pm), - uid = it.uid, - onAllowList = it.uid in allowList, - onDenyList = it.uid in denyList + icon = it, + uid = uid, + onAllowList = uid in allowList, + onDenyList = uid in denyList ) } + Log.i(TAG, "load cost: ${SystemClock.elapsedRealtime() - start}") } } }