Browse Source

app lifecycle

Daniel Zlotin 7 years ago
parent
commit
262f7f92ba

+ 9
- 0
jsconfig.json View File

@@ -0,0 +1,9 @@
1
+{
2
+    "compilerOptions": {
3
+        "allowJs": true,
4
+        "allowSyntheticDefaultImports": true
5
+    },
6
+    "exclude": [
7
+        "node_modules"
8
+    ]
9
+}

+ 23
- 0
lib/android/app/build.gradle View File

@@ -1,5 +1,6 @@
1 1
 apply plugin: 'com.android.library'
2 2
 apply from: '../prepare-robolectric.gradle'
3
+apply plugin: 'jacoco'
3 4
 
4 5
 android {
5 6
     compileSdkVersion 25
@@ -40,10 +41,32 @@ android {
40 41
                     println "see report at file://${t.reports.html.destination}/index.html"
41 42
                 }
42 43
             }
44
+            jacoco {
45
+                includeNoLocationClasses = true
46
+            }
43 47
         }
44 48
     }
45 49
 }
46 50
 
51
+task unitTest(type: JacocoReport, dependsOn: 'testDebugUnitTest') {
52
+    reports {
53
+        xml.enabled = false
54
+        html.enabled = true
55
+    }
56
+
57
+    def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*']
58
+    def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
59
+    def mainSrc = "${project.projectDir}/src/main/java"
60
+
61
+    sourceDirectories = files([mainSrc])
62
+    classDirectories = files([debugTree])
63
+    executionData = files("${buildDir}/jacoco/testDebugUnitTest.exec")
64
+
65
+    doLast {
66
+        println "See code coverage at file://${jacoco.reportsDir}/unitTest/html/index.html"
67
+    }
68
+}
69
+
47 70
 dependencies {
48 71
     compile fileTree(include: ['*.jar'], dir: 'libs')
49 72
     compile 'com.android.support:design:25.1.1'

+ 25
- 0
lib/android/app/src/main/java/com/reactnativenavigation/NavigationActivity.java View File

@@ -1,5 +1,6 @@
1 1
 package com.reactnativenavigation;
2 2
 
3
+import android.os.Bundle;
3 4
 import android.support.annotation.Nullable;
4 5
 import android.support.v7.app.AppCompatActivity;
5 6
 import android.view.View;
@@ -9,6 +10,30 @@ import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
9 10
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
10 11
 	private View contentView;
11 12
 
13
+	@Override
14
+	protected void onCreate(@Nullable Bundle savedInstanceState) {
15
+		super.onCreate(savedInstanceState);
16
+		NavigationApplication.instance.getConfig().activityLifecycleDelegate.onActivityCreated(this);
17
+	}
18
+
19
+	@Override
20
+	protected void onResume() {
21
+		super.onResume();
22
+		NavigationApplication.instance.getConfig().activityLifecycleDelegate.onActivityResumed(this, this);
23
+	}
24
+
25
+	@Override
26
+	protected void onPause() {
27
+		super.onPause();
28
+		NavigationApplication.instance.getConfig().activityLifecycleDelegate.onActivityPaused(this);
29
+	}
30
+
31
+	@Override
32
+	protected void onDestroy() {
33
+		super.onDestroy();
34
+		NavigationApplication.instance.getConfig().activityLifecycleDelegate.onActivityDestroyed(this);
35
+	}
36
+
12 37
 	@Override
13 38
 	public void setContentView(View contentView) {
14 39
 		super.setContentView(contentView);

+ 0
- 40
lib/android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java View File

@@ -1,12 +1,9 @@
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 6
 import com.facebook.react.ReactNativeHost;
9
-import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
10 7
 import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
11 8
 import com.reactnativenavigation.react.DevPermissionRequestImpl;
12 9
 import com.reactnativenavigation.react.NavigationReactNativeHost;
@@ -26,43 +23,6 @@ public abstract class NavigationApplication extends Application implements React
26 23
 		super.onCreate();
27 24
 		instance = this;
28 25
 		config = createConfig();
29
-
30
-		registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
31
-			@Override
32
-			public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
33
-				getConfig().activityLifecycleDelegate.onActivityCreated(activity);
34
-			}
35
-
36
-			@Override
37
-			public void onActivityStarted(Activity activity) {
38
-
39
-			}
40
-
41
-			@Override
42
-			public void onActivityResumed(Activity activity) {
43
-				getConfig().activityLifecycleDelegate.onActivityResumed(activity, (DefaultHardwareBackBtnHandler) activity);
44
-			}
45
-
46
-			@Override
47
-			public void onActivityPaused(Activity activity) {
48
-				getConfig().activityLifecycleDelegate.onActivityPaused(activity);
49
-			}
50
-
51
-			@Override
52
-			public void onActivityStopped(Activity activity) {
53
-
54
-			}
55
-
56
-			@Override
57
-			public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
58
-
59
-			}
60
-
61
-			@Override
62
-			public void onActivityDestroyed(Activity activity) {
63
-				getConfig().activityLifecycleDelegate.onActivityDestroyed(activity);
64
-			}
65
-		});
66 26
 	}
