diff options
author | 2025-01-14 08:27:51 -0800 | |
---|---|---|
committer | 2025-01-14 08:27:51 -0800 | |
commit | ff0bc3a392495a79925caf32e3b61592ce5b0b40 (patch) | |
tree | e6c25616b327d76edd2ed31c1e52ecb04bef2fbb | |
parent | 6d0afa6953e797c7157fb49f57e4d00e1426d316 (diff) | |
parent | d71854e9302f6cf1501245f9c4d577ada771db91 (diff) |
Merge "Allow text toggle for shares from sysui." into main
6 files changed, 139 insertions, 12 deletions
@@ -53,6 +53,7 @@ android_library { "androidx.lifecycle_lifecycle-runtime-ktx", "androidx.lifecycle_lifecycle-viewmodel-ktx", "dagger2", + "//frameworks/libs/systemui:com_android_systemui_shared_flags_lib", "hilt_android", "IntentResolverFlagsLib", "iconloader", @@ -78,8 +79,8 @@ android_library { "-Adagger.strictMultibindingValidation=enabled", ], aidl: { - local_include_dirs: [ "java/aidl" ], - } + local_include_dirs: ["java/aidl"], + }, } java_defaults { diff --git a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java index 4166e5ae..2af5881f 100644 --- a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java @@ -184,7 +184,8 @@ public final class ChooserContentPreviewUi { imageLoader, typeClassifier, headlineGenerator, - metadata + metadata, + chooserRequest.getCallerAllowsTextToggle() ); if (previewData.getUriCount() > 0) { JavaFlowHelper.collectToList( diff --git a/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java index 30161cfb..da701ec4 100644 --- a/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java @@ -62,6 +62,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { private final CharSequence mMetadata; private final boolean mIsSingleImage; private final int mFileCount; + private final boolean mAllowTextToggle; private ViewGroup mContentPreviewView; private View mHeadliveView; private boolean mIsMetadataUpdated = false; @@ -70,8 +71,6 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { private boolean mAllImages; private boolean mAllVideos; private int mPreviewSize; - // TODO(b/285309527): make this a flag - private static final boolean SHOW_TOGGLE_CHECKMARK = false; FilesPlusTextContentPreviewUi( CoroutineScope scope, @@ -83,7 +82,8 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { ImageLoader imageLoader, MimeTypeClassifier typeClassifier, HeadlineGenerator headlineGenerator, - @Nullable CharSequence metadata) { + @Nullable CharSequence metadata, + boolean allowTextToggle) { if (isSingleImage && fileCount != 1) { throw new IllegalArgumentException( "fileCount = " + fileCount + " and isSingleImage = true"); @@ -98,6 +98,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { mTypeClassifier = typeClassifier; mHeadlineGenerator = headlineGenerator; mMetadata = metadata; + mAllowTextToggle = allowTextToggle; } @Override @@ -234,7 +235,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { shareTextAction.accept(!isChecked); updateHeadline(headlineView, mFileCount, mAllImages, mAllVideos); }); - if (SHOW_TOGGLE_CHECKMARK) { + if (mAllowTextToggle) { includeText.setVisibility(View.VISIBLE); } } diff --git a/java/src/com/android/intentresolver/data/model/ChooserRequest.kt b/java/src/com/android/intentresolver/data/model/ChooserRequest.kt index 60cc9e05..ad338103 100644 --- a/java/src/com/android/intentresolver/data/model/ChooserRequest.kt +++ b/java/src/com/android/intentresolver/data/model/ChooserRequest.kt @@ -30,6 +30,7 @@ import androidx.annotation.StringRes import com.android.intentresolver.ContentTypeHint import com.android.intentresolver.IChooserInteractiveSessionCallback import com.android.intentresolver.ext.hasAction +import com.android.systemui.shared.Flags.screenshotContextUrl const val ANDROID_APP_SCHEME = "android-app" @@ -196,4 +197,7 @@ data class ChooserRequest( } val payloadIntents = listOf(targetIntent) + additionalTargets + + val callerAllowsTextToggle = + screenshotContextUrl() && "com.android.systemui".equals(referrerPackage) } diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt index 1d85c61b..a944beee 100644 --- a/tests/unit/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt +++ b/tests/unit/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt @@ -20,6 +20,7 @@ import android.net.Uri import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.CheckBox import android.widget.TextView import androidx.annotation.IdRes import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -192,6 +193,7 @@ class FilesPlusTextContentPreviewUiTest { DefaultMimeTypeClassifier, headlineGenerator, testMetadataText, + /* allowTextToggle=*/ false, ) val layoutInflater = LayoutInflater.from(context) val gridLayout = @@ -203,7 +205,7 @@ class FilesPlusTextContentPreviewUiTest { context.resources, LayoutInflater.from(context), gridLayout, - headlineRow + headlineRow, ) verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount) @@ -234,6 +236,7 @@ class FilesPlusTextContentPreviewUiTest { DefaultMimeTypeClassifier, headlineGenerator, testMetadataText, + /* allowTextToggle=*/ false, ) val layoutInflater = LayoutInflater.from(context) val gridLayout = @@ -253,7 +256,7 @@ class FilesPlusTextContentPreviewUiTest { context.resources, LayoutInflater.from(context), gridLayout, - headlineRow + headlineRow, ) verify(headlineGenerator, times(1)).getFilesHeadline(sharedFileCount) @@ -270,6 +273,73 @@ class FilesPlusTextContentPreviewUiTest { verifyPreviewMetadata(headlineRow, testMetadataText) } + @Test + fun test_allowToggle() { + val testSubject = + FilesPlusTextContentPreviewUi( + testScope, + /*isSingleImage=*/ false, + /* fileCount=*/ 1, + SHARED_TEXT, + /*intentMimeType=*/ "*/*", + actionFactory, + imageLoader, + DefaultMimeTypeClassifier, + headlineGenerator, + testMetadataText, + /* allowTextToggle=*/ true, + ) + val layoutInflater = LayoutInflater.from(context) + val gridLayout = + layoutInflater.inflate(R.layout.chooser_grid_scrollable_preview, null, false) + as ViewGroup + val headlineRow = gridLayout.requireViewById<View>(R.id.chooser_headline_row_container) + + testSubject.display( + context.resources, + LayoutInflater.from(context), + gridLayout, + headlineRow, + ) + + val checkbox = headlineRow.requireViewById<CheckBox>(R.id.include_text_action) + assertThat(checkbox.visibility).isEqualTo(View.VISIBLE) + assertThat(checkbox.isChecked).isTrue() + } + + @Test + fun test_hideTextToggle() { + val testSubject = + FilesPlusTextContentPreviewUi( + testScope, + /*isSingleImage=*/ false, + /* fileCount=*/ 1, + SHARED_TEXT, + /*intentMimeType=*/ "*/*", + actionFactory, + imageLoader, + DefaultMimeTypeClassifier, + headlineGenerator, + testMetadataText, + /* allowTextToggle=*/ false, + ) + val layoutInflater = LayoutInflater.from(context) + val gridLayout = + layoutInflater.inflate(R.layout.chooser_grid_scrollable_preview, null, false) + as ViewGroup + val headlineRow = gridLayout.requireViewById<View>(R.id.chooser_headline_row_container) + + testSubject.display( + context.resources, + LayoutInflater.from(context), + gridLayout, + headlineRow, + ) + + val checkbox = headlineRow.requireViewById<CheckBox>(R.id.include_text_action) + assertThat(checkbox.visibility).isNotEqualTo(View.VISIBLE) + } + private fun testLoadingHeadline( intentMimeType: String, sharedFileCount: Int, @@ -287,6 +357,7 @@ class FilesPlusTextContentPreviewUiTest { DefaultMimeTypeClassifier, headlineGenerator, testMetadataText, + /* allowTextToggle=*/ false, ) val layoutInflater = LayoutInflater.from(context) val gridLayout = @@ -307,7 +378,7 @@ class FilesPlusTextContentPreviewUiTest { context.resources, LayoutInflater.from(context), gridLayout, - headlineRow + headlineRow, ) to headlineRow } diff --git a/tests/unit/src/com/android/intentresolver/ui/viewmodel/ChooserRequestTest.kt b/tests/unit/src/com/android/intentresolver/ui/viewmodel/ChooserRequestTest.kt index facfe151..7bc1e785 100644 --- a/tests/unit/src/com/android/intentresolver/ui/viewmodel/ChooserRequestTest.kt +++ b/tests/unit/src/com/android/intentresolver/ui/viewmodel/ChooserRequestTest.kt @@ -28,6 +28,9 @@ import android.content.Intent.EXTRA_REFERRER import android.content.Intent.EXTRA_TEXT import android.content.Intent.EXTRA_TITLE import android.net.Uri +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags +import android.platform.test.flag.junit.SetFlagsRule import androidx.core.net.toUri import androidx.core.os.bundleOf import com.android.intentresolver.ContentTypeHint @@ -37,13 +40,16 @@ import com.android.intentresolver.validation.Importance import com.android.intentresolver.validation.Invalid import com.android.intentresolver.validation.NoValue import com.android.intentresolver.validation.Valid +import com.android.systemui.shared.Flags import com.google.common.truth.Truth.assertThat +import org.junit.Rule import org.junit.Test private fun createActivityModel( targetIntent: Intent?, referrer: Uri? = null, additionalIntents: List<Intent>? = null, + launchedFromPackage: String = "com.android.example", ) = ActivityModel( Intent(ACTION_CHOOSER).apply { @@ -51,12 +57,13 @@ private fun createActivityModel( additionalIntents?.also { putExtra(EXTRA_ALTERNATE_INTENTS, it.toTypedArray()) } }, launchedFromUid = 10000, - launchedFromPackage = "com.android.example", - referrer = referrer ?: "android-app://com.android.example".toUri(), + launchedFromPackage = launchedFromPackage, + referrer = referrer ?: "android-app://$launchedFromPackage".toUri(), false, ) class ChooserRequestTest { + @get:Rule val flagsRule = SetFlagsRule() @Test fun missingIntent() { @@ -265,4 +272,46 @@ class ChooserRequestTest { assertThat(request.sharedTextTitle).isEqualTo(title) } } + + @Test + @DisableFlags(Flags.FLAG_SCREENSHOT_CONTEXT_URL) + fun testCallerAllowsTextToggle_flagOff() { + val intent = Intent().putExtras(bundleOf(EXTRA_INTENT to Intent(ACTION_SEND))) + val model = + createActivityModel(targetIntent = intent, launchedFromPackage = "com.android.systemui") + val result = readChooserRequest(model) + + assertThat(result).isInstanceOf(Valid::class.java) + result as Valid<ChooserRequest> + + assertThat(result.value.callerAllowsTextToggle).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_SCREENSHOT_CONTEXT_URL) + fun testCallerAllowsTextToggle_sysuiPackage() { + val intent = Intent().putExtras(bundleOf(EXTRA_INTENT to Intent(ACTION_SEND))) + val model = + createActivityModel(targetIntent = intent, launchedFromPackage = "com.android.systemui") + val result = readChooserRequest(model) + + assertThat(result).isInstanceOf(Valid::class.java) + result as Valid<ChooserRequest> + + assertThat(result.value.callerAllowsTextToggle).isTrue() + } + + @Test + @EnableFlags(Flags.FLAG_SCREENSHOT_CONTEXT_URL) + fun testCallerAllowsTextToggle_otherPackage() { + val intent = Intent().putExtras(bundleOf(EXTRA_INTENT to Intent(ACTION_SEND))) + val model = + createActivityModel(targetIntent = intent, launchedFromPackage = "com.hello.world") + val result = readChooserRequest(model) + + assertThat(result).isInstanceOf(Valid::class.java) + result as Valid<ChooserRequest> + + assertThat(result.value.callerAllowsTextToggle).isFalse() + } } |