diff options
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/app/Activity.java | 79 | ||||
| -rw-r--r-- | core/java/android/app/ActivityManagerInternal.java | 30 | ||||
| -rw-r--r-- | core/java/android/app/IActivityManager.aidl | 9 | ||||
| -rw-r--r-- | core/java/android/app/PictureInPictureArgs.aidl | 19 | ||||
| -rw-r--r-- | core/java/android/app/PictureInPictureArgs.java | 175 |
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 |