67 27
 
68 28
 	public final Config getConfig() {

+ 28
- 1
lib/android/app/src/test/java/com/reactnativenavigation/NavigationActivityTest.java View File

@@ -2,14 +2,22 @@ package com.reactnativenavigation;
2 2
 
3 3
 import android.view.View;
4 4
 
5
+import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
6
+
5 7
 import org.junit.Test;
6 8
 import org.robolectric.Robolectric;
7 9
 import org.robolectric.android.controller.ActivityController;
8 10
 
9 11
 import static org.assertj.core.api.Java6Assertions.assertThat;
12
+import static org.mockito.Mockito.mock;
13
+import static org.mockito.Mockito.times;
14
+import static org.mockito.Mockito.verify;
15
+import static org.mockito.Mockito.verifyNoMoreInteractions;
16
+import static org.mockito.Mockito.verifyZeroInteractions;
10 17
 
11 18
 public class NavigationActivityTest extends BaseTest {
12 19
 
20
+
13 21
 	@Test
14 22
 	public void holdsContentView() throws Exception {
15 23
 		NavigationActivity activity = Robolectric.setupActivity(NavigationActivity.class);
@@ -22,6 +30,25 @@ public class NavigationActivityTest extends BaseTest {
22 30
 	@Test
23 31
 	public void reportsLifecycleEventsToDelegate() throws Exception {
24 32
 		ActivityController<NavigationActivity> activityController = Robolectric.buildActivity(NavigationActivity.class);
33
+		NavigationApplication.instance.getConfig().activityLifecycleDelegate = mock(ActivityLifecycleDelegate.class);
34
+		ActivityLifecycleDelegate activityLifecycleDelegate = NavigationApplication.instance.getConfig().activityLifecycleDelegate;
35
+
36
+		verifyZeroInteractions(activityLifecycleDelegate);
37
+
25 38
 		activityController.create();
39
+		verify(activityLifecycleDelegate, times(1)).onActivityCreated(activityController.get());
40
+		verifyNoMoreInteractions(activityLifecycleDelegate);
41
+
42
+		activityController.resume();
43
+		verify(activityLifecycleDelegate, times(1)).onActivityResumed(activityController.get(), activityController.get());
44
+		verifyNoMoreInteractions(activityLifecycleDelegate);
45
+
46
+		activityController.pause();
47
+		verify(activityLifecycleDelegate, times(1)).onActivityPaused(activityController.get());
48
+		verifyNoMoreInteractions(activityLifecycleDelegate);
49
+
50
+		activityController.destroy();
51
+		verify(activityLifecycleDelegate, times(1)).onActivityDestroyed(activityController.get());
52
+		verifyNoMoreInteractions(activityLifecycleDelegate);
26 53
 	}
27
-}
54
+}

+ 0
- 4
lib/android/app/src/test/java/com/reactnativenavigation/controllers/NavigationActivityLifecycleHandlerTest.java View File

@@ -1,4 +0,0 @@
1
-package com.reactnativenavigation.controllers;
2
-
3
-public class NavigationActivityLifecycleHandlerTest {
4
-}

+ 1
- 1
playground/android/gradle.properties View File

@@ -17,4 +17,4 @@
17 17
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 18
 # org.gradle.parallel=true
19 19
 
20
-android.useDeprecatedNdk=true
20
+android.useDeprecatedNdk=false

+ 1
- 1
scripts/test.unit.android.js View File

@@ -2,5 +2,5 @@ const exec = require('shell-utils').exec;
2 2
 run();
3 3
 
4 4
 function run() {
5
-  exec.execSync(`cd lib/android && ./gradlew clean testDebugUnitTest`);
5
+  exec.execSync(`cd lib/android && ./gradlew clean unitTest`);
6 6
 }