CompatTextView.java revision 89208232f3b5d1451408d787872504a190bc7ee0
189208232f3b5d1451408d787872504a190bc7ee0Chris Banes/*
289208232f3b5d1451408d787872504a190bc7ee0Chris Banes * Copyright (C) 2013 The Android Open Source Project
389208232f3b5d1451408d787872504a190bc7ee0Chris Banes *
489208232f3b5d1451408d787872504a190bc7ee0Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
589208232f3b5d1451408d787872504a190bc7ee0Chris Banes * you may not use this file except in compliance with the License.
689208232f3b5d1451408d787872504a190bc7ee0Chris Banes * You may obtain a copy of the License at
789208232f3b5d1451408d787872504a190bc7ee0Chris Banes *
889208232f3b5d1451408d787872504a190bc7ee0Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
989208232f3b5d1451408d787872504a190bc7ee0Chris Banes *
1089208232f3b5d1451408d787872504a190bc7ee0Chris Banes * Unless required by applicable law or agreed to in writing, software
1189208232f3b5d1451408d787872504a190bc7ee0Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
1289208232f3b5d1451408d787872504a190bc7ee0Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389208232f3b5d1451408d787872504a190bc7ee0Chris Banes * See the License for the specific language governing permissions and
1489208232f3b5d1451408d787872504a190bc7ee0Chris Banes * limitations under the License.
1589208232f3b5d1451408d787872504a190bc7ee0Chris Banes */
1689208232f3b5d1451408d787872504a190bc7ee0Chris Banes
1789208232f3b5d1451408d787872504a190bc7ee0Chris Banespackage android.support.v7.internal.widget;
1889208232f3b5d1451408d787872504a190bc7ee0Chris Banes
1989208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.content.Context;
2089208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.content.res.TypedArray;
2189208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.graphics.Rect;
2289208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.support.v7.appcompat.R;
2389208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.text.method.TransformationMethod;
2489208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.util.AttributeSet;
2589208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.view.View;
2689208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.widget.TextView;
2789208232f3b5d1451408d787872504a190bc7ee0Chris Banes
2889208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport java.util.Locale;
2989208232f3b5d1451408d787872504a190bc7ee0Chris Banes
3089208232f3b5d1451408d787872504a190bc7ee0Chris Banes/**
3189208232f3b5d1451408d787872504a190bc7ee0Chris Banes * @hide
3289208232f3b5d1451408d787872504a190bc7ee0Chris Banes */
3389208232f3b5d1451408d787872504a190bc7ee0Chris Banespublic class CompatTextView extends TextView {
3489208232f3b5d1451408d787872504a190bc7ee0Chris Banes
3589208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public CompatTextView(Context context) {
3689208232f3b5d1451408d787872504a190bc7ee0Chris Banes        this(context, null);
3789208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
3889208232f3b5d1451408d787872504a190bc7ee0Chris Banes
3989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public CompatTextView(Context context, AttributeSet attrs) {
4089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        this(context, attrs, 0);
4189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
4289208232f3b5d1451408d787872504a190bc7ee0Chris Banes
4389208232f3b5d1451408d787872504a190bc7ee0Chris Banes    public CompatTextView(Context context, AttributeSet attrs, int defStyle) {
4489208232f3b5d1451408d787872504a190bc7ee0Chris Banes        super(context, attrs, defStyle);
4589208232f3b5d1451408d787872504a190bc7ee0Chris Banes
4689208232f3b5d1451408d787872504a190bc7ee0Chris Banes        boolean allCaps = false;
4789208232f3b5d1451408d787872504a190bc7ee0Chris Banes
4889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        TypedArray style = context
4989208232f3b5d1451408d787872504a190bc7ee0Chris Banes                .obtainStyledAttributes(attrs, R.styleable.CompatTextView, defStyle, 0);
5089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        allCaps = style.getBoolean(R.styleable.CompatTextView_textAllCaps, false);
5189208232f3b5d1451408d787872504a190bc7ee0Chris Banes        style.recycle();
5289208232f3b5d1451408d787872504a190bc7ee0Chris Banes
5389208232f3b5d1451408d787872504a190bc7ee0Chris Banes        // Framework impl also checks TextAppearance for textAllCaps. This isn't needed for our
5489208232f3b5d1451408d787872504a190bc7ee0Chris Banes        // purposes so has been omitted.
5589208232f3b5d1451408d787872504a190bc7ee0Chris Banes
5689208232f3b5d1451408d787872504a190bc7ee0Chris Banes        if (allCaps) {
5789208232f3b5d1451408d787872504a190bc7ee0Chris Banes            setTransformationMethod(new AllCapsTransformationMethod(context));
5889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        }
5989208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
6089208232f3b5d1451408d787872504a190bc7ee0Chris Banes
6189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    /**
6289208232f3b5d1451408d787872504a190bc7ee0Chris Banes     * Transforms source text into an ALL CAPS string, locale-aware.
6389208232f3b5d1451408d787872504a190bc7ee0Chris Banes     */
6489208232f3b5d1451408d787872504a190bc7ee0Chris Banes    private static class AllCapsTransformationMethod implements TransformationMethod {
6589208232f3b5d1451408d787872504a190bc7ee0Chris Banes
6689208232f3b5d1451408d787872504a190bc7ee0Chris Banes        private final Locale mLocale;
6789208232f3b5d1451408d787872504a190bc7ee0Chris Banes
6889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        public AllCapsTransformationMethod(Context context) {
6989208232f3b5d1451408d787872504a190bc7ee0Chris Banes            mLocale = context.getResources().getConfiguration().locale;
7089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        }
7189208232f3b5d1451408d787872504a190bc7ee0Chris Banes
7289208232f3b5d1451408d787872504a190bc7ee0Chris Banes        @Override
7389208232f3b5d1451408d787872504a190bc7ee0Chris Banes        public CharSequence getTransformation(CharSequence source, View view) {
7489208232f3b5d1451408d787872504a190bc7ee0Chris Banes            return source != null ? source.toString().toUpperCase(mLocale) : null;
7589208232f3b5d1451408d787872504a190bc7ee0Chris Banes        }
7689208232f3b5d1451408d787872504a190bc7ee0Chris Banes
7789208232f3b5d1451408d787872504a190bc7ee0Chris Banes        @Override
7889208232f3b5d1451408d787872504a190bc7ee0Chris Banes        public void onFocusChanged(View view, CharSequence charSequence, boolean b, int i,
7989208232f3b5d1451408d787872504a190bc7ee0Chris Banes                Rect rect) {
8089208232f3b5d1451408d787872504a190bc7ee0Chris Banes        }
8189208232f3b5d1451408d787872504a190bc7ee0Chris Banes    }
8289208232f3b5d1451408d787872504a190bc7ee0Chris Banes}
83