Browse Source

working on modals

Daniel Zlotin 8 years ago
parent
commit
7c5d60b14f

+ 27
- 4
android/app/src/main/java/com/reactnativenavigation/controllers/Modal.java View File

@@ -1,26 +1,49 @@
1 1
 package com.reactnativenavigation.controllers;
2 2
 
3
+import android.app.Activity;
3 4
 import android.app.Dialog;
4
-import android.content.Context;
5 5
 import android.content.DialogInterface;
6 6
 import android.view.Window;
7 7
 
8 8
 import com.reactnativenavigation.R;
9
+import com.reactnativenavigation.layouts.Layout;
10
+import com.reactnativenavigation.layouts.SingleScreenLayout;
9 11
 import com.reactnativenavigation.params.ScreenParams;
10 12
 
11 13
 public class Modal extends Dialog implements DialogInterface.OnDismissListener {
14
+    private final ModalController modalController;
12 15
     private final ScreenParams screenParams;
16
+    private Layout layout;
13 17
 
14
-    public Modal(Context context, ScreenParams screenParams) {
15
-        super(context, R.style.Modal);
18
+    public Modal(Activity activity, ModalController modalController, ScreenParams screenParams) {
19
+        super(activity, R.style.Modal);
20
+        this.modalController = modalController;
16 21
         this.screenParams = screenParams;
22
+        createContent();
23
+    }
24
+
25
+    private void createContent() {
17 26
         setCancelable(true);
27
+        setOnDismissListener(this);
18 28
         requestWindowFeature(Window.FEATURE_NO_TITLE);
29
+        layout = new SingleScreenLayout(getContext(), screenParams);
30
+        setContentView(layout.asView());
31
+    }
19 32
 
33
+    public void push(ScreenParams params) {
34
+        layout.push(params);
20 35
     }
21 36
 
22 37
     @Override
23
-    public void onDismiss(DialogInterface dialog) {
38
+    public void onBackPressed() {
39
+        if (!layout.onBackPressed()) {
40
+            super.onBackPressed();
41
+        }
42
+    }
24 43
 
44
+    @Override
45
+    public void onDismiss(DialogInterface dialog) {
46
+        layout.removeAllReactViews();
47
+        modalController.modalDismissed(this);
25 48
     }
26 49
 }

+ 17
- 40
android/app/src/main/java/com/reactnativenavigation/controllers/ModalController.java View File

@@ -14,13 +14,16 @@ public class ModalController {
14 14
         this.activity = activity;
15 15
     }
16 16
 
17
-
18 17
     public void showModal(ScreenParams screenParams) {
19
-        Modal modal = new Modal(activity, screenParams);
18
+        Modal modal = new Modal(activity, this, screenParams);
20 19
         modal.show();
21 20
         stack.add(modal);
22 21
     }
23 22
 
23
+    public void dismissModal() {
24
+
25
+    }
26
+
24 27
     public boolean onBackPressed() {
25 28
         return false;
26 29
     }
@@ -28,42 +31,16 @@ public class ModalController {
28 31
     public void onDestroy() {
29 32
 
30 33
     }
31
-    //    public void add(RnnModal modal) {
32
-//        modals.add(modal);
33
-//    }
34
-//
35
-//    public boolean isModalDisplayed() {
36
-//        return !modals.isEmpty();
37
-//    }
38
-//
39
-//    @Nullable
40
-//    public RnnModal get() {
41
-//        return isModalDisplayed() ? modals.peek() : null;
42
-//    }
43
-//
44
-//    public void remove() {
45
-//        if (isModalDisplayed()) {
46
-//            modals.pop();
47
-//        }
48
-//    }
49
-//
50
-//    public void dismissAllModals() {
51
-//        while (isModalDisplayed()) {
52
-//            dismissModal();
53
-//        }
54
-//    }
55
-//
56
-//    public void dismissModal() {
57
-//        if (isModalDisplayed()) {
58
-//            modals.pop().dismiss();
59
-//        }
60
-//    }
61
-//
62
-//    public void onDestroy() {
63
-//
64
-//    }
65
-//
66
-//    public boolean onBackPressed() {
67
-//        return false;
68
-//    }
34
+
35
+    public boolean isShowing() {
36
+        return !stack.empty();
37
+    }
38
+
39
+    public void modalDismissed(Modal modal) {
40
+        stack.remove(modal);
41
+    }
42
+
43
+    public void push(ScreenParams params) {
44
+        stack.peek().push(params);
45
+    }
69 46
 }

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

@@ -4,7 +4,6 @@ import android.content.Intent;
4 4
 import android.os.Bundle;
5 5
 import android.support.v7.app.AppCompatActivity;
6 6
 import android.view.KeyEvent;
7
-import android.view.View;
8 7
 
9 8
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
10 9
 import com.reactnativenavigation.NavigationApplication;
@@ -52,7 +51,7 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard
52 51
 
53 52
     private void createLayout() {
54 53
         layout = LayoutFactory.create(this, activityParams);
55
-        setContentView((View) layout);
54
+        setContentView(layout.asView());
56 55
     }
57 56
 
58 57
     @Override
@@ -115,7 +114,11 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard
115 114
     }
116 115
 
117 116
     void push(ScreenParams params) {
118
-        layout.push(params);
117
+        if (modalController.isShowing()) {
118
+            modalController.push(params);
119
+        } else {
120
+            layout.push(params);
121
+        }
119 122
     }
120 123
 
121 124
     void pop(ScreenParams params) {

+ 4
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/Layout.java View File

@@ -1,11 +1,15 @@
1 1
 package com.reactnativenavigation.layouts;
2 2
 
3
+import android.view.View;
4
+
3 5
 import com.reactnativenavigation.params.ScreenParams;
4 6
 import com.reactnativenavigation.params.TitleBarButtonParams;
5 7
 
6 8
 import java.util.List;
7 9
 
8 10
 public interface Layout {
11
+    View asView();
12
+
9 13
     boolean onBackPressed();
10 14
 
11 15
     void onDestroy();

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

@@ -1,6 +1,7 @@
1 1
 package com.reactnativenavigation.layouts;
2 2
 
3 3
 import android.content.Context;
4
+import android.view.View;
4 5
 import android.widget.FrameLayout;
5 6
 
6 7
 import com.reactnativenavigation.params.ScreenParams;
@@ -80,6 +81,11 @@ public class SingleScreenLayout extends FrameLayout implements Layout {
80 81
         stack.setTitleBarTitle(screenInstanceId, title);
81 82
     }
82 83
 
84
+    @Override
85
+    public View asView() {
86
+        return this;
87
+    }
88
+
83 89
     @Override
84 90
     public void setTitleBarButtons(String screenInstanceId, String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
85 91
         stack.setTitleBarButtons(screenInstanceId, navigatorEventId, titleBarButtons);