Browse Source

android: refactoring

Daniel Zlotin 8 years ago
parent
commit
1352b25a13

+ 4
- 98
android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java View File

@@ -1,21 +1,11 @@
1 1
 package com.reactnativenavigation;
2 2
 
3
-import android.app.Activity;
4 3
 import android.app.Application;
5
-import android.os.Bundle;
6 4
 
7 5
 import com.facebook.react.ReactApplication;
8
-import com.facebook.react.ReactInstanceManager;
9 6
 import com.facebook.react.ReactNativeHost;
10
-import com.facebook.react.bridge.ReactContext;
11
-import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
12
-import com.reactnativenavigation.react.NavigationEventEmitter;
7
+import com.reactnativenavigation.controllers.NavigationActivityLifecycleHandler;
13 8
 import com.reactnativenavigation.react.NavigationReactNativeHost;
14
-import com.reactnativenavigation.react.ReactDevPermission;
15
-import com.reactnativenavigation.utils.UiThread;
16
-
17
-import java.util.concurrent.atomic.AtomicBoolean;
18
-import java.util.concurrent.atomic.AtomicLong;
19 9
 
20 10
 public abstract class NavigationApplication extends Application implements ReactApplication {
21 11
     public static NavigationApplication instance;
@@ -26,93 +16,7 @@ public abstract class NavigationApplication extends Application implements React
26 16
         super.onCreate();
27 17
         instance = this;
28 18
         host = new NavigationReactNativeHost(this);
29
-
30
-        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
31
-            private AtomicBoolean creating = new AtomicBoolean(false);
32
-            private AtomicLong startTime = new AtomicLong(0);
33
-
34
-            @Override
35
-            public void onActivityCreated(final Activity activity, Bundle bundle) {
36
-                if (!(activity instanceof NavigationActivity)) return;
37
-                creating.set(true);
38
-            }
39
-
40
-            @Override
41
-            public void onActivityStarted(Activity activity) {
42
-            }
43
-
44
-            @Override
45
-            public void onActivityResumed(Activity activity) {
46
-                if (!(activity instanceof NavigationActivity)) return;
47
-
48
-                if (ReactDevPermission.shouldAskPermission()) {
49
-                    ReactDevPermission.askPermission(activity);
50
-                    return;
51
-                }
52
-
53
-                if (!host.getReactInstanceManager().hasStartedCreatingInitialContext()) {
54
-                    creating.set(false);
55
-                    startTime.set(System.currentTimeMillis());
56
-                    host.getReactInstanceManager().addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
57
-                        @Override
58
-                        public void onReactContextInitialized(final ReactContext context) {
59
-                            host.getReactInstanceManager().removeReactInstanceEventListener(this);
60
-
61
-                            long millisPassed = System.currentTimeMillis() - startTime.get();
62
-                            long diff = 1000 - millisPassed;
63
-
64
-                            UiThread.postDelayed(new Runnable() {
65
-                                @Override
66
-                                public void run() {
67
-                                    new NavigationEventEmitter(context).emitAppLaunched();
68
-                                }
69
-                            }, diff);
70
-                        }
71
-                    });
72
-                    host.getReactInstanceManager().createReactContextInBackground();
73
-                    host.getReactInstanceManager().onHostResume(activity, (DefaultHardwareBackBtnHandler) activity);
74
-                    return;
75
-                }
76
-
77
-                host.getReactInstanceManager().onHostResume(activity, (DefaultHardwareBackBtnHandler) activity);
78
-
79
-                if (creating.compareAndSet(true, false)) {
80
-                    // this should run only after activity closed and started again, but we already HAVE context
81
-                    UiThread.postDelayed(new Runnable() {
82
-                        @Override
83
-                        public void run() {
84
-                            new NavigationEventEmitter(host.getReactInstanceManager().getCurrentReactContext()).emitAppLaunched();
85
-                        }
86
-                    }, 1000);
87
-                }
88
-            }
89
-
90
-            @Override
91
-            public void onActivityPaused(Activity activity) {
92
-                if (!(activity instanceof NavigationActivity)) return;
93
-
94
-                if (host.getReactInstanceManager().hasStartedCreatingInitialContext()) {
95
-                    host.getReactInstanceManager().onHostPause(activity);
96
-                }
97
-            }
98
-
99
-            @Override
100
-            public void onActivityStopped(Activity activity) {
101
-            }
102
-
103
-            @Override
104
-            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
105
-            }
106
-
107
-            @Override
108
-            public void onActivityDestroyed(Activity activity) {
109
-                if (!(activity instanceof NavigationActivity)) return;
110
-
111
-                if (host.getReactInstanceManager().hasStartedCreatingInitialContext()) {
112
-                    host.getReactInstanceManager().onHostDestroy(activity);
113
-                }
114
-            }
115
-        });
19
+        registerActivityLifecycleCallbacks(new NavigationActivityLifecycleHandler(host.getReactInstanceManager()));
116 20
     }
117 21
 
118 22
     @Override
@@ -121,4 +25,6 @@ public abstract class NavigationApplication extends Application implements React
121 25
     }
