Sfoglia il codice sorgente

Change toolbar buttons when selected tab changes

Guy Carmeli 9 anni fa
parent
commit
0dbd7c48f9

+ 0
- 128
android/app/react-native-navigation.iml Vedi File

@@ -1,128 +0,0 @@
1
-<?xml version="1.0" encoding="UTF-8"?>
2
-<module external.linked.project.id=":react-native-navigation" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/../../../../android" external.system.id="GRADLE" external.system.module.group="exampleRedux" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
3
-  <component name="FacetManager">
4
-    <facet type="android-gradle" name="Android-Gradle">
5
-      <configuration>
6
-        <option name="GRADLE_PROJECT_PATH" value=":react-native-navigation" />
7
-      </configuration>
8
-    </facet>
9
-    <facet type="android" name="Android">
10
-      <configuration>
11
-        <option name="SELECTED_BUILD_VARIANT" value="libraryDebug" />
12
-        <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
13
-        <option name="ASSEMBLE_TASK_NAME" value="assembleLibraryDebug" />
14
-        <option name="COMPILE_JAVA_TASK_NAME" value="compileLibraryDebugSources" />
15
-        <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleLibraryDebugAndroidTest" />
16
-        <option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileLibraryDebugAndroidTestSources" />
17
-        <afterSyncTasks>
18
-          <task>generateLibraryDebugAndroidTestSources</task>
19
-          <task>generateLibraryDebugSources</task>
20
-        </afterSyncTasks>
21
-        <option name="ALLOW_USER_CONFIGURATION" value="false" />
22
-        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
23
-        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
24
-        <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
25
-        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
26
-        <option name="LIBRARY_PROJECT" value="true" />
27
-      </configuration>
28
-    </facet>
29
-  </component>
30
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
31
-    <output url="file://$MODULE_DIR$/build/intermediates/classes/library/debug" />
32
-    <output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/library/debug" />
33
-    <exclude-output />
34
-    <content url="file://$MODULE_DIR$">
35
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/library/debug" isTestSource="false" generated="true" />
36
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/library/debug" isTestSource="false" generated="true" />
37
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/library/debug" isTestSource="false" generated="true" />
38
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/library/debug" isTestSource="false" generated="true" />
39
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/library/debug" type="java-resource" />
40
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/library/debug" type="java-resource" />
41
-      <sourceFolder url="file://$MODULE_DIR$/src/libraryDebug/res" type="java-resource" />
42
-      <sourceFolder url="file://$MODULE_DIR$/src/libraryDebug/resources" type="java-resource" />
43
-      <sourceFolder url="file://$MODULE_DIR$/src/libraryDebug/assets" type="java-resource" />
44
-      <sourceFolder url="file://$MODULE_DIR$/src/libraryDebug/aidl" isTestSource="false" />
45
-      <sourceFolder url="file://$MODULE_DIR$/src/libraryDebug/java" isTestSource="false" />
46
-      <sourceFolder url="file://$MODULE_DIR$/src/libraryDebug/jni" isTestSource="false" />
47
-      <sourceFolder url="file://$MODULE_DIR$/src/libraryDebug/rs" isTestSource="false" />
48
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/library/debug" isTestSource="true" generated="true" />
49
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/library/debug" isTestSource="true" generated="true" />
50
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/library/debug" isTestSource="true" generated="true" />
51
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/library/debug" isTestSource="true" generated="true" />
52
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/library/debug" type="java-test-resource" />
53
-      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/library/debug" type="java-test-resource" />
54
-      <sourceFolder url="file://$MODULE_DIR$/src/library/res" type="java-resource" />
55
-      <sourceFolder url="file://$MODULE_DIR$/src/library/resources" type="java-resource" />
56
-      <sourceFolder url="file://$MODULE_DIR$/src/library/assets" type="java-resource" />
57
-      <sourceFolder url="file://$MODULE_DIR$/src/library/aidl" isTestSource="false" />
58
-      <sourceFolder url="file://$MODULE_DIR$/src/library/java" isTestSource="false" />
59
-      <sourceFolder url="file://$MODULE_DIR$/src/library/jni" isTestSource="false" />
60
-      <sourceFolder url="file://$MODULE_DIR$/src/library/rs" isTestSource="false" />
61
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestLibrary/res" type="java-test-resource" />
62
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestLibrary/resources" type="java-test-resource" />
63
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestLibrary/assets" type="java-test-resource" />
64
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestLibrary/aidl" isTestSource="true" />
65
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestLibrary/java" isTestSource="true" />
66
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestLibrary/jni" isTestSource="true" />
67
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTestLibrary/rs" isTestSource="true" />
68
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
69
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
70
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
71
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
72
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
73
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
74
-      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
75
-      <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
76
-      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
77
-      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
78
-      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
79
-      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
80
-      <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
81
-      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
82
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
83
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
84
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
85
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
86
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
87
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
88
-      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
89
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
90
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
91
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
92
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
93
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
94
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.facebook.react/react-native/0.20.1/jars" />
95
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
96
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
97
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
98
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
99
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
100
-      <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
101
-      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
102
-    </content>
103
-    <orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" />
104
-    <orderEntry type="sourceFolder" forTests="false" />
105
-    <orderEntry type="library" exported="" name="support-annotations-23.1.1" level="project" />
106
-    <orderEntry type="library" exported="" name="fresco-0.8.1" level="project" />
107
-    <orderEntry type="library" exported="" name="design-23.1.1" level="project" />
108
-    <orderEntry type="library" exported="" name="imagepipeline-okhttp-0.8.1" level="project" />
109
-    <orderEntry type="library" exported="" name="imagepipeline-0.8.1" level="project" />
110
-    <orderEntry type="library" exported="" name="stetho-1.2.0" level="project" />
111
-    <orderEntry type="library" exported="" name="jsr305-3.0.0" level="project" />
112
-    <orderEntry type="library" exported="" name="jackson-core-2.2.3" level="project" />
113
-    <orderEntry type="library" exported="" name="recyclerview-v7-23.1.1" level="project" />
114
-    <orderEntry type="library" exported="" name="react-native-0.20.1" level="project" />
115
-    <orderEntry type="library" exported="" name="support-v4-23.1.1" level="project" />
116
-    <orderEntry type="library" exported="" name="appcompat-v7-23.1.1" level="project" />
117
-    <orderEntry type="library" exported="" name="okhttp-2.5.0" level="project" />
118
-    <orderEntry type="library" exported="" name="okio-1.6.0" level="project" />
119
-    <orderEntry type="library" exported="" name="okhttp-ws-2.5.0" level="project" />
120
-    <orderEntry type="library" exported="" name="fbcore-0.8.1" level="project" />
121
-    <orderEntry type="library" exported="" name="android-jsc-r174650" level="project" />
122
-    <orderEntry type="library" exported="" name="drawee-0.8.1" level="project" />
123
-    <orderEntry type="library" exported="" name="stetho-okhttp-1.2.0" level="project" />
124
-    <orderEntry type="library" exported="" name="bolts-android-1.1.4" level="project" />
125
-    <orderEntry type="library" exported="" name="library-2.4.0" level="project" />
126
-    <orderEntry type="library" exported="" name="commons-cli-1.2" level="project" />
127
-  </component>
128
-</module>

