Hide spinners if airplane mode enabled whilst browsing images

This change ensures loading spinners are hidden if the image cannot be
loaded, such as when we enter airplane mode.

The behaviour is poor upon returning from airplane mode - spinners do
not show immediately, and loads may not kick off until the user scrolls
around.

Bug: 8407579

Change-Id: If11b4f9a453eeb2f381a77a860fb32c87dbd3b13
diff --git a/src/com/android/ex/photo/loaders/PhotoBitmapLoader.java b/src/com/android/ex/photo/loaders/PhotoBitmapLoader.java
index c29b14f..ca92050 100644
--- a/src/com/android/ex/photo/loaders/PhotoBitmapLoader.java
+++ b/src/com/android/ex/photo/loaders/PhotoBitmapLoader.java
@@ -51,13 +51,11 @@
         if (context != null && mPhotoUri != null) {
             final ContentResolver resolver = context.getContentResolver();
             try {
-                Bitmap bitmap = ImageUtils.createLocalBitmap(resolver, Uri.parse(mPhotoUri),
+                result = ImageUtils.createLocalBitmap(resolver, Uri.parse(mPhotoUri),
                         PhotoViewFragment.sPhotoSize);
-                if (bitmap != null) {
-                    bitmap.setDensity(DisplayMetrics.DENSITY_MEDIUM);
+                if (result.bitmap != null) {
+                    result.bitmap.setDensity(DisplayMetrics.DENSITY_MEDIUM);
                 }
-                result.status = BitmapResult.STATUS_SUCCESS;
-                result.bitmap = bitmap;
             } catch (UnsupportedOperationException ex) {
                 // We got image bytes, but unable to decode to a Bitmap
                 result.status = BitmapResult.STATUS_EXCEPTION;
@@ -170,7 +168,7 @@
         }
     }
 
-    public class BitmapResult {
+    public static class BitmapResult {
         public static final int STATUS_SUCCESS = 0;
         public static final int STATUS_EXCEPTION = 1;
 
diff --git a/src/com/android/ex/photo/util/ImageUtils.java b/src/com/android/ex/photo/util/ImageUtils.java
index 9c7189c..0db064e 100644
--- a/src/com/android/ex/photo/util/ImageUtils.java
+++ b/src/com/android/ex/photo/util/ImageUtils.java
@@ -29,7 +29,7 @@
 import android.util.Log;
 
 import com.android.ex.photo.PhotoViewActivity;
-import com.android.ex.photo.util.Exif;
+import com.android.ex.photo.loaders.PhotoBitmapLoader.BitmapResult;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -97,15 +97,17 @@
      *
      * @return The new bitmap or null
      */
-    public static Bitmap createLocalBitmap(ContentResolver resolver, Uri uri, int maxSize) {
+    public static BitmapResult createLocalBitmap(ContentResolver resolver, Uri uri, int maxSize) {
         // TODO: make this method not download the image for both getImageBounds and decodeStream
+        BitmapResult result = new BitmapResult();
         InputStream inputStream = null;
         try {
             final BitmapFactory.Options opts = new BitmapFactory.Options();
             final Point bounds = getImageBounds(resolver, uri);
             inputStream = openInputStream(resolver, uri);
             if (bounds == null || inputStream == null) {
-                return null;
+                result.status = BitmapResult.STATUS_EXCEPTION;
+                return result;
             }
             opts.inSampleSize = Math.max(bounds.x / maxSize, bounds.y / maxSize);
 
@@ -114,16 +116,18 @@
             // Correct thumbnail orientation as necessary
             // TODO: Fix rotation if it's actually a problem
             //return rotateBitmap(resolver, uri, decodedBitmap);
-            return decodedBitmap;
+            result.bitmap = decodedBitmap;
+            result.status = BitmapResult.STATUS_SUCCESS;
+            return result;
 
         } catch (FileNotFoundException exception) {
             // Do nothing - the photo will appear to be missing
         } catch (IOException exception) {
-            // Do nothing - the photo will appear to be missing
+            result.status = BitmapResult.STATUS_EXCEPTION;
         } catch (IllegalArgumentException exception) {
             // Do nothing - the photo will appear to be missing
         } catch (SecurityException exception) {
-            // Do nothing - the photo will appear to be missing
+            result.status = BitmapResult.STATUS_EXCEPTION;
         } finally {
             try {
                 if (inputStream != null) {
@@ -132,7 +136,7 @@
             } catch (IOException ignore) {
             }
         }
-        return null;
+        return result;
     }
 
     /**