Add support for FalsingPlugin to supply a replacement FalsingManager.

Bug: 130256776
Test: Manual
Change-Id: Icdf150e6e23d216f04a9243fe57919aa622706d5
This commit is contained in:
Dave Mankoff
2019-05-08 14:56:29 -04:00
parent 41b8270f6f
commit 468d4f6f79
22 changed files with 393 additions and 96 deletions

View File

@@ -0,0 +1,106 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.plugins;
import android.net.Uri;
import android.view.MotionEvent;
import com.android.systemui.plugins.annotations.ProvidesInterface;
import java.io.PrintWriter;
/**
* Interface that decides whether a touch on the phone was accidental. i.e. Pocket Dialing.
*
* {@see com.android.systemui.classifier.FalsingManagerImpl}
*/
@ProvidesInterface(version = FalsingManager.VERSION)
public interface FalsingManager {
int VERSION = 1;
void onSucccessfulUnlock();
void onNotificationActive();
void setShowingAod(boolean showingAod);
void onNotificatonStartDraggingDown();
boolean isUnlockingDisabled();
boolean isFalseTouch();
void onNotificatonStopDraggingDown();
void setNotificationExpanded();
boolean isClassiferEnabled();
void onQsDown();
void setQsExpanded(boolean expanded);
boolean shouldEnforceBouncer();
void onTrackingStarted(boolean secure);
void onTrackingStopped();
void onLeftAffordanceOn();
void onCameraOn();
void onAffordanceSwipingStarted(boolean rightCorner);
void onAffordanceSwipingAborted();
void onStartExpandingFromPulse();
void onExpansionFromPulseStopped();
Uri reportRejectedTouch();
void onScreenOnFromTouch();
boolean isReportingEnabled();
void onUnlockHintStarted();
void onCameraHintStarted();
void onLeftAffordanceHintStarted();
void onScreenTurningOn();
void onScreenOff();
void onNotificatonStopDismissing();
void onNotificationDismissed();
void onNotificatonStartDismissing();
void onNotificationDoubleTap(boolean accepted, float dx, float dy);
void onBouncerShown();
void onBouncerHidden();
void onTouchEvent(MotionEvent ev, int width, int height);
void dump(PrintWriter pw);
}

View File

@@ -16,18 +16,22 @@
package com.android.systemui.plugins;
import android.content.Context;
import com.android.systemui.plugins.annotations.DependsOn;
import com.android.systemui.plugins.annotations.ProvidesInterface;
/**
* Used to capture Falsing data (related to unlocking the screen).
*
* The intent is that the data can later be analyzed to validate the quality of the
* {@link com.android.systemui.classifier.FalsingManagerFactory.FalsingManager}.
* {@link FalsingManager}.
*/
@ProvidesInterface(action = FalsingPlugin.ACTION, version = FalsingPlugin.VERSION)
@DependsOn(target = FalsingManager.class)
public interface FalsingPlugin extends Plugin {
String ACTION = "com.android.systemui.action.FALSING_PLUGIN";
int VERSION = 1;
int VERSION = 2;
/**
* Called when there is data to be recorded.
@@ -35,5 +39,14 @@ public interface FalsingPlugin extends Plugin {
* @param success Indicates whether the action is considered a success.
* @param data The raw data to be recorded for analysis.
*/
void dataCollected(boolean success, byte[] data);
default void dataCollected(boolean success, byte[] data) { }
/**
* Return a {@link FalsingManager} to be used in place of the system's default.
*
* @param context
*/
default FalsingManager getFalsingManager(Context context) {
return null;
}
}

View File

