soul-browser/sources/java/android/support/v4/media/session/PlaybackStateCompat.java
KaKi87 550ddb0413
Decompile and recreate Soul Browser v1.4.85 with APK CI builds (#1)
* Decompile and recreate Soul Browser v1.4.85 with APK CI builds

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix CI build: include bundled google.jks and remove PR trigger

The apktool build failed in CI because app/unknown/.../google.jks was
excluded by the *.jks gitignore rule. Whitelist app-bundled JKS files
and commit the missing resource.

Also remove the redundant pull_request workflow trigger.

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Change package ID to com.github.kaki87.soulbrowser

Rename the application ID so the rebuilt APK can be installed
alongside the original Soul Browser from Google Play.

- Update AndroidManifest package, permissions, providers, and actions
- Update R class references in smali (com/github/kaki87/soulbrowser/R)
- Update shortcuts.xml targetPackage
- Rename app label to "Soul Rebuild" for easy identification

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix install compatibility: remove split APK metadata and bundle native libs

The rebuilt APK still declared requiredSplitTypes and Play Store split
metadata, causing Android to reject standalone installs as incompatible.

- Remove requiredSplitTypes and split-related manifest meta-data
- Merge native libs from all ABI splits with uncompressed storage
- Page-align before signing for extractNativeLibs=false
- Add .so to apktool doNotCompress list

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix install failure: use apksigner v2/v3 and bundle arm64 native libs

Target SDK 36 requires APK Signature Scheme v2+, but jarsigner only
produces v1 signatures, causing Android to reject the install.

- Sign with apksigner (v1+v2+v3) instead of jarsigner
- Add arm64-v8a native libraries from universal Soul Browser 1.4.79
- Set extractNativeLibs=true for reliable sideload installs
- Commit stable debug keystore for consistent signatures across builds

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Add committed debug keystore for consistent APK signatures

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix startup crash: use original classes2.dex desugar libraries

Apktool recompiles smali_classes2 into a broken classes2.dex, causing
ClassNotFoundException for j$.com.android.tools.r8.a at ML Kit init.

Inject the original classes2.dex (Java 8+ desugar libs) after apktool
build instead of using the recompiled version.

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix missing drawable resources from density split APKs

The base APK is an app bundle module; density-specific drawables like
seek_thumb_nor_b live in config.xhdpi.apk and were missing after rebuild,
causing Resources$NotFoundException at runtime.

- Merge non-9-patch resources from split APKs before apktool build
- Sync public.xml IDs from R smali only when backing files exist
- Add 713 density-specific resource IDs to public.xml

Co-authored-by: KaKi87 <KaKi87@pm.me>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-10 16:07:14 +02:00

700 lines
25 KiB
Java

package android.support.v4.media.session;
import android.annotation.SuppressLint;
import android.media.session.PlaybackState;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
import android.text.TextUtils;
import androidx.annotation.DoNotInline;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@SuppressLint({"BanParcelableUsage"})
/* loaded from: classes.dex */
public final class PlaybackStateCompat implements Parcelable {
public static final long ACTION_FAST_FORWARD = 64;
public static final long ACTION_PAUSE = 2;
public static final long ACTION_PLAY = 4;
public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024;
public static final long ACTION_PLAY_FROM_SEARCH = 2048;
public static final long ACTION_PLAY_FROM_URI = 8192;
public static final long ACTION_PLAY_PAUSE = 512;
public static final long ACTION_PREPARE = 16384;
public static final long ACTION_PREPARE_FROM_MEDIA_ID = 32768;
public static final long ACTION_PREPARE_FROM_SEARCH = 65536;
public static final long ACTION_PREPARE_FROM_URI = 131072;
public static final long ACTION_REWIND = 8;
public static final long ACTION_SEEK_TO = 256;
public static final long ACTION_SET_CAPTIONING_ENABLED = 1048576;
public static final long ACTION_SET_PLAYBACK_SPEED = 4194304;
public static final long ACTION_SET_RATING = 128;
public static final long ACTION_SET_REPEAT_MODE = 262144;
public static final long ACTION_SET_SHUFFLE_MODE = 2097152;
@Deprecated
public static final long ACTION_SET_SHUFFLE_MODE_ENABLED = 524288;
public static final long ACTION_SKIP_TO_NEXT = 32;
public static final long ACTION_SKIP_TO_PREVIOUS = 16;
public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096;
public static final long ACTION_STOP = 1;
public static final Parcelable.Creator<PlaybackStateCompat> CREATOR = new Parcelable.Creator<PlaybackStateCompat>() { // from class: android.support.v4.media.session.PlaybackStateCompat.1
/* JADX WARN: Can't rename method to resolve collision */
@Override // android.os.Parcelable.Creator
public PlaybackStateCompat createFromParcel(Parcel parcel) {
return new PlaybackStateCompat(parcel);
}
/* JADX WARN: Can't rename method to resolve collision */
@Override // android.os.Parcelable.Creator
public PlaybackStateCompat[] newArray(int i) {
return new PlaybackStateCompat[i];
}
};
public static final int ERROR_CODE_ACTION_ABORTED = 10;
public static final int ERROR_CODE_APP_ERROR = 1;
public static final int ERROR_CODE_AUTHENTICATION_EXPIRED = 3;
public static final int ERROR_CODE_CONCURRENT_STREAM_LIMIT = 5;
public static final int ERROR_CODE_CONTENT_ALREADY_PLAYING = 8;
public static final int ERROR_CODE_END_OF_QUEUE = 11;
public static final int ERROR_CODE_NOT_AVAILABLE_IN_REGION = 7;
public static final int ERROR_CODE_NOT_SUPPORTED = 2;
public static final int ERROR_CODE_PARENTAL_CONTROL_RESTRICTED = 6;
public static final int ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED = 4;
public static final int ERROR_CODE_SKIP_LIMIT_REACHED = 9;
public static final int ERROR_CODE_UNKNOWN_ERROR = 0;
private static final int KEYCODE_MEDIA_PAUSE = 127;
private static final int KEYCODE_MEDIA_PLAY = 126;
public static final long PLAYBACK_POSITION_UNKNOWN = -1;
public static final int REPEAT_MODE_ALL = 2;
public static final int REPEAT_MODE_GROUP = 3;
public static final int REPEAT_MODE_INVALID = -1;
public static final int REPEAT_MODE_NONE = 0;
public static final int REPEAT_MODE_ONE = 1;
public static final int SHUFFLE_MODE_ALL = 1;
public static final int SHUFFLE_MODE_GROUP = 2;
public static final int SHUFFLE_MODE_INVALID = -1;
public static final int SHUFFLE_MODE_NONE = 0;
public static final int STATE_BUFFERING = 6;
public static final int STATE_CONNECTING = 8;
public static final int STATE_ERROR = 7;
public static final int STATE_FAST_FORWARDING = 4;
public static final int STATE_NONE = 0;
public static final int STATE_PAUSED = 2;
public static final int STATE_PLAYING = 3;
public static final int STATE_REWINDING = 5;
public static final int STATE_SKIPPING_TO_NEXT = 10;
public static final int STATE_SKIPPING_TO_PREVIOUS = 9;
public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11;
public static final int STATE_STOPPED = 1;
final long mActions;
final long mActiveItemId;
final long mBufferedPosition;
List<CustomAction> mCustomActions;
final int mErrorCode;
final CharSequence mErrorMessage;
final Bundle mExtras;
final long mPosition;
final float mSpeed;
final int mState;
private PlaybackState mStateFwk;
final long mUpdateTime;
@Retention(RetentionPolicy.SOURCE)
@RestrictTo
/* loaded from: classes.dex */
public @interface Actions {
}
@RequiresApi
/* loaded from: classes.dex */
public static class Api21Impl {
private Api21Impl() {
}
@DoNotInline
public static void addCustomAction(PlaybackState.Builder builder, PlaybackState.CustomAction customAction) {
builder.addCustomAction(customAction);
}
@DoNotInline
public static PlaybackState build(PlaybackState.Builder builder) {
return builder.build();
}
@DoNotInline
public static PlaybackState.Builder createBuilder() {
return new PlaybackState.Builder();
}
@DoNotInline
public static PlaybackState.CustomAction.Builder createCustomActionBuilder(String str, CharSequence charSequence, int i) {
return new PlaybackState.CustomAction.Builder(str, charSequence, i);
}
@DoNotInline
public static String getAction(PlaybackState.CustomAction customAction) {
return customAction.getAction();
}
@DoNotInline
public static long getActions(PlaybackState playbackState) {
return playbackState.getActions();
}
@DoNotInline
public static long getActiveQueueItemId(PlaybackState playbackState) {
return playbackState.getActiveQueueItemId();
}
@DoNotInline
public static long getBufferedPosition(PlaybackState playbackState) {
return playbackState.getBufferedPosition();
}
@DoNotInline
public static List<PlaybackState.CustomAction> getCustomActions(PlaybackState playbackState) {
return playbackState.getCustomActions();
}
@DoNotInline
public static CharSequence getErrorMessage(PlaybackState playbackState) {
return playbackState.getErrorMessage();
}
@DoNotInline
public static Bundle getExtras(PlaybackState.CustomAction customAction) {
return customAction.getExtras();
}
@DoNotInline
public static int getIcon(PlaybackState.CustomAction customAction) {
return customAction.getIcon();
}
@DoNotInline
public static long getLastPositionUpdateTime(PlaybackState playbackState) {
return playbackState.getLastPositionUpdateTime();
}
@DoNotInline
public static CharSequence getName(PlaybackState.CustomAction customAction) {
return customAction.getName();
}
@DoNotInline
public static float getPlaybackSpeed(PlaybackState playbackState) {
return playbackState.getPlaybackSpeed();
}
@DoNotInline
public static long getPosition(PlaybackState playbackState) {
return playbackState.getPosition();
}
@DoNotInline
public static int getState(PlaybackState playbackState) {
return playbackState.getState();
}
@DoNotInline
public static void setActions(PlaybackState.Builder builder, long j) {
builder.setActions(j);
}
@DoNotInline
public static void setActiveQueueItemId(PlaybackState.Builder builder, long j) {
builder.setActiveQueueItemId(j);
}
@DoNotInline
public static void setBufferedPosition(PlaybackState.Builder builder, long j) {
builder.setBufferedPosition(j);
}
@DoNotInline
public static void setErrorMessage(PlaybackState.Builder builder, CharSequence charSequence) {
builder.setErrorMessage(charSequence);
}
@DoNotInline
public static void setExtras(PlaybackState.CustomAction.Builder builder, Bundle bundle) {
builder.setExtras(bundle);
}
@DoNotInline
public static void setState(PlaybackState.Builder builder, int i, long j, float f, long j2) {
builder.setState(i, j, f, j2);
}
@DoNotInline
public static PlaybackState.CustomAction build(PlaybackState.CustomAction.Builder builder) {
return builder.build();
}
}
@RequiresApi
/* loaded from: classes.dex */
public static class Api22Impl {
private Api22Impl() {
}
@DoNotInline
public static Bundle getExtras(PlaybackState playbackState) {
return playbackState.getExtras();
}
@DoNotInline
public static void setExtras(PlaybackState.Builder builder, Bundle bundle) {
builder.setExtras(bundle);
}
}
/* loaded from: classes.dex */
public static final class Builder {
private long mActions;
private long mActiveItemId;
private long mBufferedPosition;
private final List<CustomAction> mCustomActions;
private int mErrorCode;
private CharSequence mErrorMessage;
private Bundle mExtras;
private long mPosition;
private float mRate;
private int mState;
private long mUpdateTime;
public Builder() {
this.mCustomActions = new ArrayList();
this.mActiveItemId = -1L;
}
public Builder addCustomAction(String str, String str2, int i) {
return addCustomAction(new CustomAction(str, str2, i, null));
}
public PlaybackStateCompat build() {
return new PlaybackStateCompat(this.mState, this.mPosition, this.mBufferedPosition, this.mRate, this.mActions, this.mErrorCode, this.mErrorMessage, this.mUpdateTime, this.mCustomActions, this.mActiveItemId, this.mExtras);
}
public Builder setActions(long j) {
this.mActions = j;
return this;
}
public Builder setActiveQueueItemId(long j) {
this.mActiveItemId = j;
return this;
}
public Builder setBufferedPosition(long j) {
this.mBufferedPosition = j;
return this;
}
@Deprecated
public Builder setErrorMessage(CharSequence charSequence) {
this.mErrorMessage = charSequence;
return this;
}
public Builder setExtras(Bundle bundle) {
this.mExtras = bundle;
return this;
}
public Builder setState(int i, long j, float f) {
return setState(i, j, f, SystemClock.elapsedRealtime());
}
public Builder addCustomAction(CustomAction customAction) {
if (customAction != null) {
this.mCustomActions.add(customAction);
return this;
}
throw new IllegalArgumentException("You may not add a null CustomAction to PlaybackStateCompat");
}
public Builder setErrorMessage(int i, CharSequence charSequence) {
this.mErrorCode = i;
this.mErrorMessage = charSequence;
return this;
}
public Builder setState(int i, long j, float f, long j2) {
this.mState = i;
this.mPosition = j;
this.mUpdateTime = j2;
this.mRate = f;
return this;
}
public Builder(PlaybackStateCompat playbackStateCompat) {
ArrayList arrayList = new ArrayList();
this.mCustomActions = arrayList;
this.mActiveItemId = -1L;
this.mState = playbackStateCompat.mState;
this.mPosition = playbackStateCompat.mPosition;
this.mRate = playbackStateCompat.mSpeed;
this.mUpdateTime = playbackStateCompat.mUpdateTime;
this.mBufferedPosition = playbackStateCompat.mBufferedPosition;
this.mActions = playbackStateCompat.mActions;
this.mErrorCode = playbackStateCompat.mErrorCode;
this.mErrorMessage = playbackStateCompat.mErrorMessage;
List<CustomAction> list = playbackStateCompat.mCustomActions;
if (list != null) {
arrayList.addAll(list);
}
this.mActiveItemId = playbackStateCompat.mActiveItemId;
this.mExtras = playbackStateCompat.mExtras;
}
}
@Retention(RetentionPolicy.SOURCE)
@RestrictTo
/* loaded from: classes.dex */
public @interface MediaKeyAction {
}
@Retention(RetentionPolicy.SOURCE)
@RestrictTo
/* loaded from: classes.dex */
public @interface RepeatMode {
}
@Retention(RetentionPolicy.SOURCE)
@RestrictTo
/* loaded from: classes.dex */
public @interface ShuffleMode {
}
@Retention(RetentionPolicy.SOURCE)
@RestrictTo
/* loaded from: classes.dex */
public @interface State {
}
public PlaybackStateCompat(int i, long j, long j2, float f, long j3, int i2, CharSequence charSequence, long j4, List<CustomAction> list, long j5, Bundle bundle) {
this.mState = i;
this.mPosition = j;
this.mBufferedPosition = j2;
this.mSpeed = f;
this.mActions = j3;
this.mErrorCode = i2;
this.mErrorMessage = charSequence;
this.mUpdateTime = j4;
this.mCustomActions = new ArrayList(list);
this.mActiveItemId = j5;
this.mExtras = bundle;
}
public static PlaybackStateCompat fromPlaybackState(Object obj) {
ArrayList arrayList = null;
if (obj == null) {
return null;
}
PlaybackState playbackState = (PlaybackState) obj;
List<PlaybackState.CustomAction> customActions = Api21Impl.getCustomActions(playbackState);
if (customActions != null) {
arrayList = new ArrayList(customActions.size());
Iterator<PlaybackState.CustomAction> it = customActions.iterator();
while (it.hasNext()) {
arrayList.add(CustomAction.fromCustomAction(it.next()));
}
}
Bundle extras = Api22Impl.getExtras(playbackState);
MediaSessionCompat.ensureClassLoader(extras);
PlaybackStateCompat playbackStateCompat = new PlaybackStateCompat(Api21Impl.getState(playbackState), Api21Impl.getPosition(playbackState), Api21Impl.getBufferedPosition(playbackState), Api21Impl.getPlaybackSpeed(playbackState), Api21Impl.getActions(playbackState), 0, Api21Impl.getErrorMessage(playbackState), Api21Impl.getLastPositionUpdateTime(playbackState), arrayList, Api21Impl.getActiveQueueItemId(playbackState), extras);
playbackStateCompat.mStateFwk = playbackState;
return playbackStateCompat;
}
public static int toKeyCode(long j) {
if (j == 4) {
return KEYCODE_MEDIA_PLAY;
}
if (j == 2) {
return KEYCODE_MEDIA_PAUSE;
}
if (j == 32) {
return 87;
}
if (j == 16) {
return 88;
}
if (j == 1) {
return 86;
}
if (j == 64) {
return 90;
}
if (j == 8) {
return 89;
}
return j == 512 ? 85 : 0;
}
@Override // android.os.Parcelable
public int describeContents() {
return 0;
}
public long getActions() {
return this.mActions;
}
public long getActiveQueueItemId() {
return this.mActiveItemId;
}
public long getBufferedPosition() {
return this.mBufferedPosition;
}
@RestrictTo
public long getCurrentPosition(Long l) {
long elapsedRealtime;
long j = this.mPosition;
float f = this.mSpeed;
if (l != null) {
elapsedRealtime = l.longValue();
} else {
elapsedRealtime = SystemClock.elapsedRealtime() - this.mUpdateTime;
}
return Math.max(0L, j + (f * ((float) elapsedRealtime)));
}
public List<CustomAction> getCustomActions() {
return this.mCustomActions;
}
public int getErrorCode() {
return this.mErrorCode;
}
public CharSequence getErrorMessage() {
return this.mErrorMessage;
}
@Nullable
public Bundle getExtras() {
return this.mExtras;
}
public long getLastPositionUpdateTime() {
return this.mUpdateTime;
}
public float getPlaybackSpeed() {
return this.mSpeed;
}
public Object getPlaybackState() {
if (this.mStateFwk == null) {
PlaybackState.Builder createBuilder = Api21Impl.createBuilder();
Api21Impl.setState(createBuilder, this.mState, this.mPosition, this.mSpeed, this.mUpdateTime);
Api21Impl.setBufferedPosition(createBuilder, this.mBufferedPosition);
Api21Impl.setActions(createBuilder, this.mActions);
Api21Impl.setErrorMessage(createBuilder, this.mErrorMessage);
Iterator<CustomAction> it = this.mCustomActions.iterator();
while (it.hasNext()) {
Api21Impl.addCustomAction(createBuilder, (PlaybackState.CustomAction) it.next().getCustomAction());
}
Api21Impl.setActiveQueueItemId(createBuilder, this.mActiveItemId);
Api22Impl.setExtras(createBuilder, this.mExtras);
this.mStateFwk = Api21Impl.build(createBuilder);
}
return this.mStateFwk;
}
public long getPosition() {
return this.mPosition;
}
public int getState() {
return this.mState;
}
public String toString() {
StringBuilder sb = new StringBuilder("PlaybackState {state=");
sb.append(this.mState);
sb.append(", position=");
sb.append(this.mPosition);
sb.append(", buffered position=");
sb.append(this.mBufferedPosition);
sb.append(", speed=");
sb.append(this.mSpeed);
sb.append(", updated=");
sb.append(this.mUpdateTime);
sb.append(", actions=");
sb.append(this.mActions);
sb.append(", error code=");
sb.append(this.mErrorCode);
sb.append(", error message=");
sb.append(this.mErrorMessage);
sb.append(", custom actions=");
sb.append(this.mCustomActions);
sb.append(", active item id=");
return android.support.v4.media.a.o(sb, this.mActiveItemId, "}");
}
@Override // android.os.Parcelable
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(this.mState);
parcel.writeLong(this.mPosition);
parcel.writeFloat(this.mSpeed);
parcel.writeLong(this.mUpdateTime);
parcel.writeLong(this.mBufferedPosition);
parcel.writeLong(this.mActions);
TextUtils.writeToParcel(this.mErrorMessage, parcel, i);
parcel.writeTypedList(this.mCustomActions);
parcel.writeLong(this.mActiveItemId);
parcel.writeBundle(this.mExtras);
parcel.writeInt(this.mErrorCode);
}
/* loaded from: classes.dex */
public static final class CustomAction implements Parcelable {
public static final Parcelable.Creator<CustomAction> CREATOR = new Parcelable.Creator<CustomAction>() { // from class: android.support.v4.media.session.PlaybackStateCompat.CustomAction.1
/* JADX WARN: Can't rename method to resolve collision */
@Override // android.os.Parcelable.Creator
public CustomAction createFromParcel(Parcel parcel) {
return new CustomAction(parcel);
}
/* JADX WARN: Can't rename method to resolve collision */
@Override // android.os.Parcelable.Creator
public CustomAction[] newArray(int i) {
return new CustomAction[i];
}
};
private final String mAction;
private PlaybackState.CustomAction mCustomActionFwk;
private final Bundle mExtras;
private final int mIcon;
private final CharSequence mName;
/* loaded from: classes.dex */
public static final class Builder {
private final String mAction;
private Bundle mExtras;
private final int mIcon;
private final CharSequence mName;
public Builder(String str, CharSequence charSequence, int i) {
if (!TextUtils.isEmpty(str)) {
if (!TextUtils.isEmpty(charSequence)) {
if (i != 0) {
this.mAction = str;
this.mName = charSequence;
this.mIcon = i;
return;
}
throw new IllegalArgumentException("You must specify an icon resource id to build a CustomAction");
}
throw new IllegalArgumentException("You must specify a name to build a CustomAction");
}
throw new IllegalArgumentException("You must specify an action to build a CustomAction");
}
public CustomAction build() {
return new CustomAction(this.mAction, this.mName, this.mIcon, this.mExtras);
}
public Builder setExtras(Bundle bundle) {
this.mExtras = bundle;
return this;
}
}
public CustomAction(String str, CharSequence charSequence, int i, Bundle bundle) {
this.mAction = str;
this.mName = charSequence;
this.mIcon = i;
this.mExtras = bundle;
}
public static CustomAction fromCustomAction(Object obj) {
if (obj != null) {
PlaybackState.CustomAction customAction = (PlaybackState.CustomAction) obj;
Bundle extras = Api21Impl.getExtras(customAction);
MediaSessionCompat.ensureClassLoader(extras);
CustomAction customAction2 = new CustomAction(Api21Impl.getAction(customAction), Api21Impl.getName(customAction), Api21Impl.getIcon(customAction), extras);
customAction2.mCustomActionFwk = customAction;
return customAction2;
}
return null;
}
@Override // android.os.Parcelable
public int describeContents() {
return 0;
}
public String getAction() {
return this.mAction;
}
public Object getCustomAction() {
PlaybackState.CustomAction customAction = this.mCustomActionFwk;
if (customAction == null) {
PlaybackState.CustomAction.Builder createCustomActionBuilder = Api21Impl.createCustomActionBuilder(this.mAction, this.mName, this.mIcon);
Api21Impl.setExtras(createCustomActionBuilder, this.mExtras);
return Api21Impl.build(createCustomActionBuilder);
}
return customAction;
}
public Bundle getExtras() {
return this.mExtras;
}
public int getIcon() {
return this.mIcon;
}
public CharSequence getName() {
return this.mName;
}
public String toString() {
return "Action:mName='" + ((Object) this.mName) + ", mIcon=" + this.mIcon + ", mExtras=" + this.mExtras;
}
@Override // android.os.Parcelable
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(this.mAction);
TextUtils.writeToParcel(this.mName, parcel, i);
parcel.writeInt(this.mIcon);
parcel.writeBundle(this.mExtras);
}
public CustomAction(Parcel parcel) {
this.mAction = parcel.readString();
this.mName = (CharSequence) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
this.mIcon = parcel.readInt();
this.mExtras = parcel.readBundle(MediaSessionCompat.class.getClassLoader());
}
}
public PlaybackStateCompat(Parcel parcel) {
this.mState = parcel.readInt();
this.mPosition = parcel.readLong();
this.mSpeed = parcel.readFloat();
this.mUpdateTime = parcel.readLong();
this.mBufferedPosition = parcel.readLong();
this.mActions = parcel.readLong();
this.mErrorMessage = (CharSequence) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
this.mCustomActions = parcel.createTypedArrayList(CustomAction.CREATOR);
this.mActiveItemId = parcel.readLong();
this.mExtras = parcel.readBundle(MediaSessionCompat.class.getClassLoader());
this.mErrorCode = parcel.readInt();
}
}