Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit c52d2de

Browse files
committed
Move both of activity and observer into a helper object.
1 parent 68f0c30 commit c52d2de

File tree

2 files changed

+35
-17
lines changed

2 files changed

+35
-17
lines changed

packages/image_picker/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,24 @@ public void onActivityStopped(Activity activity) {
9090
}
9191
}
9292

93+
private class ActivityState {
94+
private final Activity activity;
95+
private final LifeCycleObserver observer;
96+
97+
ActivityState(final Activity activity) {
98+
this.activity = activity;
99+
observer = new LifeCycleObserver(activity);
100+
}
101+
102+
final Activity getActivity() {
103+
return activity;
104+
}
105+
106+
final LifeCycleObserver getObserver() {
107+
return observer;
108+
}
109+
}
110+
93111
static final String METHOD_CALL_IMAGE = "pickImage";
94112
static final String METHOD_CALL_MULTI_IMAGE = "pickMultiImage";
95113
static final String METHOD_CALL_VIDEO = "pickVideo";
@@ -106,10 +124,9 @@ public void onActivityStopped(Activity activity) {
106124
private FlutterPluginBinding pluginBinding;
107125
private ActivityPluginBinding activityBinding;
108126
private Application application;
109-
@VisibleForTesting /*package*/ Activity activity;
110127
// This is null when not using v2 embedding;
111128
private Lifecycle lifecycle;
112-
@VisibleForTesting /*package*/ LifeCycleObserver observer;
129+
private ActivityState activityState;
113130

114131
@SuppressWarnings("deprecation")
115132
public static void registerWith(io.flutter.plugin.common.PluginRegistry.Registrar registrar) {
@@ -138,7 +155,7 @@ public ImagePickerPlugin() {}
138155
@VisibleForTesting
139156
ImagePickerPlugin(final ImagePickerDelegate delegate, final Activity activity) {
140157
this.delegate = delegate;
141-
this.activity = activity;
158+
activityState = new ActivityState(activity);
142159
}
143160

144161
@Override
@@ -183,39 +200,37 @@ private void setup(
183200
final Activity activity,
184201
final PluginRegistry.Registrar registrar,
185202
final ActivityPluginBinding activityBinding) {
186-
this.activity = activity;
187203
this.application = application;
188-
this.delegate = constructDelegate(activity);
204+
delegate = constructDelegate(activity);
205+
activityState = new ActivityState(activity);
189206
channel = new MethodChannel(messenger, CHANNEL);
190207
channel.setMethodCallHandler(this);
191-
observer = new LifeCycleObserver(activity);
192208
if (registrar != null) {
193209
// V1 embedding setup for activity listeners.
194-
application.registerActivityLifecycleCallbacks(observer);
210+
application.registerActivityLifecycleCallbacks(activityState.getObserver());
195211
registrar.addActivityResultListener(delegate);
196212
registrar.addRequestPermissionsResultListener(delegate);
197213
} else {
198214
// V2 embedding setup for activity listeners.
199215
activityBinding.addActivityResultListener(delegate);
200216
activityBinding.addRequestPermissionsResultListener(delegate);
201217
lifecycle = FlutterLifecycleAdapter.getActivityLifecycle(activityBinding);
202-
lifecycle.addObserver(observer);
218+
lifecycle.addObserver(activityState.getObserver());
203219
}
204220
}
205221

206222
private void tearDown() {
207223
activityBinding.removeActivityResultListener(delegate);
208224
activityBinding.removeRequestPermissionsResultListener(delegate);
209225
activityBinding = null;
210-
lifecycle.removeObserver(observer);
226+
lifecycle.removeObserver(activityState.getObserver());
211227
lifecycle = null;
212228
delegate = null;
213229
channel.setMethodCallHandler(null);
214230
channel = null;
215-
application.unregisterActivityLifecycleCallbacks(observer);
231+
application.unregisterActivityLifecycleCallbacks(activityState.getObserver());
216232
application = null;
217-
activity = null;
218-
observer = null;
233+
activityState = null;
219234
}
220235

221236
@VisibleForTesting
@@ -228,6 +243,11 @@ final ImagePickerDelegate constructDelegate(final Activity setupActivity) {
228243
return new ImagePickerDelegate(setupActivity, externalFilesDirectory, imageResizer, cache);
229244
}
230245

246+
@VisibleForTesting
247+
final ActivityState getActivityState() {
248+
return activityState;
249+
}
250+
231251
// MethodChannel.Result wrapper that responds on the platform thread.
232252
private static class MethodResultWrapper implements MethodChannel.Result {
233253
private MethodChannel.Result methodResult;
@@ -275,7 +295,7 @@ public void run() {
275295

276296
@Override
277297
public void onMethodCall(MethodCall call, MethodChannel.Result rawResult) {
278-
if (activity == null) {
298+
if (activityState.getActivity() == null) {
279299
rawResult.error("no_activity", "image_picker plugin requires a foreground activity.", null);
280300
return;
281301
}

packages/image_picker/image_picker/android/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,10 @@ public void onDetachedFromActivity_ShouldReleaseActivity() {
8282

8383
plugin.onAttachedToEngine(mockPluginBinding);
8484
plugin.onAttachedToActivity(mockActivityBinding);
85-
assertNotNull(plugin.activity);
86-
assertNotNull(plugin.observer);
85+
assertNotNull(plugin.getActivityState());
8786

8887
plugin.onDetachedFromActivity();
89-
assertNull(plugin.activity);
90-
assertNull(plugin.observer);
88+
assertNull(plugin.getActivityState());
9189
}
9290

9391
@Test

0 commit comments

Comments
 (0)