diff --git a/app/src/androidTest/java/org/mozilla/tryfox/MainActivityDeeplinkTest.kt b/app/src/androidTest/java/org/mozilla/tryfox/MainActivityDeeplinkTest.kt index fb22c81..c0d2dc6 100644 --- a/app/src/androidTest/java/org/mozilla/tryfox/MainActivityDeeplinkTest.kt +++ b/app/src/androidTest/java/org/mozilla/tryfox/MainActivityDeeplinkTest.kt @@ -2,6 +2,8 @@ package org.mozilla.tryfox import android.content.Intent import android.net.Uri +import androidx.compose.ui.test.assert +import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.test.core.app.ActivityScenario @@ -23,15 +25,18 @@ class MainActivityDeeplinkTest { fun testDeeplink_withHash_populatesRevision() { val project = "try" val revision = "abcdef123456" - val deeplinkUri = Uri.parse("https://treeherder.mozilla.org/#/jobs?repo=$project&revision=$revision") - val intent = Intent(ApplicationProvider.getApplicationContext(), MainActivity::class.java).apply { - action = Intent.ACTION_VIEW - data = deeplinkUri - } + val deeplinkUri = + Uri.parse("https://treeherder.mozilla.org/#/jobs?repo=$project&revision=$revision") + val intent = + Intent(ApplicationProvider.getApplicationContext(), MainActivity::class.java).apply { + action = Intent.ACTION_VIEW + data = deeplinkUri + } ActivityScenario.launch(intent).use { composeTestRule.waitForIdle() - composeTestRule.onNodeWithText(revision).assertExists() + composeTestRule.onNodeWithText("Revision").assert(hasText(revision)) + composeTestRule.onNodeWithText("Project").assert(hasText(project)) } } @@ -39,11 +44,13 @@ class MainActivityDeeplinkTest { fun testDeeplink_withoutHash_populatesRevision() { val project = "mozilla-central" val revision = "fedcba654321" - val deeplinkUri = Uri.parse("https://treeherder.mozilla.org/jobs?repo=$project&revision=$revision") - val intent = Intent(ApplicationProvider.getApplicationContext(), MainActivity::class.java).apply { - action = Intent.ACTION_VIEW - data = deeplinkUri - } + val deeplinkUri = + Uri.parse("https://treeherder.mozilla.org/jobs?repo=$project&revision=$revision") + val intent = + Intent(ApplicationProvider.getApplicationContext(), MainActivity::class.java).apply { + action = Intent.ACTION_VIEW + data = deeplinkUri + } ActivityScenario.launch(intent).use { composeTestRule.waitForIdle() @@ -58,12 +65,14 @@ class MainActivityDeeplinkTest { val project = "autoland" val revision = "abcdef123456" - val deeplinkUri = Uri.parse("https://treeherder.mozilla.org/#/jobs?repo=$project&revision=$revision") - val intent = Intent(ApplicationProvider.getApplicationContext(), MainActivity::class.java).apply { - action = Intent.ACTION_VIEW - data = deeplinkUri - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - } + val deeplinkUri = + Uri.parse("https://treeherder.mozilla.org/#/jobs?repo=$project&revision=$revision") + val intent = + Intent(ApplicationProvider.getApplicationContext(), MainActivity::class.java).apply { + action = Intent.ACTION_VIEW + data = deeplinkUri + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } // Now send the deeplink intent ApplicationProvider.getApplicationContext().startActivity(intent) @@ -76,11 +85,13 @@ class MainActivityDeeplinkTest { fun testDeeplink_withAuthorEmail_populatesProfileScreen() { val email = "tthibaud@mozilla.com" val encodedEmail = "tthibaud%40mozilla.com" - val deeplinkUri = Uri.parse("https://treeherder.mozilla.org/jobs?repo=try&author=$encodedEmail") - val intent = Intent(ApplicationProvider.getApplicationContext(), MainActivity::class.java).apply { - action = Intent.ACTION_VIEW - data = deeplinkUri - } + val deeplinkUri = + Uri.parse("https://treeherder.mozilla.org/jobs?repo=try&author=$encodedEmail") + val intent = + Intent(ApplicationProvider.getApplicationContext(), MainActivity::class.java).apply { + action = Intent.ACTION_VIEW + data = deeplinkUri + } ActivityScenario.launch(intent).use { composeTestRule.waitForIdle() diff --git a/app/src/main/java/org/mozilla/tryfox/MainActivity.kt b/app/src/main/java/org/mozilla/tryfox/MainActivity.kt index 4d34676..e97bef2 100644 --- a/app/src/main/java/org/mozilla/tryfox/MainActivity.kt +++ b/app/src/main/java/org/mozilla/tryfox/MainActivity.kt @@ -133,8 +133,8 @@ class MainActivity : ComponentActivity() { }, ), ) { backStackEntry -> - val project = backStackEntry.arguments?.getString("project") ?: "try" - val revision = backStackEntry.arguments?.getString("revision") ?: "" + val project = backStackEntry.arguments?.getString("project") + val revision = backStackEntry.arguments?.getString("revision") Log.d( "MainActivity", "TreeherderSearchWithArgs composable: project='$project', revision='$revision' from NavBackStackEntry. ID: ${backStackEntry.id}", diff --git a/app/src/main/java/org/mozilla/tryfox/TryFoxViewModel.kt b/app/src/main/java/org/mozilla/tryfox/TryFoxViewModel.kt index e492007..790270b 100644 --- a/app/src/main/java/org/mozilla/tryfox/TryFoxViewModel.kt +++ b/app/src/main/java/org/mozilla/tryfox/TryFoxViewModel.kt @@ -22,6 +22,7 @@ import org.mozilla.tryfox.data.DownloadState import org.mozilla.tryfox.data.IFenixRepository import org.mozilla.tryfox.data.NetworkResult import org.mozilla.tryfox.data.managers.CacheManager +import org.mozilla.tryfox.data.managers.IntentManager import org.mozilla.tryfox.model.CacheManagementState import org.mozilla.tryfox.ui.models.AbiUiModel import org.mozilla.tryfox.ui.models.ArtifactUiModel @@ -35,19 +36,20 @@ import java.io.File * @param fenixRepository The repository for fetching data from the network. * @param cacheManager The manager for handling application cache. * @param revision The initial revision to search for. - * @param repo The initial repository to search in. + * @param project The initial repository to search in. */ class TryFoxViewModel( private val fenixRepository: IFenixRepository, private val downloadFileRepository: DownloadFileRepository, private val cacheManager: CacheManager, + private val intentManager: IntentManager, + project: String?, revision: String?, - repo: String?, ) : ViewModel() { var revision by mutableStateOf(revision ?: "") private set - var selectedProject by mutableStateOf(repo ?: "try") + var selectedProject by mutableStateOf(project ?: "try") private set var relevantPushComment by mutableStateOf(null) @@ -78,6 +80,10 @@ class TryFoxViewModel( private val deviceSupportedAbis: List by lazy { Build.SUPPORTED_ABIS.toList() } init { + Log.d("TryFoxViewModel", "TryFoxViewModel created with revision: $revision, repo: $project") + if (revision != null) { + searchJobsAndArtifacts() + } cacheManager.cacheState.onEach { state -> if (state is CacheManagementState.IdleEmpty) { // Reset download states for artifacts in this ViewModel @@ -369,4 +375,8 @@ class TryFoxViewModel( } checkAndUpdateDownloadingStatus() } + + fun installApk(file: File) { + intentManager.installApk(file) + } } diff --git a/app/src/main/java/org/mozilla/tryfox/di/AppModule.kt b/app/src/main/java/org/mozilla/tryfox/di/AppModule.kt index 359d985..d1a8687 100644 --- a/app/src/main/java/org/mozilla/tryfox/di/AppModule.kt +++ b/app/src/main/java/org/mozilla/tryfox/di/AppModule.kt @@ -151,6 +151,7 @@ val viewModelModule = module { get(), get(), get(), + get(), params.getOrNull(), params.getOrNull(), ) diff --git a/app/src/main/java/org/mozilla/tryfox/ui/composables/AppCard.kt b/app/src/main/java/org/mozilla/tryfox/ui/composables/AppCard.kt index 61cf6f2..72ffe9d 100644 --- a/app/src/main/java/org/mozilla/tryfox/ui/composables/AppCard.kt +++ b/app/src/main/java/org/mozilla/tryfox/ui/composables/AppCard.kt @@ -175,6 +175,6 @@ private fun DisplayArtifactCard( onDownloadClick = { viewModel.downloadArtifact(artifact) }, - onInstallClick = { viewModel.onInstallApk?.invoke(it) }, + onInstallClick = { viewModel.installApk(it) }, ) }