Merge "Show mic/cam enable dialog for IME" into sc-dev am: 1ebeff8939

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

Change-Id: Ia0a3671ebbdce61c87b79649f1ac396f9e8cc95e
This commit is contained in:
TreeHugger Robot
2021-06-29 00:09:25 +00:00
committed by Automerger Merge Worker
3 changed files with 49 additions and 4 deletions

View File

@@ -19,6 +19,7 @@ package android.app;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
import android.app.ActivityManager.ProcessCapability;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.IIntentReceiver; import android.content.IIntentReceiver;
import android.content.IIntentSender; import android.content.IIntentSender;
@@ -634,4 +635,9 @@ public abstract class ActivityManagerInternal {
* Return the temp allowlist type when server push messaging is over the quota. * Return the temp allowlist type when server push messaging is over the quota.
*/ */
public abstract @TempAllowListType int getPushMessagingOverQuotaBehavior(); public abstract @TempAllowListType int getPushMessagingOverQuotaBehavior();
/**
* Returns the capability of the given uid
*/
public abstract @ProcessCapability int getUidCapability(int uid);
} }

View File

@@ -17,6 +17,8 @@
package com.android.server; package com.android.server;
import static android.Manifest.permission.MANAGE_SENSOR_PRIVACY; import static android.Manifest.permission.MANAGE_SENSOR_PRIVACY;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
import static android.app.ActivityManager.RunningServiceInfo; import static android.app.ActivityManager.RunningServiceInfo;
import static android.app.ActivityManager.RunningTaskInfo; import static android.app.ActivityManager.RunningTaskInfo;
import static android.app.ActivityManager.getCurrentUser; import static android.app.ActivityManager.getCurrentUser;
@@ -41,6 +43,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.ActivityOptions; import android.app.ActivityOptions;
import android.app.ActivityTaskManager; import android.app.ActivityTaskManager;
import android.app.AppOpsManager; import android.app.AppOpsManager;
@@ -83,6 +86,7 @@ import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber;
import android.text.Html; import android.text.Html;
import android.text.TextUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.AtomicFile; import android.util.AtomicFile;
@@ -156,6 +160,7 @@ public final class SensorPrivacyService extends SystemService {
private final SensorPrivacyServiceImpl mSensorPrivacyServiceImpl; private final SensorPrivacyServiceImpl mSensorPrivacyServiceImpl;
private final UserManagerInternal mUserManagerInternal; private final UserManagerInternal mUserManagerInternal;
private final ActivityManager mActivityManager; private final ActivityManager mActivityManager;
private final ActivityManagerInternal mActivityManagerInternal;
private final ActivityTaskManager mActivityTaskManager; private final ActivityTaskManager mActivityTaskManager;
private final AppOpsManager mAppOpsManager; private final AppOpsManager mAppOpsManager;
private final TelephonyManager mTelephonyManager; private final TelephonyManager mTelephonyManager;
@@ -173,6 +178,7 @@ public final class SensorPrivacyService extends SystemService {
mAppOpsManager = context.getSystemService(AppOpsManager.class); mAppOpsManager = context.getSystemService(AppOpsManager.class);
mUserManagerInternal = getLocalService(UserManagerInternal.class); mUserManagerInternal = getLocalService(UserManagerInternal.class);
mActivityManager = context.getSystemService(ActivityManager.class); mActivityManager = context.getSystemService(ActivityManager.class);
mActivityManagerInternal = getLocalService(ActivityManagerInternal.class);
mActivityTaskManager = context.getSystemService(ActivityTaskManager.class); mActivityTaskManager = context.getSystemService(ActivityTaskManager.class);
mTelephonyManager = context.getSystemService(TelephonyManager.class); mTelephonyManager = context.getSystemService(TelephonyManager.class);
@@ -421,15 +427,37 @@ public final class SensorPrivacyService extends SystemService {
} }
} }
String inputMethodComponent = Settings.Secure.getString(mContext.getContentResolver(),
Settings.Secure.DEFAULT_INPUT_METHOD);
String inputMethodPackageName = null;
if (inputMethodComponent != null) {
inputMethodPackageName = ComponentName.unflattenFromString(
inputMethodComponent).getPackageName();
}
int capability = mActivityManagerInternal.getUidCapability(uid);
if (sensor == MICROPHONE) {
VoiceInteractionManagerInternal voiceInteractionManagerInternal = VoiceInteractionManagerInternal voiceInteractionManagerInternal =
LocalServices.getService(VoiceInteractionManagerInternal.class); LocalServices.getService(VoiceInteractionManagerInternal.class);
if (voiceInteractionManagerInternal != null
if (sensor == MICROPHONE && voiceInteractionManagerInternal != null
&& voiceInteractionManagerInternal.hasActiveSession(packageName)) { && voiceInteractionManagerInternal.hasActiveSession(packageName)) {
enqueueSensorUseReminderDialogAsync(-1, user, packageName, sensor); enqueueSensorUseReminderDialogAsync(-1, user, packageName, sensor);
return; return;
} }
if (TextUtils.equals(packageName, inputMethodPackageName)
&& (capability & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0) {
enqueueSensorUseReminderDialogAsync(-1, user, packageName, sensor);
return;
}
}
if (sensor == CAMERA && TextUtils.equals(packageName, inputMethodPackageName)
&& (capability & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0) {
enqueueSensorUseReminderDialogAsync(-1, user, packageName, sensor);
return;
}
Log.i(TAG, packageName + "/" + uid + " started using sensor " + sensor Log.i(TAG, packageName + "/" + uid + " started using sensor " + sensor
+ " but no activity or foreground service was running. The user will not be" + " but no activity or foreground service was running. The user will not be"
+ " informed. System components should check if sensor privacy is enabled for" + " informed. System components should check if sensor privacy is enabled for"

View File

@@ -16333,6 +16333,17 @@ public class ActivityManagerService extends IActivityManager.Stub
return mConstants.mPushMessagingOverQuotaBehavior; return mConstants.mPushMessagingOverQuotaBehavior;
} }
} }
@Override
public int getUidCapability(int uid) {
synchronized (ActivityManagerService.this) {
UidRecord uidRecord = mProcessList.getUidRecordLOSP(uid);
if (uidRecord == null) {
throw new IllegalArgumentException("uid record for " + uid + " not found");
}
return uidRecord.getCurCapability();
}
}
} }
long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) { long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) {