Fix ApplicationWrapper activity weakRef leak (#1301)

Summary:
Fix for https://github.com/facebook/flipper/issues/1300

The weak refs were not being cleared in two cases:

- On config changes, isFinishing() would be false in onPause()
- When calling finish() from Activity.onCreate(), onPause() isn't guaranteed to be called.

## Changelog
Pull Request resolved: https://github.com/facebook/flipper/pull/1301

Reviewed By: mweststrate

Differential Revision: D22286182

Pulled By: passy

fbshipit-source-id: 948d1d9b2145b6526c0030cf537330409ff7f8c4
This commit is contained in:
pyricau@users.noreply.github.com
2020-06-30 09:44:17 -07:00
committed by Facebook GitHub Bot
parent c8af6da236
commit cfd8662c12
2 changed files with 26 additions and 14 deletions

View File

@@ -54,19 +54,7 @@ public class ApplicationWrapper implements Application.ActivityLifecycleCallback
public void onActivityResumed(Activity activity) {} public void onActivityResumed(Activity activity) {}
@Override @Override
public void onActivityPaused(Activity activity) { public void onActivityPaused(Activity activity) {}
if (activity.isFinishing()) {
final Iterator<WeakReference<Activity>> activityIterator = mActivities.iterator();
while (activityIterator.hasNext()) {
if (activityIterator.next().get() == activity) {
activityIterator.remove();
}
}
notifyListener();
}
}
@Override @Override
public void onActivityStopped(Activity activity) {} public void onActivityStopped(Activity activity) {}
@@ -75,7 +63,16 @@ public class ApplicationWrapper implements Application.ActivityLifecycleCallback
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {} public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
@Override @Override
public void onActivityDestroyed(Activity activity) {} public void onActivityDestroyed(Activity activity) {
final Iterator<WeakReference<Activity>> activityIterator = mActivities.iterator();
while (activityIterator.hasNext()) {
if (activityIterator.next().get() == activity) {
activityIterator.remove();
}
}
notifyListener();
}
private void notifyListener() { private void notifyListener() {
if (mListener != null) { if (mListener != null) {

View File

@@ -85,6 +85,21 @@ public class ApplicationWrapperTest {
Mockito.when(activity2.isFinishing()).thenReturn(true); Mockito.when(activity2.isFinishing()).thenReturn(true);
mCallbacks.onActivityPaused(activity2); mCallbacks.onActivityPaused(activity2);
assertThat(mWrapper.getActivityStack().size(), equalTo(2));
assertThat(mWrapper.getActivityStack().get(0), equalTo(activity1));
}
@Test
public void testActivityDestroyed() {
final Activity activity1 = Mockito.mock(Activity.class);
mCallbacks.onActivityCreated(activity1, Mockito.mock(Bundle.class));
final Activity activity2 = Mockito.mock(Activity.class);
mCallbacks.onActivityCreated(activity2, Mockito.mock(Bundle.class));
Mockito.when(activity2.isFinishing()).thenReturn(true);
mCallbacks.onActivityDestroyed(activity2);
assertThat(mWrapper.getActivityStack().size(), equalTo(1)); assertThat(mWrapper.getActivityStack().size(), equalTo(1));
assertThat(mWrapper.getActivityStack().get(0), equalTo(activity1)); assertThat(mWrapper.getActivityStack().get(0), equalTo(activity1));
} }