+ 2
- 1
android/app/src/main/java/com/reactnativenavigation/activities/BaseReactActivity.java Vedi File

@@ -10,6 +10,7 @@ import android.support.v7.app.AppCompatActivity;
10 10
 import android.util.Log;
11 11
 import android.view.KeyEvent;
12 12
 import android.view.Menu;
13
+import android.view.MenuItem;
13 14
 import android.widget.EditText;
14 15
 import android.widget.Toast;
15 16
 
@@ -36,9 +37,9 @@ import javax.annotation.Nullable;
36 37
  */
37 38
 public class BaseReactActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
38 39
 
40
+    private static final String TAG = "BaseReactActivity";
39 41
     private static final String REDBOX_PERMISSION_MESSAGE =
40 42
             "Overlay permissions needs to be granted in order for react native apps to run in dev mode";
41
-    private static final String TAG = "ReactActivity";
42 43
 
43 44
     protected  @Nullable ReactInstanceManager mReactInstanceManager;
44 45
     private LifecycleState mLifecycleState = LifecycleState.BEFORE_RESUME;

+ 6
- 3
android/app/src/main/java/com/reactnativenavigation/adapters/ViewPagerAdapter.java Vedi File

@@ -3,7 +3,6 @@ package com.reactnativenavigation.adapters;
3 3
 import android.support.design.widget.TabLayout;
