| # |
| # Test: |
| # - Activities from libraries are merged in the main manifest. |
| # - Acts on activity / activity-alias / service / receiver / provider. |
| # - Elements are merged as-is with the first comment element preceding them. |
| # - Whitespace preceding the merged elements is transfered over too. |
| # |
| # Note: |
| # - New elements are always merged at the end of the application element. |
| # - It's an error if an element with the same @name attribute is defined |
| # or merged more than once unless the definition is *exactly* the same, |
| # the "same" being defined by the exact XML elements, whitespace excluded. |
| # |
| # This tests that a normal merge is done as expected. |
| # There's a warning because one of the activities from lib2 is already defined |
| # in the main but it's purely identical so it's not an error. |
| # |
| |
| @main |
| |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android" |
| package="com.example.app1" |
| android:versionCode="100" |
| android:versionName="1.0.0"> |
| |
| <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="11"/> |
| |
| <supports-screens |
| android:largeScreens="true" |
| android:smallScreens="true" |
| android:normalScreens="true" |
| android:resizeable="true" |
| android:xlargeScreens="true" |
| /> |
| |
| <!-- Typical analytics permissions. --> |
| <uses-permission android:name="android.permission.INTERNET" /> |
| <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> |
| |
| <!-- Touchscreen feature, optional to make sure we can run on devices with no touch screen. --> |
| <uses-feature |
| android:name="android.hardware.touchscreen" |
| android:required="false" /> |
| |
| <application |
| android:label="@string/app_name" |
| android:icon="@drawable/app_icon" |
| android:backupAgent="com.example.app.BackupAgentClass" |
| android:restoreAnyVersion="true" |
| android:allowBackup="true" |
| android:killAfterRestore="true" |
| android:name="com.example.TheApp" > |
| |
| <activity |
| android:name="com.example.MainActivity" |
| android:label="@string/activity_name" |
| android:icon="@drawable/activity_icon" |
| android:theme="@style/Some.Theme"> |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity> |
| |
| <!-- Receiver --> |
| <receiver |
| android:name="com.example.AppReceiver" |
| android:icon="@drawable/app_icon"> |
| <intent-filter> |
| <action android:name="com.example.action.ACTION_CUSTOM" /> |
| </intent-filter> |
| </receiver> |
| |
| <!-- This is exactly the same as in lib2_activity --> |
| <activity |
| android:name="com.example.LibActivity" |
| android:label="@string/lib_activity_name" |
| android:icon="@drawable/lib_activity_icon" |
| android:theme="@style/Lib.Theme"> |
| |
| <!-- When comparing duplicate elements, whitespace and comments are ignored. --> |
| |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| |
| </activity> |
| |
| <!-- end of the main manifest's application element. Note that the |
| merger will insert at the end of this comment, in the specific |
| order activity, activity-alias, service, receiver and provider. --> |
| |
| </application> |
| |
| </manifest> |
| |
| |
| @lib1_widget |
| |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android" |
| package="com.example.lib1"> |
| |
| <application android:label="@string/lib_name" > |
| |
| <!-- Broadcast Receiver for a widget. --> |
| <receiver |
| android:label="@string/widget_name" |
| android:icon="@drawable/widget_icon" |
| android:name="com.example.WidgetReceiver" > |
| <intent-filter> |
| <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> |
| </intent-filter> |
| <meta-data |
| android:name="android.appwidget.provider" |
| android:resource="@xml/widget_provider" |
| /> |
| </receiver> |
| |
| <service |
| android:icon="@drawable/app_icon" |
| android:name="com.example.AppService" /> |
| |
| <!-- Activity to configure widget --> |
| <activity |
| android:icon="@drawable/widget_icon" |
| android:label="Configure Widget" |
| android:name="com.example.WidgetConfigurationUI" |
| android:theme="@style/Theme.WidgetConfigurationUI" > |
| <intent-filter > |
| <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> |
| </intent-filter> |
| </activity> |
| </application> |
| |
| </manifest> |
| |
| |
| @lib2_activity |
| |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android" |
| package="com.example.lib2"> |
| |
| <application android:label="@string/lib_name" > |
| |
| <!-- This won't be merged because there's already an identical definition in the main. --> |
| <activity |
| android:name="com.example.LibActivity" |
| android:label="@string/lib_activity_name" |
| android:icon="@drawable/lib_activity_icon" |
| android:theme="@style/Lib.Theme"> |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity> |
| |
| <!-- Provider extracted from ApiDemos --> |
| <provider android:name=".app.LoaderThrottle$SimpleProvider" |
| android:authorities="com.example.android.apis.app.LoaderThrottle" |
| android:enabled="@bool/atLeastHoneycomb" /> |
| |
| <!-- This one does not conflict with the main --> |
| <activity |
| android:name="com.example.LibActivity2" |
| android:label="@string/lib_activity_name" |
| android:icon="@drawable/lib_activity_icon" |
| android:theme="@style/Lib.Theme"> |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity> |
| |
| </application> |
| |
| </manifest> |
| |
| |
| @lib3_alias |
| |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android" |
| package="com.example.lib3"> |
| |
| <!-- This comment is ignored. --> |
| |
| <application android:label="@string/lib_name" > |
| |
| <!-- The first comment just before the element |
| is carried over as-is. |
| --> |
| <!-- Formatting is preserved. --> |
| <!-- All consecutive comments are taken together. --> |
| |
| <activity-alias |
| android:name="com.example.alias.MyActivity" |
| android:targetActivity="com.example.MainActivity" |
| android:label="@string/alias_name" |
| android:icon="@drawable/alias_icon" |
| > |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity-alias> |
| |
| <!-- This is a dup of the 2nd activity in lib2 --> |
| <activity |
| android:name="com.example.LibActivity2" |
| android:label="@string/lib_activity_name" |
| android:icon="@drawable/lib_activity_icon" |
| android:theme="@style/Lib.Theme"> |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity> |
| |
| </application> |
| |
| </manifest> |
| |
| |
| @result |
| |
| <manifest |
| xmlns:android="http://schemas.android.com/apk/res/android" |
| package="com.example.app1" |
| android:versionCode="100" |
| android:versionName="1.0.0"> |
| |
| <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="11"/> |
| |
| <supports-screens |
| android:largeScreens="true" |
| android:smallScreens="true" |
| android:normalScreens="true" |
| android:resizeable="true" |
| android:xlargeScreens="true" |
| /> |
| |
| <!-- Typical analytics permissions. --> |
| <uses-permission android:name="android.permission.INTERNET" /> |
| <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> |
| |
| <!-- Touchscreen feature, optional to make sure we can run on devices with no touch screen. --> |
| <uses-feature |
| android:name="android.hardware.touchscreen" |
| android:required="false" /> |
| |
| <application |
| android:label="@string/app_name" |
| android:icon="@drawable/app_icon" |
| android:backupAgent="com.example.app.BackupAgentClass" |
| android:restoreAnyVersion="true" |
| android:allowBackup="true" |
| android:killAfterRestore="true" |
| android:name="com.example.TheApp" > |
| |
| <activity |
| android:name="com.example.MainActivity" |
| android:label="@string/activity_name" |
| android:icon="@drawable/activity_icon" |
| android:theme="@style/Some.Theme"> |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity> |
| |
| <!-- Receiver --> |
| <receiver |
| android:name="com.example.AppReceiver" |
| android:icon="@drawable/app_icon"> |
| <intent-filter> |
| <action android:name="com.example.action.ACTION_CUSTOM" /> |
| </intent-filter> |
| </receiver> |
| |
| <!-- This is exactly the same as in lib2_activity --> |
| <activity |
| android:name="com.example.LibActivity" |
| android:label="@string/lib_activity_name" |
| android:icon="@drawable/lib_activity_icon" |
| android:theme="@style/Lib.Theme"> |
| |
| <!-- When comparing duplicate elements, whitespace and comments are ignored. --> |
| |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| |
| </activity> |
| |
| <!-- end of the main manifest's application element. Note that the |
| merger will insert at the end of this comment, in the specific |
| order activity, activity-alias, service, receiver and provider. --> |
| |
| # from @lib1_widget |
| <!-- Activity to configure widget --> |
| <activity |
| android:icon="@drawable/widget_icon" |
| android:label="Configure Widget" |
| android:name="com.example.WidgetConfigurationUI" |
| android:theme="@style/Theme.WidgetConfigurationUI" > |
| <intent-filter > |
| <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> |
| </intent-filter> |
| </activity> |
| |
| <service |
| android:icon="@drawable/app_icon" |
| android:name="com.example.AppService" /> |
| |
| <!-- Broadcast Receiver for a widget. --> |
| <receiver |
| android:label="@string/widget_name" |
| android:icon="@drawable/widget_icon" |
| android:name="com.example.WidgetReceiver" > |
| <intent-filter> |
| <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> |
| </intent-filter> |
| <meta-data |
| android:name="android.appwidget.provider" |
| android:resource="@xml/widget_provider" |
| /> |
| </receiver> |
| |
| # from @lib2_activity |
| <!-- This one does not conflict with the main --> |
| <activity |
| android:name="com.example.LibActivity2" |
| android:label="@string/lib_activity_name" |
| android:icon="@drawable/lib_activity_icon" |
| android:theme="@style/Lib.Theme"> |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity> |
| |
| <!-- Provider extracted from ApiDemos --> |
| <provider android:name="com.example.lib2.app.LoaderThrottle$SimpleProvider" |
| android:authorities="com.example.android.apis.app.LoaderThrottle" |
| android:enabled="@bool/atLeastHoneycomb" /> |
| |
| # from @lib3_alias |
| <!-- The first comment just before the element |
| is carried over as-is. |
| --> |
| <!-- Formatting is preserved. --> |
| <!-- All consecutive comments are taken together. --> |
| |
| <activity-alias |
| android:name="com.example.alias.MyActivity" |
| android:targetActivity="com.example.MainActivity" |
| android:label="@string/alias_name" |
| android:icon="@drawable/alias_icon" |
| > |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity-alias> |
| |
| </application> |
| |
| </manifest> |
| |
| @errors |
| |
| P [ManifestMergerTest0_main.xml:31, ManifestMergerTest2_lib2_activity.xml:6] Skipping identical /manifest/application/activity[@name=com.example.LibActivity] element. |
| P [ManifestMergerTest0_main.xml, ManifestMergerTest3_lib3_alias.xml:19] Skipping identical /manifest/application/activity[@name=com.example.LibActivity2] element. |