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