summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--java/src/com/android/intentresolver/v2/domain/interactor/ChooserRequestUpdateInteractor.kt96
-rw-r--r--tests/unit/src/com/android/intentresolver/v2/domain/interactor/ChooserRequestUpdateInteractorTest.kt52
2 files changed, 77 insertions, 71 deletions
diff --git a/java/src/com/android/intentresolver/v2/domain/interactor/ChooserRequestUpdateInteractor.kt b/java/src/com/android/intentresolver/v2/domain/interactor/ChooserRequestUpdateInteractor.kt
index 871701cf..4afe46b0 100644
--- a/java/src/com/android/intentresolver/v2/domain/interactor/ChooserRequestUpdateInteractor.kt
+++ b/java/src/com/android/intentresolver/v2/domain/interactor/ChooserRequestUpdateInteractor.kt
@@ -17,16 +17,13 @@
package com.android.intentresolver.v2.domain.interactor
import android.content.Intent
-import android.util.Log
+import android.content.IntentSender
+import android.service.chooser.ChooserAction
+import android.service.chooser.ChooserTarget
import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.ChooserParamsUpdateRepository
import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.TargetIntentRepository
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ShareouselUpdate
-import com.android.intentresolver.inject.ChooserServiceFlags
-import com.android.intentresolver.v2.ui.model.ActivityModel
import com.android.intentresolver.v2.ui.model.ChooserRequest
-import com.android.intentresolver.v2.ui.viewmodel.readChooserRequest
-import com.android.intentresolver.v2.validation.Invalid
-import com.android.intentresolver.v2.validation.Valid
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
@@ -39,19 +36,15 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
-private const val TAG = "ChooserRequestUpdate"
-
/** Updates updates ChooserRequest with a new target intent */
// TODO: make fully injectable
class ChooserRequestUpdateInteractor
@AssistedInject
constructor(
- private val activityModel: ActivityModel,
private val targetIntentRepository: TargetIntentRepository,
private val paramsUpdateRepository: ChooserParamsUpdateRepository,
// TODO: replace with a proper repository, when available
@Assisted private val chooserRequestRepository: MutableStateFlow<ChooserRequest>,
- private val flags: ChooserServiceFlags,
) {
suspend fun launch() {
@@ -70,54 +63,61 @@ constructor(
}
private fun updateTargetIntent(targetIntent: Intent) {
- val updatedActivityModel = activityModel.updateWithTargetIntent(targetIntent)
- when (val updatedChooserRequest = readChooserRequest(updatedActivityModel, flags)) {
- is Valid -> chooserRequestRepository.value = updatedChooserRequest.value
- is Invalid -> Log.w(TAG, "Failed to apply payload selection changes")
+ chooserRequestRepository.update { current ->
+ current.updatedWith(targetIntent = targetIntent)
}
}
private fun updateChooserParameters(update: ShareouselUpdate) {
chooserRequestRepository.update { current ->
- ChooserRequest(
- current.targetIntent,
- current.targetAction,
- current.isSendActionTarget,
- current.targetType,
- current.launchedFromPackage,
- current.title,
- current.defaultTitleResource,
- current.referrer,
- current.filteredComponentNames,
- update.callerTargets ?: current.callerChooserTargets,
- // chooser actions are handled separately
- current.chooserActions,
- update.modifyShareAction ?: current.modifyShareAction,
- current.shouldRetainInOnStop,
- update.alternateIntents ?: current.additionalTargets,
- current.replacementExtras,
- current.initialIntents,
- update.resultIntentSender ?: current.chosenComponentSender,
- update.refinementIntentSender ?: current.refinementIntentSender,
- current.sharedText,
- current.shareTargetFilter,
- current.additionalContentUri,
- current.focusedItemPosition,
- current.contentTypeHint,
- update.metadataText ?: current.metadataText,
+ current.updatedWith(
+ callerChooserTargets = update.callerTargets,
+ modifyShareAction = update.modifyShareAction,
+ additionalTargets = update.alternateIntents,
+ chosenComponentSender = update.resultIntentSender,
+ refinementIntentSender = update.refinementIntentSender,
+ metadataText = update.metadataText,
)
}
}
-
- private fun ActivityModel.updateWithTargetIntent(targetIntent: Intent) =
- ActivityModel(
- Intent(intent).apply { putExtra(Intent.EXTRA_INTENT, targetIntent) },
- launchedFromUid,
- launchedFromPackage,
- referrer,
- )
}
+private fun ChooserRequest.updatedWith(
+ targetIntent: Intent? = null,
+ callerChooserTargets: List<ChooserTarget>? = null,
+ modifyShareAction: ChooserAction? = null,
+ additionalTargets: List<Intent>? = null,
+ chosenComponentSender: IntentSender? = null,
+ refinementIntentSender: IntentSender? = null,
+ metadataText: CharSequence? = null,
+) =
+ ChooserRequest(
+ targetIntent ?: this.targetIntent,
+ this.targetAction,
+ this.isSendActionTarget,
+ this.targetType,
+ this.launchedFromPackage,
+ this.title,
+ this.defaultTitleResource,
+ this.referrer,
+ this.filteredComponentNames,
+ callerChooserTargets ?: this.callerChooserTargets,
+ this.chooserActions,
+ modifyShareAction ?: this.modifyShareAction,
+ this.shouldRetainInOnStop,
+ additionalTargets ?: this.additionalTargets,
+ this.replacementExtras,
+ this.initialIntents,
+ chosenComponentSender ?: this.chosenComponentSender,
+ refinementIntentSender ?: this.refinementIntentSender,
+ this.sharedText,
+ this.shareTargetFilter,
+ this.additionalContentUri,
+ this.focusedItemPosition,
+ this.contentTypeHint,
+ metadataText ?: this.metadataText,
+ )
+
@AssistedFactory
@ViewModelScoped
interface ChooserRequestUpdateInteractorFactory {
diff --git a/tests/unit/src/com/android/intentresolver/v2/domain/interactor/ChooserRequestUpdateInteractorTest.kt b/tests/unit/src/com/android/intentresolver/v2/domain/interactor/ChooserRequestUpdateInteractorTest.kt
index a15a6eff..d6288e2f 100644
--- a/tests/unit/src/com/android/intentresolver/v2/domain/interactor/ChooserRequestUpdateInteractorTest.kt
+++ b/tests/unit/src/com/android/intentresolver/v2/domain/interactor/ChooserRequestUpdateInteractorTest.kt
@@ -22,14 +22,12 @@ import android.content.Intent.ACTION_SEND_MULTIPLE
import android.content.Intent.EXTRA_STREAM
import android.content.IntentSender
import android.net.Uri
-import android.service.chooser.Flags
import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.ChooserParamsUpdateRepository
import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.TargetIntentRepository
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ShareouselUpdate
-import com.android.intentresolver.inject.FakeChooserServiceFlags
import com.android.intentresolver.mock
-import com.android.intentresolver.v2.ui.model.ActivityModel
import com.android.intentresolver.v2.ui.model.ChooserRequest
+import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
@@ -50,26 +48,12 @@ class ChooserRequestUpdateInteractorTest {
type = "image/png"
}
val initialRequest = createSomeChooserRequest(targetIntent)
- private val chooserIntent = Intent.createChooser(targetIntent, null)
- private val activityModel =
- ActivityModel(
- chooserIntent,
- launchedFromUid = 1,
- launchedFromPackage = "org.pkg.app",
- referrer = null,
- )
private val targetIntentRepository =
TargetIntentRepository(
targetIntent,
emptyList(),
)
private val chooserParamsUpdateRepository = ChooserParamsUpdateRepository()
- private val fakeFlags =
- FakeChooserServiceFlags().apply {
- setFlag(Flags.FLAG_CHOOSER_PAYLOAD_TOGGLING, true)
- setFlag(Flags.FLAG_CHOOSER_ALBUM_TEXT, false)
- setFlag(Flags.FLAG_ENABLE_SHARESHEET_METADATA_EXTRA, false)
- }
private val testScope = TestScope()
@Test
@@ -78,11 +62,9 @@ class ChooserRequestUpdateInteractorTest {
val requestFlow = MutableStateFlow(initialRequest)
val testSubject =
ChooserRequestUpdateInteractor(
- activityModel,
targetIntentRepository,
chooserParamsUpdateRepository,
requestFlow,
- fakeFlags,
)
backgroundScope.launch { testSubject.launch() }
testScheduler.runCurrent()
@@ -98,11 +80,9 @@ class ChooserRequestUpdateInteractorTest {
val requestFlow = MutableStateFlow(initialRequest)
val testSubject =
ChooserRequestUpdateInteractor(
- activityModel,
targetIntentRepository,
chooserParamsUpdateRepository,
requestFlow,
- fakeFlags,
)
backgroundScope.launch { testSubject.launch() }
targetIntentRepository.updateTargetIntent(
@@ -124,11 +104,9 @@ class ChooserRequestUpdateInteractorTest {
val requestFlow = MutableStateFlow(initialRequest)
val testSubject =
ChooserRequestUpdateInteractor(
- activityModel,
targetIntentRepository,
chooserParamsUpdateRepository,
requestFlow,
- fakeFlags,
)
backgroundScope.launch { testSubject.launch() }
val newResultSender = mock<IntentSender>()
@@ -147,6 +125,34 @@ class ChooserRequestUpdateInteractorTest {
.that(requestFlow.value.chosenComponentSender)
.isSameInstanceAs(newResultSender)
}
+
+ @Test
+ fun testTargetIntentUpdateDoesNotOverrideOtherParameters() =
+ testScope.runTest {
+ val requestFlow = MutableStateFlow(initialRequest)
+ val testSubject =
+ ChooserRequestUpdateInteractor(
+ targetIntentRepository,
+ chooserParamsUpdateRepository,
+ requestFlow,
+ )
+ backgroundScope.launch { testSubject.launch() }
+
+ val newResultSender = mock<IntentSender>()
+ val newTargetIntent = Intent(Intent.ACTION_VIEW)
+ chooserParamsUpdateRepository.setUpdates(
+ ShareouselUpdate(
+ resultIntentSender = newResultSender,
+ )
+ )
+ testScheduler.runCurrent()
+ targetIntentRepository.updateTargetIntent(newTargetIntent)
+ testScheduler.runCurrent()
+
+ assertThat(requestFlow.value.targetIntent).isSameInstanceAs(newTargetIntent)
+
+ assertThat(requestFlow.value.chosenComponentSender).isSameInstanceAs(newResultSender)
+ }
}
private fun createSomeChooserRequest(targetIntent: Intent) =