Home | History | Annotate | Download | only in internal
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
      5  * in compliance with the License. You may obtain a copy of the License at
      6  *
      7  * http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software distributed under the License
     10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
     11  * or implied. See the License for the specific language governing permissions and limitations under
     12  * the License.
     13  */
     14 
     15 package com.android.inputmethod.keyboard.internal;
     16 
     17 import com.android.inputmethod.latin.ResizableIntArray;
     18 
     19 public final class GestureStrokeWithPreviewPoints extends GestureStroke {
     20     public static final int PREVIEW_CAPACITY = 256;
     21 
     22     private final ResizableIntArray mPreviewEventTimes = new ResizableIntArray(PREVIEW_CAPACITY);
     23     private final ResizableIntArray mPreviewXCoordinates = new ResizableIntArray(PREVIEW_CAPACITY);
     24     private final ResizableIntArray mPreviewYCoordinates = new ResizableIntArray(PREVIEW_CAPACITY);
     25 
     26     private int mStrokeId;
     27     private int mLastPreviewSize;
     28 
     29     private int mMinPreviewSampleLengthSquare;
     30     private int mLastX;
     31     private int mLastY;
     32 
     33     // TODO: Move this to resource.
     34     private static final float MIN_PREVIEW_SAMPLE_LENGTH_RATIO_TO_KEY_WIDTH = 0.1f;
     35 
     36     public GestureStrokeWithPreviewPoints(final int pointerId, final GestureStrokeParams params) {
     37         super(pointerId, params);
     38     }
     39 
     40     @Override
     41     protected void reset() {
     42         super.reset();
     43         mStrokeId++;
     44         mLastPreviewSize = 0;
     45         mPreviewEventTimes.setLength(0);
     46         mPreviewXCoordinates.setLength(0);
     47         mPreviewYCoordinates.setLength(0);
     48     }
     49 
     50     public int getGestureStrokeId() {
     51         return mStrokeId;
     52     }
     53 
     54     public int getGestureStrokePreviewSize() {
     55         return mPreviewEventTimes.getLength();
     56     }
     57 
     58     @Override
     59     public void setKeyboardGeometry(final int keyWidth) {
     60         super.setKeyboardGeometry(keyWidth);
     61         final float sampleLength = keyWidth * MIN_PREVIEW_SAMPLE_LENGTH_RATIO_TO_KEY_WIDTH;
     62         mMinPreviewSampleLengthSquare = (int)(sampleLength * sampleLength);
     63     }
     64 
     65     private boolean needsSampling(final int x, final int y) {
     66         final int dx = x - mLastX;
     67         final int dy = y - mLastY;
     68         return dx * dx + dy * dy >= mMinPreviewSampleLengthSquare;
     69     }
     70 
     71     @Override
     72     public void addPoint(final int x, final int y, final int time, final boolean isMajorEvent) {
     73         super.addPoint(x, y, time, isMajorEvent);
     74         if (isMajorEvent || needsSampling(x, y)) {
     75             mPreviewEventTimes.add(time);
     76             mPreviewXCoordinates.add(x);
     77             mPreviewYCoordinates.add(y);
     78             mLastX = x;
     79             mLastY = y;
     80         }
     81     }
     82 
     83     public void appendPreviewStroke(final ResizableIntArray eventTimes,
     84             final ResizableIntArray xCoords, final ResizableIntArray yCoords) {
     85         final int length = mPreviewEventTimes.getLength() - mLastPreviewSize;
     86         if (length <= 0) {
     87             return;
     88         }
     89         eventTimes.append(mPreviewEventTimes, mLastPreviewSize, length);
     90         xCoords.append(mPreviewXCoordinates, mLastPreviewSize, length);
     91         yCoords.append(mPreviewYCoordinates, mLastPreviewSize, length);
     92         mLastPreviewSize = mPreviewEventTimes.getLength();
     93     }
     94 }
     95