OSDN Git Service

Merge "Remember task which is being locked" into nyc-dev
authorAndrii Kulian <akulian@google.com>
Fri, 15 Apr 2016 04:32:55 +0000 (04:32 +0000)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Fri, 15 Apr 2016 04:32:57 +0000 (04:32 +0000)
1  2 
core/java/android/app/ActivityManagerNative.java
core/java/android/app/IActivityManager.java
packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
services/core/java/com/android/server/am/ActivityManagerService.java

@@@ -2411,11 -2411,8 +2411,11 @@@ public abstract class ActivityManagerNa
              data.enforceInterface(IActivityManager.descriptor);
              int requestType = data.readInt();
              IResultReceiver receiver = IResultReceiver.Stub.asInterface(data.readStrongBinder());
 +            Bundle receiverExtras = data.readBundle();
              IBinder activityToken = data.readStrongBinder();
 -            boolean res = requestAssistContextExtras(requestType, receiver, activityToken);
 +            boolean focused = data.readInt() == 1;
 +            boolean res = requestAssistContextExtras(requestType, receiver, receiverExtras,
 +                    activityToken, focused);
              reply.writeNoException();
              reply.writeInt(res ? 1 : 0);
              return true;
              return true;
          }
  
-         case START_LOCK_TASK_BY_CURRENT_TRANSACTION: {
+         case START_SYSTEM_LOCK_TASK_TRANSACTION: {
              data.enforceInterface(IActivityManager.descriptor);
-             startLockTaskModeOnCurrent();
+             int taskId = data.readInt();
+             startSystemLockTaskMode(taskId);
              reply.writeNoException();
              return true;
          }
              return true;
          }
  
-         case STOP_LOCK_TASK_BY_CURRENT_TRANSACTION: {
+         case STOP_SYSTEM_LOCK_TASK_TRANSACTION: {
              data.enforceInterface(IActivityManager.descriptor);
-             stopLockTaskModeOnCurrent();
+             stopSystemLockTaskMode();
              reply.writeNoException();
              return true;
          }
@@@ -6083,16 -6081,13 +6084,16 @@@ class ActivityManagerProxy implements I
      }
  
      public boolean requestAssistContextExtras(int requestType, IResultReceiver receiver,
 -            IBinder activityToken) throws RemoteException {
 +            Bundle receiverExtras,
 +            IBinder activityToken, boolean focused) throws RemoteException {
          Parcel data = Parcel.obtain();
          Parcel reply = Parcel.obtain();
          data.writeInterfaceToken(IActivityManager.descriptor);
          data.writeInt(requestType);
          data.writeStrongBinder(receiver.asBinder());
 +        data.writeBundle(receiverExtras);
          data.writeStrongBinder(activityToken);
 +        data.writeInt(focused ? 1 : 0);
          mRemote.transact(REQUEST_ASSIST_CONTEXT_EXTRAS_TRANSACTION, data, reply, 0);
          reply.readException();
          boolean res = reply.readInt() != 0;
      }
  
      @Override