@@ -42,6 +42,7 @@ import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.PluginDependencyProvider;
import com.android.systemui.plugins.VolumeDialogController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -302,6 +303,7 @@ public class Dependency extends SystemUI {
@Inject Lazy<DockManager> mDockManager;
@Inject Lazy<ChannelEditorDialogController> mChannelEditorDialogController;
@Inject Lazy<INotificationManager> mINotificationManager;
@Inject Lazy<FalsingManager> mFalsingManager;
@Inject
public Dependency() {
@@ -479,6 +481,7 @@ public class Dependency extends SystemUI {
mProviders.put(DockManager.class, mDockManager::get);
mProviders.put(ChannelEditorDialogController.class, mChannelEditorDialogController::get);
mProviders.put(INotificationManager.class, mINotificationManager::get);
mProviders.put(FalsingManager.class, mFalsingManager::get);
// TODO(b/118592525): to support multi-display , we start to add something which is
// per-display, while others may be global. I think it's time to add

View File

@@ -18,8 +18,10 @@ package com.android.systemui;
import com.android.systemui.appops.AppOpsController;
import com.android.systemui.appops.AppOpsControllerImpl;
import com.android.systemui.classifier.FalsingManagerProxy;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.VolumeDialogController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.power.PowerNotificationWarnings;
@@ -234,4 +236,9 @@ public abstract class DependencyBinder {
*/
@Binds
public abstract QSHost provideQsHost(QSTileHost controllerImpl);
/**
*/
@Binds
public abstract FalsingManager provideFalsingmanager(FalsingManagerProxy falsingManagerImpl);
}

View File

@@ -35,7 +35,7 @@ import android.view.ViewConfiguration;
import android.view.accessibility.AccessibilityEvent;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.FlingAnimationUtils;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;

View File

@@ -17,16 +17,17 @@
package com.android.systemui.classifier;
import android.content.Context;
import android.net.Uri;
import android.view.MotionEvent;
import java.io.PrintWriter;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.FalsingManager;
/**
* When the phone is locked, listens to touch, sensor and phone events and sends them to
* DataCollector and HumanInteractionClassifier.
*
* It does not collect touch events when the bouncer shows up.
*
* TODO: FalsingManager supports dependency injection. Use it.
*/
public class FalsingManagerFactory {
private static FalsingManager sInstance = null;
@@ -35,82 +36,9 @@ public class FalsingManagerFactory {
public static FalsingManager getInstance(Context context) {
if (sInstance == null) {
sInstance = new FalsingManagerImpl(context);
sInstance = Dependency.get(FalsingManager.class);
}
return sInstance;
}
public interface FalsingManager {
void onSucccessfulUnlock();
void onNotificationActive();
void setShowingAod(boolean showingAod);
void onNotificatonStartDraggingDown();
boolean isUnlockingDisabled();
boolean isFalseTouch();
void onNotificatonStopDraggingDown();
void setNotificationExpanded();
boolean isClassiferEnabled();
void onQsDown();
void setQsExpanded(boolean expanded);
boolean shouldEnforceBouncer();
void onTrackingStarted(boolean secure);
void onTrackingStopped();
void onLeftAffordanceOn();
void onCameraOn();
void onAffordanceSwipingStarted(boolean rightCorner);
void onAffordanceSwipingAborted();
void onStartExpandingFromPulse();
void onExpansionFromPulseStopped();
Uri reportRejectedTouch();
void onScreenOnFromTouch();
boolean isReportingEnabled();
void onUnlockHintStarted();
void onCameraHintStarted();
void onLeftAffordanceHintStarted();
void onScreenTurningOn();
void onScreenOff();
void onNotificatonStopDismissing();
void onNotificationDismissed();
void onNotificatonStartDismissing();
void onNotificationDoubleTap(boolean accepted, float dx, float dy);
void onBouncerShown();
void onBouncerHidden();
void onTouchEvent(MotionEvent ev, int width, int height);
void dump(PrintWriter pw);
}
}

View File

@@ -39,6 +39,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.Dependency;
import com.android.systemui.UiOffloadThread;
import com.android.systemui.analytics.DataCollector;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.statusbar.StatusBarState;
@@ -52,7 +53,7 @@ import java.io.PrintWriter;
*
* It does not collect touch events when the bouncer shows up.
*/
public class FalsingManagerImpl implements FalsingManagerFactory.FalsingManager {
public class FalsingManagerImpl implements FalsingManager {
private static final String ENFORCE_BOUNCER = "falsing_manager_enforce_bouncer";
private static final int[] CLASSIFIER_SENSORS = new int[] {

View File

@@ -0,0 +1,239 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.classifier;
import android.content.Context;
import android.net.Uri;
import android.view.MotionEvent;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.FalsingPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.shared.plugins.PluginManager;
import java.io.PrintWriter;
import javax.inject.Inject;
/**
* Simple passthrough implementation of {@link FalsingManager} allowing plugins to swap in.
*
* {@link FalsingManagerImpl} is used when a Plugin is not loaded.
*/
public class FalsingManagerProxy implements FalsingManager {
private FalsingManager mInternalFalsingManager;
@Inject
FalsingManagerProxy(Context context, PluginManager pluginManager) {
mInternalFalsingManager = new FalsingManagerImpl(context);
final PluginListener<FalsingPlugin> mPluginListener = new PluginListener<FalsingPlugin>() {
public void onPluginConnected(FalsingPlugin plugin, Context context) {
FalsingManager pluginFalsingManager = plugin.getFalsingManager(context);
if (pluginFalsingManager != null) {
mInternalFalsingManager = pluginFalsingManager;
}
}
public void onPluginDisconnected(FalsingPlugin plugin) {
mInternalFalsingManager = new FalsingManagerImpl(context);
}
};
pluginManager.addPluginListener(mPluginListener, FalsingPlugin.class);
}
@Override
public void onSucccessfulUnlock() {
mInternalFalsingManager.onSucccessfulUnlock();
}
@Override
public void onNotificationActive() {
mInternalFalsingManager.onNotificationActive();
}
@Override
public void setShowingAod(boolean showingAod) {
mInternalFalsingManager.setShowingAod(showingAod);
}
@Override
public void onNotificatonStartDraggingDown() {
mInternalFalsingManager.onNotificatonStartDraggingDown();
}
@Override
public boolean isUnlockingDisabled() {
return mInternalFalsingManager.isUnlockingDisabled();
}
@Override
public boolean isFalseTouch() {
return mInternalFalsingManager.isFalseTouch();
}
@Override
public void onNotificatonStopDraggingDown() {
mInternalFalsingManager.onNotificatonStartDraggingDown();
}
@Override
public void setNotificationExpanded() {
mInternalFalsingManager.setNotificationExpanded();
}
@Override
public boolean isClassiferEnabled() {
return mInternalFalsingManager.isClassiferEnabled();
}
@Override
public void onQsDown() {
mInternalFalsingManager.onQsDown();
}
@Override
public void setQsExpanded(boolean expanded) {
mInternalFalsingManager.setQsExpanded(expanded);
}
@Override
public boolean shouldEnforceBouncer() {
return mInternalFalsingManager.shouldEnforceBouncer();
}
@Override
public void onTrackingStarted(boolean secure) {
mInternalFalsingManager.onTrackingStarted(secure);
}
@Override
public void onTrackingStopped() {
mInternalFalsingManager.onTrackingStopped();
}
@Override
public void onLeftAffordanceOn() {
mInternalFalsingManager.onLeftAffordanceOn();
}
@Override
public void onCameraOn() {
mInternalFalsingManager.onCameraOn();
}
@Override
public void onAffordanceSwipingStarted(boolean rightCorner) {
mInternalFalsingManager.onAffordanceSwipingStarted(rightCorner);
}
@Override
public void onAffordanceSwipingAborted() {
mInternalFalsingManager.onAffordanceSwipingAborted();
}
@Override
public void onStartExpandingFromPulse() {
mInternalFalsingManager.onStartExpandingFromPulse();
}
@Override
public void onExpansionFromPulseStopped() {
mInternalFalsingManager.onExpansionFromPulseStopped();
}
@Override
public Uri reportRejectedTouch() {
return mInternalFalsingManager.reportRejectedTouch();
}
@Override
public void onScreenOnFromTouch() {
mInternalFalsingManager.onScreenOnFromTouch();
}
@Override
public boolean isReportingEnabled() {
return mInternalFalsingManager.isReportingEnabled();
}
@Override
public void onUnlockHintStarted() {
mInternalFalsingManager.onUnlockHintStarted();
}
@Override
public void onCameraHintStarted() {
mInternalFalsingManager.onCameraHintStarted();
}
@Override
public void onLeftAffordanceHintStarted() {
mInternalFalsingManager.onLeftAffordanceHintStarted();
}
@Override
public void onScreenTurningOn() {
mInternalFalsingManager.onScreenTurningOn();
}
@Override
public void onScreenOff() {
mInternalFalsingManager.onScreenOff();
}
@Override
public void onNotificatonStopDismissing() {
mInternalFalsingManager.onNotificatonStopDismissing();
}
@Override
public void onNotificationDismissed() {
mInternalFalsingManager.onNotificationDismissed();
}
@Override
public void onNotificatonStartDismissing() {
mInternalFalsingManager.onNotificatonStartDismissing();
}
@Override
public void onNotificationDoubleTap(boolean accepted, float dx, float dy) {
mInternalFalsingManager.onNotificationDoubleTap(accepted, dx, dy);
}
@Override
public void onBouncerShown() {
mInternalFalsingManager.onBouncerShown();
}
@Override
public void onBouncerHidden() {
mInternalFalsingManager.onBouncerHidden();
}
@Override
public void onTouchEvent(MotionEvent ev, int width, int height) {
mInternalFalsingManager.onTouchEvent(ev, width, height);
}
@Override
public void dump(PrintWriter pw) {
mInternalFalsingManager.dump(pw);
}
}

View File

@@ -16,7 +16,7 @@
package com.android.systemui.doze;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.plugins.FalsingManager;
/**
* Notifies FalsingManager of whether or not AOD is showing.

View File

@@ -30,7 +30,7 @@ import com.android.systemui.Gefingerpoken;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.notification.row.ExpandableView;
/**

View File

@@ -31,7 +31,7 @@ import com.android.systemui.Gefingerpoken
import com.android.systemui.Interpolators
import com.android.systemui.R
import com.android.systemui.classifier.FalsingManagerFactory
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.row.ExpandableView

View File

@@ -36,7 +36,7 @@ import android.view.animation.PathInterpolator;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.notification.FakeShadowView;
import com.android.systemui.statusbar.notification.NotificationUtils;

View File

@@ -77,7 +77,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;

View File

@@ -88,9 +88,9 @@ import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.SwipeHelper;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener;

View File

@@ -28,7 +28,7 @@ import android.view.ViewConfiguration;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.FlingAnimationUtils;
import com.android.systemui.statusbar.KeyguardAffordanceView;

View File

@@ -43,8 +43,8 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.R;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.DejankUtils;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.plugins.FalsingManager;
import java.io.PrintWriter;

View File

@@ -61,9 +61,9 @@ import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;

View File

@@ -43,8 +43,8 @@ import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.doze.DozeLog;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.FlingAnimationUtils;
import com.android.systemui.statusbar.StatusBarState;

View File

@@ -149,7 +149,6 @@ import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.charging.WirelessChargingAnimation;
import com.android.systemui.classifier.FalsingLog;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.doze.DozeHost;
import com.android.systemui.doze.DozeLog;
@@ -162,6 +161,7 @@ import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.PluginDependencyProvider;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption;

View File

@@ -63,7 +63,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.ExpandHelper;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingManagerFactory;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.DragDownHelper;
import com.android.systemui.statusbar.StatusBarState;

View File

@@ -48,9 +48,9 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.DejankUtils;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import com.android.systemui.plugins.FalsingManager;
import org.junit.Assert;
import org.junit.Before;

View File

@@ -78,12 +78,12 @@ import com.android.systemui.UiOffloadThread;
import com.android.systemui.appops.AppOpsController;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.classifier.FalsingManagerFactory.FalsingManager;
import com.android.systemui.doze.DozeHost;
import com.android.systemui.doze.DozeLog;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.KeyguardIndicationController;