168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka/* 268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * Copyright (C) 2013 The Android Open Source Project 368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * 468e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); 568e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * you may not use this file except in compliance with the License. 668e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * You may obtain a copy of the License at 768e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * 868e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 968e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * 1068e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 1168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, 1268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * See the License for the specific language governing permissions and 1468e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka * limitations under the License. 1568e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka */ 1668e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 1768e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokapackage com.android.inputmethod.latin.setup; 1868e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 1968e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport android.content.Context; 2068e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport android.content.res.ColorStateList; 2168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport android.graphics.Canvas; 2268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport android.graphics.Paint; 2368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport android.graphics.Path; 24630a24141eeb80063648bc1bc4678439117321d2Tadashi G. Takaokaimport android.support.v4.view.ViewCompat; 2568e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport android.util.AttributeSet; 2668e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport android.view.LayoutInflater; 2768e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport android.view.View; 2868e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport android.widget.LinearLayout; 2968e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport android.widget.TextView; 3068e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 3168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokaimport com.android.inputmethod.latin.R; 3268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 3368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaokapublic final class SetupStartIndicatorView extends LinearLayout { 3468e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka public SetupStartIndicatorView(final Context context, final AttributeSet attrs) { 3568e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka super(context, attrs); 3668e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka setOrientation(HORIZONTAL); 3768e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka LayoutInflater.from(context).inflate(R.layout.setup_start_indicator_label, this); 3868e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 3968e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka final LabelView labelView = (LabelView)findViewById(R.id.setup_start_label); 4068e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka labelView.setIndicatorView(findViewById(R.id.setup_start_indicator)); 4168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } 4268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 4368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka public static final class LabelView extends TextView { 4468e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka private View mIndicatorView; 4568e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 4668e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka public LabelView(final Context context, final AttributeSet attrs) { 4768e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka super(context, attrs); 4868e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } 4968e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 5068e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka public void setIndicatorView(final View indicatorView) { 5168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka mIndicatorView = indicatorView; 5268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } 5368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 5447a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka // TODO: Once we stop supporting ICS, uncomment {@link #setPressed(boolean)} method and 5547a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka // remove this method. 5668e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka @Override 5747a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka protected void drawableStateChanged() { 5847a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka super.drawableStateChanged(); 5947a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka for (final int state : getDrawableState()) { 6047a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka if (state == android.R.attr.state_pressed) { 6147a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka updateIndicatorView(true /* pressed */); 6247a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka return; 6347a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka } 6447a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka } 6547a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka updateIndicatorView(false /* pressed */); 6647a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka } 6747a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka 6847a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka // TODO: Once we stop supporting ICS, uncomment this method and remove 6947a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka // {@link #drawableStateChanged()} method. 7047a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka// @Override 7147a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka// public void setPressed(final boolean pressed) { 7247a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka// super.setPressed(pressed); 7347a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka// updateIndicatorView(pressed); 7447a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka// } 7547a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka 7647a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka private void updateIndicatorView(final boolean pressed) { 7768e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka if (mIndicatorView != null) { 7868e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka mIndicatorView.setPressed(pressed); 7947a66b12ec49179a09642bf48a0d2bd49d9f3458Tadashi G. Takaoka mIndicatorView.invalidate(); 8068e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } 8168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } 8268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } 8368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 8468e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka public static final class IndicatorView extends View { 8568e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka private final Path mIndicatorPath = new Path(); 8668e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka private final Paint mIndicatorPaint = new Paint(); 8768e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka private final ColorStateList mIndicatorColor; 8868e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 8968e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka public IndicatorView(final Context context, final AttributeSet attrs) { 9068e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka super(context, attrs); 9168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka mIndicatorColor = getResources().getColorStateList( 9268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka R.color.setup_step_action_background); 9368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka mIndicatorPaint.setStyle(Paint.Style.FILL); 9468e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } 9568e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka 9668e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka @Override 9768e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka protected void onDraw(final Canvas canvas) { 9868e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka super.onDraw(canvas); 99630a24141eeb80063648bc1bc4678439117321d2Tadashi G. Takaoka final int layoutDirection = ViewCompat.getLayoutDirection(this); 10068e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka final int width = getWidth(); 10168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka final int height = getHeight(); 10268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka final float halfHeight = height / 2.0f; 10368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka final Path path = mIndicatorPath; 10468e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka path.rewind(); 105630a24141eeb80063648bc1bc4678439117321d2Tadashi G. Takaoka if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL) { 10668e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka // Left arrow 10768e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka path.moveTo(width, 0.0f); 10868e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka path.lineTo(0.0f, halfHeight); 10968e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka path.lineTo(width, height); 11068e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } else { // LAYOUT_DIRECTION_LTR 11168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka // Right arrow 11268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka path.moveTo(0.0f, 0.0f); 11368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka path.lineTo(width, halfHeight); 11468e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka path.lineTo(0.0f, height); 11568e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } 11668e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka path.close(); 11768e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka final int[] stateSet = getDrawableState(); 11868e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka final int color = mIndicatorColor.getColorForState(stateSet, 0); 11968e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka mIndicatorPaint.setColor(color); 12068e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka canvas.drawPath(path, mIndicatorPaint); 12168e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } 12268e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka } 12368e4de1e78c62802fb18be120d58646ca35fe320Tadashi G. Takaoka} 124