Skip to content

Commit 0483b0d

Browse files
authored
Fix FIAM Display lifecycle interactions (#1550)
1 parent 9d75839 commit 0483b0d

File tree

6 files changed

+172
-115
lines changed

6 files changed

+172
-115
lines changed

firebase-inappmessaging-display/firebase-inappmessaging-display.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ android {
6161

6262
dependencies {
6363
implementation project(':firebase-common')
64-
implementation project(':firebase-inappmessaging')
6564
implementation project(':firebase-components')
65+
implementation project(':firebase-inappmessaging')
6666

6767
implementation('com.google.firebase:firebase-measurement-connector:18.0.0') {
6868
exclude group: 'com.google.firebase', module: 'firebase-common'

firebase-inappmessaging-display/src/main/java/com/google/firebase/inappmessaging/display/FirebaseInAppMessagingDisplay.java

Lines changed: 45 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import android.view.MotionEvent;
2626
import android.view.View;
2727
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
28-
import androidx.annotation.Keep;
2928
import androidx.annotation.NonNull;
3029
import androidx.annotation.Nullable;
3130
import androidx.annotation.VisibleForTesting;
@@ -78,7 +77,6 @@
7877
* <p>To delete the Instance ID and the data associated with it, see {@link
7978
* FirebaseInstallationsApi#delete}.
8079
*/
81-
@Keep
8280
@FirebaseAppScope
8381
public class FirebaseInAppMessagingDisplay extends FirebaseInAppMessagingDisplayImpl {
8482
static final long IMPRESSION_THRESHOLD_MILLIS = 5 * 1000; // 5 seconds is a valid impression
@@ -101,6 +99,8 @@ public class FirebaseInAppMessagingDisplay extends FirebaseInAppMessagingDisplay
10199
private InAppMessage inAppMessage;
102100
private FirebaseInAppMessagingDisplayCallbacks callbacks;
103101

102+
@VisibleForTesting @Nullable String currentlyBoundActivityName;
103+
104104
@Inject
105105
FirebaseInAppMessagingDisplay(
106106
FirebaseInAppMessaging headlessInAppMessaging,
@@ -129,7 +129,6 @@ public class FirebaseInAppMessagingDisplay extends FirebaseInAppMessagingDisplay
129129
* FirebaseApp#getInstance()}
130130
*/
131131
@NonNull
132-
@Keep
133132
public static FirebaseInAppMessagingDisplay getInstance() {
134133
return FirebaseApp.getInstance().get(FirebaseInAppMessagingDisplay.class);
135134
}
@@ -143,7 +142,6 @@ private static int getScreenOrientation(Application app) {
143142
*
144143
* @hide
145144
*/
146-
@Keep
147145
public void testMessage(
148146
Activity activity,
149147
InAppMessage inAppMessage,
@@ -158,7 +156,6 @@ public void testMessage(
158156
*
159157
* @hide
160158
*/
161-
@Keep
162159
public void setFiamListener(FiamListener listener) {
163160
this.fiamListener = listener;
164161
}
@@ -168,79 +165,73 @@ public void setFiamListener(FiamListener listener) {
168165
*
169166
* @hide
170167
*/
171-
@Keep
172168
public void clearFiamListener() {
173169
this.fiamListener = null;
174170
}
175171

176172
/**
177-
* Clears fiam listener
173+
* Bind FIAM listener on Activity resume.
178174
*
179175
* @hide
180176
*/
181-
@Keep
182177
@Override
183-
public void onActivityStarted(final Activity activity) {
184-
super.onActivityStarted(activity);
185-
// Register FIAM listener with the headless sdk.
186-
headlessInAppMessaging.setMessageDisplayComponent(
187-
(iam, cb) -> {
188-
// When we are in the middle of showing a message, we ignore other notifications these
189-
// messages will be fired when the corresponding events happen the next time.
190-
if (inAppMessage != null || headlessInAppMessaging.areMessagesSuppressed()) {
191-
Logging.logd("Active FIAM exists. Skipping trigger");
192-
return;
193-
}
194-
inAppMessage = iam;
195-
callbacks = cb;
196-
showActiveFiam(activity);
197-
});
178+
public void onActivityResumed(Activity activity) {
179+
super.onActivityResumed(activity);
180+
bindFiamToActivity(activity);
198181
}
199182

200183
/**
201-
* Clear fiam listener on activity paused
184+
* Clear FIAM listener on activity paused
202185
*
203186
* @hide
204187
*/
205-
@Keep
206188
@Override
207189
public void onActivityPaused(Activity activity) {
208-
// clear all state scoped to activity and dismiss fiam
209-
headlessInAppMessaging.clearDisplayListener();
210-
imageLoader.cancelTag(activity.getClass());
211-
removeDisplayedFiam(activity);
190+
unbindFiamFromActivity(activity);
191+
headlessInAppMessaging.removeAllListeners();
212192
super.onActivityPaused(activity);
213193
}
214194

215-
/**
216-
* Clear fiam listener on activity destroyed
217-
*
218-
* @hide
219-
*/
220-
@Keep
221-
@Override
222-
public void onActivityDestroyed(Activity activity) {
223-
// clear all state scoped to activity and dismiss fiam
224-
headlessInAppMessaging.clearDisplayListener();
225-
imageLoader.cancelTag(activity.getClass());
226-
removeDisplayedFiam(activity);
227-
super.onActivityDestroyed(activity);
228-
}
229-
230-
/**
231-
* Clear fiam listener on activity resumed
232-
*
233-
* @hide
234-
*/
235-
@Keep
236-
@Override
237-
public void onActivityResumed(Activity activity) {
238-
super.onActivityResumed(activity);
195+
private void bindFiamToActivity(Activity activity) {
196+
// If we have no currently bound activity or are currently bound to a different activity then
197+
// bind to this new activity.
198+
if (currentlyBoundActivityName == null
199+
|| !currentlyBoundActivityName.equals(activity.getLocalClassName())) {
200+
Logging.logi("Binding to activity: " + activity.getLocalClassName());
201+
headlessInAppMessaging.setMessageDisplayComponent(
202+
(iam, cb) -> {
203+
// When we are in the middle of showing a message, we ignore other notifications these
204+
// messages will be fired when the corresponding events happen the next time.
205+
if (inAppMessage != null || headlessInAppMessaging.areMessagesSuppressed()) {
206+
Logging.logd("Active FIAM exists. Skipping trigger");
207+
return;
208+
}
209+
inAppMessage = iam;
210+
callbacks = cb;
211+
showActiveFiam(activity);
212+
});
213+
// set the current activity to be the one passed in so that we know not to bind again to the
214+
// same activity
215+
currentlyBoundActivityName = activity.getLocalClassName();
216+
}
239217
if (inAppMessage != null) {
240218
showActiveFiam(activity);
241219
}
242220
}
243221

222+
private void unbindFiamFromActivity(Activity activity) {
223+
// If we are attempting to unbind from an activity, first check to see that we are currently
224+
// bound to it
225+
if (currentlyBoundActivityName != null
226+
&& currentlyBoundActivityName.equals(activity.getLocalClassName())) {
227+
Logging.logi("Unbinding from activity: " + activity.getLocalClassName());
228+
headlessInAppMessaging.clearDisplayListener();
229+
imageLoader.cancelTag(activity.getClass());
230+
removeDisplayedFiam(activity);
231+
currentlyBoundActivityName = null;
232+
}
233+
}
234+
244235
// The current FIAM might be null
245236
@VisibleForTesting
246237
InAppMessage getCurrentInAppMessage() {
@@ -318,8 +309,7 @@ public void onClick(View v) {
318309

319310
Map<Action, View.OnClickListener> actionListeners = new HashMap<>();
320311
// If the message has an action, but not an action url, we dismiss when the action
321-
// button is
322-
// clicked;
312+
// button is clicked
323313
for (Action action : extractActions(inAppMessage)) {
324314

325315
final View.OnClickListener actionListener;

0 commit comments

Comments
 (0)