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