manager:Fixed the issue of not getting the corresponding app name and icon in SuSFS paths

This commit is contained in:
ShirkNeko
2025-07-01 20:00:26 +08:00
parent 2278fe49d2
commit a84cf70730
3 changed files with 91 additions and 55 deletions

View File

@@ -1,6 +1,9 @@
package com.sukisu.ultra.ui.component package com.sukisu.ultra.ui.component
import android.annotation.SuppressLint
import android.content.pm.PackageInfo
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.util.Log
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column 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.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons 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.CheckCircle
import androidx.compose.material.icons.filled.RadioButtonUnchecked import androidx.compose.material.icons.filled.RadioButtonUnchecked
import androidx.compose.material.icons.filled.Search 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.res.stringResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import coil.request.ImageRequest
import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.google.accompanist.drawablepainter.rememberDrawablePainter
import com.sukisu.ultra.R import com.sukisu.ultra.R
import com.sukisu.ultra.ui.util.SuSFSManager import com.sukisu.ultra.ui.util.SuSFSManager
@@ -279,6 +283,7 @@ fun AddAppPathDialog(
// 应用图标 // 应用图标
AppIcon( AppIcon(
packageName = app.packageName, packageName = app.packageName,
packageInfo = app.packageInfo,
modifier = Modifier.size(40.dp) modifier = Modifier.size(40.dp)
) )
@@ -372,9 +377,20 @@ fun AddAppPathDialog(
@Composable @Composable
fun AppIcon( fun AppIcon(
packageName: String, packageName: String,
modifier: Modifier = Modifier packageInfo: PackageInfo? = null,
@SuppressLint("ModifierParameter") modifier: Modifier = Modifier
) { ) {
val context = LocalContext.current val context = LocalContext.current
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<Drawable?>(null) } var appIcon by remember(packageName) { mutableStateOf<Drawable?>(null) }
LaunchedEffect(packageName) { LaunchedEffect(packageName) {
@@ -383,24 +399,13 @@ fun AppIcon(
val applicationInfo = packageManager.getApplicationInfo(packageName, 0) val applicationInfo = packageManager.getApplicationInfo(packageName, 0)
appIcon = packageManager.getApplicationIcon(applicationInfo) appIcon = packageManager.getApplicationIcon(applicationInfo)
} catch (_: Exception) { } catch (_: Exception) {
appIcon = null Log.d("获取应用图标失败", packageName)
} }
} }
if (appIcon != null) {
Image( Image(
painter = rememberDrawablePainter(appIcon), painter = rememberDrawablePainter(appIcon),
contentDescription = null, contentDescription = null,
modifier = modifier modifier = modifier.clip(RoundedCornerShape(8.dp))
.clip(RoundedCornerShape(8.dp))
)
} else {
// 默认图标
Icon(
imageVector = Icons.Default.Apps,
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
modifier = modifier
) )
} }
} }

View File

