Add testing shims to allow switching of app ops/permission backend

Add a shim layer in between the AppOpsService/PermissionManagerService
and their respective implementations. In these shims, include both the
old and new implementations. Select which implementation to use based on
deviceConfig. Also support running both, and comparing the outputs.

Bug: 252886104
Test: manual
Change-Id: Ibe420a1985b041816cb2d6e675761cffa6462f24
This commit is contained in:
Nate Myren
2023-03-23 14:43:15 -07:00
committed by Evan Severson
parent f5965c0134
commit fc2ed91d5d
3 changed files with 931 additions and 0 deletions

View File

@@ -0,0 +1,291 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.appop;
import android.util.ArraySet;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import java.io.PrintWriter;
import java.util.Objects;
/**
* A testing shim, which supports running two variants of an AppOpsServiceInterface at once,
* and checking the results of both.
*/
public class AppOpsServiceTestingShim implements AppOpsCheckingServiceInterface {
private AppOpsCheckingServiceInterface mOldImplementation;
private AppOpsCheckingServiceInterface mNewImplementation;
public AppOpsServiceTestingShim(AppOpsCheckingServiceInterface oldValImpl,
AppOpsCheckingServiceInterface newImpl) {
mOldImplementation = oldValImpl;
mNewImplementation = newImpl;
}
private void signalImplDifference(String message) {
//TODO b/252886104 implement
}
@Override
public void writeState() {
mOldImplementation.writeState();
mNewImplementation.writeState();
}
@Override
public void readState() {
mOldImplementation.readState();
mNewImplementation.readState();
}
@Override
public void shutdown() {
mOldImplementation.shutdown();
mNewImplementation.shutdown();
}
@Override
public void systemReady() {
mOldImplementation.systemReady();
mNewImplementation.systemReady();
}
@Override
public SparseIntArray getNonDefaultUidModes(int uid) {
SparseIntArray oldVal = mOldImplementation.getNonDefaultUidModes(uid);
SparseIntArray newVal = mNewImplementation.getNonDefaultUidModes(uid);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getNonDefaultUidModes");
}
return newVal;
}
@Override
public SparseIntArray getNonDefaultPackageModes(String packageName, int userId) {
SparseIntArray oldVal = mOldImplementation.getNonDefaultPackageModes(packageName, userId);
SparseIntArray newVal = mNewImplementation.getNonDefaultPackageModes(packageName, userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getNonDefaultPackageModes");
}
return newVal;
}
@Override
public int getUidMode(int uid, int op) {
int oldVal = mOldImplementation.getUidMode(uid, op);
int newVal = mNewImplementation.getUidMode(uid, op);
if (oldVal != newVal) {
signalImplDifference("getUidMode");
}
return newVal;
}
@Override
public boolean setUidMode(int uid, int op, int mode) {
boolean oldVal = mOldImplementation.setUidMode(uid, op, mode);
boolean newVal = mNewImplementation.setUidMode(uid, op, mode);
if (oldVal != newVal) {
signalImplDifference("setUidMode");
}
return newVal;
}
@Override
public int getPackageMode(String packageName, int op, int userId) {
int oldVal = mOldImplementation.getPackageMode(packageName, op, userId);
int newVal = mNewImplementation.getPackageMode(packageName, op, userId);
if (oldVal != newVal) {
signalImplDifference("getPackageMode");
}
return newVal;
}
@Override
public void setPackageMode(String packageName, int op, int mode, int userId) {
mOldImplementation.setPackageMode(packageName, op, mode, userId);
mNewImplementation.setPackageMode(packageName, op, mode, userId);
}
@Override
public boolean removePackage(String packageName, int userId) {
boolean oldVal = mOldImplementation.removePackage(packageName, userId);
boolean newVal = mNewImplementation.removePackage(packageName, userId);
if (oldVal != newVal) {
signalImplDifference("removePackage");
}
return newVal;
}
@Override
public void removeUid(int uid) {
mOldImplementation.removeUid(uid);
mNewImplementation.removeUid(uid);
}
@Override
public boolean areUidModesDefault(int uid) {
boolean oldVal = mOldImplementation.areUidModesDefault(uid);
boolean newVal = mNewImplementation.areUidModesDefault(uid);
if (oldVal != newVal) {
signalImplDifference("areUidModesDefault");
}
return newVal;
}
@Override
public boolean arePackageModesDefault(String packageName, int userId) {
boolean oldVal = mOldImplementation.arePackageModesDefault(packageName, userId);
boolean newVal = mNewImplementation.arePackageModesDefault(packageName, userId);
if (oldVal != newVal) {
signalImplDifference("arePackageModesDefault");
}
return newVal;
}
@Override
public void clearAllModes() {
mOldImplementation.clearAllModes();
mNewImplementation.clearAllModes();
}
@Override
public void startWatchingOpModeChanged(OnOpModeChangedListener changedListener, int op) {
mOldImplementation.startWatchingOpModeChanged(changedListener, op);
mNewImplementation.startWatchingOpModeChanged(changedListener, op);
}
@Override
public void startWatchingPackageModeChanged(OnOpModeChangedListener changedListener,
String packageName) {
mOldImplementation.startWatchingPackageModeChanged(changedListener, packageName);
mNewImplementation.startWatchingPackageModeChanged(changedListener, packageName);
}
@Override
public void removeListener(OnOpModeChangedListener changedListener) {
mOldImplementation.removeListener(changedListener);
mNewImplementation.removeListener(changedListener);
}
@Override
public ArraySet<OnOpModeChangedListener> getOpModeChangedListeners(int op) {
ArraySet<OnOpModeChangedListener> oldVal = mOldImplementation.getOpModeChangedListeners(op);
ArraySet<OnOpModeChangedListener> newVal = mNewImplementation.getOpModeChangedListeners(op);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getOpModeChangedListeners");
}
return newVal;
}
@Override
public ArraySet<OnOpModeChangedListener> getPackageModeChangedListeners(String packageName) {
ArraySet<OnOpModeChangedListener> oldVal = mOldImplementation
.getPackageModeChangedListeners(packageName);
ArraySet<OnOpModeChangedListener> newVal = mNewImplementation
.getPackageModeChangedListeners(packageName);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getPackageModeChangedListeners");
}
return newVal;
}
@Override
public void notifyWatchersOfChange(int op, int uid) {
mOldImplementation.notifyWatchersOfChange(op, uid);
mNewImplementation.notifyWatchersOfChange(op, uid);
}
@Override
public void notifyOpChanged(OnOpModeChangedListener changedListener, int op, int uid,
String packageName) {
mOldImplementation.notifyOpChanged(changedListener, op, uid, packageName);
mNewImplementation.notifyOpChanged(changedListener, op, uid, packageName);
}
@Override
public void notifyOpChangedForAllPkgsInUid(int op, int uid, boolean onlyForeground,
OnOpModeChangedListener callbackToIgnore) {
mOldImplementation
.notifyOpChangedForAllPkgsInUid(op, uid, onlyForeground, callbackToIgnore);
mNewImplementation
.notifyOpChangedForAllPkgsInUid(op, uid, onlyForeground, callbackToIgnore);
}
@Override
public SparseBooleanArray evalForegroundUidOps(int uid, SparseBooleanArray foregroundOps) {
SparseBooleanArray oldVal = mOldImplementation.evalForegroundUidOps(uid, foregroundOps);
SparseBooleanArray newVal = mNewImplementation.evalForegroundUidOps(uid, foregroundOps);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("evalForegroundUidOps");
}
return newVal;
}
@Override
public SparseBooleanArray evalForegroundPackageOps(String packageName,
SparseBooleanArray foregroundOps, int userId) {
SparseBooleanArray oldVal = mOldImplementation
.evalForegroundPackageOps(packageName, foregroundOps, userId);
SparseBooleanArray newVal = mNewImplementation
.evalForegroundPackageOps(packageName, foregroundOps, userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("evalForegroundPackageOps");
}
return newVal;
}
@Override
public boolean dumpListeners(int dumpOp, int dumpUid, String dumpPackage,
PrintWriter printWriter) {
boolean oldVal = mOldImplementation
.dumpListeners(dumpOp, dumpUid, dumpPackage, printWriter);
boolean newVal = mNewImplementation
.dumpListeners(dumpOp, dumpUid, dumpPackage, printWriter);
if (oldVal != newVal) {
signalImplDifference("dumpListeners");
}
return newVal;
}
}

