diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/component/SuSFSConfigDialogs.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/component/SuSFSConfigDialogs.kt index 258e4ab4..ca40a22d 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/component/SuSFSConfigDialogs.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/component/SuSFSConfigDialogs.kt @@ -1,6 +1,9 @@ package com.sukisu.ultra.ui.component +import android.annotation.SuppressLint +import android.content.pm.PackageInfo import android.graphics.drawable.Drawable +import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -15,7 +18,6 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Apps import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.filled.RadioButtonUnchecked import androidx.compose.material.icons.filled.Search @@ -48,6 +50,8 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import coil.request.ImageRequest import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.sukisu.ultra.R import com.sukisu.ultra.ui.util.SuSFSManager @@ -279,6 +283,7 @@ fun AddAppPathDialog( // 应用图标 AppIcon( packageName = app.packageName, + packageInfo = app.packageInfo, modifier = Modifier.size(40.dp) ) @@ -372,35 +377,35 @@ fun AddAppPathDialog( @Composable fun AppIcon( packageName: String, - modifier: Modifier = Modifier + packageInfo: PackageInfo? = null, + @SuppressLint("ModifierParameter") modifier: Modifier = Modifier ) { val context = LocalContext.current - var appIcon by remember(packageName) { mutableStateOf(null) } + if (packageInfo != null) { + AsyncImage( + model = ImageRequest.Builder(context) + .data(packageInfo) + .crossfade(true) + .build(), + contentDescription = null, + modifier = modifier.clip(RoundedCornerShape(8.dp)) + ) + } else { + var appIcon by remember(packageName) { mutableStateOf(null) } - LaunchedEffect(packageName) { - try { - val packageManager = context.packageManager - val applicationInfo = packageManager.getApplicationInfo(packageName, 0) - appIcon = packageManager.getApplicationIcon(applicationInfo) - } catch (_: Exception) { - appIcon = null + LaunchedEffect(packageName) { + try { + val packageManager = context.packageManager + val applicationInfo = packageManager.getApplicationInfo(packageName, 0) + appIcon = packageManager.getApplicationIcon(applicationInfo) + } catch (_: Exception) { + Log.d("获取应用图标失败", packageName) + } } - } - - if (appIcon != null) { Image( painter = rememberDrawablePainter(appIcon), contentDescription = null, - modifier = modifier - .clip(RoundedCornerShape(8.dp)) - ) - } else { - // 默认图标 - Icon( - imageVector = Icons.Default.Apps, - contentDescription = null, - tint = MaterialTheme.colorScheme.primary, - modifier = modifier + modifier = modifier.clip(RoundedCornerShape(8.dp)) ) } } diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/extensions/SuSFSConfigExtensions.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/extensions/SuSFSConfigExtensions.kt index d7f405e7..412aa4fd 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/extensions/SuSFSConfigExtensions.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/extensions/SuSFSConfigExtensions.kt @@ -1,6 +1,8 @@ package com.sukisu.ultra.ui.screen.extensions import android.annotation.SuppressLint +import android.content.pm.PackageInfo +import android.content.pm.PackageManager import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -219,7 +221,7 @@ fun KstatConfigItemCard( ) if (parts.size > 1) { Text( - text = "${parts.drop(1).joinToString(" ")}", + text = parts.drop(1).joinToString(" "), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -651,14 +653,36 @@ fun AppPathGroupCard( ) { val context = LocalContext.current var appName by remember(packageName) { mutableStateOf("") } + var packageInfo by remember(packageName) { mutableStateOf(null) } LaunchedEffect(packageName) { try { val packageManager = context.packageManager - val applicationInfo = packageManager.getApplicationInfo(packageName, 0) - appName = packageManager.getApplicationLabel(applicationInfo).toString() + val appInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_META_DATA) + packageInfo = appInfo + + appName = try { + appInfo.applicationInfo?.let { + packageManager.getApplicationLabel(it).toString() + } ?: packageName + } catch (_: Exception) { + packageName + } } catch (_: Exception) { - appName = packageName + try { + val installedApps = SuSFSManager.getInstalledApps() + val foundApp = installedApps.find { it.packageName == packageName } + if (foundApp != null) { + appName = foundApp.appName + packageInfo = foundApp.packageInfo + } else { + appName = packageName + packageInfo = null + } + } catch (_: Exception) { + appName = packageName + packageInfo = null + } } } @@ -679,6 +703,7 @@ fun AppPathGroupCard( // 应用图标 AppIcon( packageName = packageName, + packageInfo = packageInfo, modifier = Modifier.size(32.dp) ) diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/util/SuSFSManager.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/util/SuSFSManager.kt index 74ae628c..ab12b8ce 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/util/SuSFSManager.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/util/SuSFSManager.kt @@ -4,7 +4,9 @@ import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import android.content.pm.ApplicationInfo +import android.content.pm.PackageInfo import android.content.pm.PackageManager +import android.util.Log import android.widget.Toast import com.dergoogler.mmrl.platform.Platform.Companion.context import com.sukisu.ultra.Natives @@ -71,6 +73,7 @@ object SuSFSManager { data class AppInfo( val packageName: String, val appName: String, + val packageInfo: PackageInfo, val isSystemApp: Boolean ) @@ -380,6 +383,7 @@ object SuSFSManager { allApps[superUserApp.packageName] = AppInfo( packageName = superUserApp.packageName, appName = superUserApp.label, + packageInfo = superUserApp.packageInfo, isSystemApp = false ) } @@ -387,48 +391,50 @@ object SuSFSManager { } } - // 从PackageManager获取所有应用 - val installedPackages = pm.getInstalledPackages(PackageManager.GET_META_DATA) - installedPackages.forEach { packageInfo -> - val packageName = packageInfo.packageName - val isSystemApp = packageInfo.applicationInfo?.let { (it.flags and ApplicationInfo.FLAG_SYSTEM) != 0 } - - // 只处理非系统应用且不在SuperUser列表中的应用 - if (!isSystemApp!! && !allApps.containsKey(packageName)) { - try { - val appName = packageInfo.applicationInfo?.loadLabel(pm).toString() - allApps[packageName] = AppInfo( - packageName = packageName, - appName = appName, - isSystemApp = false - ) - } catch (_: Exception) { - allApps[packageName] = AppInfo( - packageName = packageName, - appName = packageName, - isSystemApp = false - ) + try { + // 尝试从PackageManager获取所有应用 + val installedPackages = pm.getInstalledPackages(PackageManager.GET_META_DATA) + installedPackages.forEach { packageInfo -> + val packageName = packageInfo.packageName + val isSystemApp = packageInfo.applicationInfo?.let { + (it.flags and ApplicationInfo.FLAG_SYSTEM) != 0 + } ?: false + // 只处理非系统应用且不在SuperUser列表中的应用 + if (!isSystemApp && !allApps.containsKey(packageName)) { + try { + val appName = packageInfo.applicationInfo?.loadLabel(pm)?.toString() ?: packageName + allApps[packageName] = AppInfo( + packageName = packageName, + appName = appName, + packageInfo = packageInfo, + isSystemApp = false + ) + } catch (_: Exception) { + allApps[packageName] = AppInfo( + packageName = packageName, + appName = packageName, + packageInfo = packageInfo, + isSystemApp = false + ) + } } } + } catch (e: Exception) { + Log.e("SuSFSManager", "Error getting installed packages", e) } - // 添加可能遗漏的当前应用 val currentPackageName = context.packageName if (!allApps.containsKey(currentPackageName)) { try { val currentAppInfo = pm.getPackageInfo(currentPackageName, 0) - val currentAppName = currentAppInfo.applicationInfo?.loadLabel(pm).toString() + val currentAppName = currentAppInfo.applicationInfo?.loadLabel(pm)?.toString() ?: "com.sukisu.ultra" allApps[currentPackageName] = AppInfo( packageName = currentPackageName, appName = currentAppName, + packageInfo = currentAppInfo, isSystemApp = false ) } catch (_: Exception) { - allApps[currentPackageName] = AppInfo( - packageName = currentPackageName, - appName = "com.sukisu.ultra", - isSystemApp = false - ) } }