Browse Source

[android] Custom orientation change hnadling (#783)

* [android] Basic implementation of orientation change event and getter

#dasdsa

* [android] Check if fabAnimator is not null

* [android] Add configChanges prop to NavigationActivity in AndroidManifest

* [android] Fix duplicate declaration of onConfigurationChange

* [android] Use EventEmitter class to dispatch orientation change events
Jakub Martyčák 8 years ago
parent
commit
5cea516563

+ 3
- 1
android/app/src/main/AndroidManifest.xml View File

2
           package="com.reactnativenavigation">
2
           package="com.reactnativenavigation">
3
 
3
 
4
     <application>
4
     <application>
5
-        <activity android:name=".controllers.NavigationActivity" />
5
+        <activity
6
+            android:name=".controllers.NavigationActivity"
7
+            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"/>
6
         <activity
8
         <activity
7
             android:name=".controllers.PortraitNavigationActivity"
9
             android:name=".controllers.PortraitNavigationActivity"
8
             android:configChanges="orientation|screenSize|keyboardHidden"
10
             android:configChanges="orientation|screenSize|keyboardHidden"

+ 26
- 0
android/app/src/main/java/com/reactnativenavigation/bridge/NavigationReactModule.java View File

1
 package com.reactnativenavigation.bridge;
1
 package com.reactnativenavigation.bridge;
2
 
2
 
3
+import android.app.Activity;
4
+import android.content.res.Configuration;
5
+
3
 import com.facebook.react.bridge.Callback;
6
 import com.facebook.react.bridge.Callback;
7
+import com.facebook.react.bridge.Promise;
4
 import com.facebook.react.bridge.ReactApplicationContext;
8
 import com.facebook.react.bridge.ReactApplicationContext;
5
 import com.facebook.react.bridge.ReactContextBaseJavaModule;
9
 import com.facebook.react.bridge.ReactContextBaseJavaModule;
6
 import com.facebook.react.bridge.ReactMethod;
10
 import com.facebook.react.bridge.ReactMethod;
220
     public void dismissContextualMenu(String screenInstanceId) {
224
     public void dismissContextualMenu(String screenInstanceId) {
221
         NavigationCommandsHandler.dismissContextualMenu(screenInstanceId);
225
         NavigationCommandsHandler.dismissContextualMenu(screenInstanceId);
222
     }
226
     }
227
+
228
+    @ReactMethod
229
+    public void getOrientation(Promise promise) {
230
+        Activity activity = getCurrentActivity();
231
+        if (activity != null) {
232
+            int orientation = getCurrentActivity().getResources().getConfiguration().orientation;
233
+            switch (orientation) {
234
+                case Configuration.ORIENTATION_PORTRAIT:
235
+                    promise.resolve("PORTRAIT");
236
+                    return;
237
+                case Configuration.ORIENTATION_LANDSCAPE:
238
+                    promise.resolve("LANDSCAPE");
239
+                    return;
240
+                case Configuration.ORIENTATION_UNDEFINED:
241
+                    promise.resolve("UNDEFINED");
242
+                    return;
243
+            }
244
+        } else {
245
+            promise.resolve("UNDEFINED");
246
+        }
247
+    }
248
+
223
 }
249
 }

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

9
 import android.support.v7.app.AppCompatActivity;
9
 import android.support.v7.app.AppCompatActivity;
10
 import android.view.KeyEvent;
10
 import android.view.KeyEvent;
11
 
11
 
12
+import com.facebook.react.bridge.Arguments;
12
 import com.facebook.react.bridge.Callback;
13
 import com.facebook.react.bridge.Callback;
14
+import com.facebook.react.bridge.ReactContext;
15
+import com.facebook.react.bridge.WritableMap;
13
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
16
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
17
+import com.facebook.react.modules.core.DeviceEventManagerModule;
14
 import com.facebook.react.modules.core.PermissionAwareActivity;
18
 import com.facebook.react.modules.core.PermissionAwareActivity;
15
 import com.facebook.react.modules.core.PermissionListener;
19
 import com.facebook.react.modules.core.PermissionListener;
16
 import com.reactnativenavigation.NavigationApplication;
20
 import com.reactnativenavigation.NavigationApplication;
21
+import com.reactnativenavigation.bridge.EventEmitter;
22
+import com.reactnativenavigation.bridge.NavigationReactEventEmitter;
17
 import com.reactnativenavigation.events.Event;
23
 import com.reactnativenavigation.events.Event;
18
 import com.reactnativenavigation.events.EventBus;
24
 import com.reactnativenavigation.events.EventBus;
