Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 8 additions & 0 deletions clevertap-core/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@
android:configChanges="keyboardHidden"
android:theme="@style/Theme.AppCompat.DayNight.DarkActionBar" />

<activity
android:name="com.clevertap.android.sdk.FragmentHostActivity"
android:theme="@style/CleverTapFragmentHostTheme"
android:noHistory="true"
android:launchMode="singleTop"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="false" />

<receiver
android:name=".pushnotification.CTPushNotificationReceiver"
android:enabled="true"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.clevertap.android.sdk;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import java.util.concurrent.atomic.AtomicBoolean;

public class FragmentHostActivity extends AppCompatActivity {

private static final AtomicBoolean hosting = new AtomicBoolean(false);

public static boolean isHosting() {
return hosting.get();
}

public static void launch(Activity current) {
Intent intent = new Intent(current, FragmentHostActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
current.startActivity(intent);

// try to supress any transitions
current.overridePendingTransition(0, 0);
}

@Override protected void onCreate(Bundle b) {
hosting.set(true);
super.onCreate(b);

// try to supress any transitions
overridePendingTransition(0, 0);

// try to supress any transitions
getSupportFragmentManager()
.registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() {
@Override
public void onFragmentPreAttached(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Context context) {
f.setEnterTransition(null);
f.setExitTransition(null);
f.setReenterTransition(null);
f.setReturnTransition(null);
}
}, true);
}

@Override protected void onResume() {
super.onResume();
}

@Override protected void onDestroy() {
super.onDestroy();
hosting.set(false);

// try to supress any transitions
overridePendingTransition(0, 0);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.clevertap.android.sdk.ControllerManager;
import com.clevertap.android.sdk.CoreMetaData;
import com.clevertap.android.sdk.DeviceInfo;
import com.clevertap.android.sdk.FragmentHostActivity;
import com.clevertap.android.sdk.InAppNotificationActivity;
import com.clevertap.android.sdk.InAppNotificationListener;
import com.clevertap.android.sdk.Logger;
Expand Down Expand Up @@ -792,6 +793,27 @@ private void showInApp(
return;
}

// if this inAppNotification requires a FragmentActivity and the current
// activity isn't one,
// - insert this notification at the head of the pendingNotifications queue,
// - launch the FragmentHostActivity,
// - when the fragment activity has launched it'll trigger checking
// pendingNotifications again and we can safely render
if (requiresFragmentHost(inAppNotification.getInAppType())) {
Activity act = CoreMetaData.getCurrentActivity();
if (!(act instanceof FragmentActivity)) {
Logger.d(config.getAccountId(),
"Current activity is not a FragmentActivity — deferring in-app & launching FragmentHostActivity");
if (!pendingNotifications.contains(inAppNotification)) {
pendingNotifications.add(0, inAppNotification);
}
if (!FragmentHostActivity.isHosting()) {
FragmentHostActivity.launch(act);
}
return;
}
}

currentlyDisplayingInApp = inAppNotification;

CTInAppBaseFragment inAppFragment = null;
Expand Down Expand Up @@ -872,6 +894,19 @@ private void showInApp(
}
}

private static boolean requiresFragmentHost(CTInAppType type) {
switch (type) {
case CTInAppTypeFooterHTML:
case CTInAppTypeHeaderHTML:
case CTInAppTypeFooter:
case CTInAppTypeHeader:
return true;

default:
return false;
}
}

@WorkerThread
public void onQueueEvent(final String eventName, Map<String, Object> eventProperties, Location userLocation) {
final Map<String, Object> appFieldsWithEventProperties = JsonUtil.mapFromJson(
Expand Down
9 changes: 9 additions & 0 deletions clevertap-core/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CleverTapFragmentHostTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
</resources>