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

Commit 2e7a9167 authored by RoboErik's avatar RoboErik
Browse files

Adds listeners for changes to the list of active sessions

The listeners get notified when sessions are added, removed, or
reprioritized.

Change-Id: I7f3bfc84049719c3b9c19016c6bac92e1a5c3179
parent 5d3114b6
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -309,6 +309,7 @@ LOCAL_SRC_FILES += \
	media/java/android/media/routeprovider/IRouteConnection.aidl \
	media/java/android/media/routeprovider/IRouteProvider.aidl \
	media/java/android/media/routeprovider/IRouteProviderCallback.aidl \
	media/java/android/media/session/IActiveSessionsListener.aidl \
	media/java/android/media/session/ISessionController.aidl \
	media/java/android/media/session/ISessionControllerCallback.aidl \
	media/java/android/media/session/ISession.aidl \
+26 −0
Original line number Diff line number Diff line
/* Copyright (C) 2014 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.media.session;

import android.media.session.MediaSessionToken;

/**
 * Listens for changes to the list of active sessions.
 * @hide
 */
oneway interface IActiveSessionsListener {
    void onActiveSessionsChanged(in List<MediaSessionToken> sessions);
}
 No newline at end of file
+4 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package android.media.session;

import android.content.ComponentName;
import android.media.session.IActiveSessionsListener;
import android.media.session.ISession;
import android.media.session.ISessionCallback;
import android.os.Bundle;
@@ -30,4 +31,7 @@ interface ISessionManager {
    List<IBinder> getSessions(in ComponentName compName, int userId);
    void dispatchMediaKeyEvent(in KeyEvent keyEvent, boolean needWakeLock);
    void dispatchAdjustVolumeBy(int suggestedStream, int delta, int flags);
    void addSessionsListener(in IActiveSessionsListener listener, in ComponentName compName,
            int userId);
    void removeSessionsListener(in IActiveSessionsListener listener);
}
 No newline at end of file
+75 −0
Original line number Diff line number Diff line
@@ -141,6 +141,50 @@ public final class MediaSessionManager {
        return controllers;
    }

    /**
     * Add a listener to be notified when the list of active sessions
     * changes.This requires the
     * android.Manifest.permission.MEDIA_CONTENT_CONTROL permission be held by
     * the calling app. You may also retrieve this list if your app is an
     * enabled notification listener using the
     * {@link NotificationListenerService} APIs, in which case you must pass the
     * {@link ComponentName} of your enabled listener.
     *
     * @param sessionListener The listener to add.
     * @param notificationListener The enabled notification listener component.
     *            May be null.
     * @param userId The userId to listen for changes on.
     * @hide
     */
    public void addActiveSessionsListener(SessionListener sessionListener,
            ComponentName notificationListener, int userId) {
        if (sessionListener == null) {
            throw new IllegalArgumentException("listener may not be null");
        }
        try {
            mService.addSessionsListener(sessionListener.mStub, notificationListener, userId);
        } catch (RemoteException e) {
            Log.e(TAG, "Error in addActiveSessionsListener.", e);
        }
    }

    /**
     * Stop receiving active sessions updates on the specified listener.
     *
     * @param listener The listener to remove.
     * @hide
     */
    public void removeActiveSessionsListener(SessionListener listener) {
        if (listener == null) {
            throw new IllegalArgumentException("listener may not be null");
        }
        try {
            mService.removeSessionsListener(listener.mStub);
        } catch (RemoteException e) {
            Log.e(TAG, "Error in removeActiveSessionsListener.", e);
        }
    }

    /**
     * Send a media key event. The receiver will be selected automatically.
     *
@@ -184,4 +228,35 @@ public final class MediaSessionManager {
            Log.e(TAG, "Failed to send adjust volume.", e);
        }
    }

    /**
     * Listens for changes to the list of active sessions. This can be added
     * using {@link #addActiveSessionsListener}.
     *
     * @hide
     */
    public static abstract class SessionListener {
        /**
         * Called when the list of active sessions has changed. This can be due
         * to a session being added or removed or the order of sessions
         * changing.
         *
         * @param controllers The updated list of controllers for the user that
         *            changed.
         */
        public abstract void onActiveSessionsChanged(List<MediaController> controllers);

        private final IActiveSessionsListener.Stub mStub = new IActiveSessionsListener.Stub() {
            @Override
            public void onActiveSessionsChanged(List<MediaSessionToken> tokens)
                    throws RemoteException {
                ArrayList<MediaController> controllers = new ArrayList<MediaController>();
                int size = tokens.size();
                for (int i = 0; i < size; i++) {
                    controllers.add(MediaController.fromToken(tokens.get(i)));
                }
                SessionListener.this.onActiveSessionsChanged(controllers);
            }
        };
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ public final class MediaSessionToken implements Parcelable {
    /**
     * @hide
     */
    MediaSessionToken(ISessionController binder) {
    public MediaSessionToken(ISessionController binder) {
        mBinder = binder;
    }

Loading