package me.barrasso.android.volume.media; import android.media.RemoteControlClient; import android.media.RemoteController; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemClock; import java.io.Serializable; import static me.barrasso.android.volume.LogUtils.LOGE; public final class PlaybackInfo implements Parcelable, Serializable, Cloneable { private static final int DISPLAY_TIMEOUT_MS = 5000; // 5s public RemoteController.MetadataEditor metadata; public int mState; public long mStateChangeTimeMs; public long mCurrentPosMs; public float mSpeed; public int mTransportControlFlags; public String mRemotePackageName = ""; public PlaybackInfo() { } public PlaybackInfo(int state, long stateChangeTimeMs, long currentPosMs, float speed, int trransportControlFlags) { mState = state; mStateChangeTimeMs = stateChangeTimeMs; mCurrentPosMs = currentPosMs; mSpeed = speed; mTransportControlFlags = trransportControlFlags; } public PlaybackInfo(PlaybackInfo clone) { mState = clone.mState; mStateChangeTimeMs = clone.mStateChangeTimeMs; mCurrentPosMs = clone.mCurrentPosMs; mSpeed = clone.mSpeed; metadata = clone.metadata; mTransportControlFlags = clone.mTransportControlFlags; mRemotePackageName = clone.mRemotePackageName; } public PlaybackInfo(Parcel in) { mState = in.readInt(); mStateChangeTimeMs = in.readLong(); mCurrentPosMs = in.readLong(); mSpeed = in.readFloat(); mTransportControlFlags = in.readInt(); mRemotePackageName = in.readString(); } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(mState); out.writeLong(mStateChangeTimeMs); out.writeLong(mCurrentPosMs); out.writeFloat(mSpeed); out.writeInt(mTransportControlFlags); out.writeString(mRemotePackageName); } // Localized from com.android.internal.policy.impl.keyguard.KeyguardTransportControlView public boolean wasPlayingRecently() { switch (mState) { case RemoteControlClient.PLAYSTATE_PLAYING: case RemoteControlClient.PLAYSTATE_FAST_FORWARDING: case RemoteControlClient.PLAYSTATE_REWINDING: case RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS: case RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS: case RemoteControlClient.PLAYSTATE_BUFFERING: // actively playing or about to play return true; case RemoteControlClient.PLAYSTATE_STOPPED: case RemoteControlClient.PLAYSTATE_PAUSED: case RemoteControlClient.PLAYSTATE_ERROR: return ((SystemClock.elapsedRealtime() - mStateChangeTimeMs) < DISPLAY_TIMEOUT_MS); default: LOGE("PlaybackInfo", "Unknown playback state " + mState + " in wasPlayingRecently()"); return false; } } public static final Parcelable.Creator<PlaybackInfo> CREATOR = new Parcelable.Creator<PlaybackInfo>() { @Override public PlaybackInfo createFromParcel(Parcel in) { return new PlaybackInfo(in); } @Override public PlaybackInfo[] newArray(int size) { return new PlaybackInfo[size]; } }; @Override public int describeContents() { return 0; } @Override public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { /* Ignored. */ } if (null == clone) clone = new PlaybackInfo(this); return clone; } @Override public String toString() { return getClass().getSimpleName() + "@{" + "state=" + mState + ", " + "posMs=" + mCurrentPosMs + ", " + "cngMs=" + mStateChangeTimeMs + ", " + "speed=" + mSpeed + ", " + "transFlags=" + mTransportControlFlags + ", " + "package=" + mRemotePackageName + "}"; } @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof PlaybackInfo)) return false; PlaybackInfo state1 = (PlaybackInfo) obj; return (state1.mSpeed == mSpeed && state1.mState == mState && state1.mCurrentPosMs == mCurrentPosMs && state1.mStateChangeTimeMs == mStateChangeTimeMs && state1.mTransportControlFlags == mTransportControlFlags && ((mRemotePackageName == null) ? state1.mRemotePackageName == null : state1.mRemotePackageName.equals(mRemotePackageName)) && ((metadata == null) ? (state1.metadata == null) : state1.metadata.equals(metadata))); } }