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

Commit e7d31414 authored by Nate Myren's avatar Nate Myren Committed by Automerger Merge Worker
Browse files

Merge "Add wifi call special case, fix phone, predictor, filter system" into...

Merge "Add wifi call special case, fix phone, predictor, filter system" into sc-dev am: 2008f5c9 am: 33cbb6e5

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13431005

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I4d0f1c98861513e4bbf234fa613a79829146e442
parents 8c3e405f 33cbb6e5
Loading
Loading
Loading
Loading
+53 −6
Original line number Diff line number Diff line
@@ -28,7 +28,10 @@ import static android.app.AppOpsManager.OPSTR_RECORD_AUDIO;
import static android.app.AppOpsManager.OP_FLAGS_ALL_TRUSTED;
import static android.app.AppOpsManager.opToPermission;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED;
import static android.media.AudioSystem.MODE_IN_COMMUNICATION;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;

import android.Manifest;
import android.annotation.NonNull;
import android.app.AppOpsManager;
import android.content.ComponentName;
@@ -41,12 +44,14 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.icu.text.ListFormatter;
import android.location.LocationManager;
import android.media.AudioManager;
import android.os.Process;
import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.speech.RecognitionService;
import android.speech.RecognizerIntent;
import android.telephony.TelephonyManager;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.view.inputmethod.InputMethodInfo;
@@ -75,6 +80,9 @@ public class PermissionUsageHelper {
    private static final String PROPERTY_LOCATION_INDICATORS_ENABLED =
            "location_indicators_enabled";

    /** Whether to show the Permissions Hub.  */
    private static final String PROPERTY_PERMISSIONS_HUB_2_ENABLED = "permissions_hub_2_enabled";

    /** How long after an access to show it as "recent" */
    private static final String RECENT_ACCESS_TIME_MS = "recent_acccess_time_ms";

@@ -84,17 +92,25 @@ public class PermissionUsageHelper {
    /** The name of the expected voice IME subtype */
    private static final String VOICE_IME_SUBTYPE = "voice";

    private static final String SYSTEM_PKG = "android";

    private static final long DEFAULT_RUNNING_TIME_MS = 5000L;
    private static final long DEFAULT_RECENT_TIME_MS = 30000L;

    private static boolean shouldShowPermissionsHub() {
        return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
                PROPERTY_PERMISSIONS_HUB_2_ENABLED, false);
    }

    private static boolean shouldShowIndicators() {
        return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
                PROPERTY_CAMERA_MIC_ICONS_ENABLED, true);
                PROPERTY_CAMERA_MIC_ICONS_ENABLED, true) || shouldShowPermissionsHub();
    }

    private static boolean shouldShowLocationIndicator() {
        return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
                PROPERTY_LOCATION_INDICATORS_ENABLED, false);
                PROPERTY_LOCATION_INDICATORS_ENABLED, false)
                || shouldShowPermissionsHub();
    }

    private static long getRecentThreshold(Long now) {
@@ -113,7 +129,7 @@ public class PermissionUsageHelper {
    );

    private static final List<String> MIC_OPS = List.of(
            OPSTR_PHONE_CALL_CAMERA,
            OPSTR_PHONE_CALL_MICROPHONE,
            OPSTR_RECORD_AUDIO
    );

@@ -163,6 +179,13 @@ public class PermissionUsageHelper {
        return mUserContexts.get(user);
    }

    // TODO ntmyren: Replace this with better check if this moves beyond teamfood
    private boolean isAppPredictor(String packageName, UserHandle user) {
        return shouldShowPermissionsHub() && getUserContext(user).getPackageManager()
                .checkPermission(Manifest.permission.MANAGE_APP_PREDICTIONS, packageName)
                == PackageManager.PERMISSION_GRANTED;
    }

    /**
     * @see PermissionManager.getIndicatorAppOpUsageData
     */
@@ -186,7 +209,28 @@ public class PermissionUsageHelper {
        Map<PackageAttribution, CharSequence> packagesWithAttributionLabels =
                getTrustedAttributions(rawUsages.get(MICROPHONE), proxyChains);

        List<String> usedPermGroups = new ArrayList<>(rawUsages.keySet());
        ArrayList<String> usedPermGroups = new ArrayList<>(rawUsages.keySet());

        // If we have a phone call, and a carrier privileged app using microphone, hide the
        // phone call.
        AudioManager audioManager = mContext.getSystemService(AudioManager.class);
        boolean hasPhoneCall = usedPermGroups.contains(OPSTR_PHONE_CALL_CAMERA)
                || usedPermGroups.contains(OPSTR_PHONE_CALL_MICROPHONE);
        if (hasPhoneCall && usedPermGroups.contains(MICROPHONE) && audioManager.getMode()
                == MODE_IN_COMMUNICATION) {
            TelephonyManager telephonyManager =
                    mContext.getSystemService(TelephonyManager.class);
            List<OpUsage> permUsages = rawUsages.get(MICROPHONE);
            for (int usageNum = 0; usageNum < permUsages.size(); usageNum++) {
                if (telephonyManager.checkCarrierPrivilegesForPackage(
                        permUsages.get(usageNum).packageName)
                        == CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
                    usedPermGroups.remove(OPSTR_PHONE_CALL_CAMERA);
                    usedPermGroups.remove(OPSTR_PHONE_CALL_MICROPHONE);
                }
            }
        }

        for (int permGroupNum = 0; permGroupNum < usedPermGroups.size(); permGroupNum++) {
            boolean isPhone = false;
            String permGroup = usedPermGroups.get(permGroupNum);
@@ -269,8 +313,11 @@ public class PermissionUsageHelper {
                    if (lastAccessTime < recentThreshold && !attrOpEntry.isRunning()) {
                        continue;
                    }
                    if (!isUserSensitive(packageName, user, op)
                            && !isLocationProvider(packageName, user)) {

                    if (packageName.equals(SYSTEM_PKG)
                            || (!isUserSensitive(packageName, user, op)
                            && !isLocationProvider(packageName, user)
                            && !isAppPredictor(packageName, user))) {
                        continue;
                    }