Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Push Providers configuration #757

Closed
wants to merge 21 commits into from
Closed
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
13a8b61
feat(SDK-4447) Deletes methods and fields for non firebase push provi…
CTLalit Feb 27, 2025
cfe1a52
feat(SDK-4447) Removes redundant platform handling
CTLalit Feb 27, 2025
faf7413
feat(SDK-4447) Removes annotations for string def
CTLalit Feb 27, 2025
2fe4a6f
feat(SDK-4447) moves out pushtype enum
CTLalit Feb 27, 2025
61938cb
feat(SDK-4448) converts enum to class
CTLalit Feb 27, 2025
6d69bfe
feat(SDK-4449) fixes hms sdk compilation problems
CTLalit Feb 27, 2025
dcfe3a5
feat(SDK-4450) unwraps if else which is always true
CTLalit Feb 27, 2025
42c9f59
feat(SDK-4450) fixes threading
CTLalit Feb 27, 2025
30ffbdd
feat(SDK-4451) allows appending different providers via instance config
CTLalit Feb 27, 2025
1d17a0c
feat(SDK-4451) fixes ctinstanceconfig via copy constructor
CTLalit Feb 28, 2025
a603d4c
chore(SDK-4451) moves constants related to config in correct place
CTLalit Feb 28, 2025
33868c3
chore(SDK-4447) fixes typo
CTLalit Feb 28, 2025
e7a9a7b
feat(SDK-4452) passes pushtype in NotificationHandler
CTLalit Feb 28, 2025
6d19ac5
chore(SDK-4447) removes huawei keyword
CTLalit Feb 28, 2025
25a42f0
feat(SDK-4452) adds methods for utility
CTLalit Mar 7, 2025
991347e
feat(SDK-4481) adds methods for utility
CTLalit Mar 7, 2025
465b084
feat(SDK-4481) adds provider definition from manifest
CTLalit Mar 7, 2025
69a6235
feat(SDK-4481) pr comments + test cases
CTLalit Mar 7, 2025
8548a61
feat(SDK-4481) pr comments
CTLalit Mar 7, 2025
a3bb727
feat(SDK-4481) pr comments
CTLalit Mar 7, 2025
f463d7b
feat(SDK-4481) fixes correct strings
CTLalit Mar 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions clevertap-core/consumer-rules.pro
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# For CleverTap SDK's
-keep class com.clevertap.android.sdk.pushnotification.fcm.FcmPushProvider{*;}
-keep class com.clevertap.android.hms.HmsPushProvider{*;}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be added to the documentation or consumer rules of HMS SDK

-keep class com.google.firebase.messaging.FirebaseMessagingService{*;}
-keep class com.clevertap.android.sdk.pushnotification.CTNotificationIntentService{*;}
-keep class com.google.android.exoplayer2.ExoPlayer{*;}
Expand All @@ -15,6 +14,5 @@
public static final ** CREATOR;
}
-dontwarn com.clevertap.android.sdk.**
-dontwarn com.baidu.**
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package com.clevertap.android.sdk;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Application;
import android.os.Build;
import android.os.Bundle;

import androidx.annotation.NonNull;

import com.clevertap.android.sdk.pushnotification.PushType;

import java.util.List;

