react-native-navigation的迁移库

ImageLoader.java 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package com.reactnativenavigation.utils;
  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.graphics.drawable.BitmapDrawable;
  6. import android.graphics.drawable.Drawable;
  7. import android.net.Uri;
  8. import android.os.StrictMode;
  9. import android.support.annotation.NonNull;
  10. import android.support.annotation.Nullable;
  11. import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper;
  12. import com.reactnativenavigation.BuildConfig;
  13. import com.reactnativenavigation.NavigationApplication;
  14. import java.io.FileNotFoundException;
  15. import java.io.IOException;
  16. import java.io.InputStream;
  17. import java.net.URL;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. public class ImageLoader {
  21. public interface ImagesLoadingListener {
  22. void onComplete(@NonNull List<Drawable> drawable);
  23. void onComplete(@NonNull Drawable drawable);
  24. void onError(Throwable error);
  25. }
  26. private static final String FILE_SCHEME = "file";
  27. public void loadIcon(Context context, String uri, ImagesLoadingListener listener) {
  28. try {
  29. listener.onComplete(getDrawable(context, uri));
  30. } catch (IOException e) {
  31. listener.onError(e);
  32. }
  33. }
  34. public void loadIcons(final Context context, List<String> uris, ImagesLoadingListener listener) {
  35. try {
  36. List<Drawable> drawables = new ArrayList<>();
  37. for (String uri : uris) {
  38. Drawable drawable = getDrawable(context, uri);
  39. drawables.add(drawable);
  40. }
  41. listener.onComplete(drawables);
  42. } catch (IOException e) {
  43. listener.onError(e);
  44. }
  45. }
  46. @NonNull
  47. private Drawable getDrawable(Context context, String source) throws IOException {
  48. if (BuildConfig.DEBUG) {
  49. return readJsDevImage(context, source);
  50. } else if (isLocalFile(Uri.parse(source))) {
  51. return loadFile(source);
  52. } else {
  53. return loadResource(source);
  54. }
  55. }
  56. @NonNull
  57. private Drawable readJsDevImage(Context context, String source) throws IOException {
  58. StrictMode.ThreadPolicy threadPolicy = adjustThreadPolicyDebug();
  59. InputStream is = openStream(context, source);
  60. Bitmap bitmap = BitmapFactory.decodeStream(is);
  61. restoreThreadPolicyDebug(threadPolicy);
  62. return new BitmapDrawable(context.getResources(), bitmap);
  63. }
  64. private boolean isLocalFile(Uri uri) {
  65. return FILE_SCHEME.equals(uri.getScheme());
  66. }
  67. private Drawable loadFile(String uri) {
  68. Bitmap bitmap = BitmapFactory.decodeFile(Uri.parse(uri).getPath());
  69. return new BitmapDrawable(NavigationApplication.instance.getResources(), bitmap);
  70. }
  71. private static Drawable loadResource(String iconSource) {
  72. return ResourceDrawableIdHelper.getInstance().getResourceDrawable(NavigationApplication.instance, iconSource);
  73. }
  74. private StrictMode.ThreadPolicy adjustThreadPolicyDebug() {
  75. StrictMode.ThreadPolicy threadPolicy = null;
  76. if (NavigationApplication.instance.isDebug()) {
  77. threadPolicy = StrictMode.getThreadPolicy();
  78. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build());
  79. }
  80. return threadPolicy;
  81. }
  82. private void restoreThreadPolicyDebug(@Nullable StrictMode.ThreadPolicy threadPolicy) {
  83. if (NavigationApplication.instance.isDebug() && threadPolicy != null) {
  84. StrictMode.setThreadPolicy(threadPolicy);
  85. }
  86. }
  87. private static InputStream openStream(Context context, String uri) throws IOException {
  88. return uri.contains("http") ? remoteUrl(uri) : localFile(context, uri);
  89. }
  90. private static InputStream remoteUrl(String uri) throws IOException {
  91. return new URL(uri).openStream();
  92. }
  93. private static InputStream localFile(Context context, String uri) throws FileNotFoundException {
  94. return context.getContentResolver().openInputStream(Uri.parse(uri));
  95. }
  96. }