Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2baac05 authored by Winson Chung's avatar Winson Chung
Browse files

Updating picture-in-picture API.

- Consolidating to enterPictureInPictureMode(), the new method will
  attempt to put the activity into picture-in-picture mode if the
  activity is visible or pausing in a state that would allow us to
  pip it.  Also consolidate the setting of the PiP aspect ratio and
  actions into setPictureInPictureArgs().
- Fixing issue with onPause not completing when moving the
  paused activity between stacks while dispatching onPause

Bug: 33692987
Test: android.server.cts.ActivityManagerPinnedStackTests

Change-Id: I3af2365f31a9b95de4a92eae46b77108947b2a49
parent a0ad7385
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -3500,8 +3500,7 @@ package android.app {
    method public boolean dispatchTrackballEvent(android.view.MotionEvent);
    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    method public void enterPictureInPictureMode();
    method public void enterPictureInPictureMode(float);
    method public void enterPictureInPictureModeOnMoveToBackground(boolean);
    method public boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
    method public android.view.View findViewById(int);
    method public void finish();
    method public void finishActivity(int);
@@ -3674,8 +3673,7 @@ package android.app {
    method public void setIntent(android.content.Intent);
    method public final void setMediaController(android.media.session.MediaController);
    method public void setOverlayWithDecorCaptionEnabled(boolean);
    method public void setPictureInPictureActions(java.util.List<android.app.RemoteAction>);
    method public void setPictureInPictureAspectRatio(float);
    method public void setPictureInPictureArgs(android.app.PictureInPictureArgs);
    method public final deprecated void setProgress(int);
    method public final deprecated void setProgressBarIndeterminate(boolean);
    method public final deprecated void setProgressBarIndeterminateVisibility(boolean);
@@ -5533,6 +5531,17 @@ package android.app {
    method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);
  }
  public final class PictureInPictureArgs implements android.os.Parcelable {
    ctor public PictureInPictureArgs();
    ctor public PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
    method public android.app.PictureInPictureArgs clone();
    method public int describeContents();
    method public void setActions(java.util.List<android.app.RemoteAction>);
    method public void setAspectRatio(float);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
  }
  public class Presentation extends android.app.Dialog {
    ctor public Presentation(android.content.Context, android.view.Display);
    ctor public Presentation(android.content.Context, android.view.Display, int);
+13 −4
Original line number Diff line number Diff line
@@ -3619,8 +3619,7 @@ package android.app {
    method public boolean dispatchTrackballEvent(android.view.MotionEvent);
    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    method public void enterPictureInPictureMode();
    method public void enterPictureInPictureMode(float);
    method public void enterPictureInPictureModeOnMoveToBackground(boolean);
    method public boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
    method public android.view.View findViewById(int);
    method public void finish();
    method public void finishActivity(int);
@@ -3795,8 +3794,7 @@ package android.app {
    method public void setIntent(android.content.Intent);
    method public final void setMediaController(android.media.session.MediaController);
    method public void setOverlayWithDecorCaptionEnabled(boolean);
    method public void setPictureInPictureActions(java.util.List<android.app.RemoteAction>);
    method public void setPictureInPictureAspectRatio(float);
    method public void setPictureInPictureArgs(android.app.PictureInPictureArgs);
    method public final deprecated void setProgress(int);
    method public final deprecated void setProgressBarIndeterminate(boolean);
    method public final deprecated void setProgressBarIndeterminateVisibility(boolean);
@@ -5718,6 +5716,17 @@ package android.app {
    method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);
  }
  public final class PictureInPictureArgs implements android.os.Parcelable {
    ctor public PictureInPictureArgs();
    ctor public PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
    method public android.app.PictureInPictureArgs clone();
    method public int describeContents();
    method public void setActions(java.util.List<android.app.RemoteAction>);
    method public void setAspectRatio(float);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
  }
  public class Presentation extends android.app.Dialog {
    ctor public Presentation(android.content.Context, android.view.Display);
    ctor public Presentation(android.content.Context, android.view.Display, int);
+13 −4
Original line number Diff line number Diff line
@@ -3502,8 +3502,7 @@ package android.app {
    method public boolean dispatchTrackballEvent(android.view.MotionEvent);
    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    method public void enterPictureInPictureMode();
    method public void enterPictureInPictureMode(float);
    method public void enterPictureInPictureModeOnMoveToBackground(boolean);
    method public boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
    method public android.view.View findViewById(int);
    method public void finish();
    method public void finishActivity(int);
@@ -3676,8 +3675,7 @@ package android.app {
    method public void setIntent(android.content.Intent);
    method public final void setMediaController(android.media.session.MediaController);
    method public void setOverlayWithDecorCaptionEnabled(boolean);
    method public void setPictureInPictureActions(java.util.List<android.app.RemoteAction>);
    method public void setPictureInPictureAspectRatio(float);
    method public void setPictureInPictureArgs(android.app.PictureInPictureArgs);
    method public final deprecated void setProgress(int);
    method public final deprecated void setProgressBarIndeterminate(boolean);
    method public final deprecated void setProgressBarIndeterminateVisibility(boolean);
@@ -5544,6 +5542,17 @@ package android.app {
    method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);
  }
  public final class PictureInPictureArgs implements android.os.Parcelable {
    ctor public PictureInPictureArgs();
    ctor public PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
    method public android.app.PictureInPictureArgs clone();
    method public int describeContents();
    method public void setActions(java.util.List<android.app.RemoteAction>);
    method public void setAspectRatio(float);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
  }
  public class Presentation extends android.app.Dialog {
    ctor public Presentation(android.content.Context, android.view.Display);
    ctor public Presentation(android.content.Context, android.view.Display, int);
+27 −52
Original line number Diff line number Diff line
@@ -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) {
        }
    }
+0 −30
Original line number Diff line number Diff line
@@ -63,36 +63,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.
Loading