manager:Fixed the issue of not getting the corresponding app name and icon in SuSFS paths
This commit is contained in:
@@ -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))
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user