diff options
author | Jim Miller <jaggies@google.com> | 2013-04-11 15:43:49 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-04-11 15:43:49 -0700 |
commit | c8c0d0964e1efa666698198920665aa539398468 (patch) | |
tree | fb7af38191f5428ba43ef822fa40c7d0a1a196c1 /packages/Keyguard/src | |
parent | 886d91b60586c8d11a236379fbf7ea13e4f34136 (diff) | |
parent | cce961c13417eeafba78fd5f785984b54997d897 (diff) | |
download | frameworks_base-c8c0d0964e1efa666698198920665aa539398468.zip frameworks_base-c8c0d0964e1efa666698198920665aa539398468.tar.gz frameworks_base-c8c0d0964e1efa666698198920665aa539398468.tar.bz2 |
am cce961c1: am 22626107: Merge "Fix bug where transport shows all the time in keyguard" into jb-mr2-dev
* commit 'cce961c13417eeafba78fd5f785984b54997d897':
Fix bug where transport shows all the time in keyguard
Diffstat (limited to 'packages/Keyguard/src')
3 files changed, 58 insertions, 21 deletions
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java index d63f696..c54d9a7 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java @@ -63,7 +63,7 @@ import java.util.List; public class KeyguardHostView extends KeyguardViewBase { private static final String TAG = "KeyguardHostView"; - // transport control states + // Transport control states. static final int TRANSPORT_GONE = 0; static final int TRANSPORT_INVISIBLE = 1; static final int TRANSPORT_VISIBLE = 2; @@ -138,6 +138,9 @@ public class KeyguardHostView extends KeyguardViewBase { public KeyguardHostView(Context context, AttributeSet attrs) { super(context, attrs); + + if (DEBUG) Log.e(TAG, "KeyguardHostView()"); + mLockPatternUtils = new LockPatternUtils(context); // Note: This depends on KeyguardHostView getting reconstructed every time the @@ -202,6 +205,9 @@ public class KeyguardHostView extends KeyguardViewBase { mTransportState = (dcs.clearing ? TRANSPORT_GONE : (isMusicPlaying(dcs.playbackState) ? TRANSPORT_VISIBLE : TRANSPORT_INVISIBLE)); mPlaybackState = dcs.playbackState; + + if (DEBUG) Log.v(TAG, "Initial transport state: " + + mTransportState + ", pbstate=" + mPlaybackState); } private void cleanupAppWidgetIds() { @@ -1203,7 +1209,7 @@ public class KeyguardHostView extends KeyguardViewBase { * Create KeyguardTransportControlView on demand. * @return */ - private KeyguardTransportControlView getTransportControlView() { + private KeyguardTransportControlView getOrCreateTransportControl() { if (mTransportControl == null) { LayoutInflater inflater = LayoutInflater.from(mContext); mTransportControl = (KeyguardTransportControlView) @@ -1378,17 +1384,19 @@ public class KeyguardHostView extends KeyguardViewBase { @Override public Parcelable onSaveInstanceState() { - if (DEBUG) Log.d(TAG, "onSaveInstanceState"); + if (DEBUG) Log.d(TAG, "onSaveInstanceState, tstate=" + mTransportState); Parcelable superState = super.onSaveInstanceState(); SavedState ss = new SavedState(superState); - ss.transportState = mTransportState; + // If the transport is showing, force it to show it on restore. + final boolean showing = mTransportControl != null + && mAppWidgetContainer.getWidgetPageIndex(mTransportControl) >= 0; + ss.transportState = showing ? TRANSPORT_VISIBLE : mTransportState; ss.appWidgetToShow = mAppWidgetToShow; return ss; } @Override public void onRestoreInstanceState(Parcelable state) { - if (DEBUG) Log.d(TAG, "onRestoreInstanceState"); if (!(state instanceof SavedState)) { super.onRestoreInstanceState(state); return; @@ -1397,6 +1405,7 @@ public class KeyguardHostView extends KeyguardViewBase { super.onRestoreInstanceState(ss.getSuperState()); mTransportState = (ss.transportState); mAppWidgetToShow = ss.appWidgetToShow; + if (DEBUG) Log.d(TAG, "onRestoreInstanceState, transport=" + mTransportState); post(mSwitchPageRunnable); } @@ -1422,23 +1431,44 @@ public class KeyguardHostView extends KeyguardViewBase { mAppWidgetContainer.setCurrentPage(pageToShow); } + /** + * Examines the current state and adds the transport to the widget pager when the state changes. + * + * Showing the initial transport and keeping it around is a bit tricky because the signals + * coming from music players aren't always clear. Here's how the states are handled: + * + * {@link TRANSPORT_GONE} means we have no reason to show the transport - remove it if present. + * + * {@link TRANSPORT_INVISIBLE} means we have potential to show the transport because a music + * player is registered but not currently playing music (or we don't know the state yet). The + * code adds it conditionally on play state. + * + * {@link #TRANSPORT_VISIBLE} means a music player is active and transport should be showing. + * + * Once the transport is showing, we always show it until keyguard is dismissed. This state is + * maintained by onSave/RestoreInstanceState(). This state is cleared in + * {@link KeyguardViewManager#hide} when keyguard is dismissed, which causes the transport to be + * gone when keyguard is restarted until we get an update with the current state. + * + * @param state + */ private void ensureTransportPresentOrRemoved(int state) { - int page = getWidgetPosition(R.id.keyguard_transport_control); - if (state == TRANSPORT_INVISIBLE || state == TRANSPORT_VISIBLE) { - if (page == -1) { - if (DEBUGXPORT) Log.v(TAG, "add transport"); - // insert to left of camera if it exists, otherwise after right-most widget - int lastWidget = mAppWidgetContainer.getChildCount() - 1; - int position = 0; // handle no widget case - if (lastWidget >= 0) { - position = mAppWidgetContainer.isCameraPage(lastWidget) ? - lastWidget : lastWidget + 1; - } - mAppWidgetContainer.addWidget(getTransportControlView(), position); + final boolean showing = getWidgetPosition(R.id.keyguard_transport_control) != -1; + final boolean visible = state == TRANSPORT_VISIBLE; + final boolean shouldBeVisible = state == TRANSPORT_INVISIBLE && isMusicPlaying(state); + if (!showing && (visible || shouldBeVisible)) { + if (DEBUGXPORT) Log.v(TAG, "add transport"); + // insert to left of camera if it exists, otherwise after right-most widget + int lastWidget = mAppWidgetContainer.getChildCount() - 1; + int position = 0; // handle no widget case + if (lastWidget >= 0) { + position = mAppWidgetContainer.isCameraPage(lastWidget) ? + lastWidget : lastWidget + 1; } - } else if (page != -1) { + mAppWidgetContainer.addWidget(getOrCreateTransportControl(), position); + } else if (showing && state == TRANSPORT_GONE) { if (DEBUGXPORT) Log.v(TAG, "remove transport"); - mAppWidgetContainer.removeWidget(getTransportControlView()); + mAppWidgetContainer.removeWidget(getOrCreateTransportControl()); mTransportControl = null; } } @@ -1471,7 +1501,7 @@ public class KeyguardHostView extends KeyguardViewBase { // if music playing, show transport if (musicTransportState == TRANSPORT_VISIBLE) { if (DEBUG) Log.d(TAG, "Music playing, show transport"); - return mAppWidgetContainer.getWidgetPageIndex(getTransportControlView()); + return mAppWidgetContainer.getWidgetPageIndex(getOrCreateTransportControl()); } // else show the right-most widget (except for camera) diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 6e236b5..d45048f 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -390,6 +390,8 @@ public class KeyguardUpdateMonitor { mDisplayClientState.clientGeneration = clientGeneration; mDisplayClientState.clearing = clearing; mDisplayClientState.intent = p; + if (DEBUG) + Log.v(TAG, "handleSetGenerationId(g=" + clientGeneration + ", clear=" + clearing + ")"); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -399,6 +401,11 @@ public class KeyguardUpdateMonitor { } protected void handleSetPlaybackState(int generationId, int playbackState, long eventTime) { + if (DEBUG) + Log.v(TAG, "handleSetPlaybackState(gen=" + generationId + + ", state=" + playbackState + ", t=" + eventTime + ")"); + mDisplayClientState.playbackState = playbackState; + mDisplayClientState.playbackEventTime = eventTime; if (generationId == mDisplayClientState.clientGeneration) { for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java index 0146781..8232ca3 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java @@ -932,7 +932,7 @@ public class KeyguardViewMediator { * @see #handleReset() */ private void resetStateLocked(Bundle options) { - if (DEBUG) Log.d(TAG, "resetStateLocked"); + if (DEBUG) Log.e(TAG, "resetStateLocked"); Message msg = mHandler.obtainMessage(RESET, options); mHandler.sendMessage(msg); } |