3434import android .os .Bundle ;
3535import android .os .Handler ;
3636import android .os .Message ;
37+ import android .os .Parcel ;
38+ import android .os .Parcelable ;
3739import android .os .RemoteException ;
3840import android .os .SystemClock ;
3941import android .text .Spannable ;
@@ -61,7 +63,7 @@ public class TransportControlView extends FrameLayout implements OnClickListener
6163 private static final int MSG_SET_GENERATION_ID = 104 ;
6264 private static final int MAXDIM = 512 ;
6365 private static final int DISPLAY_TIMEOUT_MS = 5000 ; // 5s
64- protected static final boolean DEBUG = true ;
66+ protected static final boolean DEBUG = false ;
6567 protected static final String TAG = "TransportControlView" ;
6668
6769 private ImageView mAlbumArt ;
@@ -74,7 +76,7 @@ public class TransportControlView extends FrameLayout implements OnClickListener
7476 private boolean mAttached ;
7577 private PendingIntent mClientIntent ;
7678 private int mTransportControlFlags ;
77- private int mPlayState ;
79+ private int mCurrentPlayState ;
7880 private AudioManager mAudioManager ;
7981 private LockScreenWidgetCallback mWidgetCallbacks ;
8082 private IRemoteControlDisplayWeak mIRCD ;
@@ -84,6 +86,11 @@ public class TransportControlView extends FrameLayout implements OnClickListener
8486 */
8587 private Bundle mPopulateMetadataWhenAttached = null ;
8688
89+ /**
90+ * Whether to clear the interface next time it is shown (i.e. the generation id changed)
91+ */
92+ private boolean mClearOnNextShow ;
93+
8794 // This handler is required to ensure messages from IRCD are handled in sequence and on
8895 // the UI thread.
8996 private Handler mHandler = new Handler () {
@@ -113,15 +120,10 @@ public void handleMessage(Message msg) {
113120 break ;
114121
115122 case MSG_SET_GENERATION_ID :
116- if (mWidgetCallbacks != null ) {
117- boolean clearing = msg .arg2 != 0 ;
118- if (DEBUG ) Log .v (TAG , "New genId = " + msg .arg1 + ", clearing = " + clearing );
119- if (!clearing ) {
120- mWidgetCallbacks .requestShow (TransportControlView .this );
121- } else {
122- mWidgetCallbacks .requestHide (TransportControlView .this );
123- }
123+ if (msg .arg2 != 0 ) {
124+ mClearOnNextShow = true ; // TODO: handle this
124125 }
126+ if (DEBUG ) Log .v (TAG , "New genId = " + msg .arg1 + ", clearing = " + msg .arg2 );
125127 mClientGeneration = msg .arg1 ;
126128 mClientIntent = (PendingIntent ) msg .obj ;
127129 break ;
@@ -195,6 +197,7 @@ public TransportControlView(Context context, AttributeSet attrs) {
195197 super (context , attrs );
196198 Log .v (TAG , "Create TCV " + this );
197199 mAudioManager = new AudioManager (mContext );
200+ mCurrentPlayState = RemoteControlClient .PLAYSTATE_NONE ; // until we get a callback
198201 mIRCD = new IRemoteControlDisplayWeak (mHandler );
199202 }
200203
@@ -319,7 +322,7 @@ private void populateMetadata() {
319322 | RemoteControlClient .FLAG_KEY_MEDIA_PLAY_PAUSE
320323 | RemoteControlClient .FLAG_KEY_MEDIA_STOP );
321324
322- updatePlayPauseState (mPlayState );
325+ updatePlayPauseState (mCurrentPlayState );
323326 }
324327
325328 private static void setVisibilityBasedOnFlag (View view , int flags , int flag ) {
@@ -332,12 +335,13 @@ private static void setVisibilityBasedOnFlag(View view, int flags, int flag) {
332335
333336 private void updatePlayPauseState (int state ) {
334337 if (DEBUG ) Log .v (TAG ,
335- "updatePlayPauseState(), old=" + mPlayState + ", state=" + state );
336- if (state == mPlayState ) {
338+ "updatePlayPauseState(), old=" + mCurrentPlayState + ", state=" + state );
339+ if (state == mCurrentPlayState ) {
337340 return ;
338341 }
339342 final int imageResId ;
340343 final int imageDescId ;
344+ final boolean showIfHidden ;
341345 switch (state ) {
342346 case RemoteControlClient .PLAYSTATE_ERROR :
343347 imageResId = com .android .internal .R .drawable .stat_sys_warning ;
@@ -349,22 +353,81 @@ private void updatePlayPauseState(int state) {
349353 case RemoteControlClient .PLAYSTATE_PLAYING :
350354 imageResId = com .android .internal .R .drawable .ic_media_pause ;
351355 imageDescId = com .android .internal .R .string .lockscreen_transport_pause_description ;
356+ showIfHidden = true ;
352357 break ;
353358
354359 case RemoteControlClient .PLAYSTATE_BUFFERING :
355360 imageResId = com .android .internal .R .drawable .ic_media_stop ;
356361 imageDescId = com .android .internal .R .string .lockscreen_transport_stop_description ;
362+ showIfHidden = true ;
357363 break ;
358364
359365 case RemoteControlClient .PLAYSTATE_PAUSED :
360366 default :
361367 imageResId = com .android .internal .R .drawable .ic_media_play ;
362368 imageDescId = com .android .internal .R .string .lockscreen_transport_play_description ;
369+ showIfHidden = false ;
363370 break ;
364371 }
365372 mBtnPlay .setImageResource (imageResId );
366373 mBtnPlay .setContentDescription (getResources ().getString (imageDescId ));
367- mPlayState = state ;
374+ if (showIfHidden && mWidgetCallbacks != null && !mWidgetCallbacks .isVisible (this )) {
375+ mWidgetCallbacks .requestShow (this );
376+ }
377+ mCurrentPlayState = state ;
378+ }
379+
380+ static class SavedState extends BaseSavedState {
381+ boolean wasShowing ;
382+
383+ SavedState (Parcelable superState ) {
384+ super (superState );
385+ }
386+
387+ private SavedState (Parcel in ) {
388+ super (in );
389+ this .wasShowing = in .readInt () != 0 ;
390+ }
391+
392+ @ Override
393+ public void writeToParcel (Parcel out , int flags ) {
394+ super .writeToParcel (out , flags );
395+ out .writeInt (this .wasShowing ? 1 : 0 );
396+ }
397+
398+ public static final Parcelable .Creator <SavedState > CREATOR
399+ = new Parcelable .Creator <SavedState >() {
400+ public SavedState createFromParcel (Parcel in ) {
401+ return new SavedState (in );
402+ }
403+
404+ public SavedState [] newArray (int size ) {
405+ return new SavedState [size ];
406+ }
407+ };
408+ }
409+
410+ @ Override
411+ public Parcelable onSaveInstanceState () {
412+ if (DEBUG ) Log .v (TAG , "onSaveInstanceState()" );
413+ Parcelable superState = super .onSaveInstanceState ();
414+ SavedState ss = new SavedState (superState );
415+ ss .wasShowing = mWidgetCallbacks .isVisible (this );
416+ return ss ;
417+ }
418+
419+ @ Override
420+ public void onRestoreInstanceState (Parcelable state ) {
421+ if (DEBUG ) Log .v (TAG , "onRestoreInstanceState()" );
422+ if (!(state instanceof SavedState )) {
423+ super .onRestoreInstanceState (state );
424+ return ;
425+ }
426+ SavedState ss = (SavedState ) state ;
427+ super .onRestoreInstanceState (ss .getSuperState ());
428+ if (ss .wasShowing ) {
429+ mWidgetCallbacks .requestShow (this );
430+ }
368431 }
369432
370433 public void onClick (View v ) {
0 commit comments