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