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