Sfoglia il codice sorgente

Toolbar and ImageLoader

Guy Carmeli 8 anni fa
parent
commit
2459b0f383

+ 4
- 1
android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java Vedi File

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

+ 2
- 2
android/app/src/main/java/com/reactnativenavigation/core/objects/Button.java Vedi File

5
 import android.view.MenuItem;
5
 import android.view.MenuItem;
6
 
6
 
7
 import com.facebook.react.bridge.ReadableMap;
7
 import com.facebook.react.bridge.ReadableMap;
8
-import com.reactnativenavigation.utils.IconUtils;
8
+import com.reactnativenavigation.react.ImageLoader;
9
 
9
 
10
 import java.io.Serializable;
10
 import java.io.Serializable;
11
 import java.util.HashMap;
11
 import java.util.HashMap;
49
      * @param dimensions The requested icon dimensions
49
      * @param dimensions The requested icon dimensions
50
      */
50
      */
51
     public Drawable getIcon(Context ctx, int dimensions) {
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
     public int getItemId() {
55
     public int getItemId() {

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

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

+ 16
- 0
android/app/src/main/java/com/reactnativenavigation/react/ImageLoader.java Vedi File

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 Vedi File

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 Vedi File

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

+ 4
- 2
android/app/src/main/java/com/reactnativenavigation/react/RedboxPermission.java Vedi File

8
 import android.widget.Toast;
8
 import android.widget.Toast;
9
 
9
 
10
 import com.facebook.react.common.ReactConstants;
10
 import com.facebook.react.common.ReactConstants;
11
-import com.reactnativenavigation.BuildConfig;
11
+import com.reactnativenavigation.NavigationApplication;
12
 
12
 
13
 public class RedboxPermission {
13
 public class RedboxPermission {
14
 
14
 
15
     public static void permissionToShowRedboxIfNeeded(Context context) {
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
             Intent serviceIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
19
             Intent serviceIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
18
             context.startActivity(serviceIntent);
20
             context.startActivity(serviceIntent);
19
             String msg = "Overlay permissions needs to be granted in order for react native apps to run in dev mode";
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 Vedi File

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
 import android.content.Context;
3
 import android.content.Context;
4
 import android.graphics.drawable.Drawable;
4
 import android.graphics.drawable.Drawable;
15
  * Helper class for obtaining information about local images.
15
  * Helper class for obtaining information about local images.
16
  */
16
  */
17
 public class ResourceDrawableIdHelper {
17
 public class ResourceDrawableIdHelper {
18
+    public static final ResourceDrawableIdHelper instance = new ResourceDrawableIdHelper();
18
 
19
 
19
     private Map<String, Integer> mResourceDrawableIdMap;
20
     private Map<String, Integer> mResourceDrawableIdMap;
20
 
21
 

+ 0
- 76
android/app/src/main/java/com/reactnativenavigation/utils/IconUtils.java Vedi File

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 Vedi File

8
 import android.support.annotation.ColorInt;
8
 import android.support.annotation.ColorInt;
9
 import android.support.annotation.NonNull;
9
 import android.support.annotation.NonNull;
10
 import android.support.annotation.UiThread;
10
 import android.support.annotation.UiThread;
11
-import android.support.v4.content.ContextCompat;
12
 import android.support.v4.widget.DrawerLayout;
11
 import android.support.v4.widget.DrawerLayout;
13
 import android.support.v7.app.ActionBar;
12
 import android.support.v7.app.ActionBar;
14
 import android.support.v7.app.ActionBarDrawerToggle;
13
 import android.support.v7.app.ActionBarDrawerToggle;
28
 import com.reactnativenavigation.core.objects.Button;
27
 import com.reactnativenavigation.core.objects.Button;
29
 import com.reactnativenavigation.core.objects.Screen;
28
 import com.reactnativenavigation.core.objects.Screen;
30
 import com.reactnativenavigation.utils.ContextProvider;
29
 import com.reactnativenavigation.utils.ContextProvider;
31
-import com.reactnativenavigation.utils.IconUtils;
30
+import com.reactnativenavigation.react.ImageLoader;
32
 import com.reactnativenavigation.utils.ImageUtils;
31
 import com.reactnativenavigation.utils.ImageUtils;
33
 
32
 
34
 import java.lang.ref.WeakReference;
33
 import java.lang.ref.WeakReference;
56
         init();
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
     private void init() {
58
     private void init() {
70
         mMenuItems = new ArrayList<>();
59
         mMenuItems = new ArrayList<>();
71
         mBackground = getBackground();
60
         mBackground = getBackground();
76
     }
65
     }
77
 
66
 
78
     public void handleOnCreateOptionsMenuAsync() {
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
     public ActionBarDrawerToggle setupDrawer(DrawerLayout drawerLayout, Screen drawerScreen, Screen screen) {
73
     public ActionBarDrawerToggle setupDrawer(DrawerLayout drawerLayout, Screen drawerScreen, Screen screen) {
258
                 return null;
247
                 return null;
259
             }
248
             }
260
 
249
 
261
-            return IconUtils.getIcon(context, mDrawerIconSource);
250
+            return ImageLoader.loadImage(mDrawerIconSource);
262
         }
251
         }
263
 
252
 
264
         @Override
253
         @Override

+ 36
- 2
android/app/src/main/java/com/reactnativenavigation/views/TitleBar.java Vedi File

1
 package com.reactnativenavigation.views;
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
 import android.support.v7.widget.Toolbar;
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
 public class TitleBar extends Toolbar {
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
         super(context);
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 Vedi File

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