diff options
48 files changed, 948 insertions, 1228 deletions
diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index a66332b..b78c70f 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -25,22 +25,23 @@ import android.os.Bundle; interface IKeyguardService { boolean isShowing(); boolean isSecure(); - boolean isShowingAndNotHidden(); + boolean isShowingAndNotOccluded(); boolean isInputRestricted(); boolean isDismissable(); oneway void verifyUnlock(IKeyguardExitCallback callback); oneway void keyguardDone(boolean authenticated, boolean wakeup); /** - * Hides the Keyguard when a window dismisses the Keyguard with flag FLAG_SHOW_ON_LOCK_SCREEN. + * Sets the Keyguard as occluded when a window dismisses the Keyguard with flag + * FLAG_SHOW_ON_LOCK_SCREEN. * - * @param isHidden Whether the Keyguard should be hidden. - * @return See IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_*. This is needed because + * @param isOccluded Whether the Keyguard is occluded by another window. + * @return See IKeyguardServiceConstants.KEYGUARD_SERVICE_SET_OCCLUDED_*. This is needed because * PhoneWindowManager needs to set these flags immediately and can't wait for the * Keyguard thread to pick it up. In the hidden case, PhoneWindowManager is solely * responsible to make sure that the flags are unset. */ - int setHidden(boolean isHidden); + int setOccluded(boolean isOccluded); oneway void dismiss(); oneway void onDreamingStarted(); diff --git a/core/java/com/android/internal/policy/IKeyguardServiceConstants.java b/core/java/com/android/internal/policy/IKeyguardServiceConstants.java index d94cca7..b88174a 100644 --- a/core/java/com/android/internal/policy/IKeyguardServiceConstants.java +++ b/core/java/com/android/internal/policy/IKeyguardServiceConstants.java @@ -25,17 +25,17 @@ public class IKeyguardServiceConstants { * Constant for {@link com.android.internal.policy.IKeyguardService#setHidden(boolean)}: * Don't change the keyguard window flags. */ - public static final int KEYGUARD_SERVICE_HIDE_RESULT_NONE = 0; + public static final int KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_NONE = 0; /** * Constant for {@link com.android.internal.policy.IKeyguardService#setHidden(boolean)}: * Set the keyguard window flags to FLAG_SHOW_WALLPAPER and PRIVATE_FLAG_KEYGUARD. */ - public static final int KEYGUARD_SERVICE_HIDE_RESULT_SET_FLAGS = 1; + public static final int KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_SET_FLAGS = 1; /** * Constant for {@link com.android.internal.policy.IKeyguardService#setHidden(boolean)}: * Unset the keyguard window flags to FLAG_SHOW_WALLPAPER and PRIVATE_FLAG_KEYGUARD. */ - public static final int KEYGUARD_SERVICE_HIDE_RESULT_UNSET_FLAGS = 2; + public static final int KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_UNSET_FLAGS = 2; } diff --git a/packages/Keyguard/res/layout/keyguard_bouncer.xml b/packages/Keyguard/res/layout/keyguard_bouncer.xml new file mode 100644 index 0000000..663e8a1 --- /dev/null +++ b/packages/Keyguard/res/layout/keyguard_bouncer.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ Copyright (C) 2014 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <View android:id="@+id/bouncer_background" + android:background="#aa000000" + android:layout_width="match_parent" + android:layout_height="match_parent"/> + + <include layout="@layout/keyguard_simple_host_view" + android:layout_width="match_parent" + android:layout_height="match_parent"/> +</FrameLayout> + diff --git a/packages/Keyguard/src/com/android/keyguard/CameraWidgetFrame.java b/packages/Keyguard/src/com/android/keyguard/CameraWidgetFrame.java index 74e6f33..2bf74ea 100644 --- a/packages/Keyguard/src/com/android/keyguard/CameraWidgetFrame.java +++ b/packages/Keyguard/src/com/android/keyguard/CameraWidgetFrame.java @@ -38,7 +38,7 @@ import com.android.keyguard.KeyguardActivityLauncher.CameraWidgetInfo; public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnClickListener { private static final String TAG = CameraWidgetFrame.class.getSimpleName(); - private static final boolean DEBUG = KeyguardHostView.DEBUG; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final int WIDGET_ANIMATION_DURATION = 250; // ms private static final int WIDGET_WAIT_DURATION = 400; // ms private static final int RECOVERY_DELAY = 1000; // ms @@ -113,12 +113,14 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli private final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() { private boolean mShowing; - void onKeyguardVisibilityChanged(boolean showing) { + + @Override + public void onKeyguardVisibilityChanged(boolean showing) { if (mShowing == showing) return; mShowing = showing; CameraWidgetFrame.this.onKeyguardVisibilityChanged(mShowing); - }; + } }; private static final class FixedSizeFrameLayout extends FrameLayout { diff --git a/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java b/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java index fd56613..4ed37d4 100644 --- a/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java +++ b/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java @@ -48,10 +48,11 @@ public class EmergencyButton extends Button { updateEmergencyCallButton(simState, phoneState); } - void onPhoneStateChanged(int phoneState) { + @Override + public void onPhoneStateChanged(int phoneState) { State simState = KeyguardUpdateMonitor.getInstance(mContext).getSimState(); updateEmergencyCallButton(simState, phoneState); - }; + } }; private LockPatternUtils mLockPatternUtils; private PowerManager mPowerManager; diff --git a/packages/Keyguard/src/com/android/keyguard/FaceUnlock.java b/packages/Keyguard/src/com/android/keyguard/FaceUnlock.java index de839c6..2f14003 100644 --- a/packages/Keyguard/src/com/android/keyguard/FaceUnlock.java +++ b/packages/Keyguard/src/com/android/keyguard/FaceUnlock.java @@ -37,8 +37,9 @@ import android.view.View; public class FaceUnlock implements BiometricSensorUnlock, Handler.Callback { - private static final boolean DEBUG = false; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final String TAG = "FULLockscreen"; + private static final String FACE_LOCK_PACKAGE = "com.android.facelock"; private final Context mContext; private final LockPatternUtils mLockPatternUtils; @@ -128,7 +129,8 @@ public class FaceUnlock implements BiometricSensorUnlock, Handler.Callback { if (!mBoundToService) { Log.d(TAG, "Binding to Face Unlock service for user=" + mLockPatternUtils.getCurrentUser()); - mContext.bindServiceAsUser(new Intent(IFaceLockInterface.class.getName()), + mContext.bindServiceAsUser( + new Intent(IFaceLockInterface.class.getName()).setPackage(FACE_LOCK_PACKAGE), mConnection, Context.BIND_AUTO_CREATE, new UserHandle(mLockPatternUtils.getCurrentUser())); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java index 3950159..4b386b6 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -231,7 +231,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (mCallback != null) { - mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS); + mCallback.userActivity(KeyguardConstants.DIGIT_PRESS_WAKE_MILLIS); } } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java b/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java index 368a97a..2e112ac 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java @@ -43,7 +43,7 @@ import java.util.List; public abstract class KeyguardActivityLauncher { private static final String TAG = KeyguardActivityLauncher.class.getSimpleName(); - private static final boolean DEBUG = KeyguardHostView.DEBUG; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final String META_DATA_KEYGUARD_LAYOUT = "com.android.keyguard.layout"; private static final Intent SECURE_CAMERA_INTENT = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE) diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java b/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java new file mode 100644 index 0000000..bfa95f3 --- /dev/null +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.keyguard; + +/** + * Defines constants for the Keyguard. + */ +public class KeyguardConstants { + + /** + * Turns on debugging information for the whole Keyguard. This is very verbose and should only + * be used temporarily for debugging. + */ + public static final boolean DEBUG = false; + + /** Timeout used for key presses. */ + public static final int DIGIT_PRESS_WAKE_MILLIS = 5000; +} diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardDisplayManager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardDisplayManager.java index 6bcbd6c..55f965c 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardDisplayManager.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardDisplayManager.java @@ -30,18 +30,18 @@ import android.view.WindowManager; public class KeyguardDisplayManager { protected static final String TAG = "KeyguardDisplayManager"; - private static boolean DEBUG = KeyguardViewMediator.DEBUG; + private static boolean DEBUG = KeyguardConstants.DEBUG; Presentation mPresentation; private MediaRouter mMediaRouter; private Context mContext; private boolean mShowing; - KeyguardDisplayManager(Context context) { + public KeyguardDisplayManager(Context context) { mContext = context; mMediaRouter = (MediaRouter) mContext.getSystemService(Context.MEDIA_ROUTER_SERVICE); } - void show() { + public void show() { if (!mShowing) { if (DEBUG) Slog.v(TAG, "show"); mMediaRouter.addCallback(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, @@ -51,7 +51,7 @@ public class KeyguardDisplayManager { mShowing = true; } - void hide() { + public void hide() { if (mShowing) { if (DEBUG) Slog.v(TAG, "hide"); mMediaRouter.removeCallback(mMediaRouterCallback); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardFaceUnlockView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardFaceUnlockView.java index c2cd32f..900d16e 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardFaceUnlockView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardFaceUnlockView.java @@ -36,7 +36,7 @@ import java.lang.Math; public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecurityView { private static final String TAG = "FULKeyguardFaceUnlockView"; - private static final boolean DEBUG = false; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private KeyguardSecurityCallback mKeyguardSecurityCallback; private LockPatternUtils mLockPatternUtils; private BiometricSensorUnlock mBiometricUnlock; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java index 3f3a5df..7cfd684 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java @@ -61,7 +61,7 @@ import java.util.List; public class KeyguardHostView extends KeyguardViewBase { private static final String TAG = "KeyguardHostView"; - public static boolean DEBUG = KeyguardViewMediator.DEBUG; + public static boolean DEBUG = KeyguardConstants.DEBUG; public static boolean DEBUGXPORT = true; // debug music transport control // Transport control states. @@ -241,7 +241,7 @@ public class KeyguardHostView extends KeyguardViewBase { } } @Override - void onMusicClientIdChanged( + public void onMusicClientIdChanged( int clientGeneration, boolean clearing, android.app.PendingIntent intent) { // Set transport state to invisible until we know music is playing (below) if (DEBUGXPORT && (mClientGeneration != clientGeneration || clearing)) { @@ -449,7 +449,7 @@ public class KeyguardHostView extends KeyguardViewBase { } @Override - protected void setLockPatternUtils(LockPatternUtils utils) { + public void setLockPatternUtils(LockPatternUtils utils) { super.setLockPatternUtils(utils); getSecurityContainer().updateSecurityViews(mViewStateManager.isBouncing()); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserAvatar.java b/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserAvatar.java index aa2ae0e..3aec55c 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserAvatar.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserAvatar.java @@ -37,7 +37,7 @@ import android.widget.TextView; class KeyguardMultiUserAvatar extends FrameLayout { private static final String TAG = KeyguardMultiUserAvatar.class.getSimpleName(); - private static final boolean DEBUG = KeyguardHostView.DEBUG; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private ImageView mUserImage; private TextView mUserName; @@ -123,7 +123,7 @@ class KeyguardMultiUserAvatar extends FrameLayout { mUserName = (TextView) findViewById(R.id.keyguard_user_name); mFramed = (KeyguardCircleFramedDrawable) - KeyguardViewMediator.getAvatarCache().get(user.id); + MultiUserAvatarCache.getInstance().get(user.id); // If we can't find it or the params don't match, create the drawable again if (mFramed == null @@ -143,7 +143,7 @@ class KeyguardMultiUserAvatar extends FrameLayout { mFramed = new KeyguardCircleFramedDrawable(icon, (int) mIconSize, mFrameColor, mStroke, mFrameShadowColor, mShadowRadius, mHighlightColor); - KeyguardViewMediator.getAvatarCache().put(user.id, mFramed); + MultiUserAvatarCache.getInstance().put(user.id, mFramed); } mFramed.reset(); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java index 14de6dd..b4308c6 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java @@ -44,7 +44,7 @@ import java.util.List; public class KeyguardPatternView extends LinearLayout implements KeyguardSecurityView { private static final String TAG = "SecurityPatternView"; - private static final boolean DEBUG = false; + private static final boolean DEBUG = KeyguardConstants.DEBUG; // how long before we clear the wrong pattern private static final int PATTERN_CLEAR_TIMEOUT_MS = 2000; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java index 0f62100..8425c48 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -30,7 +30,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSecurityView { - private static final boolean DEBUG = KeyguardViewMediator.DEBUG; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final String TAG = "KeyguardSecurityView"; private KeyguardSecurityModel mSecurityModel; private boolean mEnableFallback; // TODO: This should get the value from KeyguardPatternView diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java index 70a0e44..07239d1 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java @@ -38,7 +38,7 @@ import com.android.internal.widget.LockPatternUtils; */ public class KeyguardSecurityViewFlipper extends ViewFlipper implements KeyguardSecurityView { private static final String TAG = "KeyguardSecurityViewFlipper"; - private static final boolean DEBUG = false; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private Rect mTempRect = new Rect(); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java index ab24133..03e7b07 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java @@ -36,7 +36,6 @@ import com.android.internal.widget.multiwaveview.GlowPadView; import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener; public class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView { - private static final boolean DEBUG = KeyguardHostView.DEBUG; private static final String TAG = "SecuritySelectorView"; private static final String ASSIST_ICON_METADATA_NAME = "com.android.systemui.action_assist_icon"; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java index ae7ac97..d6a4f52 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java @@ -41,7 +41,7 @@ import android.widget.TextView.OnEditorActionListener; public class KeyguardSimPinView extends KeyguardAbsKeyInputView implements KeyguardSecurityView, OnEditorActionListener, TextWatcher { private static final String LOG_TAG = "KeyguardSimPinView"; - private static final boolean DEBUG = KeyguardViewMediator.DEBUG; + private static final boolean DEBUG = KeyguardConstants.DEBUG; public static final String TAG = "KeyguardSimPinView"; private ProgressDialog mSimUnlockProgressDialog = null; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java index ca4f811..04cbde1 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java @@ -42,7 +42,7 @@ import com.android.internal.telephony.PhoneConstants; public class KeyguardSimPukView extends KeyguardAbsKeyInputView implements KeyguardSecurityView, OnEditorActionListener, TextWatcher { private static final String LOG_TAG = "KeyguardSimPukView"; - private static final boolean DEBUG = KeyguardViewMediator.DEBUG; + private static final boolean DEBUG = KeyguardConstants.DEBUG; public static final String TAG = "KeyguardSimPukView"; private ProgressDialog mSimUnlockProgressDialog = null; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimpleHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimpleHostView.java index cf983cb..5d5168c 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimpleHostView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimpleHostView.java @@ -38,11 +38,6 @@ public class KeyguardSimpleHostView extends KeyguardViewBase { } @Override - public void verifyUnlock() { - // TODO Auto-generated method stub - } - - @Override public void cleanUp() { // TODO Auto-generated method stub } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java index 0bfee38..ae55c4a 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java @@ -33,7 +33,7 @@ import com.android.internal.widget.LockPatternUtils; import java.util.Locale; public class KeyguardStatusView extends GridLayout { - private static final boolean DEBUG = KeyguardViewMediator.DEBUG; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final String TAG = "KeyguardStatusView"; private LockPatternUtils mLockPatternUtils; @@ -50,22 +50,22 @@ public class KeyguardStatusView extends GridLayout { } @Override - void onKeyguardVisibilityChanged(boolean showing) { + public void onKeyguardVisibilityChanged(boolean showing) { if (showing) { if (DEBUG) Slog.v(TAG, "refresh statusview showing:" + showing); refresh(); } - }; + } @Override public void onScreenTurnedOn() { setEnableMarquee(true); - }; + } @Override public void onScreenTurnedOff(int why) { setEnableMarquee(false); - }; + } }; public KeyguardStatusView(Context context) { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java index a7cd909..0d472ae 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java @@ -60,7 +60,7 @@ import java.util.TimeZone; public class KeyguardTransportControlView extends FrameLayout { private static final int RESET_TO_METADATA_DELAY = 5000; - protected static final boolean DEBUG = false; + protected static final boolean DEBUG = KeyguardConstants.DEBUG; protected static final String TAG = "TransportControlView"; private static final boolean ANIMATE_TRANSITIONS = true; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 3b712e9..98ecc9c 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -69,7 +69,7 @@ import java.util.ArrayList; public class KeyguardUpdateMonitor { private static final String TAG = "KeyguardUpdateMonitor"; - private static final boolean DEBUG = false; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final boolean DEBUG_SIM_STATES = DEBUG || false; private static final int FAILED_BIOMETRIC_UNLOCK_ATTEMPTS_BEFORE_BACKUP = 3; private static final int LOW_BATTERY_THRESHOLD = 20; @@ -662,7 +662,7 @@ public class KeyguardUpdateMonitor { * broadcast and hence not handle the event. This method is ultimately called by * PhoneWindowManager in this case. */ - protected void dispatchBootCompleted() { + public void dispatchBootCompleted() { mHandler.sendEmptyMessage(MSG_BOOT_COMPLETED); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 481d132..a9bcb5d 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -20,7 +20,7 @@ import android.app.admin.DevicePolicyManager; import android.graphics.Bitmap; import android.media.AudioManager; import android.os.SystemClock; -import android.util.Log; +import android.telephony.TelephonyManager; import android.view.WindowManagerPolicy; import com.android.internal.telephony.IccCardConstants; @@ -28,7 +28,7 @@ import com.android.internal.telephony.IccCardConstants; /** * Callback for general information relevant to lock screen. */ -class KeyguardUpdateMonitorCallback { +public class KeyguardUpdateMonitorCallback { private static final long VISIBILITY_CHANGED_COLLAPSE_MS = 1000; private long mVisibilityChangedCalled; @@ -40,12 +40,12 @@ class KeyguardUpdateMonitorCallback { * * @param status current battery status */ - void onRefreshBatteryInfo(KeyguardUpdateMonitor.BatteryStatus status) { } + public void onRefreshBatteryInfo(KeyguardUpdateMonitor.BatteryStatus status) { } /** * Called once per minute or when the time changes. */ - void onTimeChanged() { } + public void onTimeChanged() { } /** * Called when the carrier PLMN or SPN changes. @@ -54,14 +54,14 @@ class KeyguardUpdateMonitorCallback { * be displayed. * @param spn The service provider name. May be null if it shouldn't be displayed. */ - void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) { } + public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) { } /** * Called when the ringer mode changes. * @param state the current ringer state, as defined in * {@link AudioManager#RINGER_MODE_CHANGED_ACTION} */ - void onRingerModeChanged(int state) { } + public void onRingerModeChanged(int state) { } /** * Called when the phone state changes. String will be one of: @@ -69,15 +69,15 @@ class KeyguardUpdateMonitorCallback { * {@link TelephonyManager@EXTRA_STATE_RINGING} * {@link TelephonyManager#EXTRA_STATE_OFFHOOK */ - void onPhoneStateChanged(int phoneState) { } + public void onPhoneStateChanged(int phoneState) { } /** * Called when the visibility of the keyguard changes. * @param showing Indicates if the keyguard is now visible. */ - void onKeyguardVisibilityChanged(boolean showing) { } + public void onKeyguardVisibilityChanged(boolean showing) { } - void onKeyguardVisibilityChangedRaw(boolean showing) { + public void onKeyguardVisibilityChangedRaw(boolean showing) { final long now = SystemClock.elapsedRealtime(); if (showing == mShowing && (now - mVisibilityChangedCalled) < VISIBILITY_CHANGED_COLLAPSE_MS) return; @@ -90,44 +90,44 @@ class KeyguardUpdateMonitorCallback { * Called when visibility of lockscreen clock changes, such as when * obscured by a widget. */ - void onClockVisibilityChanged() { } + public void onClockVisibilityChanged() { } /** * Called when the device becomes provisioned */ - void onDeviceProvisioned() { } + public void onDeviceProvisioned() { } /** * Called when the device policy changes. * See {@link DevicePolicyManager#ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED} */ - void onDevicePolicyManagerStateChanged() { } + public void onDevicePolicyManagerStateChanged() { } /** * Called when the user change begins. */ - void onUserSwitching(int userId) { } + public void onUserSwitching(int userId) { } /** * Called when the user change is complete. */ - void onUserSwitchComplete(int userId) { } + public void onUserSwitchComplete(int userId) { } /** * Called when the SIM state changes. * @param simState */ - void onSimStateChanged(IccCardConstants.State simState) { } + public void onSimStateChanged(IccCardConstants.State simState) { } /** * Called when a user is removed. */ - void onUserRemoved(int userId) { } + public void onUserRemoved(int userId) { } /** * Called when the user's info changed. */ - void onUserInfoChanged(int userId) { } + public void onUserInfoChanged(int userId) { } /** * Called when boot completed. @@ -135,12 +135,12 @@ class KeyguardUpdateMonitorCallback { * Note, this callback will only be received if boot complete occurs after registering with * KeyguardUpdateMonitor. */ - void onBootCompleted() { } + public void onBootCompleted() { } /** * Called when audio client attaches or detaches from AudioManager. */ - void onMusicClientIdChanged(int clientGeneration, boolean clearing, PendingIntent intent) { } + public void onMusicClientIdChanged(int clientGeneration, boolean clearing, PendingIntent intent) { } /** * Called when the audio playback state changes. diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java index 78f4506..d3a5941 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java @@ -60,7 +60,7 @@ public abstract class KeyguardViewBase extends FrameLayout implements SecurityCa private AudioManager mAudioManager; private TelephonyManager mTelephonyManager = null; - protected KeyguardViewMediator.ViewMediatorCallback mViewMediatorCallback; + protected ViewMediatorCallback mViewMediatorCallback; protected LockPatternUtils mLockPatternUtils; private OnDismissAction mDismissAction; @@ -68,7 +68,7 @@ public abstract class KeyguardViewBase extends FrameLayout implements SecurityCa // they will be handled here for specific media types such as music, otherwise // the audio service will bring up the volume dialog. private static final boolean KEYGUARD_MANAGES_VOLUME = true; - private static final boolean DEBUG = false; + public static final boolean DEBUG = KeyguardConstants.DEBUG; private static final String TAG = "KeyguardViewBase"; private KeyguardSecurityContainer mSecurityContainer; @@ -231,7 +231,7 @@ public abstract class KeyguardViewBase extends FrameLayout implements SecurityCa /** * Called when the screen turned off. */ - protected void onScreenTurnedOff() { + public void onScreenTurnedOff() { if (DEBUG) Log.d(TAG, String.format("screen off, instance %s at %s", Integer.toHexString(hashCode()), SystemClock.uptimeMillis())); // Once the screen turns off, we no longer consider this to be first boot and we want the @@ -245,7 +245,7 @@ public abstract class KeyguardViewBase extends FrameLayout implements SecurityCa /** * Called when the screen turned on. */ - protected void onScreenTurnedOn() { + public void onScreenTurnedOn() { if (DEBUG) Log.d(TAG, "screen on, instance " + Integer.toHexString(hashCode())); mSecurityContainer.showPrimarySecurityScreen(false); mSecurityContainer.onResume(KeyguardSecurityView.SCREEN_ON); @@ -433,8 +433,7 @@ public abstract class KeyguardViewBase extends FrameLayout implements SecurityCa return false; } - public void setViewMediatorCallback( - KeyguardViewMediator.ViewMediatorCallback viewMediatorCallback) { + public void setViewMediatorCallback(ViewMediatorCallback viewMediatorCallback) { mViewMediatorCallback = viewMediatorCallback; // Update ViewMediator with the current input method requirements mViewMediatorCallback.setNeedsInput(mSecurityContainer.needsInput()); @@ -484,7 +483,7 @@ public abstract class KeyguardViewBase extends FrameLayout implements SecurityCa mActivityLauncher.launchCamera(getHandler(), null); } - protected void setLockPatternUtils(LockPatternUtils utils) { + public void setLockPatternUtils(LockPatternUtils utils) { mLockPatternUtils = utils; mSecurityContainer.setLockPatternUtils(utils); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java deleted file mode 100644 index 5b35ba8..0000000 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java +++ /dev/null @@ -1,575 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.keyguard; - -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; - -import com.android.internal.policy.IKeyguardShowCallback; -import com.android.internal.widget.LockPatternUtils; -import com.android.keyguard.analytics.KeyguardAnalytics; - -import org.xmlpull.v1.XmlPullParser; - -import android.app.ActivityManager; -import android.content.ContentResolver; -import android.content.Context; -import android.content.pm.ActivityInfo; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.Canvas; -import android.graphics.ColorFilter; -import android.graphics.PixelFormat; -import android.graphics.PorterDuff; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.os.IBinder; -import android.os.Parcelable; -import android.os.RemoteException; -import android.os.SystemProperties; -import android.provider.Settings; -import android.util.Log; -import android.util.Slog; -import android.util.SparseArray; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewManager; -import android.view.WindowManager; -import android.widget.FrameLayout; - -/** - * Manages creating, showing, hiding and resetting the keyguard. Calls back - * via {@link KeyguardViewMediator.ViewMediatorCallback} to poke - * the wake lock and report that the keyguard is done, which is in turn, - * reported to this class by the current {@link KeyguardViewBase}. - */ -public class KeyguardViewManager { - private final static boolean DEBUG = KeyguardViewMediator.DEBUG; - private static String TAG = "KeyguardViewManager"; - public final static String IS_SWITCHING_USER = "is_switching_user"; - - // Delay dismissing keyguard to allow animations to complete. - private static final int HIDE_KEYGUARD_DELAY = 500; - - // Timeout used for keypresses - static final int DIGIT_PRESS_WAKE_MILLIS = 5000; - private static final boolean ENABLE_SIMPLE_KEYGUARD = false; - - private final Context mContext; - private final ViewManager mViewManager; - private final KeyguardViewMediator.ViewMediatorCallback mViewMediatorCallback; - private final KeyguardAnalytics.Callback mAnalyticsCallback; - - private WindowManager.LayoutParams mWindowLayoutParams; - private boolean mNeedsInput = false; - - private ViewManagerHost mKeyguardHost; - private KeyguardViewBase mKeyguardView; - - private boolean mScreenOn = false; - private LockPatternUtils mLockPatternUtils; - - private KeyguardUpdateMonitorCallback mBackgroundChanger = new KeyguardUpdateMonitorCallback() { - @Override - public void onSetBackground(Bitmap bmp) { - mKeyguardHost.setCustomBackground(bmp != null ? - new BitmapDrawable(mContext.getResources(), bmp) : null); - updateShowWallpaper(bmp == null); - } - }; - - public interface ShowListener { - void onShown(IBinder windowToken); - }; - - /** - * @param context Used to create views. - * @param viewManager Keyguard will be attached to this. - * @param callback Used to notify of changes. - * @param lockPatternUtils - */ - public KeyguardViewManager(Context context, ViewManager viewManager, - KeyguardViewMediator.ViewMediatorCallback callback, - LockPatternUtils lockPatternUtils, KeyguardAnalytics.Callback analyticsCallback) { - mContext = context; - mViewManager = viewManager; - mViewMediatorCallback = callback; - mLockPatternUtils = lockPatternUtils; - mAnalyticsCallback = analyticsCallback; - } - - /** - * Show the keyguard. Will handle creating and attaching to the view manager - * lazily. - */ - public synchronized void show(Bundle options) { - if (DEBUG) Log.d(TAG, "show(); mKeyguardView==" + mKeyguardView); - if (mAnalyticsCallback != null) { - mAnalyticsCallback.onShow(); - } - - boolean enableScreenRotation = shouldEnableScreenRotation(); - - maybeCreateKeyguardLocked(enableScreenRotation, false, options); - maybeEnableScreenRotation(enableScreenRotation); - - // Disable common aspects of the system/status/navigation bars that are not appropriate or - // useful on any keyguard screen but can be re-shown by dialogs or SHOW_WHEN_LOCKED - // activities. Other disabled bits are handled by the KeyguardViewMediator talking - // directly to the status bar service. - int visFlags = View.STATUS_BAR_DISABLE_HOME; - if (shouldEnableTranslucentDecor()) { - mWindowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS - | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; - } - if (DEBUG) Log.v(TAG, "show:setSystemUiVisibility(" + Integer.toHexString(visFlags)+")"); - mKeyguardHost.setSystemUiVisibility(visFlags); - - mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams); - mKeyguardHost.setVisibility(View.VISIBLE); - mKeyguardView.show(); - mKeyguardView.requestFocus(); - } - - private boolean shouldEnableScreenRotation() { - Resources res = mContext.getResources(); - return SystemProperties.getBoolean("lockscreen.rot_override",false) - || res.getBoolean(R.bool.config_enableLockScreenRotation); - } - - private boolean shouldEnableTranslucentDecor() { - Resources res = mContext.getResources(); - return res.getBoolean(R.bool.config_enableLockScreenTranslucentDecor); - } - - class ViewManagerHost extends FrameLayout { - private static final int BACKGROUND_COLOR = 0x70000000; - - private Drawable mCustomBackground; - - // This is a faster way to draw the background on devices without hardware acceleration - private final Drawable mBackgroundDrawable = new Drawable() { - @Override - public void draw(Canvas canvas) { - if (mCustomBackground != null) { - final Rect bounds = mCustomBackground.getBounds(); - final int vWidth = getWidth(); - final int vHeight = getHeight(); - - final int restore = canvas.save(); - canvas.translate(-(bounds.width() - vWidth) / 2, - -(bounds.height() - vHeight) / 2); - mCustomBackground.draw(canvas); - canvas.restoreToCount(restore); - } else { - canvas.drawColor(BACKGROUND_COLOR, PorterDuff.Mode.SRC); - } - } - - @Override - public void setAlpha(int alpha) { - } - - @Override - public void setColorFilter(ColorFilter cf) { - } - - @Override - public int getOpacity() { - return PixelFormat.TRANSLUCENT; - } - }; - - public ViewManagerHost(Context context) { - super(context); - setBackground(mBackgroundDrawable); - } - - public void setCustomBackground(Drawable d) { - mCustomBackground = d; - if (d != null) { - d.setColorFilter(BACKGROUND_COLOR, PorterDuff.Mode.SRC_OVER); - } - computeCustomBackgroundBounds(); - invalidate(); - } - - private void computeCustomBackgroundBounds() { - if (mCustomBackground == null) return; // Nothing to do - if (!isLaidOut()) return; // We'll do this later - - final int bgWidth = mCustomBackground.getIntrinsicWidth(); - final int bgHeight = mCustomBackground.getIntrinsicHeight(); - final int vWidth = getWidth(); - final int vHeight = getHeight(); - - final float bgAspect = (float) bgWidth / bgHeight; - final float vAspect = (float) vWidth / vHeight; - - if (bgAspect > vAspect) { - mCustomBackground.setBounds(0, 0, (int) (vHeight * bgAspect), vHeight); - } else { - mCustomBackground.setBounds(0, 0, vWidth, (int) (vWidth / bgAspect)); - } - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - computeCustomBackgroundBounds(); - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - if (mKeyguardHost.getVisibility() == View.VISIBLE) { - // only propagate configuration messages if we're currently showing - maybeCreateKeyguardLocked(shouldEnableScreenRotation(), true, null); - } else { - if (DEBUG) Log.v(TAG, "onConfigurationChanged: view not visible"); - } - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (mKeyguardView != null) { - // Always process back and menu keys, regardless of focus - if (event.getAction() == KeyEvent.ACTION_DOWN) { - int keyCode = event.getKeyCode(); - if (keyCode == KeyEvent.KEYCODE_BACK && mKeyguardView.handleBackKey()) { - return true; - } else if (keyCode == KeyEvent.KEYCODE_MENU && mKeyguardView.handleMenuKey()) { - return true; - } - } - // Always process media keys, regardless of focus - if (mKeyguardView.dispatchKeyEvent(event)) { - return true; - } - } - return super.dispatchKeyEvent(event); - } - - @Override - public boolean dispatchTouchEvent(MotionEvent ev) { - boolean result = false; - if (mAnalyticsCallback != null) { - result = mAnalyticsCallback.onTouchEvent(ev, getWidth(), getHeight()) || result; - } - return super.dispatchTouchEvent(ev) || result; - } - } - - SparseArray<Parcelable> mStateContainer = new SparseArray<Parcelable>(); - private int mCurrentLayout; - - private void maybeCreateKeyguardLocked(boolean enableScreenRotation, boolean force, - Bundle options) { - if (mKeyguardHost != null) { - mKeyguardHost.saveHierarchyState(mStateContainer); - } - - if (mKeyguardHost == null) { - if (DEBUG) Log.d(TAG, "keyguard host is null, creating it..."); - - mKeyguardHost = new ViewManagerHost(mContext); - - int flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR - | WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN - | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; - - if (!mNeedsInput) { - flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; - } - - final int stretch = ViewGroup.LayoutParams.MATCH_PARENT; - final int type = WindowManager.LayoutParams.TYPE_KEYGUARD; - WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - stretch, stretch, type, flags, PixelFormat.TRANSLUCENT); - lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; - lp.windowAnimations = R.style.Animation_LockScreen; - lp.screenOrientation = enableScreenRotation ? - ActivityInfo.SCREEN_ORIENTATION_USER : ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; - - if (ActivityManager.isHighEndGfx()) { - lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; - lp.privateFlags |= - WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED; - } - lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY; - lp.inputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; - lp.setTitle("Keyguard"); - mWindowLayoutParams = lp; - mViewManager.addView(mKeyguardHost, lp); - - KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mBackgroundChanger); - } - - if (force || mKeyguardView == null) { - mKeyguardHost.setCustomBackground(null); - mKeyguardHost.removeAllViews(); - int layout = (allowNotificationsOnSecureKeyguard() && ENABLE_SIMPLE_KEYGUARD) - ? R.layout.keyguard_simple_host_view - : R.layout.keyguard_host_view; - if (mCurrentLayout != layout) { - mStateContainer.clear(); // don't restore to the wrong view hierarchy - mCurrentLayout = layout; - } - mKeyguardView = inflateKeyguardView(options, layout); - mKeyguardView.requestFocus(); - } - updateUserActivityTimeoutInWindowLayoutParams(); - mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams); - - mKeyguardHost.restoreHierarchyState(mStateContainer); - } - - private boolean allowNotificationsOnSecureKeyguard() { - ContentResolver cr = mContext.getContentResolver(); - return Settings.Global.getInt(cr, Settings.Global.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) == 1; - } - - private KeyguardViewBase inflateKeyguardView(Bundle options, int layoutId) { - View v = mKeyguardHost.findViewById(R.id.keyguard_host_view); - if (v != null) { - mKeyguardHost.removeView(v); - } - final LayoutInflater inflater = LayoutInflater.from(mContext); - View view = inflater.inflate(layoutId, mKeyguardHost, true); - KeyguardViewBase keyguard = (KeyguardViewBase) view.findViewById(R.id.keyguard_host_view); - keyguard.setLockPatternUtils(mLockPatternUtils); - keyguard.setViewMediatorCallback(mViewMediatorCallback); - keyguard.onUserSwitching(options != null && options.getBoolean(IS_SWITCHING_USER)); - keyguard.onCreateOptions(options); - return keyguard; - } - - public void updateUserActivityTimeout() { - updateUserActivityTimeoutInWindowLayoutParams(); - mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams); - } - - private void updateUserActivityTimeoutInWindowLayoutParams() { - // Use the user activity timeout requested by the keyguard view, if any. - if (mKeyguardView != null) { - long timeout = mKeyguardView.getUserActivityTimeout(); - if (timeout >= 0) { - mWindowLayoutParams.userActivityTimeout = timeout; - return; - } - } - - // Otherwise, use the default timeout. - mWindowLayoutParams.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS; - } - - private void maybeEnableScreenRotation(boolean enableScreenRotation) { - // TODO: move this outside - if (enableScreenRotation) { - if (DEBUG) Log.d(TAG, "Rotation sensor for lock screen On!"); - mWindowLayoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER; - } else { - if (DEBUG) Log.d(TAG, "Rotation sensor for lock screen Off!"); - mWindowLayoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; - } - mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams); - } - - void updateShowWallpaper(boolean show) { - if (show) { - mWindowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; - } else { - mWindowLayoutParams.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; - } - mWindowLayoutParams.format = show ? PixelFormat.TRANSLUCENT : PixelFormat.OPAQUE; - - mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams); - } - - public void setNeedsInput(boolean needsInput) { - mNeedsInput = needsInput; - if (mWindowLayoutParams != null) { - if (needsInput) { - mWindowLayoutParams.flags &= - ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; - } else { - mWindowLayoutParams.flags |= - WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; - } - - try { - mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams); - } catch (java.lang.IllegalArgumentException e) { - // TODO: Ensure this method isn't called on views that are changing... - Log.w(TAG,"Can't update input method on " + mKeyguardHost + " window not attached"); - } - } - } - - /** - * Reset the state of the view. - */ - public synchronized void reset(Bundle options) { - if (DEBUG) Log.d(TAG, "reset()"); - // User might have switched, check if we need to go back to keyguard - // TODO: It's preferable to stay and show the correct lockscreen or unlock if none - maybeCreateKeyguardLocked(shouldEnableScreenRotation(), true, options); - } - - public synchronized void onScreenTurnedOff() { - if (DEBUG) Log.d(TAG, "onScreenTurnedOff()"); - mScreenOn = false; - if (mKeyguardView != null) { - mKeyguardView.onScreenTurnedOff(); - } - } - - public synchronized void onScreenTurnedOn(final IKeyguardShowCallback callback) { - if (DEBUG) Log.d(TAG, "onScreenTurnedOn()"); - mScreenOn = true; - - // If keyguard is not showing, we need to inform PhoneWindowManager with a null - // token so it doesn't wait for us to draw... - final IBinder token = isShowing() ? mKeyguardHost.getWindowToken() : null; - - if (DEBUG && token == null) Slog.v(TAG, "send wm null token: " - + (mKeyguardHost == null ? "host was null" : "not showing")); - - if (mKeyguardView != null) { - mKeyguardView.onScreenTurnedOn(); - - // Caller should wait for this window to be shown before turning - // on the screen. - if (callback != null) { - if (mKeyguardHost.getVisibility() == View.VISIBLE) { - // Keyguard may be in the process of being shown, but not yet - // updated with the window manager... give it a chance to do so. - mKeyguardHost.post(new Runnable() { - @Override - public void run() { - try { - callback.onShown(token); - } catch (RemoteException e) { - Slog.w(TAG, "Exception calling onShown():", e); - } - } - }); - } else { - try { - callback.onShown(token); - } catch (RemoteException e) { - Slog.w(TAG, "Exception calling onShown():", e); - } - } - } - } else if (callback != null) { - try { - callback.onShown(token); - } catch (RemoteException e) { - Slog.w(TAG, "Exception calling onShown():", e); - } - } - if (mAnalyticsCallback != null) { - mAnalyticsCallback.onScreenOn(); - } - } - - public synchronized void verifyUnlock() { - if (DEBUG) Log.d(TAG, "verifyUnlock()"); - show(null); - mKeyguardView.verifyUnlock(); - } - - /** - * Hides the keyguard view - */ - public synchronized void hide() { - if (DEBUG) Log.d(TAG, "hide()"); - - if (mAnalyticsCallback != null) { - mAnalyticsCallback.onHide(); - } - - if (mKeyguardHost != null) { - mKeyguardHost.setVisibility(View.GONE); - - // We really only want to preserve keyguard state for configuration changes. Hence - // we should clear state of widgets (e.g. Music) when we hide keyguard so it can - // start with a fresh state when we return. - mStateContainer.clear(); - - // Don't do this right away, so we can let the view continue to animate - // as it goes away. - if (mKeyguardView != null) { - final KeyguardViewBase lastView = mKeyguardView; - mKeyguardView = null; - mKeyguardHost.postDelayed(new Runnable() { - @Override - public void run() { - synchronized (KeyguardViewManager.this) { - lastView.cleanUp(); - // Let go of any large bitmaps. - mKeyguardHost.setCustomBackground(null); - updateShowWallpaper(true); - mKeyguardHost.removeView(lastView); - mViewMediatorCallback.keyguardGone(); - } - } - }, HIDE_KEYGUARD_DELAY); - } - } - } - - /** - * Dismisses the keyguard by going to the next screen or making it gone. - */ - public synchronized void dismiss() { - if (mScreenOn) { - mKeyguardView.dismiss(); - } - } - - /** - * @return Whether the keyguard is showing - */ - public synchronized boolean isShowing() { - return (mKeyguardHost != null && mKeyguardHost.getVisibility() == View.VISIBLE); - } - - public void showAssistant() { - if (mKeyguardView != null) { - mKeyguardView.showAssistant(); - } - } - - public void dispatch(MotionEvent event) { - if (mKeyguardView != null) { - mKeyguardView.onExternalMotionEvent(event); - } - } - - public void launchCamera() { - if (mKeyguardView != null) { - mKeyguardView.launchCamera(); - } - } -} diff --git a/packages/Keyguard/src/com/android/keyguard/MultiUserAvatarCache.java b/packages/Keyguard/src/com/android/keyguard/MultiUserAvatarCache.java index 9930e72..7128211 100644 --- a/packages/Keyguard/src/com/android/keyguard/MultiUserAvatarCache.java +++ b/packages/Keyguard/src/com/android/keyguard/MultiUserAvatarCache.java @@ -22,12 +22,21 @@ import java.util.HashMap; public class MultiUserAvatarCache { + private static MultiUserAvatarCache sInstance; + private final HashMap<Integer, Drawable> mCache; - public MultiUserAvatarCache() { + private MultiUserAvatarCache() { mCache = new HashMap<Integer, Drawable>(); } + public static MultiUserAvatarCache getInstance() { + if (sInstance == null) { + sInstance = new MultiUserAvatarCache(); + } + return sInstance; + } + public void clear(int userId) { mCache.remove(userId); } diff --git a/packages/Keyguard/src/com/android/keyguard/PagedView.java b/packages/Keyguard/src/com/android/keyguard/PagedView.java index d233ee9..b42a085 100644 --- a/packages/Keyguard/src/com/android/keyguard/PagedView.java +++ b/packages/Keyguard/src/com/android/keyguard/PagedView.java @@ -56,7 +56,7 @@ import java.util.ArrayList; public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarchyChangeListener { private static final int WARP_SNAP_DURATION = 160; private static final String TAG = "WidgetPagedView"; - private static final boolean DEBUG = false; + private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final boolean DEBUG_WARP = false; protected static final int INVALID_PAGE = -1; private static final int WARP_PEEK_ANIMATION_DURATION = 150; diff --git a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java index 3d515ce..ab9286b 100644 --- a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java +++ b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java @@ -45,7 +45,7 @@ import android.widget.Scroller; */ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout { private static final String TAG = "SlidingChallengeLayout"; - private static final boolean DEBUG = false; + private static final boolean DEBUG = KeyguardConstants.DEBUG; // The drag handle is measured in dp above & below the top edge of the // challenge view; these parameters change based on whether the challenge diff --git a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java new file mode 100644 index 0000000..1f23785 --- /dev/null +++ b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.keyguard; + +/** + * The callback used by the keyguard view to tell the {@link KeyguardViewMediator} + * various things. + */ +public interface ViewMediatorCallback { + /** + * Reports user activity and requests that the screen stay on. + */ + void userActivity(); + + /** + * Reports user activity and requests that the screen stay on for at least + * the specified amount of time. + * @param millis The amount of time in millis. This value is currently ignored. + */ + void userActivity(long millis); + + /** + * Report that the keyguard is done. + * @param authenticated Whether the user securely got past the keyguard. + * the only reason for this to be false is if the keyguard was instructed + * to appear temporarily to verify the user is supposed to get past the + * keyguard, and the user fails to do so. + */ + void keyguardDone(boolean authenticated); + + /** + * Report that the keyguard is done drawing. + */ + void keyguardDoneDrawing(); + + /** + * Tell ViewMediator that the current view needs IME input + * @param needsInput + */ + void setNeedsInput(boolean needsInput); + + /** + * Tell view mediator that the keyguard view's desired user activity timeout + * has changed and needs to be reapplied to the window. + */ + void onUserActivityTimeoutChanged(); + + /** + * Report that the keyguard is dismissable, pending the next keyguardDone call. + */ + void keyguardDonePending(); + + /** + * Report when keyguard is actually gone + */ + void keyguardGone(); +} diff --git a/packages/Keyguard/src/com/android/keyguard/analytics/KeyguardAnalytics.java b/packages/Keyguard/src/com/android/keyguard/analytics/KeyguardAnalytics.java index 55750cc..20af2f1 100644 --- a/packages/Keyguard/src/com/android/keyguard/analytics/KeyguardAnalytics.java +++ b/packages/Keyguard/src/com/android/keyguard/analytics/KeyguardAnalytics.java @@ -80,7 +80,7 @@ public class KeyguardAnalytics implements SensorEventListener { public void onScreenOn(); public void onScreenOff(); public boolean onTouchEvent(MotionEvent ev, int width, int height); - public void onSetHidden(boolean hidden); + public void onSetOccluded(boolean hidden); } public interface SessionTypeAdapter { @@ -256,11 +256,11 @@ public class KeyguardAnalytics implements SensorEventListener { } @Override - public void onSetHidden(boolean hidden) { + public void onSetOccluded(boolean hidden) { synchronized (KeyguardAnalytics.this) { if (hidden != mHidden) { if (DEBUG) { - Log.d(TAG, "onSetHidden(" + hidden + ")"); + Log.d(TAG, "onSetOccluded(" + hidden + ")"); } mHidden = hidden; if (hidden) { diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 5d03367..5273f1f 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -71,6 +71,13 @@ <!-- Keyguard --> <uses-permission android:name="android.permission.CONTROL_KEYGUARD" /> + <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> + <uses-permission android:name="android.permission.GET_ACCOUNTS" /> + <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> + <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> + <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" /> + <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" /> + <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" /> <!-- Wifi Display --> <uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" /> diff --git a/packages/SystemUI/res/layout-sw600dp/super_status_bar.xml b/packages/SystemUI/res/layout-sw600dp/super_status_bar.xml index 49314cd..0916d15 100644 --- a/packages/SystemUI/res/layout-sw600dp/super_status_bar.xml +++ b/packages/SystemUI/res/layout-sw600dp/super_status_bar.xml @@ -21,9 +21,10 @@ <com.android.systemui.statusbar.phone.StatusBarWindowView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui" + android:layout_width="match_parent" + android:layout_height="match_parent" android:focusable="true" android:descendantFocusability="afterDescendants" - android:fitsSystemWindows="true" > <include layout="@layout/status_bar" @@ -36,6 +37,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="@*android:dimen/status_bar_height" + android:layout_marginBottom="@*android:dimen/navigation_bar_height" > <include layout="@layout/status_bar_expanded" android:layout_width="@dimen/notification_panel_width" @@ -49,9 +51,4 @@ /> </com.android.systemui.statusbar.phone.PanelHolder> - <FrameLayout android:id="@+id/keyguard" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:visibility="gone"> - </FrameLayout> </com.android.systemui.statusbar.phone.StatusBarWindowView> diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index ea6be1b..1b35537 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -27,7 +27,6 @@ android:orientation="vertical" android:focusable="true" android:descendantFocusability="afterDescendants" - android:fitsSystemWindows="true" > <ImageView diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml index 188c8a6..8e9004d 100644 --- a/packages/SystemUI/res/layout/super_status_bar.xml +++ b/packages/SystemUI/res/layout/super_status_bar.xml @@ -21,9 +21,10 @@ <com.android.systemui.statusbar.phone.StatusBarWindowView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui" + android:layout_width="match_parent" + android:layout_height="match_parent" android:focusable="true" android:descendantFocusability="afterDescendants" - android:fitsSystemWindows="true" android:background="@android:color/transparent" > @@ -36,6 +37,7 @@ android:id="@+id/panel_holder" android:layout_width="match_parent" android:layout_height="match_parent" + android:layout_marginBottom="@*android:dimen/navigation_bar_height" > <include layout="@layout/status_bar_expanded" android:layout_width="match_parent" @@ -48,9 +50,4 @@ /> </com.android.systemui.statusbar.phone.PanelHolder> - <FrameLayout android:id="@+id/keyguard" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:visibility="gone"> - </FrameLayout> </com.android.systemui.statusbar.phone.StatusBarWindowView> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index cc87735..c7d29f0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -20,20 +20,20 @@ import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardService; import com.android.internal.policy.IKeyguardServiceConstants; import com.android.internal.policy.IKeyguardShowCallback; -import com.android.systemui.statusbar.CommandQueue; +import com.android.internal.widget.LockPatternUtils; +import com.android.systemui.statusbar.phone.PhoneStatusBar; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.statusbar.phone.StatusBarWindowManager; -import android.app.ActivityManagerNative; import android.app.Service; -import android.app.StatusBarManager; -import android.content.Context; import android.content.Intent; import android.os.Binder; import android.os.Bundle; import android.os.Debug; import android.os.IBinder; -import android.os.RemoteException; import android.util.Log; import android.view.MotionEvent; +import android.view.ViewGroup; import static android.content.pm.PackageManager.PERMISSION_GRANTED; @@ -43,11 +43,12 @@ public class KeyguardService extends Service { public static final String ACTION_STATUS_BAR_BIND = "action.status_bar_bind"; - private CommandQueue mCommandQueue; - private StatusBarManager mStatusBarManager; + private KeyguardViewMediator mKeyguardViewMediator; @Override public void onCreate() { + LockPatternUtils lockPatternUtils = new LockPatternUtils(this); + mKeyguardViewMediator = new KeyguardViewMediator(this, lockPatternUtils); } @Override @@ -67,205 +68,158 @@ public class KeyguardService extends Service { } } - private final KeyguardStatusBarBinder mKeyguardStatusBarBinder = - new KeyguardStatusBarBinder() { + private final KeyguardStatusBarBinder mKeyguardStatusBarBinder = new KeyguardStatusBarBinder() { @Override - public void register(CommandQueue commandQueue) { - mCommandQueue = commandQueue; - } - - @Override - public void dismissKeyguard() { - try { - mBinder.dismiss(); - } catch (RemoteException e) { - Log.e(TAG, "Could not dismiss keyguard", e); - } + public void registerStatusBar(PhoneStatusBar phoneStatusBar, ViewGroup container, + StatusBarWindowManager statusBarWindowManager) { + mKeyguardViewMediator.registerStatusBar(phoneStatusBar, container, + statusBarWindowManager); } }; private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() { - /** Whether the Keyguard is visible. */ - private boolean mShowing; - - /** - * Whether the Keyguard is hidden by a window with - * {@link android.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED}. So mShowing might - * be true, but also mHidden. So in the end, the Keyguard would not be visible. - */ - private boolean mHidden; - private boolean mShowingDream; + private boolean mIsOccluded; @Override - public synchronized boolean isShowing() { - return mShowing; + public boolean isShowing() { + return mKeyguardViewMediator.isShowing(); } @Override - public synchronized boolean isSecure() { - return true; + public boolean isSecure() { + return mKeyguardViewMediator.isSecure(); } @Override - public synchronized boolean isShowingAndNotHidden() { - return mShowing && !mHidden; + public boolean isShowingAndNotOccluded() { + return mKeyguardViewMediator.isShowingAndNotOccluded(); } @Override - public synchronized boolean isInputRestricted() { - return false; + public boolean isInputRestricted() { + return mKeyguardViewMediator.isInputRestricted(); } @Override - public synchronized void verifyUnlock(IKeyguardExitCallback callback) { + public void verifyUnlock(IKeyguardExitCallback callback) { + checkPermission(); + mKeyguardViewMediator.verifyUnlock(callback); } @Override - public synchronized void keyguardDone(boolean authenticated, boolean wakeup) { + public void keyguardDone(boolean authenticated, boolean wakeup) { checkPermission(); - mShowing = false; - adjustStatusBarLocked(); - if (mCommandQueue != null) { - mCommandQueue.setKeyguardShown(false, null, true); - } + mKeyguardViewMediator.keyguardDone(authenticated, wakeup); } @Override - public synchronized int setHidden(boolean isHidden) { + public int setOccluded(boolean isOccluded) { checkPermission(); - if (mHidden == isHidden) { - return IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_NONE; - } - mHidden = isHidden; - try { - ActivityManagerNative.getDefault().setLockScreenShown(mShowing && !mHidden - || mShowingDream); - } catch (RemoteException e) { - Log.e(TAG, "Could not update activity manager lock screen state", e); - } - adjustStatusBarLocked(); - if (mCommandQueue != null) { - mCommandQueue.setKeyguardShown(!isHidden, null, false); + synchronized (this) { + int result; + if (isOccluded && mKeyguardViewMediator.isShowing() + && !mIsOccluded) { + result = IKeyguardServiceConstants + .KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_UNSET_FLAGS; + } else if (!isOccluded && mKeyguardViewMediator.isShowing() + && mIsOccluded) { + result = IKeyguardServiceConstants + .KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_SET_FLAGS; + } else { + result = IKeyguardServiceConstants.KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_NONE; + } + if (mIsOccluded != isOccluded) { + mKeyguardViewMediator.setOccluded(isOccluded); + + // Cache the value so we always have a fresh view in whether Keyguard is occluded. + // If we would just call mKeyguardViewMediator.isOccluded(), this might be stale + // because that value gets updated in another thread. + mIsOccluded = isOccluded; + } + return result; } - return isShowingAndNotHidden() - ? IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_SET_FLAGS - : IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_UNSET_FLAGS; } @Override - public synchronized void dismiss() { + public void dismiss() { checkPermission(); - mShowing = false; - adjustStatusBarLocked(); - if (mCommandQueue != null) { - mCommandQueue.setKeyguardShown(false, null, true); - } + mKeyguardViewMediator.dismiss(); } @Override - public synchronized void onDreamingStarted() { + public void onDreamingStarted() { checkPermission(); - mShowingDream = true; + mKeyguardViewMediator.onDreamingStarted(); } @Override - public synchronized void onDreamingStopped() { + public void onDreamingStopped() { checkPermission(); - mShowingDream = false; + mKeyguardViewMediator.onDreamingStopped(); } @Override - public synchronized void onScreenTurnedOff(int reason) { + public void onScreenTurnedOff(int reason) { checkPermission(); + mKeyguardViewMediator.onScreenTurnedOff(reason); } @Override - public synchronized void onScreenTurnedOn(IKeyguardShowCallback callback) { + public void onScreenTurnedOn(IKeyguardShowCallback callback) { checkPermission(); - mShowing = true; - adjustStatusBarLocked(); - if (mCommandQueue != null) { - mCommandQueue.setKeyguardShown(isShowingAndNotHidden(), callback, true); - } + mKeyguardViewMediator.onScreenTurnedOn(callback); } @Override - public synchronized void setKeyguardEnabled(boolean enabled) { + public void setKeyguardEnabled(boolean enabled) { checkPermission(); + mKeyguardViewMediator.setKeyguardEnabled(enabled); } @Override - public synchronized boolean isDismissable() { - return !isSecure(); + public boolean isDismissable() { + return mKeyguardViewMediator.isDismissable(); } @Override - public synchronized void onSystemReady() { + public void onSystemReady() { checkPermission(); + mKeyguardViewMediator.onSystemReady(); } @Override - public synchronized void doKeyguardTimeout(Bundle options) { + public void doKeyguardTimeout(Bundle options) { checkPermission(); + mKeyguardViewMediator.doKeyguardTimeout(options); } @Override - public synchronized void setCurrentUser(int userId) { + public void setCurrentUser(int userId) { checkPermission(); + mKeyguardViewMediator.setCurrentUser(userId); } @Override - public synchronized void showAssistant() { + public void showAssistant() { checkPermission(); } @Override - public synchronized void dispatch(MotionEvent event) { + public void dispatch(MotionEvent event) { checkPermission(); } @Override - public synchronized void launchCamera() { + public void launchCamera() { checkPermission(); } @Override - public synchronized void onBootCompleted() { + public void onBootCompleted() { checkPermission(); - onScreenTurnedOn(null); - } - - private void adjustStatusBarLocked() { - if (mStatusBarManager == null) { - mStatusBarManager = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE); - } - if (mStatusBarManager == null) { - Log.w(TAG, "Could not get status bar manager"); - } else { - // Disable aspects of the system/status/navigation bars that must not be re-enabled by - // windows that appear on top, ever - int flags = StatusBarManager.DISABLE_NONE; - if (isShowing()) { - // Permanently disable components not available when keyguard is enabled - // (like recents). Temporary enable/disable (e.g. the "back" button) are - // done in KeyguardHostView. - flags |= StatusBarManager.DISABLE_RECENT; - if (isSecure()) { - // showing secure lockscreen; disable ticker and switch private notifications - // to show their public versions, if available. - flags |= StatusBarManager.DISABLE_PRIVATE_NOTIFICATIONS; - } - if (false) { - flags |= StatusBarManager.DISABLE_SEARCH; - } - } - if (isShowingAndNotHidden()) { - flags |= StatusBarManager.DISABLE_HOME; - } - mStatusBarManager.disable(flags); - } + mKeyguardViewMediator.onBootCompleted(); } }; } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardStatusBarBinder.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardStatusBarBinder.java index 566943b..04b6c29 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardStatusBarBinder.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardStatusBarBinder.java @@ -16,17 +16,18 @@ package com.android.systemui.keyguard; -import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.phone.PhoneStatusBar; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.statusbar.phone.StatusBarWindowManager; import android.os.Binder; -import android.os.IBinder; +import android.view.ViewGroup; /** * Communication interface from status bar to {@link com.android.systemui.keyguard.KeyguardService}. */ public abstract class KeyguardStatusBarBinder extends Binder { - public abstract void register(CommandQueue commandQueue); - - public abstract void dismissKeyguard(); + public abstract void registerStatusBar(PhoneStatusBar phoneStatusBar, ViewGroup container, + StatusBarWindowManager statusBarWindowManager); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 31e806c..39ec86f 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -11,15 +11,10 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License */ -package com.android.keyguard; - -import com.android.internal.policy.IKeyguardExitCallback; -import com.android.internal.policy.IKeyguardShowCallback; -import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; -import static com.android.keyguard.analytics.KeyguardAnalytics.SessionTypeAdapter; +package com.android.systemui.keyguard; import android.app.Activity; import android.app.ActivityManagerNative; @@ -50,17 +45,30 @@ import android.telephony.TelephonyManager; import android.util.EventLog; import android.util.Log; import android.util.Slog; -import android.view.MotionEvent; +import android.view.ViewGroup; import android.view.WindowManager; import android.view.WindowManagerPolicy; +import com.android.internal.policy.IKeyguardExitCallback; +import com.android.internal.policy.IKeyguardShowCallback; import com.android.internal.telephony.IccCardConstants; import com.android.internal.widget.LockPatternUtils; -import com.android.keyguard.analytics.Session; +import com.android.keyguard.KeyguardDisplayManager; +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.KeyguardUpdateMonitorCallback; +import com.android.keyguard.MultiUserAvatarCache; +import com.android.keyguard.ViewMediatorCallback; import com.android.keyguard.analytics.KeyguardAnalytics; +import com.android.keyguard.analytics.Session; +import com.android.systemui.statusbar.phone.PhoneStatusBar; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.statusbar.phone.StatusBarWindowManager; import java.io.File; +import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; +import static com.android.keyguard.analytics.KeyguardAnalytics.SessionTypeAdapter; + /** * Mediates requests related to the keyguard. This includes queries about the @@ -95,12 +103,12 @@ import java.io.File; * false, this will override all other conditions for turning on the keyguard. * * Threading and synchronization: - * This class is created by the initialization routine of the {@link WindowManagerPolicy}, + * This class is created by the initialization routine of the {@link android.view.WindowManagerPolicy}, * and runs on its thread. The keyguard UI is created from that thread in the * constructor of this class. The apis may be called from other threads, including the * {@link com.android.server.input.InputManagerService}'s and {@link android.view.WindowManager}'s. * Therefore, methods on this class are synchronized, and any action that is pointed - * directly to the keyguard UI is posted to a {@link Handler} to ensure it is taken on the UI + * directly to the keyguard UI is posted to a {@link android.os.Handler} to ensure it is taken on the UI * thread of the keyguard. */ public class KeyguardViewMediator { @@ -124,17 +132,14 @@ public class KeyguardViewMediator { private static final int KEYGUARD_DONE = 9; private static final int KEYGUARD_DONE_DRAWING = 10; private static final int KEYGUARD_DONE_AUTHENTICATING = 11; - private static final int SET_HIDDEN = 12; + private static final int SET_OCCLUDED = 12; private static final int KEYGUARD_TIMEOUT = 13; - private static final int SHOW_ASSISTANT = 14; - private static final int DISPATCH_EVENT = 15; - private static final int LAUNCH_CAMERA = 16; private static final int DISMISS = 17; /** * The default amount of time we stay awake (used for all key input) */ - protected static final int AWAKE_INTERVAL_DEFAULT_MS = 10000; + public static final int AWAKE_INTERVAL_DEFAULT_MS = 10000; /** * How long to wait after the screen turns off due to timeout before @@ -158,13 +163,13 @@ public class KeyguardViewMediator { /** * Allow the user to expand the status bar when a SECURE keyguard is engaged - * and {@link Settings.Global#LOCK_SCREEN_SHOW_NOTIFICATIONS} is set + * and {@link android.provider.Settings.Global#LOCK_SCREEN_SHOW_NOTIFICATIONS} is set * (private notifications will be masked). */ private static final boolean ENABLE_SECURE_STATUS_BAR_EXPAND = true; /** - * Default value of {@link Settings.Global#LOCK_SCREEN_SHOW_NOTIFICATIONS}. + * Default value of {@link android.provider.Settings.Global#LOCK_SCREEN_SHOW_NOTIFICATIONS}. */ private static final boolean ALLOW_NOTIFICATIONS_DEFAULT = false; @@ -204,7 +209,7 @@ public class KeyguardViewMediator { */ private PowerManager.WakeLock mShowKeyguardWakeLock; - private KeyguardViewManager mKeyguardViewManager; + private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private final KeyguardAnalytics mKeyguardAnalytics; @@ -227,7 +232,7 @@ public class KeyguardViewMediator { private boolean mShowing; // true if the keyguard is hidden by another window - private boolean mHidden = false; + private boolean mOccluded = false; /** * Helps remember whether the screen has turned on since the last time @@ -272,7 +277,7 @@ public class KeyguardViewMediator { private int mLockSoundStreamId; /** - * Tracks value of {@link Settings.Global#LOCK_SCREEN_SHOW_NOTIFICATIONS}. + * Tracks value of {@link android.provider.Settings.Global#LOCK_SCREEN_SHOW_NOTIFICATIONS}. */ private boolean mAllowNotificationsWhenSecure; @@ -286,65 +291,6 @@ public class KeyguardViewMediator { */ private KeyguardDisplayManager mKeyguardDisplayManager; - /** - * Cache of avatar drawables, for use by KeyguardMultiUserAvatar. - */ - private static MultiUserAvatarCache sMultiUserAvatarCache = new MultiUserAvatarCache(); - - /** - * The callback used by the keyguard view to tell the {@link KeyguardViewMediator} - * various things. - */ - public interface ViewMediatorCallback { - /** - * Reports user activity and requests that the screen stay on. - */ - void userActivity(); - - /** - * Reports user activity and requests that the screen stay on for at least - * the specified amount of time. - * @param millis The amount of time in millis. This value is currently ignored. - */ - void userActivity(long millis); - - /** - * Report that the keyguard is done. - * @param authenticated Whether the user securely got past the keyguard. - * the only reason for this to be false is if the keyguard was instructed - * to appear temporarily to verify the user is supposed to get past the - * keyguard, and the user fails to do so. - */ - void keyguardDone(boolean authenticated); - - /** - * Report that the keyguard is done drawing. - */ - void keyguardDoneDrawing(); - - /** - * Tell ViewMediator that the current view needs IME input - * @param needsInput - */ - void setNeedsInput(boolean needsInput); - - /** - * Tell view mediator that the keyguard view's desired user activity timeout - * has changed and needs to be reapplied to the window. - */ - void onUserActivityTimeoutChanged(); - - /** - * Report that the keyguard is dismissable, pending the next keyguardDone call. - */ - void keyguardDonePending(); - - /** - * Report when keyguard is actually gone - */ - void keyguardGone(); - } - KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -354,7 +300,7 @@ public class KeyguardViewMediator { // ActivityManagerService) will not reconstruct the keyguard if it is already showing. synchronized (KeyguardViewMediator.this) { mSwitchingUser = true; - resetStateLocked(null); + resetStateLocked(); adjustStatusBarLocked(); // When we switch users we want to bring the new user to the biometric unlock even // if the current user has gone to the backup. @@ -370,16 +316,16 @@ public class KeyguardViewMediator { @Override public void onUserRemoved(int userId) { mLockPatternUtils.removeUser(userId); - sMultiUserAvatarCache.clear(userId); + MultiUserAvatarCache.getInstance().clear(userId); } @Override public void onUserInfoChanged(int userId) { - sMultiUserAvatarCache.clear(userId); + MultiUserAvatarCache.getInstance().clear(userId); } @Override - void onPhoneStateChanged(int phoneState) { + public void onPhoneStateChanged(int phoneState) { synchronized (KeyguardViewMediator.this) { if (TelephonyManager.CALL_STATE_IDLE == phoneState // call ending && !mScreenOn // screen off @@ -394,7 +340,7 @@ public class KeyguardViewMediator { doKeyguardLocked(null); } } - }; + } @Override public void onClockVisibilityChanged() { @@ -423,7 +369,7 @@ public class KeyguardViewMediator { + "device isn't provisioned yet."); doKeyguardLocked(null); } else { - resetStateLocked(null); + resetStateLocked(); } } } @@ -436,7 +382,7 @@ public class KeyguardViewMediator { + "showing; need to show keyguard so user can enter sim pin"); doKeyguardLocked(null); } else { - resetStateLocked(null); + resetStateLocked(); } } break; @@ -449,14 +395,14 @@ public class KeyguardViewMediator { } else { if (DEBUG) Log.d(TAG, "PERM_DISABLED, resetStateLocked to" + "show permanently disabled message in lockscreen."); - resetStateLocked(null); + resetStateLocked(); } } break; case READY: synchronized (this) { if (isShowing()) { - resetStateLocked(null); + resetStateLocked(); } } break; @@ -466,6 +412,7 @@ public class KeyguardViewMediator { }; ViewMediatorCallback mViewMediatorCallback = new ViewMediatorCallback() { + public void userActivity() { KeyguardViewMediator.this.userActivity(); } @@ -484,12 +431,12 @@ public class KeyguardViewMediator { @Override public void setNeedsInput(boolean needsInput) { - mKeyguardViewManager.setNeedsInput(needsInput); + mStatusBarKeyguardViewManager.setNeedsInput(needsInput); } @Override public void onUserActivityTimeoutChanged() { - mKeyguardViewManager.updateUserActivityTimeout(); + mStatusBarKeyguardViewManager.updateUserActivityTimeout(); } @Override @@ -541,6 +488,8 @@ public class KeyguardViewMediator { mShowing = (mUpdateMonitor.isDeviceProvisioned() || mLockPatternUtils.isSecure()) && !mLockPatternUtils.isLockScreenDisabled(); + mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager(mContext, mViewMediatorCallback, + lockPatternUtils); WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); final ContentResolver cr = mContext.getContentResolver(); @@ -557,9 +506,6 @@ public class KeyguardViewMediator { } else { mKeyguardAnalytics = null; } - mKeyguardViewManager = new KeyguardViewManager(context, wm, mViewMediatorCallback, - mLockPatternUtils, - mKeyguardAnalytics != null ? mKeyguardAnalytics.getCallback() : null); mScreenOn = mPM.isScreenOn(); @@ -619,9 +565,9 @@ public class KeyguardViewMediator { /** * Called to let us know the screen was turned off. - * @param why either {@link WindowManagerPolicy#OFF_BECAUSE_OF_USER}, - * {@link WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT} or - * {@link WindowManagerPolicy#OFF_BECAUSE_OF_PROX_SENSOR}. + * @param why either {@link android.view.WindowManagerPolicy#OFF_BECAUSE_OF_USER}, + * {@link android.view.WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT} or + * {@link android.view.WindowManagerPolicy#OFF_BECAUSE_OF_PROX_SENSOR}. */ public void onScreenTurnedOff(int why) { synchronized (this) { @@ -649,7 +595,7 @@ public class KeyguardViewMediator { } } else if (mShowing) { notifyScreenOffLocked(); - resetStateLocked(null); + resetStateLocked(); } else if (why == WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT || (why == WindowManagerPolicy.OFF_BECAUSE_OF_USER && !lockImmediately)) { doKeyguardLaterLocked(); @@ -766,7 +712,7 @@ public class KeyguardViewMediator { } /** - * Same semantics as {@link WindowManagerPolicy#enableKeyguard}; provide + * Same semantics as {@link android.view.WindowManagerPolicy#enableKeyguard}; provide * a way for external stuff to override normal keyguard behavior. For instance * the phone app disables the keyguard when it receives incoming calls. */ @@ -803,7 +749,7 @@ public class KeyguardViewMediator { Slog.w(TAG, "Failed to call onKeyguardExitResult(false)", e); } mExitSecureCallback = null; - resetStateLocked(null); + resetStateLocked(); } else { showLocked(null); @@ -871,36 +817,41 @@ public class KeyguardViewMediator { return mShowing; } + public boolean isOccluded() { + return mOccluded; + } + /** * Is the keyguard currently showing and not being force hidden? */ - public boolean isShowingAndNotHidden() { - return mShowing && !mHidden; + public boolean isShowingAndNotOccluded() { + return mShowing && !mOccluded; } /** - * Notify us when the keyguard is hidden by another window + * Notify us when the keyguard is occluded by another window */ - public void setHidden(boolean isHidden) { - if (DEBUG) Log.d(TAG, "setHidden " + isHidden); - mUpdateMonitor.sendKeyguardVisibilityChanged(!isHidden); - mHandler.removeMessages(SET_HIDDEN); - Message msg = mHandler.obtainMessage(SET_HIDDEN, (isHidden ? 1 : 0), 0); + public void setOccluded(boolean isOccluded) { + if (DEBUG) Log.d(TAG, "setOccluded " + isOccluded); + mUpdateMonitor.sendKeyguardVisibilityChanged(!isOccluded); + mHandler.removeMessages(SET_OCCLUDED); + Message msg = mHandler.obtainMessage(SET_OCCLUDED, (isOccluded ? 1 : 0), 0); mHandler.sendMessage(msg); } /** - * Handles SET_HIDDEN message sent by setHidden() + * Handles SET_OCCLUDED message sent by setOccluded() */ - private void handleSetHidden(boolean isHidden) { + private void handleSetOccluded(boolean isOccluded) { synchronized (KeyguardViewMediator.this) { - if (mHidden != isHidden) { - mHidden = isHidden; + if (mOccluded != isOccluded) { + mOccluded = isOccluded; + mStatusBarKeyguardViewManager.setOccluded(isOccluded); updateActivityLockScreenState(); adjustStatusBarLocked(); } if (ENABLE_ANALYTICS && mKeyguardAnalytics != null) { - mKeyguardAnalytics.getCallback().onSetHidden(isHidden); + mKeyguardAnalytics.getCallback().onSetOccluded(isOccluded); } } } @@ -952,7 +903,7 @@ public class KeyguardViewMediator { ALLOW_NOTIFICATIONS_DEFAULT ? 1 : 0); // if the keyguard is already showing, don't bother - if (mKeyguardViewManager.isShowing()) { + if (mStatusBarKeyguardViewManager.isShowing()) { if (DEBUG) Log.d(TAG, "doKeyguard: not showing because it is already showing"); return; } @@ -987,8 +938,8 @@ public class KeyguardViewMediator { * Dismiss the keyguard through the security layers. */ public void handleDismiss() { - if (mShowing && !mHidden) { - mKeyguardViewManager.dismiss(); + if (mShowing && !mOccluded) { + mStatusBarKeyguardViewManager.dismiss(); } } @@ -998,12 +949,11 @@ public class KeyguardViewMediator { /** * Send message to keyguard telling it to reset its state. - * @param options options about how to show the keyguard - * @see #handleReset() + * @see #handleReset */ - private void resetStateLocked(Bundle options) { + private void resetStateLocked() { if (DEBUG) Log.e(TAG, "resetStateLocked"); - Message msg = mHandler.obtainMessage(RESET, options); + Message msg = mHandler.obtainMessage(RESET); mHandler.sendMessage(msg); } @@ -1029,7 +979,7 @@ public class KeyguardViewMediator { /** * Send a message to keyguard telling it the screen just turned on. - * @see #onScreenTurnedOn() + * @see #onScreenTurnedOn * @see #handleNotifyScreenOn */ private void notifyScreenOnLocked(IKeyguardShowCallback result) { @@ -1040,7 +990,7 @@ public class KeyguardViewMediator { /** * Send message to keyguard telling it to show itself - * @see #handleShow() + * @see #handleShow */ private void showLocked(Bundle options) { if (DEBUG) Log.d(TAG, "showLocked"); @@ -1121,7 +1071,7 @@ public class KeyguardViewMediator { handleHide(); break; case RESET: - handleReset((Bundle) msg.obj); + handleReset(); break; case VERIFY_UNLOCK: handleVerifyUnlock(); @@ -1141,23 +1091,14 @@ public class KeyguardViewMediator { case KEYGUARD_DONE_AUTHENTICATING: keyguardDone(true, true); break; - case SET_HIDDEN: - handleSetHidden(msg.arg1 != 0); + case SET_OCCLUDED: + handleSetOccluded(msg.arg1 != 0); break; case KEYGUARD_TIMEOUT: synchronized (KeyguardViewMediator.this) { doKeyguardLocked((Bundle) msg.obj); } break; - case SHOW_ASSISTANT: - handleShowAssistant(); - break; - case DISPATCH_EVENT: - handleDispatchEvent((MotionEvent) msg.obj); - break; - case LAUNCH_CAMERA: - handleLaunchCamera(); - break; case DISMISS: handleDismiss(); break; @@ -1197,21 +1138,13 @@ public class KeyguardViewMediator { sendUserPresentBroadcast(); } - protected void handleLaunchCamera() { - mKeyguardViewManager.launchCamera(); - } - - protected void handleDispatchEvent(MotionEvent event) { - mKeyguardViewManager.dispatch(event); - } - private void sendUserPresentBroadcast() { final UserHandle currentUser = new UserHandle(mLockPatternUtils.getCurrentUser()); mContext.sendBroadcastAsUser(USER_PRESENT_INTENT, currentUser); } /** - * @see #keyguardDoneDrawing + * @see #keyguardDone * @see #KEYGUARD_DONE_DRAWING */ private void handleKeyguardDoneDrawing() { @@ -1260,7 +1193,7 @@ public class KeyguardViewMediator { private void updateActivityLockScreenState() { try { - ActivityManagerNative.getDefault().setLockScreenShown(mShowing && !mHidden); + ActivityManagerNative.getDefault().setLockScreenShown(mShowing && !mOccluded); } catch (RemoteException e) { } } @@ -1278,7 +1211,7 @@ public class KeyguardViewMediator { if (DEBUG) Log.d(TAG, "handleShow"); } - mKeyguardViewManager.show(options); + mStatusBarKeyguardViewManager.show(options); mShowing = true; mKeyguardDonePending = false; updateActivityLockScreenState(); @@ -1311,7 +1244,7 @@ public class KeyguardViewMediator { playSounds(false); } - mKeyguardViewManager.hide(); + mStatusBarKeyguardViewManager.hide(); mShowing = false; mKeyguardDonePending = false; updateActivityLockScreenState(); @@ -1351,7 +1284,7 @@ public class KeyguardViewMediator { } if (DEBUG) { - Log.d(TAG, "adjustStatusBarLocked: mShowing=" + mShowing + " mHidden=" + mHidden + Log.d(TAG, "adjustStatusBarLocked: mShowing=" + mShowing + " mOccluded=" + mOccluded + " isSecure=" + isSecure() + " --> flags=0x" + Integer.toHexString(flags)); } @@ -1362,17 +1295,13 @@ public class KeyguardViewMediator { } /** - * Handle message sent by {@link #resetStateLocked(Bundle)} + * Handle message sent by {@link #resetStateLocked} * @see #RESET */ - private void handleReset(Bundle options) { - if (options == null) { - options = new Bundle(); - } - options.putBoolean(KeyguardViewManager.IS_SWITCHING_USER, mSwitchingUser); + private void handleReset() { synchronized (KeyguardViewMediator.this) { if (DEBUG) Log.d(TAG, "handleReset"); - mKeyguardViewManager.reset(options); + mStatusBarKeyguardViewManager.reset(); } } @@ -1383,7 +1312,7 @@ public class KeyguardViewMediator { private void handleVerifyUnlock() { synchronized (KeyguardViewMediator.this) { if (DEBUG) Log.d(TAG, "handleVerifyUnlock"); - mKeyguardViewManager.verifyUnlock(); + mStatusBarKeyguardViewManager.verifyUnlock(); mShowing = true; updateActivityLockScreenState(); } @@ -1396,18 +1325,18 @@ public class KeyguardViewMediator { private void handleNotifyScreenOff() { synchronized (KeyguardViewMediator.this) { if (DEBUG) Log.d(TAG, "handleNotifyScreenOff"); - mKeyguardViewManager.onScreenTurnedOff(); + mStatusBarKeyguardViewManager.onScreenTurnedOff(); } } /** - * Handle message sent by {@link #notifyScreenOnLocked()} + * Handle message sent by {@link #notifyScreenOnLocked} * @see #NOTIFY_SCREEN_ON */ private void handleNotifyScreenOn(IKeyguardShowCallback callback) { synchronized (KeyguardViewMediator.this) { if (DEBUG) Log.d(TAG, "handleNotifyScreenOn"); - mKeyguardViewManager.onScreenTurnedOn(callback); + mStatusBarKeyguardViewManager.onScreenTurnedOn(callback); } } @@ -1415,35 +1344,18 @@ public class KeyguardViewMediator { return mKeyguardDonePending || !isSecure(); } - public void showAssistant() { - Message msg = mHandler.obtainMessage(SHOW_ASSISTANT); - mHandler.sendMessage(msg); - } - - public void handleShowAssistant() { - mKeyguardViewManager.showAssistant(); - } - private boolean isAssistantAvailable() { return mSearchManager != null && mSearchManager.getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null; } - public static MultiUserAvatarCache getAvatarCache() { - return sMultiUserAvatarCache; - } - - public void dispatch(MotionEvent event) { - Message msg = mHandler.obtainMessage(DISPATCH_EVENT, event); - mHandler.sendMessage(msg); - } - - public void launchCamera() { - Message msg = mHandler.obtainMessage(LAUNCH_CAMERA); - mHandler.sendMessage(msg); - } - public void onBootCompleted() { mUpdateMonitor.dispatchBootCompleted(); } + + public void registerStatusBar(PhoneStatusBar phoneStatusBar, ViewGroup container, + StatusBarWindowManager statusBarWindowManager) { + mStatusBarKeyguardViewManager.registerStatusBar(phoneStatusBar, container, + statusBarWindowManager); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 54e8815..73f1aa4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -22,11 +22,9 @@ import android.app.Notification; import android.app.PendingIntent; import android.app.TaskStackBuilder; import android.content.BroadcastReceiver; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -79,8 +77,6 @@ import com.android.systemui.R; import com.android.systemui.RecentsComponent; import com.android.systemui.SearchPanelView; import com.android.systemui.SystemUI; -import com.android.systemui.keyguard.KeyguardService; -import com.android.systemui.keyguard.KeyguardStatusBarBinder; import com.android.systemui.statusbar.phone.KeyguardTouchDelegate; import java.util.ArrayList; @@ -176,12 +172,6 @@ public abstract class BaseStatusBar extends SystemUI implements protected int mZenMode; - protected KeyguardStatusBarBinder mKeyguardService; - - public IStatusBarService getStatusBarService() { - return mBarService; - } - public boolean isDeviceProvisioned() { return mDeviceProvisioned; } @@ -320,7 +310,6 @@ public abstract class BaseStatusBar extends SystemUI implements createAndAddWindows(); - startKeyguardService(); disable(switches[0]); setSystemUiVisibility(switches[1], 0xffffffff); topAppWindowChanged(switches[2] != 0); @@ -371,25 +360,6 @@ public abstract class BaseStatusBar extends SystemUI implements updateRelatedUserCache(); } - private void startKeyguardService() { - Intent intent = new Intent(mContext, KeyguardService.class); - intent.setAction(KeyguardService.ACTION_STATUS_BAR_BIND); - if (!mContext.bindService(intent, new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - mKeyguardService = (KeyguardStatusBarBinder) service; - mKeyguardService.register(mCommandQueue); - } - - @Override - public void onServiceDisconnected(ComponentName name) { - mKeyguardService = null; - } - }, Context.BIND_AUTO_CREATE)) { - throw new RuntimeException("Couldn't bind status bar keyguard."); - } - } - public void userSwitched(int newUserId) { // should be overridden } @@ -1363,7 +1333,7 @@ public abstract class BaseStatusBar extends SystemUI implements boolean interrupt = (isFullscreen || (isHighPriority && (isNoisy || hasTicker))) && isAllowed && mPowerManager.isScreenOn() - && !keyguard.isShowingAndNotHidden() + && !keyguard.isShowingAndNotOccluded() && !keyguard.isInputRestricted(); try { interrupt = interrupt && !mDreamManager.isDreaming(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index cf6f60c..bbbe8fa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -57,7 +57,6 @@ public class CommandQueue extends IStatusBar.Stub { private static final int MSG_PRELOAD_RECENT_APPS = 14 << MSG_SHIFT; private static final int MSG_CANCEL_PRELOAD_RECENT_APPS = 15 << MSG_SHIFT; private static final int MSG_SET_WINDOW_STATE = 16 << MSG_SHIFT; - private static final int MSG_SET_KEYGUARD_SHOWN = 17 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -100,8 +99,7 @@ public class CommandQueue extends IStatusBar.Stub { public void hideSearchPanel(); public void cancelPreloadRecentApps(); public void setWindowState(int window, int state); - public void setKeyguardShown(boolean showKeyguard, IKeyguardShowCallback callback, - boolean updateWindowFlags); + } public CommandQueue(Callbacks callbacks, StatusBarIconList list) { @@ -236,14 +234,6 @@ public class CommandQueue extends IStatusBar.Stub { } } - public void setKeyguardShown(boolean showKeyguard, IKeyguardShowCallback callback, - boolean updateWindowFlags) { - synchronized (mList) { - mHandler.removeMessages(MSG_SET_KEYGUARD_SHOWN); - mHandler.obtainMessage(MSG_SET_KEYGUARD_SHOWN, - showKeyguard ? 1 : 0, updateWindowFlags ? 1 : 0, callback).sendToTarget(); - } - } private final class H extends Handler { public void handleMessage(Message msg) { @@ -325,10 +315,7 @@ public class CommandQueue extends IStatusBar.Stub { case MSG_SET_WINDOW_STATE: mCallbacks.setWindowState(msg.arg1, msg.arg2); break; - case MSG_SET_KEYGUARD_SHOWN: - mCallbacks.setKeyguardShown(msg.arg1 != 0, (IKeyguardShowCallback) msg.obj, - msg.arg2 != 0); - break; + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardTouchDelegate.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardTouchDelegate.java index 1ea920d..68eaf51 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardTouchDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardTouchDelegate.java @@ -140,16 +140,16 @@ public class KeyguardTouchDelegate { return false; } - public boolean isShowingAndNotHidden() { + public boolean isShowingAndNotOccluded() { final IKeyguardService service = mService; if (service != null) { try { - return service.isShowingAndNotHidden(); + return service.isShowingAndNotOccluded(); } catch (RemoteException e) { Slog.w(TAG , "Remote Exception", e); } } else { - Slog.w(TAG, "isShowingAndNotHidden(): NO SERVICE!"); + Slog.w(TAG, "isShowingAndNotOccluded(): NO SERVICE!"); } return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 44f5e3a..bdcf83c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -35,9 +35,11 @@ import android.app.Notification; import android.app.PendingIntent; import android.app.StatusBarManager; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.ServiceConnection; import android.content.res.Configuration; import android.content.res.Resources; import android.database.ContentObserver; @@ -93,6 +95,8 @@ import com.android.systemui.DemoMode; import com.android.systemui.EventLogTags; import com.android.systemui.R; import com.android.systemui.SwipeHelper; +import com.android.systemui.keyguard.KeyguardService; +import com.android.systemui.keyguard.KeyguardStatusBarBinder; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.GestureRecorder; @@ -183,6 +187,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { StatusBarWindowView mStatusBarWindow; PhoneStatusBarView mStatusBarView; private int mStatusBarWindowState = WINDOW_STATE_SHOWING; + private StatusBarWindowManager mStatusBarWindowManager; int mPixelFormat; Object mQueueLock = new Object(); @@ -274,6 +279,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { DisplayMetrics mDisplayMetrics = new DisplayMetrics(); + protected KeyguardStatusBarBinder mKeyguardService; // XXX: gesture research private final GestureRecorder mGestureRec = DEBUG_GESTURES ? new GestureRecorder("/sdcard/statusbar_gestures.dat") @@ -356,12 +362,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } }}; - private boolean mKeyguardShowing; - - private ViewGroup mKeyguard; - - private Button mDismissKeyguard; - @Override public void setZenMode(int mode) { super.setZenMode(mode); @@ -393,6 +393,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { Settings.Global.getUriFor(SETTING_HEADS_UP_TICKER), true, mHeadsUpObserver); } + startKeyguard(); } // ================================================================================ @@ -443,7 +444,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } }); - mKeyguard = (ViewGroup) mStatusBarWindow.findViewById(R.id.keyguard); if (!ActivityManager.isHighEndGfx()) { mStatusBarWindow.setBackground(null); mNotificationPanel.setBackground(new FastColorDrawable(context.getResources().getColor( @@ -712,6 +712,29 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { return mStatusBarView; } + private void startKeyguard() { + + // Create the connection to KeyguardService. + Intent intent = new Intent(mContext, KeyguardService.class); + intent.setAction(KeyguardService.ACTION_STATUS_BAR_BIND); + if (!mContext.bindService(intent, new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + mKeyguardService = (KeyguardStatusBarBinder) service; + mKeyguardService.registerStatusBar(PhoneStatusBar.this, mStatusBarWindow, + mStatusBarWindowManager); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + if (DEBUG) Log.v(TAG, "Keyguard disconnected."); + mKeyguardService = null; + } + }, Context.BIND_AUTO_CREATE)) { + throw new RuntimeException("Couldn't bind status bar keyguard."); + } + } + @Override protected void onShowSearchPanel() { if (mNavigationBarView != null) { @@ -789,10 +812,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } } - protected int getStatusBarGravity() { - return Gravity.TOP | Gravity.FILL_HORIZONTAL; - } - public int getStatusBarHeight() { if (mNaturalBarHeight < 0) { final Resources res = mContext.getResources(); @@ -1508,30 +1527,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { // Expand the window to encompass the full screen in anticipation of the drag. // This is only possible to do atomically because the status bar is at the top of the screen! - expandWindow(); + mStatusBarWindowManager.setStatusBarExpanded(true); visibilityChanged(true); setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true); } - private void expandWindow() { - WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams(); - lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - lp.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; - lp.height = ViewGroup.LayoutParams.MATCH_PARENT; - mWindowManager.updateViewLayout(mStatusBarWindow, lp); - } - - private void releaseFocus() { - if (mStatusBarWindow == null) return; - WindowManager.LayoutParams lp = - (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams(); - lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - lp.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; - mWindowManager.updateViewLayout(mStatusBarWindow, lp); - } - public void animateCollapsePanels() { animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE); } @@ -1544,7 +1546,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } // release focus immediately to kick off focus change transition - releaseFocus(); + mStatusBarWindowManager.setStatusBarFocusable(false); if ((flags & CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL) == 0) { mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL); @@ -1556,7 +1558,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL); } - if (mStatusBarWindow != null && !mKeyguardShowing) { + if (mStatusBarWindow != null) { mStatusBarWindow.cancelExpandHelper(); mStatusBarView.collapseAllPanels(true); } @@ -1768,7 +1770,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { if (SPEW) Log.d(TAG, "makeExpandedInvisible: mExpandedVisible=" + mExpandedVisible + " mExpandedVisible=" + mExpandedVisible); - if (!mExpandedVisible || mStatusBarWindow == null || mKeyguardShowing) { + if (!mExpandedVisible || mStatusBarWindow == null) { return; } @@ -1802,7 +1804,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { visibilityChanged(false); // Shrink the window to the size of the status bar only - contractWindow(); + mStatusBarWindowManager.setStatusBarExpanded(false); if ((mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS) == 0) { setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in); @@ -1819,15 +1821,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false); } - private void contractWindow() { - WindowManager.LayoutParams lp = - (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams(); - lp.height = getStatusBarHeight(); - lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - lp.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; - mWindowManager.updateViewLayout(mStatusBarWindow, lp); - } - /** * Enables or disables layers on the children of the notifications pile. * @@ -1936,7 +1929,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { && mStatusBarWindowState != state) { mStatusBarWindowState = state; if (DEBUG_WINDOW_STATE) Log.d(TAG, "Status bar " + windowStateToString(state)); - if (!showing && !mKeyguardShowing) { + if (!showing) { mStatusBarView.collapseAllPanels(false); } } @@ -2361,29 +2354,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } private void addStatusBarWindow() { - // Put up the view - final int height = getStatusBarHeight(); - - // Now that the status bar window encompasses the sliding panel and its - // translucent backdrop, the entire thing is made TRANSLUCENT and is - // hardware-accelerated. - final WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - height, - WindowManager.LayoutParams.TYPE_STATUS_BAR, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH - | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, - PixelFormat.TRANSLUCENT); - - lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; - lp.gravity = getStatusBarGravity(); - lp.setTitle("StatusBar"); - lp.packageName = mContext.getPackageName(); - makeStatusBarView(); - mWindowManager.addView(mStatusBarWindow, lp); + mStatusBarWindowManager = new StatusBarWindowManager(mContext); + mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight()); } void setNotificationIconVisibility(boolean visible, int anim) { @@ -2692,67 +2665,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } } - @Override - public void setKeyguardShown(boolean showKeyguard, final IKeyguardShowCallback callback, - boolean updateWindowFlags) { - mKeyguardShowing = showKeyguard; - if (updateWindowFlags) { - WindowManager.LayoutParams lp = - (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams(); - if (showKeyguard) { - lp.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; - lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; - } else { - lp.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; - lp.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; - } - mWindowManager.updateViewLayout(mStatusBarWindow, lp); - } - if (!showKeyguard) { - mKeyguard.setVisibility(View.GONE); - mKeyguard.removeAllViews(); - contractWindow(); - } else { - expandWindow(); - mKeyguard.setVisibility(View.VISIBLE); - KeyguardSimpleHostView view = (KeyguardSimpleHostView) LayoutInflater.from(mContext) - .inflate(R.layout.keyguard_simple_host_view, mKeyguard, false); - mKeyguard.addView(view); - view.setOnDismissAction(new KeyguardHostView.OnDismissAction() { - @Override - public boolean onDismiss() { - contractWindow(); - if (mKeyguardService != null) { - mKeyguardService.dismissKeyguard(); - } - return false; - } - }); - view.show(); - } - if (callback != null) { - mStatusBarView.getViewTreeObserver().addOnPreDrawListener( - new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - mStatusBarView.getViewTreeObserver().removeOnPreDrawListener(this); - mStatusBarView.post(new Runnable() { - @Override - public void run() { - try { - callback.onShown(mStatusBarWindow.getWindowToken()); - } catch (RemoteException e) { - Log.e(TAG, "Could not call show callback", e); - } - } - }); - return true; - } - }); - } - - } - /** * Reload some of our resources when the configuration changes. * diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java new file mode 100644 index 0000000..74549ae --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +import android.content.Context; +import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Log; +import android.util.Slog; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; + +import com.android.internal.policy.IKeyguardShowCallback; +import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.KeyguardSimpleHostView; +import com.android.keyguard.R; +import com.android.keyguard.ViewMediatorCallback; +import com.android.systemui.keyguard.KeyguardViewMediator; + +/** + * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back + * via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done, + * which is in turn, reported to this class by the current + * {@link com.android.keyguard.KeyguardViewBase}. + */ +public class StatusBarKeyguardViewManager { + private static String TAG = "StatusBarKeyguardViewManager"; + + private final Context mContext; + + private LockPatternUtils mLockPatternUtils; + private ViewMediatorCallback mViewMediatorCallback; + private PhoneStatusBar mPhoneStatusBar; + + private KeyguardSimpleHostView mKeyguardView; + private ViewGroup mRoot; + private ViewGroup mContainer; + private StatusBarWindowManager mStatusBarWindowManager; + + private boolean mScreenOn = false; + private boolean mShowOnRegister; + + public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback, + LockPatternUtils lockPatternUtils) { + mContext = context; + mViewMediatorCallback = callback; + mLockPatternUtils = lockPatternUtils; + + } + + public void registerStatusBar(PhoneStatusBar phoneStatusBar, + ViewGroup container, StatusBarWindowManager statusBarWindowManager) { + mPhoneStatusBar = phoneStatusBar; + mContainer = container; + mStatusBarWindowManager = statusBarWindowManager; + if (mShowOnRegister) { + mShowOnRegister = false; + show(null); + if (mScreenOn) { + onScreenTurnedOn(null); + } + } + } + + /** + * Show the keyguard. Will handle creating and attaching to the view manager + * lazily. + */ + public void show(Bundle options) { + if (mStatusBarWindowManager != null) { + ensureView(); + mStatusBarWindowManager.setKeyguardShowing(true); + mKeyguardView.requestFocus(); + } else { + mShowOnRegister = true; + } + } + + private void ensureView() { + if (mRoot == null) { + inflateView(); + } + } + + private void inflateView() { + removeView(); + mRoot = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.keyguard_bouncer, null); + mKeyguardView = (KeyguardSimpleHostView) mRoot.findViewById(R.id.keyguard_host_view); + mKeyguardView.setLockPatternUtils(mLockPatternUtils); + mKeyguardView.setViewMediatorCallback(mViewMediatorCallback); + mContainer.addView(mRoot, mContainer.getChildCount()); + mRoot.setSystemUiVisibility(View.STATUS_BAR_DISABLE_HOME); + } + + private void removeView() { + if (mRoot != null && mRoot.getParent() == mContainer) { + mContainer.removeView(mRoot); + mRoot = null; + } + } + + /** + * Reset the state of the view. + */ + public void reset() { + inflateView(); + } + + public void onScreenTurnedOff() { + mScreenOn = false; + if (mKeyguardView != null) { + mKeyguardView.onScreenTurnedOff(); + } + } + + public void onScreenTurnedOn(final IKeyguardShowCallback callback) { + mScreenOn = true; + if (mKeyguardView != null) { + mKeyguardView.onScreenTurnedOn(); + if (callback != null) { + callbackAfterDraw(callback); + } + } else { + try { + if (callback != null) { + callback.onShown(null); + } + } catch (RemoteException e) { + Slog.w(TAG, "Exception calling onShown():", e); + } + } + } + + private void callbackAfterDraw(final IKeyguardShowCallback callback) { + mKeyguardView.post(new Runnable() { + @Override + public void run() { + try { + callback.onShown(mKeyguardView.getWindowToken()); + } catch (RemoteException e) { + Slog.w(TAG, "Exception calling onShown():", e); + } + } + }); + } + + public void verifyUnlock() { + show(null); + mKeyguardView.verifyUnlock(); + } + + public void setNeedsInput(boolean needsInput) { + if (mStatusBarWindowManager != null) { + mStatusBarWindowManager.setKeyguardNeedsInput(needsInput); + } + } + + public void updateUserActivityTimeout() { + + // Use the user activity timeout requested by the keyguard view, if any. + if (mKeyguardView != null) { + long timeout = mKeyguardView.getUserActivityTimeout(); + if (timeout >= 0) { + mStatusBarWindowManager.setKeyguardUserActivityTimeout(timeout); + return; + } + } + + // Otherwise, use the default timeout. + mStatusBarWindowManager.setKeyguardUserActivityTimeout( + KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS); + } + + public void setOccluded(boolean occluded) { + if (mStatusBarWindowManager != null) { + mStatusBarWindowManager.setKeyguardOccluded(occluded); + } + } + + /** + * Hides the keyguard view + */ + public void hide() { + if (mPhoneStatusBar != null) { + mStatusBarWindowManager.setKeyguardShowing(false); + if (mKeyguardView != null) { + mKeyguardView.cleanUp(); + mViewMediatorCallback.keyguardGone(); + } + removeView(); + } + mShowOnRegister = false; + } + + /** + * Dismisses the keyguard by going to the next screen or making it gone. + */ + public void dismiss() { + if (mScreenOn) { + mKeyguardView.dismiss(); + } + } + + /** + * @return Whether the keyguard is showing + */ + public boolean isShowing() { + return mRoot != null && mRoot.getVisibility() == View.VISIBLE; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java new file mode 100644 index 0000000..e418ac5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +import android.app.ActionBar; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.res.Resources; +import android.graphics.PixelFormat; +import android.os.SystemProperties; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import com.android.keyguard.R; + +/** + * Encapsulates all logic for the status bar window state management. + */ +public class StatusBarWindowManager { + + private final Context mContext; + private final WindowManager mWindowManager; + private View mStatusBarView; + private WindowManager.LayoutParams mLp; + private int mBarHeight; + private final boolean mKeyguardScreenRotation; + + private final State mCurrentState = new State(); + + public StatusBarWindowManager(Context context) { + mContext = context; + mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation(); + } + + private boolean shouldEnableKeyguardScreenRotation() { + Resources res = mContext.getResources(); + return SystemProperties.getBoolean("lockscreen.rot_override", false) + || res.getBoolean(R.bool.config_enableLockScreenRotation); + } + + /** + * Adds the status bar view to the window manager. + * + * @param statusBarView The view to add. + * @param barHeight The height of the status bar in collapsed state. + */ + public void add(View statusBarView, int barHeight) { + + // Now that the status bar window encompasses the sliding panel and its + // translucent backdrop, the entire thing is made TRANSLUCENT and is + // hardware-accelerated. + mLp = new WindowManager.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + barHeight, + WindowManager.LayoutParams.TYPE_STATUS_BAR, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING + | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH + | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH + | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION + | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, + PixelFormat.TRANSLUCENT); + + mLp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; + mLp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL; + mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; + mLp.inputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; + mLp.setTitle("StatusBar"); + mLp.packageName = mContext.getPackageName(); + mStatusBarView = statusBarView; + mBarHeight = barHeight; + mWindowManager.addView(mStatusBarView, mLp); + } + + private void applyKeyguardFlags(State state) { + if (state.keyguardShowing) { + mLp.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; + mLp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; + } else { + mLp.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; + mLp.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; + } + } + + private void adjustScreenOrientation(State state) { + if (!state.isKeyguardShowingAndNotOccluded() || mKeyguardScreenRotation) { + mLp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER; + } else { + mLp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; + } + } + + private void applyFocusableFlag(State state) { + if (state.isKeyguardShowingAndNotOccluded() && state.keyguardNeedsInput) { + mLp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + mLp.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + } else if (state.isKeyguardShowingAndNotOccluded() || state.statusBarFocusable) { + mLp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + mLp.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + } else { + mLp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + mLp.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + } + } + + private void applyHeight(State state) { + boolean expanded = state.isKeyguardShowingAndNotOccluded() || state.statusBarExpanded; + if (expanded) { + mLp.height = ViewGroup.LayoutParams.MATCH_PARENT; + } else { + mLp.height = mBarHeight; + } + } + + private void applyUserActivityTimeout(State state) { + if (state.isKeyguardShowingAndNotOccluded()) { + mLp.userActivityTimeout = state.keyguardUserActivityTimeout; + } else { + mLp.userActivityTimeout = -1; + } + } + + private void apply(State state) { + applyKeyguardFlags(state); + applyFocusableFlag(state); + adjustScreenOrientation(state); + applyHeight(state); + applyUserActivityTimeout(state); + mWindowManager.updateViewLayout(mStatusBarView, mLp); + } + + public void setKeyguardShowing(boolean showing) { + mCurrentState.keyguardShowing = showing; + apply(mCurrentState); + } + + public void setKeyguardOccluded(boolean occluded) { + mCurrentState.keyguardOccluded = occluded; + apply(mCurrentState); + } + + public void setKeyguardNeedsInput(boolean needsInput) { + mCurrentState.keyguardNeedsInput = needsInput; + apply(mCurrentState); + } + + public void setStatusBarExpanded(boolean expanded) { + mCurrentState.statusBarExpanded = expanded; + mCurrentState.statusBarFocusable = expanded; + apply(mCurrentState); + } + + public void setStatusBarFocusable(boolean focusable) { + mCurrentState.statusBarFocusable = focusable; + apply(mCurrentState); + } + + public void setKeyguardUserActivityTimeout(long timeout) { + mCurrentState.keyguardUserActivityTimeout = timeout; + apply(mCurrentState); + } + + private static class State { + boolean keyguardShowing; + boolean keyguardOccluded; + boolean keyguardNeedsInput; + boolean statusBarExpanded; + boolean statusBarFocusable; + long keyguardUserActivityTimeout; + + private boolean isKeyguardShowingAndNotOccluded() { + return keyguardShowing && !keyguardOccluded; + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java index 2dc3373..a57a7b5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java @@ -94,15 +94,6 @@ public class TvStatusBar extends BaseStatusBar { } @Override - public void setKeyguardShown(boolean showKeyguard, IKeyguardShowCallback callback, - boolean updateKeyguardFlags) { - } - - @Override - protected void createAndAddWindows() { - } - - @Override protected WindowManager.LayoutParams getSearchLayoutParams( LayoutParams layoutParams) { return null; @@ -151,6 +142,10 @@ public class TvStatusBar extends BaseStatusBar { } @Override + protected void createAndAddWindows() { + } + + @Override protected void refreshLayout(int layoutDirection) { } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index fe032f9..928fd9b 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -2460,7 +2460,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { * given the situation with the keyguard. */ void launchHomeFromHotKey() { - if (mKeyguardDelegate != null && mKeyguardDelegate.isShowingAndNotHidden()) { + if (mKeyguardDelegate != null && mKeyguardDelegate.isShowingAndNotOccluded()) { // don't launch home if keyguard showing } else if (!mHideLockScreen && mKeyguardDelegate.isInputRestricted()) { // when in keyguard restricted mode, must first verify unlock @@ -3529,54 +3529,56 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Hide the key guard if a visible window explicitly specifies that it wants to be // displayed when the screen is locked. - if (localLOGV) Slog.v(TAG, "finishPostLayoutPolicyLw: mHideKeyguard=" - + mHideLockScreen); - if (mDismissKeyguard != DISMISS_KEYGUARD_NONE && !isKeyguardSecure()) { - mKeyguardHidden = true; - if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setHidden(true))) { - changes |= FINISH_LAYOUT_REDO_LAYOUT - | FINISH_LAYOUT_REDO_CONFIG - | FINISH_LAYOUT_REDO_WALLPAPER; - } - if (mKeyguardDelegate.isShowing()) { - mHandler.post(new Runnable() { - @Override - public void run() { - mKeyguardDelegate.keyguardDone(false, false); + if (mKeyguardDelegate != null && mStatusBar != null) { + if (localLOGV) Slog.v(TAG, "finishPostLayoutPolicyLw: mHideKeyguard=" + + mHideLockScreen); + if (mDismissKeyguard != DISMISS_KEYGUARD_NONE && !isKeyguardSecure()) { + mKeyguardHidden = true; + if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setOccluded(true))) { + changes |= FINISH_LAYOUT_REDO_LAYOUT + | FINISH_LAYOUT_REDO_CONFIG + | FINISH_LAYOUT_REDO_WALLPAPER; + } + if (mKeyguardDelegate.isShowing()) { + mHandler.post(new Runnable() { + @Override + public void run() { + mKeyguardDelegate.keyguardDone(false, false); + } + }); + } + } else if (mHideLockScreen) { + mKeyguardHidden = true; + if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setOccluded(true))) { + changes |= FINISH_LAYOUT_REDO_LAYOUT + | FINISH_LAYOUT_REDO_CONFIG + | FINISH_LAYOUT_REDO_WALLPAPER; + } + } else if (mDismissKeyguard != DISMISS_KEYGUARD_NONE) { + // This is the case of keyguard isSecure() and not mHideLockScreen. + if (mDismissKeyguard == DISMISS_KEYGUARD_START) { + // Only launch the next keyguard unlock window once per window. + mKeyguardHidden = false; + if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setOccluded(false))) { + changes |= FINISH_LAYOUT_REDO_LAYOUT + | FINISH_LAYOUT_REDO_CONFIG + | FINISH_LAYOUT_REDO_WALLPAPER; } - }); - } - } else if (mHideLockScreen) { - mKeyguardHidden = true; - if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setHidden(true))) { - changes |= FINISH_LAYOUT_REDO_LAYOUT - | FINISH_LAYOUT_REDO_CONFIG - | FINISH_LAYOUT_REDO_WALLPAPER; - } - } else if (mDismissKeyguard != DISMISS_KEYGUARD_NONE) { - // This is the case of keyguard isSecure() and not mHideLockScreen. - if (mDismissKeyguard == DISMISS_KEYGUARD_START) { - // Only launch the next keyguard unlock window once per window. + mHandler.post(new Runnable() { + @Override + public void run() { + mKeyguardDelegate.dismiss(); + } + }); + } + } else { + mWinDismissingKeyguard = null; mKeyguardHidden = false; - if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setHidden(false))) { + if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setOccluded(false))) { changes |= FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG | FINISH_LAYOUT_REDO_WALLPAPER; } - mHandler.post(new Runnable() { - @Override - public void run() { - mKeyguardDelegate.dismiss(); - } - }); - } - } else { - mWinDismissingKeyguard = null; - mKeyguardHidden = false; - if (processKeyguardSetHiddenResultLw(mKeyguardDelegate.setHidden(false))) { - changes |= FINISH_LAYOUT_REDO_LAYOUT - | FINISH_LAYOUT_REDO_CONFIG - | FINISH_LAYOUT_REDO_WALLPAPER; } } @@ -3592,22 +3594,23 @@ public class PhoneWindowManager implements WindowManagerPolicy { } /** - * Processes the result code of {@link IKeyguardService#setHidden}. This is needed because we + * Processes the result code of {@link IKeyguardService#setOccluded}. This is needed because we * immediately need to put the wallpaper directly behind the Keyguard when a window with flag * {@link android.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED} gets dismissed. If we * would wait for Keyguard to change the flags, that would be running asynchronously and thus be * too late so the user might see the window behind. * - * @param setHiddenResult The result code from {@link IKeyguardService#setHidden}. + * @param setHiddenResult The result code from {@link IKeyguardService#setOccluded}. * @return Whether the flags have changed and we have to redo the layout. */ private boolean processKeyguardSetHiddenResultLw(int setHiddenResult) { - if (setHiddenResult == IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_SET_FLAGS) { + if (setHiddenResult + == IKeyguardServiceConstants.KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_SET_FLAGS) { mStatusBar.getAttrs().privateFlags |= PRIVATE_FLAG_KEYGUARD; mStatusBar.getAttrs().flags |= FLAG_SHOW_WALLPAPER; return true; } else if (setHiddenResult - == IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_UNSET_FLAGS) { + == IKeyguardServiceConstants.KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_UNSET_FLAGS) { mStatusBar.getAttrs().privateFlags &= ~PRIVATE_FLAG_KEYGUARD; mStatusBar.getAttrs().flags &= ~FLAG_SHOW_WALLPAPER; return true; @@ -3843,7 +3846,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // when the keyguard is hidden by another activity. final boolean keyguardActive = (mKeyguardDelegate == null ? false : (isScreenOn ? - mKeyguardDelegate.isShowingAndNotHidden() : + mKeyguardDelegate.isShowingAndNotOccluded() : mKeyguardDelegate.isShowing())); if (keyCode == KeyEvent.KEYCODE_POWER @@ -4435,7 +4438,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean keyguardIsShowingTq() { if (mKeyguardDelegate == null) return false; - return mKeyguardDelegate.isShowingAndNotHidden(); + return mKeyguardDelegate.isShowingAndNotOccluded(); } @@ -5079,7 +5082,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } final boolean hapticsDisabled = Settings.System.getIntForUser(mContext.getContentResolver(), Settings.System.HAPTIC_FEEDBACK_ENABLED, 0, UserHandle.USER_CURRENT) == 0; - if (!always && (hapticsDisabled || mKeyguardDelegate.isShowingAndNotHidden())) { + if (!always && (hapticsDisabled || mKeyguardDelegate.isShowingAndNotOccluded())) { return false; } long[] pattern = null; @@ -5130,7 +5133,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void keepScreenOnStoppedLw() { - if (mKeyguardDelegate != null && !mKeyguardDelegate.isShowingAndNotHidden()) { + if (mKeyguardDelegate != null && !mKeyguardDelegate.isShowingAndNotOccluded()) { mPowerManager.userActivity(SystemClock.uptimeMillis(), false); } } @@ -5200,9 +5203,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE - | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY - | View.STATUS_BAR_TRANSLUCENT - | View.NAVIGATION_BAR_TRANSLUCENT; + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + if (!isStatusBarKeyguard() || mHideLockScreen) { + flags |= View.STATUS_BAR_TRANSLUCENT | View.NAVIGATION_BAR_TRANSLUCENT; + } vis = (vis & ~flags) | (oldVis & flags); } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java index d0281d1..966924b 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java @@ -44,13 +44,13 @@ public class KeyguardServiceDelegate { // the event something checks before the service is actually started. // KeyguardService itself should default to this state until the real state is known. showing = true; - showingAndNotHidden = true; + showingAndNotOccluded = true; secure = true; } boolean showing; - boolean showingAndNotHidden; + boolean showingAndNotOccluded; boolean inputRestricted; - boolean hidden; + boolean occluded; boolean secure; boolean dreaming; boolean systemIsReady; @@ -109,7 +109,7 @@ public class KeyguardServiceDelegate { Context.BIND_AUTO_CREATE, UserHandle.OWNER)) { if (DEBUG) Log.v(TAG, "*** Keyguard: can't bind to " + KEYGUARD_CLASS); mKeyguardState.showing = false; - mKeyguardState.showingAndNotHidden = false; + mKeyguardState.showingAndNotOccluded = false; mKeyguardState.secure = false; } else { if (DEBUG) Log.v(TAG, "*** Keyguard started"); @@ -148,11 +148,11 @@ public class KeyguardServiceDelegate { return mKeyguardState.showing; } - public boolean isShowingAndNotHidden() { + public boolean isShowingAndNotOccluded() { if (mKeyguardService != null) { - mKeyguardState.showingAndNotHidden = mKeyguardService.isShowingAndNotHidden(); + mKeyguardState.showingAndNotOccluded = mKeyguardService.isShowingAndNotOccluded(); } - return mKeyguardState.showingAndNotHidden; + return mKeyguardState.showingAndNotOccluded; } public boolean isInputRestricted() { @@ -174,12 +174,12 @@ public class KeyguardServiceDelegate { } } - public int setHidden(boolean isHidden) { + public int setOccluded(boolean isOccluded) { int result = 0; if (mKeyguardService != null) { - result = mKeyguardService.setHidden(isHidden); + result = mKeyguardService.setOccluded(isOccluded); } - mKeyguardState.hidden = isHidden; + mKeyguardState.occluded = isOccluded; return result; } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java index 6d5f2b6..7cb48fa 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java @@ -58,9 +58,9 @@ public class KeyguardServiceWrapper implements IKeyguardService { return false; // TODO cache state } - public boolean isShowingAndNotHidden() { + public boolean isShowingAndNotOccluded() { try { - return mService.isShowingAndNotHidden(); + return mService.isShowingAndNotOccluded(); } catch (RemoteException e) { Slog.w(TAG , "Remote Exception", e); } @@ -101,12 +101,12 @@ public class KeyguardServiceWrapper implements IKeyguardService { } } - public int setHidden(boolean isHidden) { + public int setOccluded(boolean isOccluded) { try { - return mService.setHidden(isHidden); + return mService.setOccluded(isOccluded); } catch (RemoteException e) { Slog.w(TAG , "Remote Exception", e); - return IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_NONE; + return IKeyguardServiceConstants.KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_NONE; } } |