From 031a2f1aafbc4e39ab5601567862d498e8949538 Mon Sep 17 00:00:00 2001 From: Lenka Trochtova Date: Mon, 16 Oct 2017 18:41:39 +0200 Subject: [PATCH] Make DevicePolicyManagerService more customizable (per-device). Add a config to override the DPMS implementation class to be instantiated from the Lifecycle. Add a hasFeature method to the Injector class. BUG: 63753860 Test: manual with TestDPC Change-Id: I71ef518c49b2233744defdfb7c31019cb228d678 --- core/res/res/values/config.xml | 4 ++ core/res/res/values/symbols.xml | 1 + .../devicepolicy/BaseIDevicePolicyManager.java | 57 ++++++++++++++++++++++ .../devicepolicy/DevicePolicyManagerService.java | 32 ++++++++++-- 4 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 171f74f9ead8..5f756fabdb78 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3169,6 +3169,10 @@ classes are instantiated in the order of the array. --> + + + com.android.systemui/com.android.systemui.media.MediaProjectionPermissionActivity diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a1158162ee73..ad947b7caad3 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -459,6 +459,7 @@ + diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java new file mode 100644 index 000000000000..dddff8f3ea06 --- /dev/null +++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2017 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.devicepolicy; + +import android.app.admin.IDevicePolicyManager; + +import com.android.internal.R; +import com.android.server.SystemService; + +/** + * Defines the required interface for IDevicePolicyManager implemenation. + * + *

The interface consists of public parts determined by {@link IDevicePolicyManager} and also + * several package private methods required by internal infrastructure. + * + *

Whenever adding an AIDL method to {@link IDevicePolicyManager}, an empty override method + * should be added here to avoid build breakage in downstream branches. + */ +abstract class BaseIDevicePolicyManager extends IDevicePolicyManager.Stub { + /** + * To be called by {@link DevicePolicyManagerService#Lifecycle} during the various boot phases. + * + * @see {@link SystemService#onBootPhase}. + */ + abstract void systemReady(int phase); + /** + * To be called by {@link DevicePolicyManagerService#Lifecycle} when a new user starts. + * + * @see {@link SystemService#onStartUser} + */ + abstract void handleStartUser(int userId); + /** + * To be called by {@link DevicePolicyManagerService#Lifecycle} when a user is being unlocked. + * + * @see {@link SystemService#onUnlockUser} + */ + abstract void handleUnlockUser(int userId); + /** + * To be called by {@link DevicePolicyManagerService#Lifecycle} when a user is being stopped. + * + * @see {@link SystemService#onStopUser} + */ + abstract void handleStopUser(int userId); +} diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 60c36d1b7203..223778f80b7c 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -198,6 +198,8 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; +import java.lang.IllegalStateException; +import java.lang.reflect.Constructor; import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.util.ArrayList; @@ -214,7 +216,7 @@ import java.util.concurrent.atomic.AtomicBoolean; /** * Implementation of the device policy APIs. */ -public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { +public class DevicePolicyManagerService extends BaseIDevicePolicyManager { protected static final String LOG_TAG = "DevicePolicyManager"; @@ -451,11 +453,24 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { }; public static final class Lifecycle extends SystemService { - private DevicePolicyManagerService mService; + private BaseIDevicePolicyManager mService; public Lifecycle(Context context) { super(context); - mService = new DevicePolicyManagerService(context); + String dpmsClassName = context.getResources() + .getString(R.string.config_deviceSpecificDevicePolicyManagerService); + if (TextUtils.isEmpty(dpmsClassName)) { + dpmsClassName = DevicePolicyManagerService.class.getName(); + } + try { + Class serviceClass = Class.forName(dpmsClassName); + Constructor constructor = serviceClass.getConstructor(Context.class); + mService = (BaseIDevicePolicyManager) constructor.newInstance(context); + } catch (Exception e) { + throw new IllegalStateException( + "Failed to instantiate DevicePolicyManagerService with class name: " + + dpmsClassName, e); + } } @Override @@ -1551,6 +1566,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mContext = context; } + public boolean hasFeature() { + return getPackageManager().hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN); + } + Context createContextAsUser(UserHandle user) throws PackageManager.NameNotFoundException { final String packageName = mContext.getPackageName(); return mContext.createPackageContextAsUser(packageName, 0, user); @@ -1848,8 +1867,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // TODO: why does SecurityLogMonitor need to be created even when mHasFeature == false? mSecurityLogMonitor = new SecurityLogMonitor(this); - mHasFeature = mInjector.getPackageManager() - .hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN); + mHasFeature = mInjector.hasFeature(); mIsWatch = mInjector.getPackageManager() .hasSystemFeature(PackageManager.FEATURE_WATCH); mBackgroundHandler = BackgroundThread.getHandler(); @@ -3033,6 +3051,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } @VisibleForTesting + @Override void systemReady(int phase) { if (!mHasFeature) { return; @@ -3099,6 +3118,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } + @Override void handleStartUser(int userId) { updateScreenCaptureDisabledInWindowManager(userId, getScreenCaptureDisabled(null, userId)); @@ -3107,10 +3127,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { startOwnerService(userId, "start-user"); } + @Override void handleUnlockUser(int userId) { startOwnerService(userId, "unlock-user"); } + @Override void handleStopUser(int userId) { stopOwnerService(userId, "stop-user"); } -- 2.11.0