Add Testing for main activity

Fix: 307479881
Test: atest HealthConnectControllerUITests:MainActivityTest
Change-Id: I8847f5ee8487f6820178b7f0e13dd3611e593100
diff --git a/apk/src/com/android/healthconnect/controller/MainActivity.kt b/apk/src/com/android/healthconnect/controller/MainActivity.kt
index 0032ab3..4b13be6 100644
--- a/apk/src/com/android/healthconnect/controller/MainActivity.kt
+++ b/apk/src/com/android/healthconnect/controller/MainActivity.kt
@@ -51,7 +51,7 @@
             openOnboardingActivity.launch(1)
         }
 
-        val currentMigrationState = runBlocking { migrationViewModel.getCurrentMigrationUiState() }
+        val currentMigrationState = migrationViewModel.getCurrentMigrationUiState()
 
         if (maybeRedirectToMigrationActivity(this, currentMigrationState)) {
             return
@@ -66,7 +66,7 @@
 
     override fun onResume() {
         super.onResume()
-        val currentMigrationState = runBlocking { migrationViewModel.getCurrentMigrationUiState() }
+        val currentMigrationState = migrationViewModel.getCurrentMigrationUiState()
 
         if (maybeRedirectToMigrationActivity(this, currentMigrationState)) {
             return
diff --git a/apk/src/com/android/healthconnect/controller/data/DataManagementActivity.kt b/apk/src/com/android/healthconnect/controller/data/DataManagementActivity.kt
index 20f19c0..6031655 100644
--- a/apk/src/com/android/healthconnect/controller/data/DataManagementActivity.kt
+++ b/apk/src/com/android/healthconnect/controller/data/DataManagementActivity.kt
@@ -60,7 +60,7 @@
             openOnboardingActivity.launch(1)
         }
 
-        val currentMigrationState = runBlocking { migrationViewModel.getCurrentMigrationUiState() }
+        val currentMigrationState = migrationViewModel.getCurrentMigrationUiState()
 
         if (maybeRedirectToMigrationActivity(this, currentMigrationState)) {
             return
@@ -98,9 +98,9 @@
 
     override fun onResume() {
         super.onResume()
-        val currentMigrationState = runBlocking { migrationViewModel.getCurrentMigrationUiState() }
+        val currentMigrationState = migrationViewModel.getCurrentMigrationUiState()
 
-        if (MigrationActivity.maybeRedirectToMigrationActivity(this, currentMigrationState)) {
+        if (maybeRedirectToMigrationActivity(this, currentMigrationState)) {
             return
         }
     }
diff --git a/apk/src/com/android/healthconnect/controller/migration/MigrationViewModel.kt b/apk/src/com/android/healthconnect/controller/migration/MigrationViewModel.kt
index 6388512..0d10032 100644
--- a/apk/src/com/android/healthconnect/controller/migration/MigrationViewModel.kt
+++ b/apk/src/com/android/healthconnect/controller/migration/MigrationViewModel.kt
@@ -24,6 +24,7 @@
 import dagger.hilt.android.lifecycle.HiltViewModel
 import javax.inject.Inject
 import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
 
 @HiltViewModel
 class MigrationViewModel
@@ -40,15 +41,15 @@
         loadHealthConnectMigrationUiState()
     }
 
-    fun loadHealthConnectMigrationUiState() {
+    private fun loadHealthConnectMigrationUiState() {
         viewModelScope.launch {
             _migrationState.postValue(
                 MigrationFragmentState.WithData(loadMigrationStateUseCase.invoke()))
         }
     }
 
-    suspend fun getCurrentMigrationUiState(): MigrationState {
-        return loadMigrationStateUseCase.invoke()
+    fun getCurrentMigrationUiState(): MigrationState {
+        return runBlocking { loadMigrationStateUseCase.invoke() }
     }
 
     sealed class MigrationFragmentState {
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/MainActivityTest.kt b/apk/tests/src/com/android/healthconnect/controller/tests/MainActivityTest.kt
new file mode 100644
index 0000000..2e5c434
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/MainActivityTest.kt
@@ -0,0 +1,106 @@
+package com.android.healthconnect.controller.tests
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import androidx.lifecycle.MutableLiveData
+import androidx.test.core.app.ActivityScenario.launchActivityForResult
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.scrollTo
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.healthconnect.controller.MainActivity
+import com.android.healthconnect.controller.migration.MigrationViewModel
+import com.android.healthconnect.controller.migration.MigrationViewModel.MigrationFragmentState.WithData
+import com.android.healthconnect.controller.migration.api.MigrationState
+import com.android.healthconnect.controller.tests.utils.showOnboarding
+import com.android.healthconnect.controller.tests.utils.whenever
+import dagger.hilt.android.testing.BindValue
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runTest
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.Mockito
+
+@HiltAndroidTest
+@OptIn(ExperimentalCoroutinesApi::class)
+class MainActivityTest {
+
+    @get:Rule val hiltRule = HiltAndroidRule(this)
+
+    @BindValue val viewModel: MigrationViewModel = Mockito.mock(MigrationViewModel::class.java)
+
+    private lateinit var context: Context
+
+    @Before
+    fun setup() {
+        hiltRule.inject()
+        context = InstrumentationRegistry.getInstrumentation().context
+
+        showOnboarding(context, show = false)
+    }
+
+    @Test
+    fun homeSettingsIntent_onboardingDone_launchesMainActivity() = runTest {
+        whenever(viewModel.getCurrentMigrationUiState()).then { MigrationState.COMPLETE_IDLE }
+        whenever(viewModel.migrationState).then {
+            MutableLiveData(WithData(MigrationState.COMPLETE_IDLE))
+        }
+
+        val startActivityIntent =
+            Intent.makeMainActivity(ComponentName(context, MainActivity::class.java))
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+
+        launchActivityForResult<MainActivity>(startActivityIntent)
+
+        onView(withText("Recent access")).check(matches(isDisplayed()))
+        onView(withText("Permissions and data")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun homeSettingsIntent_onboardingNotDone_redirectToOnboarding() = runTest {
+        showOnboarding(context, true)
+        whenever(viewModel.getCurrentMigrationUiState()).then { MigrationState.COMPLETE_IDLE }
+        whenever(viewModel.migrationState).then {
+            MutableLiveData(WithData(MigrationState.COMPLETE_IDLE))
+        }
+
+        val startActivityIntent =
+            Intent.makeMainActivity(ComponentName(context, MainActivity::class.java))
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+
+        launchActivityForResult<MainActivity>(startActivityIntent)
+
+        onView(withText("Share data with your apps"))
+            .perform(scrollTo())
+            .check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun homeSettingsIntent_migrationInProgress_redirectToMigrationScreen() = runTest {
+        showOnboarding(context, false)
+        whenever(viewModel.getCurrentMigrationUiState()).then { MigrationState.IN_PROGRESS }
+        whenever(viewModel.migrationState).then {
+            MutableLiveData(WithData(MigrationState.IN_PROGRESS))
+        }
+
+        val startActivityIntent =
+            Intent.makeMainActivity(ComponentName(context, MainActivity::class.java))
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+
+        launchActivityForResult<MainActivity>(startActivityIntent)
+
+        onView(withText("Integration in progress")).check(matches(isDisplayed()))
+    }
+
+    @After
+    fun tearDown() {
+        showOnboarding(context, false)
+    }
+}
diff --git a/apk/tests/src/com/android/healthconnect/controller/tests/utils/NavigationTestUtils.kt b/apk/tests/src/com/android/healthconnect/controller/tests/utils/NavigationTestUtils.kt
new file mode 100644
index 0000000..f357996
--- /dev/null
+++ b/apk/tests/src/com/android/healthconnect/controller/tests/utils/NavigationTestUtils.kt
@@ -0,0 +1,12 @@
+package com.android.healthconnect.controller.tests.utils
+
+import android.content.Context
+import com.android.healthconnect.controller.onboarding.OnboardingActivity
+
+fun showOnboarding(context: Context, show: Boolean) {
+    val sharedPreference =
+        context.getSharedPreferences(OnboardingActivity.USER_ACTIVITY_TRACKER, Context.MODE_PRIVATE)
+    val editor = sharedPreference.edit()
+    editor.putBoolean(OnboardingActivity.ONBOARDING_SHOWN_PREF_KEY, !show)
+    editor.apply()
+}