react-native-navigation的迁移库

ImageLoader.java 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package com.reactnativenavigation.utils;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.drawable.BitmapDrawable;
  7. import android.graphics.drawable.Drawable;
  8. import android.net.Uri;
  9. import android.os.StrictMode;
  10. import android.view.View;
  11. import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper;
  12. import com.reactnativenavigation.NavigationApplication;
  13. import com.reactnativenavigation.R;
  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. import androidx.annotation.NonNull;
  21. import androidx.annotation.Nullable;
  22. import androidx.core.content.ContextCompat;
  23. public class ImageLoader {
  24. public interface ImagesLoadingListener {
  25. void onComplete(@NonNull List<Drawable> drawable);
  26. void onComplete(@NonNull Drawable drawable);
  27. void onError(Throwable error);
  28. }
  29. private static final String FILE_SCHEME = "file";
  30. public Drawable getBackButtonIcon(Activity context) {
  31. boolean isRTL = context.getWindow().getDecorView().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
  32. return ContextCompat.getDrawable(context, isRTL ? R.drawable.ic_arrow_back_black_rtl_24dp : R.drawable.ic_arrow_back_black_24dp);
  33. }
  34. @Nullable
  35. public Drawable loadIcon(Context context, @Nullable String uri) {
  36. if (uri == null) return null;
  37. try {
  38. return getDrawable(context, uri);
  39. } catch (IOException e) {
  40. e.printStackTrace();
  41. }
  42. return null;
  43. }
  44. public void loadIcon(Context context, String uri, ImagesLoadingListener listener) {
  45. try {
  46. listener.onComplete(getDrawable(context, uri));
  47. } catch (IOException e) {
  48. listener.onError(e);
  49. }
  50. }
  51. public void loadIcons(final Context context, List<String> uris, ImagesLoadingListener listener) {
  52. try {
  53. List<Drawable> drawables = new ArrayList<>();
  54. for (String uri : uris) {
  55. Drawable drawable = getDrawable(context, uri);
  56. drawables.add(drawable);
  57. }
  58. listener.onComplete(drawables);
  59. } catch (IOException e) {
  60. listener.onError(e);
  61. }
  62. }
  63. @NonNull
  64. private Drawable getDrawable(Context context, @NonNull String source) throws IOException {
  65. Drawable drawable;
  66. if (isLocalFile(Uri.parse(source))) {
  67. drawable = loadFile(source);
  68. } else {
  69. drawable = loadResource(source);
  70. if (drawable == null && NavigationApplication.instance.isDebug()) {
  71. drawable = readJsDevImage(context, source);
  72. }
  73. }
  74. if (drawable == null) throw new RuntimeException("Could not load image " + source);
  75. return drawable;
  76. }
  77. @NonNull
  78. private Drawable readJsDevImage(Context context, String source) throws IOException {
  79. StrictMode.ThreadPolicy threadPolicy = adjustThreadPolicyDebug();
  80. InputStream is = openStream(context, source);
  81. Bitmap bitmap = BitmapFactory.decodeStream(is);
  82. restoreThreadPolicyDebug(threadPolicy);
  83. return new BitmapDrawable(context.getResources(), bitmap);
  84. }
  85. private boolean isLocalFile(Uri uri) {
  86. return FILE_SCHEME.equals(uri.getScheme());
  87. }
  88. private Drawable loadFile(String uri) {
  89. Bitmap bitmap = BitmapFactory.decodeFile(Uri.parse(uri).getPath());
  90. return new BitmapDrawable(NavigationApplication.instance.getResources(), bitmap);
  91. }
  92. private static Drawable loadResource(String iconSource) {
  93. return ResourceDrawableIdHelper.getInstance().getResourceDrawable(NavigationApplication.instance, iconSource);
  94. }
  95. private StrictMode.ThreadPolicy adjustThreadPolicyDebug() {
  96. StrictMode.ThreadPolicy threadPolicy = null;
  97. if (NavigationApplication.instance.isDebug()) {
  98. threadPolicy = StrictMode.getThreadPolicy();
  99. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build());
  100. }
  101. return threadPolicy;
  102. }
  103. private void restoreThreadPolicyDebug(@Nullable StrictMode.ThreadPolicy threadPolicy) {
  104. if (NavigationApplication.instance.isDebug() && threadPolicy != null) {
  105. StrictMode.setThreadPolicy(threadPolicy);
  106. }
  107. }
  108. private static InputStream openStream(Context context, String uri) throws IOException {
  109. return uri.contains("http") ? remoteUrl(uri) : localFile(context, uri);
  110. }
  111. private static InputStream remoteUrl(String uri) throws IOException {
  112. return new URL(uri).openStream();
  113. }
  114. private static InputStream localFile(Context context, String uri) throws FileNotFoundException {
  115. return context.getContentResolver().openInputStream(Uri.parse(uri));
  116. }
  117. }