Explorar el Código

Toolbar and ImageLoader

Guy Carmeli hace 8 años
padre
commit
2459b0f383

+ 4
- 1
android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java Ver fichero

@@ -3,9 +3,10 @@ package com.reactnativenavigation;
3 3
 import android.app.Application;
4 4
 import android.os.Handler;
5 5
 
6
-public class NavigationApplication extends Application {
6
+public abstract class NavigationApplication extends Application {
7 7
 
8 8
     public static NavigationApplication instance;
9
+
9 10
     private Handler handler;
10 11
 
11 12
     @Override
@@ -15,6 +16,8 @@ public class NavigationApplication extends Application {
15 16
         handler = new Handler(getMainLooper());
16 17
     }
17 18
 
19
+    public abstract boolean isDebug();
20
+
18 21
     public Handler getMainHandler() {
19 22
         return handler;
20 23
     }

+ 2
- 2
android/app/src/main/java/com/reactnativenavigation/core/objects/Button.java Ver fichero

@@ -5,7 +5,7 @@ import android.graphics.drawable.Drawable;
5 5
 import android.view.MenuItem;
6 6
 
7 7
 import com.facebook.react.bridge.ReadableMap;
8
-import com.reactnativenavigation.utils.IconUtils;
8
+import com.reactnativenavigation.react.ImageLoader;
9 9
 
10 10
 import java.io.Serializable;
11 11
 import java.util.HashMap;
@@ -49,7 +49,7 @@ public class Button extends JsonObject implements Serializable {
49 49
      * @param dimensions The requested icon dimensions
50 50
      */
51 51
     public Drawable getIcon(Context ctx, int dimensions) {
52
-       return IconUtils.getIcon(ctx, mIconSource, dimensions);
52
+       return ImageLoader.getIcon(ctx, mIconSource, dimensions);
53 53
     }
54 54
 
55 55
     public int getItemId() {

+ 2
- 3
android/app/src/main/java/com/reactnativenavigation/core/objects/Screen.java Ver fichero

@@ -5,12 +5,11 @@ import android.graphics.drawable.Drawable;
5 5
 import android.support.annotation.ColorInt;
6 6
 import android.support.annotation.NonNull;
7 7
 import android.support.annotation.Nullable;
8
-import android.util.Log;
9 8
 
10 9
 import com.facebook.react.bridge.ReadableArray;
11 10
 import com.facebook.react.bridge.ReadableMap;
12 11
 import com.facebook.react.bridge.ReadableNativeMap;
13
-import com.reactnativenavigation.utils.IconUtils;
12
+import com.reactnativenavigation.react.ImageLoader;
14 13
 
15 14
 import java.io.Serializable;
16 15
 import java.util.ArrayList;
@@ -122,7 +121,7 @@ public class Screen extends JsonObject implements Serializable {
122 121
     }
123 122
 
124 123
     public Drawable getIcon(Context ctx) {
125
-        return IconUtils.getIcon(ctx, icon);
124
+        return ImageLoader.getIcon(ctx, icon);
126 125
     }
127 126
 
128 127
     public void setToolbarStyle(ReadableMap screen) {

+ 16
- 0
android/app/src/main/java/com/reactnativenavigation/react/ImageLoader.java Ver fichero

@@ -0,0 +1,16 @@
1
+package com.reactnativenavigation.react;
2
+
3
+import android.graphics.drawable.Drawable;
4
+
5
+import com.reactnativenavigation.NavigationApplication;
6
+
7
+public class ImageLoader {
8
+
9
+    public static Drawable loadImage(String iconSource) {
10
+        if (NavigationApplication.instance.isDebug()) {
11
+            return JsDevImageLoader.loadIcon(iconSource);
12
+        } else {
13
+            return ResourceDrawableIdHelper.instance.getResourceDrawable(NavigationApplication.instance, iconSource);
14
+        }
15
+    }
16
+}

+ 42
- 0
android/app/src/main/java/com/reactnativenavigation/react/JsDevImageLoader.java Ver fichero

@@ -0,0 +1,42 @@
1
+package com.reactnativenavigation.react;
2
+
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.os.StrictMode;
8
+import android.support.annotation.NonNull;
9
+
10
+import com.reactnativenavigation.NavigationApplication;
11
+import com.reactnativenavigation.utils.ImageUtils;
12
+
13
+import java.io.IOException;
14
+import java.net.URL;
15
+
16
+public class JsDevImageLoader {
17
+
18
+    public static Drawable loadIcon(String iconDevUri) {
19
+        try {
20
+            StrictMode.ThreadPolicy threadPolicy = StrictMode.getThreadPolicy();
21
+            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build());
22
+
23
+            Drawable drawable = tryLoadIcon(iconDevUri);
24
+
25
+            StrictMode.setThreadPolicy(threadPolicy);
26
+            return drawable;
27
+        } catch (Exception e) {
28
+            throw new RuntimeException(e);
29
+        }
30
+    }
31
+
32
+    @NonNull
33
+    private static Drawable tryLoadIcon(String iconDevUri) throws IOException {
34
+        URL url = new URL(iconDevUri);
35
+        Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());
36
+        final int dimensions = (int) ImageUtils.convertDpToPixel(48, NavigationApplication.instance);
37
+        // TODO: fix hard coded dimensions -add options to decodeStream
38
+        bitmap = Bitmap.createScaledBitmap(bitmap, dimensions, dimensions, false);
39
+        return new BitmapDrawable(NavigationApplication.instance.getResources(), bitmap);
40
+    }
41
+
42
+}

+ 2
- 3
android/app/src/main/java/com/reactnativenavigation/react/NavigationReactInstance.java Ver fichero

@@ -9,7 +9,6 @@ import com.facebook.react.ReactPackage;
9 9
 import com.facebook.react.bridge.ReactContext;
10 10
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
11 11
 import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
12
-import com.reactnativenavigation.BuildConfig;
13 12
 import com.reactnativenavigation.NavigationApplication;
14 13
 
15 14
 import java.util.List;
@@ -27,7 +26,7 @@ public class NavigationReactInstance {
27 26
     public NavigationReactInstance(final ReactContextCreator reactContextCreator) {
28 27
         reactInstanceManager = createReactInstanceManager(reactContextCreator);
29 28
 
30
-        if (BuildConfig.DEBUG) {
29
+        if (NavigationApplication.instance.isDebug()) {
31 30
             replaceJsDevReloadListener(reactContextCreator);
32 31
         }
33 32
     }
@@ -85,7 +84,7 @@ public class NavigationReactInstance {
85 84
                 .setApplication(NavigationApplication.instance)
86 85
                 .setJSMainModuleName("index.android")
87 86
                 .setBundleAssetName("index.android.bundle")
88
-                .setUseDeveloperSupport(BuildConfig.DEBUG)
87
+                .setUseDeveloperSupport(NavigationApplication.instance.isDebug())
89 88
                 .setInitialLifecycleState(LifecycleState.BEFORE_RESUME);
90 89
 
91 90
         for (ReactPackage reactPackage : reactContextCreator.createReactPackages()) {

+ 4
- 2
android/app/src/main/java/com/reactnativenavigation/react/RedboxPermission.java Ver fichero

@@ -8,12 +8,14 @@ import android.util.Log;
8 8
 import android.widget.Toast;
9 9
 
10 10
 import com.facebook.react.common.ReactConstants;
11
-import com.reactnativenavigation.BuildConfig;
11
+import com.reactnativenavigation.NavigationApplication;
12 12
 
13 13
 public class RedboxPermission {
14 14
 
15 15
     public static void permissionToShowRedboxIfNeeded(Context context) {
16
-        if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= 23 && !Settings.canDrawOverlays(context)) {
16
+        if (NavigationApplication.instance.isDebug() &&
17
+            Build.VERSION.SDK_INT >= 23 &&
18
+            !Settings.canDrawOverlays(context)) {
17 19
             Intent serviceIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
18 20
             context.startActivity(serviceIntent);
19 21
             String msg = "Overlay permissions needs to be granted in order for react native apps to run in dev mode";

android/app/src/main/java/com/reactnativenavigation/utils/ResourceDrawableIdHelper.java → android/app/src/main/java/com/reactnativenavigation/react/ResourceDrawableIdHelper.java Ver fichero

@@ -1,4 +1,4 @@
1
-package com.reactnativenavigation.utils;// Copyright 2004-present Facebook. All Rights Reserved.
1
+package com.reactnativenavigation.react;// Copyright 2004-present Facebook. All Rights Reserved.
2 2
 
3 3
 import android.content.Context;
4 4
 import android.graphics.drawable.Drawable;
@@ -15,6 +15,7 @@ import javax.annotation.Nullable;
15 15
  * Helper class for obtaining information about local images.
16 16
  */
17 17
 public class ResourceDrawableIdHelper {
18
+    public static final ResourceDrawableIdHelper instance = new ResourceDrawableIdHelper();
18 19
 
19 20
     private Map<String, Integer> mResourceDrawableIdMap;
20 21
 

+ 0
- 76
android/app/src/main/java/com/reactnativenavigation/utils/IconUtils.java Ver fichero

@@ -1,76 +0,0 @@
1
-package com.reactnativenavigation.utils;
2
-
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
-
10
-import com.reactnativenavigation.BuildConfig;
11
-
12
-import java.net.URL;
13
-
14
-/**
15
- * Created by yedidyak on 29/05/2016.
16
- */
17
-public class IconUtils {
18
-    public static final String LOCAL_RESOURCE_URI_SCHEME = "res";
19
-    private static ResourceDrawableIdHelper sResDrawableIdHelper = new ResourceDrawableIdHelper();
20
-
21
-    public static Drawable getIcon(Context ctx, String iconSource) {
22
-        return getIcon(ctx, iconSource, -1);
23
-    }
24
-
25
-    /**
26
-     * @param iconSource Icon source. In release builds this would be a path in assets, In debug it's
27
-     *                   a url and the image needs to be decoded from input stream.
28
-     * @param dimensions The requested icon dimensions
29
-     */
30
-    public static Drawable getIcon(Context ctx, String iconSource, int dimensions) {
31
-        if (iconSource == null) {
32
-            return null;
33
-        }
34
-
35
-        try {
36
-            Drawable icon;
37
-            Uri iconUri = getIconUri(ctx, iconSource);
38
-
39
-            if (LOCAL_RESOURCE_URI_SCHEME.equals(iconUri.getScheme())) {
40
-                icon = sResDrawableIdHelper.getResourceDrawable(ctx, iconSource);
41
-            } else {
42
-                URL url = new URL(iconUri.toString());
43
-                Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());
44
-                bitmap = dimensions > 0 ?
45
-                        Bitmap.createScaledBitmap(bitmap, dimensions, dimensions, false) : bitmap;
46
-                icon = new BitmapDrawable(ctx.getResources(), bitmap);
47
-            }
48
-            return icon;
49
-        } catch (Exception e) {
50
-            if (BuildConfig.DEBUG) {
51
-                e.printStackTrace();
52
-            }
53
-        }
54
-        return null;
55
-    }
56
-
57
-    private static Uri getIconUri(Context context, String iconSource) {
58
-        Uri ret = null;
59
-        if (iconSource != null) {
60
-            try {
61
-                ret = Uri.parse(iconSource);
62
-                // Verify scheme is set, so that relative uri (used by static resources) are not handled.
63
-                if (ret.getScheme() == null) {
64
-                    ret = null;
65
-                }
66
-            } catch (Exception e) {
67
-                // Ignore malformed uri, then attempt to extract resource ID.
68
-            }
69
-            if (ret == null) {
70
-                ret = sResDrawableIdHelper.getResourceDrawableUri(context, iconSource);
71
-            }
72
-        }
73
-        return ret;
74
-    }
75
-
76
-}

+ 5
- 16
android/app/src/main/java/com/reactnativenavigation/views/RnnToolBar.java Ver fichero

@@ -8,7 +8,6 @@ import android.os.AsyncTask;
8 8
 import android.support.annotation.ColorInt;
9 9
 import android.support.annotation.NonNull;
10 10
 import android.support.annotation.UiThread;
11
-import android.support.v4.content.ContextCompat;
12 11
 import android.support.v4.widget.DrawerLayout;
13 12
 import android.support.v7.app.ActionBar;
14 13
 import android.support.v7.app.ActionBarDrawerToggle;
@@ -28,7 +27,7 @@ import com.reactnativenavigation.activities.BaseReactActivity;
28 27
 import com.reactnativenavigation.core.objects.Button;
29 28
 import com.reactnativenavigation.core.objects.Screen;
30 29
 import com.reactnativenavigation.utils.ContextProvider;
31
-import com.reactnativenavigation.utils.IconUtils;
30
+import com.reactnativenavigation.react.ImageLoader;
32 31
 import com.reactnativenavigation.utils.ImageUtils;
33 32
 
34 33
 import java.lang.ref.WeakReference;
@@ -56,16 +55,6 @@ public class RnnToolBar extends Toolbar {
56 55
         init();
57 56
     }
58 57
 
59
-    public RnnToolBar(Context context, AttributeSet attrs) {
60
-        super(context, attrs);
61
-        init();
62
-    }
63
-
64
-    public RnnToolBar(Context context, AttributeSet attrs, int defStyleAttr) {
65
-        super(context, attrs, defStyleAttr);
66
-        init();
67
-    }
68
-
69 58
     private void init() {
70 59
         mMenuItems = new ArrayList<>();
71 60
         mBackground = getBackground();
@@ -76,9 +65,9 @@ public class RnnToolBar extends Toolbar {
76 65
     }
77 66
 
78 67
     public void handleOnCreateOptionsMenuAsync() {
79
-        if (mScreens != null) {
80
-            setupToolbarButtonsAsync(null, mScreens.get(0));
81
-        }
68
+//        if (mScreens != null) {
69
+//            setupToolbarButtonsAsync(null, mScreens.get(0));
70
+//        }
82 71
     }
83 72
 
84 73
     public ActionBarDrawerToggle setupDrawer(DrawerLayout drawerLayout, Screen drawerScreen, Screen screen) {
@@ -258,7 +247,7 @@ public class RnnToolBar extends Toolbar {
258 247
                 return null;
259 248
             }
260 249
 
261
-            return IconUtils.getIcon(context, mDrawerIconSource);
250
+            return ImageLoader.loadImage(mDrawerIconSource);
262 251
         }
263 252
 
264 253
         @Override

+ 36
- 2
android/app/src/main/java/com/reactnativenavigation/views/TitleBar.java Ver fichero

@@ -1,11 +1,45 @@
1 1
 package com.reactnativenavigation.views;
2 2
 
3
-import android.content.Context;
3
+import android.app.Activity;
4
+import android.graphics.drawable.Drawable;
5
+import android.support.annotation.ColorInt;
6
+import android.support.v7.widget.ActionMenuView;
4 7
 import android.support.v7.widget.Toolbar;
8
+import android.view.Menu;
9
+import android.view.MenuInflater;
10
+
11
+import com.reactnativenavigation.R;
12
+
13
+import java.util.List;
5 14
 
6 15
 public class TitleBar extends Toolbar {
7 16
 
8
-    public TitleBar(Context context) {
17
+    public static class Button {
18
+        public enum ShowAsAction {
19
+            IfRoom, Always, Never, WithText
20
+        }
21
+
22
+        String label;
23
+        Drawable icon;
24
+        @ColorInt int color;
25
+        ShowAsAction showAsAction;
26
+    }
27
+
28
+    public TitleBar(Activity context) {
9 29
         super(context);
30
+        createMenu();
31
+    }
32
+
33
+    private void createMenu() {
34
+        MenuInflater menuInflater = ((Activity) getContext()).getMenuInflater();
35
+        ActionMenuView actionMenuView = new ActionMenuView(getContext());
36
+        Menu menu = actionMenuView.getMenu();
37
+        menuInflater.inflate(R.menu.stub, menu);
38
+        addView(actionMenuView);
39
+        // TODO: Maybe setSupportActionBar
40
+    }
41
+
42
+    public void setButtons(List<Button> buttons) {
43
+        Menu menu = new
10 44
     }
11 45
 }

+ 4
- 0
android/app/src/main/res/menu/stub.xml Ver fichero

@@ -0,0 +1,4 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
3
+
4
+</menu>