summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/app/Activity.java79
-rw-r--r--core/java/android/app/ActivityManagerInternal.java30
-rw-r--r--core/java/android/app/IActivityManager.aidl9
-rw-r--r--core/java/android/app/PictureInPictureArgs.aidl19
-rw-r--r--core/java/android/app/PictureInPictureArgs.java175
5 files changed, 224 insertions, 88 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index f6771857f26b..556d7add513f 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -2029,78 +2029,53 @@ public class Activity extends ContextThemeWrapper
}
/**
- * Puts the activity in picture-in-picture mode.
+ * Puts the activity in picture-in-picture mode if possible in the current system state. Any
+ * prior calls to {@link #setPictureInPictureArgs(PictureInPictureArgs)} will still apply when
+ * entering picture-in-picture through this call.
+ *
+ * @see #enterPictureInPictureMode(PictureInPictureArgs)
* @see android.R.attr#supportsPictureInPicture
*/
public void enterPictureInPictureMode() {
- try {
- ActivityManager.getService().enterPictureInPictureMode(mToken);
- } catch (RemoteException e) {
- }
+ enterPictureInPictureMode(new PictureInPictureArgs());
}
/**
- * Puts the activity in picture-in-picture mode with a given aspect ratio.
- * @see android.R.attr#supportsPictureInPicture
+ * Puts the activity in picture-in-picture mode if possible in the current system state with
+ * explicit given arguments. Only the set parameters in {@param args} will override prior calls
+ * {@link #setPictureInPictureArgs(PictureInPictureArgs)}.
*
- * @param aspectRatio the new aspect ratio of the picture-in-picture.
- */
- public void enterPictureInPictureMode(float aspectRatio) {
- try {
- ActivityManagerNative.getDefault().enterPictureInPictureModeWithAspectRatio(mToken,
- aspectRatio);
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Requests to the system that the activity can be automatically put into picture-in-picture
- * mode when the user leaves the activity causing it normally to be hidden. Generally, this
- * happens when another task is brought to the forground or the task containing this activity
- * is moved to the background. This is a *not* a guarantee that the activity will actually be
- * put in picture-in-picture mode, and depends on a number of factors, including whether there
- * is already something in picture-in-picture.
+ * The system may disallow entering picture-in-picture in various cases, including when the
+ * activity is not visible.
*
- * @param enterPictureInPictureOnMoveToBg whether or not this activity can automatically enter
- * picture-in-picture
- */
- public void enterPictureInPictureModeOnMoveToBackground(
- boolean enterPictureInPictureOnMoveToBg) {
- try {
- ActivityManagerNative.getDefault().enterPictureInPictureModeOnMoveToBackground(mToken,
- enterPictureInPictureOnMoveToBg);
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Updates the aspect ratio of the current picture-in-picture activity if this activity is
- * already in picture-in-picture mode, or sets it to be used later if
- * {@link #enterPictureInPictureModeOnMoveToBackground(boolean)} is requested.
+ * @see android.R.attr#supportsPictureInPicture
*
- * @param aspectRatio the new aspect ratio of the picture-in-picture.
+ * @param args the explicit non-null arguments to use when entering picture-in-picture.
+ * @return whether the system successfully entered picture-in-picture.
*/
- public void setPictureInPictureAspectRatio(float aspectRatio) {
+ public boolean enterPictureInPictureMode(@NonNull PictureInPictureArgs args) {
try {
- ActivityManagerNative.getDefault().setPictureInPictureAspectRatio(mToken, aspectRatio);
+ if (args == null) {
+ throw new IllegalArgumentException("Expected non-null picture-in-picture args");
+ }
+ return ActivityManagerNative.getDefault().enterPictureInPictureMode(mToken, args);
} catch (RemoteException e) {
+ return false;
}
}
/**
- * Updates the set of user actions associated with the picture-in-picture activity.
+ * Updates the properties of the picture-in-picture activity, or sets it to be used later when
+ * {@link #enterPictureInPictureMode()} is called.
*
- * @param actions the new actions for picture-in-picture (can be null to reset the set of
- * actions). The maximum number of actions that will be displayed on this device
- * is defined by {@link ActivityManager#getMaxNumPictureInPictureActions()}.
+ * @param args the new properties of the picture-in-picture.
*/
- public void setPictureInPictureActions(List<RemoteAction> actions) {
+ public void setPictureInPictureArgs(@NonNull PictureInPictureArgs args) {
try {
- if (actions == null) {
- actions = new ArrayList<>();
+ if (args == null) {
+ throw new IllegalArgumentException("Expected non-null picture-in-picture args");
}
- ActivityManagerNative.getDefault().setPictureInPictureActions(mToken,
- new ParceledListSlice<RemoteAction>(actions));
+ ActivityManagerNative.getDefault().setPictureInPictureArgs(mToken, args);
} catch (RemoteException e) {
}
}
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 87700dc7aa35..4ff843d4c436 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -64,36 +64,6 @@ public abstract class ActivityManagerInternal {
public static final int APP_TRANSITION_TIMEOUT = 3;
/**
- * Class to hold deferred properties to apply for picture-in-picture for a given activity.
- */
- public static class PictureInPictureArguments {
- /**
- * The expected aspect ratio of the picture-in-picture.
- */
- public float aspectRatio;
-
- /**
- * The set of actions that are associated with this activity when in picture in picture.
- */
- public List<RemoteAction> userActions = new ArrayList<>();
-
- public void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + "aspectRatio=" + aspectRatio);
- if (userActions.isEmpty()) {
- pw.println(prefix + " userActions=[]");
- } else {
- pw.println(prefix + " userActions=[");
- for (int i = 0; i < userActions.size(); i++) {
- RemoteAction action = userActions.get(i);
- pw.print(prefix + " Action[" + i + "]: ");
- action.dump("", pw);
- }
- pw.println(prefix + " ]");
- }
- }
- }
-
- /**
* Grant Uri permissions from one app to another. This method only extends
* permission grants if {@code callingUid} has permission to them.
*/
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index e143255bbd43..2c1e7c505f20 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -34,6 +34,7 @@ import android.app.IUidObserver;
import android.app.IUserSwitchObserver;
import android.app.Notification;
import android.app.PendingIntent;
+import android.app.PictureInPictureArgs;
import android.app.ProfilerInfo;
import android.app.WaitResult;
import android.app.assist.AssistContent;
@@ -479,12 +480,8 @@ interface IActivityManager {
boolean isInMultiWindowMode(in IBinder token);
boolean isInPictureInPictureMode(in IBinder token);
void killPackageDependents(in String packageName, int userId);
- void enterPictureInPictureMode(in IBinder token);
- void enterPictureInPictureModeWithAspectRatio(in IBinder token, float aspectRatio);
- void enterPictureInPictureModeOnMoveToBackground(in IBinder token,
- boolean enterPictureInPictureOnMoveToBg);
- void setPictureInPictureAspectRatio(in IBinder token, float aspectRatio);
- void setPictureInPictureActions(in IBinder token, in ParceledListSlice actions);
+ boolean enterPictureInPictureMode(in IBinder token, in PictureInPictureArgs args);
+ void setPictureInPictureArgs(in IBinder token, in PictureInPictureArgs args);
void activityRelaunched(in IBinder token);
IBinder getUriPermissionOwnerForActivity(in IBinder activityToken);
/**
diff --git a/core/java/android/app/PictureInPictureArgs.aidl b/core/java/android/app/PictureInPictureArgs.aidl
new file mode 100644
index 000000000000..49df39a73a7d
--- /dev/null
+++ b/core/java/android/app/PictureInPictureArgs.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2017, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+parcelable PictureInPictureArgs;
diff --git a/core/java/android/app/PictureInPictureArgs.java b/core/java/android/app/PictureInPictureArgs.java
new file mode 100644
index 000000000000..fbdcbf4e6b11
--- /dev/null
+++ b/core/java/android/app/PictureInPictureArgs.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a set of arguments used to initialize the picture-in-picture mode.
+ */
+public final class PictureInPictureArgs implements Parcelable {
+
+ /**
+ * The expected aspect ratio of the picture-in-picture.
+ */
+ @Nullable
+ private Float mAspectRatio;
+
+ /**
+ * The set of actions that are associated with this activity when in picture in picture.
+ */
+ @Nullable
+ private List<RemoteAction> mUserActions;
+
+ PictureInPictureArgs(Parcel in) {
+ if (in.readInt() != 0) {
+ mAspectRatio = in.readFloat();
+ }
+ if (in.readInt() != 0) {
+ mUserActions = new ArrayList<>();
+ in.readParcelableList(mUserActions, RemoteAction.class.getClassLoader());
+ }
+ }
+
+ /**
+ * Creates a new set of picture-in-picture arguments.
+ */
+ public PictureInPictureArgs() {
+ // Empty constructor
+ }
+
+ /**
+ * Creates a new set of picture-in-picture arguments from the given {@param aspectRatio} and
+ * {@param actions}.
+ */
+ public PictureInPictureArgs(float aspectRatio, List<RemoteAction> actions) {
+ mAspectRatio = aspectRatio;
+ if (actions != null) {
+ mUserActions = new ArrayList<>(actions);
+ }
+ }
+
+ /**
+ * Copies the set parameters from the other picture-in-picture args.
+ * @hide
+ */
+ public void copyOnlySet(PictureInPictureArgs otherArgs) {
+ if (otherArgs.hasSetAspectRatio()) {
+ mAspectRatio = otherArgs.mAspectRatio;
+ }
+ if (otherArgs.hasSetActions()) {
+ mUserActions = otherArgs.mUserActions;
+ }
+ }
+
+ /**
+ * Sets the aspect ratio.
+ * @param aspectRatio the new aspect ratio for picture-in-picture.
+ */
+ public void setAspectRatio(float aspectRatio) {
+ mAspectRatio = aspectRatio;
+ }
+
+ /**
+ * @return the aspect ratio. If none is set, return 0.
+ * @hide
+ */
+ public float getAspectRatio() {
+ if (mAspectRatio != null) {
+ return mAspectRatio;
+ }
+ return 0f;
+ }
+
+ /**
+ * @return whether the aspect ratio is set.
+ * @hide
+ */
+ public boolean hasSetAspectRatio() {
+ return mAspectRatio != null;
+ }
+
+ /**
+ * Sets the user actions.
+ * @param actions the new actions to show in the picture-in-picture menu.
+ */
+ public void setActions(List<RemoteAction> actions) {
+ if (mUserActions != null) {
+ mUserActions = null;
+ }
+ if (actions != null) {
+ mUserActions = new ArrayList<>(actions);
+ }
+ }
+
+ /**
+ * @return the set of user actions.
+ * @hide
+ */
+ public List<RemoteAction> getActions() {
+ return mUserActions;
+ }
+
+ /**
+ * @return whether the user actions are set.
+ * @hide
+ */
+ public boolean hasSetActions() {
+ return mUserActions != null;
+ }
+
+ @Override
+ public PictureInPictureArgs clone() {
+ return new PictureInPictureArgs(mAspectRatio, mUserActions);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ if (mAspectRatio != null) {
+ out.writeInt(1);
+ out.writeFloat(mAspectRatio);
+ } else {
+ out.writeInt(0);
+ }
+ if (mUserActions != null) {
+ out.writeInt(1);
+ out.writeParcelableList(mUserActions, 0);
+ } else {
+ out.writeInt(0);
+ }
+ }
+
+ public static final Creator<PictureInPictureArgs> CREATOR =
+ new Creator<PictureInPictureArgs>() {
+ public PictureInPictureArgs createFromParcel(Parcel in) {
+ return new PictureInPictureArgs(in);
+ }
+ public PictureInPictureArgs[] newArray(int size) {
+ return new PictureInPictureArgs[size];
+ }
+ };
+} \ No newline at end of file