Browse Source

Support reading image resources on android

closes #2831
Guy Carmeli 6 years ago
parent
commit
bca4bbc7fe

+ 43
- 12
lib/android/app/src/main/java/com/reactnativenavigation/utils/ImageLoader.java View File

@@ -10,6 +10,8 @@ import android.os.StrictMode;
10 10
 import android.support.annotation.NonNull;
11 11
 import android.support.annotation.Nullable;
12 12
 
13
+import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper;
14
+import com.reactnativenavigation.BuildConfig;
13 15
 import com.reactnativenavigation.NavigationApplication;
14 16
 
15 17
 import java.io.FileNotFoundException;
@@ -19,27 +21,56 @@ import java.net.URL;
19 21
 
20 22
 public class ImageLoader {
21 23
 
22
-	public interface ImageLoadingListener {
23
-		void onComplete(@NonNull Drawable drawable);
24
+    public interface ImageLoadingListener {
25
+        void onComplete(@NonNull Drawable drawable);
24 26
 
25
-		void onError(Throwable error);
26
-	}
27
+        void onError(Throwable error);
28
+    }
29
+
30
+    private static final String FILE_SCHEME = "file";
27 31
 
28
-	public void loadIcon(final Context context, final String uri, final ImageLoadingListener listener) {
32
+    public void loadIcon(final Context context, final String uri, final ImageLoadingListener listener) {
29 33
         try {
30
-            StrictMode.ThreadPolicy threadPolicy = adjustThreadPolicyDebug();
31
-            
32
-            InputStream is = openStream(context, uri);
33
-            Bitmap bitmap = BitmapFactory.decodeStream(is);
34
-            Drawable drawable = new BitmapDrawable(context.getResources(), bitmap);
34
+            Drawable drawable = getDrawable(context, uri);
35 35
             listener.onComplete(drawable);
36
-
37
-            restoreThreadPolicyDebug(threadPolicy);
38 36
         } catch (IOException e) {
39 37
             listener.onError(e);
40 38
         }
41 39
     }
42 40
 
41
+    @NonNull
42
+    private Drawable getDrawable(Context context, String source) throws IOException {
43
+        if (BuildConfig.DEBUG) {
44
+            return readJsDevImage(context, source);
45
+        } else if (isLocalFile(Uri.parse(source))) {
46
+            return loadFile(source);
47
+        } else {
48
+            return loadResource(source);
49
+        }
50
+    }
51
+
52
+    @NonNull
53
+    private Drawable readJsDevImage(Context context, String source) throws IOException {
54
+        StrictMode.ThreadPolicy threadPolicy = adjustThreadPolicyDebug();
55
+        InputStream is = openStream(context, source);
56
+        Bitmap bitmap = BitmapFactory.decodeStream(is);
57
+        restoreThreadPolicyDebug(threadPolicy);
58
+        return new BitmapDrawable(context.getResources(), bitmap);
59
+    }
60
+
61
+    private boolean isLocalFile(Uri uri) {
62
+        return FILE_SCHEME.equals(uri.getScheme());
63
+    }
64
+
65
+    private Drawable loadFile(String uri) {
66
+        Bitmap bitmap = BitmapFactory.decodeFile(uri);
67
+        return new BitmapDrawable(NavigationApplication.instance.getResources(), bitmap);
68
+    }
69
+
70
+    private static Drawable loadResource(String iconSource) {
71
+        return ResourceDrawableIdHelper.getInstance().getResourceDrawable(NavigationApplication.instance, iconSource);
72
+    }
73
+
43 74
     private StrictMode.ThreadPolicy adjustThreadPolicyDebug() {
44 75
         StrictMode.ThreadPolicy threadPolicy = null;
45 76
         if (NavigationApplication.instance.isDebug()) {