Browse Source

Started implementation of ScreenStack

Yedidya Kennard 9 years ago
parent
commit
67952ccde8

+ 4
- 1
android/app/src/main/java/com/reactnativenavigation/activities/BaseReactActivity.java View File

@@ -23,6 +23,7 @@ import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
23 23
 import com.facebook.react.shell.MainReactPackage;
24 24
 import com.reactnativenavigation.BuildConfig;
25 25
 import com.reactnativenavigation.core.RctManager;
26
+import com.reactnativenavigation.core.objects.Screen;
26 27
 import com.reactnativenavigation.packages.RnnPackage;
27 28
 import com.reactnativenavigation.utils.ContextProvider;
28 29
 
@@ -34,7 +35,7 @@ import javax.annotation.Nullable;
34 35
 /**
35 36
  * Base Activity for React Native applications.
36 37
  */
37
-public class BaseReactActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
38
+public abstract class BaseReactActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
38 39
 
39 40
     private static final String TAG = "BaseReactActivity";
40 41
     private static final String REDBOX_PERMISSION_MESSAGE =
@@ -199,6 +200,8 @@ public class BaseReactActivity extends AppCompatActivity implements DefaultHardw
199 200
         }
200 201
     }
201 202
 
203
+    public abstract void push(Screen screen);
204
+
202 205
     @Override
