Skip to content

Commit c7d2a36

Browse files
committed
feat(android): change app icons at runtime
1 parent 48871ce commit c7d2a36

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

android/cli/commands/_build.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,9 @@ AndroidBuilder.prototype.validate = function validate(logger, config, cli) {
10471047
try {
10481048
if (cli.tiapp.android && cli.tiapp.android.manifest) {
10491049
this.customAndroidManifest = AndroidManifest.fromXmlString(cli.tiapp.android.manifest);
1050+
1051+
// check if we have <activity-alias> nodes
1052+
this.activityAliasCount = this.customAndroidManifest.xmlDomDocument.getElementsByTagName('application')[0].getElementsByTagName('activity-alias').length;
10501053
}
10511054
} catch (ex) {
10521055
logger.error(__n('Malformed <manifest> definition in the <android> section of the tiapp.xml'));
@@ -3522,7 +3525,8 @@ AndroidBuilder.prototype.fetchNeededManifestSettings = function fetchNeededManif
35223525
const neededSettings = {
35233526
queries: neededQueriesDictionary,
35243527
storagePermissionMaxSdkVersion: storagePermissionMaxSdkVersion,
3525-
usesPermissions: Object.keys(neededPermissionDictionary)
3528+
usesPermissions: Object.keys(neededPermissionDictionary),
3529+
skipLauncher: this.activityAliasCount > 0
35263530
};
35273531
return neededSettings;
35283532
};
@@ -3619,7 +3623,8 @@ AndroidBuilder.prototype.generateAndroidManifest = async function generateAndroi
36193623
storagePermissionMaxSdkVersion: neededManifestSettings.storagePermissionMaxSdkVersion,
36203624
packageName: this.appid,
36213625
queries: neededManifestSettings.queries,
3622-
usesPermissions: neededManifestSettings.usesPermissions
3626+
usesPermissions: neededManifestSettings.usesPermissions,
3627+
skipLauncher: this.activityAliasCount > 0
36233628
});
36243629
const mainManifest = AndroidManifest.fromXmlString(mainManifestContent);
36253630

android/modules/app/src/java/ti/modules/titanium/app/AndroidModule.java

+16
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import org.appcelerator.titanium.proxy.RProxy;
1818

1919
import android.app.Activity;
20+
import android.content.ComponentName;
2021
import android.content.Intent;
2122
import android.content.pm.PackageInfo;
23+
import android.content.pm.PackageManager;
2224
import android.content.pm.PackageManager.NameNotFoundException;
2325

2426
@Kroll.module(parentModule = AppModule.class)
@@ -61,6 +63,20 @@ public ActivityProxy getTopActivity()
6163
}
6264
}
6365

66+
@Kroll.method
67+
public void changeIcon(String oldPackage, String newPackage)
68+
{
69+
String pkgName = TiApplication.getInstance().getPackageName();
70+
TiApplication.getInstance().getPackageManager().setComponentEnabledSetting(
71+
new ComponentName(pkgName, pkgName + "." + oldPackage),
72+
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP
73+
);
74+
TiApplication.getInstance().getPackageManager().setComponentEnabledSetting(
75+
new ComponentName(pkgName, pkgName + "." + newPackage),
76+
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP
77+
);
78+
}
79+
6480
@Kroll.getProperty
6581
public int getAppVersionCode()
6682
{

android/templates/build/AndroidManifest.xml

+2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@
3838
android:alwaysRetainTaskState="true">
3939
<intent-filter>
4040
<action android:name="android.intent.action.MAIN" />
41+
<% if (!skipLauncher) { %>
4142
<category android:name="android.intent.category.LAUNCHER" />
43+
<% } %>
4244
</intent-filter>
4345
</activity>
4446

0 commit comments

Comments
 (0)