@@ -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 *
0 commit comments