summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorWale Ogunwale <ogunwale@google.com>2015-12-04 15:35:38 -0800
committerWale Ogunwale <ogunwale@google.com>2015-12-07 07:40:56 -0800
commit5f986095bed776c119d2f5452e0afeac3a437ea2 (patch)
treead50d476f4784fb5fcb603ac1118b2db9317bf94 /core/java/android
parentc72b3101ee368d2a9943e4436ede679acfa38f92 (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.java51
-rw-r--r--core/java/android/app/ActivityManagerNative.java44
-rw-r--r--core/java/android/app/ActivityThread.java36
-rw-r--r--core/java/android/app/ApplicationThreadNative.java42
-rw-r--r--core/java/android/app/IActivityManager.java6
-rw-r--r--core/java/android/app/IApplicationThread.java4
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;
}