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
 import android.support.annotation.NonNull;
10
 import android.support.annotation.NonNull;
11
 import android.support.annotation.Nullable;
11
 import android.support.annotation.Nullable;
12
 
12
 
13
+import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper;
14
+import com.reactnativenavigation.BuildConfig;
13
 import com.reactnativenavigation.NavigationApplication;
15
 import com.reactnativenavigation.NavigationApplication;
14
 
16
 
15
 import java.io.FileNotFoundException;
17
 import java.io.FileNotFoundException;
19
 
21
 
20
 public class ImageLoader {
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
         try {
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
             listener.onComplete(drawable);
35
             listener.onComplete(drawable);
36
-
37
-            restoreThreadPolicyDebug(threadPolicy);
38
         } catch (IOException e) {
36
         } catch (IOException e) {
39
             listener.onError(e);
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
     private StrictMode.ThreadPolicy adjustThreadPolicyDebug() {
74
     private StrictMode.ThreadPolicy adjustThreadPolicyDebug() {
44
         StrictMode.ThreadPolicy threadPolicy = null;
75
         StrictMode.ThreadPolicy threadPolicy = null;
45
         if (NavigationApplication.instance.isDebug()) {
76
         if (NavigationApplication.instance.isDebug()) {