66import butterknife .BindView ;
77import butterknife .ButterKnife ;
88import fr .free .nrw .commons .R ;
9+ import com .facebook .drawee .drawable .ProgressBarDrawable ;
910import fr .free .nrw .commons .media .zoomControllers .zoomable .DoubleTapGestureListener ;
1011import fr .free .nrw .commons .media .zoomControllers .zoomable .ZoomableDraweeView ;
1112import timber .log .Timber ;
1213
1314import android .graphics .Bitmap ;
1415import android .graphics .BitmapFactory ;
16+ import android .graphics .drawable .Animatable ;
1517import android .net .Uri ;
1618import android .os .Bundle ;
1719import com .facebook .drawee .backends .pipeline .Fresco ;
20+ import com .facebook .drawee .controller .BaseControllerListener ;
21+ import com .facebook .drawee .controller .ControllerListener ;
22+ import com .facebook .drawee .drawable .ScalingUtils ;
23+ import com .facebook .drawee .generic .GenericDraweeHierarchy ;
24+ import com .facebook .drawee .generic .GenericDraweeHierarchyBuilder ;
1825import com .facebook .drawee .interfaces .DraweeController ;
1926import android .view .LayoutInflater ;
2027import android .view .View ;
2128import android .view .ViewGroup ;
29+ import android .widget .ProgressBar ;
2230
2331import com .facebook .drawee .view .SimpleDraweeView ;
32+ import com .facebook .imagepipeline .image .ImageInfo ;
2433import com .github .chrisbanes .photoview .PhotoView ;
2534
2635import java .io .InputStream ;
@@ -32,6 +41,8 @@ public class ZoomableActivity extends AppCompatActivity {
3241
3342 @ BindView (R .id .zoomable )
3443 ZoomableDraweeView photo ;
44+ @ BindView (R .id .zoom_progress_bar )
45+ ProgressBar spinner ;
3546
3647 @ Override
3748 protected void onCreate (Bundle savedInstanceState ) {
@@ -48,13 +59,42 @@ protected void onCreate(Bundle savedInstanceState) {
4859 init ();
4960 }
5061
62+ /**
63+ * Two types of loading indicators have been added to the zoom activity:
64+ * 1. An Indeterminate spinner for showing the time lapsed between dispatch of the image request
65+ * and starting to receiving the image.
66+ * 2. ProgressBarDrawable that reflects how much image has been downloaded
67+ */
68+ private final ControllerListener loadingListener = new BaseControllerListener <ImageInfo >() {
69+ @ Override
70+ public void onSubmit (String id , Object callerContext ) {
71+ // Sometimes the spinner doesn't appear when rapidly switching between images, this fixes that
72+ spinner .setVisibility (View .VISIBLE );
73+ }
74+
75+ @ Override
76+ public void onIntermediateImageSet (String id , @ Nullable ImageInfo imageInfo ) {
77+ spinner .setVisibility (View .GONE );
78+ }
79+ @ Override
80+ public void onFinalImageSet (String id , @ Nullable ImageInfo imageInfo , @ Nullable Animatable animatable ) {
81+ spinner .setVisibility (View .GONE );
82+ }
83+ };
5184 private void init () {
5285 if ( imageUri != null ) {
86+ GenericDraweeHierarchy hierarchy = GenericDraweeHierarchyBuilder .newInstance (getResources ())
87+ .setActualImageScaleType (ScalingUtils .ScaleType .FIT_CENTER )
88+ .setProgressBarImage (new ProgressBarDrawable ())
89+ .setProgressBarImageScaleType (ScalingUtils .ScaleType .FIT_CENTER )
90+ .build ();
91+ photo .setHierarchy (hierarchy );
5392 photo .setAllowTouchInterceptionWhileZoomed (true );
5493 photo .setIsLongpressEnabled (false );
5594 photo .setTapListener (new DoubleTapGestureListener (photo ));
5695 DraweeController controller = Fresco .newDraweeControllerBuilder ()
5796 .setUri (imageUri )
97+ .setControllerListener (loadingListener )
5898 .build ();
5999 photo .setController (controller );
60100 }
0 commit comments