manager: use AppIconLoader

This commit is contained in:
tiann
2022-12-26 11:45:10 +08:00
parent 987602b55b
commit 48703ed04e
4 changed files with 56 additions and 10 deletions

View File

@@ -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")

View File

@@ -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()
)
}
}

View File

@@ -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)

View File

@@ -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}")
}
}
}