Skip to content
Open
Show file tree
Hide file tree
Changes from 4 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
7 changes: 7 additions & 0 deletions clevertap-core/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@
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: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,58 @@
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;

public class FragmentHostActivity extends AppCompatActivity {

private static boolean hosting = false;
public static boolean isHosting() { return hosting; }

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) {
super.onCreate(b);
hosting = true;

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

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

// 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 onDestroy() {
super.onDestroy();
hosting = 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.addFirst(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>