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
|
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,35 +377,35 @@ 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
|
||||||
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) {
|
LaunchedEffect(packageName) {
|
||||||
try {
|
try {
|
||||||
val packageManager = context.packageManager
|
val packageManager = context.packageManager
|
||||||
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
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
} 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(
|
AppIcon(
|
||||||
packageName = packageName,
|
packageName = packageName,
|
||||||
|
packageInfo = packageInfo,
|
||||||
modifier = Modifier.size(32.dp)
|
modifier = Modifier.size(32.dp)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
val installedPackages = pm.getInstalledPackages(PackageManager.GET_META_DATA)
|
// 尝试从PackageManager获取所有应用
|
||||||
installedPackages.forEach { packageInfo ->
|
val installedPackages = pm.getInstalledPackages(PackageManager.GET_META_DATA)
|
||||||
val packageName = packageInfo.packageName
|
installedPackages.forEach { packageInfo ->
|
||||||
val isSystemApp = packageInfo.applicationInfo?.let { (it.flags and ApplicationInfo.FLAG_SYSTEM) != 0 }
|
val packageName = packageInfo.packageName
|
||||||
|
val isSystemApp = packageInfo.applicationInfo?.let {
|
||||||
// 只处理非系统应用且不在SuperUser列表中的应用
|
(it.flags and ApplicationInfo.FLAG_SYSTEM) != 0
|
||||||
if (!isSystemApp!! && !allApps.containsKey(packageName)) {
|
} ?: false
|
||||||
try {
|
// 只处理非系统应用且不在SuperUser列表中的应用
|
||||||
val appName = packageInfo.applicationInfo?.loadLabel(pm).toString()
|
if (!isSystemApp && !allApps.containsKey(packageName)) {
|
||||||
allApps[packageName] = AppInfo(
|
try {
|
||||||
packageName = packageName,
|
val appName = packageInfo.applicationInfo?.loadLabel(pm)?.toString() ?: packageName
|
||||||
appName = appName,
|
allApps[packageName] = AppInfo(
|
||||||
isSystemApp = false
|
packageName = packageName,
|
||||||
)
|
appName = appName,
|
||||||
} catch (_: Exception) {
|
packageInfo = packageInfo,
|
||||||
allApps[packageName] = AppInfo(
|
isSystemApp = false
|
||||||
packageName = packageName,
|
)
|
||||||
appName = packageName,
|
} catch (_: Exception) {
|
||||||
isSystemApp = false
|
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
|
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
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user