HumanInteractionClassifier.java revision 91be2f88a5434f73514f7ce58f35f47a6033265d
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.SensorEvent;
220e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.os.Build;
230e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.os.Handler;
240e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.os.UserHandle;
250e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.provider.Settings;
2691be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowskiimport android.util.DisplayMetrics;
270e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.view.MotionEvent;
280e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
2991be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowskiimport java.util.ArrayDeque;
309f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowskiimport java.util.ArrayList;
319f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
320e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski/**
330e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * An classifier trying to determine whether it is a human interacting with the phone or not.
340e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski */
350e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskipublic class HumanInteractionClassifier extends Classifier {
360e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    private static final String HIC_ENABLE = "HIC_enable";
3791be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski    private static final float FINGER_DISTANCE = 0.1f;
380e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    private static HumanInteractionClassifier sInstance = null;
390e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
400e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    private final Handler mHandler = new Handler();
410e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    private final Context mContext;
420e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
439f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    private ArrayList<StrokeClassifier> mStrokeClassifiers = new ArrayList<>();
449f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    private ArrayList<GestureClassifier> mGestureClassifiers = new ArrayList<>();
4591be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski    private ArrayDeque<MotionEvent> mBufferedEvents = new ArrayDeque<>();
469f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    private final int mStrokeClassifiersSize;
479f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    private final int mGestureClassifiersSize;
4891be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski    private final float mDpi;
499f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
509f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    private HistoryEvaluator mHistoryEvaluator;
5191be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski    private boolean mEnableClassifier = true;
529f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    private int mCurrentType = Classifier.GENERIC;
530e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
540e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    protected final ContentObserver mSettingsObserver = new ContentObserver(mHandler) {
550e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        @Override
560e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        public void onChange(boolean selfChange) {
570e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            updateConfiguration();
580e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        }
590e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    };
600e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
610e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    private HumanInteractionClassifier(Context context) {
620e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        mContext = context;
6391be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();
6491be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski
6591be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        // If the phone is rotated to landscape, the calculations would be wrong if xdpi and ydpi
6691be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        // were to be used separately. Due negligible differences in xdpi and ydpi we can just
6791be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        // take the average.
6891be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        mDpi = (displayMetrics.xdpi + displayMetrics.ydpi) / 2.0f;
6991be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        mClassifierData = new ClassifierData(mDpi);
709f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        mHistoryEvaluator = new HistoryEvaluator();
719f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
729f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        mStrokeClassifiers.add(new AnglesVarianceClassifier(mClassifierData));
7368d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        mStrokeClassifiers.add(new SpeedClassifier(mClassifierData));
7468d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        mStrokeClassifiers.add(new DurationCountClassifier(mClassifierData));
7568d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        mStrokeClassifiers.add(new EndPointRatioClassifier(mClassifierData));
7668d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        mStrokeClassifiers.add(new EndPointLengthClassifier(mClassifierData));
7768d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        mStrokeClassifiers.add(new AccelerationClassifier(mClassifierData));
7868d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        mStrokeClassifiers.add(new SpeedVarianceClassifier(mClassifierData));
7968d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        mStrokeClassifiers.add(new LengthCountClassifier(mClassifierData));
8068d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski
8168d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        mGestureClassifiers.add(new PointerCountClassifier(mClassifierData));
8268d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        mGestureClassifiers.add(new ProximityClassifier(mClassifierData));
839f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
849f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        mStrokeClassifiersSize = mStrokeClassifiers.size();
859f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        mGestureClassifiersSize = mGestureClassifiers.size();
860e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
870e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        mContext.getContentResolver().registerContentObserver(
880e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                Settings.Global.getUriFor(HIC_ENABLE), false,
890e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                mSettingsObserver,
900e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                UserHandle.USER_ALL);
910e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
920e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        updateConfiguration();
930e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
940e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
950e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public static HumanInteractionClassifier getInstance(Context context) {
960e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        if (sInstance == null) {
970e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            sInstance = new HumanInteractionClassifier(context);
980e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        }
990e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        return sInstance;
1000e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
1010e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
1020e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    private void updateConfiguration() {
1030e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        mEnableClassifier = Build.IS_DEBUGGABLE && 0 != Settings.Global.getInt(
1040e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                mContext.getContentResolver(),
1050e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                HIC_ENABLE, 0);
1060e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
1070e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
1089f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    public void setType(int type) {
1099f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        mCurrentType = type;
1109f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    }
1119f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
1120e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    @Override
1130e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public void onTouchEvent(MotionEvent event) {
11491be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        if (!mEnableClassifier) {
11591be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            return;
11691be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        }
1179f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
11891be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        // If the user is dragging down the notification, he might want to drag it down
11991be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        // enough to see the content, read it for a while and then lift the finger to open
12091be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        // the notification. This kind of motion scores very bad in the Classifier so the
12191be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        // MotionEvents which are close to the current position of the finger are not
12291be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        // sent to the classifiers until the finger moves far enough. When the finger if lifted
12391be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        // up, the last MotionEvent which was far enough from the finger is set as the final
12491be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        // MotionEvent and sent to the Classifiers.
12591be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        if (mCurrentType == Classifier.NOTIFICATION_DRAG_DOWN) {
12691be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            mBufferedEvents.add(MotionEvent.obtain(event));
12791be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            Point pointEnd = new Point(event.getX() / mDpi, event.getY() / mDpi);
12891be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski
12991be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            while (pointEnd.dist(new Point(mBufferedEvents.getFirst().getX() / mDpi,
13091be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski                    mBufferedEvents.getFirst().getY() / mDpi)) > FINGER_DISTANCE) {
13191be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski                addTouchEvent(mBufferedEvents.getFirst());
13291be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski                mBufferedEvents.remove();
1339f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski            }
1349f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
13591be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            int action = event.getActionMasked();
13691be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            if (action == MotionEvent.ACTION_UP) {
13791be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski                mBufferedEvents.getFirst().setAction(MotionEvent.ACTION_UP);
13891be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski                addTouchEvent(mBufferedEvents.getFirst());
13991be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski                mBufferedEvents.clear();
1409f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski            }
14191be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        } else {
14291be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            addTouchEvent(event);
14391be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        }
14491be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski    }
1459f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
14691be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski    private void addTouchEvent(MotionEvent event) {
14791be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        mClassifierData.update(event);
1489f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
14991be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        for (int i = 0; i < mStrokeClassifiersSize; i++) {
15091be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            mStrokeClassifiers.get(i).onTouchEvent(event);
15191be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        }
15291be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski
15391be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        for (int i = 0; i < mGestureClassifiersSize; i++) {
15491be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            mGestureClassifiers.get(i).onTouchEvent(event);
15591be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        }
15691be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski
15791be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        int size = mClassifierData.getEndingStrokes().size();
15891be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        for (int i = 0; i < size; i++) {
15991be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            Stroke stroke = mClassifierData.getEndingStrokes().get(i);
16091be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            float evaluation = 0.0f;
16191be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            for (int j = 0; j < mStrokeClassifiersSize; j++) {
16291be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski                evaluation += mStrokeClassifiers.get(j).getFalseTouchEvaluation(
16391be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski                        mCurrentType, stroke);
1649f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski            }
16591be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            mHistoryEvaluator.addStroke(evaluation);
16691be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        }
1679f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
16891be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        int action = event.getActionMasked();
16991be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
17091be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            float evaluation = 0.0f;
17191be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            for (int i = 0; i < mGestureClassifiersSize; i++) {
17291be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski                evaluation += mGestureClassifiers.get(i).getFalseTouchEvaluation(mCurrentType);
17391be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            }
17491be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            mHistoryEvaluator.addGesture(evaluation);
17591be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski            setType(Classifier.GENERIC);
1760e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        }
17791be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski
17891be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        mClassifierData.cleanUp(event);
1790e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
1800e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
1810e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    @Override
1820e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public void onSensorChanged(SensorEvent event) {
18368d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        for (int i = 0; i < mStrokeClassifiers.size(); i++) {
18468d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski            mStrokeClassifiers.get(i).onSensorChanged(event);
18568d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        }
18668d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski
18768d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        for (int i = 0; i < mGestureClassifiers.size(); i++) {
18868d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski            mGestureClassifiers.get(i).onSensorChanged(event);
18968d0c9b1e9f1df04b3a0e1ebb1e7ed4c18994cf3Blazej Magnowski        }
1900e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
1910e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
1929f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    public boolean isFalseTouch() {
1936dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski        if (mEnableClassifier) {
1946dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski            return mHistoryEvaluator.getEvaluation() >= 5.0f;
1956dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski        }
1966dc59b48c040cf6871d7ff6d8e5242b1a5ddd032Blazej Magnowski        return false;
1970e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
1980e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
1990e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public boolean isEnabled() {
2000e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        return mEnableClassifier;
2010e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
2020e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski}
203