Bug 33617 - MD5 Sum for action name
Summary: MD5 Sum for action name
Status: CONFIRMED
Alias: None
Product: Android
Classification: Xamarin
Component: General (show other bugs)
Version: 5.1
Hardware: PC Windows
: High enhancement
Target Milestone: master
Assignee: Jonathan Pryor
URL:
Depends on:
Blocks:
 
Reported: 2015-09-03 14:32 UTC by Philipp
Modified: 2017-03-21 20:21 UTC (History)
4 users (show)

See Also:
Tags:
Is this bug a regression?: ---
Last known good build:


Attachments

Description Philipp 2015-09-03 14:32:21 UTC
I have defined my preferences in xml/preferences.xml,  containing

	<PreferenceScreen
			  android:key="@string/about_prefs_key"
			  android:title="@string/menu_about"
			  >
		<intent android:action="keepass2android.AboutActivity"/>
	</PreferenceScreen>

The AboutActivity declares as

namespace keepass2android
{
	[Activity(Label = "@string/app_name",
		ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
		Theme = "@style/NoTitleBar")]
	[IntentFilter(new[] { "keepass2android.AboutActivity" }, Categories = new[] { Intent.CategoryDefault })]
	public class AboutActivity: Activity, IDialogInterfaceOnDismissListener
	{...}
}
	
Note that the android:action="keepass2android.AboutActivity" corresponds to the Action name in 
[IntentFilter(new[] { "keepass2android.AboutActivity" }

The action name is the same as the fully qualified class name. One might argue it's no good style, but that's how it is (or was...).

Starting with Android 5.1, the namespace gets md5'ed (https://developer.xamarin.com/guides/android/advanced_topics/working_with_androidmanifest.xml/) which is fine for classes, but apparently this also translates my IntentFilter's action name as well: In obj/Debug/android/AndroidManifest.xml I found

<activity android:configChanges="keyboardHidden|orientation" android:label="@string/app_name" android:theme="@style/NoTitleBar" android:name="md5f0702f468598c68ce18586502249fb40.AboutActivity">
      <intent-filter>
        <action android:name="md5f0702f468598c68ce18586502249fb40.AboutActivity" />
        <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
    </activity>

I am not totally sure if this is a bug or intended behavior, but if it's intended to transform the action name, also the preferences.xml should be modified to have the corresponding action name.

In the current implementation, I got ActivityNotFoundException. A workaround is to change the Action name, e.g. kp2a.action.AboutActivity in both places, but it's bad that previously working code gets subtly broken without even a warning.
Comment 1 Jonathan Pryor 2015-09-04 11:27:22 UTC
> I am not totally sure if this is a bug or intended behavior

It's accidentally intended...

As part of the "let's just MD5 everything!" gambit, we hit a few customer projects and samples for which that broke things (shock?), so the current solution was to go through //*/@android:name (i.e. *all* android:name attributes) and if the attribute value matches that of a "legacy" type name, we'd replace it with the "new" name.

Which is why it's fixing up your <intent-filter/> description.

I think that this is being too loose; we should only fixup e.g. <application/>, <activity/>, etc., and not *every* instance of //*/@android:name, as that alters //action/@android:name as well.

We'll need to see if being stricter breaks anything...
Comment 2 gcnew 2015-10-26 23:50:11 UTC
Philipp, could you please add more details regarding workaround? To my mind if I change namespace it will generate new md5 hash and it won't work as well. What am I missing?
Comment 3 Philipp 2015-10-27 15:13:45 UTC
@gcnew: my "solution" was to rename the action to something that didn't start with my classes' namespace. So the C# namespace keepass2android was kept, but the action was renamed from keepass2android.AboutActivity to kp2a.action.AboutActivity both in the preferences as well as the [IntentFilter]

Note You need to log in before you can comment on or make changes to this bug.