View File

@@ -0,0 +1,75 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.pm.permission;
import static android.provider.DeviceConfig.NAMESPACE_PRIVACY;
import android.content.Context;
import android.provider.DeviceConfig;
import com.android.server.appop.AppOpsCheckingServiceInterface;
import com.android.server.appop.AppOpsServiceTestingShim;
import java.util.function.Supplier;
/**
* A factory which will select one or both implementations of a PermissionManagerServiceInterface or
* AppOpsCheckingServiceInterface, based upon either a DeviceConfig value, or a hard coded config.
*/
public class AccessTestingShimFactory {
private static final int RUN_OLD_SUBSYSTEM = 0;
private static final int RUN_NEW_SUBSYSTEM = 1;
private static final int RUN_BOTH_SUBSYSTEMS = 2;
public static final String DEVICE_CONFIG_SETTING = "selected_access_subsystem";
/**
* Get the PermissionManagerServiceInterface, based upon the current config state.
*/
public static PermissionManagerServiceInterface getPms(Context context,
Supplier<PermissionManagerServiceInterface> oldImpl,
Supplier<PermissionManagerServiceInterface> newImpl) {
int selectedSystem = DeviceConfig.getInt(NAMESPACE_PRIVACY,
DEVICE_CONFIG_SETTING, RUN_OLD_SUBSYSTEM);
switch (selectedSystem) {
case RUN_BOTH_SUBSYSTEMS:
return new PermissionManagerServiceTestingShim(oldImpl.get(), newImpl.get());
case RUN_NEW_SUBSYSTEM:
return newImpl.get();
default:
return oldImpl.get();
}
}
/**
* Get the AppOpsCheckingServiceInterface, based upon the current config state.
*/
public static AppOpsCheckingServiceInterface getAos(Context context,
Supplier<AppOpsCheckingServiceInterface> oldImpl,
Supplier<AppOpsCheckingServiceInterface> newImpl) {
int selectedSystem = DeviceConfig.getInt(NAMESPACE_PRIVACY,
DEVICE_CONFIG_SETTING, RUN_OLD_SUBSYSTEM);
switch (selectedSystem) {
case RUN_BOTH_SUBSYSTEMS:
return new AppOpsServiceTestingShim(oldImpl.get(), newImpl.get());
case RUN_NEW_SUBSYSTEM:
return newImpl.get();
default:
return oldImpl.get();
}
}
}

