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
 package com.reactnativenavigation.controllers;
1
 package com.reactnativenavigation.controllers;
2
 
2
 
3
+import android.app.Activity;
3
 import android.app.Dialog;
4
 import android.app.Dialog;
4
-import android.content.Context;
5
 import android.content.DialogInterface;
5
 import android.content.DialogInterface;
6
 import android.view.Window;
6
 import android.view.Window;
7
 
7
 
8
 import com.reactnativenavigation.R;
8
 import com.reactnativenavigation.R;
9
+import com.reactnativenavigation.layouts.Layout;
10
+import com.reactnativenavigation.layouts.SingleScreenLayout;
9
 import com.reactnativenavigation.params.ScreenParams;
11
 import com.reactnativenavigation.params.ScreenParams;
10
 
12
 
11
 public class Modal extends Dialog implements DialogInterface.OnDismissListener {
13
 public class Modal extends Dialog implements DialogInterface.OnDismissListener {
14
+    private final ModalController modalController;
12
     private final ScreenParams screenParams;
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
         this.screenParams = screenParams;
21
         this.screenParams = screenParams;
22
+        createContent();
23
+    }
24
+
25
+    private void createContent() {
17
         setCancelable(true);
26
         setCancelable(true);
27
+        setOnDismissListener(this);
18
         requestWindowFeature(Window.FEATURE_NO_TITLE);
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
     @Override
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
         this.activity = activity;
14
         this.activity = activity;
15
     }
15
     }
16
 
16
 
17
-
18
     public void showModal(ScreenParams screenParams) {
17
     public void showModal(ScreenParams screenParams) {
19
-        Modal modal = new Modal(activity, screenParams);
18
+        Modal modal = new Modal(activity, this, screenParams);
20
         modal.show();
19
         modal.show();
21
         stack.add(modal);
20
         stack.add(modal);
22
     }
21
     }
23
 
22
 
23
+    public void dismissModal() {
24
+
25
+    }
26
+
24
     public boolean onBackPressed() {
27
     public boolean onBackPressed() {
25
         return false;
28
         return false;
26
     }
29
     }
28
     public void onDestroy() {
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
 import android.os.Bundle;
4
 import android.os.Bundle;
5
 import android.support.v7.app.AppCompatActivity;
5
 import android.support.v7.app.AppCompatActivity;
6
 import android.view.KeyEvent;
6
 import android.view.KeyEvent;
7
-import android.view.View;
8
 
7
 
9
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
8
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
10
 import com.reactnativenavigation.NavigationApplication;
9
 import com.reactnativenavigation.NavigationApplication;
52
 
51
 
53
     private void createLayout() {
52
     private void createLayout() {
54
         layout = LayoutFactory.create(this, activityParams);
53
         layout = LayoutFactory.create(this, activityParams);
55
-        setContentView((View) layout);
54
+        setContentView(layout.asView());
56
     }
55
     }
57
 
56
 
58
     @Override
57
     @Override
115
     }
114
     }
116
 
115
 
117
     void push(ScreenParams params) {
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
     void pop(ScreenParams params) {
124
     void pop(ScreenParams params) {

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

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

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

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