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