Merge "Make MediaSession2.CommandGroup updatable"

This commit is contained in:
TreeHugger Robot
2018-01-30 07:58:14 +00:00
committed by Android (Google) Code Review
3 changed files with 52 additions and 81 deletions

View File

@@ -30,20 +30,18 @@ import android.media.session.MediaSession.Callback;
import android.media.session.PlaybackState;
import android.media.update.ApiLoader;
import android.media.update.MediaSession2Provider;
import android.media.update.MediaSession2Provider.CommandGroupProvider;
import android.media.update.MediaSession2Provider.CommandProvider;
import android.media.update.MediaSession2Provider.ControllerInfoProvider;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.IInterface;
import android.os.Parcelable;
import android.os.ResultReceiver;
import android.text.TextUtils;
import android.util.ArraySet;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
@@ -156,14 +154,6 @@ public class MediaSession2 implements AutoCloseable {
return mProvider.toBundle_impl();
}
/**
* @return a new Command instance from the Bundle
* @hide
*/
public static Command fromBundle(@NonNull Context context, Bundle command) {
return ApiLoader.getProvider(context).fromBundle_MediaSession2Command(context, command);
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Command)) {
@@ -176,63 +166,55 @@ public class MediaSession2 implements AutoCloseable {
public int hashCode() {
return mProvider.hashCode_impl();
}
/**
* @return a new Command instance from the Bundle
* @hide
*/
public static Command fromBundle(@NonNull Context context, Bundle command) {
return ApiLoader.getProvider(context).fromBundle_MediaSession2Command(context, command);
}
}
/**
* Represent set of {@link Command}.
*/
// TODO(jaewan): Move this to updatable
public static class CommandGroup {
private static final String KEY_COMMANDS =
"android.media.mediasession2.commandgroup.commands";
private ArraySet<Command> mCommands = new ArraySet<>();
private final Context mContext;
private final CommandGroupProvider mProvider;
public CommandGroup(Context context) {
mContext = context;
mProvider = ApiLoader.getProvider(context)
.createMediaSession2CommandGroup(context, this, null);
}
public CommandGroup(Context context, CommandGroup others) {
this(context);
mCommands.addAll(others.mCommands);
mProvider = ApiLoader.getProvider(context)
.createMediaSession2CommandGroup(context, this, others);
}
public void addCommand(Command command) {
mCommands.add(command);
mProvider.addCommand_impl(command);
}
public void addAllPredefinedCommands() {
// TODO(jaewan): Is there any better way than this?
mCommands.add(new Command(mContext, COMMAND_CODE_PLAYBACK_START));
mCommands.add(new Command(mContext, COMMAND_CODE_PLAYBACK_PAUSE));
mCommands.add(new Command(mContext, COMMAND_CODE_PLAYBACK_STOP));
mCommands.add(new Command(mContext, COMMAND_CODE_PLAYBACK_SKIP_NEXT_ITEM));
mCommands.add(new Command(mContext, COMMAND_CODE_PLAYBACK_SKIP_PREV_ITEM));
mCommands.add(new Command(mContext, COMMAND_CODE_PLAYBACK_PREPARE));
mCommands.add(new Command(mContext, COMMAND_CODE_PLAYBACK_FAST_FORWARD));
mCommands.add(new Command(mContext, COMMAND_CODE_PLAYBACK_REWIND));
mCommands.add(new Command(mContext, COMMAND_CODE_PLAYBACK_SEEK_TO));
mCommands.add(new Command(mContext, COMMAND_CODE_PLAYBACK_SET_CURRENT_PLAYLIST_ITEM));
mProvider.addAllPredefinedCommands_impl();
}
public void removeCommand(Command command) {
mCommands.remove(command);
mProvider.removeCommand_impl(command);
}
public boolean hasCommand(Command command) {
return mCommands.contains(command);
return mProvider.hasCommand_impl(command);
}
public boolean hasCommand(int code) {
if (code == COMMAND_CODE_CUSTOM) {
throw new IllegalArgumentException("Use hasCommand(Command) for custom command");
}
for (int i = 0; i < mCommands.size(); i++) {
if (mCommands.valueAt(i).getCommandCode() == code) {
return true;
}
}
return false;
return mProvider.hasCommand_impl(code);
}
@SystemApi
public CommandGroupProvider getProvider() {
return mProvider;
}
/**
@@ -240,13 +222,7 @@ public class MediaSession2 implements AutoCloseable {
* @hide
*/
public Bundle toBundle() {
ArrayList<Bundle> list = new ArrayList<>();
for (int i = 0; i < mCommands.size(); i++) {
list.add(mCommands.valueAt(i).toBundle());
}
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(KEY_COMMANDS, list);
return bundle;
return mProvider.toBundle_impl();
}
/**
@@ -254,26 +230,8 @@ public class MediaSession2 implements AutoCloseable {
* @hide
*/
public static @Nullable CommandGroup fromBundle(Context context, Bundle commands) {
if (commands == null) {
return null;
}
List<Parcelable> list = commands.getParcelableArrayList(KEY_COMMANDS);
if (list == null) {
return null;
}
CommandGroup commandGroup = new CommandGroup(context);
for (int i = 0; i < list.size(); i++) {
Parcelable parcelable = list.get(i);
if (!(parcelable instanceof Bundle)) {
continue;
}
Bundle commandBundle = (Bundle) parcelable;
Command command = Command.fromBundle(context, commandBundle);
if (command != null) {
commandGroup.addCommand(command);
}
}
return commandGroup;
return ApiLoader.getProvider(context)
.fromBundle_MediaSession2CommandGroup(context, commands);
}
}

View File

@@ -16,7 +16,6 @@
package android.media.update;
import android.media.AudioAttributes;
import android.media.MediaItem2;
import android.media.MediaPlayerInterface;
import android.media.MediaPlayerInterface.PlaybackListener;
@@ -62,14 +61,6 @@ public interface MediaSession2Provider extends TransportControlProvider {
void addPlaybackListener_impl(Executor executor, PlaybackListener listener);
void removePlaybackListener_impl(PlaybackListener listener);
interface ControllerInfoProvider {
String getPackageName_impl();
int getUid_impl();
boolean isTrusted_impl();
int hashCode_impl();
boolean equals_impl(ControllerInfoProvider obj);
}
interface CommandProvider {
int getCommandCode_impl();
String getCustomCommand_impl();
@@ -79,4 +70,21 @@ public interface MediaSession2Provider extends TransportControlProvider {
boolean equals_impl(Object ob);
int hashCode_impl();
}
interface CommandGroupProvider {
void addCommand_impl(Command command);
void addAllPredefinedCommands_impl();
void removeCommand_impl(Command command);
boolean hasCommand_impl(Command command);
boolean hasCommand_impl(int code);
Bundle toBundle_impl();
}
interface ControllerInfoProvider {
String getPackageName_impl();
int getUid_impl();
boolean isTrusted_impl();
int hashCode_impl();
boolean equals_impl(ControllerInfoProvider obj);
}
}

View File

@@ -37,6 +37,7 @@ import android.media.SessionPlayer2;
import android.media.SessionToken2;
import android.media.VolumeProvider;
import android.media.update.MediaLibraryService2Provider.MediaLibrarySessionProvider;
import android.media.update.MediaSession2Provider.CommandGroupProvider;
import android.media.update.MediaSession2Provider.CommandProvider;
import android.media.update.MediaSession2Provider.ControllerInfoProvider;
import android.os.Bundle;
@@ -64,12 +65,16 @@ public interface StaticProvider {
MediaSession2Provider createMediaSession2(Context context, MediaSession2 instance,
MediaPlayerInterface player, String id, VolumeProvider volumeProvider, int ratingType,
PendingIntent sessionActivity, Executor executor, SessionCallback callback);
ControllerInfoProvider createMediaSession2ControllerInfoProvider(Context context,
MediaSession2.ControllerInfo instance, int uid, int pid,
String packageName, IInterface callback);
CommandProvider createMediaSession2Command(MediaSession2.Command instance,
int commandCode, String action, Bundle extra);
MediaSession2.Command fromBundle_MediaSession2Command(Context context, Bundle bundle);
CommandGroupProvider createMediaSession2CommandGroup(Context context,
MediaSession2.CommandGroup instance, MediaSession2.CommandGroup others);
MediaSession2.CommandGroup fromBundle_MediaSession2CommandGroup(Context context, Bundle bundle);
ControllerInfoProvider createMediaSession2ControllerInfoProvider(Context context,
MediaSession2.ControllerInfo instance, int uid, int pid,
String packageName, IInterface callback);
MediaController2Provider createMediaController2(Context context, MediaController2 instance,
SessionToken2 token, Executor executor, ControllerCallback callback);