19
 import com.reactnativenavigation.events.JsDevReloadEvent;
25
 import com.reactnativenavigation.events.JsDevReloadEvent;
20
 import com.reactnativenavigation.events.ModalDismissedEvent;
26
 import com.reactnativenavigation.events.ModalDismissedEvent;
27
+import com.reactnativenavigation.events.OrientationChangedEvent;
21
 import com.reactnativenavigation.events.Subscriber;
28
 import com.reactnativenavigation.events.Subscriber;
22
 import com.reactnativenavigation.layouts.BottomTabsLayout;
29
 import com.reactnativenavigation.layouts.BottomTabsLayout;
23
 import com.reactnativenavigation.layouts.Layout;
30
 import com.reactnativenavigation.layouts.Layout;
121
         NavigationApplication.instance.getActivityCallbacks().onNewIntent(intent);
128
         NavigationApplication.instance.getActivityCallbacks().onNewIntent(intent);
122
     }
129
     }
123
 
130
 
124
-    @Override
125
-    public void onConfigurationChanged(Configuration newConfig) {
126
-        super.onConfigurationChanged(newConfig);
127
-        NavigationApplication.instance.getActivityCallbacks().onConfigurationChanged(newConfig);
128
-    }
129
-
130
     @Override
131
     @Override
131
     protected void onPause() {
132
     protected void onPause() {
132
         super.onPause();
133
         super.onPause();
194
         return NavigationApplication.instance.getReactGateway();
195
         return NavigationApplication.instance.getReactGateway();
195
     }
196
     }
196
 
197
 
198
+    @Override
199
+    public void onConfigurationChanged(Configuration newConfig) {
200
+        EventEmitter eventEmitter = NavigationApplication.instance.getEventEmitter();
201
+        OrientationChangedEvent event = new OrientationChangedEvent();
202
+        WritableMap params = Arguments.createMap();
203
+
204
+        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
205
+            params.putString("orientation", "LANDSCAPE");
206
+        }
207
+
208
+        if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
209
+            params.putString("orientation", "PORTRAIT");
210
+        }
211
+
212
+        if (newConfig.orientation == Configuration.ORIENTATION_UNDEFINED) {
213
+            params.putString("orientation", "UNDEFINED");
214
+        }
215
+
216
+        eventEmitter.sendNavigatorEvent(event.getType(), params);
217
+        NavigationApplication.instance.getActivityCallbacks().onConfigurationChanged(newConfig);
218
+        super.onConfigurationChanged(newConfig);
219
+    }
220
+
197
     void push(ScreenParams params) {
221
     void push(ScreenParams params) {
198
         if (modalController.containsNavigator(params.getNavigatorId())) {
222
         if (modalController.containsNavigator(params.getNavigatorId())) {
199
             modalController.push(params);
223
             modalController.push(params);

+ 9
- 0
android/app/src/main/java/com/reactnativenavigation/events/OrientationChangedEvent.java View File

1
+package com.reactnativenavigation.events;
2
+
3
+public class OrientationChangedEvent implements Event {
4
+    public static final String TYPE = "OrientationChanged";
5
+    @Override
6
+    public String getType() {
7
+        return TYPE;
8
+    }
9
+}

+ 13
- 11
android/app/src/main/java/com/reactnativenavigation/views/FloatingActionButtonCoordinator.java View File

73
             }
73
             }
74
             return;
74
             return;
75
         }
75
         }
76
-
77
-        fabAnimator.removeFabFromScreen(expendedFab, new AnimatorListenerAdapter() {
78
-            @Override
79
-            public void onAnimationEnd(Animator animation) {
80
-                removeAllViews();
81
-                if (onComplete != null) {
82
-                    onComplete.run();
76
+        if (fabAnimator != null) {
77
+            fabAnimator.removeFabFromScreen(expendedFab, new AnimatorListenerAdapter() {
78
+                @Override
79
+                public void onAnimationEnd(Animator animation) {
80
+                    removeAllViews();
81
+                    if (onComplete != null) {
82
+                        onComplete.run();
83
+                    }
83
                 }
84
                 }
84
-            }
85
-        });
86
-        fabAnimator.removeFabFromScreen(collapsedFab, null);
87
-        fabAnimator.removeActionsFromScreen(actions);
85
+            });
86
+            fabAnimator.removeFabFromScreen(collapsedFab, null);
87
+            fabAnimator.removeActionsFromScreen(actions);
88
+        }
89
+
88
     }
90
     }
89
 
91
 
90
     private boolean hasFab() {
92
     private boolean hasFab() {