1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.keyguard; 18 19 import android.annotation.Nullable; 20 import android.content.res.ColorStateList; 21 import android.content.res.Resources; 22 import android.telephony.TelephonyManager; 23 import android.text.TextUtils; 24 import android.util.Log; 25 import android.view.inputmethod.InputMethodManager; 26 27 import com.android.internal.util.LatencyTracker; 28 import com.android.internal.widget.LockPatternUtils; 29 import com.android.keyguard.KeyguardSecurityModel.SecurityMode; 30 import com.android.systemui.R; 31 import com.android.systemui.classifier.FalsingCollector; 32 import com.android.systemui.dagger.qualifiers.Main; 33 import com.android.systemui.statusbar.policy.DevicePostureController; 34 import com.android.systemui.util.ViewController; 35 import com.android.systemui.util.concurrency.DelayableExecutor; 36 37 import javax.inject.Inject; 38 39 40 /** Controller for a {@link KeyguardSecurityView}. */ 41 public abstract class KeyguardInputViewController<T extends KeyguardInputView> 42 extends ViewController<T> implements KeyguardSecurityView { 43 44 private final SecurityMode mSecurityMode; 45 private final KeyguardSecurityCallback mKeyguardSecurityCallback; 46 private final EmergencyButton mEmergencyButton; 47 private final EmergencyButtonController mEmergencyButtonController; 48 private boolean mPaused; 49 protected KeyguardMessageAreaController<BouncerKeyguardMessageArea> mMessageAreaController; 50 51 // The following is used to ignore callbacks from SecurityViews that are no longer current 52 // (e.g. face unlock). This avoids unwanted asynchronous events from messing with the 53 // state for the current security method. 54 private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() {}; 55 KeyguardInputViewController(T view, SecurityMode securityMode, KeyguardSecurityCallback keyguardSecurityCallback, EmergencyButtonController emergencyButtonController, @Nullable KeyguardMessageAreaController.Factory messageAreaControllerFactory)56 protected KeyguardInputViewController(T view, SecurityMode securityMode, 57 KeyguardSecurityCallback keyguardSecurityCallback, 58 EmergencyButtonController emergencyButtonController, 59 @Nullable KeyguardMessageAreaController.Factory messageAreaControllerFactory) { 60 super(view); 61 mSecurityMode = securityMode; 62 mKeyguardSecurityCallback = keyguardSecurityCallback; 63 mEmergencyButton = view == null ? null : view.findViewById(R.id.emergency_call_button); 64 mEmergencyButtonController = emergencyButtonController; 65 if (messageAreaControllerFactory != null) { 66 try { 67 BouncerKeyguardMessageArea kma = view.requireViewById(R.id.bouncer_message_area); 68 mMessageAreaController = messageAreaControllerFactory.create(kma); 69 mMessageAreaController.init(); 70 mMessageAreaController.setIsVisible(true); 71 } catch (IllegalArgumentException exception) { 72 Log.e("KeyguardInputViewController", 73 "Ensure that a BouncerKeyguardMessageArea is included in the layout"); 74 } 75 } 76 } 77 78 @Override onInit()79 protected void onInit() { 80 mEmergencyButtonController.init(); 81 } 82 83 @Override onViewAttached()84 protected void onViewAttached() { 85 } 86 87 @Override onViewDetached()88 protected void onViewDetached() { 89 } 90 getSecurityMode()91 SecurityMode getSecurityMode() { 92 return mSecurityMode; 93 } 94 getKeyguardSecurityCallback()95 protected KeyguardSecurityCallback getKeyguardSecurityCallback() { 96 if (mPaused) { 97 return mNullCallback; 98 } 99 100 return mKeyguardSecurityCallback; 101 } 102 103 @Override reset()104 public void reset() { 105 mMessageAreaController.setMessage("", false); 106 } 107 108 @Override onPause()109 public void onPause() { 110 mPaused = true; 111 } 112 113 @Override onResume(int reason)114 public void onResume(int reason) { 115 mPaused = false; 116 } 117 118 @Override showPromptReason(int reason)119 public void showPromptReason(int reason) { 120 } 121 122 @Override showMessage(CharSequence message, ColorStateList colorState)123 public void showMessage(CharSequence message, ColorStateList colorState) { 124 } 125 startAppearAnimation()126 public void startAppearAnimation() { 127 if (TextUtils.isEmpty(mMessageAreaController.getMessage()) 128 && getInitialMessageResId() != 0) { 129 mMessageAreaController.setMessage( 130 mView.getResources().getString(getInitialMessageResId()), 131 /* animate= */ false); 132 } 133 mView.startAppearAnimation(); 134 } 135 startDisappearAnimation(Runnable finishRunnable)136 public boolean startDisappearAnimation(Runnable finishRunnable) { 137 return mView.startDisappearAnimation(finishRunnable); 138 } 139 140 @Override getTitle()141 public CharSequence getTitle() { 142 return mView.getTitle(); 143 } 144 145 /** Finds the index of this view in the suppplied parent view. */ getIndexIn(KeyguardSecurityViewFlipper view)146 public int getIndexIn(KeyguardSecurityViewFlipper view) { 147 return view.indexOfChild(mView); 148 } 149 150 /** Determines the message to show in the bouncer when it first appears. */ getInitialMessageResId()151 protected abstract int getInitialMessageResId(); 152 153 /** Factory for a {@link KeyguardInputViewController}. */ 154 public static class Factory { 155 private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; 156 private final LockPatternUtils mLockPatternUtils; 157 private final LatencyTracker mLatencyTracker; 158 private final KeyguardMessageAreaController.Factory mMessageAreaControllerFactory; 159 private final InputMethodManager mInputMethodManager; 160 private final DelayableExecutor mMainExecutor; 161 private final Resources mResources; 162 private final LiftToActivateListener mLiftToActivateListener; 163 private final TelephonyManager mTelephonyManager; 164 private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory; 165 private final FalsingCollector mFalsingCollector; 166 private final DevicePostureController mDevicePostureController; 167 private final KeyguardViewController mKeyguardViewController; 168 169 @Inject Factory(KeyguardUpdateMonitor keyguardUpdateMonitor, LockPatternUtils lockPatternUtils, LatencyTracker latencyTracker, KeyguardMessageAreaController.Factory messageAreaControllerFactory, InputMethodManager inputMethodManager, @Main DelayableExecutor mainExecutor, @Main Resources resources, LiftToActivateListener liftToActivateListener, TelephonyManager telephonyManager, FalsingCollector falsingCollector, EmergencyButtonController.Factory emergencyButtonControllerFactory, DevicePostureController devicePostureController, KeyguardViewController keyguardViewController)170 public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor, 171 LockPatternUtils lockPatternUtils, 172 LatencyTracker latencyTracker, 173 KeyguardMessageAreaController.Factory messageAreaControllerFactory, 174 InputMethodManager inputMethodManager, @Main DelayableExecutor mainExecutor, 175 @Main Resources resources, LiftToActivateListener liftToActivateListener, 176 TelephonyManager telephonyManager, FalsingCollector falsingCollector, 177 EmergencyButtonController.Factory emergencyButtonControllerFactory, 178 DevicePostureController devicePostureController, 179 KeyguardViewController keyguardViewController) { 180 mKeyguardUpdateMonitor = keyguardUpdateMonitor; 181 mLockPatternUtils = lockPatternUtils; 182 mLatencyTracker = latencyTracker; 183 mMessageAreaControllerFactory = messageAreaControllerFactory; 184 mInputMethodManager = inputMethodManager; 185 mMainExecutor = mainExecutor; 186 mResources = resources; 187 mLiftToActivateListener = liftToActivateListener; 188 mTelephonyManager = telephonyManager; 189 mEmergencyButtonControllerFactory = emergencyButtonControllerFactory; 190 mFalsingCollector = falsingCollector; 191 mDevicePostureController = devicePostureController; 192 mKeyguardViewController = keyguardViewController; 193 } 194 195 /** Create a new {@link KeyguardInputViewController}. */ create(KeyguardInputView keyguardInputView, SecurityMode securityMode, KeyguardSecurityCallback keyguardSecurityCallback)196 public KeyguardInputViewController create(KeyguardInputView keyguardInputView, 197 SecurityMode securityMode, KeyguardSecurityCallback keyguardSecurityCallback) { 198 EmergencyButtonController emergencyButtonController = 199 mEmergencyButtonControllerFactory.create( 200 keyguardInputView.findViewById(R.id.emergency_call_button)); 201 202 if (keyguardInputView instanceof KeyguardPatternView) { 203 return new KeyguardPatternViewController((KeyguardPatternView) keyguardInputView, 204 mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, 205 keyguardSecurityCallback, mLatencyTracker, mFalsingCollector, 206 emergencyButtonController, mMessageAreaControllerFactory, 207 mDevicePostureController); 208 } else if (keyguardInputView instanceof KeyguardPasswordView) { 209 return new KeyguardPasswordViewController((KeyguardPasswordView) keyguardInputView, 210 mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, 211 keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, 212 mInputMethodManager, emergencyButtonController, mMainExecutor, mResources, 213 mFalsingCollector, mKeyguardViewController); 214 215 } else if (keyguardInputView instanceof KeyguardPINView) { 216 return new KeyguardPinViewController((KeyguardPINView) keyguardInputView, 217 mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, 218 keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, 219 mLiftToActivateListener, emergencyButtonController, mFalsingCollector, 220 mDevicePostureController); 221 } else if (keyguardInputView instanceof KeyguardSimPinView) { 222 return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView, 223 mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, 224 keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, 225 mLiftToActivateListener, mTelephonyManager, mFalsingCollector, 226 emergencyButtonController); 227 } else if (keyguardInputView instanceof KeyguardSimPukView) { 228 return new KeyguardSimPukViewController((KeyguardSimPukView) keyguardInputView, 229 mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, 230 keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, 231 mLiftToActivateListener, mTelephonyManager, mFalsingCollector, 232 emergencyButtonController); 233 } 234 235 throw new RuntimeException("Unable to find controller for " + keyguardInputView); 236 } 237 } 238 } 239