Browse Source

Android BackHandler

This commit continues the work done in #2057.
When hardware back button is pressed, we handle it accordingly:

1. If screen was pushed with `overrideBackPress: true`, we emit `backPress` event
2. Let `BackHandler` handle the event
3. If the event wasn't handled by `BackHandler`, pop the stack
4. let the system handle the event
Guy Carmeli 7 years ago
parent
commit
0f4e30ac33

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

@@ -172,13 +172,20 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard
172 172
 
173 173
     @Override
174 174
     public void invokeDefaultOnBackPressed() {
175
-        super.onBackPressed();
175
+        if (layout != null && !layout.onBackPressed()) {
176
+            super.onBackPressed();
177
+        }
176 178
     }
177 179
 
178 180
     @Override
179 181
     public void onBackPressed() {
180
-        if (layout != null && !layout.onBackPressed()) {
182
+        if (layout != null && layout.handleBackInJs()) {
183
+            return;
184
+        }
185
+        if (getReactGateway().isInitialized()) {
181 186
             getReactGateway().onBackPressed();
187
+        } else {
188
+            super.onBackPressed();
182 189
         }
183 190
     }
184 191
 

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

@@ -152,7 +152,7 @@ public class BottomTabsLayout extends BaseLayout implements AHBottomNavigation.O
152 152
 
153 153
     @Override
154 154
     public boolean onBackPressed() {
155
-        if (getCurrentScreenStack().handleBackPressInJs()) {
155
+        if (handleBackInJs()) {
156 156
             return true;
157 157
         }
158 158
 
@@ -166,6 +166,11 @@ public class BottomTabsLayout extends BaseLayout implements AHBottomNavigation.O
166 166
         }
167 167
     }
168 168
 
169
+    @Override
170
+    public boolean handleBackInJs() {
171
+        return getCurrentScreenStack().handleBackPressInJs();
172
+    }
173
+
169 174
     @Override
170 175
     public void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated) {
171 176
         for (int i = 0; i < bottomTabs.getItemsCount(); i++) {

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

@@ -21,6 +21,8 @@ public interface Layout extends ScreenStackContainer {
21 21
 
22 22
     boolean onBackPressed();
23 23
 
24
+    boolean handleBackInJs();
25
+
24 26
     void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated);
25 27
 
26 28
     void setTitleBarTitle(String screenInstanceId, String title);

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

@@ -109,7 +109,7 @@ public class SingleScreenLayout extends BaseLayout {
109 109
 
110 110
     @Override
111 111
     public boolean onBackPressed() {
112
-        if (stack.handleBackPressInJs()) {
112
+        if (handleBackInJs()) {
113 113
             return true;
114 114
         }
115 115
 
@@ -122,6 +122,11 @@ public class SingleScreenLayout extends BaseLayout {
122 122
         }
123 123
     }
124 124
 
125
+    @Override
126
+    public boolean handleBackInJs() {
127
+        return stack.handleBackPressInJs();
128
+    }
129
+
125 130
     @Override
126 131
     public void destroy() {
127 132
         stack.destroy();