Browse Source

ScreenStackContainer + modals

Daniel Zlotin 8 years ago
parent
commit
c58f15a0b8

+ 34
- 6
android/app/src/main/java/com/reactnativenavigation/controllers/Modal.java View File

8
 
8
 
9
 import com.reactnativenavigation.R;
9
 import com.reactnativenavigation.R;
10
 import com.reactnativenavigation.layouts.Layout;
10
 import com.reactnativenavigation.layouts.Layout;
11
+import com.reactnativenavigation.layouts.ScreenStackContainer;
11
 import com.reactnativenavigation.layouts.SingleScreenLayout;
12
 import com.reactnativenavigation.layouts.SingleScreenLayout;
12
 import com.reactnativenavigation.params.ScreenParams;
13
 import com.reactnativenavigation.params.ScreenParams;
13
 
14
 
14
-public class Modal extends Dialog implements DialogInterface.OnDismissListener {
15
-    private final ModalController modalController;
15
+public class Modal extends Dialog implements DialogInterface.OnDismissListener, ScreenStackContainer {
16
+
17
+    private final OnModalDismissedListener onModalDismissedListener;
18
+
19
+    public interface OnModalDismissedListener {
20
+        void onModalDismissed(Modal modal);
21
+    }
22
+
16
     private final ScreenParams screenParams;
23
     private final ScreenParams screenParams;
17
     private Layout layout;
24
     private Layout layout;
18
 
25
 
19
-    public Modal(Activity activity, ModalController modalController, ScreenParams screenParams) {
26
+    public Modal(Activity activity, OnModalDismissedListener onModalDismissedListener, ScreenParams screenParams) {
20
         super(activity, R.style.Modal);
27
         super(activity, R.style.Modal);
21
-        this.modalController = modalController;
28
+        this.onModalDismissedListener = onModalDismissedListener;
22
         this.screenParams = screenParams;
29
         this.screenParams = screenParams;
23
         createContent();
30
         createContent();
24
     }
31
     }
31
         setContentView(layout.asView());
38
         setContentView(layout.asView());
32
     }
39
     }
33
 
40
 
41
+    @Override
34
     public void push(ScreenParams params) {
42
     public void push(ScreenParams params) {
35
         layout.push(params);
43
         layout.push(params);
36
     }
44
     }
37
 
45
 
46
+    @Override
47
+    public void pop(ScreenParams screenParams) {
48
+        layout.pop(screenParams);
49
+    }
50
+
51
+    @Override
52
+    public void popToRoot(ScreenParams params) {
53
+        layout.popToRoot(params);
54
+    }
55
+
56
+    @Override
57
+    public void newStack(ScreenParams params) {
58
+        layout.newStack(params);
59
+    }
60
+
61
+    @Override
62
+    public void destroy() {
63
+        layout.destroy();
64
+    }
65
+
38
     @Override
66
     @Override
39
     public void onBackPressed() {
67
     public void onBackPressed() {
40
         Log.d("LOG", "Modal.onBackPressed ");
68
         Log.d("LOG", "Modal.onBackPressed ");
45
 
73
 
46
     @Override
74
     @Override
47
     public void onDismiss(DialogInterface dialog) {
75
     public void onDismiss(DialogInterface dialog) {
48
-        layout.removeAllReactViews();
49
-        modalController.modalDismissed(this);
76
+        destroy();
77
+        onModalDismissedListener.onModalDismissed(this);
50
     }
78
     }
51
 }
79
 }

+ 30
- 9
android/app/src/main/java/com/reactnativenavigation/controllers/ModalController.java View File

3
 import android.app.Activity;
3
 import android.app.Activity;
4
 import android.util.Log;
4
 import android.util.Log;
5
 
5
 
6
+import com.reactnativenavigation.layouts.ScreenStackContainer;
6
 import com.reactnativenavigation.params.ScreenParams;
7
 import com.reactnativenavigation.params.ScreenParams;
7
 
8
 
8
 import java.util.Stack;
9
 import java.util.Stack;
9
 
10
 
10
-public class ModalController {
11
+public class ModalController implements ScreenStackContainer, Modal.OnModalDismissedListener {
11
     private final Activity activity;
12
     private final Activity activity;
12
     private Stack<Modal> stack = new Stack<>();
13
     private Stack<Modal> stack = new Stack<>();
13
 
14
 
22
     }
23
     }
23
 
24
 
24
     public void dismissModal() {
25
     public void dismissModal() {
25
-
26
+        stack.pop().destroy();
26
     }
27
     }
27
 
28
 
