diff options
5 files changed, 32 insertions, 6 deletions
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 07375ad333ed..c94438fa74f1 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2330,4 +2330,7 @@ </plurals> <!-- Text for the quick setting tile for sensor privacy [CHAR LIMIT=30] --> <string name="sensor_privacy_mode">Sensors off</string> + + <!-- Name for device services grouping system uid apps in Ongoing Privacy Dialog [CHAR_LIMIT=NONE] --> + <string name="device_services">Device Services</string> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt index bbdae291d81e..3991c19e4d05 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt @@ -106,12 +106,12 @@ class OngoingPrivacyDialog constructor( val appName = item.findViewById(R.id.app_name) as TextView val icons = item.findViewById(R.id.icons) as LinearLayout - var lp = LinearLayout.LayoutParams(iconSize, iconSize).apply { + val lp = LinearLayout.LayoutParams(iconSize, iconSize).apply { gravity = Gravity.CENTER_VERTICAL marginStart = iconMargin } - app.icon?.let { + app.icon.let { appIcon.setImageDrawable(it) } diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt index 85e99f05f895..2c4da64712ac 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt @@ -44,7 +44,7 @@ data class PrivacyApplication(val packageName: String, val context: Context) return applicationName.compareTo(other.applicationName) } - var icon: Drawable? = null + var icon: Drawable = context.getDrawable(android.R.drawable.sym_def_app_icon) var applicationName: String init { diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt index a87d634451cd..d5b807def21f 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt @@ -29,6 +29,7 @@ import com.android.internal.annotations.VisibleForTesting import com.android.systemui.Dependency import com.android.systemui.appops.AppOpItem import com.android.systemui.appops.AppOpsController +import com.android.systemui.R class PrivacyItemController(val context: Context, val callback: Callback) { @@ -41,15 +42,17 @@ class PrivacyItemController(val context: Context, val callback: Callback) { Intent.ACTION_MANAGED_PROFILE_ADDED, Intent.ACTION_MANAGED_PROFILE_REMOVED) const val TAG = "PrivacyItemController" + const val SYSTEM_UID = 1000 } - private var privacyList = emptyList<PrivacyItem>() + private val appOpsController = Dependency.get(AppOpsController::class.java) private val userManager = context.getSystemService(UserManager::class.java) private var currentUserIds = emptyList<Int>() private val bgHandler = Handler(Dependency.get(Dependency.BG_LOOPER)) private val uiHandler = Dependency.get(Dependency.MAIN_HANDLER) private var listening = false + val systemApp = PrivacyApplication(context.getString(R.string.device_services), context) private val notifyChanges = Runnable { callback.privacyChanged(privacyList) @@ -126,6 +129,7 @@ class PrivacyItemController(val context: Context, val callback: Callback) { AppOpsManager.OP_RECORD_AUDIO -> PrivacyType.TYPE_MICROPHONE else -> return null } + if (appOpItem.uid == SYSTEM_UID) return PrivacyItem(type, systemApp) val app = PrivacyApplication(appOpItem.packageName, context) return PrivacyItem(type, app) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt index 563599b32d60..e6d7ee7407d4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt @@ -28,6 +28,7 @@ import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.testing.TestableLooper.RunWithLooper import com.android.systemui.Dependency +import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.appops.AppOpItem import com.android.systemui.appops.AppOpsController @@ -56,6 +57,10 @@ class PrivacyItemControllerTest : SysuiTestCase() { companion object { val CURRENT_USER_ID = ActivityManager.getCurrentUser() + val TEST_UID = CURRENT_USER_ID * UserHandle.PER_USER_RANGE + const val SYSTEM_UID = 1000 + const val TEST_PACKAGE_NAME = "test" + const val DEVICE_SERVICES_STRING = "Device services" const val TAG = "PrivacyItemControllerTest" fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture() } @@ -81,6 +86,8 @@ class PrivacyItemControllerTest : SysuiTestCase() { mDependency.injectTestDependency(Dependency.BG_LOOPER, testableLooper.looper) mDependency.injectTestDependency(Dependency.MAIN_HANDLER, Handler(testableLooper.looper)) mContext.addMockSystemService(UserManager::class.java, userManager) + mContext.getOrCreateTestableResources().addOverride(R.string.device_services, + DEVICE_SERVICES_STRING) doReturn(listOf(object : UserInfo() { init { @@ -110,8 +117,8 @@ class PrivacyItemControllerTest : SysuiTestCase() { @Test fun testDistinctItems() { - doReturn(listOf(AppOpItem(AppOpsManager.OP_CAMERA, CURRENT_USER_ID, "", 0), - AppOpItem(AppOpsManager.OP_CAMERA, CURRENT_USER_ID, "", 1))) + doReturn(listOf(AppOpItem(AppOpsManager.OP_CAMERA, TEST_UID, "", 0), + AppOpItem(AppOpsManager.OP_CAMERA, TEST_UID, "", 1))) .`when`(appOpsController).getActiveAppOpsForUser(anyInt()) privacyItemController.setListening(true) @@ -121,6 +128,18 @@ class PrivacyItemControllerTest : SysuiTestCase() { } @Test + fun testSystemApps() { + doReturn(listOf(AppOpItem(AppOpsManager.OP_COARSE_LOCATION, SYSTEM_UID, TEST_PACKAGE_NAME, + 0))).`when`(appOpsController).getActiveAppOpsForUser(anyInt()) + privacyItemController.setListening(true) + testableLooper.processAllMessages() + verify(callback).privacyChanged(capture(argCaptor)) + assertEquals(1, argCaptor.value.size) + assertEquals(context.getString(R.string.device_services), + argCaptor.value[0].application.applicationName) + } + + @Test fun testRegisterReceiver_allUsers() { val spiedContext = spy(mContext) val itemController = PrivacyItemController(spiedContext, callback) |