10e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski/* 20e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * Copyright (C) 2015 The Android Open Source Project 30e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * 40e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * Licensed under the Apache License, Version 2.0 (the "License"); 50e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * you may not use this file except in compliance with the License. 60e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * You may obtain a copy of the License at 70e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * 80e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * http://www.apache.org/licenses/LICENSE-2.0 90e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * 100e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * Unless required by applicable law or agreed to in writing, software 110e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * distributed under the License is distributed on an "AS IS" BASIS, 120e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * See the License for the specific language governing permissions and 140e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * limitations under the License 150e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski */ 160e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 170e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskipackage com.android.systemui.classifier; 180e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 190e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.content.Context; 200e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.database.ContentObserver; 210e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.hardware.Sensor; 220e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.hardware.SensorEvent; 230e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.hardware.SensorEventListener; 240e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.hardware.SensorManager; 257bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roosimport android.net.Uri; 260e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.os.Handler; 27f8c4add85188a90940d9d7045ab4c945375fcff2Selim Cinekimport android.os.Looper; 28c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roosimport android.os.PowerManager; 290e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.os.UserHandle; 300e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.provider.Settings; 310e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.view.MotionEvent; 32ca664b93b91ee4c29b22e914c01411c241f5068eAdrian Roosimport android.view.accessibility.AccessibilityManager; 330e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 34e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggiimport com.android.systemui.Dependency; 35e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggiimport com.android.systemui.UiOffloadThread; 360e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport com.android.systemui.analytics.DataCollector; 370e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport com.android.systemui.statusbar.StatusBarState; 387a8ae8a4b2fc0ab2a46a3aa81c28ff026a2a032bAdrian Roosimport com.android.systemui.util.AsyncSensorManager; 390e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 40401caaedd871894620accc1d14592c08095b5523Adrian Roosimport java.io.PrintWriter; 41401caaedd871894620accc1d14592c08095b5523Adrian Roos 420e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski/** 430e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * When the phone is locked, listens to touch, sensor and phone events and sends them to 440e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * DataCollector and HumanInteractionClassifier. 450e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * 460e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * It does not collect touch events when the bouncer shows up. 470e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski */ 480e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskipublic class FalsingManager implements SensorEventListener { 490e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private static final String ENFORCE_BOUNCER = "falsing_manager_enforce_bouncer"; 500e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 516dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski private static final int[] CLASSIFIER_SENSORS = new int[] { 526dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski Sensor.TYPE_PROXIMITY, 536dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski }; 546dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski 556dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski private static final int[] COLLECTOR_SENSORS = new int[] { 560e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski Sensor.TYPE_ACCELEROMETER, 570e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski Sensor.TYPE_GYROSCOPE, 580e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski Sensor.TYPE_PROXIMITY, 590e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski Sensor.TYPE_LIGHT, 600e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski Sensor.TYPE_ROTATION_VECTOR, 610e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski }; 620e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 63f8c4add85188a90940d9d7045ab4c945375fcff2Selim Cinek private final Handler mHandler = new Handler(Looper.getMainLooper()); 640e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private final Context mContext; 650e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 660e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private final SensorManager mSensorManager; 670e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private final DataCollector mDataCollector; 680e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private final HumanInteractionClassifier mHumanInteractionClassifier; 69ca664b93b91ee4c29b22e914c01411c241f5068eAdrian Roos private final AccessibilityManager mAccessibilityManager; 70e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi private final UiOffloadThread mUiOffloadThread; 710e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 720e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private static FalsingManager sInstance = null; 730e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 740e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private boolean mEnforceBouncer = false; 750e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private boolean mBouncerOn = false; 760e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private boolean mSessionActive = false; 770e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private int mState = StatusBarState.SHADE; 78c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos private boolean mScreenOn; 79e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos private boolean mShowingAod; 808e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos private Runnable mPendingWtf; 810e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 820e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski protected final ContentObserver mSettingsObserver = new ContentObserver(mHandler) { 830e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski @Override 840e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onChange(boolean selfChange) { 850e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski updateConfiguration(); 860e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 870e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski }; 880e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 890e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private FalsingManager(Context context) { 900e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mContext = context; 917a8ae8a4b2fc0ab2a46a3aa81c28ff026a2a032bAdrian Roos mSensorManager = Dependency.get(AsyncSensorManager.class); 92ca664b93b91ee4c29b22e914c01411c241f5068eAdrian Roos mAccessibilityManager = context.getSystemService(AccessibilityManager.class); 930e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector = DataCollector.getInstance(mContext); 940e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mHumanInteractionClassifier = HumanInteractionClassifier.getInstance(mContext); 95e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi mUiOffloadThread = Dependency.get(UiOffloadThread.class); 96c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos mScreenOn = context.getSystemService(PowerManager.class).isInteractive(); 970e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 980e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mContext.getContentResolver().registerContentObserver( 990e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski Settings.Secure.getUriFor(ENFORCE_BOUNCER), false, 1000e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mSettingsObserver, 1010e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski UserHandle.USER_ALL); 1020e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 1030e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski updateConfiguration(); 1040e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1050e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 1060e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public static FalsingManager getInstance(Context context) { 1070e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski if (sInstance == null) { 1080e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski sInstance = new FalsingManager(context); 1090e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1100e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski return sInstance; 1110e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1120e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 1130e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private void updateConfiguration() { 1140e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mEnforceBouncer = 0 != Settings.Secure.getInt(mContext.getContentResolver(), 1150e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski ENFORCE_BOUNCER, 0); 1160e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1170e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 118c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos private boolean shouldSessionBeActive() { 119401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED && FalsingLog.VERBOSE) 120401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.v("shouldBeActive", new StringBuilder() 121401caaedd871894620accc1d14592c08095b5523Adrian Roos .append("enabled=").append(isEnabled() ? 1 : 0) 122401caaedd871894620accc1d14592c08095b5523Adrian Roos .append(" mScreenOn=").append(mScreenOn ? 1 : 0) 123401caaedd871894620accc1d14592c08095b5523Adrian Roos .append(" mState=").append(StatusBarState.toShortString(mState)) 124401caaedd871894620accc1d14592c08095b5523Adrian Roos .toString() 125401caaedd871894620accc1d14592c08095b5523Adrian Roos ); 126e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos return isEnabled() && mScreenOn && (mState == StatusBarState.KEYGUARD) && !mShowingAod; 127c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos } 128c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos 1290e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private boolean sessionEntrypoint() { 130c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos if (!mSessionActive && shouldSessionBeActive()) { 1310e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski onSessionStart(); 1320e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski return true; 1330e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1340e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski return false; 1350e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1360e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 137c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos private void sessionExitpoint(boolean force) { 138c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos if (mSessionActive && (force || !shouldSessionBeActive())) { 1390e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mSessionActive = false; 140e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi 141e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi // This can be expensive, and doesn't need to happen on the main thread. 142e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi mUiOffloadThread.submit(() -> { 143e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi mSensorManager.unregisterListener(this); 144e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi }); 1450e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1460e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1470e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 148e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos public void updateSessionActive() { 149e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos if (shouldSessionBeActive()) { 150e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos sessionEntrypoint(); 151e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos } else { 152e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos sessionExitpoint(false /* force */); 153e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos } 154e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos } 155e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos 1560e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private void onSessionStart() { 157401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 158401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onSessionStart", "classifierEnabled=" + isClassiferEnabled()); 1598e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos clearPendingWtf(); 160401caaedd871894620accc1d14592c08095b5523Adrian Roos } 1610e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mBouncerOn = false; 1620e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mSessionActive = true; 1636dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski 1646dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski if (mHumanInteractionClassifier.isEnabled()) { 1656dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski registerSensors(CLASSIFIER_SENSORS); 1666dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski } 1677bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos if (mDataCollector.isEnabledFull()) { 1686dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski registerSensors(COLLECTOR_SENSORS); 1696dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski } 1706dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski } 1716dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski 1726dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski private void registerSensors(int [] sensors) { 1736dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski for (int sensorType : sensors) { 1740e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski Sensor s = mSensorManager.getDefaultSensor(sensorType); 1750e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski if (s != null) { 176e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi 177e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi // This can be expensive, and doesn't need to happen on the main thread. 178e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi mUiOffloadThread.submit(() -> { 179e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_GAME); 180e549a8d62108c7c7dabedbf4e77b9a653781723bJorim Jaggi }); 1810e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1820e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1830e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1840e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 1856dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski public boolean isClassiferEnabled() { 1866dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski return mHumanInteractionClassifier.isEnabled(); 1876dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski } 1886dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski 1890e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski private boolean isEnabled() { 1900e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski return mHumanInteractionClassifier.isEnabled() || mDataCollector.isEnabled(); 1910e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 1920e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 1930e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski /** 1940e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * @return true if the classifier determined that this is not a human interacting with the phone 1950e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski */ 1969f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski public boolean isFalseTouch() { 197401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 1986a04cb1efc4a6cfd6733d92c0c7efca5f9082e5dAdrian Roos // We're getting some false wtfs from touches that happen after the device went 1996a04cb1efc4a6cfd6733d92c0c7efca5f9082e5dAdrian Roos // to sleep. Only report missing sessions that happen when the device is interactive. 2008e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos if (!mSessionActive && mContext.getSystemService(PowerManager.class).isInteractive() 2018e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos && mPendingWtf == null) { 2028e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos int enabled = isEnabled() ? 1 : 0; 2038e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos int screenOn = mScreenOn ? 1 : 0; 2048e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos String state = StatusBarState.toShortString(mState); 2058e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos Throwable here = new Throwable("here"); 2068e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos FalsingLog.wLogcat("isFalseTouch", new StringBuilder() 207401caaedd871894620accc1d14592c08095b5523Adrian Roos .append("Session is not active, yet there's a query for a false touch.") 2088e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append(" enabled=").append(enabled) 2098e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append(" mScreenOn=").append(screenOn) 2108e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append(" mState=").append(state) 2118e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append(". Escalating to WTF if screen does not turn on soon.") 212401caaedd871894620accc1d14592c08095b5523Adrian Roos .toString()); 2138e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos 2148e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos // Unfortunately we're also getting false positives for touches that happen right 2158e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos // after the screen turns on, but before that notification has made it to us. 2168e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos // Unfortunately there's no good way to catch that, except to wait and see if we get 2178e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos // the screen on notification soon. 2188e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos mPendingWtf = () -> FalsingLog.wtf("isFalseTouch", new StringBuilder() 2198e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append("Session did not become active after query for a false touch.") 2208e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append(" enabled=").append(enabled) 2218e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append('/').append(isEnabled() ? 1 : 0) 2228e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append(" mScreenOn=").append(screenOn) 2238e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append('/').append(mScreenOn ? 1 : 0) 2248e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append(" mState=").append(state) 2258e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append('/').append(StatusBarState.toShortString(mState)) 2268e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .append(". Look for warnings ~1000ms earlier to see root cause.") 2278e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos .toString(), here); 2288e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos mHandler.postDelayed(mPendingWtf, 1000); 229401caaedd871894620accc1d14592c08095b5523Adrian Roos } 230401caaedd871894620accc1d14592c08095b5523Adrian Roos } 231ca664b93b91ee4c29b22e914c01411c241f5068eAdrian Roos if (mAccessibilityManager.isTouchExplorationEnabled()) { 232ca664b93b91ee4c29b22e914c01411c241f5068eAdrian Roos // Touch exploration triggers false positives in the classifier and 233ca664b93b91ee4c29b22e914c01411c241f5068eAdrian Roos // already sufficiently prevents false unlocks. 234ca664b93b91ee4c29b22e914c01411c241f5068eAdrian Roos return false; 235ca664b93b91ee4c29b22e914c01411c241f5068eAdrian Roos } 2369f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski return mHumanInteractionClassifier.isFalseTouch(); 2370e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 2380e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 2398e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos private void clearPendingWtf() { 2408e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos if (mPendingWtf != null) { 2418e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos mHandler.removeCallbacks(mPendingWtf); 2428e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos mPendingWtf = null; 2438e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos } 2448e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos } 2458e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos 2460e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski @Override 2470e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public synchronized void onSensorChanged(SensorEvent event) { 2480e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onSensorChanged(event); 2490e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mHumanInteractionClassifier.onSensorChanged(event); 2500e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 2510e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 2520e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski @Override 2530e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onAccuracyChanged(Sensor sensor, int accuracy) { 2540e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onAccuracyChanged(sensor, accuracy); 2550e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 2560e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 2570e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public boolean shouldEnforceBouncer() { 2580e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski return mEnforceBouncer; 2590e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 2600e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 261e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos public void setShowingAod(boolean showingAod) { 262e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos mShowingAod = showingAod; 263e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos updateSessionActive(); 264e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos } 265e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos 2660e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void setStatusBarState(int state) { 267401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 268401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("setStatusBarState", new StringBuilder() 269401caaedd871894620accc1d14592c08095b5523Adrian Roos .append("from=").append(StatusBarState.toShortString(mState)) 270401caaedd871894620accc1d14592c08095b5523Adrian Roos .append(" to=").append(StatusBarState.toShortString(state)) 271401caaedd871894620accc1d14592c08095b5523Adrian Roos .toString()); 272401caaedd871894620accc1d14592c08095b5523Adrian Roos } 2730e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mState = state; 274e395b5d5b0a158a1e0d972d72eb9ee5d7f2dc4f3Adrian Roos updateSessionActive(); 2750e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 2760e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 2770e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onScreenTurningOn() { 278401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 279401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onScreenTurningOn", new StringBuilder() 280401caaedd871894620accc1d14592c08095b5523Adrian Roos .append("from=").append(mScreenOn ? 1 : 0) 281401caaedd871894620accc1d14592c08095b5523Adrian Roos .toString()); 2828e291a5d3f6f90072ed91887359567d5640f6170Adrian Roos clearPendingWtf(); 283401caaedd871894620accc1d14592c08095b5523Adrian Roos } 284c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos mScreenOn = true; 2850e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski if (sessionEntrypoint()) { 2860e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onScreenTurningOn(); 2870e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 2880e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 2890e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 2900e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onScreenOnFromTouch() { 291401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 292401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onScreenOnFromTouch", new StringBuilder() 293401caaedd871894620accc1d14592c08095b5523Adrian Roos .append("from=").append(mScreenOn ? 1 : 0) 294401caaedd871894620accc1d14592c08095b5523Adrian Roos .toString()); 295401caaedd871894620accc1d14592c08095b5523Adrian Roos } 296c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos mScreenOn = true; 2970e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski if (sessionEntrypoint()) { 2980e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onScreenOnFromTouch(); 2990e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3000e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3010e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3020e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onScreenOff() { 303401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 304401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onScreenOff", new StringBuilder() 305401caaedd871894620accc1d14592c08095b5523Adrian Roos .append("from=").append(mScreenOn ? 1 : 0) 306401caaedd871894620accc1d14592c08095b5523Adrian Roos .toString()); 307401caaedd871894620accc1d14592c08095b5523Adrian Roos } 3080e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onScreenOff(); 309c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos mScreenOn = false; 310c5584ceaad422c96f978132aee4d21ee1f61fc7dAdrian Roos sessionExitpoint(false /* force */); 3110e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3120e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3130e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onSucccessfulUnlock() { 314401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 315401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onSucccessfulUnlock", ""); 316401caaedd871894620accc1d14592c08095b5523Adrian Roos } 3170e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onSucccessfulUnlock(); 3180e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3190e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3200e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onBouncerShown() { 321401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 322401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onBouncerShown", new StringBuilder() 323401caaedd871894620accc1d14592c08095b5523Adrian Roos .append("from=").append(mBouncerOn ? 1 : 0) 324401caaedd871894620accc1d14592c08095b5523Adrian Roos .toString()); 325401caaedd871894620accc1d14592c08095b5523Adrian Roos } 3260e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski if (!mBouncerOn) { 3270e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mBouncerOn = true; 3280e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onBouncerShown(); 3290e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3300e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3310e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3320e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onBouncerHidden() { 333401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 334401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onBouncerHidden", new StringBuilder() 335401caaedd871894620accc1d14592c08095b5523Adrian Roos .append("from=").append(mBouncerOn ? 1 : 0) 336401caaedd871894620accc1d14592c08095b5523Adrian Roos .toString()); 337401caaedd871894620accc1d14592c08095b5523Adrian Roos } 3380e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski if (mBouncerOn) { 3390e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mBouncerOn = false; 3400e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onBouncerHidden(); 3410e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3420e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3430e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3440e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onQsDown() { 345401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 346401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onQsDown", ""); 347401caaedd871894620accc1d14592c08095b5523Adrian Roos } 3489f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski mHumanInteractionClassifier.setType(Classifier.QUICK_SETTINGS); 3490e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onQsDown(); 3500e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3510e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3520e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void setQsExpanded(boolean expanded) { 3530e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.setQsExpanded(expanded); 3540e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3550e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3560e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onTrackingStarted() { 357401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 358401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onTrackingStarted", ""); 359401caaedd871894620accc1d14592c08095b5523Adrian Roos } 3609f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski mHumanInteractionClassifier.setType(Classifier.UNLOCK); 3610e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onTrackingStarted(); 3620e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3630e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3640e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onTrackingStopped() { 3650e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onTrackingStopped(); 3660e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3670e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3680e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onNotificationActive() { 3690e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onNotificationActive(); 3700e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3710e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3729f0b002ecfe68508354f9c023a09cf360666df9eAdrian Roos public void onNotificationDoubleTap(boolean accepted, float dx, float dy) { 3739f0b002ecfe68508354f9c023a09cf360666df9eAdrian Roos if (FalsingLog.ENABLED) { 3749f0b002ecfe68508354f9c023a09cf360666df9eAdrian Roos FalsingLog.i("onNotificationDoubleTap", "accepted=" + accepted 3759f0b002ecfe68508354f9c023a09cf360666df9eAdrian Roos + " dx=" + dx + " dy=" + dy + " (px)"); 3769f0b002ecfe68508354f9c023a09cf360666df9eAdrian Roos } 3770e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onNotificationDoubleTap(); 3780e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3790e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3800e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void setNotificationExpanded() { 3810e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.setNotificationExpanded(); 3820e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3830e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3840e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onNotificatonStartDraggingDown() { 385401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 386401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onNotificatonStartDraggingDown", ""); 387401caaedd871894620accc1d14592c08095b5523Adrian Roos } 3889f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski mHumanInteractionClassifier.setType(Classifier.NOTIFICATION_DRAG_DOWN); 3890e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onNotificatonStartDraggingDown(); 3900e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3910e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3920e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onNotificatonStopDraggingDown() { 3930e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onNotificatonStopDraggingDown(); 3940e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3950e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 3960e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onNotificationDismissed() { 3970e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onNotificationDismissed(); 3980e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 3990e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 4000e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onNotificatonStartDismissing() { 401401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 402401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onNotificatonStartDismissing", ""); 403401caaedd871894620accc1d14592c08095b5523Adrian Roos } 4049f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski mHumanInteractionClassifier.setType(Classifier.NOTIFICATION_DISMISS); 4050e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onNotificatonStartDismissing(); 4060e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 4070e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 4080e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onNotificatonStopDismissing() { 4090e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onNotificatonStopDismissing(); 4100e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 4110e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 4120e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onCameraOn() { 4130e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onCameraOn(); 4140e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 4150e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 4160e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onLeftAffordanceOn() { 4170e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onLeftAffordanceOn(); 4180e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 4190e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 4200e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onAffordanceSwipingStarted(boolean rightCorner) { 421401caaedd871894620accc1d14592c08095b5523Adrian Roos if (FalsingLog.ENABLED) { 422401caaedd871894620accc1d14592c08095b5523Adrian Roos FalsingLog.i("onAffordanceSwipingStarted", ""); 423401caaedd871894620accc1d14592c08095b5523Adrian Roos } 4249f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski if (rightCorner) { 4259f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski mHumanInteractionClassifier.setType(Classifier.RIGHT_AFFORDANCE); 4269f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski } else { 4279f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski mHumanInteractionClassifier.setType(Classifier.LEFT_AFFORDANCE); 4289f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski } 4290e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onAffordanceSwipingStarted(rightCorner); 4300e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 4310e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 4320e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onAffordanceSwipingAborted() { 4330e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onAffordanceSwipingAborted(); 4340e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 4350e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 4360e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onUnlockHintStarted() { 4370e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onUnlockHintStarted(); 4380e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 4390e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 4400e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onCameraHintStarted() { 4410e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onCameraHintStarted(); 4420e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 4430e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 4440e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onLeftAffordanceHintStarted() { 4450e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onLeftAffordanceHintStarted(); 4460e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 4470e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski 4480e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski public void onTouchEvent(MotionEvent event, int width, int height) { 4490e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski if (mSessionActive && !mBouncerOn) { 4500e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mDataCollector.onTouchEvent(event, width, height); 4510e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski mHumanInteractionClassifier.onTouchEvent(event); 4520e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 4530e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski } 454401caaedd871894620accc1d14592c08095b5523Adrian Roos 455401caaedd871894620accc1d14592c08095b5523Adrian Roos public void dump(PrintWriter pw) { 456401caaedd871894620accc1d14592c08095b5523Adrian Roos pw.println("FALSING MANAGER"); 457401caaedd871894620accc1d14592c08095b5523Adrian Roos pw.print("classifierEnabled="); pw.println(isClassiferEnabled() ? 1 : 0); 458401caaedd871894620accc1d14592c08095b5523Adrian Roos pw.print("mSessionActive="); pw.println(mSessionActive ? 1 : 0); 459401caaedd871894620accc1d14592c08095b5523Adrian Roos pw.print("mBouncerOn="); pw.println(mSessionActive ? 1 : 0); 460401caaedd871894620accc1d14592c08095b5523Adrian Roos pw.print("mState="); pw.println(StatusBarState.toShortString(mState)); 461401caaedd871894620accc1d14592c08095b5523Adrian Roos pw.print("mScreenOn="); pw.println(mScreenOn ? 1 : 0); 462401caaedd871894620accc1d14592c08095b5523Adrian Roos pw.println(); 463401caaedd871894620accc1d14592c08095b5523Adrian Roos } 4647bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos 4657bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos public Uri reportRejectedTouch() { 4667bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos if (mDataCollector.isEnabled()) { 4677bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos return mDataCollector.reportRejectedTouch(); 4687bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos } 4697bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos return null; 4707bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos } 4717bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos 4727bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos public boolean isReportingEnabled() { 4737bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos return mDataCollector.isReportingEnabled(); 4747bb38a941b056e8e7cb41151d927313ec6c138d5Adrian Roos } 4750e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski} 476