Skip to content

Commit 53645e0

Browse files
committed
feat(manifest): fixing a potential crash when switching from GCM to FCM
1 parent 5309209 commit 53645e0

File tree

2 files changed

+81
-12
lines changed

2 files changed

+81
-12
lines changed

AndroidSDK/src/com/leanplum/LeanplumPushService.java

Lines changed: 68 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -708,11 +708,16 @@ private static boolean enableFcmServices() {
708708
Log.e("Failed to setup Firebase, please compile Firebase library.");
709709
return false;
710710
}
711-
711+
// We will only enable component once, if we are switching from GCM to FCM, we have to disable
712+
// GCM services first.
712713
if (!LeanplumManifestHelper.wasComponentEnabled(context, packageManager, fcmListenerClass)) {
713-
if (!LeanplumManifestHelper.enableServiceAndStart(context, packageManager, PUSH_FIREBASE_MESSAGING_SERVICE_CLASS)
714-
|| !LeanplumManifestHelper.enableServiceAndStart(context, packageManager, fcmListenerClass)) {
715-
return false;
714+
// Try to disable GCM services first.
715+
disableGcmServices();
716+
LeanplumManifestHelper.enableServiceAndStart(context, packageManager, fcmListenerClass);
717+
718+
Class pushListener = LeanplumManifestHelper.getClassForName(PUSH_FIREBASE_MESSAGING_SERVICE_CLASS);
719+
if (pushListener != null) {
720+
LeanplumManifestHelper.enableServiceAndStart(context, packageManager, pushListener);
716721
}
717722
}
718723
}
@@ -737,22 +742,73 @@ private static boolean enableGcmServices() {
737742
return false;
738743
}
739744

740-
Class gcmPushInstanceIDClass = LeanplumManifestHelper.getClassForName(LEANPLUM_PUSH_INSTANCE_ID_SERVICE_CLASS);
741-
if (gcmPushInstanceIDClass == null) {
745+
Class gcm = LeanplumManifestHelper.getClassForName(LEANPLUM_PUSH_INSTANCE_ID_SERVICE_CLASS);
746+
if (gcm == null) {
742747
Log.e("Failed to setup GCM, please compile GCM library.");
743748
return false;
744749
}
745-
746-
if (!LeanplumManifestHelper.wasComponentEnabled(context, packageManager, gcmPushInstanceIDClass)) {
747-
if (!LeanplumManifestHelper.enableComponent(context, packageManager, LEANPLUM_PUSH_LISTENER_SERVICE_CLASS) ||
748-
!LeanplumManifestHelper.enableComponent(context, packageManager, gcmPushInstanceIDClass) ||
749-
!LeanplumManifestHelper.enableComponent(context, packageManager, GCM_RECEIVER_CLASS)) {
750-
return false;
750+
// We will only enable component once, if we are switching from FCM to GCM, we have to disable
751+
// FCM services first.
752+
if (!LeanplumManifestHelper.wasComponentEnabled(context, packageManager, gcm)) {
753+
// Try to disable FCM first.
754+
disableFcmServices();
755+
LeanplumManifestHelper.enableComponent(context, packageManager, gcm);
756+
757+
// Make sure we can find the class before enabling it.
758+
Class gcmReceiver = LeanplumManifestHelper.getClassForName(GCM_RECEIVER_CLASS);
759+
if (gcmReceiver != null) {
760+
LeanplumManifestHelper.enableComponent(context, packageManager, gcmReceiver);
761+
}
762+
Class pushListener = LeanplumManifestHelper.getClassForName(LEANPLUM_PUSH_LISTENER_SERVICE_CLASS);
763+
if (pushListener != null) {
764+
LeanplumManifestHelper.enableComponent(context, packageManager, pushListener);
751765
}
752766
}
753767
return true;
754768
}
755769

770+
/**
771+
* Disables FCM services.
772+
*/
773+
private static void disableFcmServices() {
774+
Context context = Leanplum.getContext();
775+
if (context == null) {
776+
return;
777+
}
778+
779+
PackageManager packageManager = context.getPackageManager();
780+
if (packageManager == null) {
781+
return;
782+
}
783+
784+
LeanplumManifestHelper.disableComponent(context, packageManager,
785+
LEANPLUM_PUSH_FCM_LISTENER_SERVICE_CLASS);
786+
LeanplumManifestHelper.disableComponent(context, packageManager,
787+
PUSH_FIREBASE_MESSAGING_SERVICE_CLASS);
788+
}
789+
790+
/**
791+
* Disables GCM services
792+
*/
793+
private static void disableGcmServices() {
794+
Context context = Leanplum.getContext();
795+
if (context == null) {
796+
return;
797+
}
798+
799+
PackageManager packageManager = context.getPackageManager();
800+
if (packageManager == null) {
801+
return;
802+
}
803+
804+
LeanplumManifestHelper.disableComponent(context, packageManager,
805+
LEANPLUM_PUSH_INSTANCE_ID_SERVICE_CLASS);
806+
LeanplumManifestHelper.disableComponent(context, packageManager,
807+
GCM_RECEIVER_CLASS);
808+
LeanplumManifestHelper.disableComponent(context, packageManager,
809+
LEANPLUM_PUSH_LISTENER_SERVICE_CLASS);
810+
}
811+
756812
/**
757813
* Check if current application id is different from stored one.
758814
*

AndroidSDK/src/com/leanplum/internal/LeanplumManifestHelper.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,19 @@ public static boolean enableComponent(Context context, PackageManager packageMan
135135
return true;
136136
}
137137

138+
public static boolean disableComponent(Context context, PackageManager packageManager, String className) {
139+
if (context == null || packageManager == null || className == null) {
140+
return false;
141+
}
142+
try {
143+
packageManager.setComponentEnabledSetting(new ComponentName(context, className),
144+
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
145+
} catch (Throwable t) {
146+
return false;
147+
}
148+
return true;
149+
}
150+
138151
/**
139152
* Checks if component for provided class enabled before.
140153
*

0 commit comments

Comments
 (0)