Skip to content

Commit f62cd09

Browse files
authored
Add support to discovering activity-alias activity elements (#247)
Context https://developer.android.com/guide/topics/manifest/activity-alias-element. Fixes https://dev.azure.com/devdiv/DevDiv/_workitems/edit/2305723. So activity-alias allows users to change some settings before calling an activity. The idea is that your activity is no longer the main launcher, you still have that entry, but the activity-alias' become the main launchers. Here is a sample AndroidManifest.xml ```xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"> <activity-alias android:name=".MainActivityAlias" android:enabled="true" android:icon="@mipmap/appicon" android:targetActivity=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> <activity-alias android:name=".MainActivityAlias2" android:enabled="false" android:icon="@mipmap/appicon2" android:targetActivity=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> </application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> </manifest> ``` The MainActivity.cs then becomes ```csharp [Activity(Theme = "@style/Maui.SplashTheme", LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] [Register("com.companyname.mauiappwithmultipleicons.MainActivity")] public class MainActivity : MauiAppCompatActivity ``` Note that we do not use the MainLauncher property on the ActivityAttribute.
1 parent 60fae19 commit f62cd09

File tree

4 files changed

+12
-3
lines changed

4 files changed

+12
-3
lines changed

src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,9 @@ void RemoveAndroidPermissions (IEnumerable<string> permissions)
329329

330330
IEnumerable<XElement> GetLaunchableActivities ()
331331
{
332-
foreach (var activity in application.Elements ("activity")) {
332+
var activities = application.Elements ("activity");
333+
var aliases = application.Elements ("activity-alias");
334+
foreach (var activity in activities.Union (aliases)) {
333335
foreach (var filter in activity.Elements ("intent-filter")) {
334336
foreach (var category in filter.Elements ("category"))
335337
if (category != null && (string?)category.Attribute (aName) == "android.intent.category.LAUNCHER")

tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ public void GetLaunchableActivityNames ()
5151
var versions = new AndroidVersions (Array.Empty<AndroidVersion>());
5252
var manifest = AndroidAppManifest.Load (GetTestAppManifest (), versions);
5353
var launchers = manifest.GetLaunchableActivityNames ().ToList ();
54-
Assert.AreEqual (1, launchers.Count);
54+
Assert.AreEqual (2, launchers.Count);
5555
Assert.AreEqual (".HasMultipleIntentFilters", launchers [0]);
56+
Assert.AreEqual (".ActivityAlias", launchers [1]);
5657
}
5758

5859
[Test]

tests/Xamarin.Android.Tools.AndroidSdk-Tests/Resources/manifest-simplewidget.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@
3333
<category android:name="android.intent.category.LAUNCHER" />
3434
</intent-filter>
3535
</activity>
36+
<activity-alias android:name=".ActivityAlias" android:label="alias">
37+
<intent-filter>
38+
<action android:name="android.intent.action.MAIN" />
39+
<category android:name="android.intent.category.LAUNCHER" />
40+
</intent-filter>
41+
</activity-alias>
3642
</application>
3743
<uses-permission android:name="android.permission.INTERNET" />
3844
<uses-permission android:name="android.permission.READ_CONTACTS" />

tests/Xamarin.Android.Tools.AndroidSdk-Tests/Xamarin.Android.Tools.AndroidSdk-Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<!-- $(TargetFrameworks) is used to allow the $(TargetFramework) check in Directory.Build.props to work.
55
If $(TargetFramework) is declared here instead, it will not be evaluated before Directory.Build.props
66
is loaded and the wrong $(TestOutputFullPath) will be used. -->
7-
<TargetFrameworks>net6.0</TargetFrameworks>
7+
<TargetFrameworks>net8.0</TargetFrameworks>
88
<SignAssembly>true</SignAssembly>
99
<AssemblyOriginatorKeyFile>..\..\product.snk</AssemblyOriginatorKeyFile>
1010
<IsPackable>false</IsPackable>

0 commit comments

Comments
 (0)