Browse Source

android: refactoring

Daniel Zlotin 8 years ago
parent
commit
f22c7323b5

+ 34
- 27
android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivityLifecycleHandler.java View File

10
 import com.reactnativenavigation.react.NavigationEventEmitter;
10
 import com.reactnativenavigation.react.NavigationEventEmitter;
11
 import com.reactnativenavigation.react.ReactDevPermission;
11
 import com.reactnativenavigation.react.ReactDevPermission;
12
 import com.reactnativenavigation.utils.UiThread;
12
 import com.reactnativenavigation.utils.UiThread;
13
+import com.reactnativenavigation.views.NavigationSplashView;
13
 
14
 
14
-import java.util.concurrent.atomic.AtomicBoolean;
15
 import java.util.concurrent.atomic.AtomicLong;
15
 import java.util.concurrent.atomic.AtomicLong;
16
 
16
 
17
 public class NavigationActivityLifecycleHandler implements Application.ActivityLifecycleCallbacks {
17
 public class NavigationActivityLifecycleHandler implements Application.ActivityLifecycleCallbacks {
18
+    private interface OnContextCreated {
19
+        void onContextCreated(long timeElapsed);
20
+    }
21
+
22
+    private static final int SPLASH_MINIMUM_DURATION = 1000;
23
+
18
     private final ReactInstanceManager reactInstanceManager;
24
     private final ReactInstanceManager reactInstanceManager;
19
-    private final AtomicBoolean creating = new AtomicBoolean(false);
20
-    private final AtomicLong startTime = new AtomicLong(0);
21
 
25
 
22
     public NavigationActivityLifecycleHandler(ReactInstanceManager reactInstanceManager) {
26
     public NavigationActivityLifecycleHandler(ReactInstanceManager reactInstanceManager) {
23
         this.reactInstanceManager = reactInstanceManager;
27
         this.reactInstanceManager = reactInstanceManager;
25
 
29
 
26
     @Override
30
     @Override
27
     public void onActivityCreated(final Activity activity, Bundle bundle) {
31
     public void onActivityCreated(final Activity activity, Bundle bundle) {
28
-        if (activity instanceof NavigationActivity) {
29
-            handleCreated();
30
-        }
31
     }
32
     }
32
 
33
 
33
     @Override
34
     @Override
63
         }
64
         }
64
     }
65
     }
65
 
66
 
66
-    private void handleCreated() {
67
-        creating.set(true);
68
-    }
69
-
70
     private void handleResumed(NavigationActivity activity) {
67
     private void handleResumed(NavigationActivity activity) {
71
         if (ReactDevPermission.shouldAskPermission()) {
68
         if (ReactDevPermission.shouldAskPermission()) {
72
             ReactDevPermission.askPermission(activity);
69
             ReactDevPermission.askPermission(activity);
73
-        } else if (shouldCreateContext()) {
74
-            createContextAndEmitLaunched();
75
-            reactInstanceManager.onHostResume(activity, activity);
76
         } else {
70
         } else {
77
             reactInstanceManager.onHostResume(activity, activity);
71
             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
-            }
72
+            prepareReactApp(activity);
82
         }
73
         }
83
     }
74
     }
84
 
75
 
85
-    private void createContextAndEmitLaunched() {
86
-        creating.set(false);
87
-        startTime.set(System.currentTimeMillis());
76
+    private void prepareReactApp(NavigationActivity activity) {
77
+        if (shouldCreateContext()) {
78
+            createReactContext(new OnContextCreated() {
79
+                @Override
80
+                public void onContextCreated(long timeElapsed) {
81
+                    emitAppLaunchedAfterDelay(SPLASH_MINIMUM_DURATION - timeElapsed);
82
+                }
83
+            });
84
+        } else if (waitingForAppLaunchedEvent(activity)) {
85
+            emitAppLaunchedAfterDelay(SPLASH_MINIMUM_DURATION);
86
+        }
87
+    }
88
+
89
+    /**
90
+     * @return true if we are a newly created activity, but react context already exists
91
+     */
92
+    private boolean waitingForAppLaunchedEvent(NavigationActivity activity) {
93
+        return activity.getContentView() instanceof NavigationSplashView;
94
+    }
95
+
96
+
97
+    private void createReactContext(final OnContextCreated onContextCreated) {
98
+        final AtomicLong startTime = new AtomicLong(System.currentTimeMillis());
88
         reactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
99
         reactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
89
             @Override
100
             @Override
90
             public void onReactContextInitialized(final ReactContext context) {
101
             public void onReactContextInitialized(final ReactContext context) {
91
                 reactInstanceManager.removeReactInstanceEventListener(this);
102
                 reactInstanceManager.removeReactInstanceEventListener(this);
92
-
93
-                long millisPassed = System.currentTimeMillis() - startTime.get();
94
-                long diff = 1000 - millisPassed;
95
-
96
-                emitAppLaunchedAfterDelay(context, diff);
103
+                onContextCreated.onContextCreated(System.currentTimeMillis() - startTime.get());
97
             }
104
             }
98
         });
105
         });
99
         reactInstanceManager.createReactContextInBackground();
106
         reactInstanceManager.createReactContextInBackground();
115
         }
122
         }
116
     }
123
     }
117
 
124
 
118
-    private void emitAppLaunchedAfterDelay(final ReactContext context, long delay) {
125
+    private void emitAppLaunchedAfterDelay(long delay) {
119
         UiThread.postDelayed(new Runnable() {
126
         UiThread.postDelayed(new Runnable() {
120
             @Override
127
             @Override
121
             public void run() {
128
             public void run() {
122
-                new NavigationEventEmitter(context).emitAppLaunched();
129
+                new NavigationEventEmitter(reactInstanceManager.getCurrentReactContext()).emitAppLaunched();
123
             }
130
             }
124
         }, delay);
131
         }, delay);
125
     }
132
     }