Merge "Allow only HotwordDetectionService to note OP_RECORD_AUDIO_HOTWORD" into sc-dev
This commit is contained in:
@@ -80,6 +80,12 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final VoiceInteractionManagerInternal mVoiceInteractionManagerInternal;
|
private final VoiceInteractionManagerInternal mVoiceInteractionManagerInternal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether this device allows only the HotwordDetectionService to use OP_RECORD_AUDIO_HOTWORD
|
||||||
|
* which doesn't incur the privacy indicator.
|
||||||
|
*/
|
||||||
|
private final boolean mIsHotwordDetectionServiceRequired;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The locking policy around the location tags is a bit special. Since we want to
|
* The locking policy around the location tags is a bit special. Since we want to
|
||||||
* avoid grabbing the lock on every op note we are taking the approach where the
|
* avoid grabbing the lock on every op note we are taking the approach where the
|
||||||
@@ -114,6 +120,8 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat
|
|||||||
mRoleManager = mContext.getSystemService(RoleManager.class);
|
mRoleManager = mContext.getSystemService(RoleManager.class);
|
||||||
mVoiceInteractionManagerInternal = LocalServices.getService(
|
mVoiceInteractionManagerInternal = LocalServices.getService(
|
||||||
VoiceInteractionManagerInternal.class);
|
VoiceInteractionManagerInternal.class);
|
||||||
|
mIsHotwordDetectionServiceRequired = isHotwordDetectionServiceRequired(
|
||||||
|
mContext.getPackageManager());
|
||||||
|
|
||||||
final LocationManagerInternal locationManagerInternal = LocalServices.getService(
|
final LocationManagerInternal locationManagerInternal = LocalServices.getService(
|
||||||
LocationManagerInternal.class);
|
LocationManagerInternal.class);
|
||||||
@@ -174,6 +182,12 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat
|
|||||||
initializeActivityRecognizersTags();
|
initializeActivityRecognizersTags();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isHotwordDetectionServiceRequired(PackageManager pm) {
|
||||||
|
// The HotwordDetectionService APIs aren't ready yet for Auto or TV.
|
||||||
|
return !(pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
|
||||||
|
|| pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int checkOperation(int code, int uid, String packageName,
|
public int checkOperation(int code, int uid, String packageName,
|
||||||
@Nullable String attributionTag, boolean raw,
|
@Nullable String attributionTag, boolean raw,
|
||||||
@@ -257,6 +271,7 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat
|
|||||||
|
|
||||||
private int resolveDatasourceOp(int code, int uid, @NonNull String packageName,
|
private int resolveDatasourceOp(int code, int uid, @NonNull String packageName,
|
||||||
@Nullable String attributionTag) {
|
@Nullable String attributionTag) {
|
||||||
|
code = resolveRecordAudioOp(code, uid);
|
||||||
if (attributionTag == null) {
|
if (attributionTag == null) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
@@ -359,6 +374,24 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat
|
|||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int resolveRecordAudioOp(int code, int uid) {
|
||||||
|
if (code == AppOpsManager.OP_RECORD_AUDIO_HOTWORD) {
|
||||||
|
if (!mIsHotwordDetectionServiceRequired) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
// Only the HotwordDetectionService can use the HOTWORD op which doesn't incur the
|
||||||
|
// privacy indicator. Downgrade to standard RECORD_AUDIO for other processes.
|
||||||
|
final HotwordDetectionServiceIdentity hotwordDetectionServiceIdentity =
|
||||||
|
mVoiceInteractionManagerInternal.getHotwordDetectionServiceIdentity();
|
||||||
|
if (hotwordDetectionServiceIdentity != null
|
||||||
|
&& uid == hotwordDetectionServiceIdentity.getIsolatedUid()) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
return AppOpsManager.OP_RECORD_AUDIO;
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
private int resolveUid(int code, int uid) {
|
private int resolveUid(int code, int uid) {
|
||||||
// The HotwordDetectionService is an isolated service, which ordinarily cannot hold
|
// The HotwordDetectionService is an isolated service, which ordinarily cannot hold
|
||||||
// permissions. So we allow it to assume the owning package identity for certain
|
// permissions. So we allow it to assume the owning package identity for certain
|
||||||
|
|||||||
Reference in New Issue
Block a user