• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
17 package com.android.systemui.classifier;
18 
19 import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_MANAGER_ENABLED;
20 
21 import android.content.Context;
22 import android.hardware.SensorManager;
23 import android.net.Uri;
24 import android.provider.DeviceConfig;
25 import android.view.MotionEvent;
26 
27 import androidx.annotation.NonNull;
28 
29 import com.android.internal.annotations.VisibleForTesting;
30 import com.android.keyguard.KeyguardUpdateMonitor;
31 import com.android.systemui.Dumpable;
32 import com.android.systemui.classifier.brightline.BrightLineFalsingManager;
33 import com.android.systemui.classifier.brightline.FalsingDataProvider;
34 import com.android.systemui.dagger.qualifiers.Main;
35 import com.android.systemui.dagger.qualifiers.UiBackground;
36 import com.android.systemui.dock.DockManager;
37 import com.android.systemui.dump.DumpManager;
38 import com.android.systemui.plugins.FalsingManager;
39 import com.android.systemui.plugins.FalsingPlugin;
40 import com.android.systemui.plugins.PluginListener;
41 import com.android.systemui.plugins.statusbar.StatusBarStateController;
42 import com.android.systemui.shared.plugins.PluginManager;
43 import com.android.systemui.util.DeviceConfigProxy;
44 import com.android.systemui.util.sensors.ProximitySensor;
45 
46 import java.io.FileDescriptor;
47 import java.io.PrintWriter;
48 import java.util.concurrent.Executor;
49 
50 import javax.inject.Inject;
51 import javax.inject.Singleton;
52 
53 /**
54  * Simple passthrough implementation of {@link FalsingManager} allowing plugins to swap in.
55  *
56  * {@link FalsingManagerImpl} is used when a Plugin is not loaded.
57  */
58 @Singleton
59 public class FalsingManagerProxy implements FalsingManager, Dumpable {
60 
61     private static final String PROXIMITY_SENSOR_TAG = "FalsingManager";
62 
63     private final ProximitySensor mProximitySensor;
64     private final FalsingDataProvider mFalsingDataProvider;
65     private FalsingManager mInternalFalsingManager;
66     private DeviceConfig.OnPropertiesChangedListener mDeviceConfigListener;
67     private final DeviceConfigProxy mDeviceConfig;
68     private boolean mBrightlineEnabled;
69     private final DockManager mDockManager;
70     private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
71     private Executor mUiBgExecutor;
72     private final StatusBarStateController mStatusBarStateController;
73 
74     @Inject
FalsingManagerProxy(Context context, PluginManager pluginManager, @Main Executor executor, ProximitySensor proximitySensor, DeviceConfigProxy deviceConfig, DockManager dockManager, KeyguardUpdateMonitor keyguardUpdateMonitor, DumpManager dumpManager, @UiBackground Executor uiBgExecutor, StatusBarStateController statusBarStateController, FalsingDataProvider falsingDataProvider)75     FalsingManagerProxy(Context context, PluginManager pluginManager, @Main Executor executor,
76             ProximitySensor proximitySensor,
77             DeviceConfigProxy deviceConfig, DockManager dockManager,
78             KeyguardUpdateMonitor keyguardUpdateMonitor,
79             DumpManager dumpManager,
80             @UiBackground Executor uiBgExecutor,
81             StatusBarStateController statusBarStateController,
82             FalsingDataProvider falsingDataProvider) {
83         mProximitySensor = proximitySensor;
84         mDockManager = dockManager;
85         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
86         mUiBgExecutor = uiBgExecutor;
87         mStatusBarStateController = statusBarStateController;
88         mFalsingDataProvider = falsingDataProvider;
89         mProximitySensor.setTag(PROXIMITY_SENSOR_TAG);
90         mProximitySensor.setDelay(SensorManager.SENSOR_DELAY_GAME);
91         mDeviceConfig = deviceConfig;
92         mDeviceConfigListener =
93                 properties -> onDeviceConfigPropertiesChanged(context, properties.getNamespace());
94         setupFalsingManager(context);
95         mDeviceConfig.addOnPropertiesChangedListener(
96                 DeviceConfig.NAMESPACE_SYSTEMUI,
97                 executor,
98                 mDeviceConfigListener
99         );
100 
101         final PluginListener<FalsingPlugin> mPluginListener = new PluginListener<FalsingPlugin>() {
102             public void onPluginConnected(FalsingPlugin plugin, Context context) {
103                 FalsingManager pluginFalsingManager = plugin.getFalsingManager(context);
104                 if (pluginFalsingManager != null) {
105                     mInternalFalsingManager.cleanup();
106                     mInternalFalsingManager = pluginFalsingManager;
107                 }
108             }
109 
110             public void onPluginDisconnected(FalsingPlugin plugin) {
111                 mInternalFalsingManager = new FalsingManagerImpl(context, mUiBgExecutor);
112             }
113         };
114 
115         pluginManager.addPluginListener(mPluginListener, FalsingPlugin.class);
116 
117         dumpManager.registerDumpable("FalsingManager", this);
118     }
119 
onDeviceConfigPropertiesChanged(Context context, String namespace)120     private void onDeviceConfigPropertiesChanged(Context context, String namespace) {
121         if (!DeviceConfig.NAMESPACE_SYSTEMUI.equals(namespace)) {
122             return;
123         }
124 
125         setupFalsingManager(context);
126     }
127 
128     /**
129      * Chooses the FalsingManager implementation.
130      */
setupFalsingManager(Context context)131     private void setupFalsingManager(Context context) {
132         boolean brightlineEnabled = mDeviceConfig.getBoolean(
133                 DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, true);
134         if (brightlineEnabled == mBrightlineEnabled && mInternalFalsingManager != null) {
135             return;
136         }
137         mBrightlineEnabled = brightlineEnabled;
138 
139         if (mInternalFalsingManager != null) {
140             mInternalFalsingManager.cleanup();
141         }
142         if (!brightlineEnabled) {
143             mInternalFalsingManager = new FalsingManagerImpl(context, mUiBgExecutor);
144         } else {
145             mInternalFalsingManager = new BrightLineFalsingManager(
146                     mFalsingDataProvider,
147                     mKeyguardUpdateMonitor,
148                     mProximitySensor,
149                     mDeviceConfig,
150                     mDockManager,
151                     mStatusBarStateController
152             );
153         }
154     }
155 
156     /**
157      * Returns the FalsingManager implementation in use.
158      */
159     @VisibleForTesting
getInternalFalsingManager()160     FalsingManager getInternalFalsingManager() {
161         return mInternalFalsingManager;
162     }
163 
164     @Override
onSuccessfulUnlock()165     public void onSuccessfulUnlock() {
166         mInternalFalsingManager.onSuccessfulUnlock();
167     }
168 
169     @Override
onNotificationActive()170     public void onNotificationActive() {
171         mInternalFalsingManager.onNotificationActive();
172     }
173 
174     @Override
setShowingAod(boolean showingAod)175     public void setShowingAod(boolean showingAod) {
176         mInternalFalsingManager.setShowingAod(showingAod);
177     }
178 
179     @Override
onNotificatonStartDraggingDown()180     public void onNotificatonStartDraggingDown() {
181         mInternalFalsingManager.onNotificatonStartDraggingDown();
182     }
183 
184     @Override
isUnlockingDisabled()185     public boolean isUnlockingDisabled() {
186         return mInternalFalsingManager.isUnlockingDisabled();
187     }
188 
189     @Override
isFalseTouch(@lassifier.InteractionType int interactionType)190     public boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
191         return mInternalFalsingManager.isFalseTouch(interactionType);
192     }
193 
194     @Override
onNotificatonStopDraggingDown()195     public void onNotificatonStopDraggingDown() {
196         mInternalFalsingManager.onNotificatonStartDraggingDown();
197     }
198 
199     @Override
setNotificationExpanded()200     public void setNotificationExpanded() {
201         mInternalFalsingManager.setNotificationExpanded();
202     }
203 
204     @Override
isClassifierEnabled()205     public boolean isClassifierEnabled() {
206         return mInternalFalsingManager.isClassifierEnabled();
207     }
208 
209     @Override
onQsDown()210     public void onQsDown() {
211         mInternalFalsingManager.onQsDown();
212     }
213 
214     @Override
setQsExpanded(boolean expanded)215     public void setQsExpanded(boolean expanded) {
216         mInternalFalsingManager.setQsExpanded(expanded);
217     }
218 
219     @Override
shouldEnforceBouncer()220     public boolean shouldEnforceBouncer() {
221         return mInternalFalsingManager.shouldEnforceBouncer();
222     }
223 
224     @Override
onTrackingStarted(boolean secure)225     public void onTrackingStarted(boolean secure) {
226         mInternalFalsingManager.onTrackingStarted(secure);
227     }
228 
229     @Override
onTrackingStopped()230     public void onTrackingStopped() {
231         mInternalFalsingManager.onTrackingStopped();
232     }
233 
234     @Override
onLeftAffordanceOn()235     public void onLeftAffordanceOn() {
236         mInternalFalsingManager.onLeftAffordanceOn();
237     }
238 
239     @Override
onCameraOn()240     public void onCameraOn() {
241         mInternalFalsingManager.onCameraOn();
242     }
243 
244     @Override
onAffordanceSwipingStarted(boolean rightCorner)245     public void onAffordanceSwipingStarted(boolean rightCorner) {
246         mInternalFalsingManager.onAffordanceSwipingStarted(rightCorner);
247     }
248 
249     @Override
onAffordanceSwipingAborted()250     public void onAffordanceSwipingAborted() {
251         mInternalFalsingManager.onAffordanceSwipingAborted();
252     }
253 
254     @Override
onStartExpandingFromPulse()255     public void onStartExpandingFromPulse() {
256         mInternalFalsingManager.onStartExpandingFromPulse();
257     }
258 
259     @Override
onExpansionFromPulseStopped()260     public void onExpansionFromPulseStopped() {
261         mInternalFalsingManager.onExpansionFromPulseStopped();
262     }
263 
264     @Override
reportRejectedTouch()265     public Uri reportRejectedTouch() {
266         return mInternalFalsingManager.reportRejectedTouch();
267     }
268 
269     @Override
onScreenOnFromTouch()270     public void onScreenOnFromTouch() {
271         mInternalFalsingManager.onScreenOnFromTouch();
272     }
273 
274     @Override
isReportingEnabled()275     public boolean isReportingEnabled() {
276         return mInternalFalsingManager.isReportingEnabled();
277     }
278 
279     @Override
onUnlockHintStarted()280     public void onUnlockHintStarted() {
281         mInternalFalsingManager.onUnlockHintStarted();
282     }
283 
284     @Override
onCameraHintStarted()285     public void onCameraHintStarted() {
286         mInternalFalsingManager.onCameraHintStarted();
287     }
288 
289     @Override
onLeftAffordanceHintStarted()290     public void onLeftAffordanceHintStarted() {
291         mInternalFalsingManager.onLeftAffordanceHintStarted();
292     }
293 
294     @Override
onScreenTurningOn()295     public void onScreenTurningOn() {
296         mInternalFalsingManager.onScreenTurningOn();
297     }
298 
299     @Override
onScreenOff()300     public void onScreenOff() {
301         mInternalFalsingManager.onScreenOff();
302     }
303 
304     @Override
onNotificationStopDismissing()305     public void onNotificationStopDismissing() {
306         mInternalFalsingManager.onNotificationStopDismissing();
307     }
308 
309     @Override
onNotificationDismissed()310     public void onNotificationDismissed() {
311         mInternalFalsingManager.onNotificationDismissed();
312     }
313 
314     @Override
onNotificationStartDismissing()315     public void onNotificationStartDismissing() {
316         mInternalFalsingManager.onNotificationStartDismissing();
317     }
318 
319     @Override
onNotificationDoubleTap(boolean accepted, float dx, float dy)320     public void onNotificationDoubleTap(boolean accepted, float dx, float dy) {
321         mInternalFalsingManager.onNotificationDoubleTap(accepted, dx, dy);
322     }
323 
324     @Override
onBouncerShown()325     public void onBouncerShown() {
326         mInternalFalsingManager.onBouncerShown();
327     }
328 
329     @Override
onBouncerHidden()330     public void onBouncerHidden() {
331         mInternalFalsingManager.onBouncerHidden();
332     }
333 
334     @Override
onTouchEvent(MotionEvent ev, int width, int height)335     public void onTouchEvent(MotionEvent ev, int width, int height) {
336         mInternalFalsingManager.onTouchEvent(ev, width, height);
337     }
338 
339     @Override
dump(@onNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args)340     public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
341         mInternalFalsingManager.dump(pw);
342     }
343 
344     @Override
dump(PrintWriter pw)345     public void dump(PrintWriter pw) {
346         mInternalFalsingManager.dump(pw);
347     }
348 
349     @Override
cleanup()350     public void cleanup() {
351         mDeviceConfig.removeOnPropertiesChangedListener(mDeviceConfigListener);
352         mInternalFalsingManager.cleanup();
353     }
354 }
355