ClassifierData.java revision 9f01c5bfa5c1c63e350808c154adfc2953949b15
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.util.SparseArray;
200e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport android.view.MotionEvent;
210e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
229f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowskiimport java.util.ArrayList;
239f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
240e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski/**
250e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * Contains data which is used to classify interaction sequences on the lockscreen. It does, for
260e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski * example, provide information on the current touch state.
270e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski */
280e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskipublic class ClassifierData {
290e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    private SparseArray<Stroke> mCurrentStrokes = new SparseArray<>();
309f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    private ArrayList<Stroke> mEndingStrokes = new ArrayList<>();
310e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
320e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public ClassifierData() {
330e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
340e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
350e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public void update(MotionEvent event) {
369f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        mEndingStrokes.clear();
370e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        int action = event.getActionMasked();
380e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        if (action == MotionEvent.ACTION_DOWN) {
390e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            mCurrentStrokes.clear();
400e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        }
419f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
420e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        for (int i = 0; i < event.getPointerCount(); i++) {
430e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            int id = event.getPointerId(i);
440e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            if (mCurrentStrokes.get(id) == null) {
450e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                mCurrentStrokes.put(id, new Stroke(event.getEventTimeNano()));
460e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            }
470e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            mCurrentStrokes.get(id).addPoint(event.getX(i), event.getY(i),
480e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                    event.getEventTimeNano());
499f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
509f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski            if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL
519f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski                    || (action == MotionEvent.ACTION_POINTER_UP && i == event.getActionIndex())) {
529f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski                mEndingStrokes.add(getStroke(id));
539f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski            }
540e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        }
550e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
560e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
570e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public void cleanUp(MotionEvent event) {
589f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        mEndingStrokes.clear();
590e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        int action = event.getActionMasked();
600e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        for (int i = 0; i < event.getPointerCount(); i++) {
610e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            int id = event.getPointerId(i);
620e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL
630e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                    || (action == MotionEvent.ACTION_POINTER_UP && i == event.getActionIndex())) {
640e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                mCurrentStrokes.remove(id);
650e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            }
660e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        }
670e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
680e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
690e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    /**
709f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski     * @return the list of Strokes which are ending in the recently added MotionEvent
719f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski     */
729f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    public ArrayList<Stroke> getEndingStrokes() {
739f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        return mEndingStrokes;
749f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    }
759f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
769f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    /**
770e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski     * @param id the id from MotionEvent
780e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski     * @return the Stroke assigned to the id
790e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski     */
800e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public Stroke getStroke(int id) {
810e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        return mCurrentStrokes.get(id);
820e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
830e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski}
84