diff options
| author | Wale Ogunwale <ogunwale@google.com> | 2015-12-04 15:35:38 -0800 |
|---|---|---|
| committer | Wale Ogunwale <ogunwale@google.com> | 2015-12-07 07:40:56 -0800 |
| commit | 5f986095bed776c119d2f5452e0afeac3a437ea2 (patch) | |
| tree | ad50d476f4784fb5fcb603ac1118b2db9317bf94 /core/java/android | |
| parent | c72b3101ee368d2a9943e4436ede679acfa38f92 (diff) | |
APIs for activity to know when its windowing/pip modes change
Added APIs that allow activities to ask the system if they are currently
in multi-window or picture-in-picture mode and also get notified when
their modes change.
Bug: 25509834
Bug: 25683717
Change-Id: I4b8c316a49940bd6a8b31a93b345f9fd725a4721
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/Activity.java | 51 | ||||
| -rw-r--r-- | core/java/android/app/ActivityManagerNative.java | 44 | ||||
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 36 | ||||
| -rw-r--r-- | core/java/android/app/ApplicationThreadNative.java | 42 | ||||
| -rw-r--r-- | core/java/android/app/IActivityManager.java | 6 | ||||
| -rw-r--r-- | core/java/android/app/IApplicationThread.java | 4 |
6 files changed, 183 insertions, 0 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 8bb0ff5a2781..93c6bef5630e 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -1727,6 +1727,57 @@ public class Activity extends ContextThemeWrapper } /** + * Called by the system when the activity changes from fullscreen mode to multi-window mode and + * visa-versa. + * @see android.R.attr#resizeableActivity + * + * @param multiWindowMode True if the activity is in multi-window mode. + */ + public void onMultiWindowModeChanged(boolean multiWindowMode) { + if (DEBUG_LIFECYCLE) Slog.v(TAG, + "onMultiWindowModeChanged " + this + ": " + multiWindowMode); + } + + /** + * Returns true if the activity is currently in multi-window mode. + * @see android.R.attr#resizeableActivity + * + * @return True if the activity is in multi-window mode. + */ + public boolean inMultiWindowMode() { + try { + return ActivityManagerNative.getDefault().inMultiWindowMode(mToken); + } catch (RemoteException e) { + } + return false; + } + + /** + * Called by the system when the activity changes to and from picture-in-picture mode. + * @see android.R.attr#supportsPictureInPicture + * + * @param pictureInPictureMode True if the activity is in picture-in-picture mode. + */ + public void onPictureInPictureModeChanged(boolean pictureInPictureMode) { + if (DEBUG_LIFECYCLE) Slog.v(TAG, + "onPictureInPictureModeChanged " + this + ": " + pictureInPictureMode); + } + + /** + * Returns true if the activity is currently in picture-in-picture mode. + * @see android.R.attr#supportsPictureInPicture + * + * @return True if the activity is in picture-in-picture mode. + */ + public boolean inPictureInPictureMode() { + try { + return ActivityManagerNative.getDefault().inPictureInPictureMode(mToken); + } catch (RemoteException e) { + } + return false; + } + + /** * Called by the system when the device configuration changes while your * activity is running. Note that this will <em>only</em> be called if * you have selected configurations you would like to handle with the diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index c05d5e8d8295..ee2efcc5390a 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2733,6 +2733,22 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeInt(res); return true; } + case IN_MULTI_WINDOW_MODE_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + final IBinder token = data.readStrongBinder(); + final boolean multiWindowMode = inMultiWindowMode(token); + reply.writeNoException(); + reply.writeInt(multiWindowMode ? 1 : 0); + return true; + } + case IN_PICTURE_IN_PICTURE_MODE_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + final IBinder token = data.readStrongBinder(); + final boolean pipMode = inPictureInPictureMode(token); + reply.writeNoException(); + reply.writeInt(pipMode ? 1 : 0); + return true; + } } return super.onTransact(code, data, reply, flags); @@ -6366,5 +6382,33 @@ class ActivityManagerProxy implements IActivityManager return res; } + @Override + public boolean inMultiWindowMode(IBinder token) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(token); + mRemote.transact(IN_MULTI_WINDOW_MODE_TRANSACTION, data, reply, 0); + reply.readException(); + final boolean multiWindowMode = reply.readInt() == 1 ? true : false; + data.recycle(); + reply.recycle(); + return multiWindowMode; + } + + @Override + public boolean inPictureInPictureMode(IBinder token) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(token); + mRemote.transact(IN_PICTURE_IN_PICTURE_MODE_TRANSACTION, data, reply, 0); + reply.readException(); + final boolean pipMode = reply.readInt() == 1 ? true : false; + data.recycle(); + reply.recycle(); + return pipMode; + } + private IBinder mRemote; } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index e64d13a61f62..f3539ff5ae61 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -1275,6 +1275,18 @@ public final class ActivityThread { } catch (IOException e) { } } + + @Override + public void scheduleMultiWindowModeChanged(IBinder token, boolean multiWindowMode) + throws RemoteException { + sendMessage(H.MULTI_WINDOW_MODE_CHANGED, token, multiWindowMode ? 1 : 0); + } + + @Override + public void schedulePictureInPictureModeChanged(IBinder token, boolean pipMode) + throws RemoteException { + sendMessage(H.PICTURE_IN_PICTURE_MODE_CHANGED, token, pipMode ? 1 : 0); + } } private int getLifecycleSeq() { @@ -1336,6 +1348,8 @@ public final class ActivityThread { public static final int ENTER_ANIMATION_COMPLETE = 149; public static final int START_BINDER_TRACKING = 150; public static final int STOP_BINDER_TRACKING_AND_DUMP = 151; + public static final int MULTI_WINDOW_MODE_CHANGED = 152; + public static final int PICTURE_IN_PICTURE_MODE_CHANGED = 153; String codeToString(int code) { if (DEBUG_MESSAGES) { @@ -1389,6 +1403,8 @@ public final class ActivityThread { case CANCEL_VISIBLE_BEHIND: return "CANCEL_VISIBLE_BEHIND"; case BACKGROUND_VISIBLE_BEHIND_CHANGED: return "BACKGROUND_VISIBLE_BEHIND_CHANGED"; case ENTER_ANIMATION_COMPLETE: return "ENTER_ANIMATION_COMPLETE"; + case MULTI_WINDOW_MODE_CHANGED: return "MULTI_WINDOW_MODE_CHANGED"; + case PICTURE_IN_PICTURE_MODE_CHANGED: return "PICTURE_IN_PICTURE_MODE_CHANGED"; } } return Integer.toString(code); @@ -1632,6 +1648,12 @@ public final class ActivityThread { case STOP_BINDER_TRACKING_AND_DUMP: handleStopBinderTrackingAndDump((ParcelFileDescriptor) msg.obj); break; + case MULTI_WINDOW_MODE_CHANGED: + handleMultiWindowModeChanged((IBinder) msg.obj, msg.arg1 == 1); + break; + case PICTURE_IN_PICTURE_MODE_CHANGED: + handlePictureInPictureModeChanged((IBinder) msg.obj, msg.arg1 == 1); + break; } Object obj = msg.obj; if (obj instanceof SomeArgs) { @@ -2814,6 +2836,20 @@ public final class ActivityThread { } } + private void handleMultiWindowModeChanged(IBinder token, boolean multiWindowMode) { + final ActivityClientRecord r = mActivities.get(token); + if (r != null) { + r.activity.onMultiWindowModeChanged(multiWindowMode); + } + } + + private void handlePictureInPictureModeChanged(IBinder token, boolean pipMode) { + final ActivityClientRecord r = mActivities.get(token); + if (r != null) { + r.activity.onPictureInPictureModeChanged(pipMode); + } + } + private static final ThreadLocal<Intent> sCurrentBroadcastIntent = new ThreadLocal<Intent>(); /** diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java index 44387deaddc1..5951c8d9c958 100644 --- a/core/java/android/app/ApplicationThreadNative.java +++ b/core/java/android/app/ApplicationThreadNative.java @@ -720,6 +720,24 @@ public abstract class ApplicationThreadNative extends Binder return true; } + case SCHEDULE_MULTI_WINDOW_MODE_CHANGED_TRANSACTION: + { + data.enforceInterface(IApplicationThread.descriptor); + final IBinder b = data.readStrongBinder(); + final boolean multiWindowMode = data.readInt() != 0; + scheduleMultiWindowModeChanged(b, multiWindowMode); + return true; + } + + case SCHEDULE_PICTURE_IN_PICTURE_MODE_CHANGED_TRANSACTION: + { + data.enforceInterface(IApplicationThread.descriptor); + final IBinder b = data.readStrongBinder(); + final boolean pipMode = data.readInt() != 0; + schedulePictureInPictureModeChanged(b, pipMode); + return true; + } + } return super.onTransact(code, data, reply, flags); @@ -1454,4 +1472,28 @@ class ApplicationThreadProxy implements IApplicationThread { IBinder.FLAG_ONEWAY); data.recycle(); } + + @Override + public final void scheduleMultiWindowModeChanged( + IBinder token, boolean multiWindowMode) throws RemoteException { + Parcel data = Parcel.obtain(); + data.writeInterfaceToken(IApplicationThread.descriptor); + data.writeStrongBinder(token); + data.writeInt(multiWindowMode ? 1 : 0); + mRemote.transact(SCHEDULE_MULTI_WINDOW_MODE_CHANGED_TRANSACTION, data, null, + IBinder.FLAG_ONEWAY); + data.recycle(); + } + + @Override + public final void schedulePictureInPictureModeChanged(IBinder token, boolean pipMode) + throws RemoteException { + Parcel data = Parcel.obtain(); + data.writeInterfaceToken(IApplicationThread.descriptor); + data.writeStrongBinder(token); + data.writeInt(pipMode ? 1 : 0); + mRemote.transact(SCHEDULE_PICTURE_IN_PICTURE_MODE_CHANGED_TRANSACTION, data, null, + IBinder.FLAG_ONEWAY); + data.recycle(); + } } diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 38c795797bf8..9a01b7b706c5 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -545,6 +545,10 @@ public interface IActivityManager extends IInterface { public int getAppStartMode(int uid, String packageName) throws RemoteException; + public boolean inMultiWindowMode(IBinder token) throws RemoteException; + + public boolean inPictureInPictureMode(IBinder token) throws RemoteException; + /* * Private non-Binder interfaces */ @@ -906,4 +910,6 @@ public interface IActivityManager extends IInterface { int MOVE_TOP_ACTIVITY_TO_PINNED_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 349; int GET_APP_START_MODE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 350; int UNLOCK_USER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 351; + int IN_MULTI_WINDOW_MODE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 352; + int IN_PICTURE_IN_PICTURE_MODE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 353; } diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java index 64045f334aee..dc67026c0f87 100644 --- a/core/java/android/app/IApplicationThread.java +++ b/core/java/android/app/IApplicationThread.java @@ -152,6 +152,8 @@ public interface IApplicationThread extends IInterface { void notifyCleartextNetwork(byte[] firstPacket) throws RemoteException; void startBinderTracking() throws RemoteException; void stopBinderTrackingAndDump(FileDescriptor fd) throws RemoteException; + void scheduleMultiWindowModeChanged(IBinder token, boolean multiWindowMode) throws RemoteException; + void schedulePictureInPictureModeChanged(IBinder token, boolean multiWindowMode) throws RemoteException; String descriptor = "android.app.IApplicationThread"; @@ -212,4 +214,6 @@ public interface IApplicationThread extends IInterface { int NOTIFY_CLEARTEXT_NETWORK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+55; int START_BINDER_TRACKING_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+56; int STOP_BINDER_TRACKING_AND_DUMP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+57; + int SCHEDULE_MULTI_WINDOW_MODE_CHANGED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+58; + int SCHEDULE_PICTURE_IN_PICTURE_MODE_CHANGED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+59; } |
