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-swiperefresh:$accompanistVersion")
implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion") implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion")
implementation("io.github.raamcosta.compose-destinations:animations-core:$composeDestinationsVersion") 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") ksp("io.github.raamcosta.compose-destinations:ksp:$composeDestinationsVersion")
testImplementation("junit:junit:4.13.2") testImplementation("junit:junit:4.13.2")

View File

@@ -1,6 +1,10 @@
package me.weishu.kernelsu package me.weishu.kernelsu
import android.app.Application 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 lateinit var ksuApp: KernelSUApplication
@@ -9,5 +13,16 @@ class KernelSUApplication : Application() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
ksuApp = this 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 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.Image
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
@@ -8,10 +13,21 @@ import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel 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.SwipeRefresh
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
import com.ramcosta.composedestinations.annotation.Destination 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.component.SearchAppBar
import me.weishu.kernelsu.ui.util.LocalSnackbarHost import me.weishu.kernelsu.ui.util.LocalSnackbarHost
import me.weishu.kernelsu.ui.viewmodel.SuperUserViewModel import me.weishu.kernelsu.ui.viewmodel.SuperUserViewModel
import me.zhanghai.android.appiconloader.coil.AppIconKeyer
import java.util.* import java.util.*
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@@ -87,8 +104,11 @@ private fun AppItem(
headlineText = { Text(app.label) }, headlineText = { Text(app.label) },
supportingText = { Text(app.packageName) }, supportingText = { Text(app.packageName) },
leadingContent = { leadingContent = {
Image( AsyncImage(
painter = rememberDrawablePainter(app.icon), model = ImageRequest.Builder(LocalContext.current)
.data(app.icon)
.crossfade(true)
.build(),
contentDescription = app.label, contentDescription = app.label,
modifier = Modifier modifier = Modifier
.padding(4.dp) .padding(4.dp)

View File

@@ -1,6 +1,9 @@
package me.weishu.kernelsu.ui.viewmodel package me.weishu.kernelsu.ui.viewmodel
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.SystemClock
import android.util.Log import android.util.Log
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -25,7 +28,7 @@ class SuperUserViewModel : ViewModel() {
class AppInfo( class AppInfo(
val label: String, val label: String,
val packageName: String, val packageName: String,
val icon: Drawable, val icon: PackageInfo,
val uid: Int, val uid: Int,
val onAllowList: Boolean, val onAllowList: Boolean,
val onDenyList: Boolean val onDenyList: Boolean
@@ -62,16 +65,20 @@ class SuperUserViewModel : ViewModel() {
val denyList = Natives.getDenyList().toSet() val denyList = Natives.getDenyList().toSet()
Log.i(TAG, "allowList: $allowList") Log.i(TAG, "allowList: $allowList")
Log.i(TAG, "denyList: $denyList") 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( AppInfo(
label = it.loadLabel(pm).toString(), label = appInfo.loadLabel(pm).toString(),
packageName = it.packageName, packageName = it.packageName,
icon = it.loadIcon(pm), icon = it,
uid = it.uid, uid = uid,
onAllowList = it.uid in allowList, onAllowList = uid in allowList,
onDenyList = it.uid in denyList onDenyList = uid in denyList
) )
} }
Log.i(TAG, "load cost: ${SystemClock.elapsedRealtime() - start}")
} }
} }
} }