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