Browse Source

app lifecycle

Daniel Zlotin 7 years ago
parent
commit
262f7f92ba

+ 9
- 0
jsconfig.json View File

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
 apply plugin: 'com.android.library'
1
 apply plugin: 'com.android.library'
2
 apply from: '../prepare-robolectric.gradle'
2
 apply from: '../prepare-robolectric.gradle'
3
+apply plugin: 'jacoco'
3
 
4
 
4
 android {
5
 android {
5
     compileSdkVersion 25
6
     compileSdkVersion 25
40
                     println "see report at file://${t.reports.html.destination}/index.html"
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
 dependencies {
70
 dependencies {
48
     compile fileTree(include: ['*.jar'], dir: 'libs')
71
     compile fileTree(include: ['*.jar'], dir: 'libs')
49
     compile 'com.android.support:design:25.1.1'
72
     compile 'com.android.support:design:25.1.1'

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

1
 package com.reactnativenavigation;
1
 package com.reactnativenavigation;
2
 
2
 
3
+import android.os.Bundle;
3
 import android.support.annotation.Nullable;
4
 import android.support.annotation.Nullable;
4
 import android.support.v7.app.AppCompatActivity;
5
 import android.support.v7.app.AppCompatActivity;
5
 import android.view.View;
6
 import android.view.View;
9
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
10
 public class NavigationActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
10
 	private View contentView;
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
 	@Override
37
 	@Override
13
 	public void setContentView(View contentView) {
38
 	public void setContentView(View contentView) {
14
 		super.setContentView(contentView);
39
 		super.setContentView(contentView);

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

1
 package com.reactnativenavigation;
1
 package com.reactnativenavigation;
2
 
2
 
3
-import android.app.Activity;
4
 import android.app.Application;
3
 import android.app.Application;
5
-import android.os.Bundle;
6
 
4
 
7
 import com.facebook.react.ReactApplication;
5
 import com.facebook.react.ReactApplication;
8
 import com.facebook.react.ReactNativeHost;
6
 import com.facebook.react.ReactNativeHost;
9
-import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
10
 import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
7
 import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
11
 import com.reactnativenavigation.react.DevPermissionRequestImpl;
8
 import com.reactnativenavigation.react.DevPermissionRequestImpl;
12
 import com.reactnativenavigation.react.NavigationReactNativeHost;
9
 import com.reactnativenavigation.react.NavigationReactNativeHost;
26
 		super.onCreate();
23
 		super.onCreate();
27
 		instance = this;
24
 		instance = this;
28
 		config = createConfig();
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
 	public final Config getConfig() {
28
 	public final Config getConfig() {

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

2
 
2
 
3
 import android.view.View;
3
 import android.view.View;
4
 
4
 
5
+import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
6
+
5
 import org.junit.Test;
7
 import org.junit.Test;
6
 import org.robolectric.Robolectric;
8
 import org.robolectric.Robolectric;
7
 import org.robolectric.android.controller.ActivityController;
9
 import org.robolectric.android.controller.ActivityController;
8
 
10
 
9
 import static org.assertj.core.api.Java6Assertions.assertThat;
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
 public class NavigationActivityTest extends BaseTest {
18
 public class NavigationActivityTest extends BaseTest {
12
 
19
 
20
+
13
 	@Test
21
 	@Test
14
 	public void holdsContentView() throws Exception {
22
 	public void holdsContentView() throws Exception {
15
 		NavigationActivity activity = Robolectric.setupActivity(NavigationActivity.class);
23
 		NavigationActivity activity = Robolectric.setupActivity(NavigationActivity.class);
22
 	@Test
30
 	@Test
23
 	public void reportsLifecycleEventsToDelegate() throws Exception {
31
 	public void reportsLifecycleEventsToDelegate() throws Exception {
24
 		ActivityController<NavigationActivity> activityController = Robolectric.buildActivity(NavigationActivity.class);
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
 		activityController.create();
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
-package com.reactnativenavigation.controllers;
2
-
3
-public class NavigationActivityLifecycleHandlerTest {
4
-}

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

17
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18
 # org.gradle.parallel=true
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
 run();
2
 run();
3
 
3
 
4
 function run() {
4
 function run() {
5
-  exec.execSync(`cd lib/android && ./gradlew clean testDebugUnitTest`);
5
+  exec.execSync(`cd lib/android && ./gradlew clean unitTest`);
6
 }
6
 }