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<>();
3191be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski    private final float mDpi;
320e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
3391be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski    public ClassifierData(float dpi) {
3491be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski        mDpi = dpi;
350e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
360e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
370e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public void update(MotionEvent event) {
389f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        mEndingStrokes.clear();
390e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        int action = event.getActionMasked();
400e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        if (action == MotionEvent.ACTION_DOWN) {
410e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            mCurrentStrokes.clear();
420e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        }
439f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
440e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        for (int i = 0; i < event.getPointerCount(); i++) {
450e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            int id = event.getPointerId(i);
460e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            if (mCurrentStrokes.get(id) == null) {
4791be2f88a5434f73514f7ce58f35f47a6033265dBlazej Magnowski                mCurrentStrokes.put(id, new Stroke(event.getEventTimeNano(), mDpi));
480e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            }
490e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            mCurrentStrokes.get(id).addPoint(event.getX(i), event.getY(i),
500e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                    event.getEventTimeNano());
519f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
529f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski            if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL
539f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski                    || (action == MotionEvent.ACTION_POINTER_UP && i == event.getActionIndex())) {
549f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski                mEndingStrokes.add(getStroke(id));
559f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski            }
560e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        }
570e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
580e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
590e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public void cleanUp(MotionEvent event) {
609f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        mEndingStrokes.clear();
610e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        int action = event.getActionMasked();
620e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        for (int i = 0; i < event.getPointerCount(); i++) {
630e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            int id = event.getPointerId(i);
640e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL
650e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                    || (action == MotionEvent.ACTION_POINTER_UP && i == event.getActionIndex())) {
660e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski                mCurrentStrokes.remove(id);
670e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski            }
680e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        }
690e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
700e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski
710e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    /**
729f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski     * @return the list of Strokes which are ending in the recently added MotionEvent
739f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski     */
749f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    public ArrayList<Stroke> getEndingStrokes() {
759f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski        return mEndingStrokes;
769f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    }
779f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski
789f01c5bfa5c1c63e350808c154adfc2953949b15Blazej Magnowski    /**
790e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski     * @param id the id from MotionEvent
800e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski     * @return the Stroke assigned to the id
810e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski     */
820e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    public Stroke getStroke(int id) {
830e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        return mCurrentStrokes.get(id);
840e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    }
850e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski}
86