Skip to content

Commit 9c43016

Browse files
jmtriviAndroid (Google) Code Review
authored andcommitted
Merge "Bug 5045498 Keep track of RemoteControlClient play state change time" into ics-factoryrom
2 parents 7a2063b + 6862239 commit 9c43016

3 files changed

Lines changed: 50 additions & 8 deletions

File tree

core/java/com/android/internal/widget/TransportControlView.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import android.os.Handler;
3636
import android.os.Message;
3737
import android.os.RemoteException;
38+
import android.os.SystemClock;
3839
import android.text.Spannable;
3940
import android.text.TextUtils;
4041
import android.text.style.ForegroundColorSpan;
@@ -59,6 +60,7 @@ public class TransportControlView extends FrameLayout implements OnClickListener
5960
private static final int MSG_SET_ARTWORK = 103;
6061
private static final int MSG_SET_GENERATION_ID = 104;
6162
private static final int MAXDIM = 512;
63+
private static final int DISPLAY_TIMEOUT_MS = 5000; // 5s
6264
protected static final boolean DEBUG = true;
6365
protected static final String TAG = "TransportControlView";
6466

@@ -142,7 +144,7 @@ private static class IRemoteControlDisplayWeak extends IRemoteControlDisplay.Stu
142144
mLocalHandler = new WeakReference<Handler>(handler);
143145
}
144146

145-
public void setPlaybackState(int generationId, int state) {
147+
public void setPlaybackState(int generationId, int state, long stateChangeTimeMs) {
146148
Handler handler = mLocalHandler.get();
147149
if (handler != null) {
148150
handler.obtainMessage(MSG_UPDATE_STATE, generationId, state).sendToTarget();
@@ -401,4 +403,33 @@ public boolean providesClock() {
401403
return false;
402404
}
403405

406+
private boolean wasPlayingRecently(int state, long stateChangeTimeMs) {
407+
switch (state) {
408+
case RemoteControlClient.PLAYSTATE_PLAYING:
409+
case RemoteControlClient.PLAYSTATE_FAST_FORWARDING:
410+
case RemoteControlClient.PLAYSTATE_REWINDING:
411+
case RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS:
412+
case RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS:
413+
case RemoteControlClient.PLAYSTATE_BUFFERING:
414+
// actively playing or about to play
415+
return true;
416+
case RemoteControlClient.PLAYSTATE_NONE:
417+
return false;
418+
case RemoteControlClient.PLAYSTATE_STOPPED:
419+
case RemoteControlClient.PLAYSTATE_PAUSED:
420+
case RemoteControlClient.PLAYSTATE_ERROR:
421+
// we have stopped playing, check how long ago
422+
if (DEBUG) {
423+
if ((SystemClock.elapsedRealtime() - stateChangeTimeMs) < DISPLAY_TIMEOUT_MS) {
424+
Log.v(TAG, "wasPlayingRecently: time < TIMEOUT was playing recently");
425+
} else {
426+
Log.v(TAG, "wasPlayingRecently: time > TIMEOUT");
427+
}
428+
}
429+
return ((SystemClock.elapsedRealtime() - stateChangeTimeMs) < DISPLAY_TIMEOUT_MS);
430+
default:
431+
Log.e(TAG, "Unknown playback state " + state + " in wasPlayingRecently()");
432+
return false;
433+
}
434+
}
404435
}

media/java/android/media/IRemoteControlDisplay.aidl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ oneway interface IRemoteControlDisplay
4040
void setCurrentClientId(int clientGeneration, in PendingIntent clientMediaIntent,
4141
boolean clearing);
4242

43-
void setPlaybackState(int generationId, int state);
43+
void setPlaybackState(int generationId, int state, long stateChangeTimeMs);
4444

4545
void setTransportControlFlags(int generationId, int transportControlFlags);
4646

media/java/android/media/RemoteControlClient.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import android.os.Looper;
3030
import android.os.Message;
3131
import android.os.RemoteException;
32+
import android.os.SystemClock;
3233
import android.util.Log;
3334

3435
import java.lang.IllegalArgumentException;
@@ -494,11 +495,15 @@ public MetadataEditor editMetadata(boolean startEmpty) {
494495
*/
495496
public void setPlaybackState(int state) {
496497
synchronized(mCacheLock) {
497-
// store locally
498-
mPlaybackState = state;
499-
500-
// send to remote control display if conditions are met
501-
sendPlaybackState_syncCacheLock();
498+
if (mPlaybackState != state) {
499+
// store locally
500+
mPlaybackState = state;
501+
// keep track of when the state change occurred
502+
mPlaybackStateChangeTimeMs = SystemClock.elapsedRealtime();
503+
504+
// send to remote control display if conditions are met
505+
sendPlaybackState_syncCacheLock();
506+
}
502507
}
503508
}
504509

@@ -533,6 +538,11 @@ public void setTransportControlFlags(int transportControlFlags) {
533538
* Access synchronized on mCacheLock
534539
*/
535540
private int mPlaybackState = PLAYSTATE_NONE;
541+
/**
542+
* Time of last play state change
543+
* Access synchronized on mCacheLock
544+
*/
545+
private long mPlaybackStateChangeTimeMs = 0;
536546
/**
537547
* Cache for the artwork bitmap.
538548
* Access synchronized on mCacheLock
@@ -716,7 +726,8 @@ private void detachFromDisplay_syncCacheLock() {
716726
private void sendPlaybackState_syncCacheLock() {
717727
if ((mCurrentClientGenId == mInternalClientGenId) && (mRcDisplay != null)) {
718728
try {
719-
mRcDisplay.setPlaybackState(mInternalClientGenId, mPlaybackState);
729+
mRcDisplay.setPlaybackState(mInternalClientGenId, mPlaybackState,
730+
mPlaybackStateChangeTimeMs);
720731
} catch (RemoteException e) {
721732
Log.e(TAG, "Error in setPlaybackState(), dead display "+e);
722733
detachFromDisplay_syncCacheLock();

0 commit comments

Comments
 (0)