28
     public boolean onBackPressed() {
29
     public boolean onBackPressed() {
30
         return false;
31
         return false;
31
     }
32
     }
32
 
33
 
33
-    public void onDestroy() {
34
+    public boolean isShowing() {
35
+        return !stack.empty();
36
+    }
34
 
37
 
38
+    public void push(ScreenParams params) {
39
+        stack.peek().push(params);
35
     }
40
     }
36
 
41
 
37
-    public boolean isShowing() {
38
-        return !stack.empty();
42
+    @Override
43
+    public void pop(ScreenParams screenParams) {
44
+        stack.peek().pop(screenParams);
39
     }
45
     }
40
 
46
 
41
-    public void modalDismissed(Modal modal) {
42
-        stack.remove(modal);
47
+    @Override
48
+    public void popToRoot(ScreenParams params) {
49
+        stack.peek().popToRoot(params);
43
     }
50
     }
44
 
51
 
45
-    public void push(ScreenParams params) {
46
-        stack.peek().push(params);
52
+    @Override
53
+    public void newStack(ScreenParams params) {
54
+        stack.peek().newStack(params);
55
+    }
56
+
57
+    @Override
58
+    public void destroy() {
59
+        for (Modal modal : stack) {
60
+            modal.destroy();
61
+        }
62
+        stack.clear();
63
+    }
64
+
65
+    @Override
66
+    public void onModalDismissed(Modal modal) {
67
+        stack.remove(modal);
47
     }
68
     }
48
 }
69
 }

+ 2
- 2
android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivity.java View File

71
     @Override
71
     @Override
72
     protected void onDestroy() {
72
     protected void onDestroy() {
73
         modalController.onDestroy();
73
         modalController.onDestroy();
74
-        layout.onDestroy();
74
+        layout.destroy();
75
         super.onDestroy();
75
         super.onDestroy();
76
         if (currentActivity == null || currentActivity.isFinishing()) {
76
         if (currentActivity == null || currentActivity.isFinishing()) {
77
             getNavigationReactInstance().onHostDestroy();
77
             getNavigationReactInstance().onHostDestroy();
80
 
80
 
81
     @Override
81
     @Override
82
     public void onJsDevReload() {
82
     public void onJsDevReload() {
83
-        layout.removeAllReactViews();
83
+        layout.destroy();
84
     }
84
     }
85
 
85
 
86
     @Override
86
     @Override

+ 1
- 14
android/app/src/main/java/com/reactnativenavigation/layouts/Layout.java View File

2
 
2
 
3
 import android.view.View;
3
 import android.view.View;
4
 
4
 
5
-import com.reactnativenavigation.params.ScreenParams;
6
 import com.reactnativenavigation.params.TitleBarButtonParams;
5
 import com.reactnativenavigation.params.TitleBarButtonParams;
7
 
6
 
8
 import java.util.List;
7
 import java.util.List;
9
 
8
 
10
-public interface Layout {
9
+public interface Layout extends ScreenStackContainer {
11
     View asView();
10
     View asView();
12
 
11
 
13
     boolean onBackPressed();
12
     boolean onBackPressed();
14
 
13
 
15
-    void onDestroy();
16
-
17
-    void removeAllReactViews();
18
-
19
-    void push(ScreenParams params);
20
-
21
-    void pop(ScreenParams params);
22
-
23
-    void popToRoot(ScreenParams params);
24
-
25
-    void newStack(ScreenParams params);
26
-
27
     void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated);
14
     void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated);
28
 
15
 
29
     void setTitleBarTitle(String screenInstanceId, String title);
16
     void setTitleBarTitle(String screenInstanceId, String title);

+ 15
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/ScreenStackContainer.java View File

1
+package com.reactnativenavigation.layouts;
2
+
3
+import com.reactnativenavigation.params.ScreenParams;
4
+
5
+public interface ScreenStackContainer {
6
+    void push(ScreenParams screenParams);
7
+
8
+    void pop(ScreenParams screenParams);
9
+
10
+    void popToRoot(ScreenParams params);
11
+
12
+    void newStack(ScreenParams params);
13
+
14
+    void destroy();
15
+}

+ 1
- 6
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java View File

43
     }
43
     }
44
 
44
 
45
     @Override
45
     @Override
46
-    public void onDestroy() {
47
-        stack.destroy();
48
-    }
49
-
50
-    @Override
51
-    public void removeAllReactViews() {
46
+    public void destroy() {
52
         stack.destroy();
47
         stack.destroy();
53
     }
48
     }
54
 
49