Sfoglia il codice sorgente

Started implementation of ScreenStack

Yedidya Kennard 9 anni fa
parent
commit
67952ccde8

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

23
 import com.facebook.react.shell.MainReactPackage;
23
 import com.facebook.react.shell.MainReactPackage;
24
 import com.reactnativenavigation.BuildConfig;
24
 import com.reactnativenavigation.BuildConfig;
25
 import com.reactnativenavigation.core.RctManager;
25
 import com.reactnativenavigation.core.RctManager;
26
+import com.reactnativenavigation.core.objects.Screen;
26
 import com.reactnativenavigation.packages.RnnPackage;
27
 import com.reactnativenavigation.packages.RnnPackage;
27
 import com.reactnativenavigation.utils.ContextProvider;
28
 import com.reactnativenavigation.utils.ContextProvider;
28
 
29
 
34
 /**
35
 /**
35
  * Base Activity for React Native applications.
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
     private static final String TAG = "BaseReactActivity";
40
     private static final String TAG = "BaseReactActivity";
40
     private static final String REDBOX_PERMISSION_MESSAGE =
41
     private static final String REDBOX_PERMISSION_MESSAGE =
199
         }
200
         }
200
     }
201
     }
201
 
202
 
203
+    public abstract void push(Screen screen);
204
+
202
     @Override
205
     @Override
203
     public boolean onCreateOptionsMenu(Menu menu) {
206
     public boolean onCreateOptionsMenu(Menu menu) {
204
         mMenu = menu;
207
         mMenu = menu;

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

5
 import com.facebook.react.ReactRootView;
5
 import com.facebook.react.ReactRootView;
6
 import com.reactnativenavigation.R;
6
 import com.reactnativenavigation.R;
7
 import com.reactnativenavigation.core.RctManager;
7
 import com.reactnativenavigation.core.RctManager;
8
+import com.reactnativenavigation.core.objects.Screen;
8
 
9
 
9
 /**
10
 /**
10
  * Created by guyc on 13/04/16.
11
  * Created by guyc on 13/04/16.
54
         super.onPause();
55
         super.onPause();
55
         finish();
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 Vedi File

1
 package com.reactnativenavigation.activities;
1
 package com.reactnativenavigation.activities;
2
 
2
 
3
 import android.support.v7.widget.Toolbar;
3
 import android.support.v7.widget.Toolbar;
4
-import android.view.View;
5
 import android.widget.FrameLayout;
4
 import android.widget.FrameLayout;
6
 
5
 
7
 import com.reactnativenavigation.R;
6
 import com.reactnativenavigation.R;
8
 import com.reactnativenavigation.core.RctManager;
7
 import com.reactnativenavigation.core.RctManager;
9
 import com.reactnativenavigation.core.objects.Screen;
8
 import com.reactnativenavigation.core.objects.Screen;
10
-import com.reactnativenavigation.views.RctView;
9
+import com.reactnativenavigation.views.ScreenStack;
11
 
10
 
12
 /**
11
 /**
13
  * Created by guyc on 05/04/16.
12
  * Created by guyc on 05/04/16.
18
 
17
 
19
     private Toolbar mToolbar;
18
     private Toolbar mToolbar;
20
     private FrameLayout mContentFrame;
19
     private FrameLayout mContentFrame;
20
+    private ScreenStack screenStack;
21
 
21
 
22
     @Override
22
     @Override
23
     protected void handleOnCreate() {
23
     protected void handleOnCreate() {
29
 
29
 
30
         Screen screen = (Screen) getIntent().getSerializableExtra(EXTRA_SCREEN);
30
         Screen screen = (Screen) getIntent().getSerializableExtra(EXTRA_SCREEN);
31
         setupToolbar(screen.title);
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
     private void setupToolbar(String title) {
38
     private void setupToolbar(String title) {
36
         mToolbar.setTitle(title);
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 Vedi File

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

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

12
 import com.reactnativenavigation.activities.BaseReactActivity;
12
 import com.reactnativenavigation.activities.BaseReactActivity;
13
 import com.reactnativenavigation.core.RctManager;
13
 import com.reactnativenavigation.core.RctManager;
14
 import com.reactnativenavigation.core.objects.Screen;
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
 import java.util.ArrayList;
17
 import java.util.ArrayList;
18
+import java.util.HashMap;
19
+import java.util.Map;
19
 
20
 
20
 /**
21
 /**
21
  * Created by guyc on 02/04/16.
22
  * Created by guyc on 02/04/16.
26
 
27
 
27
     private BaseReactActivity mContext;
28
     private BaseReactActivity mContext;
28
     private ViewPager mViewPager;
29
     private ViewPager mViewPager;
29
-    private RnnToolBar mToolbar;
30
-    private final ArrayList<Screen> mScreens;
30
+    private Toolbar mToolbar;
31
     private final ReactInstanceManager mReactInstanceManager;
31
     private final ReactInstanceManager mReactInstanceManager;
32
+    private final ArrayList<ScreenStack> screenStacks;
33
+    private final Map<String, ScreenStack> stacksByNavId;
34
+
32
 
35
 
33
     public ViewPagerAdapter(BaseReactActivity context, ViewPager viewPager, RnnToolBar toolbar,
36
     public ViewPagerAdapter(BaseReactActivity context, ViewPager viewPager, RnnToolBar toolbar,
34
                             ArrayList<Screen> screens) {
37
                             ArrayList<Screen> screens) {
35
         mContext = context;
38
         mContext = context;
36
         mViewPager = viewPager;
39
         mViewPager = viewPager;
37
         mToolbar = toolbar;
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
         mReactInstanceManager = RctManager.getInstance().getReactInstanceManager();
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
     @Override
57
     @Override
43
     public Object instantiateItem(ViewGroup container, int position) {
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
         container.addView(view);
60
         container.addView(view);
47
         return view;
61
         return view;
48
     }
62
     }
54
 
68
 
55
     @Override
69
     @Override
56
     public int getCount() {
70
     public int getCount() {
57
-        return mScreens.size();
71
+        return screenStacks.size();
58
     }
72
     }
59
 
73
 
60
     @Override
74
     @Override
64
 
78
 
65
     @Override
79
     @Override
66
     public CharSequence getPageTitle(int position) {
80
     public CharSequence getPageTitle(int position) {
67
-        return mScreens.get(position).title;
81
+        return screenStacks.get(position).peek().title;
68
     }
82
     }
69
 
83
 
70
     @Override
84
     @Override
75
 
89
 
76
         // Send tab selected event
90
         // Send tab selected event
77
         WritableMap params = Arguments.createMap();
91
         WritableMap params = Arguments.createMap();
78
-        Screen screen = mScreens.get(position);
92
+        Screen screen = screenStacks.get(position).peek();
79
         params.putString(Screen.KEY_NAVIGATOR_EVENT_ID, screen.navigatorEventId);
93
         params.putString(Screen.KEY_NAVIGATOR_EVENT_ID, screen.navigatorEventId);
80
 
94
 
81
         mToolbar.setupToolbarButtonsAsync(mScreens.get(position));
95
         mToolbar.setupToolbarButtonsAsync(mScreens.get(position));

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

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

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

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

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
+}