4 4
 import android.support.v4.view.PagerAdapter;
5 5
 import android.support.v4.view.ViewPager;
6
-import android.support.v7.widget.Toolbar;
7 6
 import android.view.View;
8 7
 import android.view.ViewGroup;
9 8
 
@@ -14,6 +13,7 @@ import com.reactnativenavigation.activities.BaseReactActivity;
14 13
 import com.reactnativenavigation.core.RctManager;
15 14
 import com.reactnativenavigation.core.objects.Screen;
16 15
 import com.reactnativenavigation.views.RctView;
16
+import com.reactnativenavigation.views.RnnToolBar;
17 17
 
18 18
 import java.util.ArrayList;
19 19
 
@@ -26,11 +26,12 @@ public class ViewPagerAdapter extends PagerAdapter implements TabLayout.OnTabSel
26 26
 
27 27
     private BaseReactActivity mContext;
28 28
     private ViewPager mViewPager;
29
-    private Toolbar mToolbar;
29
+    private RnnToolBar mToolbar;
30 30
     private final ArrayList<Screen> mScreens;
31 31
     private final ReactInstanceManager mReactInstanceManager;
32 32
 
33
-    public ViewPagerAdapter(BaseReactActivity context, ViewPager viewPager, Toolbar toolbar, ArrayList<Screen> screens) {
33
+    public ViewPagerAdapter(BaseReactActivity context, ViewPager viewPager, RnnToolBar toolbar,
34
+                            ArrayList<Screen> screens) {
34 35
         mContext = context;
35 36
         mViewPager = viewPager;
36 37
         mToolbar = toolbar;
@@ -77,6 +78,8 @@ public class ViewPagerAdapter extends PagerAdapter implements TabLayout.OnTabSel
77 78
         Screen screen = mScreens.get(position);
78 79
         params.putString(Screen.KEY_NAVIGATOR_EVENT_ID, screen.navigatorEventId);
79 80
 
81
+        mToolbar.setupToolbarButtonsAsync(mScreens.get(position));
82
+
80 83
         RctManager.getInstance().sendEvent(EVENT_ON_TAB_SELECTED, screen.navigatorEventId, params);
81 84
     }
82 85
 

+ 0
- 1
android/app/src/main/java/com/reactnativenavigation/core/RctManager.java Vedi File

@@ -18,7 +18,6 @@ import static com.facebook.react.modules.core.DeviceEventManagerModule.RCTDevice
18 18
  * Created by guyc on 22/02/16.
19 19
  */
20 20
 public class RctManager {
21
-    private static final String TAG = "RctManager";
22 21
     private static final String KEY_EVENT_ID = "id";
23 22
     private static RctManager sInstance;
24 23
 

+ 14
- 0
android/app/src/main/java/com/reactnativenavigation/utils/CollectionUtils.java Vedi File

@@ -0,0 +1,14 @@
1
+package com.reactnativenavigation.utils;
2
+
3
+import java.util.Collection;
4
+
5
+/**
6
+ * Created by guyc on 11/04/16.
7
+ */
8
+public class CollectionUtils {
9
+
10
+    public static boolean isNullOrEmpty(Collection collection) {
11
+        return collection == null || collection.size() == 0;
12
+    }
13
+
14
+}

+ 31
- 13
android/app/src/main/java/com/reactnativenavigation/views/RnnToolBar.java Vedi File

@@ -13,6 +13,8 @@ import com.reactnativenavigation.core.objects.Button;
13 13
 import com.reactnativenavigation.core.objects.Screen;
14 14
 import com.reactnativenavigation.utils.ContextProvider;
15 15
 
16
+import java.lang.ref.WeakReference;
17
+import java.util.Collections;
16 18
 import java.util.HashMap;
17 19
 import java.util.List;
18 20
 import java.util.Map;
@@ -23,7 +25,7 @@ import java.util.Map;
23 25
 public class RnnToolBar extends Toolbar {
24 26
 
25 27
     private List<Screen> mScreens;
26
-    private static boolean sIsSettingUpToolbar = false;
28
+    private AsyncTask mSetupToolbarTask;
27 29
 
28 30
     public RnnToolBar(Context context) {
29 31
         super(context);
@@ -42,21 +44,26 @@ public class RnnToolBar extends Toolbar {
42 44
     }
43 45
 
44 46
     public void handleOnCreateOptionsMenuAsync() {
45
-        if (!sIsSettingUpToolbar) {
46
-            new SetupToolbarButtons().execute(mScreens.get(0));
47
+        setupToolbarButtonsAsync(mScreens.get(0));
48
+    }
49
+
50
+    public void setupToolbarButtonsAsync(Screen screen) {
51
+        if (mSetupToolbarTask == null) {
52
+            mSetupToolbarTask = new SetupToolbarButtonsTask(this, screen).execute();
47 53
         }
48 54
     }
49 55
 
50
-    private static class SetupToolbarButtons extends AsyncTask<Screen, Void, Map<String, Drawable>> {
51
-        private List<Button> mButtons;
56
+    private static class SetupToolbarButtonsTask extends AsyncTask<Void, Void, Map<String, Drawable>> {
57
+        private final List<Button> mButtons;
58
+        private final WeakReference<RnnToolBar> mToolbarWR;
52 59
 
53
-        public SetupToolbarButtons() {
54
-            sIsSettingUpToolbar = true;
60
+        public SetupToolbarButtonsTask(RnnToolBar toolBar, Screen newScreen) {
61
+            mToolbarWR = new WeakReference<>(toolBar);
62
+            mButtons = newScreen.buttons == null ? Collections.EMPTY_LIST : newScreen.buttons;
55 63
         }
56 64
 
57 65
         @Override
58
-        protected Map<String, Drawable> doInBackground(Screen... screen) {
59
-            mButtons = screen[0].buttons;
66
+        protected Map<String, Drawable> doInBackground(Void... params) {
60 67
             Context context = ContextProvider.getActivityContext();
61 68
             if (context == null) {
62 69
                 return null;
@@ -80,16 +87,27 @@ public class RnnToolBar extends Toolbar {
80 87
 
81 88
             Menu menu = ((BaseReactActivity) context).getMenu();
82 89
 
83
-            for (Button button : mButtons) {
84
-                MenuItem item = menu.add(Menu.NONE, button.getItemId(), Menu.NONE, button.title);
90
+            // Add new screen buttons
91
+            int i;
92
+            for (i = 0; i < mButtons.size(); i++) {
93
+                Button button = mButtons.get(i);
94
+                MenuItem item = menu.add(Menu.NONE, button.getItemId(), i, button.title);
85 95
                 if (icons.containsKey(button.id)) {
86 96
                     Drawable icon = icons.get(button.id);
87
-
88 97
                     item.setIcon(icon).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
89 98
                 }
90 99
             }
91 100
 
92
-            sIsSettingUpToolbar = false;
101
+            // Remove prev screen buttons
102
+            for (int j = i; j < menu.size(); j++) {
103
+                menu.removeItem(j);
104
+            }
105
+
106
+            RnnToolBar toolBar = mToolbarWR.get();
107
+            if (toolBar != null) {
108
+                toolBar.mSetupToolbarTask = null;
109
+                mToolbarWR.clear();
110
+            }
93 111
         }
94 112
     }
95 113
 }