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 ; }
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 .