Ver código fonte

android: refactoring

Daniel Zlotin 8 anos atrás
pai
commit
f22c7323b5

+ 34
- 27
android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivityLifecycleHandler.java Ver arquivo

@@ -10,14 +10,18 @@ import com.reactnativenavigation.NavigationActivity;
10 10
 import com.reactnativenavigation.react.NavigationEventEmitter;
11 11
 import com.reactnativenavigation.react.ReactDevPermission;
12 12
 import com.reactnativenavigation.utils.UiThread;
13
+import com.reactnativenavigation.views.NavigationSplashView;
13 14
 
14
-import java.util.concurrent.atomic.AtomicBoolean;
15 15
 import java.util.concurrent.atomic.AtomicLong;
16 16
 
17 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 24
     private final ReactInstanceManager reactInstanceManager;
19
-    private final AtomicBoolean creating = new AtomicBoolean(false);
20
-    private final AtomicLong startTime = new AtomicLong(0);
21 25
 
22 26
     public NavigationActivityLifecycleHandler(ReactInstanceManager reactInstanceManager) {
23 27
         this.reactInstanceManager = reactInstanceManager;
@@ -25,9 +29,6 @@ public class NavigationActivityLifecycleHandler implements Application.ActivityL
25 29
 
26 30
     @Override
27 31
     public void onActivityCreated(final Activity activity, Bundle bundle) {
28
-        if (activity instanceof NavigationActivity) {
29
-            handleCreated();
30
-        }
31 32
     }
32 33
 
33 34
     @Override
@@ -63,37 +64,43 @@ public class NavigationActivityLifecycleHandler implements Application.ActivityL
63 64
         }
64 65
     }
65 66
 
66
-    private void handleCreated() {
67
-        creating.set(true);
68
-    }
69
-
70 67
     private void handleResumed(NavigationActivity activity) {
71 68
         if (ReactDevPermission.shouldAskPermission()) {
72 69
             ReactDevPermission.askPermission(activity);
73
-        } else if (shouldCreateContext()) {
74
-            createContextAndEmitLaunched();
75
-            reactInstanceManager.onHostResume(activity, activity);
76 70
         } else {
77 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 99
         reactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
89 100
             @Override
90 101
             public void onReactContextInitialized(final ReactContext context) {
91 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 106
         reactInstanceManager.createReactContextInBackground();
@@ -115,11 +122,11 @@ public class NavigationActivityLifecycleHandler implements Application.ActivityL
115 122
         }
116 123
     }
117 124
 
118
-    private void emitAppLaunchedAfterDelay(final ReactContext context, long delay) {
125
+    private void emitAppLaunchedAfterDelay(long delay) {
119 126
         UiThread.postDelayed(new Runnable() {
120 127
             @Override
121 128
             public void run() {
122
-                new NavigationEventEmitter(context).emitAppLaunched();
129
+                new NavigationEventEmitter(reactInstanceManager.getCurrentReactContext()).emitAppLaunched();
123 130
             }
124 131
         }, delay);
125 132
     }