203 206
     public boolean onCreateOptionsMenu(Menu menu) {
204 207
         mMenu = menu;

+ 5
- 0
android/app/src/main/java/com/reactnativenavigation/activities/RootActivity.java View File

@@ -5,6 +5,7 @@ import com.facebook.react.ReactInstanceManager;
5 5
 import com.facebook.react.ReactRootView;
6 6
 import com.reactnativenavigation.R;
7 7
 import com.reactnativenavigation.core.RctManager;
8
+import com.reactnativenavigation.core.objects.Screen;
8 9
 
9 10
 /**
10 11
  * Created by guyc on 13/04/16.
@@ -54,4 +55,8 @@ public class RootActivity extends BaseReactActivity {
54 55
         super.onPause();
55 56
         finish();
56 57
     }
58
+
59
+    public void push(Screen screen) {
60
+        //TODO
61
+    }
57 62
 }

+ 10
- 7
android/app/src/main/java/com/reactnativenavigation/activities/SingleScreenActivity.java View File

@@ -1,13 +1,12 @@
1 1
 package com.reactnativenavigation.activities;
2 2
 
3 3
 import android.support.v7.widget.Toolbar;
4
-import android.view.View;
5 4
 import android.widget.FrameLayout;
6 5
 
7 6
 import com.reactnativenavigation.R;
8 7
 import com.reactnativenavigation.core.RctManager;
9 8
 import com.reactnativenavigation.core.objects.Screen;
10
-import com.reactnativenavigation.views.RctView;
9
+import com.reactnativenavigation.views.ScreenStack;
11 10
 
12 11
 /**
13 12
  * Created by guyc on 05/04/16.
@@ -18,6 +17,7 @@ public class SingleScreenActivity extends BaseReactActivity {
18 17
 
19 18
     private Toolbar mToolbar;
20 19
     private FrameLayout mContentFrame;
20
+    private ScreenStack screenStack;
21 21
 
22 22
     @Override
23 23
     protected void handleOnCreate() {
@@ -29,15 +29,18 @@ public class SingleScreenActivity extends BaseReactActivity {
29 29
 
30 30
         Screen screen = (Screen) getIntent().getSerializableExtra(EXTRA_SCREEN);
31 31
         setupToolbar(screen.title);
32
-        setupReactView(screen);
32
+
33
+        screenStack = new ScreenStack(this);
34
+        mContentFrame.addView(screenStack);
35
+        screenStack.push(screen);
33 36
     }
34 37
 
35 38
     private void setupToolbar(String title) {
36 39
         mToolbar.setTitle(title);
37 40
     }
38
-
39
-    private void setupReactView(Screen screen) {
40
-        View view = new RctView(this, mReactInstanceManager, screen);
41
-        mContentFrame.addView(view);
41
+    
42
+    @Override
43
+    public void push(Screen screen) {
44
+        screenStack.push(screen);
42 45
     }
43 46
 }

+ 7
- 1
android/app/src/main/java/com/reactnativenavigation/activities/TabActivity.java View File

@@ -23,6 +23,7 @@ public class TabActivity extends BaseReactActivity {
23 23
     private ViewPager mViewPager;
24 24
 
25 25
     private ArrayList<Screen> mScreens;
26
+    private ViewPagerAdapter adapter;
26 27
 
27 28
     @Override
28 29
     protected void handleOnCreate() {
@@ -39,13 +40,18 @@ public class TabActivity extends BaseReactActivity {
39 40
         setupViewPager();
40 41
     }
41 42
 
43
+    @Override
44
+    public void push(Screen screen) {
45
+        adapter.pushScreen(screen);
46
+    }
47
+
42 48
     private void setupToolbar() {
43 49
         setSupportActionBar(mToolbar);
44 50
         mToolbar.setScreens(mScreens);
45 51
     }
46 52
 
47 53
     private void setupViewPager() {
48
-        ViewPagerAdapter adapter = new ViewPagerAdapter(this, mViewPager, mToolbar, mScreens);
54
+        adapter = new ViewPagerAdapter(this, mViewPager, mToolbar, mScreens);
49 55
         mViewPager.setAdapter(adapter);
50 56
         mTabLayout.setupWithViewPager(mViewPager);
51 57
         mTabLayout.setOnTabSelectedListener(adapter);

+ 24
- 10
android/app/src/main/java/com/reactnativenavigation/adapters/ViewPagerAdapter.java View File

@@ -12,10 +12,11 @@ import com.facebook.react.bridge.WritableMap;
12 12
 import com.reactnativenavigation.activities.BaseReactActivity;
13 13
 import com.reactnativenavigation.core.RctManager;
14 14
 import com.reactnativenavigation.core.objects.Screen;
15
-import com.reactnativenavigation.views.RctView;
16
-import com.reactnativenavigation.views.RnnToolBar;
15
+import com.reactnativenavigation.views.ScreenStack;
17 16
 
18 17
 import java.util.ArrayList;
18
+import java.util.HashMap;
19
+import java.util.Map;
19 20
 
20 21
 /**
21 22
  * Created by guyc on 02/04/16.
@@ -26,23 +27,36 @@ public class ViewPagerAdapter extends PagerAdapter implements TabLayout.OnTabSel
26 27
 
27 28
     private BaseReactActivity mContext;
28 29
     private ViewPager mViewPager;
29
-    private RnnToolBar mToolbar;
30
-    private final ArrayList<Screen> mScreens;
30
+    private Toolbar mToolbar;
31 31
     private final ReactInstanceManager mReactInstanceManager;
32
+    private final ArrayList<ScreenStack> screenStacks;
33
+    private final Map<String, ScreenStack> stacksByNavId;
34
+
32 35
 
33 36
     public ViewPagerAdapter(BaseReactActivity context, ViewPager viewPager, RnnToolBar toolbar,
34 37
                             ArrayList<Screen> screens) {
35 38
         mContext = context;
36 39
         mViewPager = viewPager;
37 40
         mToolbar = toolbar;
38
-        mScreens = screens;
41
+        screenStacks = new ArrayList<>();
42
+        stacksByNavId  = new HashMap<>();
43
+        for(Screen screen: screens){
44
+            ScreenStack stack = new ScreenStack(context);
45
+            stack.push(screen);
46
+            screenStacks.add(stack);
47
+            stacksByNavId.put(screen.navigatorId, stack);
48
+        }
39 49
         mReactInstanceManager = RctManager.getInstance().getReactInstanceManager();
40 50
     }
41 51
 
52
+    public void pushScreen(Screen screen){
53
+        ScreenStack stack = stacksByNavId.get(screen.navigatorId);
54
+        stack.push(screen);
55
+    }
56
+
42 57
     @Override
43 58
     public Object instantiateItem(ViewGroup container, int position) {
44
-        Screen screen = mScreens.get(position);
45
-        View view = new RctView(mContext, mReactInstanceManager, screen);
59
+        ScreenStack view = screenStacks.get(position);
46 60
         container.addView(view);
47 61
         return view;
48 62
     }
@@ -54,7 +68,7 @@ public class ViewPagerAdapter extends PagerAdapter implements TabLayout.OnTabSel
54 68
 
55 69
     @Override
56 70
     public int getCount() {
57
-        return mScreens.size();
71
+        return screenStacks.size();
58 72
     }
59 73
 
60 74
     @Override
@@ -64,7 +78,7 @@ public class ViewPagerAdapter extends PagerAdapter implements TabLayout.OnTabSel
64 78
 
65 79
     @Override
66 80
     public CharSequence getPageTitle(int position) {
67
-        return mScreens.get(position).title;
81
+        return screenStacks.get(position).peek().title;
68 82
     }
69 83
 
70 84
     @Override
@@ -75,7 +89,7 @@ public class ViewPagerAdapter extends PagerAdapter implements TabLayout.OnTabSel
75 89
 
76 90
         // Send tab selected event
77 91
         WritableMap params = Arguments.createMap();
78
-        Screen screen = mScreens.get(position);
92
+        Screen screen = screenStacks.get(position).peek();
79 93
         params.putString(Screen.KEY_NAVIGATOR_EVENT_ID, screen.navigatorEventId);
80 94
 
81 95
         mToolbar.setupToolbarButtonsAsync(mScreens.get(position));

+ 10
- 10
android/app/src/main/java/com/reactnativenavigation/modules/RctActivityModule.java View File

@@ -9,6 +9,7 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule;
9 9
 import com.facebook.react.bridge.ReactMethod;
10 10
 import com.facebook.react.bridge.ReadableArray;
11 11
 import com.facebook.react.bridge.ReadableMap;
12
+import com.reactnativenavigation.activities.BaseReactActivity;
12 13
 import com.reactnativenavigation.activities.SingleScreenActivity;
13 14
 import com.reactnativenavigation.activities.TabActivity;
14 15
 import com.reactnativenavigation.core.objects.Screen;
@@ -36,11 +37,9 @@ public class RctActivityModule extends ReactContextBaseJavaModule {
36 37
         Activity context = ContextProvider.getActivityContext();
37 38
         if (context != null && !context.isFinishing()) {
38 39
             Intent intent = new Intent(context, TabActivity.class);
39
-
40 40
             Bundle extras = new Bundle();
41 41
             extras.putSerializable(TabActivity.EXTRA_SCREENS, createScreens(screens));
42 42
             intent.putExtras(extras);
43
-
44 43
             context.startActivity(intent);
45 44
         }
46 45
     }
@@ -55,20 +54,21 @@ public class RctActivityModule extends ReactContextBaseJavaModule {
55 54
 
56 55
     @ReactMethod
57 56
     public void startSingleScreenApp(ReadableMap screen) {
58
-        navigatorPush(screen);
59
-    }
60
-
61
-    @ReactMethod
62
-    public void navigatorPush(ReadableMap screen) {
63
-        Activity context = ContextProvider.getActivityContext();
57
+        BaseReactActivity context = ContextProvider.getActivityContext();
64 58
         if (context != null && !context.isFinishing()) {
65 59
             Intent intent = new Intent(context, SingleScreenActivity.class);
66
-
67 60
             Bundle extras = new Bundle();
68 61
             extras.putSerializable(SingleScreenActivity.EXTRA_SCREEN, new Screen(screen));
69 62
             intent.putExtras(extras);
70
-
71 63
             context.startActivity(intent);
72 64
         }
73 65
     }
66
+
67
+    @ReactMethod
68
+    public void navigatorPush(ReadableMap screen) {
69
+        BaseReactActivity context = ContextProvider.getActivityContext();
70
+         if (context != null && !context.isFinishing()) {
71
+             context.push(new Screen(screen));
72
+        }
73
+    }
74 74
 }

+ 5
- 4
android/app/src/main/java/com/reactnativenavigation/utils/ContextProvider.java View File

@@ -1,8 +1,9 @@
1 1
 package com.reactnativenavigation.utils;
2 2
 
3
-import android.app.Activity;
4 3
 import android.support.annotation.Nullable;
5 4
 
5
+import com.reactnativenavigation.activities.BaseReactActivity;
6
+
6 7
 import java.lang.ref.WeakReference;
7 8
 
8 9
 /**
@@ -10,15 +11,15 @@ import java.lang.ref.WeakReference;
10 11
  * Created by guyc on 10/03/16.
11 12
  */
12 13
 public class ContextProvider {
13
-    private static WeakReference<Activity> sActivityWR;
14
+    private static WeakReference<BaseReactActivity> sActivityWR;
14 15
 
15
-    public static void setActivityContext(Activity activity) {
16
+    public static void setActivityContext(BaseReactActivity activity) {
16 17
         if (sActivityWR == null) {
17 18
             sActivityWR = new WeakReference<>(activity);
18 19
         }
19 20
     }
20 21
 
21
-    public static @Nullable Activity getActivityContext() {
22
+    public static @Nullable BaseReactActivity getActivityContext() {
22 23
         return sActivityWR != null ? sActivityWR.get() : null;
23 24
     }
24 25
 

+ 60
- 0
android/app/src/main/java/com/reactnativenavigation/views/ScreenStack.java View File

@@ -0,0 +1,60 @@
1
+package com.reactnativenavigation.views;
2
+
3
+import android.animation.LayoutTransition;
4
+import android.widget.FrameLayout;
5
+
6
+import com.facebook.react.ReactInstanceManager;
7
+import com.reactnativenavigation.activities.BaseReactActivity;
8
+import com.reactnativenavigation.core.RctManager;
9
+import com.reactnativenavigation.core.objects.Screen;
10
+
11
+import java.util.Stack;
12
+
13
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
14
+
15
+public class ScreenStack extends FrameLayout {
16
+
17
+    private class ScreenView{
18
+        Screen screen;
19
+        RctView view;
20
+
21
+        public ScreenView(Screen screen, RctView view) {
22
+            this.screen = screen;
23
+            this.view = view;
24
+        }
25
+    }
26
+
27
+    private final Stack<ScreenView> stack = new Stack<>();
28
+    private final ReactInstanceManager mReactInstanceManager = RctManager.getInstance().getReactInstanceManager();
29
+    private final BaseReactActivity reactActivity;
30
+
31
+    public ScreenStack(BaseReactActivity context){
32
+        super(context);
33
+        reactActivity = context;
34
+        setLayoutTransition(new LayoutTransition());
35
+    }
36
+
37
+    public void push(Screen screen){
38
+        RctView view = new RctView(reactActivity, mReactInstanceManager, screen);
39
+        addView(view, MATCH_PARENT, MATCH_PARENT);
40
+        stack.push(new ScreenView(screen, view));
41
+    }
42
+
43
+    public Screen pop(){
44
+        ScreenView popped = stack.pop();
45
+        removeView(popped.view);
46
+        return popped.screen;
47
+    }
48
+
49
+    public boolean isEmpty(){
50
+        return stack.isEmpty();
51
+    }
52
+
53
+    public int getStackSize(){
54
+        return stack.size();
55
+    }
56
+
57
+    public Screen peek(){
58
+        return stack.peek().screen;
59
+    }
60
+}