@@ -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 }
0 commit comments