summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Andrey Yepin <ayepin@google.com> 2024-07-31 15:03:41 -0700
committer Andrey Yepin <ayepin@google.com> 2024-08-05 15:37:14 -0700
commit38ee8332d767014a9c69a737511bbc5aa705d5ec (patch)
treef7861ee3a717f1d0d3387ac63b06eae73e4992b4
parentdd8b67226177c51bf5bb1019aff66fb7f138a03c (diff)
Update excluded components from payload selection callback
Bug: 352496527 Test: atest IntentResolver-tests-unit Test: manual testing using ShareTest app Flag: com.android.intentresolver.shareousel_update_exclude_components_extra Change-Id: I610edf2c11a5beb114185c8724347b0eb0487ef1
-rw-r--r--aconfig/FeatureFlags.aconfig7
-rw-r--r--java/src/com/android/intentresolver/ChooserActivity.java8
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractor.kt7
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/model/ShareouselUpdate.kt2
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallback.kt17
-rw-r--r--tests/shared/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallbackKosmos.kt2
-rw-r--r--tests/unit/Android.bp1
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractorTest.kt24
-rw-r--r--tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallbackImplTest.kt65
9 files changed, 112 insertions, 21 deletions
diff --git a/aconfig/FeatureFlags.aconfig b/aconfig/FeatureFlags.aconfig
index c449bb43..b58b4daa 100644
--- a/aconfig/FeatureFlags.aconfig
+++ b/aconfig/FeatureFlags.aconfig
@@ -89,3 +89,10 @@ flag {
description: "Use the unified preview image loader for all preview variations; support variable preview sizes."
bug: "348665058"
}
+
+flag {
+ name: "shareousel_update_exclude_components_extra"
+ namespace: "intentresolver"
+ description: "Allow Shareousel selection change callback to update Intent#EXTRA_EXCLUDE_COMPONENTS"
+ bug: "352496527"
+}
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java
index 84f29e21..7b43a21d 100644
--- a/java/src/com/android/intentresolver/ChooserActivity.java
+++ b/java/src/com/android/intentresolver/ChooserActivity.java
@@ -23,6 +23,7 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE
import static androidx.lifecycle.LifecycleKt.getCoroutineScope;
import static com.android.intentresolver.ChooserActionFactory.EDIT_SOURCE;
+import static com.android.intentresolver.Flags.shareouselUpdateExcludeComponentsExtra;
import static com.android.intentresolver.ext.CreationExtrasExtKt.addDefaultArgs;
import static com.android.intentresolver.profiles.MultiProfilePagerAdapter.PROFILE_PERSONAL;
import static com.android.intentresolver.profiles.MultiProfilePagerAdapter.PROFILE_WORK;
@@ -749,10 +750,15 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
Intent newTargetIntent = newChooserRequest.getTargetIntent();
List<Intent> oldAltIntents = oldChooserRequest.getAdditionalTargets();
List<Intent> newAltIntents = newChooserRequest.getAdditionalTargets();
+ List<ComponentName> oldExcluded = oldChooserRequest.getFilteredComponentNames();
+ List<ComponentName> newExcluded = newChooserRequest.getFilteredComponentNames();
// TODO: a workaround for the unnecessary target reloading caused by multiple flow updates -
// an artifact of the current implementation; revisit.
- return !oldTargetIntent.equals(newTargetIntent) || !oldAltIntents.equals(newAltIntents);
+ return !oldTargetIntent.equals(newTargetIntent)
+ || !oldAltIntents.equals(newAltIntents)
+ || (shareouselUpdateExcludeComponentsExtra()
+ && !oldExcluded.equals(newExcluded));
}
private void recreatePagerAdapter() {
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractor.kt
index dd16f0c1..4fe5e8d5 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractor.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractor.kt
@@ -17,6 +17,7 @@
package com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor
import android.content.Intent
+import com.android.intentresolver.Flags.shareouselUpdateExcludeComponentsExtra
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.CustomAction
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.PendingIntentSender
import com.android.intentresolver.contentpreview.payloadtoggle.domain.intent.toCustomActionModel
@@ -49,6 +50,12 @@ constructor(
update.refinementIntentSender.getOrDefault(current.refinementIntentSender),
metadataText = update.metadataText.getOrDefault(current.metadataText),
chooserActions = update.customActions.getOrDefault(current.chooserActions),
+ filteredComponentNames =
+ if (shareouselUpdateExcludeComponentsExtra()) {
+ update.excludeComponents.getOrDefault(current.filteredComponentNames)
+ } else {
+ current.filteredComponentNames
+ }
)
}
update.customActions.onValue { actions ->
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/model/ShareouselUpdate.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/model/ShareouselUpdate.kt
index 821e88a5..77f196e6 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/model/ShareouselUpdate.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/model/ShareouselUpdate.kt
@@ -16,6 +16,7 @@
package com.android.intentresolver.contentpreview.payloadtoggle.domain.model
+import android.content.ComponentName
import android.content.Intent
import android.content.IntentSender
import android.service.chooser.ChooserAction
@@ -31,4 +32,5 @@ data class ShareouselUpdate(
val refinementIntentSender: ValueUpdate<IntentSender?> = ValueUpdate.Absent,
val resultIntentSender: ValueUpdate<IntentSender?> = ValueUpdate.Absent,
val metadataText: ValueUpdate<CharSequence?> = ValueUpdate.Absent,
+ val excludeComponents: ValueUpdate<List<ComponentName>> = ValueUpdate.Absent,
)
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallback.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallback.kt
index 479bff77..184cc027 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallback.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallback.kt
@@ -16,6 +16,7 @@
package com.android.intentresolver.contentpreview.payloadtoggle.domain.update
+import android.content.ComponentName
import android.content.ContentInterface
import android.content.Intent
import android.content.Intent.EXTRA_ALTERNATE_INTENTS
@@ -24,6 +25,7 @@ import android.content.Intent.EXTRA_CHOOSER_MODIFY_SHARE_ACTION
import android.content.Intent.EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER
import android.content.Intent.EXTRA_CHOOSER_RESULT_INTENT_SENDER
import android.content.Intent.EXTRA_CHOOSER_TARGETS
+import android.content.Intent.EXTRA_EXCLUDE_COMPONENTS
import android.content.Intent.EXTRA_INTENT
import android.content.Intent.EXTRA_METADATA_TEXT
import android.content.IntentSender
@@ -32,11 +34,11 @@ import android.os.Bundle
import android.service.chooser.AdditionalContentContract.MethodNames.ON_SELECTION_CHANGED
import android.service.chooser.ChooserAction
import android.service.chooser.ChooserTarget
+import com.android.intentresolver.Flags.shareouselUpdateExcludeComponentsExtra
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ShareouselUpdate
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ValueUpdate
import com.android.intentresolver.inject.AdditionalContent
import com.android.intentresolver.inject.ChooserIntent
-import com.android.intentresolver.inject.ChooserServiceFlags
import com.android.intentresolver.ui.viewmodel.readAlternateIntents
import com.android.intentresolver.ui.viewmodel.readChooserActions
import com.android.intentresolver.validation.Invalid
@@ -70,7 +72,6 @@ constructor(
@AdditionalContent private val uri: Uri,
@ChooserIntent private val chooserIntent: Intent,
private val contentResolver: ContentInterface,
- private val flags: ChooserServiceFlags,
) : SelectionChangeCallback {
private val mutex = Mutex()
@@ -90,7 +91,7 @@ constructor(
)
}
?.let { bundle ->
- return when (val result = readCallbackResponse(bundle, flags)) {
+ return when (val result = readCallbackResponse(bundle)) {
is Valid -> {
result.warnings.forEach { it.log(TAG) }
result.value
@@ -105,7 +106,6 @@ constructor(
private fun readCallbackResponse(
bundle: Bundle,
- flags: ChooserServiceFlags
): ValidationResult<ShareouselUpdate> {
return validateFrom(bundle::get) {
// An error is treated as an empty collection or null as the presence of a value indicates
@@ -139,6 +139,14 @@ private fun readCallbackResponse(
bundle.readValueUpdate(EXTRA_METADATA_TEXT) { key ->
optional(value<CharSequence>(key))
}
+ val excludedComponents: ValueUpdate<List<ComponentName>> =
+ if (shareouselUpdateExcludeComponentsExtra()) {
+ bundle.readValueUpdate(EXTRA_EXCLUDE_COMPONENTS) { key ->
+ optional(array<ComponentName>(key)) ?: emptyList()
+ }
+ } else {
+ ValueUpdate.Absent
+ }
ShareouselUpdate(
customActions,
@@ -148,6 +156,7 @@ private fun readCallbackResponse(
refinementIntentSender,
resultIntentSender,
metadataText,
+ excludedComponents,
)
}
}
diff --git a/tests/shared/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallbackKosmos.kt b/tests/shared/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallbackKosmos.kt
index 548b1f37..b26b562e 100644
--- a/tests/shared/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallbackKosmos.kt
+++ b/tests/shared/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallbackKosmos.kt
@@ -19,7 +19,6 @@ package com.android.intentresolver.contentpreview.payloadtoggle.domain.update
import com.android.intentresolver.contentInterface
import com.android.intentresolver.inject.additionalContentUri
import com.android.intentresolver.inject.chooserIntent
-import com.android.intentresolver.inject.chooserServiceFlags
import com.android.systemui.kosmos.Kosmos
val Kosmos.selectionChangeCallbackImpl by
@@ -28,7 +27,6 @@ val Kosmos.selectionChangeCallbackImpl by
additionalContentUri,
chooserIntent,
contentInterface,
- chooserServiceFlags,
)
}
var Kosmos.selectionChangeCallback: SelectionChangeCallback by
diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp
index 1ae8d883..aa1be2e0 100644
--- a/tests/unit/Android.bp
+++ b/tests/unit/Android.bp
@@ -33,6 +33,7 @@ android_test {
"android.test.mock",
"framework",
"framework-res",
+ "flag-junit",
],
resource_dirs: ["res"],
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractorTest.kt
index 570c346c..32d040fe 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractorTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/UpdateChooserRequestInteractorTest.kt
@@ -18,7 +18,11 @@
package com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor
+import android.content.ComponentName
import android.content.Intent
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import com.android.intentresolver.Flags.FLAG_SHAREOUSEL_UPDATE_EXCLUDE_COMPONENTS_EXTRA
import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.pendingSelectionCallbackRepository
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ShareouselUpdate
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ValueUpdate
@@ -29,9 +33,12 @@ import com.android.intentresolver.util.runKosmosTest
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.launch
+import org.junit.Rule
import org.junit.Test
class UpdateChooserRequestInteractorTest {
+ @get:Rule val setFlagsRule = SetFlagsRule()
+
@Test
fun updateTargetIntentWithSelection() = runKosmosTest {
val selectionCallbackResult = ShareouselUpdate(metadataText = ValueUpdate.Value("update"))
@@ -45,4 +52,21 @@ class UpdateChooserRequestInteractorTest {
assertThat(pendingSelectionCallbackRepository.pendingTargetIntent.value).isNull()
assertThat(chooserRequestRepository.chooserRequest.value.metadataText).isEqualTo("update")
}
+
+ @Test
+ @EnableFlags(FLAG_SHAREOUSEL_UPDATE_EXCLUDE_COMPONENTS_EXTRA)
+ fun testSelectionResultWithExcludedComponents_chooserRequestIsUpdated() = runKosmosTest {
+ val excludedComponent = ComponentName("org.pkg.app", "Class")
+ val selectionCallbackResult =
+ ShareouselUpdate(excludeComponents = ValueUpdate.Value(listOf(excludedComponent)))
+ selectionChangeCallback = SelectionChangeCallback { selectionCallbackResult }
+
+ backgroundScope.launch { processTargetIntentUpdatesInteractor.activate() }
+
+ updateTargetIntentInteractor.updateTargetIntent(Intent())
+ runCurrent()
+
+ assertThat(chooserRequestRepository.chooserRequest.value.filteredComponentNames)
+ .containsExactly(excludedComponent)
+ }
}
diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallbackImplTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallbackImplTest.kt
index fd21ea3f..c1a1833a 100644
--- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallbackImplTest.kt
+++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/update/SelectionChangeCallbackImplTest.kt
@@ -29,32 +29,34 @@ import android.content.Intent.EXTRA_CHOOSER_MODIFY_SHARE_ACTION
import android.content.Intent.EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER
import android.content.Intent.EXTRA_CHOOSER_RESULT_INTENT_SENDER
import android.content.Intent.EXTRA_CHOOSER_TARGETS
+import android.content.Intent.EXTRA_EXCLUDE_COMPONENTS
import android.content.Intent.EXTRA_INTENT
import android.content.Intent.EXTRA_METADATA_TEXT
import android.content.Intent.EXTRA_STREAM
import android.graphics.drawable.Icon
import android.net.Uri
import android.os.Bundle
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
import android.service.chooser.AdditionalContentContract.MethodNames.ON_SELECTION_CHANGED
import android.service.chooser.ChooserAction
import android.service.chooser.ChooserTarget
-import android.service.chooser.Flags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
+import com.android.intentresolver.Flags.FLAG_SHAREOUSEL_UPDATE_EXCLUDE_COMPONENTS_EXTRA
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ValueUpdate
import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.ValueUpdate.Absent
-import com.android.intentresolver.inject.FakeChooserServiceFlags
import com.google.common.truth.Correspondence
import com.google.common.truth.Correspondence.BinaryPredicate
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import java.lang.IllegalArgumentException
import kotlinx.coroutines.test.runTest
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
-import org.mockito.kotlin.capture
import org.mockito.kotlin.mock
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
@@ -62,16 +64,16 @@ import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
class SelectionChangeCallbackImplTest {
+ @get:Rule val setFlagsRule = SetFlagsRule()
+
private val uri = Uri.parse("content://org.pkg/content-provider")
private val chooserIntent = Intent(ACTION_CHOOSER)
private val contentResolver = mock<ContentInterface>()
private val context = InstrumentationRegistry.getInstrumentation().context
- private val flags =
- FakeChooserServiceFlags().apply { setFlag(Flags.FLAG_CHOOSER_PAYLOAD_TOGGLING, false) }
@Test
fun testPayloadChangeCallbackContact() = runTest {
- val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver, flags)
+ val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver)
val u1 = createUri(1)
val u2 = createUri(2)
@@ -166,7 +168,7 @@ class SelectionChangeCallbackImplTest {
Bundle().apply { putParcelableArray(EXTRA_CHOOSER_CUSTOM_ACTIONS, arrayOf(a1, a2)) }
)
- val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver, flags)
+ val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver)
val targetIntent = Intent(ACTION_SEND_MULTIPLE)
val result = testSubject.onSelectionChanged(targetIntent)
@@ -183,6 +185,7 @@ class SelectionChangeCallbackImplTest {
assertThat(result.refinementIntentSender).isEqualTo(Absent)
assertThat(result.resultIntentSender).isEqualTo(Absent)
assertThat(result.metadataText).isEqualTo(Absent)
+ assertThat(result.excludeComponents).isEqualTo(Absent)
}
@Test
@@ -204,7 +207,7 @@ class SelectionChangeCallbackImplTest {
Bundle().apply { putParcelable(EXTRA_CHOOSER_MODIFY_SHARE_ACTION, modifyShare) }
)
- val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver, flags)
+ val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver)
val targetIntent = Intent(ACTION_SEND)
val result = testSubject.onSelectionChanged(targetIntent)
@@ -223,6 +226,7 @@ class SelectionChangeCallbackImplTest {
assertThat(result.refinementIntentSender).isEqualTo(Absent)
assertThat(result.resultIntentSender).isEqualTo(Absent)
assertThat(result.metadataText).isEqualTo(Absent)
+ assertThat(result.excludeComponents).isEqualTo(Absent)
}
@Test
@@ -239,7 +243,7 @@ class SelectionChangeCallbackImplTest {
Bundle().apply { putParcelableArray(EXTRA_ALTERNATE_INTENTS, alternateIntents) }
)
- val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver, flags)
+ val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver)
val targetIntent = Intent(ACTION_SEND)
val result = testSubject.onSelectionChanged(targetIntent)
@@ -264,6 +268,7 @@ class SelectionChangeCallbackImplTest {
assertThat(result.refinementIntentSender).isEqualTo(Absent)
assertThat(result.resultIntentSender).isEqualTo(Absent)
assertThat(result.metadataText).isEqualTo(Absent)
+ assertThat(result.excludeComponents).isEqualTo(Absent)
}
@Test
@@ -289,7 +294,7 @@ class SelectionChangeCallbackImplTest {
Bundle().apply { putParcelableArray(EXTRA_CHOOSER_TARGETS, arrayOf(t1, t2)) }
)
- val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver, flags)
+ val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver)
val targetIntent = Intent(ACTION_SEND)
val result = testSubject.onSelectionChanged(targetIntent)
@@ -317,6 +322,7 @@ class SelectionChangeCallbackImplTest {
assertThat(result.refinementIntentSender).isEqualTo(Absent)
assertThat(result.resultIntentSender).isEqualTo(Absent)
assertThat(result.metadataText).isEqualTo(Absent)
+ assertThat(result.excludeComponents).isEqualTo(Absent)
}
@Test
@@ -331,7 +337,7 @@ class SelectionChangeCallbackImplTest {
}
)
- val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver, flags)
+ val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver)
val targetIntent = Intent(ACTION_SEND)
val result = testSubject.onSelectionChanged(targetIntent)
@@ -344,6 +350,7 @@ class SelectionChangeCallbackImplTest {
assertThat(result.refinementIntentSender.getOrThrow()).isNotNull()
assertThat(result.resultIntentSender).isEqualTo(Absent)
assertThat(result.metadataText).isEqualTo(Absent)
+ assertThat(result.excludeComponents).isEqualTo(Absent)
}
@Test
@@ -358,7 +365,7 @@ class SelectionChangeCallbackImplTest {
}
)
- val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver, flags)
+ val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver)
val targetIntent = Intent(ACTION_SEND)
val result = testSubject.onSelectionChanged(targetIntent)
@@ -371,6 +378,7 @@ class SelectionChangeCallbackImplTest {
assertThat(result.refinementIntentSender).isEqualTo(Absent)
assertThat(result.resultIntentSender.getOrThrow()).isNotNull()
assertThat(result.metadataText).isEqualTo(Absent)
+ assertThat(result.excludeComponents).isEqualTo(Absent)
}
@Test
@@ -379,7 +387,7 @@ class SelectionChangeCallbackImplTest {
whenever(contentResolver.call(any<String>(), any(), any(), any()))
.thenReturn(Bundle().apply { putCharSequence(EXTRA_METADATA_TEXT, metadataText) })
- val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver, flags)
+ val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver)
val targetIntent = Intent(ACTION_SEND)
val result = testSubject.onSelectionChanged(targetIntent)
@@ -392,6 +400,35 @@ class SelectionChangeCallbackImplTest {
assertThat(result.refinementIntentSender).isEqualTo(Absent)
assertThat(result.resultIntentSender).isEqualTo(Absent)
assertThat(result.metadataText.getOrThrow()).isEqualTo(metadataText)
+ assertThat(result.excludeComponents).isEqualTo(Absent)
+ }
+
+ @Test
+ @EnableFlags(FLAG_SHAREOUSEL_UPDATE_EXCLUDE_COMPONENTS_EXTRA)
+ fun testPayloadChangeCallbackUpdatesExcludedComponents_valueUpdated() = runTest {
+ val excludedComponent = ComponentName("org.pkg.app", "org.pkg.app.TheClass")
+ whenever(contentResolver.call(any<String>(), any(), any(), any()))
+ .thenReturn(
+ Bundle().apply {
+ putParcelableArray(EXTRA_EXCLUDE_COMPONENTS, arrayOf(excludedComponent))
+ }
+ )
+
+ val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver)
+
+ val targetIntent = Intent(ACTION_SEND)
+ val result = testSubject.onSelectionChanged(targetIntent)
+
+ assertWithMessage("Callback result should not be null").that(result).isNotNull()
+ requireNotNull(result)
+ assertThat(result.customActions).isEqualTo(Absent)
+ assertThat(result.modifyShareAction).isEqualTo(Absent)
+ assertThat(result.alternateIntents).isEqualTo(Absent)
+ assertThat(result.callerTargets).isEqualTo(Absent)
+ assertThat(result.refinementIntentSender).isEqualTo(Absent)
+ assertThat(result.resultIntentSender).isEqualTo(Absent)
+ assertThat(result.metadataText).isEqualTo(Absent)
+ assertThat(result.excludeComponents.getOrThrow()).containsExactly(excludedComponent)
}
@Test
@@ -409,7 +446,7 @@ class SelectionChangeCallbackImplTest {
}
)
- val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver, flags)
+ val testSubject = SelectionChangeCallbackImpl(uri, chooserIntent, contentResolver)
val targetIntent = Intent(ACTION_SEND)
val result = testSubject.onSelectionChanged(targetIntent)