blob: 5ba66882a65fe27cedbb9f136aec24334594849d [file] [log] [blame]
#
# 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)