AppClone: Add suffix 'clone' to App Info page of cloned or cloneable app.
Bug: 262375058
Test: atest SpaPrivilegedLibTests
Test: manual and robo test
Change-Id: Icb554cf5bd8137be8639133431094edc596ecdac
diff --git a/packages/SettingsLib/SpaPrivileged/AndroidManifest.xml b/packages/SettingsLib/SpaPrivileged/AndroidManifest.xml
index 2efa107..d1dceb3 100644
--- a/packages/SettingsLib/SpaPrivileged/AndroidManifest.xml
+++ b/packages/SettingsLib/SpaPrivileged/AndroidManifest.xml
@@ -15,4 +15,8 @@
limitations under the License.
-->
-<manifest package="com.android.settingslib.spaprivileged" />
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.settingslib.spaprivileged">
+<uses-permission android:name="android.permission.MANAGE_USERS" />
+</manifest>
+
diff --git a/packages/SettingsLib/SpaPrivileged/res/values/strings.xml b/packages/SettingsLib/SpaPrivileged/res/values/strings.xml
index 25dbe00..e1e7649 100644
--- a/packages/SettingsLib/SpaPrivileged/res/values/strings.xml
+++ b/packages/SettingsLib/SpaPrivileged/res/values/strings.xml
@@ -27,4 +27,6 @@
<string name="app_permission_summary_not_allowed">Not allowed</string>
<!-- Manage applications, version string displayed in app snippet -->
<string name="version_text">version <xliff:g id="version_num">%1$s</xliff:g></string>
+ <!-- Label of an app on App Info page of Cloned Apps menu [CHAR LIMIT=40] -->
+ <string name="cloned_app_info_label"><xliff:g id="package_label">%1$s</xliff:g> clone</string>
</resources>
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppRepository.kt
index 90710db..18b2073 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppRepository.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppRepository.kt
@@ -19,9 +19,11 @@
import android.content.Context
import android.content.pm.ApplicationInfo
import android.graphics.drawable.Drawable
+import android.os.UserManager
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.produceState
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.android.settingslib.Utils
import com.android.settingslib.spa.framework.compose.rememberContext
@@ -36,12 +38,24 @@
fun loadLabel(app: ApplicationInfo): String
@Composable
- fun produceLabel(app: ApplicationInfo) =
- produceState(initialValue = stringResource(R.string.summary_placeholder), app) {
+ fun produceLabel(app: ApplicationInfo, isClonedAppPage: Boolean = false): State<String> {
+ val context = LocalContext.current
+ return produceState(initialValue = stringResource(R.string.summary_placeholder), app) {
withContext(Dispatchers.IO) {
- value = loadLabel(app)
+ if (isClonedAppPage || isCloneApp(context, app)) {
+ value = context.getString(R.string.cloned_app_info_label, loadLabel(app))
+ } else {
+ value = loadLabel(app)
+ }
}
}
+ }
+
+ private fun isCloneApp(context: Context, app: ApplicationInfo): Boolean {
+ val userManager = context.getSystemService(UserManager::class.java)!!
+ val userInfo = userManager.getUserInfo(app.userId)
+ return userInfo != null && userInfo.isCloneProfile
+ }
@Composable
fun produceIcon(app: ApplicationInfo): State<Drawable?>
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt
index 16ca70f..602df54 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt
@@ -43,7 +43,7 @@
class AppInfoProvider(private val packageInfo: PackageInfo) {
@Composable
- fun AppInfo(displayVersion: Boolean = false) {
+ fun AppInfo(displayVersion: Boolean = false, isClonedAppPage: Boolean = false) {
Column(
modifier = Modifier
.fillMaxWidth()
@@ -57,7 +57,7 @@
Box(modifier = Modifier.padding(SettingsDimension.itemPaddingAround)) {
AppIcon(app = app, size = SettingsDimension.appIconInfoSize)
}
- AppLabel(app)
+ AppLabel(app, isClonedAppPage)
InstallType(app)
if (displayVersion) AppVersion()
}
@@ -99,7 +99,7 @@
}
@Composable
-internal fun AppLabel(app: ApplicationInfo) {
+internal fun AppLabel(app: ApplicationInfo, isClonedAppPage: Boolean = false) {
val appRepository = rememberAppRepository()
- SettingsTitle(title = appRepository.produceLabel(app), useMediumWeight = true)
+ SettingsTitle(title = appRepository.produceLabel(app, isClonedAppPage), useMediumWeight = true)
}