23
23
import androidx .fragment .app .FragmentManager ;
24
24
import androidx .fragment .app .FragmentTransaction ;
25
25
import com .bumptech .glide .Glide ;
26
+ import com .bumptech .glide .GlideBuilder ;
26
27
import com .bumptech .glide .GlideBuilder .WaitForFramesAfterTrimMemory ;
27
28
import com .bumptech .glide .GlideExperiments ;
28
29
import com .bumptech .glide .RequestManager ;
@@ -70,6 +71,7 @@ public class RequestManagerRetriever implements Handler.Callback {
70
71
private final Handler handler ;
71
72
72
73
private final RequestManagerFactory factory ;
74
+ private final GlideExperiments experiments ;
73
75
74
76
// Objects used to find Fragments and Activities containing views.
75
77
private final ArrayMap <View , Fragment > tempViewToSupportFragment = new ArrayMap <>();
@@ -79,12 +81,14 @@ public class RequestManagerRetriever implements Handler.Callback {
79
81
// Fragment/Activity extraction logic that already exists here. It's gross, but less likely to
80
82
// break.
81
83
private final FrameWaiter frameWaiter ;
84
+ private final LifecycleRequestManagerRetriever lifecycleRequestManagerRetriever ;
82
85
83
86
public RequestManagerRetriever (
84
87
@ Nullable RequestManagerFactory factory , GlideExperiments experiments ) {
85
88
this .factory = factory != null ? factory : DEFAULT_FACTORY ;
89
+ this .experiments = experiments ;
86
90
handler = new Handler (Looper .getMainLooper (), this /* Callback */ );
87
-
91
+ lifecycleRequestManagerRetriever = new LifecycleRequestManagerRetriever ( this . factory );
88
92
frameWaiter = buildFrameWaiter (experiments );
89
93
}
90
94
@@ -149,34 +153,60 @@ public RequestManager get(@NonNull Context context) {
149
153
public RequestManager get (@ NonNull FragmentActivity activity ) {
150
154
if (Util .isOnBackgroundThread ()) {
151
155
return get (activity .getApplicationContext ());
156
+ }
157
+ assertNotDestroyed (activity );
158
+ frameWaiter .registerSelf (activity );
159
+ FragmentManager fm = activity .getSupportFragmentManager ();
160
+ boolean isActivityVisible = isActivityVisible (activity );
161
+ if (useLifecycleInsteadOfInjectingFragments ()) {
162
+ Context context = activity .getApplicationContext ();
163
+ Glide glide = Glide .get (context );
164
+ return lifecycleRequestManagerRetriever .getOrCreate (
165
+ context ,
166
+ glide ,
167
+ activity .getLifecycle (),
168
+ activity .getSupportFragmentManager (),
169
+ isActivityVisible );
152
170
} else {
153
- assertNotDestroyed (activity );
154
- frameWaiter .registerSelf (activity );
155
- FragmentManager fm = activity .getSupportFragmentManager ();
156
- return supportFragmentGet (activity , fm , /*parentHint=*/ null , isActivityVisible (activity ));
171
+ return supportFragmentGet (activity , fm , /*parentHint=*/ null , isActivityVisible );
157
172
}
158
173
}
159
174
175
+ private boolean useLifecycleInsteadOfInjectingFragments () {
176
+ return experiments .isEnabled (GlideBuilder .UseLifecycleInsteadOfInjectingFragments .class );
177
+ }
178
+
160
179
@ NonNull
161
180
public RequestManager get (@ NonNull Fragment fragment ) {
162
181
Preconditions .checkNotNull (
163
182
fragment .getContext (),
164
183
"You cannot start a load on a fragment before it is attached or after it is destroyed" );
165
184
if (Util .isOnBackgroundThread ()) {
166
185
return get (fragment .getContext ().getApplicationContext ());
186
+ }
187
+ // In some unusual cases, it's possible to have a Fragment not hosted by an activity. There's
188
+ // not all that much we can do here. Most apps will be started with a standard activity. If
189
+ // we manage not to register the first frame waiter for a while, the consequences are not
190
+ // catastrophic, we'll just use some extra memory.
191
+ if (fragment .getActivity () != null ) {
192
+ frameWaiter .registerSelf (fragment .getActivity ());
193
+ }
194
+ FragmentManager fm = fragment .getChildFragmentManager ();
195
+ Context context = fragment .getContext ();
196
+ if (useLifecycleInsteadOfInjectingFragments ()) {
197
+ Glide glide = Glide .get (context .getApplicationContext ());
198
+ return lifecycleRequestManagerRetriever .getOrCreate (
199
+ context , glide , fragment .getLifecycle (), fm , fragment .isVisible ());
167
200
} else {
168
- // In some unusual cases, it's possible to have a Fragment not hosted by an activity. There's
169
- // not all that much we can do here. Most apps will be started with a standard activity. If
170
- // we manage not to register the first frame waiter for a while, the consequences are not
171
- // catastrophic, we'll just use some extra memory.
172
- if (fragment .getActivity () != null ) {
173
- frameWaiter .registerSelf (fragment .getActivity ());
174
- }
175
- FragmentManager fm = fragment .getChildFragmentManager ();
176
- return supportFragmentGet (fragment .getContext (), fm , fragment , fragment .isVisible ());
201
+ return supportFragmentGet (context , fm , fragment , fragment .isVisible ());
177
202
}
178
203
}
179
204
205
+ /**
206
+ * @deprecated Use androidx Activities instead (ie {@link FragmentActivity}, or
207
+ * {@link androidx.appcompat.app.AppCompatActivity}).
208
+ */
209
+ @ Deprecated
180
210
@ SuppressWarnings ("deprecation" )
181
211
@ NonNull
182
212
public RequestManager get (@ NonNull Activity activity ) {
@@ -354,6 +384,9 @@ private static void assertNotDestroyed(@NonNull Activity activity) {
354
384
}
355
385
}
356
386
387
+ /**
388
+ * @deprecated Use androidx fragments instead: {@link Fragment}.
389
+ */
357
390
@ SuppressWarnings ("deprecation" )
358
391
@ Deprecated
359
392
@ NonNull
@@ -378,6 +411,10 @@ public RequestManager get(@NonNull android.app.Fragment fragment) {
378
411
}
379
412
}
380
413
414
+ /**
415
+ * @deprecated Use androidx activities like {@link FragmentActivity} or
416
+ * {@link androidx.appcompat.app.AppCompatActivity} instead.
417
+ */
381
418
@ SuppressWarnings ("deprecation" )
382
419
@ Deprecated
383
420
@ NonNull
@@ -407,7 +444,7 @@ private RequestManagerFragment getRequestManagerFragment(
407
444
return current ;
408
445
}
409
446
410
- @ SuppressWarnings ({ "deprecation" , "DeprecatedIsStillUsed" } )
447
+ @ SuppressWarnings ("deprecation" )
411
448
@ Deprecated
412
449
@ NonNull
413
450
private RequestManager fragmentGet (
0 commit comments