manager: use AppIconLoader
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user