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.util.Log;
20 import android.view.LayoutInflater;
21 
22 import com.android.internal.annotations.VisibleForTesting;
23 import com.android.keyguard.KeyguardInputViewController.Factory;
24 import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
25 import com.android.keyguard.dagger.KeyguardBouncerScope;
26 import com.android.systemui.R;
27 import com.android.systemui.util.ViewController;
28 
29 import java.util.ArrayList;
30 import java.util.List;
31 
32 import javax.inject.Inject;
33 
34 /**
35  * Controller for a {@link KeyguardSecurityViewFlipper}.
36  */
37 @KeyguardBouncerScope
38 public class KeyguardSecurityViewFlipperController
39         extends ViewController<KeyguardSecurityViewFlipper> {
40 
41     private static final boolean DEBUG = KeyguardConstants.DEBUG;
42     private static final String TAG = "KeyguardSecurityView";
43 
44     private final List<KeyguardInputViewController<KeyguardInputView>> mChildren =
45             new ArrayList<>();
46     private final LayoutInflater mLayoutInflater;
47     private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory;
48     private final Factory mKeyguardSecurityViewControllerFactory;
49 
50     @Inject
KeyguardSecurityViewFlipperController(KeyguardSecurityViewFlipper view, LayoutInflater layoutInflater, KeyguardInputViewController.Factory keyguardSecurityViewControllerFactory, EmergencyButtonController.Factory emergencyButtonControllerFactory)51     protected KeyguardSecurityViewFlipperController(KeyguardSecurityViewFlipper view,
52             LayoutInflater layoutInflater,
53             KeyguardInputViewController.Factory keyguardSecurityViewControllerFactory,
54             EmergencyButtonController.Factory emergencyButtonControllerFactory) {
55         super(view);
56         mKeyguardSecurityViewControllerFactory = keyguardSecurityViewControllerFactory;
57         mLayoutInflater = layoutInflater;
58         mEmergencyButtonControllerFactory = emergencyButtonControllerFactory;
59     }
60 
61     @Override
onViewAttached()62     protected void onViewAttached() {
63 
64     }
65 
66     @Override
onViewDetached()67     protected void onViewDetached() {
68 
69     }
70 
reset()71     public void reset() {
72         for (KeyguardInputViewController<KeyguardInputView> child : mChildren) {
73             child.reset();
74         }
75     }
76 
77     /**
78      * Reload colors of ui elements upon theme change.
79      */
reloadColors()80     public void reloadColors() {
81         for (KeyguardInputViewController<KeyguardInputView> child : mChildren) {
82             child.reloadColors();
83         }
84     }
85 
86     @VisibleForTesting
getSecurityView(SecurityMode securityMode, KeyguardSecurityCallback keyguardSecurityCallback)87     KeyguardInputViewController<KeyguardInputView> getSecurityView(SecurityMode securityMode,
88             KeyguardSecurityCallback keyguardSecurityCallback) {
89         KeyguardInputViewController<KeyguardInputView> childController = null;
90         for (KeyguardInputViewController<KeyguardInputView> child : mChildren) {
91             if (child.getSecurityMode() == securityMode) {
92                 childController = child;
93                 break;
94             }
95         }
96 
97         if (childController == null
98                 && securityMode != SecurityMode.None && securityMode != SecurityMode.Invalid) {
99 
100             int layoutId = getLayoutIdFor(securityMode);
101             KeyguardInputView view = null;
102             if (layoutId != 0) {
103                 if (DEBUG) Log.v(TAG, "inflating id = " + layoutId);
104                 view = (KeyguardInputView) mLayoutInflater.inflate(
105                         layoutId, mView, false);
106                 mView.addView(view);
107                 childController = mKeyguardSecurityViewControllerFactory.create(
108                         view, securityMode, keyguardSecurityCallback);
109                 childController.init();
110 
111                 mChildren.add(childController);
112             }
113         }
114 
115         if (childController == null) {
116             childController = new NullKeyguardInputViewController(
117                     securityMode, keyguardSecurityCallback,
118                     mEmergencyButtonControllerFactory.create(null));
119         }
120 
121         return childController;
122     }
123 
getLayoutIdFor(SecurityMode securityMode)124     private int getLayoutIdFor(SecurityMode securityMode) {
125         switch (securityMode) {
126             case Pattern: return com.android.systemui.R.layout.keyguard_pattern_view;
127             case PIN: return com.android.systemui.R.layout.keyguard_pin_view;
128             case Password: return com.android.systemui.R.layout.keyguard_password_view;
129             case SimPin: return com.android.systemui.R.layout.keyguard_sim_pin_view;
130             case SimPuk: return R.layout.keyguard_sim_puk_view;
131             default:
132                 return 0;
133         }
134     }
135 
136     /** Makes the supplied child visible if it is contained win this view, */
show(KeyguardInputViewController<KeyguardInputView> childController)137     public void show(KeyguardInputViewController<KeyguardInputView> childController) {
138         int index = childController.getIndexIn(mView);
139         if (index != -1) {
140             mView.setDisplayedChild(index);
141         }
142     }
143 
144     private static class NullKeyguardInputViewController
145             extends KeyguardInputViewController<KeyguardInputView> {
NullKeyguardInputViewController(SecurityMode securityMode, KeyguardSecurityCallback keyguardSecurityCallback, EmergencyButtonController emergencyButtonController)146         protected NullKeyguardInputViewController(SecurityMode securityMode,
147                 KeyguardSecurityCallback keyguardSecurityCallback,
148                 EmergencyButtonController emergencyButtonController) {
149             super(null, securityMode, keyguardSecurityCallback, emergencyButtonController);
150         }
151 
152         @Override
needsInput()153         public boolean needsInput() {
154             return false;
155         }
156 
157         @Override
onStartingToHide()158         public void onStartingToHide() {
159 
160         }
161     }
162 }
163