122 26
 
123 27
     public abstract boolean isDebug();
28
+
29
+
124 30
 }

+ 126
- 0
android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivityLifecycleHandler.java View File

@@ -0,0 +1,126 @@
1
+package com.reactnativenavigation.controllers;
2
+
3
+import android.app.Activity;
4
+import android.app.Application;
5
+import android.os.Bundle;
6
+
7
+import com.facebook.react.ReactInstanceManager;
8
+import com.facebook.react.bridge.ReactContext;
9
+import com.reactnativenavigation.NavigationActivity;
10
+import com.reactnativenavigation.react.NavigationEventEmitter;
11
+import com.reactnativenavigation.react.ReactDevPermission;
12
+import com.reactnativenavigation.utils.UiThread;
13
+
14
+import java.util.concurrent.atomic.AtomicBoolean;
15
+import java.util.concurrent.atomic.AtomicLong;
16
+
17
+public class NavigationActivityLifecycleHandler implements Application.ActivityLifecycleCallbacks {
18
+    private final ReactInstanceManager reactInstanceManager;
19
+    private final AtomicBoolean creating = new AtomicBoolean(false);
20
+    private final AtomicLong startTime = new AtomicLong(0);
21
+
22
+    public NavigationActivityLifecycleHandler(ReactInstanceManager reactInstanceManager) {
23
+        this.reactInstanceManager = reactInstanceManager;
24
+    }
25
+
26
+    @Override
27
+    public void onActivityCreated(final Activity activity, Bundle bundle) {
28
+        if (activity instanceof NavigationActivity) {
29
+            handleCreated();
30
+        }
31
+    }
32
+
33
+    @Override
34
+    public void onActivityStarted(Activity activity) {
35
+    }
36
+
37
+    @Override
38
+    public void onActivityResumed(Activity activity) {
39
+        if (activity instanceof NavigationActivity) {
40
+            handleResumed((NavigationActivity) activity);
41
+        }
42
+    }
43
+
44
+    @Override
45
+    public void onActivityPaused(Activity activity) {
46
+        if (activity instanceof NavigationActivity) {
47
+            handlePaused((NavigationActivity) activity);
48
+        }
49
+    }
50
+
51
+    @Override
52
+    public void onActivityStopped(Activity activity) {
53
+    }
54
+
55
+    @Override
56
+    public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
57
+    }
58
+
59
+    @Override
60
+    public void onActivityDestroyed(Activity activity) {
61
+        if (activity instanceof NavigationActivity) {
62
+            handleDestroyed((NavigationActivity) activity);
63
+        }
64
+    }
65
+
66
+    private void handleCreated() {
67
+        creating.set(true);
68
+    }
69
+
70
+    private void handleResumed(NavigationActivity activity) {
71
+        if (ReactDevPermission.shouldAskPermission()) {
72
+            ReactDevPermission.askPermission(activity);
73
+        } else if (shouldCreateContext()) {
74
+            createContextAndEmitLaunched();
75
+            reactInstanceManager.onHostResume(activity, activity);
76
+        } else {
77
+            reactInstanceManager.onHostResume(activity, activity);
78
+            if (creating.compareAndSet(true, false)) {
79
+                // this should run only after activity closed and started again, but we already HAVE context
80
+                emitAppLaunchedAfterDelay(reactInstanceManager.getCurrentReactContext(), 1000);
81
+            }
82
+        }
83
+    }
84
+
85
+    private void createContextAndEmitLaunched() {
86
+        creating.set(false);
87
+        startTime.set(System.currentTimeMillis());
88
+        reactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
89
+            @Override
90
+            public void onReactContextInitialized(final ReactContext context) {
91
+                reactInstanceManager.removeReactInstanceEventListener(this);
92
+
93
+                long millisPassed = System.currentTimeMillis() - startTime.get();
94
+                long diff = 1000 - millisPassed;
95
+
96
+                emitAppLaunchedAfterDelay(context, diff);
97
+            }
98
+        });
99
+        reactInstanceManager.createReactContextInBackground();
100
+    }
101
+
102
+    private boolean shouldCreateContext() {
103
+        return !reactInstanceManager.hasStartedCreatingInitialContext();
104
+    }
105
+
106
+    private void handlePaused(NavigationActivity activity) {
107
+        if (reactInstanceManager.hasStartedCreatingInitialContext()) {
108
+            reactInstanceManager.onHostPause(activity);
109
+        }
110
+    }
111
+
112
+    private void handleDestroyed(NavigationActivity activity) {
113
+        if (reactInstanceManager.hasStartedCreatingInitialContext()) {
114
+            reactInstanceManager.onHostDestroy(activity);
115
+        }
116
+    }
117
+
118
+    private void emitAppLaunchedAfterDelay(final ReactContext context, long delay) {
119
+        UiThread.postDelayed(new Runnable() {
120
+            @Override
121
+            public void run() {
122
+                new NavigationEventEmitter(context).emitAppLaunched();
123
+            }
124
+        }, delay);
125
+    }
126
+}