/**
* Class for handling activity lifecycle events
*/
Expand All @@ -14,55 +18,60 @@ public final class ActivityLifecycleCallback {

public static boolean registered = false;
private static String cleverTapId = null;
private static List<PushType> pushTypes = null;
private static final Application.ActivityLifecycleCallbacks lifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
if (cleverTapId != null) {
CleverTapAPI.onActivityCreated(activity, cleverTapId);
} else {
CleverTapAPI.onActivityCreated(activity);
}
public void onActivityCreated(@NonNull Activity activity, Bundle bundle) {
CleverTapAPI.onActivityCreated(activity, cleverTapId, pushTypes);
}

@Override
public void onActivityDestroyed(Activity activity) {
public void onActivityDestroyed(@NonNull Activity activity) {
}

@Override
public void onActivityPaused(Activity activity) {
public void onActivityPaused(@NonNull Activity activity) {
CleverTapAPI.onActivityPaused();
}

@Override
public void onActivityResumed(Activity activity) {
public void onActivityResumed(@NonNull Activity activity) {
if (cleverTapId != null) {
CleverTapAPI.onActivityResumed(activity, cleverTapId);
CleverTapAPI.onActivityResumed(activity, cleverTapId, pushTypes);
} else {
CleverTapAPI.onActivityResumed(activity);
}
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle bundle) {
}

@Override
public void onActivityStarted(Activity activity) {
public void onActivityStarted(@NonNull Activity activity) {
}

@Override
public void onActivityStopped(Activity activity) {
public void onActivityStopped(@NonNull Activity activity) {
}
};

/**
* Enables lifecycle callbacks for Android devices
*
* @param application App's Application object
*/
public static void register(android.app.Application application) {
register(application, null);
}

/**
* Enables lifecycle callbacks for Android devices
*
* @param application App's Application object
* @param cleverTapID Custom CleverTap ID
*/
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public static void register(android.app.Application application, final String cleverTapID) {
if (application == null) {
Logger.i("Application instance is null/system API is too old");
Expand All @@ -82,13 +91,27 @@ public static void register(android.app.Application application, final String cl
Logger.i("Activity Lifecycle Callback successfully registered");
}

/**
* Enables lifecycle callbacks for Android devices
*
* @param application App's Application object
*/
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public static void register(android.app.Application application) {
register(application, null);
public static void register(
android.app.Application application,
final String cleverTapID,
final List<PushType> pushTypes
) {
if (application == null) {
Logger.i("Application instance is null/system API is too old");
return;
}

if (registered) {
Logger.v("Lifecycle callbacks have already been registered");
return;
}

ActivityLifecycleCallback.cleverTapId = cleverTapID;
ActivityLifecycleCallback.pushTypes = pushTypes;
ActivityLifecycleCallback.registered = true;

application.unregisterActivityLifecycleCallbacks(lifecycleCallbacks);
application.registerActivityLifecycleCallbacks(lifecycleCallbacks);
Logger.i("Activity Lifecycle Callback successfully registered");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import static com.clevertap.android.sdk.Utils.runOnUiThread;
import static com.clevertap.android.sdk.pushnotification.PushConstants.FCM_LOG_TAG;
import static com.clevertap.android.sdk.pushnotification.PushConstants.LOG_TAG;
import static com.clevertap.android.sdk.pushnotification.PushConstants.PushType.FCM;
import static com.clevertap.android.sdk.pushnotification.PushType.FCM;

import android.annotation.SuppressLint;
import android.app.Activity;
Expand Down Expand Up @@ -66,7 +66,7 @@
import com.clevertap.android.sdk.pushnotification.CoreNotificationRenderer;
import com.clevertap.android.sdk.pushnotification.INotificationRenderer;
import com.clevertap.android.sdk.pushnotification.NotificationInfo;
import com.clevertap.android.sdk.pushnotification.PushConstants.PushType;
import com.clevertap.android.sdk.pushnotification.PushType;
import com.clevertap.android.sdk.pushnotification.amp.CTPushAmpListener;
import com.clevertap.android.sdk.task.CTExecutorFactory;
import com.clevertap.android.sdk.task.Task;
Expand Down Expand Up @@ -779,14 +779,18 @@ public static void setDebugLevel(LogLevel level) {
* @return The {@link CleverTapAPI} object
*/
@SuppressWarnings("WeakerAccess")
public static CleverTapAPI getDefaultInstance(Context context, String cleverTapID) {
public static CleverTapAPI getDefaultInstance(
Context context,
String cleverTapID,
List<PushType> pushTypes
) {
// For Google Play Store/Android Studio tracking
sdkVersion = BuildConfig.SDK_VERSION_STRING;

if (defaultConfig != null) {
return instanceWithConfig(context, defaultConfig, cleverTapID);
} else {
defaultConfig = getDefaultConfig(context);
defaultConfig = getDefaultConfig(context, pushTypes);
if (defaultConfig != null) {
return instanceWithConfig(context, defaultConfig, cleverTapID);
}
Expand All @@ -803,7 +807,20 @@ public static CleverTapAPI getDefaultInstance(Context context, String cleverTapI
@SuppressWarnings("WeakerAccess")
public static @Nullable
CleverTapAPI getDefaultInstance(Context context) {
return getDefaultInstance(context, null);
return getDefaultInstance(context, null, null);
}

/**
* Returns the default shared instance of the CleverTap SDK, appends the given push types to
* the providers for CleverTap push.
*
* @param context Application context
* @return The {@link CleverTapAPI} object
*/
@SuppressWarnings("WeakerAccess")
public static @Nullable
CleverTapAPI getDefaultInstance(Context context, List<PushType> pushTypes) {
return getDefaultInstance(context, null, pushTypes);
}

private static CleverTapAPI fromAccountId(final Context context, final String _accountId) {
Expand Down Expand Up @@ -981,13 +998,18 @@ public static void onActivityPaused() {

@SuppressWarnings("WeakerAccess")
public static void onActivityResumed(Activity activity) {
onActivityResumed(activity, null);
onActivityResumed(activity, null, null);
}

@SuppressWarnings("WeakerAccess")
public static void onActivityResumed(Activity activity, String cleverTapID) {
public static void onActivityResumed(Activity activity, String cleverTapID, List<PushType> pushTypes) {
if (instances == null) {
CleverTapAPI.createInstanceIfAvailable(activity.getApplicationContext(), null, cleverTapID);
CleverTapAPI.createInstanceIfAvailable(
activity.getApplicationContext(),
null,
cleverTapID,
pushTypes
);
}

CoreMetaData.setAppForeground(true);
Expand Down Expand Up @@ -2359,20 +2381,6 @@ public CTProductConfigController productConfig() {
return coreState.getCtProductConfigController(context);
}

/**
* Sends the Baidu registration ID to CleverTap.
*
* @param regId The Baidu registration ID
* @param register Boolean indicating whether to register
* or not for receiving push messages from CleverTap.
* Set this to true to receive push messages from CleverTap,
* and false to not receive any messages from CleverTap.
*/
@SuppressWarnings("unused")
public void pushBaiduRegistrationId(String regId, boolean register) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are used by hybrids, can proably be refactored to pushRegistrationId(id, register, pushType)

coreState.getPushProviders().handleToken(regId, PushType.BPS, register);
}

/**
* Push Charged event, which describes a purchase made.
*
Expand Down Expand Up @@ -2518,20 +2526,6 @@ public Future<?> pushGeofenceEnteredEvent(JSONObject geofenceProperties) {
.raiseEventForGeofences(Constants.GEOFENCE_ENTERED_EVENT_NAME, geofenceProperties);
}

/**
* Sends the Huawei registration ID to CleverTap.
*
* @param regId The Huawei registration ID
* @param register Boolean indicating whether to register
* or not for receiving push messages from CleverTap.
* Set this to true to receive push messages from CleverTap,
* and false to not receive any messages from CleverTap.
*/
@SuppressWarnings("unused")
public void pushHuaweiRegistrationId(String regId, boolean register) {
coreState.getPushProviders().handleToken(regId, PushType.HPS, register);
}

/**
* Pushes the Notification Clicked event for App Inbox to CleverTap.
*
Expand Down Expand Up @@ -3091,29 +3085,15 @@ private void manifestAsyncValidation() {
});
}

/**
* Sends the ADM registration ID to CleverTap.
*
* @param token The ADM registration ID
* @param register Boolean indicating whether to register
* or not for receiving push messages from CleverTap.
* Set this to true to receive push messages from CleverTap,
* and false to not receive any messages from CleverTap.
*/
@SuppressWarnings("unused")
private void pushAmazonRegistrationId(String token, boolean register) {
coreState.getPushProviders().handleToken(token, PushType.ADM, register);
}

static void onActivityCreated(Activity activity) {
onActivityCreated(activity, null);
onActivityCreated(activity, null, null);
}

// static lifecycle callbacks
static void onActivityCreated(Activity activity, String cleverTapID) {
static void onActivityCreated(Activity activity, String cleverTapID, List<PushType> pushTypes) {
// make sure we have at least the default instance created here.
if (instances == null) {
CleverTapAPI.createInstanceIfAvailable(activity.getApplicationContext(), null, cleverTapID);
CleverTapAPI.createInstanceIfAvailable(activity.getApplicationContext(), null, cleverTapID, pushTypes);
}

if (instances == null) {
Expand Down Expand Up @@ -3178,15 +3158,20 @@ static void onActivityCreated(Activity activity, String cleverTapID) {
}

private static CleverTapAPI createInstanceIfAvailable(Context context, String _accountId) {
return createInstanceIfAvailable(context, _accountId, null);
return createInstanceIfAvailable(context, _accountId, null, null);
}

private static @Nullable
CleverTapAPI createInstanceIfAvailable(Context context, String _accountId, String cleverTapID) {
CleverTapAPI createInstanceIfAvailable(
Context context,
String _accountId,
String cleverTapID,
List<PushType> pushTypes
) {
try {
if (_accountId == null) {
try {
return CleverTapAPI.getDefaultInstance(context, cleverTapID);
return CleverTapAPI.getDefaultInstance(context, cleverTapID, pushTypes);
} catch (Throwable t) {
Logger.v("Error creating shared Instance: ", t.getCause());
return null;
Expand Down Expand Up @@ -3232,7 +3217,10 @@ public static ArrayList<CleverTapAPI> getAvailableInstances(Context context) {
* @param context The Android context
* @return The {@link CleverTapInstanceConfig} object
*/
private static CleverTapInstanceConfig getDefaultConfig(Context context) {
private static CleverTapInstanceConfig getDefaultConfig(
Context context,
@Nullable List<PushType> pushTypes
) {
ManifestInfo manifest = ManifestInfo.getInstance(context);
String accountId = manifest.getAccountId();
String accountToken = manifest.getAcountToken();
Expand All @@ -3248,9 +3236,16 @@ private static CleverTapInstanceConfig getDefaultConfig(Context context) {
Logger.i("Account Region not specified in the AndroidManifest - using default region");
}

// todo lp pass manifest info here
// todo : pass manifest info here
CleverTapInstanceConfig defaultInstanceConfig = CleverTapInstanceConfig.createDefaultInstance(context, accountId, accountToken, accountRegion);

if (pushTypes != null) {
for (PushType pushType : pushTypes) {
defaultInstanceConfig.addPushType(pushType);
}
}

// todo : check if these re-assignments are needed, already added in manifest parsing
if (proxyDomain != null && !proxyDomain.trim().isEmpty()) {
defaultInstanceConfig.setProxyDomain(proxyDomain);
}
Expand Down
Loading
Loading