View File

@@ -0,0 +1,565 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.pm.permission;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.content.pm.permission.SplitPermissionInfoParcelable;
import android.permission.IOnPermissionsChangeListener;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
/**
* A testing shim, which supports running two variants of a PermissionManagerServiceInterface at
* once, and checking the results of both.
*/
public class PermissionManagerServiceTestingShim implements PermissionManagerServiceInterface {
private PermissionManagerServiceInterface mOldImplementation;
private PermissionManagerServiceInterface mNewImplementation;
public PermissionManagerServiceTestingShim(PermissionManagerServiceInterface oldImpl,
PermissionManagerServiceInterface newImpl) {
mOldImplementation = oldImpl;
mNewImplementation = newImpl;
}
private void signalImplDifference(String message) {
//TODO b/252886104 implement
}
@Nullable
@Override
public byte[] backupRuntimePermissions(int userId) {
byte[] oldVal = mOldImplementation.backupRuntimePermissions(userId);
byte[] newVal = mNewImplementation.backupRuntimePermissions(userId);
if (!Arrays.equals(oldVal, newVal)) {
signalImplDifference("backupRuntimePermissions");
}
return newVal;
}
@Override
public void restoreRuntimePermissions(@NonNull byte[] backup, int userId) {
mOldImplementation.backupRuntimePermissions(userId);
mNewImplementation.backupRuntimePermissions(userId);
}
@Override
public void restoreDelayedRuntimePermissions(@NonNull String packageName, int userId) {
mOldImplementation.restoreDelayedRuntimePermissions(packageName, userId);
mNewImplementation.restoreDelayedRuntimePermissions(packageName, userId);
}
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
mOldImplementation.dump(fd, pw, args);
mNewImplementation.dump(fd, pw, args);
}
@Override
public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
List<PermissionGroupInfo> oldVal = mOldImplementation.getAllPermissionGroups(flags);
List<PermissionGroupInfo> newVal = mNewImplementation.getAllPermissionGroups(flags);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getAllPermissionGroups");
}
return newVal;
}
@Override
public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) {
PermissionGroupInfo oldVal = mOldImplementation.getPermissionGroupInfo(groupName, flags);
PermissionGroupInfo newVal = mNewImplementation.getPermissionGroupInfo(groupName, flags);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getPermissionGroupInfo");
}
return newVal;
}
@Override
public PermissionInfo getPermissionInfo(@NonNull String permName, int flags,
@NonNull String opPackageName) {
PermissionInfo oldVal = mOldImplementation.getPermissionInfo(permName, flags,
opPackageName);
PermissionInfo newVal = mNewImplementation.getPermissionInfo(permName, flags,
opPackageName);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getPermissionInfo");
}
return newVal;
}
@Override
public List<PermissionInfo> queryPermissionsByGroup(String groupName, int flags) {
List<PermissionInfo> oldVal = mOldImplementation.queryPermissionsByGroup(groupName,
flags);
List<PermissionInfo> newVal = mNewImplementation.queryPermissionsByGroup(groupName, flags);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("queryPermissionsByGroup");
}
return newVal;
}
@Override
public boolean addPermission(PermissionInfo info, boolean async) {
boolean oldVal = mOldImplementation.addPermission(info, async);
boolean newVal = mNewImplementation.addPermission(info, async);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("addPermission");
}
return newVal;
}
@Override
public void removePermission(String permName) {
mOldImplementation.removePermission(permName);
mNewImplementation.removePermission(permName);
}
@Override
public int getPermissionFlags(String packageName, String permName, int userId) {
int oldVal = mOldImplementation.getPermissionFlags(packageName, permName, userId);
int newVal = mNewImplementation.getPermissionFlags(packageName, permName, userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getPermissionFlags");
}
return newVal;
}
@Override
public void updatePermissionFlags(String packageName, String permName, int flagMask,
int flagValues, boolean checkAdjustPolicyFlagPermission, int userId) {
mOldImplementation.updatePermissionFlags(packageName, permName, flagMask, flagValues,
checkAdjustPolicyFlagPermission, userId);
mNewImplementation.updatePermissionFlags(packageName, permName, flagMask, flagValues,
checkAdjustPolicyFlagPermission, userId);
}
@Override
public void updatePermissionFlagsForAllApps(int flagMask, int flagValues, int userId) {
mOldImplementation.updatePermissionFlagsForAllApps(flagMask, flagValues, userId);
mNewImplementation.updatePermissionFlagsForAllApps(flagMask, flagValues, userId);
}
@Override
public void addOnPermissionsChangeListener(IOnPermissionsChangeListener listener) {
mOldImplementation.addOnPermissionsChangeListener(listener);
mNewImplementation.addOnPermissionsChangeListener(listener);
}
@Override
public void removeOnPermissionsChangeListener(IOnPermissionsChangeListener listener) {
mOldImplementation.removeOnPermissionsChangeListener(listener);
mNewImplementation.removeOnPermissionsChangeListener(listener);
}
@Override
public boolean addAllowlistedRestrictedPermission(@NonNull String packageName,
@NonNull String permName, int flags, int userId) {
boolean oldVal = mOldImplementation.addAllowlistedRestrictedPermission(packageName,
permName,
flags, userId);
boolean newVal = mNewImplementation.addAllowlistedRestrictedPermission(packageName,
permName, flags, userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("addAllowlistedRestrictedPermission");
}
return newVal;
}
@Override
public List<String> getAllowlistedRestrictedPermissions(@NonNull String packageName, int flags,
int userId) {
List<String> oldVal = mOldImplementation.getAllowlistedRestrictedPermissions(packageName,
flags, userId);
List<String> newVal = mNewImplementation.getAllowlistedRestrictedPermissions(packageName,
flags, userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getAllowlistedRestrictedPermissions");
}
return newVal;
}
@Override
public boolean removeAllowlistedRestrictedPermission(@NonNull String packageName,
@NonNull String permName, int flags, int userId) {
boolean oldVal = mOldImplementation.removeAllowlistedRestrictedPermission(packageName,
permName, flags, userId);
boolean newVal = mNewImplementation.removeAllowlistedRestrictedPermission(packageName,
permName, flags, userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("removeAllowlistedRestrictedPermission");
}
return newVal;
}
@Override
public void grantRuntimePermission(String packageName, String permName, int userId) {
mOldImplementation.grantRuntimePermission(packageName, permName, userId);
mNewImplementation.grantRuntimePermission(packageName, permName, userId);
}
@Override
public void revokeRuntimePermission(String packageName, String permName, int userId,
String reason) {
mOldImplementation.grantRuntimePermission(packageName, permName, userId);
mNewImplementation.grantRuntimePermission(packageName, permName, userId);
}
@Override
public void revokePostNotificationPermissionWithoutKillForTest(String packageName, int userId) {
mOldImplementation.revokePostNotificationPermissionWithoutKillForTest(packageName,
userId);
mNewImplementation.revokePostNotificationPermissionWithoutKillForTest(packageName, userId);
}
@Override
public boolean shouldShowRequestPermissionRationale(String packageName, String permName,
int userId) {
boolean oldVal = mOldImplementation
.shouldShowRequestPermissionRationale(packageName, permName, userId);
boolean newVal = mNewImplementation
.shouldShowRequestPermissionRationale(packageName, permName, userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("shouldShowRequestPermissionRationale");
}
return newVal;
}
@Override
public boolean isPermissionRevokedByPolicy(String packageName, String permName, int userId) {
boolean oldVal = mOldImplementation
.isPermissionRevokedByPolicy(packageName, permName, userId);
boolean newVal = mNewImplementation.isPermissionRevokedByPolicy(packageName, permName,
userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("isPermissionRevokedByPolicy");
}
return newVal;
}
@Override
public List<SplitPermissionInfoParcelable> getSplitPermissions() {
List<SplitPermissionInfoParcelable> oldVal = mOldImplementation.getSplitPermissions();
List<SplitPermissionInfoParcelable> newVal = mNewImplementation.getSplitPermissions();
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getSplitPermissions");
}
return newVal;
}
@Override
public int checkPermission(String pkgName, String permName, int userId) {
int oldVal = mOldImplementation.checkPermission(pkgName, permName, userId);
int newVal = mNewImplementation.checkPermission(pkgName, permName, userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("checkPermission");
}
return newVal;
}
@Override
public int checkUidPermission(int uid, String permName) {
int oldVal = mOldImplementation.checkUidPermission(uid, permName);
int newVal = mNewImplementation.checkUidPermission(uid, permName);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("checkUidPermission");
}
return newVal;
}
@Override
public void addOnRuntimePermissionStateChangedListener(@NonNull
PermissionManagerServiceInternal.OnRuntimePermissionStateChangedListener listener) {
mOldImplementation.addOnRuntimePermissionStateChangedListener(listener);
mNewImplementation.addOnRuntimePermissionStateChangedListener(listener);
}
@Override
public void removeOnRuntimePermissionStateChangedListener(@NonNull
PermissionManagerServiceInternal.OnRuntimePermissionStateChangedListener listener) {
mOldImplementation.removeOnRuntimePermissionStateChangedListener(listener);
mNewImplementation.removeOnRuntimePermissionStateChangedListener(listener);
}
@Override
public Map<String, Set<String>> getAllAppOpPermissionPackages() {
Map<String, Set<String>> oldVal = mOldImplementation.getAllAppOpPermissionPackages();
Map<String, Set<String>> newVal = mNewImplementation.getAllAppOpPermissionPackages();
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getAllAppOpPermissionPackages");
}
return newVal;
}
@Override
public boolean isPermissionsReviewRequired(@NonNull String packageName, int userId) {
boolean oldVal = mOldImplementation.isPermissionsReviewRequired(packageName, userId);
boolean newVal = mNewImplementation.isPermissionsReviewRequired(packageName, userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("isPermissionsReviewRequired");
}
return newVal;
}
@Override
public void resetRuntimePermissions(@NonNull AndroidPackage pkg, @UserIdInt int userId) {
mOldImplementation.resetRuntimePermissions(pkg, userId);
mNewImplementation.resetRuntimePermissions(pkg, userId);
}
@Override
public void resetRuntimePermissionsForUser(int userId) {
mOldImplementation.resetRuntimePermissionsForUser(userId);
mNewImplementation.resetRuntimePermissionsForUser(userId);
}
@Override
public void readLegacyPermissionStateTEMP() {
mOldImplementation.readLegacyPermissionStateTEMP();
mNewImplementation.readLegacyPermissionStateTEMP();
}
@Override
public void writeLegacyPermissionStateTEMP() {
mOldImplementation.writeLegacyPermissionStateTEMP();
mNewImplementation.writeLegacyPermissionStateTEMP();
}
@Override
public Set<String> getInstalledPermissions(String packageName) {
Set<String> oldVal = mOldImplementation.getInstalledPermissions(packageName);
Set<String> newVal = mNewImplementation.getInstalledPermissions(packageName);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getInstalledPermissions");
}
return newVal;
}
@NonNull
@Override
public Set<String> getGrantedPermissions(@NonNull String packageName, int userId) {
Set<String> oldVal = mOldImplementation.getGrantedPermissions(packageName, userId);
Set<String> newVal = mNewImplementation.getGrantedPermissions(packageName, userId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getGrantedPermissions");
}
return newVal;
}
@NonNull
@Override
public int[] getPermissionGids(@NonNull String permissionName, int userId) {
int[] oldVal = mOldImplementation.getPermissionGids(permissionName, userId);
int[] newVal = mNewImplementation.getPermissionGids(permissionName, userId);
if (!Arrays.equals(oldVal, newVal)) {
signalImplDifference("getPermissionGids");
}
return newVal;
}
@NonNull
@Override
public String[] getAppOpPermissionPackages(@NonNull String permissionName) {
String[] oldVal = mOldImplementation.getAppOpPermissionPackages(permissionName);
String[] newVal = mNewImplementation.getAppOpPermissionPackages(permissionName);
if (!Arrays.equals(oldVal, newVal)) {
signalImplDifference("getAppOpPermissionPackages");
}
return newVal;
}
@Nullable
@Override
public Permission getPermissionTEMP(@NonNull String permName) {
Permission oldVal = mOldImplementation.getPermissionTEMP(permName);
Permission newVal = mNewImplementation.getPermissionTEMP(permName);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getPermissionTEMP");
}
return newVal;
}
@NonNull
@Override
public List<PermissionInfo> getAllPermissionsWithProtection(int protection) {
List<PermissionInfo> oldVal = mOldImplementation.getAllPermissionsWithProtection(
protection);
List<PermissionInfo> newVal = mNewImplementation.getAllPermissionsWithProtection(
protection);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getAllPermissionsWithProtection");
}
return newVal;
}
@NonNull
@Override
public List<PermissionInfo> getAllPermissionsWithProtectionFlags(int protectionFlags) {
List<PermissionInfo> oldVal = mOldImplementation
.getAllPermissionsWithProtectionFlags(protectionFlags);
List<PermissionInfo> newVal = mNewImplementation.getAllPermissionsWithProtectionFlags(
protectionFlags);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getAllPermissionsWithProtectionFlags");
}
return newVal;
}
@NonNull
@Override
public List<LegacyPermission> getLegacyPermissions() {
List<LegacyPermission> oldVal = mOldImplementation.getLegacyPermissions();
List<LegacyPermission> newVal = mNewImplementation.getLegacyPermissions();
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getLegacyPermissions");
}
return newVal;
}
@NonNull
@Override
public LegacyPermissionState getLegacyPermissionState(int appId) {
LegacyPermissionState oldVal = mOldImplementation.getLegacyPermissionState(appId);
LegacyPermissionState newVal = mNewImplementation.getLegacyPermissionState(appId);
if (!Objects.equals(oldVal, newVal)) {
signalImplDifference("getLegacyPermissionState");
}
return newVal;
}
@Override
public void readLegacyPermissionsTEMP(
@NonNull LegacyPermissionSettings legacyPermissionSettings) {
mOldImplementation.readLegacyPermissionsTEMP(legacyPermissionSettings);
mNewImplementation.readLegacyPermissionsTEMP(legacyPermissionSettings);
}
@Override
public void writeLegacyPermissionsTEMP(
@NonNull LegacyPermissionSettings legacyPermissionSettings) {
mOldImplementation.writeLegacyPermissionsTEMP(legacyPermissionSettings);
mNewImplementation.writeLegacyPermissionsTEMP(legacyPermissionSettings);
}
@Override
public void onSystemReady() {
mOldImplementation.onSystemReady();
mNewImplementation.onSystemReady();
}
@Override
public void onStorageVolumeMounted(@NonNull String volumeUuid, boolean fingerprintChanged) {
mOldImplementation.onStorageVolumeMounted(volumeUuid, fingerprintChanged);
mNewImplementation.onStorageVolumeMounted(volumeUuid, fingerprintChanged);
}
@NonNull
@Override
public int[] getGidsForUid(int uid) {
int[] oldVal = mOldImplementation.getGidsForUid(uid);
int[] newVal = mNewImplementation.getGidsForUid(uid);
if (!Arrays.equals(oldVal, newVal)) {
signalImplDifference("getGidsForUid");
}
return newVal;
}
@Override
public void onUserCreated(int userId) {
mOldImplementation.onUserCreated(userId);
mNewImplementation.onUserCreated(userId);
}
@Override
public void onUserRemoved(int userId) {
mOldImplementation.onUserRemoved(userId);
mNewImplementation.onUserRemoved(userId);
}
@Override
public void onPackageAdded(@NonNull PackageState pkg, boolean isInstantApp,
@Nullable AndroidPackage oldPkg) {
mOldImplementation.onPackageAdded(pkg, isInstantApp, oldPkg);
mNewImplementation.onPackageAdded(pkg, isInstantApp, oldPkg);
}
@Override
public void onPackageInstalled(@NonNull AndroidPackage pkg, int previousAppId,
@NonNull PermissionManagerServiceInternal.PackageInstalledParams params, int userId) {
mOldImplementation.onPackageInstalled(pkg, previousAppId, params, userId);
mNewImplementation.onPackageInstalled(pkg, previousAppId, params, userId);
}
@Override
public void onPackageRemoved(@NonNull AndroidPackage pkg) {
mOldImplementation.onPackageRemoved(pkg);
mNewImplementation.onPackageRemoved(pkg);
}
@Override
public void onPackageUninstalled(@NonNull String packageName, int appId,
@NonNull PackageState packageState, @Nullable AndroidPackage pkg,
@NonNull List<AndroidPackage> sharedUserPkgs, int userId) {
mOldImplementation.onPackageUninstalled(packageName, appId, packageState, pkg,
sharedUserPkgs, userId);
mNewImplementation.onPackageUninstalled(packageName, appId, packageState, pkg,
sharedUserPkgs, userId);
}
}