From 054340d0a3f242efeaf898cca38625bdcb3b4b5a Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Thu, 1 Sep 2011 22:28:03 -0700 Subject: Show statusbar clock based on lockscreen status. Keep track of lockscreen clock visibility, and only hide statusbar clock when one is provided by lockscreen. This fixes bug where widget would hide all clocks. Bug: 5242065 Change-Id: I48de98ecb956c7f22bd40b54d771c78c1a80c14c --- .../internal/widget/LockScreenWidgetInterface.java | 2 ++ .../internal/widget/TransportControlView.java | 4 +++ .../policy/impl/KeyguardStatusViewManager.java | 5 +++ .../policy/impl/KeyguardUpdateMonitor.java | 28 +++++++++++++++ .../internal/policy/impl/KeyguardViewMediator.java | 40 ++++++++++++++++++++-- .../policy/impl/LockPatternKeyguardView.java | 8 +++++ 6 files changed, 84 insertions(+), 3 deletions(-) diff --git a/core/java/com/android/internal/widget/LockScreenWidgetInterface.java b/core/java/com/android/internal/widget/LockScreenWidgetInterface.java index 6dfcc755c326..8f80cfccfd74 100644 --- a/core/java/com/android/internal/widget/LockScreenWidgetInterface.java +++ b/core/java/com/android/internal/widget/LockScreenWidgetInterface.java @@ -20,4 +20,6 @@ public interface LockScreenWidgetInterface { public void setCallback(LockScreenWidgetCallback callback); + public boolean providesClock(); + } diff --git a/core/java/com/android/internal/widget/TransportControlView.java b/core/java/com/android/internal/widget/TransportControlView.java index 1c47ca88ab7d..29ad15bc18b3 100644 --- a/core/java/com/android/internal/widget/TransportControlView.java +++ b/core/java/com/android/internal/widget/TransportControlView.java @@ -381,4 +381,8 @@ public class TransportControlView extends FrameLayout implements OnClickListener mWidgetCallbacks = callback; } + public boolean providesClock() { + return false; + } + } diff --git a/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java b/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java index 40cc7d898acd..8654a25d2f89 100644 --- a/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java +++ b/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java @@ -589,6 +589,11 @@ class KeyguardStatusViewManager implements OnClickListener { public void onPhoneStateChanged(String newState) { updateEmergencyCallButtonState(); } + + /** {@inheritDoc} */ + public void onClockVisibilityChanged() { + // ignored + } }; private SimStateCallback mSimStateCallback = new SimStateCallback() { diff --git a/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java b/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java index 2955de31e831..958f555ff567 100644 --- a/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java +++ b/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java @@ -81,6 +81,8 @@ public class KeyguardUpdateMonitor { private int mFailedAttempts = 0; + private boolean mClockVisible; + private Handler mHandler; private ArrayList mInfoCallbacks = Lists.newArrayList(); @@ -94,6 +96,7 @@ public class KeyguardUpdateMonitor { private static final int MSG_SIM_STATE_CHANGE = 304; private static final int MSG_RINGER_MODE_CHANGED = 305; private static final int MSG_PHONE_STATE_CHANGED = 306; + private static final int MSG_CLOCK_VISIBILITY_CHANGED = 307; /** * When we receive a @@ -170,6 +173,9 @@ public class KeyguardUpdateMonitor { case MSG_PHONE_STATE_CHANGED: handlePhoneStateChanged((String)msg.obj); break; + case MSG_CLOCK_VISIBILITY_CHANGED: + handleClockVisibilityChanged(); + break; } } }; @@ -334,6 +340,13 @@ public class KeyguardUpdateMonitor { } } + private void handleClockVisibilityChanged() { + if (DEBUG) Log.d(TAG, "handleClockVisibilityChanged()"); + for (int i = 0; i < mInfoCallbacks.size(); i++) { + mInfoCallbacks.get(i).onClockVisibilityChanged(); + } + } + /** * @param status One of the statuses of {@link android.os.BatteryManager} * @return Whether the status maps to a status for being plugged in. @@ -448,6 +461,12 @@ public class KeyguardUpdateMonitor { */ void onPhoneStateChanged(String newState); + /** + * Called when visibility of lockscreen clock changes, such as when + * obscured by a widget. + */ + void onClockVisibilityChanged(); + } /** @@ -484,6 +503,11 @@ public class KeyguardUpdateMonitor { } } + public void reportClockVisible(boolean visible) { + mClockVisible = visible; + mHandler.obtainMessage(MSG_CLOCK_VISIBILITY_CHANGED).sendToTarget(); + } + public IccCard.State getSimState() { return mSimState; } @@ -546,4 +570,8 @@ public class KeyguardUpdateMonitor { mFailedAttempts++; } + public boolean isClockVisible() { + return mClockVisible; + } + } diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java index a5441672052c..2a34f1845cb2 100644 --- a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java +++ b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java @@ -92,7 +92,7 @@ import android.view.WindowManagerPolicy; * thread of the keyguard. */ public class KeyguardViewMediator implements KeyguardViewCallback, - KeyguardUpdateMonitor.SimStateCallback { + KeyguardUpdateMonitor.InfoCallback, KeyguardUpdateMonitor.SimStateCallback { private static final int KEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT = 30000; private final static boolean DEBUG = false; private final static boolean DBG_WAKE = false; @@ -284,6 +284,7 @@ public class KeyguardViewMediator implements KeyguardViewCallback, mUpdateMonitor = new KeyguardUpdateMonitor(context); + mUpdateMonitor.registerInfoCallback(this); mUpdateMonitor.registerSimStateCallback(this); mLockPatternUtils = new LockPatternUtils(mContext); @@ -1190,9 +1191,12 @@ public class KeyguardViewMediator implements KeyguardViewCallback, flags |= StatusBarManager.DISABLE_NAVIGATION; if (!mHidden) { // showing lockscreen exclusively (no activities in front of it) - // disable clock and back button too + // disable back button too flags |= StatusBarManager.DISABLE_BACK; - flags |= StatusBarManager.DISABLE_CLOCK; + if (mUpdateMonitor.isClockVisible()) { + // lockscreen showing a clock, so hide statusbar clock + flags |= StatusBarManager.DISABLE_CLOCK; + } } if (isSecure() || !ENABLE_INSECURE_STATUS_BAR_EXPAND) { // showing secure lockscreen; disable expanding. @@ -1283,4 +1287,34 @@ public class KeyguardViewMediator implements KeyguardViewCallback, mKeyguardViewManager.onScreenTurnedOn(); } } + + /** {@inheritDoc} */ + public void onClockVisibilityChanged() { + adjustStatusBarLocked(); + } + + /** {@inheritDoc} */ + public void onPhoneStateChanged(String newState) { + // ignored + } + + /** {@inheritDoc} */ + public void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn, int batteryLevel) { + // ignored + } + + /** {@inheritDoc} */ + public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) { + // ignored + } + + /** {@inheritDoc} */ + public void onRingerModeChanged(int state) { + // ignored + } + + /** {@inheritDoc} */ + public void onTimeChanged() { + // ignored + } } diff --git a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java index 9c14734e4d29..62abf203fc07 100644 --- a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java +++ b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java @@ -21,6 +21,7 @@ import com.android.internal.policy.impl.LockPatternKeyguardView.UnlockMode; import com.android.internal.telephony.IccCard; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockScreenWidgetCallback; +import com.android.internal.widget.LockScreenWidgetInterface; import com.android.internal.widget.TransportControlView; import android.accounts.Account; @@ -191,11 +192,17 @@ public class LockPatternKeyguardView extends KeyguardViewBase { public void requestShow(View view) { if (DEBUG) Log.v(TAG, "View " + view + " requested show transports"); view.setVisibility(View.VISIBLE); + + // TODO: examine all widgets to derive clock status + mUpdateMonitor.reportClockVisible(false); } public void requestHide(View view) { if (DEBUG) Log.v(TAG, "View " + view + " requested hide transports"); view.setVisibility(View.GONE); + + // TODO: examine all widgets to derive clock status + mUpdateMonitor.reportClockVisible(true); } }; @@ -743,6 +750,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase { if (tcv == null) { if (DEBUG) Log.w(TAG, "Couldn't find transport control widget"); } else { + mUpdateMonitor.reportClockVisible(true); tcv.setVisibility(View.GONE); // hide tcv until we get the callback below to show it. tcv.setCallback(mWidgetCallback); } -- cgit v1.2.3-59-g8ed1b