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

Commit 9c2a6867 authored by Winson Chung's avatar Winson Chung
Browse files

Modifying RemoteAction callback to PendingIntent.

Test: android.server.cts.ActivityManagerPinnedStackTests
Bug: 34864798
Change-Id: I89a5184c2f067722cb1f5f962bbb8cbb91529092
parent f9008716
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -5655,10 +5655,11 @@ package android.app {
  }
  public final class RemoteAction implements android.os.Parcelable {
    ctor public RemoteAction(android.graphics.drawable.Icon, java.lang.CharSequence, java.lang.CharSequence, android.app.RemoteAction.OnActionListener);
    ctor public RemoteAction(android.graphics.drawable.Icon, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
    method public android.app.RemoteAction clone();
    method public int describeContents();
    method public void dump(java.lang.String, java.io.PrintWriter);
    method public android.app.PendingIntent getActionIntent();
    method public java.lang.CharSequence getContentDescription();
    method public android.graphics.drawable.Icon getIcon();
    method public java.lang.CharSequence getTitle();
@@ -5666,10 +5667,6 @@ package android.app {
    field public static final android.os.Parcelable.Creator<android.app.RemoteAction> CREATOR;
  }
  public static abstract interface RemoteAction.OnActionListener {
    method public abstract void onAction(android.app.RemoteAction);
  }
  public final class RemoteInput implements android.os.Parcelable {
    method public static void addDataResultToIntent(android.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String, android.net.Uri>);
    method public static void addResultsToIntent(android.app.RemoteInput[], android.content.Intent, android.os.Bundle);
+2 −5
Original line number Diff line number Diff line
@@ -5851,10 +5851,11 @@ package android.app {
  }
  public final class RemoteAction implements android.os.Parcelable {
    ctor public RemoteAction(android.graphics.drawable.Icon, java.lang.CharSequence, java.lang.CharSequence, android.app.RemoteAction.OnActionListener);
    ctor public RemoteAction(android.graphics.drawable.Icon, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
    method public android.app.RemoteAction clone();
    method public int describeContents();
    method public void dump(java.lang.String, java.io.PrintWriter);
    method public android.app.PendingIntent getActionIntent();
    method public java.lang.CharSequence getContentDescription();
    method public android.graphics.drawable.Icon getIcon();
    method public java.lang.CharSequence getTitle();
@@ -5862,10 +5863,6 @@ package android.app {
    field public static final android.os.Parcelable.Creator<android.app.RemoteAction> CREATOR;
  }
  public static abstract interface RemoteAction.OnActionListener {
    method public abstract void onAction(android.app.RemoteAction);
  }
  public final class RemoteInput implements android.os.Parcelable {
    method public static void addDataResultToIntent(android.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String, android.net.Uri>);
    method public static void addResultsToIntent(android.app.RemoteInput[], android.content.Intent, android.os.Bundle);
+2 −5
Original line number Diff line number Diff line
@@ -5666,10 +5666,11 @@ package android.app {
  }
  public final class RemoteAction implements android.os.Parcelable {
    ctor public RemoteAction(android.graphics.drawable.Icon, java.lang.CharSequence, java.lang.CharSequence, android.app.RemoteAction.OnActionListener);
    ctor public RemoteAction(android.graphics.drawable.Icon, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
    method public android.app.RemoteAction clone();
    method public int describeContents();
    method public void dump(java.lang.String, java.io.PrintWriter);
    method public android.app.PendingIntent getActionIntent();
    method public java.lang.CharSequence getContentDescription();
    method public android.graphics.drawable.Icon getIcon();
    method public java.lang.CharSequence getTitle();
@@ -5677,10 +5678,6 @@ package android.app {
    field public static final android.os.Parcelable.Creator<android.app.RemoteAction> CREATOR;
  }
  public static abstract interface RemoteAction.OnActionListener {
    method public abstract void onAction(android.app.RemoteAction);
  }
  public final class RemoteInput implements android.os.Parcelable {
    method public static void addDataResultToIntent(android.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String, android.net.Uri>);
    method public static void addResultsToIntent(android.app.RemoteInput[], android.content.Intent, android.os.Bundle);
+11 −42
Original line number Diff line number Diff line
@@ -35,55 +35,30 @@ import java.io.PrintWriter;
 */
public final class RemoteAction implements Parcelable {

    /**
     * Interface definition for a callback to be invoked when an action is invoked.
     */
    public interface OnActionListener {
        /**
         * Called when the associated action is invoked.
         *
         * @param action The action that was invoked.
         */
        void onAction(RemoteAction action);
    }

    private static final String TAG = "RemoteAction";

    private static final int MESSAGE_ACTION_INVOKED = 1;

    private final Icon mIcon;
    private final CharSequence mTitle;
    private final CharSequence mContentDescription;
    private OnActionListener mActionCallback;
    private final Messenger mMessenger;
    private final PendingIntent mActionIntent;

    RemoteAction(Parcel in) {
        mIcon = Icon.CREATOR.createFromParcel(in);
        mTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
        mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
        mMessenger = in.readParcelable(Messenger.class.getClassLoader());
        mActionIntent = PendingIntent.CREATOR.createFromParcel(in);
    }

    public RemoteAction(@NonNull Icon icon, @NonNull CharSequence title,
            @NonNull CharSequence contentDescription, @NonNull OnActionListener callback) {
        if (icon == null || title == null || contentDescription == null || callback == null) {
            @NonNull CharSequence contentDescription, @NonNull PendingIntent intent) {
        if (icon == null || title == null || contentDescription == null || intent == null) {
            throw new IllegalArgumentException("Expected icon, title, content description and " +
                    "action callback");
        }
        mIcon = icon;
        mTitle = title;
        mContentDescription = contentDescription;
        mActionCallback = callback;
        mMessenger = new Messenger(new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MESSAGE_ACTION_INVOKED:
                        mActionCallback.onAction(RemoteAction.this);
                        break;
                }
            }
        });
        mActionIntent = intent;
    }

    /**
@@ -108,22 +83,15 @@ public final class RemoteAction implements Parcelable {
    }

    /**
     * Sends a message that the action was invoked.
     * @hide
     * Return the action intent.
     */
    public void sendActionInvoked() {
        Message m = Message.obtain();
        m.what = MESSAGE_ACTION_INVOKED;
        try {
            mMessenger.send(m);
        } catch (RemoteException e) {
            Log.e(TAG, "Could not send action-invoked", e);
        }
    public @NonNull PendingIntent getActionIntent() {
        return mActionIntent;
    }

    @Override
    public RemoteAction clone() {
        return new RemoteAction(mIcon, mTitle, mContentDescription, mActionCallback);
        return new RemoteAction(mIcon, mTitle, mContentDescription, mActionIntent);
    }

    @Override
@@ -136,7 +104,7 @@ public final class RemoteAction implements Parcelable {
        mIcon.writeToParcel(out, 0);
        TextUtils.writeToParcel(mTitle, out, flags);
        TextUtils.writeToParcel(mContentDescription, out, flags);
        out.writeParcelable(mMessenger, flags);
        mActionIntent.writeToParcel(out, flags);
    }

    public void dump(String prefix, PrintWriter pw) {
@@ -144,6 +112,7 @@ public final class RemoteAction implements Parcelable {
        pw.print("title=" + mTitle);
        pw.print(" contentDescription=" + mContentDescription);
        pw.print(" icon=" + mIcon);
        pw.print(" action=" + mActionIntent.getIntent());
        pw.println();
    }

+30 −2
Original line number Diff line number Diff line
@@ -16,16 +16,23 @@

package com.android.systemui.pip.phone;

import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;

import android.app.IActivityManager;
import android.app.PendingIntent;
import android.app.RemoteAction;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.drawable.Icon;
import android.media.session.MediaController;
import android.media.session.MediaController.TransportControls;
import android.media.session.MediaSession;
import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState;
import android.os.UserHandle;

import com.android.systemui.R;

@@ -40,6 +47,9 @@ import java.util.List;
 */
public class PipMediaController {

    private static final String ACTION_PLAY = "com.android.systemui.pip.phone.PLAY";
    private static final String ACTION_PAUSE = "com.android.systemui.pip.phone.PAUSE";

    /**
     * A listener interface to receive notification on changes to the media actions.
     */
@@ -59,6 +69,18 @@ public class PipMediaController {
    private RemoteAction mPauseAction;
    private RemoteAction mPlayAction;

    private BroadcastReceiver mPlayPauseActionReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (action.equals(ACTION_PLAY)) {
                mMediaController.getTransportControls().play();
            } else if (action.equals(ACTION_PAUSE)) {
                mMediaController.getTransportControls().pause();
            }
        }
    };

    private MediaController.Callback mPlaybackChangedListener = new MediaController.Callback() {
        @Override
        public void onPlaybackStateChanged(PlaybackState state) {
@@ -73,6 +95,10 @@ public class PipMediaController {
    public PipMediaController(Context context, IActivityManager activityManager) {
        mContext = context;
        mActivityManager = activityManager;
        IntentFilter mediaControlFilter = new IntentFilter();
        mediaControlFilter.addAction(ACTION_PLAY);
        mediaControlFilter.addAction(ACTION_PAUSE);
        mContext.registerReceiver(mPlayPauseActionReceiver, mediaControlFilter);

        createMediaActions();
        mMediaSessionManager =
@@ -135,12 +161,14 @@ public class PipMediaController {
        String pauseDescription = mContext.getString(R.string.pip_pause);
        mPauseAction = new RemoteAction(Icon.createWithResource(mContext,
                R.drawable.ic_pause_white_24dp), pauseDescription, pauseDescription,
                action -> mMediaController.getTransportControls().pause());
                        PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_PAUSE),
                                FLAG_UPDATE_CURRENT));

        String playDescription = mContext.getString(R.string.pip_play);
        mPlayAction = new RemoteAction(Icon.createWithResource(mContext,
                R.drawable.ic_play_arrow_white_24dp), playDescription, playDescription,
                action -> mMediaController.getTransportControls().play());
                        PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_PLAY),
                                FLAG_UPDATE_CURRENT));
    }

    /**
Loading