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

Commit 8a501874 authored by Jaewan Kim's avatar Jaewan Kim
Browse files

MediaSession2: Move MediaSession2.CommandButton to updatable

Bug: 72665718
Test: Run all MediaComponents test once
Change-Id: I2a02d8fc20a73051424baada8f513196925da582
parent 6b1c183e
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ import android.os.ResultReceiver;
import android.support.annotation.GuardedBy;
import android.util.Log;

import com.android.media.MediaSession2Impl.CommandButtonImpl;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
@@ -650,7 +652,7 @@ public class MediaController2Impl implements MediaController2Provider {
            }
            List<CommandButton> layout = new ArrayList<>();
            for (int i = 0; i < commandButtonlist.size(); i++) {
                CommandButton button = CommandButton.fromBundle(
                CommandButton button = CommandButtonImpl.fromBundle(
                        browser.getContext(), commandButtonlist.get(i));
                if (button != null) {
                    layout.add(button);
+152 −3
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.media;

import static android.media.MediaSession2.COMMAND_CODE_CUSTOM;
import static android.media.SessionToken2.TYPE_LIBRARY_SERVICE;
import static android.media.SessionToken2.TYPE_SESSION;
import static android.media.SessionToken2.TYPE_SESSION_SERVICE;
@@ -50,6 +51,7 @@ import android.media.SessionToken2;
import android.media.VolumeProvider;
import android.media.session.MediaSessionManager;
import android.media.update.MediaSession2Provider;
import android.media.update.MediaSession2Provider.CommandButtonProvider;
import android.os.Bundle;
import android.os.Parcelable;
import android.os.Process;
@@ -550,7 +552,7 @@ public class MediaSession2Impl implements MediaSession2Provider {
                throw new IllegalArgumentException("action shouldn't be null");
            }
            mInstance = instance;
            mCommandCode = MediaSession2.COMMAND_CODE_CUSTOM;
            mCommandCode = COMMAND_CODE_CUSTOM;
            mCustomCommand = action;
            mExtra = extra;
        }
@@ -583,7 +585,7 @@ public class MediaSession2Impl implements MediaSession2Provider {
         */
        public static Command fromBundle_impl(Context context, Bundle command) {
            int code = command.getInt(KEY_COMMAND_CODE);
            if (code != MediaSession2.COMMAND_CODE_CUSTOM) {
            if (code != COMMAND_CODE_CUSTOM) {
                return new Command(context, code);
            } else {
                String customCommand = command.getString(KEY_COMMAND_CUSTOM_COMMAND);
@@ -657,7 +659,7 @@ public class MediaSession2Impl implements MediaSession2Provider {

        @Override
        public boolean hasCommand_impl(int code) {
            if (code == MediaSession2.COMMAND_CODE_CUSTOM) {
            if (code == COMMAND_CODE_CUSTOM) {
                throw new IllegalArgumentException("Use hasCommand(Command) for custom command");
            }
            for (int i = 0; i < mCommands.size(); i++) {
@@ -876,6 +878,153 @@ public class MediaSession2Impl implements MediaSession2Provider {
        }
    }

    public static class CommandButtonImpl implements CommandButtonProvider {
        private static final String KEY_COMMAND
                = "android.media.media_session2.command_button.command";
        private static final String KEY_ICON_RES_ID
                = "android.media.media_session2.command_button.icon_res_id";
        private static final String KEY_DISPLAY_NAME
                = "android.media.media_session2.command_button.display_name";
        private static final String KEY_EXTRA
                = "android.media.media_session2.command_button.extra";
        private static final String KEY_ENABLED
                = "android.media.media_session2.command_button.enabled";

        private final CommandButton mInstance;
        private Command mCommand;
        private int mIconResId;
        private String mDisplayName;
        private Bundle mExtra;
        private boolean mEnabled;

        public CommandButtonImpl(Context context, @Nullable Command command, int iconResId,
                @Nullable String displayName, Bundle extra, boolean enabled) {
            mCommand = command;
            mIconResId = iconResId;
            mDisplayName = displayName;
            mExtra = extra;
            mEnabled = enabled;
            mInstance = new CommandButton(this);
        }

        @Override
        public @Nullable Command getCommand_impl() {
            return mCommand;
        }

        @Override
        public int getIconResId_impl() {
            return mIconResId;
        }

        @Override
        public @Nullable String getDisplayName_impl() {
            return mDisplayName;
        }

        @Override
        public @Nullable Bundle getExtra_impl() {
            return mExtra;
        }

        @Override
        public boolean isEnabled_impl() {
            return mEnabled;
        }

        public @NonNull Bundle toBundle() {
            Bundle bundle = new Bundle();
            bundle.putBundle(KEY_COMMAND, mCommand.toBundle());
            bundle.putInt(KEY_ICON_RES_ID, mIconResId);
            bundle.putString(KEY_DISPLAY_NAME, mDisplayName);
            bundle.putBundle(KEY_EXTRA, mExtra);
            bundle.putBoolean(KEY_ENABLED, mEnabled);
            return bundle;
        }

        public static @Nullable CommandButton fromBundle(Context context, Bundle bundle) {
            if (bundle == null) {
                return null;
            }
            CommandButton.Builder builder = new CommandButton.Builder(context);
            builder.setCommand(Command.fromBundle(context, bundle.getBundle(KEY_COMMAND)));
            builder.setIconResId(bundle.getInt(KEY_ICON_RES_ID, 0));
            builder.setDisplayName(bundle.getString(KEY_DISPLAY_NAME));
            builder.setExtra(bundle.getBundle(KEY_EXTRA));
            builder.setEnabled(bundle.getBoolean(KEY_ENABLED));
            try {
                return builder.build();
            } catch (IllegalStateException e) {
                // Malformed or version mismatch. Return null for now.
                return null;
            }
        }

        /**
         * Builder for {@link CommandButton}.
         */
        public static class BuilderImpl implements CommandButtonProvider.BuilderProvider {
            private final Context mContext;
            private final CommandButton.Builder mInstance;
            private Command mCommand;
            private int mIconResId;
            private String mDisplayName;
            private Bundle mExtra;
            private boolean mEnabled;

            public BuilderImpl(Context context, CommandButton.Builder instance) {
                mContext = context;
                mInstance = instance;
                mEnabled = true;
            }

            @Override
            public CommandButton.Builder setCommand_impl(Command command) {
                mCommand = command;
                return mInstance;
            }

            @Override
            public CommandButton.Builder setIconResId_impl(int resId) {
                mIconResId = resId;
                return mInstance;
            }

            @Override
            public CommandButton.Builder setDisplayName_impl(String displayName) {
                mDisplayName = displayName;
                return mInstance;
            }

            @Override
            public CommandButton.Builder setEnabled_impl(boolean enabled) {
                mEnabled = enabled;
                return mInstance;
            }

            @Override
            public CommandButton.Builder setExtra_impl(Bundle extra) {
                mExtra = extra;
                return mInstance;
            }

            @Override
            public CommandButton build_impl() {
                if (mEnabled && mCommand == null) {
                    throw new IllegalStateException("Enabled button needs Command"
                            + " for controller to invoke the command");
                }
                if (mCommand != null && mCommand.getCommandCode() == COMMAND_CODE_CUSTOM
                        && (mIconResId == 0 || TextUtils.isEmpty(mDisplayName))) {
                    throw new IllegalStateException("Custom commands needs icon and"
                            + " and name to display");
                }
                return new CommandButtonImpl(
                        mContext, mCommand, mIconResId, mDisplayName, mExtra, mEnabled).mInstance;
            }
        }
    }

    public static abstract class BuilderBaseImpl<T extends MediaSession2, C extends SessionCallback>
            implements BuilderBaseProvider<T, C> {
        final Context mContext;
+3 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.media.MediaSession2.CommandGroup;
import android.media.MediaSession2.ControllerInfo;
import android.media.MediaSession2.PlaylistParams;
import android.media.PlaybackState2;
import android.media.update.MediaSession2Provider.CommandButtonProvider;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
@@ -36,6 +37,7 @@ import android.support.annotation.GuardedBy;
import android.util.ArrayMap;
import android.util.Log;

import com.android.media.MediaSession2Impl.CommandButtonImpl;
import com.android.media.MediaSession2Impl.ControllerInfoImpl;

import java.lang.ref.WeakReference;
@@ -336,7 +338,7 @@ public class MediaSession2Stub extends IMediaSession2.Stub {
        try {
            List<Bundle> layoutBundles = new ArrayList<>();
            for (int i = 0; i < layout.size(); i++) {
                Bundle bundle = layout.get(i).toBundle();
                Bundle bundle = ((CommandButtonImpl) layout.get(i).getProvider()).toBundle();
                if (bundle != null) {
                    layoutBundles.add(bundle);
                }
+8 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.media.MediaMetadata2;
import android.media.MediaPlayerInterface;
import android.media.MediaSession2;
import android.media.MediaSession2.Command;
import android.media.MediaSession2.CommandButton.Builder;
import android.media.MediaSession2.CommandGroup;
import android.media.MediaSession2.ControllerInfo;
import android.media.MediaSession2.PlaylistParams;
@@ -52,6 +53,7 @@ import android.media.update.MediaItem2Provider;
import android.media.update.MediaMetadata2Provider;
import android.media.update.MediaSession2Provider;
import android.media.update.MediaSession2Provider.BuilderBaseProvider;
import android.media.update.MediaSession2Provider.CommandButtonProvider.BuilderProvider;
import android.media.update.MediaSession2Provider.PlaylistParamsProvider;
import android.media.update.MediaSessionService2Provider;
import android.media.update.MediaSessionService2Provider.MediaNotificationProvider;
@@ -154,6 +156,12 @@ public class ApiFactory implements StaticProvider {
        return PlaylistParamsImpl.fromBundle(context, bundle);
    }

    @Override
    public BuilderProvider createMediaSession2CommandButtonBuilder(Context context,
            Builder instance) {
        return new MediaSession2Impl.CommandButtonImpl.BuilderImpl(context, instance);
    }

    public BuilderBaseProvider<MediaSession2, SessionCallback> createMediaSession2Builder(
            Context context, MediaSession2.Builder instance, MediaPlayerInterface player) {
        return new MediaSession2Impl.BuilderImpl(context, instance, player);