@@ -1,6 +1,8 @@
package com.sukisu.ultra.ui.screen.extensions package com.sukisu.ultra.ui.screen.extensions
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
@@ -219,7 +221,7 @@ fun KstatConfigItemCard(
) )
if (parts.size > 1) { if (parts.size > 1) {
Text( Text(
text = "${parts.drop(1).joinToString(" ")}", text = parts.drop(1).joinToString(" "),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )
@@ -651,14 +653,36 @@ fun AppPathGroupCard(
) { ) {
val context = LocalContext.current val context = LocalContext.current
var appName by remember(packageName) { mutableStateOf("") } var appName by remember(packageName) { mutableStateOf("") }
var packageInfo by remember(packageName) { mutableStateOf<PackageInfo?>(null) }
LaunchedEffect(packageName) { LaunchedEffect(packageName) {
try { try {
val packageManager = context.packageManager val packageManager = context.packageManager
val applicationInfo = packageManager.getApplicationInfo(packageName, 0) val appInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_META_DATA)
appName = packageManager.getApplicationLabel(applicationInfo).toString() packageInfo = appInfo
appName = try {
appInfo.applicationInfo?.let {
packageManager.getApplicationLabel(it).toString()
} ?: packageName
} catch (_: Exception) {
packageName
}
} catch (_: Exception) {
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) { } catch (_: Exception) {
appName = packageName appName = packageName
packageInfo = null
}
} }
} }
@@ -679,6 +703,7 @@ fun AppPathGroupCard(
// 应用图标 // 应用图标
AppIcon( AppIcon(
packageName = packageName, packageName = packageName,
packageInfo = packageInfo,
modifier = Modifier.size(32.dp) modifier = Modifier.size(32.dp)
) )

View File

@@ -4,7 +4,9 @@ import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.util.Log
import android.widget.Toast import android.widget.Toast
import com.dergoogler.mmrl.platform.Platform.Companion.context import com.dergoogler.mmrl.platform.Platform.Companion.context
import com.sukisu.ultra.Natives import com.sukisu.ultra.Natives
@@ -71,6 +73,7 @@ object SuSFSManager {
data class AppInfo( data class AppInfo(
val packageName: String, val packageName: String,
val appName: String, val appName: String,
val packageInfo: PackageInfo,
val isSystemApp: Boolean val isSystemApp: Boolean
) )
@@ -380,6 +383,7 @@ object SuSFSManager {
allApps[superUserApp.packageName] = AppInfo( allApps[superUserApp.packageName] = AppInfo(
packageName = superUserApp.packageName, packageName = superUserApp.packageName,
appName = superUserApp.label, appName = superUserApp.label,
packageInfo = superUserApp.packageInfo,
isSystemApp = false isSystemApp = false
) )
} }
@@ -387,48 +391,50 @@ object SuSFSManager {
} }
} }
// 从PackageManager获取所有应用 try {
// 尝试从PackageManager获取所有应用
val installedPackages = pm.getInstalledPackages(PackageManager.GET_META_DATA) val installedPackages = pm.getInstalledPackages(PackageManager.GET_META_DATA)
installedPackages.forEach { packageInfo -> installedPackages.forEach { packageInfo ->
val packageName = packageInfo.packageName val packageName = packageInfo.packageName
val isSystemApp = packageInfo.applicationInfo?.let { (it.flags and ApplicationInfo.FLAG_SYSTEM) != 0 } val isSystemApp = packageInfo.applicationInfo?.let {
(it.flags and ApplicationInfo.FLAG_SYSTEM) != 0
} ?: false
// 只处理非系统应用且不在SuperUser列表中的应用 // 只处理非系统应用且不在SuperUser列表中的应用
if (!isSystemApp!! && !allApps.containsKey(packageName)) { if (!isSystemApp && !allApps.containsKey(packageName)) {
try { try {
val appName = packageInfo.applicationInfo?.loadLabel(pm).toString() val appName = packageInfo.applicationInfo?.loadLabel(pm)?.toString() ?: packageName
allApps[packageName] = AppInfo( allApps[packageName] = AppInfo(
packageName = packageName, packageName = packageName,
appName = appName, appName = appName,
packageInfo = packageInfo,
isSystemApp = false isSystemApp = false
) )
} catch (_: Exception) { } catch (_: Exception) {
allApps[packageName] = AppInfo( allApps[packageName] = AppInfo(
packageName = packageName, packageName = packageName,
appName = packageName, appName = packageName,
packageInfo = packageInfo,
isSystemApp = false isSystemApp = false
) )
} }
} }
} }
} catch (e: Exception) {
Log.e("SuSFSManager", "Error getting installed packages", e)
}
// 添加可能遗漏的当前应用 // 添加可能遗漏的当前应用
val currentPackageName = context.packageName val currentPackageName = context.packageName
if (!allApps.containsKey(currentPackageName)) { if (!allApps.containsKey(currentPackageName)) {
try { try {
val currentAppInfo = pm.getPackageInfo(currentPackageName, 0) 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( allApps[currentPackageName] = AppInfo(
packageName = currentPackageName, packageName = currentPackageName,
appName = currentAppName, appName = currentAppName,
packageInfo = currentAppInfo,
isSystemApp = false isSystemApp = false
) )
} catch (_: Exception) { } catch (_: Exception) {
allApps[currentPackageName] = AppInfo(
packageName = currentPackageName,
appName = "com.sukisu.ultra",
isSystemApp = false
)
} }
} }