Merge "Add wifi call special case, fix phone, predictor, filter system" into sc-dev
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user