blob: ee79e6b973deb47a3c9a1d444672d10cc47d5f64 [file] [log] [blame]
Dave Mankoff468d4f62019-05-08 14:56:29 -04001/*
2 * Copyright (C) 2019 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
17package com.android.systemui.classifier;
18
Dave Mankoffe0321d52019-06-21 14:24:43 -040019import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_MANAGER_ENABLED;
20import static com.android.systemui.Dependency.MAIN_HANDLER_NAME;
21
Dave Mankoff468d4f62019-05-08 14:56:29 -040022import android.content.Context;
23import android.net.Uri;
Dave Mankoffe0321d52019-06-21 14:24:43 -040024import android.os.Handler;
25import android.provider.DeviceConfig;
Dave Mankoff468d4f62019-05-08 14:56:29 -040026import android.view.MotionEvent;
27
Dave Mankoffe0321d52019-06-21 14:24:43 -040028import com.android.internal.annotations.VisibleForTesting;
Dave Mankoffd61f01b2019-08-09 17:58:56 -040029import com.android.keyguard.KeyguardUpdateMonitor;
Dave Mankoffe0321d52019-06-21 14:24:43 -040030import com.android.systemui.Dependency;
31import com.android.systemui.classifier.brightline.BrightLineFalsingManager;
32import com.android.systemui.classifier.brightline.FalsingDataProvider;
Dave Mankoff468d4f62019-05-08 14:56:29 -040033import com.android.systemui.plugins.FalsingManager;
34import com.android.systemui.plugins.FalsingPlugin;
35import com.android.systemui.plugins.PluginListener;
36import com.android.systemui.shared.plugins.PluginManager;
Dave Mankoffe0321d52019-06-21 14:24:43 -040037import com.android.systemui.util.AsyncSensorManager;
Dave Mankoff468d4f62019-05-08 14:56:29 -040038
39import java.io.PrintWriter;
40
41import javax.inject.Inject;
Dave Mankoffe0321d52019-06-21 14:24:43 -040042import javax.inject.Named;
43import javax.inject.Singleton;
Dave Mankoff468d4f62019-05-08 14:56:29 -040044
45/**
46 * Simple passthrough implementation of {@link FalsingManager} allowing plugins to swap in.
47 *
48 * {@link FalsingManagerImpl} is used when a Plugin is not loaded.
49 */
Dave Mankoffe0321d52019-06-21 14:24:43 -040050@Singleton
Dave Mankoff468d4f62019-05-08 14:56:29 -040051public class FalsingManagerProxy implements FalsingManager {
52
53 private FalsingManager mInternalFalsingManager;
Dave Mankoffe0321d52019-06-21 14:24:43 -040054 private final Handler mMainHandler;
Dave Mankoff468d4f62019-05-08 14:56:29 -040055
56 @Inject
Dave Mankoffe0321d52019-06-21 14:24:43 -040057 FalsingManagerProxy(Context context, PluginManager pluginManager,
58 @Named(MAIN_HANDLER_NAME) Handler handler) {
59 mMainHandler = handler;
60 DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
61 command -> mMainHandler.post(command),
62 properties -> onDeviceConfigPropertiesChanged(context, properties.getNamespace())
63 );
64 setupFalsingManager(context);
Dave Mankoff468d4f62019-05-08 14:56:29 -040065 final PluginListener<FalsingPlugin> mPluginListener = new PluginListener<FalsingPlugin>() {
66 public void onPluginConnected(FalsingPlugin plugin, Context context) {
67 FalsingManager pluginFalsingManager = plugin.getFalsingManager(context);
68 if (pluginFalsingManager != null) {
Dave Mankoff4c5a13e2019-07-16 15:07:01 -040069 mInternalFalsingManager.cleanup();
Dave Mankoff468d4f62019-05-08 14:56:29 -040070 mInternalFalsingManager = pluginFalsingManager;
71 }
72 }
73
74 public void onPluginDisconnected(FalsingPlugin plugin) {
75 mInternalFalsingManager = new FalsingManagerImpl(context);
76 }
77 };
78
79 pluginManager.addPluginListener(mPluginListener, FalsingPlugin.class);
80 }
81
Dave Mankoffe0321d52019-06-21 14:24:43 -040082 private void onDeviceConfigPropertiesChanged(Context context, String namespace) {
83 if (!DeviceConfig.NAMESPACE_SYSTEMUI.equals(namespace)) {
84 return;
85 }
86
87 setupFalsingManager(context);
88 }
89
90 /**
91 * Chooses the FalsingManager implementation.
92 */
93 @VisibleForTesting
94 public void setupFalsingManager(Context context) {
95 boolean brightlineEnabled = DeviceConfig.getBoolean(
Dave Mankoffb3325882019-07-19 11:25:45 -040096 DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, true);
Dave Mankoff1b808842019-07-18 17:20:11 -040097
98 if (mInternalFalsingManager != null) {
99 mInternalFalsingManager.cleanup();
100 }
Dave Mankoffe0321d52019-06-21 14:24:43 -0400101 if (!brightlineEnabled) {
102 mInternalFalsingManager = new FalsingManagerImpl(context);
103 } else {
104 mInternalFalsingManager = new BrightLineFalsingManager(
Dave Mankofff5d210e2019-06-25 12:23:05 -0400105 new FalsingDataProvider(context.getResources().getDisplayMetrics()),
Dave Mankoffd61f01b2019-08-09 17:58:56 -0400106 Dependency.get(AsyncSensorManager.class),
107 KeyguardUpdateMonitor.getInstance(context)
Dave Mankoffe0321d52019-06-21 14:24:43 -0400108 );
109 }
110
111 }
112
113 /**
114 * Returns the FalsingManager implementation in use.
115 */
116 @VisibleForTesting
117 FalsingManager getInternalFalsingManager() {
118 return mInternalFalsingManager;
119 }
120
Dave Mankoff468d4f62019-05-08 14:56:29 -0400121 @Override
122 public void onSucccessfulUnlock() {
123 mInternalFalsingManager.onSucccessfulUnlock();
124 }
125
126 @Override
127 public void onNotificationActive() {
128 mInternalFalsingManager.onNotificationActive();
129 }
130
131 @Override
132 public void setShowingAod(boolean showingAod) {
133 mInternalFalsingManager.setShowingAod(showingAod);
134 }
135
136 @Override
137 public void onNotificatonStartDraggingDown() {
138 mInternalFalsingManager.onNotificatonStartDraggingDown();
139 }
140
141 @Override
142 public boolean isUnlockingDisabled() {
143 return mInternalFalsingManager.isUnlockingDisabled();
144 }
145
146 @Override
147 public boolean isFalseTouch() {
148 return mInternalFalsingManager.isFalseTouch();
149 }
150
151 @Override
152 public void onNotificatonStopDraggingDown() {
153 mInternalFalsingManager.onNotificatonStartDraggingDown();
154 }
155
156 @Override
157 public void setNotificationExpanded() {
158 mInternalFalsingManager.setNotificationExpanded();
159 }
160
161 @Override
162 public boolean isClassiferEnabled() {
163 return mInternalFalsingManager.isClassiferEnabled();
164 }
165
166 @Override
167 public void onQsDown() {
168 mInternalFalsingManager.onQsDown();
169 }
170
171 @Override
172 public void setQsExpanded(boolean expanded) {
173 mInternalFalsingManager.setQsExpanded(expanded);
174 }
175
176 @Override
177 public boolean shouldEnforceBouncer() {
178 return mInternalFalsingManager.shouldEnforceBouncer();
179 }
180
181 @Override
182 public void onTrackingStarted(boolean secure) {
183 mInternalFalsingManager.onTrackingStarted(secure);
184 }
185
186 @Override
187 public void onTrackingStopped() {
188 mInternalFalsingManager.onTrackingStopped();
189 }
190
191 @Override
192 public void onLeftAffordanceOn() {
193 mInternalFalsingManager.onLeftAffordanceOn();
194 }
195
196 @Override
197 public void onCameraOn() {
198 mInternalFalsingManager.onCameraOn();
199 }
200
201 @Override
202 public void onAffordanceSwipingStarted(boolean rightCorner) {
203 mInternalFalsingManager.onAffordanceSwipingStarted(rightCorner);
204 }
205
206 @Override
207 public void onAffordanceSwipingAborted() {
208 mInternalFalsingManager.onAffordanceSwipingAborted();
209 }
210
211 @Override
212 public void onStartExpandingFromPulse() {
213 mInternalFalsingManager.onStartExpandingFromPulse();
214 }
215
216 @Override
217 public void onExpansionFromPulseStopped() {
218 mInternalFalsingManager.onExpansionFromPulseStopped();
219 }
220
221 @Override
222 public Uri reportRejectedTouch() {
223 return mInternalFalsingManager.reportRejectedTouch();
224 }
225
226 @Override
227 public void onScreenOnFromTouch() {
228 mInternalFalsingManager.onScreenOnFromTouch();
229 }
230
231 @Override
232 public boolean isReportingEnabled() {
233 return mInternalFalsingManager.isReportingEnabled();
234 }
235
236 @Override
237 public void onUnlockHintStarted() {
238 mInternalFalsingManager.onUnlockHintStarted();
239 }
240
241 @Override
242 public void onCameraHintStarted() {
243 mInternalFalsingManager.onCameraHintStarted();
244 }
245
246 @Override
247 public void onLeftAffordanceHintStarted() {
248 mInternalFalsingManager.onLeftAffordanceHintStarted();
249 }
250
251 @Override
252 public void onScreenTurningOn() {
253 mInternalFalsingManager.onScreenTurningOn();
254 }
255
256 @Override
257 public void onScreenOff() {
258 mInternalFalsingManager.onScreenOff();
259 }
260
261 @Override
262 public void onNotificatonStopDismissing() {
263 mInternalFalsingManager.onNotificatonStopDismissing();
264 }
265
266 @Override
267 public void onNotificationDismissed() {
268 mInternalFalsingManager.onNotificationDismissed();
269 }
270
271 @Override
272 public void onNotificatonStartDismissing() {
273 mInternalFalsingManager.onNotificatonStartDismissing();
274 }
275
276 @Override
277 public void onNotificationDoubleTap(boolean accepted, float dx, float dy) {
278 mInternalFalsingManager.onNotificationDoubleTap(accepted, dx, dy);
279 }
280
281 @Override
282 public void onBouncerShown() {
283 mInternalFalsingManager.onBouncerShown();
284 }
285
286 @Override
287 public void onBouncerHidden() {
288 mInternalFalsingManager.onBouncerHidden();
289 }
290
291 @Override
292 public void onTouchEvent(MotionEvent ev, int width, int height) {
293 mInternalFalsingManager.onTouchEvent(ev, width, height);
294 }
295
296 @Override
297 public void dump(PrintWriter pw) {
298 mInternalFalsingManager.dump(pw);
299 }
Dave Mankoff4c5a13e2019-07-16 15:07:01 -0400300
301 @Override
302 public void cleanup() {
303 mInternalFalsingManager.cleanup();
304 }
Dave Mankoff468d4f62019-05-08 14:56:29 -0400305}