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.CallSuper; 20 import android.content.res.ColorStateList; 21 import android.content.res.Resources; 22 import android.telephony.TelephonyManager; 23 import android.view.inputmethod.InputMethodManager; 24 25 import com.android.internal.util.LatencyTracker; 26 import com.android.internal.widget.LockPatternUtils; 27 import com.android.keyguard.KeyguardSecurityModel.SecurityMode; 28 import com.android.systemui.R; 29 import com.android.systemui.classifier.FalsingCollector; 30 import com.android.systemui.dagger.qualifiers.Main; 31 import com.android.systemui.statusbar.policy.DevicePostureController; 32 import com.android.systemui.util.ViewController; 33 import com.android.systemui.util.concurrency.DelayableExecutor; 34 35 import javax.inject.Inject; 36 37 38 /** Controller for a {@link KeyguardSecurityView}. */ 39 public abstract class KeyguardInputViewController<T extends KeyguardInputView> 40 extends ViewController<T> implements KeyguardSecurityView { 41 42 private final SecurityMode mSecurityMode; 43 private final KeyguardSecurityCallback mKeyguardSecurityCallback; 44 private final EmergencyButton mEmergencyButton; 45 private final EmergencyButtonController mEmergencyButtonController; 46 private boolean mPaused; 47 48 49 // The following is used to ignore callbacks from SecurityViews that are no longer current 50 // (e.g. face unlock). This avoids unwanted asynchronous events from messing with the 51 // state for the current security method. 52 private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() { 53 @Override 54 public void userActivity() { } 55 @Override 56 public void reportUnlockAttempt(int userId, boolean success, int timeoutMs) { } 57 @Override 58 public boolean isVerifyUnlockOnly() { 59 return false; 60 } 61 @Override 62 public void dismiss(boolean securityVerified, int targetUserId) { } 63 @Override 64 public void dismiss(boolean authenticated, int targetId, 65 boolean bypassSecondaryLockScreen) { } 66 @Override 67 public void onUserInput() { } 68 @Override 69 public void reset() {} 70 }; 71 KeyguardInputViewController(T view, SecurityMode securityMode, KeyguardSecurityCallback keyguardSecurityCallback, EmergencyButtonController emergencyButtonController)72 protected KeyguardInputViewController(T view, SecurityMode securityMode, 73 KeyguardSecurityCallback keyguardSecurityCallback, 74 EmergencyButtonController emergencyButtonController) { 75 super(view); 76 mSecurityMode = securityMode; 77 mKeyguardSecurityCallback = keyguardSecurityCallback; 78 mEmergencyButton = view == null ? null : view.findViewById(R.id.emergency_call_button); 79 mEmergencyButtonController = emergencyButtonController; 80 } 81 82 @Override onInit()83 protected void onInit() { 84 mEmergencyButtonController.init(); 85 } 86 87 @Override onViewAttached()88 protected void onViewAttached() { 89 } 90 91 @Override onViewDetached()92 protected void onViewDetached() { 93 } 94 getSecurityMode()95 SecurityMode getSecurityMode() { 96 return mSecurityMode; 97 } 98 getKeyguardSecurityCallback()99 protected KeyguardSecurityCallback getKeyguardSecurityCallback() { 100 if (mPaused) { 101 return mNullCallback; 102 } 103 104 return mKeyguardSecurityCallback; 105 } 106 107 @Override reset()108 public void reset() { 109 } 110 111 @Override onPause()112 public void onPause() { 113 mPaused = true; 114 } 115 116 @Override onResume(int reason)117 public void onResume(int reason) { 118 mPaused = false; 119 } 120 121 @Override showPromptReason(int reason)122 public void showPromptReason(int reason) { 123 } 124 125 @Override showMessage(CharSequence message, ColorStateList colorState)126 public void showMessage(CharSequence message, ColorStateList colorState) { 127 } 128 129 /** 130 * Reload colors from resources. 131 **/ 132 @CallSuper reloadColors()133 public void reloadColors() { 134 if (mEmergencyButton != null) { 135 mEmergencyButton.reloadColors(); 136 } 137 } 138 startAppearAnimation()139 public void startAppearAnimation() { 140 mView.startAppearAnimation(); 141 } 142 startDisappearAnimation(Runnable finishRunnable)143 public boolean startDisappearAnimation(Runnable finishRunnable) { 144 return mView.startDisappearAnimation(finishRunnable); 145 } 146 147 @Override getTitle()148 public CharSequence getTitle() { 149 return mView.getTitle(); 150 } 151 152 /** Finds the index of this view in the suppplied parent view. */ getIndexIn(KeyguardSecurityViewFlipper view)153 public int getIndexIn(KeyguardSecurityViewFlipper view) { 154 return view.indexOfChild(mView); 155 } 156 157 /** Factory for a {@link KeyguardInputViewController}. */ 158 public static class Factory { 159 private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; 160 private final LockPatternUtils mLockPatternUtils; 161 private final LatencyTracker mLatencyTracker; 162 private final KeyguardMessageAreaController.Factory mMessageAreaControllerFactory; 163 private final InputMethodManager mInputMethodManager; 164 private final DelayableExecutor mMainExecutor; 165 private final Resources mResources; 166 private final LiftToActivateListener mLiftToActivateListener; 167 private final TelephonyManager mTelephonyManager; 168 private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory; 169 private final FalsingCollector mFalsingCollector; 170 private final DevicePostureController mDevicePostureController; 171 172 @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)173 public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor, 174 LockPatternUtils lockPatternUtils, 175 LatencyTracker latencyTracker, 176 KeyguardMessageAreaController.Factory messageAreaControllerFactory, 177 InputMethodManager inputMethodManager, @Main DelayableExecutor mainExecutor, 178 @Main Resources resources, LiftToActivateListener liftToActivateListener, 179 TelephonyManager telephonyManager, FalsingCollector falsingCollector, 180 EmergencyButtonController.Factory emergencyButtonControllerFactory, 181 DevicePostureController devicePostureController) { 182 mKeyguardUpdateMonitor = keyguardUpdateMonitor; 183 mLockPatternUtils = lockPatternUtils; 184 mLatencyTracker = latencyTracker; 185 mMessageAreaControllerFactory = messageAreaControllerFactory; 186 mInputMethodManager = inputMethodManager; 187 mMainExecutor = mainExecutor; 188 mResources = resources; 189 mLiftToActivateListener = liftToActivateListener; 190 mTelephonyManager = telephonyManager; 191 mEmergencyButtonControllerFactory = emergencyButtonControllerFactory; 192 mFalsingCollector = falsingCollector; 193 mDevicePostureController = devicePostureController; 194 } 195 196 /** Create a new {@link KeyguardInputViewController}. */ create(KeyguardInputView keyguardInputView, SecurityMode securityMode, KeyguardSecurityCallback keyguardSecurityCallback)197 public KeyguardInputViewController create(KeyguardInputView keyguardInputView, 198 SecurityMode securityMode, KeyguardSecurityCallback keyguardSecurityCallback) { 199 EmergencyButtonController emergencyButtonController = 200 mEmergencyButtonControllerFactory.create( 201 keyguardInputView.findViewById(R.id.emergency_call_button)); 202 203 if (keyguardInputView instanceof KeyguardPatternView) { 204 return new KeyguardPatternViewController((KeyguardPatternView) keyguardInputView, 205 mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, 206 keyguardSecurityCallback, mLatencyTracker, mFalsingCollector, 207 emergencyButtonController, mMessageAreaControllerFactory, 208 mDevicePostureController); 209 } else if (keyguardInputView instanceof KeyguardPasswordView) { 210 return new KeyguardPasswordViewController((KeyguardPasswordView) keyguardInputView, 211 mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, 212 keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, 213 mInputMethodManager, emergencyButtonController, mMainExecutor, mResources, 214 mFalsingCollector); 215 216 } else if (keyguardInputView instanceof KeyguardPINView) { 217 return new KeyguardPinViewController((KeyguardPINView) keyguardInputView, 218 mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, 219 keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, 220 mLiftToActivateListener, emergencyButtonController, mFalsingCollector, 221 mDevicePostureController); 222 } else if (keyguardInputView instanceof KeyguardSimPinView) { 223 return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView, 224 mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, 225 keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, 226 mLiftToActivateListener, mTelephonyManager, mFalsingCollector, 227 emergencyButtonController); 228 } else if (keyguardInputView instanceof KeyguardSimPukView) { 229 return new KeyguardSimPukViewController((KeyguardSimPukView) keyguardInputView, 230 mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, 231 keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, 232 mLiftToActivateListener, mTelephonyManager, mFalsingCollector, 233 emergencyButtonController); 234 } 235 236 throw new RuntimeException("Unable to find controller for " + keyguardInputView); 237 } 238 } 239 } 240