diff options
Diffstat (limited to 'services')
-rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 119 | ||||
-rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java | 24 |
2 files changed, 73 insertions, 70 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index d27d783..18ab3b4 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -41,7 +41,6 @@ import android.app.IActivityContainerCallback; import android.app.IAppTask; import android.app.ITaskStackListener; import android.app.ProfilerInfo; -import android.app.admin.DevicePolicyManager; import android.app.usage.UsageEvents; import android.app.usage.UsageStats; import android.app.usage.UsageStatsManagerInternal; @@ -429,6 +428,11 @@ public final class ActivityManagerService extends ActivityManagerNative */ ActivityInfo mLastAddedTaskActivity; + /** + * List of packages whitelisted by DevicePolicyManager for locktask. Indexed by userId. + */ + SparseArray<String[]> mLockTaskPackages = new SparseArray<>(); + public class PendingAssistExtras extends Binder implements Runnable { public final ActivityRecord activity; public final Bundle extras; @@ -8463,52 +8467,54 @@ public final class ActivityManagerService extends ActivityManagerNative } } - private boolean isLockTaskAuthorized(String pkg) { - final DevicePolicyManager dpm = (DevicePolicyManager) - mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); - try { - int uid = mContext.getPackageManager().getPackageUid(pkg, - Binder.getCallingUserHandle().getIdentifier()); - return (uid == Binder.getCallingUid()) && dpm != null && dpm.isLockTaskPermitted(pkg); - } catch (NameNotFoundException e) { - return false; + @Override + public void updateLockTaskPackages(int userId, String[] packages) { + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + throw new SecurityException("updateLockTaskPackage called from non-system process"); + } + synchronized (this) { + mLockTaskPackages.put(userId, packages); } } - void startLockTaskMode(TaskRecord task) { - final String pkg; - synchronized (this) { - pkg = task.intent.getComponent().getPackageName(); + private boolean isLockTaskAuthorizedLocked(String pkg) { + String[] packages = mLockTaskPackages.get(mCurrentUserId); + if (packages == null) { + return false; + } + for (int i = packages.length - 1; i >= 0; --i) { + if (pkg.equals(packages[i])) { + return true; + } } + return false; + } + + void startLockTaskModeLocked(TaskRecord task) { + final String pkg = task.intent.getComponent().getPackageName(); // isSystemInitiated is used to distinguish between locked and pinned mode, as pinned mode // is initiated by system after the pinning request was shown and locked mode is initiated // by an authorized app directly boolean isSystemInitiated = Binder.getCallingUid() == Process.SYSTEM_UID; - if (!isSystemInitiated && !isLockTaskAuthorized(pkg)) { - StatusBarManagerInternal statusBarManager = LocalServices.getService( - StatusBarManagerInternal.class); - if (statusBarManager != null) { - statusBarManager.showScreenPinningRequest(); - } - return; - } long ident = Binder.clearCallingIdentity(); try { - synchronized (this) { - // Since we lost lock on task, make sure it is still there. - task = mStackSupervisor.anyTaskForIdLocked(task.taskId); - if (task != null) { - if (!isSystemInitiated - && ((mStackSupervisor.getFocusedStack() == null) - || (task != mStackSupervisor.getFocusedStack().topTask()))) { - throw new IllegalArgumentException("Invalid task, not in foreground"); - } - mStackSupervisor.setLockTaskModeLocked(task, isSystemInitiated ? - ActivityManager.LOCK_TASK_MODE_PINNED : - ActivityManager.LOCK_TASK_MODE_LOCKED, - "startLockTask"); + if (!isSystemInitiated && !isLockTaskAuthorizedLocked(pkg)) { + StatusBarManagerInternal statusBarManager = + LocalServices.getService(StatusBarManagerInternal.class); + if (statusBarManager != null) { + statusBarManager.showScreenPinningRequest(); } + return; } + + final ActivityStack stack = mStackSupervisor.getFocusedStack(); + if (!isSystemInitiated && (stack == null || task != stack.topTask())) { + throw new IllegalArgumentException("Invalid task, not in foreground"); + } + mStackSupervisor.setLockTaskModeLocked(task, isSystemInitiated ? + ActivityManager.LOCK_TASK_MODE_PINNED : + ActivityManager.LOCK_TASK_MODE_LOCKED, + "startLockTask"); } finally { Binder.restoreCallingIdentity(ident); } @@ -8516,37 +8522,25 @@ public final class ActivityManagerService extends ActivityManagerNative @Override public void startLockTaskMode(int taskId) { - final TaskRecord task; - long ident = Binder.clearCallingIdentity(); - try { - synchronized (this) { - task = mStackSupervisor.anyTaskForIdLocked(taskId); + synchronized (this) { + final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId); + if (task != null) { + startLockTaskModeLocked(task); } - } finally { - Binder.restoreCallingIdentity(ident); - } - if (task != null) { - startLockTaskMode(task); } } @Override public void startLockTaskMode(IBinder token) { - final TaskRecord task; - long ident = Binder.clearCallingIdentity(); - try { - synchronized (this) { - final ActivityRecord r = ActivityRecord.forTokenLocked(token); - if (r == null) { - return; - } - task = r.task; + synchronized (this) { + final ActivityRecord r = ActivityRecord.forTokenLocked(token); + if (r == null) { + return; + } + final TaskRecord task = r.task; + if (task != null) { + startLockTaskModeLocked(task); } - } finally { - Binder.restoreCallingIdentity(ident); - } - if (task != null) { - startLockTaskMode(task); } } @@ -8556,11 +8550,12 @@ public final class ActivityManagerService extends ActivityManagerNative "startLockTaskModeOnCurrent"); long ident = Binder.clearCallingIdentity(); try { - ActivityRecord r = null; synchronized (this) { - r = mStackSupervisor.topRunningActivityLocked(); + ActivityRecord r = mStackSupervisor.topRunningActivityLocked(); + if (r != null) { + startLockTaskModeLocked(r.task); + } } - startLockTaskMode(r.task); } finally { Binder.restoreCallingIdentity(ident); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 45584cd..bb3085e 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -280,15 +280,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long mLastMaximumTimeToLock = -1; boolean mUserSetupComplete = false; - final HashMap<ComponentName, ActiveAdmin> mAdminMap - = new HashMap<ComponentName, ActiveAdmin>(); - final ArrayList<ActiveAdmin> mAdminList - = new ArrayList<ActiveAdmin>(); - final ArrayList<ComponentName> mRemovingAdmins - = new ArrayList<ComponentName>(); + final HashMap<ComponentName, ActiveAdmin> mAdminMap = new HashMap<>(); + final ArrayList<ActiveAdmin> mAdminList = new ArrayList<>(); + final ArrayList<ComponentName> mRemovingAdmins = new ArrayList<>(); // This is the list of component allowed to start lock task mode. - final List<String> mLockTaskPackages = new ArrayList<String>(); + final List<String> mLockTaskPackages = new ArrayList<>(); ComponentName mRestrictionsProvider; @@ -299,7 +296,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } - final SparseArray<DevicePolicyData> mUserData = new SparseArray<DevicePolicyData>(); + final SparseArray<DevicePolicyData> mUserData = new SparseArray<>(); Handler mHandler = new Handler(); @@ -1596,6 +1593,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { validatePasswordOwnerLocked(policy); syncDeviceCapabilitiesLocked(policy); updateMaximumTimeToLockLocked(policy); + updateLockTaskPackagesLocked(policy, userHandle); + } + + private void updateLockTaskPackagesLocked(DevicePolicyData policy, int userId) { + IActivityManager am = ActivityManagerNative.getDefault(); + try { + am.updateLockTaskPackages(userId, policy.mLockTaskPackages.toArray(new String[0])); + } catch (RemoteException e) { + // Not gonna happen. + } } static void validateQualityConstant(int quality) { @@ -5533,6 +5540,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // Store the settings persistently. saveSettingsLocked(userHandle); + updateLockTaskPackagesLocked(policy, userHandle); } } |