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