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:
committed by
Evan Severson
parent
f5965c0134
commit
fc2ed91d5d
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user