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

Commit 6f73905c authored by Ganesh Olekar's avatar Ganesh Olekar Committed by Android (Google) Code Review
Browse files

Merge "Location provider check for subattribution" into tm-dev

parents ec56282d 7f13dcaa
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.icu.text.ListFormatter;
import android.location.LocationManager;
import android.media.AudioManager;
import android.os.Process;
import android.os.UserHandle;
@@ -411,10 +412,13 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
    }

    /**
     * Returns true if the app supports subattribution.
     * Returns true if the app satisfies subattribution policies and supports it
     */
    private boolean isSubattributionSupported(String packageName, int uid) {
        try {
            if (!isLocationProvider(packageName)) {
                return false;
            }
            PackageManager userPkgManager =
                    getUserContext(UserHandle.getUserHandleForUid(uid)).getPackageManager();
            ApplicationInfo appInfo = userPkgManager.getApplicationInfoAsUser(packageName,
@@ -429,6 +433,15 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
        }
    }

    /**
     * @param packageName
     * @return If the package is location provider
     */
    private boolean isLocationProvider(String packageName) {
        return Objects.requireNonNull(
                mContext.getSystemService(LocationManager.class)).isProviderPackage(packageName);
    }

    /**
     * Get the raw usages from the system, and then parse out the ones that are not recent enough,
     * determine which permission group each belongs in, and removes duplicates (if the same app
+20 −11
Original line number Diff line number Diff line
@@ -150,11 +150,12 @@ class PrivacyDialogController(
        packageName: String,
        userId: Int,
        permGroupName: CharSequence,
        attributionTag: CharSequence?
        attributionTag: CharSequence?,
        isAttributionSupported: Boolean
    ): Intent
    {
        lateinit var intent: Intent
        if (attributionTag != null) {
        if (attributionTag != null && isAttributionSupported) {
            intent = Intent(Intent.ACTION_MANAGE_PERMISSION_USAGE)
            intent.setPackage(packageName)
            intent.putExtra(Intent.EXTRA_PERMISSION_GROUP_NAME, permGroupName.toString())
@@ -162,13 +163,15 @@ class PrivacyDialogController(
            intent.putExtra(Intent.EXTRA_SHOWING_ATTRIBUTION, true)
            val resolveInfo = packageManager.resolveActivity(
                    intent, PackageManager.ResolveInfoFlags.of(0))
                ?: return getDefaultManageAppPermissionsIntent(packageName, userId)
            if (resolveInfo != null && resolveInfo.activityInfo != null &&
                    resolveInfo.activityInfo.permission ==
                    android.Manifest.permission.START_VIEW_PERMISSION_USAGE) {
                intent.component = ComponentName(packageName, resolveInfo.activityInfo.name)
                return intent
        } else {
            return getDefaultManageAppPermissionsIntent(packageName, userId)
            }
        }
        return getDefaultManageAppPermissionsIntent(packageName, userId)
    }

    fun getDefaultManageAppPermissionsIntent(packageName: String, userId: Int): Intent {
        val intent = Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS)
@@ -226,9 +229,15 @@ class PrivacyDialogController(
                                userInfo?.isManagedProfile ?: false,
                                it.isPhoneCall,
                                it.permissionGroupName,
                                getManagePermissionIntent(it.packageName, userId,
                                getManagePermissionIntent(
                                        it.packageName,
                                        userId,
                                        it.permissionGroupName,
                                it.attributionTag)
                                        it.attributionTag,
                                        // attributionLabel is set only when subattribution policies
                                        // are supported and satisfied
                                        it.attributionLabel != null
                                )
                        )
                    }
                } else {
+92 −0
Original line number Diff line number Diff line
@@ -19,8 +19,11 @@ package com.android.systemui.privacy
import android.app.ActivityManager
import android.content.Context
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.content.pm.PackageManager.ResolveInfoFlags
import android.content.pm.ResolveInfo
import android.content.pm.UserInfo
import android.os.Process.SYSTEM_UID
import android.os.UserHandle
@@ -648,6 +651,77 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
        }
    }

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

        val activityInfo = createMockActivityInfo()
        val resolveInfo = createMockResolveInfo(activityInfo)
        `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_PERMISSION_USAGE)
            assertThat(navigationIntent.getStringExtra(Intent.EXTRA_PERMISSION_GROUP_NAME))
                    .isEqualTo(PERM_CAMERA)
            assertThat(navigationIntent.getStringArrayExtra(Intent.EXTRA_ATTRIBUTION_TAGS))
                    .isEqualTo(arrayOf(TEST_ATTRIBUTION_TAG.toString()))
            assertThat(navigationIntent.getBooleanExtra(Intent.EXTRA_SHOWING_ATTRIBUTION, false))
                    .isTrue()
        }
    }

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

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

        dialogProvider.list?.let { list ->
            assertThat(isIntentEqual(list.get(0).navigationIntent!!,
                    controller.getDefaultManageAppPermissionsIntent(TEST_PACKAGE_NAME, USER_ID)))
                    .isTrue()
        }
    }

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

        val activityInfo = createMockActivityInfo(
                permission = "INCORRECT_PERMISSION"
        )
        val resolveInfo = createMockResolveInfo(activityInfo)
        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
        `when`(packageManager.resolveActivity(any(), any<ResolveInfoFlags>()))
                .thenAnswer { resolveInfo }
        controller.showDialog(context)
        exhaustExecutors()

        dialogProvider.list?.let { list ->
            assertThat(isIntentEqual(list.get(0).navigationIntent!!,
                    controller.getDefaultManageAppPermissionsIntent(TEST_PACKAGE_NAME, USER_ID)))
                    .isTrue()
        }
    }

    private fun exhaustExecutors() {
        FakeExecutor.exhaustExecutors(backgroundExecutor, uiExecutor)
    }
@@ -680,6 +754,24 @@ class PrivacyDialogControllerTest : SysuiTestCase() {
        return user * UserHandle.PER_USER_RANGE + nextUid++
    }

    private fun createMockResolveInfo(
        activityInfo: ActivityInfo? = null
    ): ResolveInfo {
        val resolveInfo = mock(ResolveInfo::class.java)
        resolveInfo.activityInfo = activityInfo
        return resolveInfo
    }

    private fun createMockActivityInfo(
        permission: String = android.Manifest.permission.START_VIEW_PERMISSION_USAGE,
        className: String = "TEST_CLASS_NAME"
    ): ActivityInfo {
        val activityInfo = mock(ActivityInfo::class.java)
        activityInfo.permission = permission
        activityInfo.name = className
        return activityInfo
    }

    private fun createMockPermGroupUsage(
        packageName: String = TEST_PACKAGE_NAME,
        uid: Int = generateUidForUser(USER_ID),