Sfoglia il codice sorgente

ScreenStackContainer + modals

Daniel Zlotin 8 anni fa
parent
commit
c58f15a0b8

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

@@ -8,17 +8,24 @@ import android.view.Window;
8 8
 
9 9
 import com.reactnativenavigation.R;
10 10
 import com.reactnativenavigation.layouts.Layout;
11
+import com.reactnativenavigation.layouts.ScreenStackContainer;
11 12
 import com.reactnativenavigation.layouts.SingleScreenLayout;
12 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 23
     private final ScreenParams screenParams;
17 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 27
         super(activity, R.style.Modal);
21
-        this.modalController = modalController;
28
+        this.onModalDismissedListener = onModalDismissedListener;
22 29
         this.screenParams = screenParams;
23 30
         createContent();
24 31
     }
@@ -31,10 +38,31 @@ public class Modal extends Dialog implements DialogInterface.OnDismissListener {
31 38
         setContentView(layout.asView());
32 39
     }
33 40
 
41
+    @Override
34 42
     public void push(ScreenParams params) {
35 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 66
     @Override
39 67
     public void onBackPressed() {
40 68
         Log.d("LOG", "Modal.onBackPressed ");
@@ -45,7 +73,7 @@ public class Modal extends Dialog implements DialogInterface.OnDismissListener {
45 73
 
46 74
     @Override
47 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 Vedi File

@@ -3,11 +3,12 @@ package com.reactnativenavigation.controllers;
3 3
 import android.app.Activity;
4 4
 import android.util.Log;
5 5
 
6
+import com.reactnativenavigation.layouts.ScreenStackContainer;
6 7
 import com.reactnativenavigation.params.ScreenParams;
7 8
 
8 9
 import java.util.Stack;
9 10
 
10
-public class ModalController {
11
+public class ModalController implements ScreenStackContainer, Modal.OnModalDismissedListener {
11 12
     private final Activity activity;
12 13
     private Stack<Modal> stack = new Stack<>();
13 14
 
@@ -22,7 +23,7 @@ public class ModalController {
22 23
     }
23 24
 
24 25
     public void dismissModal() {
25
-
26
+        stack.pop().destroy();
26 27
     }
27 28
 
28 29
     public boolean onBackPressed() {
@@ -30,19 +31,39 @@ public class ModalController {
30 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 Vedi File

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

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

@@ -2,28 +2,15 @@ package com.reactnativenavigation.layouts;
2 2
 
3 3
 import android.view.View;
4 4
 
5
-import com.reactnativenavigation.params.ScreenParams;
6 5
 import com.reactnativenavigation.params.TitleBarButtonParams;
7 6
 
8 7
 import java.util.List;
9 8
 
10
-public interface Layout {
9
+public interface Layout extends ScreenStackContainer {
11 10
     View asView();
12 11
 
13 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 14
     void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated);
28 15
 
29 16
     void setTitleBarTitle(String screenInstanceId, String title);

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

@@ -0,0 +1,15 @@
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 Vedi File

@@ -43,12 +43,7 @@ public class SingleScreenLayout extends FrameLayout implements Layout {
43 43
     }
44 44
 
45 45
     @Override
46
-    public void onDestroy() {
47
-        stack.destroy();
48
-    }
49
-
50
-    @Override
51
-    public void removeAllReactViews() {
46
+    public void destroy() {
52 47
         stack.destroy();
53 48
     }
54 49