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

Commit 8cd0ae90 authored by Hyundo Moon's avatar Hyundo Moon
Browse files

Introduce ControllerCallbackLink

In order to avoid direct AIDL usages in framework, this CL introduces a
new public class ControllerCallbackLink which can prevent usages of
ISessionControllerCallback.

Bug: 122337578
Test: make update-api -j / make -j
      atest CtsMediaTestCases:android.media.cts.MediaSessionTest
      atest CtsMediaTestCases:android.media.cts.MediaControllerTest
Change-Id: Id674576aa071b7fdbd0082bf6189fef2af2d919b
parent 871a873d
Loading
Loading
Loading
Loading
+15 −0
Original line number Original line Diff line number Diff line
@@ -27121,6 +27121,21 @@ package android.media.projection {
package android.media.session {
package android.media.session {
  public final class ControllerCallbackLink implements android.os.Parcelable {
    method public int describeContents();
    method public android.os.IBinder getBinder();
    method public void notifyEvent(java.lang.String, android.os.Bundle);
    method public void notifyExtrasChanged(android.os.Bundle);
    method public void notifyMetadataChanged(android.media.MediaMetadata);
    method public void notifyPlaybackStateChanged(android.media.session.PlaybackState);
    method public void notifyQueueChanged(java.util.List<android.media.session.MediaSession.QueueItem>);
    method public void notifyQueueTitleChanged(java.lang.CharSequence);
    method public void notifySessionDestroyed();
    method public void notifyVolumeInfoChanged(android.media.session.MediaController.PlaybackInfo);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.media.session.ControllerCallbackLink> CREATOR;
  }
  public final class MediaController {
  public final class MediaController {
    ctor public MediaController(android.content.Context, android.media.session.MediaSession.Token);
    ctor public MediaController(android.content.Context, android.media.session.MediaSession.Token);
    method public void adjustVolume(int, int);
    method public void adjustVolume(int, int);
+16 −0
Original line number Original line Diff line number Diff line
@@ -3214,6 +3214,22 @@ package android.media.audiopolicy {


package android.media.session {
package android.media.session {


  public final class ControllerCallbackLink implements android.os.Parcelable {
    ctor public ControllerCallbackLink(android.media.session.ControllerCallbackLink.CallbackStub);
  }

  public static abstract class ControllerCallbackLink.CallbackStub {
    ctor public ControllerCallbackLink.CallbackStub();
    method public void onEvent(java.lang.String, android.os.Bundle);
    method public void onExtrasChanged(android.os.Bundle);
    method public void onMetadataChanged(android.media.MediaMetadata);
    method public void onPlaybackStateChanged(android.media.session.PlaybackState);
    method public void onQueueChanged(java.util.List<android.media.session.MediaSession.QueueItem>);
    method public void onQueueTitleChanged(java.lang.CharSequence);
    method public void onSessionDestroyed();
    method public void onVolumeInfoChanged(android.media.session.MediaController.PlaybackInfo);
  }

  public final class MediaSessionManager {
  public final class MediaSessionManager {
    method public void setOnMediaKeyListener(android.media.session.MediaSessionManager.OnMediaKeyListener, android.os.Handler);
    method public void setOnMediaKeyListener(android.media.session.MediaSessionManager.OnMediaKeyListener, android.os.Handler);
    method public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, android.os.Handler);
    method public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, android.os.Handler);
+20 −16
Original line number Original line Diff line number Diff line
@@ -19,12 +19,12 @@ package com.android.commands.media;


import android.app.ActivityManager;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Context;
import android.content.pm.ParceledListSlice;
import android.media.MediaMetadata;
import android.media.MediaMetadata;
import android.media.session.ControllerCallbackLink;
import android.media.session.ISessionController;
import android.media.session.ISessionController;
import android.media.session.ISessionControllerCallback;
import android.media.session.ISessionManager;
import android.media.session.ISessionManager;
import android.media.session.MediaController.PlaybackInfo;
import android.media.session.MediaController.PlaybackInfo;
import android.media.session.MediaSession.QueueItem;
import android.media.session.PlaybackState;
import android.media.session.PlaybackState;
import android.os.Bundle;
import android.os.Bundle;
import android.os.HandlerThread;
import android.os.HandlerThread;
@@ -178,13 +178,7 @@ public class Media extends BaseCommand {
                KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD));
                KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD));
    }
    }


    class ControllerMonitor extends ISessionControllerCallback.Stub {
    class ControllerCallbackStub extends ControllerCallbackLink.CallbackStub {
        private final ISessionController mController;

        public ControllerMonitor(ISessionController controller) {
            mController = controller;
        }

        @Override
        @Override
        public void onSessionDestroyed() {
        public void onSessionDestroyed() {
            System.out.println("onSessionDestroyed. Enter q to quit.");
            System.out.println("onSessionDestroyed. Enter q to quit.");
@@ -208,25 +202,35 @@ public class Media extends BaseCommand {
        }
        }


        @Override
        @Override
        public void onQueueChanged(ParceledListSlice queue) throws RemoteException {
        public void onQueueChanged(List<QueueItem> queue) {
            System.out.println("onQueueChanged, "
            System.out.println("onQueueChanged, "
                    + (queue == null ? "null queue" : " size=" + queue.getList().size()));
                    + (queue == null ? "null queue" : " size=" + queue.size()));
        }
        }


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


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


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

    private class ControllerMonitor {
        private final ISessionController mController;
        private final ControllerCallbackLink mControllerCallbackLink;

        ControllerMonitor(ISessionController controller) {
            mController = controller;
            mControllerCallbackLink = new ControllerCallbackLink(new ControllerCallbackStub());
        }


        void printUsageMessage() {
        void printUsageMessage() {
            try {
            try {
@@ -244,7 +248,7 @@ public class Media extends BaseCommand {
                @Override
                @Override
                protected void onLooperPrepared() {
                protected void onLooperPrepared() {
                    try {
                    try {
                        mController.registerCallbackListener(PACKAGE_NAME, ControllerMonitor.this);
                        mController.registerCallbackListener(PACKAGE_NAME, mControllerCallbackLink);
                    } catch (RemoteException e) {
                    } catch (RemoteException e) {
                        System.out.println("Error registering monitor callback");
                        System.out.println("Error registering monitor callback");
                    }
                    }
@@ -287,7 +291,7 @@ public class Media extends BaseCommand {
            } finally {
            } finally {
                cbThread.getLooper().quit();
                cbThread.getLooper().quit();
                try {
                try {
                    mController.unregisterCallbackListener(this);
                    mController.unregisterCallbackListener(mControllerCallbackLink);
                } catch (Exception e) {
                } catch (Exception e) {
                    // ignoring
                    // ignoring
                }
                }
+1 −1
Original line number Original line Diff line number Diff line
@@ -171,7 +171,7 @@ public final class Session2Token implements Parcelable {
        dest.writeString(mPackageName);
        dest.writeString(mPackageName);
        dest.writeString(mServiceName);
        dest.writeString(mServiceName);
        // TODO: Uncomment below
        // TODO: Uncomment below
        //dest.writeStrongBinder(mSessionLink.asBinder());
        //dest.writeStrongBinder(mSessionLink.getBinder());
        dest.writeString(mComponentName == null ? "" : mComponentName.flattenToString());
        dest.writeString(mComponentName == null ? "" : mComponentName.flattenToString());
    }
    }


+18 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2019 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;

parcelable ControllerCallbackLink;
Loading