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
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<Drawable?>(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<Drawable?>(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))
)
}
}

View File

@@ -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<PackageInfo?>(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)
)

View File

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