diff options
Diffstat (limited to 'libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java')
-rw-r--r-- | libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java | 91 |
1 files changed, 89 insertions, 2 deletions
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java index 8e1efe8c5..4a3a1ca26 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java @@ -1,11 +1,19 @@ package com.actionbarsherlock.internal; +import android.app.Activity; import android.content.Context; +import android.content.res.AssetManager; +import android.content.res.XmlResourceParser; import android.os.Build; import android.util.DisplayMetrics; +import android.util.Log; +import com.actionbarsherlock.ActionBarSherlock; import com.actionbarsherlock.R; +import org.xmlpull.v1.XmlPullParser; public final class ResourcesCompat { + private static final String TAG = "ResourcesCompat"; + //No instances private ResourcesCompat() {} @@ -15,14 +23,14 @@ public final class ResourcesCompat { * can use to simulate filtering based on width and smallest width * qualifiers on pre-3.2. * - * @param context Context to load booleans from on 3.2+ and to fetch the + * @param context Context to load booleans from on 4.0+ and to fetch the * display metrics. * @param id Id of boolean to load. * @return Associated boolean value as reflected by the current display * metrics. */ public static boolean getResources_getBoolean(Context context, int id) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { return context.getResources().getBoolean(id); } @@ -92,4 +100,83 @@ public final class ResourcesCompat { throw new IllegalArgumentException("Unknown integer resource ID " + id); } + + /** + * Attempt to programmatically load the logo from the manifest file of an + * activity by using an XML pull parser. This should allow us to read the + * logo attribute regardless of the platform it is being run on. + * + * @param activity Activity instance. + * @return Logo resource ID. + */ + public static int loadLogoFromManifest(Activity activity) { + int logo = 0; + try { + final String thisPackage = activity.getClass().getName(); + if (ActionBarSherlock.DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage); + + final String packageName = activity.getApplicationInfo().packageName; + final AssetManager am = activity.createPackageContext(packageName, 0).getAssets(); + final XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml"); + + int eventType = xml.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.START_TAG) { + String name = xml.getName(); + + if ("application".equals(name)) { + //Check if the <application> has the attribute + if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got <application>"); + + for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { + if (ActionBarSherlock.DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i)); + + if ("logo".equals(xml.getAttributeName(i))) { + logo = xml.getAttributeResourceValue(i, 0); + break; //out of for loop + } + } + } else if ("activity".equals(name)) { + //Check if the <activity> is us and has the attribute + if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got <activity>"); + Integer activityLogo = null; + String activityPackage = null; + boolean isOurActivity = false; + + for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { + if (ActionBarSherlock.DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i)); + + //We need both uiOptions and name attributes + String attrName = xml.getAttributeName(i); + if ("logo".equals(attrName)) { + activityLogo = xml.getAttributeResourceValue(i, 0); + } else if ("name".equals(attrName)) { + activityPackage = ActionBarSherlockCompat.cleanActivityName(packageName, xml.getAttributeValue(i)); + if (!thisPackage.equals(activityPackage)) { + break; //on to the next + } + isOurActivity = true; + } + + //Make sure we have both attributes before processing + if ((activityLogo != null) && (activityPackage != null)) { + //Our activity, logo specified, override with our value + logo = activityLogo.intValue(); + } + } + if (isOurActivity) { + //If we matched our activity but it had no logo don't + //do any more processing of the manifest + break; + } + } + } + eventType = xml.nextToken(); + } + } catch (Exception e) { + e.printStackTrace(); + } + if (ActionBarSherlock.DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(logo)); + return logo; + } } |