-     public void startLockTaskModeOnCurrent() throws RemoteException {
+     public void startSystemLockTaskMode(int taskId) throws RemoteException {
          Parcel data = Parcel.obtain();
          Parcel reply = Parcel.obtain();
          data.writeInterfaceToken(IActivityManager.descriptor);
-         mRemote.transact(START_LOCK_TASK_BY_CURRENT_TRANSACTION, data, reply, 0);
+         data.writeInt(taskId);
+         mRemote.transact(START_SYSTEM_LOCK_TASK_TRANSACTION, data, reply, 0);
          reply.readException();
          data.recycle();
          reply.recycle();
      }
  
      @Override
-     public void stopLockTaskModeOnCurrent() throws RemoteException {
+     public void stopSystemLockTaskMode() throws RemoteException {
          Parcel data = Parcel.obtain();
          Parcel reply = Parcel.obtain();
          data.writeInterfaceToken(IActivityManager.descriptor);
-         mRemote.transact(STOP_LOCK_TASK_BY_CURRENT_TRANSACTION, data, reply, 0);
+         mRemote.transact(STOP_SYSTEM_LOCK_TASK_TRANSACTION, data, reply, 0);
          reply.readException();
          data.recycle();
          reply.recycle();
@@@ -523,8 -523,7 +523,8 @@@ public interface IActivityManager exten
      public Bundle getAssistContextExtras(int requestType) throws RemoteException;
  
      public boolean requestAssistContextExtras(int requestType, IResultReceiver receiver,
 -            IBinder activityToken) throws RemoteException;
 +            Bundle receiverExtras,
 +            IBinder activityToken, boolean focused) throws RemoteException;
  
      public void reportAssistContextExtras(IBinder token, Bundle extras,
              AssistStructure structure, AssistContent content, Uri referrer) throws RemoteException;
  
      public int getActivityDisplayId(IBinder activityToken) throws RemoteException;
  
-     public void startLockTaskModeOnCurrent() throws RemoteException;
+     public void startSystemLockTaskMode(int taskId) throws RemoteException;
  
      public void startLockTaskMode(int taskId) throws RemoteException;
  
  
      public void stopLockTaskMode() throws RemoteException;
  
-     public void stopLockTaskModeOnCurrent() throws RemoteException;
+     public void stopSystemLockTaskMode() throws RemoteException;
  
      public boolean isInLockTaskMode() throws RemoteException;
  
      int START_VOICE_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+218;
      int GET_ACTIVITY_OPTIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+219;
      int GET_APP_TASKS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+220;
-     int START_LOCK_TASK_BY_CURRENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+221;
-     int STOP_LOCK_TASK_BY_CURRENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+222;
+     int START_SYSTEM_LOCK_TASK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+221;
+     int STOP_SYSTEM_LOCK_TASK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+222;
      int FINISH_VOICE_TASK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+223;
      int IS_TOP_OF_TASK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+224;
      int REQUEST_VISIBLE_BEHIND_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+225;
@@@ -221,11 -221,11 +221,11 @@@ public class RecentsImpl implements Act
       * visibility change events through to the system user via
       * {@link Recents#onBusEvent(ScreenPinningRequestEvent)}.
       */
-     public void onStartScreenPinning(Context context) {
+     public void onStartScreenPinning(Context context, int taskId) {
          SystemUIApplication app = (SystemUIApplication) context;
          PhoneStatusBar statusBar = app.getComponent(PhoneStatusBar.class);
          if (statusBar != null) {
-             statusBar.showScreenPinningRequest(false);
+             statusBar.showScreenPinningRequest(taskId, false);
          }
      }
  
              TaskStackViewScroller stackScroller = stackView.getScroller();
  
              stackView.updateLayoutAlgorithm(true /* boundScroll */);
 -            stackView.updateToInitialState(true /* scrollToInitialState */);
 +            stackView.updateToInitialState();
  
              for (int i = tasks.size() - 1; i >= 0; i--) {
                  Task task = tasks.get(i);
  
          // Get the transform for the running task
          stackView.updateLayoutAlgorithm(true /* boundScroll */);
 -        stackView.updateToInitialState(true /* scrollToInitialState */);
 +        stackView.updateToInitialState();
          stackView.getStackAlgorithm().getStackTransformScreenCoordinates(launchTask,
                  stackView.getScroller().getStackScroll(), mTmpTransform, null);
          return mTmpTransform;
@@@ -46,7 -46,6 +46,7 @@@ import android.graphics.PointF
  import android.graphics.PorterDuff;
  import android.graphics.PorterDuffXfermode;
  import android.graphics.Rect;
 +import android.graphics.drawable.BitmapDrawable;
  import android.graphics.drawable.ColorDrawable;
  import android.graphics.drawable.Drawable;
  import android.inputmethodservice.InputMethodService;
@@@ -134,7 -133,6 +134,7 @@@ import com.android.systemui.statusbar.D
  import com.android.systemui.statusbar.EmptyShadeView;
  import com.android.systemui.statusbar.ExpandableNotificationRow;
  import com.android.systemui.statusbar.GestureRecorder;
 +import com.android.systemui.statusbar.KeyboardShortcuts;
  import com.android.systemui.statusbar.KeyguardIndicationController;
  import com.android.systemui.statusbar.NotificationData;
  import com.android.systemui.statusbar.NotificationData.Entry;
@@@ -1929,27 -1927,19 +1929,27 @@@ public class PhoneStatusBar extends Bas
                      + " state=" + mState);
          }
  
 -        Bitmap artworkBitmap = null;
 +        Drawable artworkDrawable = null;
          if (mMediaMetadata != null) {
 +            Bitmap artworkBitmap = null;
              artworkBitmap = mMediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_ART);
              if (artworkBitmap == null) {
                  artworkBitmap = mMediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART);
                  // might still be null
              }
 +            if (artworkBitmap != null) {
 +                artworkDrawable = new BitmapDrawable(mBackdropBack.getResources(), artworkBitmap);
 +            }
          }
 -        if (ENABLE_LOCKSCREEN_WALLPAPER && artworkBitmap == null) {
 -            artworkBitmap = mLockscreenWallpaper.getBitmap();
 +        if (ENABLE_LOCKSCREEN_WALLPAPER && artworkDrawable == null) {
 +            Bitmap lockWallpaper = mLockscreenWallpaper.getBitmap();
 +            if (lockWallpaper != null) {
 +                artworkDrawable = new LockscreenWallpaper.WallpaperDrawable(
 +                        mBackdropBack.getResources(), lockWallpaper);
 +            }
          }
  
 -        final boolean hasArtwork = artworkBitmap != null;
 +        final boolean hasArtwork = artworkDrawable != null;
  
          if ((hasArtwork || DEBUG_MEDIA_FAKE_ARTWORK) && mState != StatusBarState.SHADE
                  && mFingerprintUnlockController.getMode()
                      mBackdropBack.setBackgroundColor(0xFFFFFFFF);
                      mBackdropBack.setImageDrawable(new ColorDrawable(c));
                  } else {
 -                    mBackdropBack.setImageBitmap(artworkBitmap);
 +                    mBackdropBack.setImageDrawable(artworkDrawable);
                  }
                  if (mScrimSrcModeEnabled) {
                      mBackdropBack.getDrawable().mutate().setXfermode(mSrcXferMode);
              if (DEBUG) Log.v(TAG, "onReceive: " + intent);
              String action = intent.getAction();
              if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
 -                getKeyboardShortcuts().dismissKeyboardShortcutsDialog();
 +                KeyboardShortcuts.dismiss();
                  if (isCurrentProfile(getSendingUserId())) {
                      int flags = CommandQueue.FLAG_EXCLUDE_NONE;
                      String reason = intent.getStringExtra("reason");
          try {
              IActivityManager activityManager = ActivityManagerNative.getDefault();
              if (activityManager.isInLockTaskMode()) {
-                 activityManager.stopLockTaskModeOnCurrent();
+                 activityManager.stopSystemLockTaskMode();
  
                  // When exiting refresh disabled flags.
                  mNavigationBarView.setDisabledFlags(mDisabled1, true);
      }
  
      @Override
-     public void showScreenPinningRequest() {
+     public void showScreenPinningRequest(int taskId) {
          if (mKeyguardMonitor.isShowing()) {
              // Don't allow apps to trigger this from keyguard.
              return;
          }
          // Show screen pinning request, since this comes from an app, show 'no thanks', button.
-         showScreenPinningRequest(true);
+         showScreenPinningRequest(taskId, true);
      }
  
-     public void showScreenPinningRequest(boolean allowCancel) {
-         mScreenPinningRequest.showPrompt(allowCancel);
+     public void showScreenPinningRequest(int taskId, boolean allowCancel) {
+         mScreenPinningRequest.showPrompt(taskId, allowCancel);
      }
  
      public boolean hasActiveNotifications() {
@@@ -628,16 -628,13 +628,16 @@@ public final class ActivityManagerServi
          public Bundle result = null;
          public AssistStructure structure = null;
          public AssistContent content = null;
 +        public Bundle receiverExtras;
 +
          public PendingAssistExtras(ActivityRecord _activity, Bundle _extras, Intent _intent,
 -                String _hint, IResultReceiver _receiver, int _userHandle) {
 +                String _hint, IResultReceiver _receiver, Bundle _receiverExtras, int _userHandle) {
              activity = _activity;
              extras = _extras;
              intent = _intent;
              hint = _hint;
              receiver = _receiver;
 +            receiverExtras = _receiverExtras;
              userHandle = _userHandle;
          }
          @Override
          boolean isSystemInitiated = callingUid == Process.SYSTEM_UID;
          long ident = Binder.clearCallingIdentity();
          try {
-             final ActivityStack stack = mStackSupervisor.getFocusedStack();
              if (!isSystemInitiated) {
                  task.mLockTaskUid = callingUid;
                  if (task.mLockTaskAuth == LOCK_TASK_AUTH_PINNABLE) {
                      StatusBarManagerInternal statusBarManager =
                              LocalServices.getService(StatusBarManagerInternal.class);
                      if (statusBarManager != null) {
-                         statusBarManager.showScreenPinningRequest();
+                         statusBarManager.showScreenPinningRequest(task.taskId);
                      }
                      return;
                  }
  
+                 final ActivityStack stack = mStackSupervisor.getFocusedStack();
                  if (stack == null || task != stack.topTask()) {
                      throw new IllegalArgumentException("Invalid task, not in foreground");
                  }
      }
  
      @Override
-     public void startLockTaskModeOnCurrent() throws RemoteException {
-         enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "startLockTaskModeOnCurrent");
+     public void startSystemLockTaskMode(int taskId) throws RemoteException {
+         enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "startSystemLockTaskMode");
+         // This makes inner call to look as if it was initiated by system.
          long ident = Binder.clearCallingIdentity();
          try {
              synchronized (this) {
-                 ActivityRecord r = mStackSupervisor.topRunningActivityLocked();
-                 if (r != null) {
-                     startLockTaskModeLocked(r.task);
-                 }
+                 startLockTaskMode(taskId);
              }
          } finally {
              Binder.restoreCallingIdentity(ident);
      }
  
      @Override
-     public void stopLockTaskModeOnCurrent() throws RemoteException {
-         enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "stopLockTaskModeOnCurrent");
+     public void stopSystemLockTaskMode() throws RemoteException {
+         enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "stopSystemLockTaskMode");
+         // This makes inner call to look as if it was initiated by system.
          long ident = Binder.clearCallingIdentity();
          try {
              stopLockTaskMode();
      @Override
      public Bundle getAssistContextExtras(int requestType) {
          PendingAssistExtras pae = enqueueAssistContext(requestType, null, null, null,
 -                null, UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_TIMEOUT);
 +                null, null, true, UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_TIMEOUT);
          if (pae == null) {
              return null;
          }
  
      @Override
      public boolean requestAssistContextExtras(int requestType, IResultReceiver receiver,
 -            IBinder activityToken) {
 -        return enqueueAssistContext(requestType, null, null, receiver, activityToken,
 -                UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_LONG_TIMEOUT) != null;
 +            Bundle receiverExtras,
 +            IBinder activityToken, boolean focused) {
 +        return enqueueAssistContext(requestType, null, null, receiver, receiverExtras,
 +                activityToken, focused,
 +                UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_LONG_TIMEOUT)
 +                != null;
      }
  
      private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint,
 -            IResultReceiver receiver, IBinder activityToken, int userHandle, Bundle args,
 -            long timeout) {
 +            IResultReceiver receiver, Bundle receiverExtras, IBinder activityToken, boolean focused,
 +            int userHandle, Bundle args, long timeout) {
          enforceCallingPermission(android.Manifest.permission.GET_TOP_ACTIVITY_INFO,
                  "enqueueAssistContext()");
          synchronized (this) {
                  Slog.w(TAG, "getAssistContextExtras failed: no process for " + activity);
                  return null;
              }
 -            if (activityToken != null) {
 -                ActivityRecord caller = ActivityRecord.forTokenLocked(activityToken);
 -                if (activity != caller) {
 -                    Slog.w(TAG, "enqueueAssistContext failed: caller " + caller
 -                            + " is not current top " + activity);
 +            if (focused) {
 +                if (activityToken != null) {
 +                    ActivityRecord caller = ActivityRecord.forTokenLocked(activityToken);
 +                    if (activity != caller) {
 +                        Slog.w(TAG, "enqueueAssistContext failed: caller " + caller
 +                                + " is not current top " + activity);
 +                        return null;
 +                    }
 +                }
 +            } else {
 +                activity = ActivityRecord.forTokenLocked(activityToken);
 +                if (activity == null) {
 +                    Slog.w(TAG, "enqueueAssistContext failed: activity for token=" + activityToken
 +                            + " couldn't be found");
                      return null;
                  }
              }
 +
              PendingAssistExtras pae;
              Bundle extras = new Bundle();
              if (args != null) {
              }
              extras.putString(Intent.EXTRA_ASSIST_PACKAGE, activity.packageName);
              extras.putInt(Intent.EXTRA_ASSIST_UID, activity.app.uid);
 -            pae = new PendingAssistExtras(activity, extras, intent, hint, receiver, userHandle);
 +            pae = new PendingAssistExtras(activity, extras, intent, hint, receiver, receiverExtras,
 +                    userHandle);
              try {
                  activity.app.thread.requestAssistContextExtras(activity.appToken, pae,
                          requestType);
              if ((sendReceiver=pae.receiver) != null) {
                  // Caller wants result sent back to them.
                  sendBundle = new Bundle();
 -                sendBundle.putBundle("data", pae.extras);
 -                sendBundle.putParcelable("structure", pae.structure);
 -                sendBundle.putParcelable("content", pae.content);
 +                sendBundle.putBundle(VoiceInteractionSession.KEY_DATA, pae.extras);
 +                sendBundle.putParcelable(VoiceInteractionSession.KEY_STRUCTURE, pae.structure);
 +                sendBundle.putParcelable(VoiceInteractionSession.KEY_CONTENT, pae.content);
 +                sendBundle.putBundle(VoiceInteractionSession.KEY_RECEIVER_EXTRAS,
 +                        pae.receiverExtras);
              }
          }
          if (sendReceiver != null) {
  
      public boolean launchAssistIntent(Intent intent, int requestType, String hint, int userHandle,
              Bundle args) {
 -        return enqueueAssistContext(requestType, intent, hint, null, null, userHandle, args,
 -                PENDING_ASSIST_EXTRAS_TIMEOUT) != null;
 +        return enqueueAssistContext(requestType, intent, hint, null, null, null, true,
 +                userHandle, args, PENDING_ASSIST_EXTRAS_TIMEOUT) != null;
      }
  
      public void registerProcessObserver(IProcessObserver observer) {
                  mStackSupervisor.notifyAppTransitionDone();
              }
          }
 +
 +        @Override
 +        public List<IBinder> getTopVisibleActivities() {
 +            synchronized (ActivityManagerService.this) {
 +                return mStackSupervisor.getTopVisibleActivities();
 +            }
 +        }
      }
  
      private final class SleepTokenImpl extends SleepToken {