blob: db85fa0a3203a5e683a1c10af8ea92b1242f50c6 [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;
Dave Mankoffe0321d52019-06-21 14:24:43 -040020
Dave Mankoff468d4f62019-05-08 14:56:29 -040021import android.content.Context;
Dave Mankoff63a12822019-09-16 14:38:06 -040022import android.hardware.SensorManager;
Dave Mankoff468d4f62019-05-08 14:56:29 -040023import 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 Mankofff4736812019-10-18 17:25:50 -040033import com.android.systemui.dagger.qualifiers.MainHandler;
Dave Mankoff468d4f62019-05-08 14:56:29 -040034import com.android.systemui.plugins.FalsingManager;
35import com.android.systemui.plugins.FalsingPlugin;
36import com.android.systemui.plugins.PluginListener;
37import com.android.systemui.shared.plugins.PluginManager;
Dave Mankoff186bd742019-08-15 10:26:38 -040038import com.android.systemui.util.DeviceConfigProxy;
Dave Mankoff63a12822019-09-16 14:38:06 -040039import com.android.systemui.util.sensors.ProximitySensor;
Dave Mankoff468d4f62019-05-08 14:56:29 -040040
41import java.io.PrintWriter;
42
43import javax.inject.Inject;
Dave Mankoffe0321d52019-06-21 14:24:43 -040044import javax.inject.Singleton;
Dave Mankoff468d4f62019-05-08 14:56:29 -040045
46/**
47 * Simple passthrough implementation of {@link FalsingManager} allowing plugins to swap in.
48 *
49 * {@link FalsingManagerImpl} is used when a Plugin is not loaded.
50 */
Dave Mankoffe0321d52019-06-21 14:24:43 -040051@Singleton
Dave Mankoff468d4f62019-05-08 14:56:29 -040052public class FalsingManagerProxy implements FalsingManager {
53
Dave Mankoff84fa2702019-09-12 13:39:42 -040054 private static final String PROXIMITY_SENSOR_TAG = "FalsingManager";
55
56 private final ProximitySensor mProximitySensor;
Dave Mankoff468d4f62019-05-08 14:56:29 -040057 private FalsingManager mInternalFalsingManager;
Dave Mankoff186bd742019-08-15 10:26:38 -040058 private DeviceConfig.OnPropertiesChangedListener mDeviceConfigListener;
59 private final DeviceConfigProxy mDeviceConfig;
Robert Snoeberger648c2952019-08-22 17:56:01 -040060 private boolean mBrightlineEnabled;
Dave Mankoff468d4f62019-05-08 14:56:29 -040061
62 @Inject
Dave Mankoffe0321d52019-06-21 14:24:43 -040063 FalsingManagerProxy(Context context, PluginManager pluginManager,
Dave Mankofff4736812019-10-18 17:25:50 -040064 @MainHandler Handler handler,
Dave Mankoff84fa2702019-09-12 13:39:42 -040065 ProximitySensor proximitySensor,
66 DeviceConfigProxy deviceConfig) {
67 mProximitySensor = proximitySensor;
68 mProximitySensor.setTag(PROXIMITY_SENSOR_TAG);
Dave Mankoff63a12822019-09-16 14:38:06 -040069 mProximitySensor.setSensorDelay(SensorManager.SENSOR_DELAY_GAME);
Dave Mankoff186bd742019-08-15 10:26:38 -040070 mDeviceConfig = deviceConfig;
71 mDeviceConfigListener =
72 properties -> onDeviceConfigPropertiesChanged(context, properties.getNamespace());
Robert Snoeberger648c2952019-08-22 17:56:01 -040073 setupFalsingManager(context);
Dave Mankoff186bd742019-08-15 10:26:38 -040074 mDeviceConfig.addOnPropertiesChangedListener(
75 DeviceConfig.NAMESPACE_SYSTEMUI,
76 handler::post,
77 mDeviceConfigListener
Dave Mankoffe0321d52019-06-21 14:24:43 -040078 );
Dave Mankoff186bd742019-08-15 10:26:38 -040079
Dave Mankoff468d4f62019-05-08 14:56:29 -040080 final PluginListener<FalsingPlugin> mPluginListener = new PluginListener<FalsingPlugin>() {
81 public void onPluginConnected(FalsingPlugin plugin, Context context) {
82 FalsingManager pluginFalsingManager = plugin.getFalsingManager(context);
83 if (pluginFalsingManager != null) {
Dave Mankoff4c5a13e2019-07-16 15:07:01 -040084 mInternalFalsingManager.cleanup();
Dave Mankoff468d4f62019-05-08 14:56:29 -040085 mInternalFalsingManager = pluginFalsingManager;
86 }
87 }
88
89 public void onPluginDisconnected(FalsingPlugin plugin) {
90 mInternalFalsingManager = new FalsingManagerImpl(context);
91 }
92 };
93
94 pluginManager.addPluginListener(mPluginListener, FalsingPlugin.class);
95 }
96
Dave Mankoffe0321d52019-06-21 14:24:43 -040097 private void onDeviceConfigPropertiesChanged(Context context, String namespace) {
98 if (!DeviceConfig.NAMESPACE_SYSTEMUI.equals(namespace)) {
99 return;
100 }
101
102 setupFalsingManager(context);
103 }
104
105 /**
106 * Chooses the FalsingManager implementation.
107 */
Dave Mankoff186bd742019-08-15 10:26:38 -0400108 private void setupFalsingManager(Context context) {
109 boolean brightlineEnabled = mDeviceConfig.getBoolean(
Dave Mankoffb3325882019-07-19 11:25:45 -0400110 DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, true);
Robert Snoeberger648c2952019-08-22 17:56:01 -0400111 if (brightlineEnabled == mBrightlineEnabled && mInternalFalsingManager != null) {
112 return;
113 }
114 mBrightlineEnabled = brightlineEnabled;
Dave Mankoff1b808842019-07-18 17:20:11 -0400115
116 if (mInternalFalsingManager != null) {
117 mInternalFalsingManager.cleanup();
118 }
Dave Mankoffe0321d52019-06-21 14:24:43 -0400119 if (!brightlineEnabled) {
120 mInternalFalsingManager = new FalsingManagerImpl(context);
121 } else {
122 mInternalFalsingManager = new BrightLineFalsingManager(
Dave Mankofff5d210e2019-06-25 12:23:05 -0400123 new FalsingDataProvider(context.getResources().getDisplayMetrics()),
Dave Mankoffe2294692019-08-14 11:53:13 -0400124 Dependency.get(KeyguardUpdateMonitor.class),
Dave Mankoff84fa2702019-09-12 13:39:42 -0400125 mProximitySensor,
Dave Mankoff186bd742019-08-15 10:26:38 -0400126 mDeviceConfig
Dave Mankoffe0321d52019-06-21 14:24:43 -0400127 );
128 }
Dave Mankoffe0321d52019-06-21 14:24:43 -0400129 }
130
131 /**
132 * Returns the FalsingManager implementation in use.
133 */
134 @VisibleForTesting
135 FalsingManager getInternalFalsingManager() {
136 return mInternalFalsingManager;
137 }
138
Dave Mankoff468d4f62019-05-08 14:56:29 -0400139 @Override
140 public void onSucccessfulUnlock() {
141 mInternalFalsingManager.onSucccessfulUnlock();
142 }
143
144 @Override
145 public void onNotificationActive() {
146 mInternalFalsingManager.onNotificationActive();
147 }
148
149 @Override
150 public void setShowingAod(boolean showingAod) {
151 mInternalFalsingManager.setShowingAod(showingAod);
152 }
153
154 @Override
155 public void onNotificatonStartDraggingDown() {
156 mInternalFalsingManager.onNotificatonStartDraggingDown();
157 }
158
159 @Override
160 public boolean isUnlockingDisabled() {
161 return mInternalFalsingManager.isUnlockingDisabled();
162 }
163
164 @Override
165 public boolean isFalseTouch() {
166 return mInternalFalsingManager.isFalseTouch();
167 }
168
169 @Override
170 public void onNotificatonStopDraggingDown() {
171 mInternalFalsingManager.onNotificatonStartDraggingDown();
172 }
173
174 @Override
175 public void setNotificationExpanded() {
176 mInternalFalsingManager.setNotificationExpanded();
177 }
178
179 @Override
180 public boolean isClassiferEnabled() {
181 return mInternalFalsingManager.isClassiferEnabled();
182 }
183
184 @Override
185 public void onQsDown() {
186 mInternalFalsingManager.onQsDown();
187 }
188
189 @Override
190 public void setQsExpanded(boolean expanded) {
191 mInternalFalsingManager.setQsExpanded(expanded);
192 }
193
194 @Override
195 public boolean shouldEnforceBouncer() {
196 return mInternalFalsingManager.shouldEnforceBouncer();
197 }
198
199 @Override
200 public void onTrackingStarted(boolean secure) {
201 mInternalFalsingManager.onTrackingStarted(secure);
202 }
203
204 @Override
205 public void onTrackingStopped() {
206 mInternalFalsingManager.onTrackingStopped();
207 }
208
209 @Override
210 public void onLeftAffordanceOn() {
211 mInternalFalsingManager.onLeftAffordanceOn();
212 }
213
214 @Override
215 public void onCameraOn() {
216 mInternalFalsingManager.onCameraOn();
217 }
218
219 @Override
220 public void onAffordanceSwipingStarted(boolean rightCorner) {
221 mInternalFalsingManager.onAffordanceSwipingStarted(rightCorner);
222 }
223
224 @Override
225 public void onAffordanceSwipingAborted() {
226 mInternalFalsingManager.onAffordanceSwipingAborted();
227 }
228
229 @Override
230 public void onStartExpandingFromPulse() {
231 mInternalFalsingManager.onStartExpandingFromPulse();
232 }
233
234 @Override
235 public void onExpansionFromPulseStopped() {
236 mInternalFalsingManager.onExpansionFromPulseStopped();
237 }
238
239 @Override
240 public Uri reportRejectedTouch() {
241 return mInternalFalsingManager.reportRejectedTouch();
242 }
243
244 @Override
245 public void onScreenOnFromTouch() {
246 mInternalFalsingManager.onScreenOnFromTouch();
247 }
248
249 @Override
250 public boolean isReportingEnabled() {
251 return mInternalFalsingManager.isReportingEnabled();
252 }
253
254 @Override
255 public void onUnlockHintStarted() {
256 mInternalFalsingManager.onUnlockHintStarted();
257 }
258
259 @Override
260 public void onCameraHintStarted() {
261 mInternalFalsingManager.onCameraHintStarted();
262 }
263
264 @Override
265 public void onLeftAffordanceHintStarted() {
266 mInternalFalsingManager.onLeftAffordanceHintStarted();
267 }
268
269 @Override
270 public void onScreenTurningOn() {
271 mInternalFalsingManager.onScreenTurningOn();
272 }
273
274 @Override
275 public void onScreenOff() {
276 mInternalFalsingManager.onScreenOff();
277 }
278
279 @Override
280 public void onNotificatonStopDismissing() {
281 mInternalFalsingManager.onNotificatonStopDismissing();
282 }
283
284 @Override
285 public void onNotificationDismissed() {
286 mInternalFalsingManager.onNotificationDismissed();
287 }
288
289 @Override
290 public void onNotificatonStartDismissing() {
291 mInternalFalsingManager.onNotificatonStartDismissing();
292 }
293
294 @Override
295 public void onNotificationDoubleTap(boolean accepted, float dx, float dy) {
296 mInternalFalsingManager.onNotificationDoubleTap(accepted, dx, dy);
297 }
298
299 @Override
300 public void onBouncerShown() {
301 mInternalFalsingManager.onBouncerShown();
302 }
303
304 @Override
305 public void onBouncerHidden() {
306 mInternalFalsingManager.onBouncerHidden();
307 }
308
309 @Override
310 public void onTouchEvent(MotionEvent ev, int width, int height) {
311 mInternalFalsingManager.onTouchEvent(ev, width, height);
312 }
313
314 @Override
315 public void dump(PrintWriter pw) {
316 mInternalFalsingManager.dump(pw);
317 }
Dave Mankoff4c5a13e2019-07-16 15:07:01 -0400318
319 @Override
320 public void cleanup() {
Dave Mankoff186bd742019-08-15 10:26:38 -0400321 mDeviceConfig.removeOnPropertiesChangedListener(mDeviceConfigListener);
Dave Mankoff4c5a13e2019-07-16 15:07:01 -0400322 mInternalFalsingManager.cleanup();
323 }
Dave Mankoff468d4f62019-05-08 14:56:29 -0400324}