From 5565cb42f2ac07fcdbe3aab2503de07fbeb39504 Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Fri, 12 Sep 2014 10:59:21 -0400 Subject: [PATCH] Plumbing for screen pinning request from sysui Removes lock-to-app request dialog from the AM. Added a showScreenPinningRequest to IStatusBar to handle the flow from app requesting lock task to showing the dialog. This CL also allows startLockTaskOnCurrent (system|signature) to start lock task directly. (Note: this is the less locked version that always allows exit through back + recents) Bug: 16957435 Change-Id: I284918dd5989de6cb2767c2a717529eb5e9c6db4 --- .../internal/statusbar/IStatusBar.aidl | 1 + .../systemui/statusbar/CommandQueue.java | 11 +++++++ .../statusbar/phone/PhoneStatusBar.java | 5 +++ .../systemui/statusbar/tv/TvStatusBar.java | 4 +++ .../server/am/ActivityManagerService.java | 32 +++++++++---------- .../statusbar/StatusBarManagerInternal.java | 1 + .../statusbar/StatusBarManagerService.java | 10 ++++++ 7 files changed, 48 insertions(+), 16 deletions(-) diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 57472f8b5b965..a3c0db4f344b2 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -42,5 +42,6 @@ oneway interface IStatusBar void toggleRecentApps(); void preloadRecentApps(); void cancelPreloadRecentApps(); + void showScreenPinningRequest(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 9db875fab062e..0b1b883810a4c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -56,6 +56,7 @@ public class CommandQueue extends IStatusBar.Stub { private static final int MSG_BUZZ_BEEP_BLINKED = 15 << MSG_SHIFT; private static final int MSG_NOTIFICATION_LIGHT_OFF = 16 << MSG_SHIFT; private static final int MSG_NOTIFICATION_LIGHT_PULSE = 17 << MSG_SHIFT; + private static final int MSG_SHOW_SCREEN_PIN_REQUEST = 18 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -97,6 +98,7 @@ public class CommandQueue extends IStatusBar.Stub { public void buzzBeepBlinked(); public void notificationLightOff(); public void notificationLightPulse(int argb, int onMillis, int offMillis); + public void showScreenPinningRequest(); } public CommandQueue(Callbacks callbacks, StatusBarIconList list) { @@ -238,6 +240,12 @@ public class CommandQueue extends IStatusBar.Stub { } } + public void showScreenPinningRequest() { + synchronized (mList) { + mHandler.sendEmptyMessage(MSG_SHOW_SCREEN_PIN_REQUEST); + } + } + private final class H extends Handler { public void handleMessage(Message msg) { final int what = msg.what & MSG_MASK; @@ -317,6 +325,9 @@ public class CommandQueue extends IStatusBar.Stub { case MSG_NOTIFICATION_LIGHT_PULSE: mCallbacks.notificationLightPulse((Integer) msg.obj, msg.arg1, msg.arg2); break; + case MSG_SHOW_SCREEN_PIN_REQUEST: + mCallbacks.showScreenPinningRequest(); + break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 84ebcdfbf4d61..0487ab1b60004 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -4032,6 +4032,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, notifyUiVisibilityChanged(mSystemUiVisibility); } + @Override + public void showScreenPinningRequest() { + // TODO: Show request. + } + public boolean hasActiveNotifications() { return !mNotificationData.getActiveNotifications().isEmpty(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java index 1b6a9e1686a1b..08732e5be40d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java @@ -178,4 +178,8 @@ public class TvStatusBar extends BaseStatusBar { @Override public void onActivationReset(ActivatableNotificationView view) { } + + @Override + public void showScreenPinningRequest() { + } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 91e2df012e536..9c9c9e014c555 100755 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -82,6 +82,7 @@ import com.android.server.Watchdog; import com.android.server.am.ActivityStack.ActivityState; import com.android.server.firewall.IntentFirewall; import com.android.server.pm.UserManagerService; +import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.wm.AppTransition; import com.android.server.wm.WindowManagerService; import com.google.android.collect.Lists; @@ -199,6 +200,7 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; + import dalvik.system.VMRuntime; import java.io.BufferedInputStream; @@ -1214,8 +1216,6 @@ public final class ActivityManagerService extends ActivityManagerNative CompatModeDialog mCompatModeDialog; long mLastMemUsageReportTime = 0; - private LockToAppRequestDialog mLockToAppRequest; - /** * Flag whether the current user is a "monkey", i.e. whether * the UI is driven by a UI automation tool. @@ -1686,7 +1686,6 @@ public final class ActivityManagerService extends ActivityManagerNative BatteryStats.HistoryItem.EVENT_USER_FOREGROUND_START, Integer.toString(msg.arg1), msg.arg1); mSystemServiceManager.switchUser(msg.arg1); - mLockToAppRequest.clearPrompt(); break; } case ENTER_ANIMATION_COMPLETE_MSG: { @@ -2159,8 +2158,6 @@ public final class ActivityManagerService extends ActivityManagerNative } }; - mLockToAppRequest = new LockToAppRequestDialog(mContext, this); - Watchdog.getInstance().addMonitor(this); Watchdog.getInstance().addThread(mHandler); } @@ -8656,13 +8653,11 @@ public final class ActivityManagerService extends ActivityManagerNative } boolean isSystemInitiated = Binder.getCallingUid() == Process.SYSTEM_UID; if (!isSystemInitiated && !isLockTaskAuthorized(pkg)) { - final TaskRecord taskRecord = task; - mHandler.post(new Runnable() { - @Override - public void run() { - mLockToAppRequest.showLockTaskPrompt(taskRecord); - } - }); + StatusBarManagerInternal statusBarManager = LocalServices.getService( + StatusBarManagerInternal.class); + if (statusBarManager != null) { + statusBarManager.showScreenPinningRequest(); + } return; } long ident = Binder.clearCallingIdentity(); @@ -8724,11 +8719,16 @@ public final class ActivityManagerService extends ActivityManagerNative public void startLockTaskModeOnCurrent() throws RemoteException { enforceCallingPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS, "startLockTaskModeOnCurrent"); - ActivityRecord r = null; - synchronized (this) { - r = mStackSupervisor.topRunningActivityLocked(); + long ident = Binder.clearCallingIdentity(); + try { + ActivityRecord r = null; + synchronized (this) { + r = mStackSupervisor.topRunningActivityLocked(); + } + startLockTaskMode(r.task); + } finally { + Binder.restoreCallingIdentity(ident); } - startLockTaskMode(r.task); } @Override diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index c28e0bcd4ff63..58c3ea1f619c7 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -23,4 +23,5 @@ public interface StatusBarManagerInternal { void buzzBeepBlinked(); void notificationLightPulse(int argb, int onMillis, int offMillis); void notificationLightOff(); + void showScreenPinningRequest(); } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 1919281e53293..9828cd4a30d6f 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -142,6 +142,16 @@ public class StatusBarManagerService extends IStatusBarService.Stub { } } } + + @Override + public void showScreenPinningRequest() { + if (mBar != null) { + try { + mBar.showScreenPinningRequest(); + } catch (RemoteException e) { + } + } + } }; // ================================================================================