Преглед изворни кода

[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 година
родитељ
комит
5cea516563

+ 3
- 1
android/app/src/main/AndroidManifest.xml Прегледај датотеку

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

+ 26
- 0
android/app/src/main/java/com/reactnativenavigation/bridge/NavigationReactModule.java Прегледај датотеку

@@ -1,6 +1,10 @@
1 1
 package com.reactnativenavigation.bridge;
2 2
 
3
+import android.app.Activity;
4
+import android.content.res.Configuration;
5
+
3 6
 import com.facebook.react.bridge.Callback;
7
+import com.facebook.react.bridge.Promise;
4 8
 import com.facebook.react.bridge.ReactApplicationContext;
5 9
 import com.facebook.react.bridge.ReactContextBaseJavaModule;
6 10
 import com.facebook.react.bridge.ReactMethod;
@@ -220,4 +224,26 @@ public class NavigationReactModule extends ReactContextBaseJavaModule {
220 224
     public void dismissContextualMenu(String screenInstanceId) {
221 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 Прегледај датотеку

@@ -9,15 +9,22 @@ import android.support.annotation.Nullable;
9 9
 import android.support.v7.app.AppCompatActivity;
10 10
 import android.view.KeyEvent;
11 11
 
12
+import com.facebook.react.bridge.Arguments;
12 13
 import com.facebook.react.bridge.Callback;
14
+import com.facebook.react.bridge.ReactContext;
15
+import com.facebook.react.bridge.WritableMap;
13 16
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
17
+import com.facebook.react.modules.core.DeviceEventManagerModule;
14 18
 import com.facebook.react.modules.core.PermissionAwareActivity;
15 19
 import com.facebook.react.modules.core.PermissionListener;
16 20
 import com.reactnativenavigation.NavigationApplication;
21
+import com.reactnativenavigation.bridge.EventEmitter;
22
+import com.reactnativenavigation.bridge.NavigationReactEventEmitter;
17 23
 import com.reactnativenavigation.events.Event;
18 24
 import com.reactnativenavigation.events.EventBus;
19 25
 import com.reactnativenavigation.events.JsDevReloadEvent;
20 26
 import com.reactnativenavigation.events.ModalDismissedEvent;
27
+import com.reactnativenavigation.events.OrientationChangedEvent;
21 28
 import com.reactnativenavigation.events.Subscriber;
22 29
 import com.reactnativenavigation.layouts.BottomTabsLayout;
23 30
 import com.reactnativenavigation.layouts.Layout;
@@ -121,12 +128,6 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard
121 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 131
     @Override
131 132
     protected void onPause() {
132 133
         super.onPause();
@@ -194,6 +195,29 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard
194 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 221
     void push(ScreenParams params) {
198 222
         if (modalController.containsNavigator(params.getNavigatorId())) {
199 223
             modalController.push(params);

+ 9
- 0
android/app/src/main/java/com/reactnativenavigation/events/OrientationChangedEvent.java Прегледај датотеку

@@ -0,0 +1,9 @@
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 Прегледај датотеку

@@ -73,18 +73,20 @@ public class FloatingActionButtonCoordinator {
73 73
             }
74 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 92
     private boolean hasFab() {