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