| # |
| # 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 an error is generated because the libraries define |
| # activities which are already in the main, with slightly different XML content: |
| # number and *order* of elements must match, attributes must match. |
| # |
| |
| @fails |
| |
| @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> |
| |
| |
| <!-- Conflict with lib1 --> |
| <activity |
| android:icon="@drawable/widget_icon" |
| android:label="Configure Widget" |
| android:name="com.example.WidgetConfigurationUI" |
| android:theme="@style/Theme.WidgetConfigurationUI" > |
| <!-- missing the intent-filter --> |
| </activity> |
| |
| |
| <!-- Conflict with lib2 --> |
| <activity |
| android:name="com.example.LibActivity" |
| android:label="@string/lib_activity_name" |
| android:icon="@drawable/lib_activity_icon"> |
| <!-- missing attribute 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> |
| |
| |
| @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 will conflict with the 2nd one from 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" /> |
| <category android:name="android.intent.category.MOARCATZPLZ" /> |
| </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> |
| |
| |
| <!-- Conflict with lib1 --> |
| <activity |
| android:icon="@drawable/widget_icon" |
| android:label="Configure Widget" |
| android:name="com.example.WidgetConfigurationUI" |
| android:theme="@style/Theme.WidgetConfigurationUI" > |
| <!-- missing the intent-filter --> |
| </activity> |
| |
| |
| <!-- Conflict with lib2 --> |
| <activity |
| android:name="com.example.LibActivity" |
| android:label="@string/lib_activity_name" |
| android:icon="@drawable/lib_activity_icon"> |
| <!-- missing attribute android:theme="@style/Lib.Theme" --> |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity> |
| |
| # from @lib1_widget |
| <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:icon="@drawable/lib_activity_icon" android:label="@string/lib_activity_name" android:name="com.example.LibActivity2" 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 |
| |
| E [ManifestMergerTest0_main.xml:32, ManifestMergerTest1_lib1_widget.xml:16] Trying to merge incompatible /manifest/application/activity[@name=com.example.WidgetConfigurationUI] element: |
| <activity android:name=com.example.WidgetConfigurationUI> |
| -- <intent-filter> |
| ++ (end reached) |
| E [ManifestMergerTest0_main.xml:38, ManifestMergerTest2_lib2_activity.xml:6] Trying to merge incompatible /manifest/application/activity[@name=com.example.LibActivity] element: |
| <activity android:name=com.example.LibActivity> |
| @android:icon = @drawable/lib_activity_icon |
| @android:label = @string/lib_activity_name |
| @android:name = com.example.LibActivity |
| -- @android:theme = @style/Lib.Theme |
| E [ManifestMergerTest0_main.xml, ManifestMergerTest3_lib3_alias.xml:19] Trying to merge incompatible /manifest/application/activity[@name=com.example.LibActivity2] element: |
| <activity android:name=com.example.LibActivity2> |
| <intent-filter> |
| <action android:name=android.intent.action.MAIN> |
| <category android:name=android.intent.category.LAUNCHER> |
| -- <category android:name=android.intent.category.MOARCATZPLZ> |
| ++ (end reached) |