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