1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.inputmethod.keyboard.internal;
18 
19 import android.content.res.TypedArray;
20 import android.graphics.Canvas;
21 import android.graphics.Paint;
22 import android.graphics.Path;
23 
24 import com.android.inputmethod.keyboard.PointerTracker;
25 import com.android.inputmethod.latin.R;
26 import com.android.inputmethod.latin.common.CoordinateUtils;
27 
28 /**
29  * Draw rubber band preview graphics during sliding key input.
30  *
31  * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewColor
32  * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewWidth
33  * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewBodyRatio
34  * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewShadowRatio
35  */
36 public final class SlidingKeyInputDrawingPreview extends AbstractDrawingPreview {
37     private final float mPreviewBodyRadius;
38 
39     private boolean mShowsSlidingKeyInputPreview;
40     private final int[] mPreviewFrom = CoordinateUtils.newInstance();
41     private final int[] mPreviewTo = CoordinateUtils.newInstance();
42 
43     // TODO: Finalize the rubber band preview implementation.
44     private final RoundedLine mRoundedLine = new RoundedLine();
45     private final Paint mPaint = new Paint();
46 
SlidingKeyInputDrawingPreview(final TypedArray mainKeyboardViewAttr)47     public SlidingKeyInputDrawingPreview(final TypedArray mainKeyboardViewAttr) {
48         final int previewColor = mainKeyboardViewAttr.getColor(
49                 R.styleable.MainKeyboardView_slidingKeyInputPreviewColor, 0);
50         final float previewRadius = mainKeyboardViewAttr.getDimension(
51                 R.styleable.MainKeyboardView_slidingKeyInputPreviewWidth, 0) / 2.0f;
52         final int PERCENTAGE_INT = 100;
53         final float previewBodyRatio = (float)mainKeyboardViewAttr.getInt(
54                 R.styleable.MainKeyboardView_slidingKeyInputPreviewBodyRatio, PERCENTAGE_INT)
55                 / (float)PERCENTAGE_INT;
56         mPreviewBodyRadius = previewRadius * previewBodyRatio;
57         final int previewShadowRatioInt = mainKeyboardViewAttr.getInt(
58                 R.styleable.MainKeyboardView_slidingKeyInputPreviewShadowRatio, 0);
59         if (previewShadowRatioInt > 0) {
60             final float previewShadowRatio = (float)previewShadowRatioInt / (float)PERCENTAGE_INT;
61             final float shadowRadius = previewRadius * previewShadowRatio;
62             mPaint.setShadowLayer(shadowRadius, 0.0f, 0.0f, previewColor);
63         }
64         mPaint.setColor(previewColor);
65     }
66 
67     @Override
onDeallocateMemory()68     public void onDeallocateMemory() {
69         // Nothing to do here.
70     }
71 
dismissSlidingKeyInputPreview()72     public void dismissSlidingKeyInputPreview() {
73         mShowsSlidingKeyInputPreview = false;
74         invalidateDrawingView();
75     }
76 
77     /**
78      * Draws the preview
79      * @param canvas The canvas where the preview is drawn.
80      */
81     @Override
drawPreview(final Canvas canvas)82     public void drawPreview(final Canvas canvas) {
83         if (!isPreviewEnabled() || !mShowsSlidingKeyInputPreview) {
84             return;
85         }
86 
87         // TODO: Finalize the rubber band preview implementation.
88         final float radius = mPreviewBodyRadius;
89         final Path path = mRoundedLine.makePath(
90                 CoordinateUtils.x(mPreviewFrom), CoordinateUtils.y(mPreviewFrom), radius,
91                 CoordinateUtils.x(mPreviewTo), CoordinateUtils.y(mPreviewTo), radius);
92         canvas.drawPath(path, mPaint);
93     }
94 
95     /**
96      * Set the position of the preview.
97      * @param tracker The new location of the preview is based on the points in PointerTracker.
98      */
99     @Override
setPreviewPosition(final PointerTracker tracker)100     public void setPreviewPosition(final PointerTracker tracker) {
101         tracker.getDownCoordinates(mPreviewFrom);
102         tracker.getLastCoordinates(mPreviewTo);
103         mShowsSlidingKeyInputPreview = true;
104         invalidateDrawingView();
105     }
106 }
107