Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e93dfe8b authored by Yi-an Chen's avatar Yi-an Chen Committed by Android (Google) Code Review
Browse files

Merge "Limit ACTION_MANAGE_PERMISSION_USAGE to location provider on privacy dialog" into main

parents aad33692 97889e37
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ import android.hardware.display.DisplayManager;
import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.input.InputManager;
import android.location.LocationManager;
import android.media.AudioManager;
import android.media.IAudioService;
import android.media.MediaRouter2Manager;
@@ -687,6 +688,12 @@ public class FrameworkServicesModule {
        return pm;
    }

    @Provides
    @Singleton
    static LocationManager provideLocationManager(Context context) {
        return context.getSystemService(LocationManager.class);
    }

    @Provides
    @Singleton
    static ClipboardManager provideClipboardManager(Context context) {
+10 −3
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.location.LocationManager
import android.os.UserHandle
import android.permission.PermissionGroupUsage
import android.permission.PermissionManager
@@ -62,6 +63,7 @@ private val defaultDialogProvider = object : PrivacyDialogController.DialogProvi
class PrivacyDialogController(
    private val permissionManager: PermissionManager,
    private val packageManager: PackageManager,
    private val locationManager: LocationManager,
    private val privacyItemController: PrivacyItemController,
    private val userTracker: UserTracker,
    private val activityStarter: ActivityStarter,
@@ -78,6 +80,7 @@ class PrivacyDialogController(
    constructor(
        permissionManager: PermissionManager,
        packageManager: PackageManager,
        locationManager: LocationManager,
        privacyItemController: PrivacyItemController,
        userTracker: UserTracker,
        activityStarter: ActivityStarter,
@@ -90,6 +93,7 @@ class PrivacyDialogController(
    ) : this(
            permissionManager,
            packageManager,
            locationManager,
            privacyItemController,
            userTracker,
            activityStarter,
@@ -147,15 +151,17 @@ class PrivacyDialogController(

    @WorkerThread
    private fun getManagePermissionIntent(
        context: Context,
        packageName: String,
        userId: Int,
        permGroupName: CharSequence,
        attributionTag: CharSequence?,
        isAttributionSupported: Boolean
    ): Intent
    {
    ): Intent {
        lateinit var intent: Intent
        if (attributionTag != null && isAttributionSupported) {
        // We should only limit this intent to location provider
        if (attributionTag != null && isAttributionSupported &&
            locationManager.isProviderPackage(null, packageName, attributionTag.toString())) {
            intent = Intent(Intent.ACTION_MANAGE_PERMISSION_USAGE)
            intent.setPackage(packageName)
            intent.putExtra(Intent.EXTRA_PERMISSION_GROUP_NAME, permGroupName.toString())
@@ -230,6 +236,7 @@ class PrivacyDialogController(
                                it.isPhoneCall,
                                it.permissionGroupName,
                                getManagePermissionIntent(
                                        context,
                                        it.packageName,
                                        userId,
                                        it.permissionGroupName,
+12 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.location.LocationManager
import android.os.UserHandle
import android.permission.PermissionGroupUsage
import android.permission.PermissionManager
@@ -65,6 +66,7 @@ private val defaultDialogProvider =
class PrivacyDialogControllerV2(
    private val permissionManager: PermissionManager,
    private val packageManager: PackageManager,
    private val locationManager: LocationManager,
    private val privacyItemController: PrivacyItemController,
    private val userTracker: UserTracker,
    private val activityStarter: ActivityStarter,
@@ -82,6 +84,7 @@ class PrivacyDialogControllerV2(
    constructor(
        permissionManager: PermissionManager,
        packageManager: PackageManager,
        locationManager: LocationManager,
        privacyItemController: PrivacyItemController,
        userTracker: UserTracker,
        activityStarter: ActivityStarter,
@@ -95,6 +98,7 @@ class PrivacyDialogControllerV2(
    ) : this(
        permissionManager,
        packageManager,
        locationManager,
        privacyItemController,
        userTracker,
        activityStarter,
@@ -166,12 +170,18 @@ class PrivacyDialogControllerV2(

    @WorkerThread
    private fun getStartViewPermissionUsageIntent(
        context: Context,
        packageName: String,
        permGroupName: String,
        attributionTag: CharSequence?,
        isAttributionSupported: Boolean
    ): Intent? {
        if (attributionTag != null && isAttributionSupported) {
        // We should only limit this intent to location provider
        if (
            attributionTag != null &&
                isAttributionSupported &&
                locationManager.isProviderPackage(null, packageName, attributionTag.toString())
        ) {
            val intent = Intent(Intent.ACTION_MANAGE_PERMISSION_USAGE)
            intent.setPackage(packageName)
            intent.putExtra(Intent.EXTRA_PERMISSION_GROUP_NAME, permGroupName)
@@ -237,6 +247,7 @@ class PrivacyDialogControllerV2(
                        val userId = UserHandle.getUserId(it.uid)
                        val viewUsageIntent =
                            getStartViewPermissionUsageIntent(
                                context,
                                it.packageName,
                                it.permissionGroupName,
                                it.attributionTag,
+30 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.content.pm.PackageManager
import android.content.pm.PackageManager.ResolveInfoFlags
import android.content.pm.ResolveInfo
import android.content.pm.UserInfo
import android.location.LocationManager
import android.os.Process.SYSTEM_UID
import android.os.UserHandle
import android.permission.PermissionGroupUsage
@@ -86,6 +87,8 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
    @Mock
    private lateinit var packageManager: PackageManager
    @Mock
    private lateinit var locationManager: LocationManager
    @Mock
    private lateinit var privacyItemController: PrivacyItemController
    @Mock
    private lateinit var userTracker: UserTracker
@@ -135,6 +138,7 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
        controller = PrivacyDialogController(
                permissionManager,
                packageManager,
                locationManager,
                privacyItemController,
                userTracker,
                activityStarter,
@@ -652,7 +656,7 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
    }

    @Test
    fun testCorrectIntentSubAttribution() {
    fun testCorrectIntentSubAttributionForLocationProvider() {
        val usage = createMockPermGroupUsage(
                attributionTag = TEST_ATTRIBUTION_TAG,
                attributionLabel = "TEST_LABEL"
@@ -660,6 +664,8 @@ class PrivacyDialogControllerTest : SysuiTestCase() {

        val activityInfo = createMockActivityInfo()
        val resolveInfo = createMockResolveInfo(activityInfo)
        `when`(locationManager.isProviderPackage(null, TEST_PACKAGE_NAME, TEST_ATTRIBUTION_TAG))
                .thenReturn(true)
        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
        `when`(packageManager.resolveActivity(any(), any<ResolveInfoFlags>()))
                .thenAnswer { resolveInfo }
@@ -678,6 +684,29 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
        }
    }

    @Test
    fun testCorrectIntentSubAttributionForNonLocationProvider() {
        val usage = createMockPermGroupUsage(
            attributionTag = TEST_ATTRIBUTION_TAG,
            attributionLabel = "TEST_LABEL"
        )

        val activityInfo = createMockActivityInfo()
        val resolveInfo = createMockResolveInfo(activityInfo)
        `when`(locationManager.isProviderPackage(null, TEST_PACKAGE_NAME, TEST_ATTRIBUTION_TAG))
            .thenReturn(false)
        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
        `when`(packageManager.resolveActivity(any(), any<ResolveInfoFlags>()))
            .thenAnswer { resolveInfo }
        controller.showDialog(context)
        exhaustExecutors()

        dialogProvider.list?.let { list ->
            val navigationIntent = list.get(0).navigationIntent!!
            assertThat(navigationIntent.action).isEqualTo(Intent.ACTION_MANAGE_APP_PERMISSIONS)
        }
    }

    @Test
    fun testDefaultIntentOnMissingAttributionLabel() {
        val usage = createMockPermGroupUsage(
+31 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.content.pm.PackageManager
import android.content.pm.PackageManager.ResolveInfoFlags
import android.content.pm.ResolveInfo
import android.content.pm.UserInfo
import android.location.LocationManager
import android.os.Process.SYSTEM_UID
import android.os.UserHandle
import android.permission.PermissionGroupUsage
@@ -86,6 +87,7 @@ class PrivacyDialogControllerV2Test : SysuiTestCase() {
    @Mock private lateinit var dialog: PrivacyDialogV2
    @Mock private lateinit var permissionManager: PermissionManager
    @Mock private lateinit var packageManager: PackageManager
    @Mock private lateinit var locationManager: LocationManager
    @Mock private lateinit var privacyItemController: PrivacyItemController
    @Mock private lateinit var userTracker: UserTracker
    @Mock private lateinit var activityStarter: ActivityStarter
@@ -136,6 +138,7 @@ class PrivacyDialogControllerV2Test : SysuiTestCase() {
            PrivacyDialogControllerV2(
                permissionManager,
                packageManager,
                locationManager,
                privacyItemController,
                userTracker,
                activityStarter,
@@ -660,7 +663,7 @@ class PrivacyDialogControllerV2Test : SysuiTestCase() {
    }

    @Test
    fun testServiceIntentOnCorrectSubAttribution() {
    fun testServiceIntentOnCorrectSubAttributionForLocationProvider() {
        val usage =
            createMockPermGroupUsage(
                attributionTag = TEST_ATTRIBUTION_TAG,
@@ -669,6 +672,8 @@ class PrivacyDialogControllerV2Test : SysuiTestCase() {

        val activityInfo = createMockActivityInfo()
        val resolveInfo = createMockResolveInfo(activityInfo)
        `when`(locationManager.isProviderPackage(null, TEST_PACKAGE_NAME, TEST_ATTRIBUTION_TAG))
            .thenReturn(true)
        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
        `when`(packageManager.resolveActivity(any(), any<ResolveInfoFlags>())).thenAnswer {
            resolveInfo
@@ -689,6 +694,31 @@ class PrivacyDialogControllerV2Test : SysuiTestCase() {
        }
    }

    @Test
    fun testServiceIntentOnCorrectSubAttributionForNonLocationProvider() {
        val usage =
            createMockPermGroupUsage(
                attributionTag = TEST_ATTRIBUTION_TAG,
                attributionLabel = "TEST_LABEL"
            )

        val activityInfo = createMockActivityInfo()
        val resolveInfo = createMockResolveInfo(activityInfo)
        `when`(locationManager.isProviderPackage(null, TEST_PACKAGE_NAME, TEST_ATTRIBUTION_TAG))
            .thenReturn(false)
        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
        `when`(packageManager.resolveActivity(any(), any<ResolveInfoFlags>())).thenAnswer {
            resolveInfo
        }
        controller.showDialog(context)
        exhaustExecutors()

        dialogProvider.list?.let { list ->
            val navigationIntent = list.get(0).navigationIntent!!
            assertThat(navigationIntent.action).isEqualTo(Intent.ACTION_MANAGE_APP_PERMISSIONS)
        }
    }

    @Test
    fun testDefaultIntentOnMissingAttributionLabel() {
        val usage = createMockPermGroupUsage(attributionTag = TEST_ATTRIBUTION_TAG)