1bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet/*
2bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * Copyright (C) 2011 The Android Open Source Project
3bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet *
4bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
5bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * you may not use this file except in compliance with the License.
6bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * You may obtain a copy of the License at
7bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet *
8bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
9bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet *
10bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software
11bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
12bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * See the License for the specific language governing permissions and
14bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * limitations under the License.
15bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet */
16bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
17bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetpackage com.android.layoutlib.bridge.bars;
18bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
19bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.ide.common.rendering.api.RenderResources;
20bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.ide.common.rendering.api.ResourceValue;
21bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.ide.common.rendering.api.StyleResourceValue;
22bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.layoutlib.bridge.Bridge;
23bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.layoutlib.bridge.android.BridgeContext;
24bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
2504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohetimport com.android.layoutlib.bridge.impl.ParserFactory;
26bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.layoutlib.bridge.impl.ResourceHelper;
27bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.resources.Density;
2813bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohetimport com.android.resources.ResourceType;
29bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
30bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport org.xmlpull.v1.XmlPullParser;
31bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport org.xmlpull.v1.XmlPullParserException;
32bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
33bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.content.Context;
34bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.content.res.ColorStateList;
35bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.graphics.Bitmap;
36bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.graphics.Bitmap_Delegate;
37bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.graphics.drawable.BitmapDrawable;
38bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.graphics.drawable.Drawable;
39bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.util.TypedValue;
4013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohetimport android.view.Gravity;
41bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.view.LayoutInflater;
42bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.view.View;
43bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.widget.ImageView;
44bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.widget.LinearLayout;
45bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport android.widget.TextView;
46bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
47bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport java.io.IOException;
48bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport java.io.InputStream;
49bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
50bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet/**
51bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * Base "bar" class for the window decor around the the edited layout.
52bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * This is basically an horizontal layout that loads a given layout on creation (it is read
53bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * through {@link Class#getResourceAsStream(String)}).
54bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet *
55bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * The given layout should be a merge layout so that all the children belong to this class directly.
56bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet *
57bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet * It also provides a few utility methods to configure the content of the layout.
58bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet */
59bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetabstract class CustomBar extends LinearLayout {
60bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
61bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    protected abstract TextView getStyleableTextView();
62bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
63891b703f7b1e0e396d16477cc66a286da7161b49Xavier Ducrohet    protected CustomBar(Context context, Density density, int orientation, String layoutPath,
64891b703f7b1e0e396d16477cc66a286da7161b49Xavier Ducrohet            String name) throws XmlPullParserException {
65bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        super(context);
66891b703f7b1e0e396d16477cc66a286da7161b49Xavier Ducrohet        setOrientation(orientation);
67891b703f7b1e0e396d16477cc66a286da7161b49Xavier Ducrohet        if (orientation == LinearLayout.HORIZONTAL) {
68891b703f7b1e0e396d16477cc66a286da7161b49Xavier Ducrohet            setGravity(Gravity.CENTER_VERTICAL);
69891b703f7b1e0e396d16477cc66a286da7161b49Xavier Ducrohet        } else {
70891b703f7b1e0e396d16477cc66a286da7161b49Xavier Ducrohet            setGravity(Gravity.CENTER_HORIZONTAL);
71891b703f7b1e0e396d16477cc66a286da7161b49Xavier Ducrohet        }
72bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
73bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
74bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                Context.LAYOUT_INFLATER_SERVICE);
75bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
7604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        XmlPullParser parser = ParserFactory.create(getClass().getResourceAsStream(layoutPath),
7704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                name);
78bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
79bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        BridgeXmlBlockParser bridgeParser = new BridgeXmlBlockParser(
8002d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet                parser, (BridgeContext) context, false /*platformFile*/);
81bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
8202d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet        try {
8302d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet            inflater.inflate(bridgeParser, this, true);
8402d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet        } finally {
8502d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet            bridgeParser.ensurePopped();
8602d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet        }
87bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    }
88bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
8913bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet    private InputStream getIcon(String iconName, Density[] densityInOut, String[] pathOut,
9013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet            boolean tryOtherDensities) {
9113bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        // current density
9213bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        Density density = densityInOut[0];
9313bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet
9413bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        // bitmap url relative to this class
9513bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        pathOut[0] = "/bars/" + density.getResourceValue() + "/" + iconName;
9613bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet
9713bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        InputStream stream = getClass().getResourceAsStream(pathOut[0]);
9813bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        if (stream == null && tryOtherDensities) {
9913bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet            for (Density d : Density.values()) {
10013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                if (d != density) {
10113bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                    densityInOut[0] = d;
10213bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                    stream = getIcon(iconName, densityInOut, pathOut, false /*tryOtherDensities*/);
10313bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                    if (stream != null) {
10413bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                        return stream;
10513bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                    }
10613bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                }
10713bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet            }
10813bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        }
10913bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet
11013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        return stream;
11113bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet    }
11213bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet
113bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    protected void loadIcon(int index, String iconName, Density density) {
114bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        View child = getChildAt(index);
115bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        if (child instanceof ImageView) {
116bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            ImageView imageView = (ImageView) child;
117bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
11813bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet            String[] pathOut = new String[1];
11913bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet            Density[] densityInOut = new Density[] { density };
12013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet            InputStream stream = getIcon(iconName, densityInOut, pathOut,
12113bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                    true /*tryOtherDensities*/);
12213bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet            density = densityInOut[0];
123bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
12413bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet            if (stream != null) {
12513bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                // look for a cached bitmap
12613bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                Bitmap bitmap = Bridge.getCachedBitmap(pathOut[0], true /*isFramework*/);
12713bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                if (bitmap == null) {
128bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                    try {
129bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        bitmap = Bitmap_Delegate.createBitmap(stream, false /*isMutable*/, density);
13013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                        Bridge.setCachedBitmap(pathOut[0], bitmap, true /*isFramework*/);
131bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                    } catch (IOException e) {
132bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        return;
133bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                    }
134bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                }
135bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
13613bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                if (bitmap != null) {
13713bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                    BitmapDrawable drawable = new BitmapDrawable(getContext().getResources(),
13813bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                            bitmap);
139c8a0b8e6bccc604d3670d72cab0691ab6b8302c1Xavier Ducrohet                    imageView.setImageDrawable(drawable);
14013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet                }
141bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            }
142bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        }
143bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    }
144bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
145bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    protected void loadIcon(int index, String iconReference) {
146bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        ResourceValue value = getResourceValue(iconReference);
147bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        if (value != null) {
14813bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet            loadIcon(index, value);
14913bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        }
15013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet    }
151bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
1527396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet    protected void loadIconById(int id, String iconReference) {
1537396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        ResourceValue value = getResourceValue(iconReference);
1547396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        if (value != null) {
1557396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            loadIconById(id, value);
1567396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        }
1577396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet    }
1587396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet
1597396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet
16013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet    protected Drawable loadIcon(int index, ResourceType type, String name) {
16113bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        BridgeContext bridgeContext = (BridgeContext) mContext;
16213bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        RenderResources res = bridgeContext.getRenderResources();
16313bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet
16413bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        // find the resource
16513bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        ResourceValue value = res.getFrameworkResource(type, name);
16613bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet
16713bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        // resolve it if needed
16813bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        value = res.resolveResValue(value);
16913bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        return loadIcon(index, value);
17013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet    }
17113bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet
17213bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet    private Drawable loadIcon(int index, ResourceValue value) {
17313bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        View child = getChildAt(index);
17413bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        if (child instanceof ImageView) {
17513bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet            ImageView imageView = (ImageView) child;
17613bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet
1777396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            return loadIcon(imageView, value);
1787396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        }
17913bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet
1807396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        return null;
1817396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet    }
1827396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet
1837396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet    private Drawable loadIconById(int id, ResourceValue value) {
1847396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        View child = findViewById(id);
1857396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        if (child instanceof ImageView) {
1867396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            ImageView imageView = (ImageView) child;
1877396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet
1887396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            return loadIcon(imageView, value);
189bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        }
19013bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet
19113bdc3355c781dc2614f2810a42d3a9e73f5bed9Xavier Ducrohet        return null;
192bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    }
193bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
1947396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet
1957396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet    private Drawable loadIcon(ImageView imageView, ResourceValue value) {
1967396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        Drawable drawable = ResourceHelper.getDrawable(value, (BridgeContext) mContext);
1977396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        if (drawable != null) {
1987396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            imageView.setImageDrawable(drawable);
1997396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        }
2007396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet
2017396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        return drawable;
2027396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet    }
2037396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet
204bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    protected TextView setText(int index, String stringReference) {
205bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        View child = getChildAt(index);
206bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        if (child instanceof TextView) {
207bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            TextView textView = (TextView) child;
2087396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            setText(textView, stringReference);
2097396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            return textView;
2107396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        }
2117396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet
2127396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        return null;
2137396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet    }
2147396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet
2157396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet    protected TextView setTextById(int id, String stringReference) {
2167396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        View child = findViewById(id);
2177396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        if (child instanceof TextView) {
2187396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            TextView textView = (TextView) child;
2197396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            setText(textView, stringReference);
220bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            return textView;
221bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        }
222bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
223bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        return null;
224bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    }
225bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
2267396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet    private void setText(TextView textView, String stringReference) {
2277396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        ResourceValue value = getResourceValue(stringReference);
2287396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        if (value != null) {
2297396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            textView.setText(value.getValue());
2307396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        } else {
2317396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet            textView.setText(stringReference);
2327396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet        }
2337396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet    }
2347396348dfcfb45b7ad055f4c18cabbe5e8270d26Xavier Ducrohet
235bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    protected void setStyle(String themeEntryName) {
236bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
237bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        BridgeContext bridgeContext = (BridgeContext) mContext;
238bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        RenderResources res = bridgeContext.getRenderResources();
239bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
24001b6c755dbcf24e71192dc44757e2eea2a426091Xavier Ducrohet        ResourceValue value = res.findItemInTheme(themeEntryName, true /*isFrameworkAttr*/);
241bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        value = res.resolveResValue(value);
242bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
243bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        if (value instanceof StyleResourceValue == false) {
244bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            return;
245bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        }
246bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
247bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        StyleResourceValue style = (StyleResourceValue) value;
248bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
249bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        // get the background
25001b6c755dbcf24e71192dc44757e2eea2a426091Xavier Ducrohet        ResourceValue backgroundValue = res.findItemInStyle(style, "background",
25101b6c755dbcf24e71192dc44757e2eea2a426091Xavier Ducrohet                true /*isFrameworkAttr*/);
252bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        backgroundValue = res.resolveResValue(backgroundValue);
253bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        if (backgroundValue != null) {
254bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            Drawable d = ResourceHelper.getDrawable(backgroundValue, bridgeContext);
255bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            if (d != null) {
25601b6c755dbcf24e71192dc44757e2eea2a426091Xavier Ducrohet                setBackground(d);
257bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            }
258bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        }
259bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
260bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        TextView textView = getStyleableTextView();
261bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        if (textView != null) {
262bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            // get the text style
26301b6c755dbcf24e71192dc44757e2eea2a426091Xavier Ducrohet            ResourceValue textStyleValue = res.findItemInStyle(style, "titleTextStyle",
26401b6c755dbcf24e71192dc44757e2eea2a426091Xavier Ducrohet                    true /*isFrameworkAttr*/);
265bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            textStyleValue = res.resolveResValue(textStyleValue);
266bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            if (textStyleValue instanceof StyleResourceValue) {
267bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                StyleResourceValue textStyle = (StyleResourceValue) textStyleValue;
268bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
26901b6c755dbcf24e71192dc44757e2eea2a426091Xavier Ducrohet                ResourceValue textSize = res.findItemInStyle(textStyle, "textSize",
27001b6c755dbcf24e71192dc44757e2eea2a426091Xavier Ducrohet                        true /*isFrameworkAttr*/);
271bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                textSize = res.resolveResValue(textSize);
272bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
273bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                if (textSize != null) {
274bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                    TypedValue out = new TypedValue();
27504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                    if (ResourceHelper.parseFloatAttribute("textSize", textSize.getValue(), out,
27604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                            true /*requireUnit*/)) {
277bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        textView.setTextSize(
278d2f664d42cc29507b01a98622298b69131463825Xavier Ducrohet                                out.getDimension(bridgeContext.getResources().getDisplayMetrics()));
279bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                    }
280bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                }
281bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
282bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
28301b6c755dbcf24e71192dc44757e2eea2a426091Xavier Ducrohet                ResourceValue textColor = res.findItemInStyle(textStyle, "textColor",
28401b6c755dbcf24e71192dc44757e2eea2a426091Xavier Ducrohet                        true /*isFrameworkAttr*/);
285bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                textColor = res.resolveResValue(textColor);
286bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                if (textColor != null) {
287bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                    ColorStateList stateList = ResourceHelper.getColorStateList(
288bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                            textColor, bridgeContext);
289bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                    if (stateList != null) {
290bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        textView.setTextColor(stateList);
291bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                    }
292bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                }
293bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            }
294bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        }
295bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    }
296bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
297bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    private ResourceValue getResourceValue(String reference) {
298bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        BridgeContext bridgeContext = (BridgeContext) mContext;
299bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        RenderResources res = bridgeContext.getRenderResources();
300bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
301bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        // find the resource
302bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        ResourceValue value = res.findResValue(reference, false /*isFramework*/);
303bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
304bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        // resolve it if needed
305bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        return res.resolveResValue(value);
306bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    }
307bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet}
308