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

Commit e0b8c378 authored by RoboErik's avatar RoboErik Committed by Android (Google) Code Review
Browse files

Merge changes I87f551a7,Icb8dc76c,I66fbf585,I0c9506e7 into lmp-dev

* changes:
  Add context to MediaController constructor
  Add getPackageName to MediaController
  Expose a way to set a PendingIntent for restarting playback
  Finish plumbing for launch intents in sessions
parents 30674e91 031149cd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -213,6 +213,7 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framew
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework.* $(PRODUCT_OUT)/system/framework2.*)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/docs/api-stubs-timestamp)

# ******************************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER
+16 −11
Original line number Diff line number Diff line
@@ -14144,10 +14144,10 @@ package android.media {
    method public void loadSoundEffects();
    method public void playSoundEffect(int);
    method public void playSoundEffect(int, float);
    method public void registerMediaButtonEventReceiver(android.content.ComponentName);
    method public void registerMediaButtonEventReceiver(android.app.PendingIntent);
    method public void registerRemoteControlClient(android.media.RemoteControlClient);
    method public boolean registerRemoteController(android.media.RemoteController);
    method public deprecated void registerMediaButtonEventReceiver(android.content.ComponentName);
    method public deprecated void registerMediaButtonEventReceiver(android.app.PendingIntent);
    method public deprecated void registerRemoteControlClient(android.media.RemoteControlClient);
    method public deprecated boolean registerRemoteController(android.media.RemoteController);
    method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
    method public deprecated void setBluetoothA2dpOn(boolean);
    method public void setBluetoothScoOn(boolean);
@@ -14166,10 +14166,10 @@ package android.media {
    method public void startBluetoothSco();
    method public void stopBluetoothSco();
    method public void unloadSoundEffects();
    method public void unregisterMediaButtonEventReceiver(android.content.ComponentName);
    method public void unregisterMediaButtonEventReceiver(android.app.PendingIntent);
    method public void unregisterRemoteControlClient(android.media.RemoteControlClient);
    method public void unregisterRemoteController(android.media.RemoteController);
    method public deprecated void unregisterMediaButtonEventReceiver(android.content.ComponentName);
    method public deprecated void unregisterMediaButtonEventReceiver(android.app.PendingIntent);
    method public deprecated void unregisterRemoteControlClient(android.media.RemoteControlClient);
    method public deprecated void unregisterRemoteController(android.media.RemoteController);
    field public static final java.lang.String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY";
    field public static final deprecated java.lang.String ACTION_SCO_AUDIO_STATE_CHANGED = "android.media.SCO_AUDIO_STATE_CHANGED";
    field public static final java.lang.String ACTION_SCO_AUDIO_STATE_UPDATED = "android.media.ACTION_SCO_AUDIO_STATE_UPDATED";
@@ -16578,14 +16578,16 @@ package android.media.routing {
package android.media.session {
  public final class MediaController {
    ctor public MediaController(android.media.session.MediaSession.Token);
    ctor public MediaController(android.content.Context, android.media.session.MediaSession.Token);
    method public void addCallback(android.media.session.MediaController.Callback);
    method public void addCallback(android.media.session.MediaController.Callback, android.os.Handler);
    method public void adjustVolume(int, int);
    method public android.media.routing.MediaRouter.Delegate createMediaRouterDelegate();
    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
    method public long getFlags();
    method public android.app.PendingIntent getLaunchActivity();
    method public android.media.MediaMetadata getMetadata();
    method public java.lang.String getPackageName();
    method public android.media.session.PlaybackState getPlaybackState();
    method public java.util.List<android.media.session.MediaSession.Track> getQueue();
    method public int getRatingType();
@@ -16639,6 +16641,7 @@ package android.media.session {
    method public void addCallback(android.media.session.MediaSession.Callback, android.os.Handler);
    method public void addTransportControlsCallback(android.media.session.MediaSession.TransportControlsCallback);
    method public void addTransportControlsCallback(android.media.session.MediaSession.TransportControlsCallback, android.os.Handler);
    method public android.media.session.MediaController getController();
    method public android.media.session.MediaSession.Token getSessionToken();
    method public boolean isActive();
    method public void release();
@@ -16648,7 +16651,8 @@ package android.media.session {
    method public void setActive(boolean);
    method public void setExtras(android.os.Bundle);
    method public void setFlags(int);
    method public void setLaunchPendingIntent(android.app.PendingIntent);
    method public void setLaunchActivity(android.app.PendingIntent);
    method public void setMediaButtonReceiver(android.app.PendingIntent);
    method public void setMediaRouter(android.media.routing.MediaRouter);
    method public void setMetadata(android.media.MediaMetadata);
    method public void setPlaybackState(android.media.session.PlaybackState);
@@ -16711,10 +16715,11 @@ package android.media.session {
  public final class MediaSessionManager {
    method public void addActiveSessionsListener(android.media.session.MediaSessionManager.SessionListener, android.content.ComponentName);
    method public java.util.List<android.media.session.MediaController> getActiveSessions(android.content.ComponentName);
    method public void removeActiveSessionsListener(android.media.session.MediaSessionManager.SessionListener);
  }
  public static abstract class MediaSessionManager.SessionListener {
    ctor public MediaSessionManager.SessionListener();
    ctor public MediaSessionManager.SessionListener(android.content.Context);
    method public abstract void onActiveSessionsChanged(java.util.List<android.media.session.MediaController>);
  }
+59 −24
Original line number Diff line number Diff line
@@ -19,16 +19,17 @@ package com.android.commands.media;

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ParceledListSlice;
import android.media.MediaMetadata;
import android.media.session.ISessionController;
import android.media.session.ISessionControllerCallback;
import android.media.session.ISessionManager;
import android.media.session.MediaController;
import android.media.session.MediaSessionInfo;
import android.media.session.ParcelableVolumeInfo;
import android.media.session.PlaybackState;
import android.os.Bundle;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
@@ -62,14 +63,14 @@ public class Media extends BaseCommand {
                "usage: media [subcommand] [options]\n" +
                "       media dispatch KEY\n" +
                "       media list-sessions\n" +
                "       media monitor <sessionId>\n" +
                "       media monitor <tag>\n" +
                "\n" +
                "media dispatch: dispatch a media key to the system.\n" +
                "                KEY may be: play, pause, play-pause, mute, headsethook,\n" +
                "                stop, next, previous, rewind, record, fast-forword.\n" +
                "media list-sessions: print a list of the current sessions.\n" +
                        "media monitor: monitor updates to the specified session.\n" +
                "                       Use the sessionId from list-sessions.\n"
                "                       Use the tag from list-sessions.\n"
        );
    }

@@ -114,14 +115,17 @@ public class Media extends BaseCommand {
            List<IBinder> sessions = mSessionService
                    .getSessions(null, ActivityManager.getCurrentUser());
            for (IBinder session : sessions) {
                MediaController controller = new MediaController(ISessionController.Stub
                        .asInterface(session));
                if (controller != null && controller.getSessionInfo().getId().equals(id)) {
                ISessionController controller = ISessionController.Stub.asInterface(session);
                try {
                    if (controller != null && id.equals(controller.getTag())) {
                        ControllerMonitor monitor = new ControllerMonitor(controller);
                        monitor.run();
                        success = true;
                        break;
                    }
                } catch (RemoteException e) {
                    // ignore
                }
            }
        } catch (Exception e) {
            System.out.println("***Error monitoring session*** " + e.getMessage());
@@ -168,14 +172,14 @@ public class Media extends BaseCommand {
                KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD));
    }

    class ControllerMonitor extends MediaController.Callback {
        private final MediaController mController;
    class ControllerMonitor extends ISessionControllerCallback.Stub {
        private final ISessionController mController;

        public ControllerMonitor(MediaController controller) {
        public ControllerMonitor(ISessionController controller) {
            mController = controller;
        }
        @Override
        public void onSessionEvent(String event, Bundle extras) {
        public void onEvent(String event, Bundle extras) {
            System.out.println("onSessionEvent event=" + event + ", extras=" + extras);
        }

@@ -191,9 +195,33 @@ public class Media extends BaseCommand {
            System.out.println("onMetadataChanged " + mmString);
        }

        @Override
        public void onQueueChanged(ParceledListSlice queue) throws RemoteException {
            System.out.println("onQueueChanged, size=" + queue.getList().size());
        }

        @Override
        public void onQueueTitleChanged(CharSequence title) throws RemoteException {
            System.out.println("onQueueTitleChange " + title);
        }

        @Override
        public void onExtrasChanged(Bundle extras) throws RemoteException {
            System.out.println("onExtrasChanged " + extras);
        }

        @Override
        public void onVolumeInfoChanged(ParcelableVolumeInfo info) throws RemoteException {
            System.out.println("onVolumeInfoChanged " + info);
        }

        void printUsageMessage() {
            System.out.println("V2Monitoring session " + mController.getSessionInfo().getId()
            try {
                System.out.println("V2Monitoring session " + mController.getTag()
                        + "...  available commands:");
            } catch (RemoteException e) {
                System.out.println("Error trying to monitor session!");
            }
            System.out.println("(q)uit: finish monitoring");
        }

@@ -202,7 +230,11 @@ public class Media extends BaseCommand {
            HandlerThread cbThread = new HandlerThread("MediaCb") {
                @Override
                protected void onLooperPrepared() {
                    mController.addCallback(ControllerMonitor.this);
                    try {
                        mController.registerCallbackListener(ControllerMonitor.this);
                    } catch (RemoteException e) {
                        System.out.println("Error registering monitor callback");
                    }
                }
            };
            cbThread.start();
@@ -234,7 +266,7 @@ public class Media extends BaseCommand {
            } finally {
                cbThread.getLooper().quit();
                try {
                    mController.removeCallback(this);
                    mController.unregisterCallbackListener(this);
                } catch (Exception e) {
                    // ignoring
                }
@@ -248,12 +280,15 @@ public class Media extends BaseCommand {
            List<IBinder> sessions = mSessionService
                    .getSessions(null, ActivityManager.getCurrentUser());
            for (IBinder session : sessions) {
                MediaController controller = new MediaController(ISessionController.Stub
                        .asInterface(session));

                ISessionController controller = ISessionController.Stub.asInterface(session);
                if (controller != null) {
                    MediaSessionInfo info = controller.getSessionInfo();
                    System.out.println("  id=" + info.getId() + ", package="
                            + info.getPackageName());
                    try {
                        System.out.println("  tag=" + controller.getTag()
                                + ", package=" + controller.getPackageName());
                    } catch (RemoteException e) {
                        // ignore
                    }
                }
            }
        } catch (Exception e) {
+26 −2
Original line number Diff line number Diff line
@@ -27,7 +27,10 @@ import android.content.Intent;
import android.media.RemoteController.OnClientUpdateListener;
import android.media.audiopolicy.AudioPolicy;
import android.media.audiopolicy.AudioPolicyConfig;
import android.media.session.MediaController;
import android.media.session.MediaSession;
import android.media.session.MediaSessionLegacyHelper;
import android.media.session.MediaSessionManager;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
@@ -2218,7 +2221,9 @@ public class AudioManager {
     *      that will receive the media button intent. This broadcast receiver must be declared
     *      in the application manifest. The package of the component must match that of
     *      the context you're registering from.
     * @deprecated Use {@link MediaSession#setMediaButtonReceiver(PendingIntent)} instead.
     */
    @Deprecated
    public void registerMediaButtonEventReceiver(ComponentName eventReceiver) {
        if (eventReceiver == null) {
            return;
@@ -2244,9 +2249,12 @@ public class AudioManager {
     * you know you will continue running for the full time until unregistering the
     * PendingIntent.
     * @param eventReceiver target that will receive media button intents.  The PendingIntent
     * will be sent as-is when a media button action occurs, with {@link Intent#EXTRA_KEY_EVENT}
     * added and holding the key code of the media button that was pressed.
     * will be sent an {@link Intent#ACTION_MEDIA_BUTTON} event when a media button action
     * occurs, with {@link Intent#EXTRA_KEY_EVENT} added and holding the key code of the
     * media button that was pressed.
     * @deprecated Use {@link MediaSession#setMediaButtonReceiver(PendingIntent)} instead.
     */
    @Deprecated
    public void registerMediaButtonEventReceiver(PendingIntent eventReceiver) {
        if (eventReceiver == null) {
            return;
@@ -2271,7 +2279,9 @@ public class AudioManager {
     * Unregister the receiver of MEDIA_BUTTON intents.
     * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver}
     *      that was registered with {@link #registerMediaButtonEventReceiver(ComponentName)}.
     * @deprecated Use {@link MediaSession} instead.
     */
    @Deprecated
    public void unregisterMediaButtonEventReceiver(ComponentName eventReceiver) {
        if (eventReceiver == null) {
            return;
@@ -2289,7 +2299,9 @@ public class AudioManager {
     * Unregister the receiver of MEDIA_BUTTON intents.
     * @param eventReceiver same PendingIntent that was registed with
     *      {@link #registerMediaButtonEventReceiver(PendingIntent)}.
     * @deprecated Use {@link MediaSession} instead.
     */
    @Deprecated
    public void unregisterMediaButtonEventReceiver(PendingIntent eventReceiver) {
        if (eventReceiver == null) {
            return;
@@ -2311,7 +2323,9 @@ public class AudioManager {
     * @param rcClient The remote control client from which remote controls will receive
     *      information to display.
     * @see RemoteControlClient
     * @deprecated Use {@link MediaSession} instead.
     */
    @Deprecated
    public void registerRemoteControlClient(RemoteControlClient rcClient) {
        if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) {
            return;
@@ -2324,7 +2338,9 @@ public class AudioManager {
     * remote controls.
     * @param rcClient The remote control client to unregister.
     * @see #registerRemoteControlClient(RemoteControlClient)
     * @deprecated Use {@link MediaSession} instead.
     */
    @Deprecated
    public void unregisterRemoteControlClient(RemoteControlClient rcClient) {
        if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) {
            return;
@@ -2342,7 +2358,11 @@ public class AudioManager {
     * @param rctlr the object to register.
     * @return true if the {@link RemoteController} was successfully registered, false if an
     *     error occurred, due to an internal system error, or insufficient permissions.
     * @deprecated Use
     * {@link MediaSessionManager#addActiveSessionsListener(android.media.session.MediaSessionManager.SessionListener, ComponentName)}
     * and {@link MediaController} instead.
     */
    @Deprecated
    public boolean registerRemoteController(RemoteController rctlr) {
        if (rctlr == null) {
            return false;
@@ -2355,7 +2375,11 @@ public class AudioManager {
     * Unregisters a {@link RemoteController}, causing it to no longer receive media metadata and
     * playback state information, and no longer be capable of controlling playback.
     * @param rctlr the object to unregister.
     * @deprecated Use
     * {@link MediaSessionManager#removeActiveSessionsListener(android.media.session.MediaSessionManager.SessionListener)}
     * instead.
     */
    @Deprecated
    public void unregisterRemoteController(RemoteController rctlr) {
        if (rctlr == null) {
            return;
+3 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.format.Time;
import android.util.ArrayMap;
import android.util.Log;
import android.util.SparseArray;
@@ -73,7 +74,8 @@ public final class MediaMetadata implements Parcelable {
    public static final String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";

    /**
     * The date the media was created or published as TODO determine format.
     * The date the media was created or published. The format is unspecified
     * but RFC 3339 is recommended.
     */
    public static final String METADATA_KEY_DATE = "android.media.metadata.DATE";

Loading