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