Explorar el Código

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 hace 7 años
padre
commit
0f4e30ac33

+ 9
- 2
android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivity.java Ver fichero

172
 
172
 
173
     @Override
173
     @Override
174
     public void invokeDefaultOnBackPressed() {
174
     public void invokeDefaultOnBackPressed() {
175
-        super.onBackPressed();
175
+        if (layout != null && !layout.onBackPressed()) {
176
+            super.onBackPressed();
177
+        }
176
     }
178
     }
177
 
179
 
178
     @Override
180
     @Override
179
     public void onBackPressed() {
181
     public void onBackPressed() {
180
-        if (layout != null && !layout.onBackPressed()) {
182
+        if (layout != null && layout.handleBackInJs()) {
183
+            return;
184
+        }
185
+        if (getReactGateway().isInitialized()) {
181
             getReactGateway().onBackPressed();
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 Ver fichero

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

+ 2
- 0
android/app/src/main/java/com/reactnativenavigation/layouts/Layout.java Ver fichero

21
 
21
 
22
     boolean onBackPressed();
22
     boolean onBackPressed();
23
 
23
 
24
+    boolean handleBackInJs();
25
+
24
     void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated);
26
     void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated);
25
 
27
 
26
     void setTitleBarTitle(String screenInstanceId, String title);
28
     void setTitleBarTitle(String screenInstanceId, String title);

+ 6
- 1
android/app/src/main/java/com/reactnativenavigation/layouts/SingleScreenLayout.java Ver fichero

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