• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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