Remove SHARESHEET_SCROLLABLE_IMAGE_PREVIEW
Also simplify some flag testing stuff when there are no flags being
tested.
Bug: 267355521
Test: atest IntentResolverUnitTests
Change-Id: I2ec39d38605d4e1b9df5bb22542623cdeb1e51da
diff --git a/java/res/layout/chooser_image_preview_view.xml b/java/res/layout/chooser_image_preview_view.xml
deleted file mode 100644
index e81349c..0000000
--- a/java/res/layout/chooser_image_preview_view.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
- ~ Copyright (C) 2023 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<com.android.intentresolver.widget.ChooserImagePreviewView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:paddingStart="@dimen/chooser_edge_margin_normal"
- android:paddingEnd="@dimen/chooser_edge_margin_normal"
- android:paddingBottom="@dimen/chooser_view_spacing"
- android:background="?android:attr/colorBackground" />
diff --git a/java/res/layout/chooser_image_preview_view_internals.xml b/java/res/layout/chooser_image_preview_view_internals.xml
deleted file mode 100644
index 2b93edf..0000000
--- a/java/res/layout/chooser_image_preview_view_internals.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<!--
- ~ Copyright (C) 2022 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<merge
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:paddingBottom="@dimen/chooser_view_spacing"
- android:background="?android:attr/colorBackground">
-
- <com.android.intentresolver.widget.RoundedRectImageView
- android:id="@androidprv:id/content_preview_image_1_large"
- android:transitionName="screenshot_preview_image"
- android:layout_width="@dimen/chooser_preview_image_width"
- android:layout_height="@dimen/chooser_preview_image_height"
- android:layout_alignParentTop="true"
- android:adjustViewBounds="true"
- android:gravity="center"
- android:scaleType="centerCrop"/>
-
- <com.android.intentresolver.widget.RoundedRectImageView
- android:id="@androidprv:id/content_preview_image_2_large"
- android:visibility="gone"
- android:layout_width="@dimen/chooser_preview_image_width"
- android:layout_height="@dimen/chooser_preview_image_height"
- android:layout_alignParentTop="true"
- android:layout_toRightOf="@androidprv:id/content_preview_image_1_large"
- android:layout_marginLeft="10dp"
- android:adjustViewBounds="true"
- android:gravity="center"
- android:scaleType="centerCrop"/>
-
- <com.android.intentresolver.widget.RoundedRectImageView
- android:id="@androidprv:id/content_preview_image_2_small"
- android:visibility="gone"
- android:layout_width="@dimen/chooser_preview_image_width"
- android:layout_height="65dp"
- android:layout_alignParentTop="true"
- android:layout_toRightOf="@androidprv:id/content_preview_image_1_large"
- android:layout_marginLeft="10dp"
- android:adjustViewBounds="true"
- android:gravity="center"
- android:scaleType="centerCrop"/>
-
- <com.android.intentresolver.widget.RoundedRectImageView
- android:id="@androidprv:id/content_preview_image_3_small"
- android:visibility="gone"
- android:layout_width="@dimen/chooser_preview_image_width"
- android:layout_height="65dp"
- android:layout_below="@androidprv:id/content_preview_image_2_small"
- android:layout_toRightOf="@androidprv:id/content_preview_image_1_large"
- android:layout_marginLeft="10dp"
- android:layout_marginTop="10dp"
- android:adjustViewBounds="true"
- android:gravity="center"
- android:scaleType="centerCrop"/>
-
-</merge>
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java
index 270fc29..dd0be4f 100644
--- a/java/src/com/android/intentresolver/ChooserActivity.java
+++ b/java/src/com/android/intentresolver/ChooserActivity.java
@@ -87,7 +87,6 @@
import com.android.intentresolver.contentpreview.HeadlineGeneratorImpl;
import com.android.intentresolver.flags.FeatureFlagRepository;
import com.android.intentresolver.flags.FeatureFlagRepositoryFactory;
-import com.android.intentresolver.flags.Flags;
import com.android.intentresolver.grid.ChooserGridAdapter;
import com.android.intentresolver.grid.DirectShareViewHolder;
import com.android.intentresolver.model.AbstractResolverComparator;
@@ -293,7 +292,6 @@
createPreviewImageLoader(),
createChooserActionFactory(),
mEnterTransitionAnimationDelegate,
- mFeatureFlagRepository,
new HeadlineGeneratorImpl(this));
setAdditionalTargets(mChooserRequest.getAdditionalTargets());
@@ -1341,15 +1339,11 @@
@VisibleForTesting
protected ImageLoader createPreviewImageLoader() {
final int cacheSize;
- if (mFeatureFlagRepository.isEnabled(Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW)) {
- float chooserWidth = getResources().getDimension(R.dimen.chooser_width);
- // imageWidth = imagePreviewHeight / minAspectRatio (see ScrollableImagePreviewView)
- float imageWidth =
- getResources().getDimension(R.dimen.chooser_preview_image_height_tall) * 5 / 2;
- cacheSize = (int) (Math.ceil(chooserWidth / imageWidth) + 2);
- } else {
- cacheSize = 3;
- }
+ float chooserWidth = getResources().getDimension(R.dimen.chooser_width);
+ // imageWidth = imagePreviewHeight / minAspectRatio (see ScrollableImagePreviewView)
+ float imageWidth =
+ getResources().getDimension(R.dimen.chooser_preview_image_height_tall) * 5 / 2;
+ cacheSize = (int) (Math.ceil(chooserWidth / imageWidth) + 2);
return new ImagePreviewImageLoader(this, getLifecycle(), cacheSize);
}
diff --git a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
index 3509c67..318aa62 100644
--- a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
@@ -39,14 +39,11 @@
import androidx.annotation.Nullable;
import com.android.intentresolver.ImageLoader;
-import com.android.intentresolver.flags.FeatureFlagRepository;
-import com.android.intentresolver.flags.Flags;
import com.android.intentresolver.widget.ActionRow;
import com.android.intentresolver.widget.ImagePreviewView.TransitionElementStatusCallback;
import java.util.ArrayList;
import java.util.List;
-import java.util.Objects;
import java.util.function.Consumer;
/**
@@ -103,7 +100,6 @@
ImageLoader imageLoader,
ActionFactory actionFactory,
TransitionElementStatusCallback transitionElementStatusCallback,
- FeatureFlagRepository featureFlagRepository,
HeadlineGenerator headlineGenerator) {
mContentPreviewUi = createContentPreview(
@@ -113,7 +109,6 @@
imageLoader,
actionFactory,
transitionElementStatusCallback,
- featureFlagRepository,
headlineGenerator);
if (mContentPreviewUi.getType() != CONTENT_PREVIEW_IMAGE) {
transitionElementStatusCallback.onAllTransitionElementsReady();
@@ -127,7 +122,6 @@
ImageLoader imageLoader,
ActionFactory actionFactory,
TransitionElementStatusCallback transitionElementStatusCallback,
- FeatureFlagRepository featureFlagRepository,
HeadlineGenerator headlineGenerator) {
/* In {@link android.content.Intent#getType}, the app may specify a very general mime type
@@ -145,7 +139,6 @@
targetIntent,
actionFactory,
imageLoader,
- featureFlagRepository,
headlineGenerator);
}
List<Uri> uris = extractContentUris(targetIntent);
@@ -154,7 +147,6 @@
targetIntent,
actionFactory,
imageLoader,
- featureFlagRepository,
headlineGenerator);
}
ArrayList<FileInfo> files = new ArrayList<>(uris.size());
@@ -164,50 +156,15 @@
files,
actionFactory,
imageLoader,
- featureFlagRepository,
headlineGenerator);
}
- if (featureFlagRepository.isEnabled(Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW)) {
- return new UnifiedContentPreviewUi(
- files,
- targetIntent.getCharSequenceExtra(Intent.EXTRA_TEXT),
- actionFactory,
- imageLoader,
- typeClassifier,
- transitionElementStatusCallback,
- featureFlagRepository,
- headlineGenerator);
- }
- if (previewCount < uris.size()) {
- return new FileContentPreviewUi(
- files,
- actionFactory,
- imageLoader,
- featureFlagRepository,
- headlineGenerator);
- }
- // The legacy (3-image) image preview is on it's way out and it's unlikely that we'd end up
- // here. To preserve the legacy behavior, before using it, check that all uris are images.
- for (FileInfo fileInfo: files) {
- if (!typeClassifier.isImageType(fileInfo.getMimeType())) {
- return new FileContentPreviewUi(
- files,
- actionFactory,
- imageLoader,
- featureFlagRepository,
- headlineGenerator);
- }
- }
- return new ImageContentPreviewUi(
- files.stream()
- .map(FileInfo::getPreviewUri)
- .filter(Objects::nonNull)
- .toList(),
+ return new UnifiedContentPreviewUi(
+ files,
targetIntent.getCharSequenceExtra(Intent.EXTRA_TEXT),
actionFactory,
imageLoader,
+ typeClassifier,
transitionElementStatusCallback,
- featureFlagRepository,
headlineGenerator);
}
@@ -323,7 +280,6 @@
Intent targetIntent,
ChooserContentPreviewUi.ActionFactory actionFactory,
ImageLoader imageLoader,
- FeatureFlagRepository featureFlagRepository,
HeadlineGenerator headlineGenerator) {
CharSequence sharingText = targetIntent.getCharSequenceExtra(Intent.EXTRA_TEXT);
String previewTitle = targetIntent.getStringExtra(Intent.EXTRA_TITLE);
@@ -341,7 +297,6 @@
previewThumbnail,
actionFactory,
imageLoader,
- featureFlagRepository,
headlineGenerator);
}
diff --git a/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
index e65538a..3012eec 100644
--- a/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
@@ -29,7 +29,6 @@
import com.android.intentresolver.ImageLoader;
import com.android.intentresolver.R;
-import com.android.intentresolver.flags.FeatureFlagRepository;
import com.android.intentresolver.widget.ActionRow;
import java.util.ArrayList;
@@ -44,19 +43,16 @@
private final List<FileInfo> mFiles;
private final ChooserContentPreviewUi.ActionFactory mActionFactory;
private final ImageLoader mImageLoader;
- private final FeatureFlagRepository mFeatureFlagRepository;
private final HeadlineGenerator mHeadlineGenerator;
FileContentPreviewUi(
List<FileInfo> files,
ChooserContentPreviewUi.ActionFactory actionFactory,
ImageLoader imageLoader,
- FeatureFlagRepository featureFlagRepository,
HeadlineGenerator headlineGenerator) {
mFiles = files;
mActionFactory = actionFactory;
mImageLoader = imageLoader;
- mFeatureFlagRepository = featureFlagRepository;
mHeadlineGenerator = headlineGenerator;
}
diff --git a/java/src/com/android/intentresolver/contentpreview/ImageContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ImageContentPreviewUi.java
deleted file mode 100644
index 85ae2ad..0000000
--- a/java/src/com/android/intentresolver/contentpreview/ImageContentPreviewUi.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.intentresolver.contentpreview;
-
-import static com.android.intentresolver.contentpreview.ContentPreviewType.CONTENT_PREVIEW_IMAGE;
-
-import android.content.res.Resources;
-import android.net.Uri;
-import android.text.TextUtils;
-import android.text.util.Linkify;
-import android.transition.TransitionManager;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewStub;
-import android.widget.CheckBox;
-import android.widget.TextView;
-
-import androidx.annotation.LayoutRes;
-import androidx.annotation.Nullable;
-
-import com.android.intentresolver.ImageLoader;
-import com.android.intentresolver.R;
-import com.android.intentresolver.flags.FeatureFlagRepository;
-import com.android.intentresolver.widget.ActionRow;
-import com.android.intentresolver.widget.ChooserImagePreviewView;
-import com.android.intentresolver.widget.ImagePreviewView.TransitionElementStatusCallback;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Consumer;
-
-class ImageContentPreviewUi extends ContentPreviewUi {
- private final List<Uri> mImageUris;
- @Nullable
- private final CharSequence mText;
- private final ChooserContentPreviewUi.ActionFactory mActionFactory;
- private final ImageLoader mImageLoader;
- private final TransitionElementStatusCallback mTransitionElementStatusCallback;
- private final FeatureFlagRepository mFeatureFlagRepository;
- private final HeadlineGenerator mHeadlineGenerator;
-
- ImageContentPreviewUi(
- List<Uri> imageUris,
- @Nullable CharSequence text,
- ChooserContentPreviewUi.ActionFactory actionFactory,
- ImageLoader imageLoader,
- TransitionElementStatusCallback transitionElementStatusCallback,
- FeatureFlagRepository featureFlagRepository,
- HeadlineGenerator headlineGenerator) {
- mImageUris = imageUris;
- mText = text;
- mActionFactory = actionFactory;
- mImageLoader = imageLoader;
- mTransitionElementStatusCallback = transitionElementStatusCallback;
- mFeatureFlagRepository = featureFlagRepository;
- mHeadlineGenerator = headlineGenerator;
-
- mImageLoader.prePopulate(mImageUris);
- }
-
- @Override
- public int getType() {
- return CONTENT_PREVIEW_IMAGE;
- }
-
- @Override
- public ViewGroup display(Resources resources, LayoutInflater layoutInflater, ViewGroup parent) {
- ViewGroup layout = displayInternal(layoutInflater, parent);
- displayModifyShareAction(layout, mActionFactory);
- return layout;
- }
-
- private ViewGroup displayInternal(LayoutInflater layoutInflater, ViewGroup parent) {
- @LayoutRes int actionRowLayout = getActionRowLayout();
- ViewGroup contentPreviewLayout = (ViewGroup) layoutInflater.inflate(
- R.layout.chooser_grid_preview_image, parent, false);
- ChooserImagePreviewView imagePreview = inflateImagePreviewView(contentPreviewLayout);
-
- final ActionRow actionRow = inflateActionRow(contentPreviewLayout, actionRowLayout);
- if (actionRow != null) {
- actionRow.setActions(
- createActions(
- createImagePreviewActions(),
- mActionFactory.createCustomActions()));
- }
-
- if (mImageUris.size() == 0) {
- Log.i(
- TAG,
- "Attempted to display image preview area with zero"
- + " available images detected in EXTRA_STREAM list");
- imagePreview.setVisibility(View.GONE);
- mTransitionElementStatusCallback.onAllTransitionElementsReady();
- return contentPreviewLayout;
- }
-
- setTextInImagePreviewVisibility(contentPreviewLayout, mActionFactory);
- imagePreview.setTransitionElementStatusCallback(mTransitionElementStatusCallback);
- imagePreview.setImages(mImageUris, mImageLoader);
-
- updateHeadline(contentPreviewLayout);
-
- return contentPreviewLayout;
- }
-
- private List<ActionRow.Action> createImagePreviewActions() {
- ArrayList<ActionRow.Action> actions = new ArrayList<>(2);
- //TODO: add copy action;
- ActionRow.Action action = mActionFactory.createNearbyButton();
- if (action != null) {
- actions.add(action);
- }
- action = mActionFactory.createEditButton();
- if (action != null) {
- actions.add(action);
- }
- return actions;
- }
-
- private ChooserImagePreviewView inflateImagePreviewView(ViewGroup previewLayout) {
- ViewStub stub = previewLayout.findViewById(R.id.image_preview_stub);
- if (stub != null) {
- stub.setLayoutResource(R.layout.chooser_image_preview_view);
- stub.inflate();
- }
- return previewLayout.findViewById(
- com.android.internal.R.id.content_preview_image_area);
- }
-
- private void updateHeadline(ViewGroup contentPreview) {
- CheckBox includeTextCheckbox = contentPreview.requireViewById(R.id.include_text_action);
- if (includeTextCheckbox.getVisibility() == View.VISIBLE
- && includeTextCheckbox.isChecked()) {
- displayHeadline(contentPreview, mHeadlineGenerator.getImageWithTextHeadline(mText));
- } else {
- displayHeadline(
- contentPreview, mHeadlineGenerator.getImagesHeadline(mImageUris.size()));
- }
- }
-
- private void setTextInImagePreviewVisibility(
- ViewGroup contentPreview, ChooserContentPreviewUi.ActionFactory actionFactory) {
- int visibility = !TextUtils.isEmpty(mText) ? View.VISIBLE : View.GONE;
-
- final TextView textView = contentPreview
- .requireViewById(com.android.internal.R.id.content_preview_text);
- CheckBox actionView = contentPreview
- .requireViewById(R.id.include_text_action);
- textView.setVisibility(visibility);
- boolean isLink = visibility == View.VISIBLE && HttpUriMatcher.isHttpUri(mText.toString());
- textView.setAutoLinkMask(isLink ? Linkify.WEB_URLS : 0);
- textView.setText(mText);
-
- if (visibility == View.VISIBLE) {
- final int[] actionLabels = isLink
- ? new int[] { R.string.include_link, R.string.exclude_link }
- : new int[] { R.string.include_text, R.string.exclude_text };
- final Consumer<Boolean> shareTextAction = actionFactory.getExcludeSharedTextAction();
- actionView.setChecked(true);
- actionView.setText(actionLabels[1]);
- shareTextAction.accept(false);
- actionView.setOnCheckedChangeListener((view, isChecked) -> {
- view.setText(actionLabels[isChecked ? 1 : 0]);
- TransitionManager.beginDelayedTransition((ViewGroup) textView.getParent());
- textView.setVisibility(isChecked ? View.VISIBLE : View.GONE);
- shareTextAction.accept(!isChecked);
- updateHeadline(contentPreview);
- });
- }
- actionView.setVisibility(visibility);
- }
-}
diff --git a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
index 6b5676c..70df647 100644
--- a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
@@ -30,7 +30,6 @@
import com.android.intentresolver.ImageLoader;
import com.android.intentresolver.R;
-import com.android.intentresolver.flags.FeatureFlagRepository;
import com.android.intentresolver.widget.ActionRow;
import java.util.ArrayList;
@@ -45,7 +44,6 @@
private final Uri mPreviewThumbnail;
private final ImageLoader mImageLoader;
private final ChooserContentPreviewUi.ActionFactory mActionFactory;
- private final FeatureFlagRepository mFeatureFlagRepository;
private final HeadlineGenerator mHeadlineGenerator;
TextContentPreviewUi(
@@ -54,14 +52,12 @@
@Nullable Uri previewThumbnail,
ChooserContentPreviewUi.ActionFactory actionFactory,
ImageLoader imageLoader,
- FeatureFlagRepository featureFlagRepository,
HeadlineGenerator headlineGenerator) {
mSharingText = sharingText;
mPreviewTitle = previewTitle;
mPreviewThumbnail = previewThumbnail;
mImageLoader = imageLoader;
mActionFactory = actionFactory;
- mFeatureFlagRepository = featureFlagRepository;
mHeadlineGenerator = headlineGenerator;
}
diff --git a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
index a849ddb..00a11e3 100644
--- a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
@@ -35,7 +35,6 @@
import com.android.intentresolver.ImageLoader;
import com.android.intentresolver.R;
-import com.android.intentresolver.flags.FeatureFlagRepository;
import com.android.intentresolver.widget.ActionRow;
import com.android.intentresolver.widget.ImagePreviewView.TransitionElementStatusCallback;
import com.android.intentresolver.widget.ScrollableImagePreviewView;
@@ -53,7 +52,6 @@
private final ImageLoader mImageLoader;
private final MimeTypeClassifier mTypeClassifier;
private final TransitionElementStatusCallback mTransitionElementStatusCallback;
- private final FeatureFlagRepository mFeatureFlagRepository;
private final HeadlineGenerator mHeadlineGenerator;
UnifiedContentPreviewUi(
@@ -63,7 +61,6 @@
ImageLoader imageLoader,
MimeTypeClassifier typeClassifier,
TransitionElementStatusCallback transitionElementStatusCallback,
- FeatureFlagRepository featureFlagRepository,
HeadlineGenerator headlineGenerator) {
mFiles = files;
mText = text;
@@ -71,7 +68,6 @@
mImageLoader = imageLoader;
mTypeClassifier = typeClassifier;
mTransitionElementStatusCallback = transitionElementStatusCallback;
- mFeatureFlagRepository = featureFlagRepository;
mHeadlineGenerator = headlineGenerator;
mImageLoader.prePopulate(mFiles.stream()
diff --git a/java/src/com/android/intentresolver/flags/Flags.kt b/java/src/com/android/intentresolver/flags/Flags.kt
index 0440b3d..b303dd1 100644
--- a/java/src/com/android/intentresolver/flags/Flags.kt
+++ b/java/src/com/android/intentresolver/flags/Flags.kt
@@ -21,15 +21,8 @@
// Flag id, name and namespace should be kept in sync with [com.android.systemui.flags.Flags] to
// make the flags available in the flag flipper app (see go/sysui-flags).
+// All flags added should be included in UnbundledChooserActivityTest.ALL_FLAGS.
object Flags {
- const val SHARESHEET_SCROLLABLE_IMAGE_PREVIEW_NAME = "sharesheet_scrollable_image_preview"
-
- // TODO(b/267355521) Tracking Bug
- @JvmField
- val SHARESHEET_SCROLLABLE_IMAGE_PREVIEW = releasedFlag(
- 1504, SHARESHEET_SCROLLABLE_IMAGE_PREVIEW_NAME
- )
-
private fun releasedFlag(id: Int, name: String) =
ReleasedFlag(id, name, "systemui")
diff --git a/java/src/com/android/intentresolver/widget/ChooserImagePreviewView.kt b/java/src/com/android/intentresolver/widget/ChooserImagePreviewView.kt
deleted file mode 100644
index 6273296..0000000
--- a/java/src/com/android/intentresolver/widget/ChooserImagePreviewView.kt
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.intentresolver.widget
-
-import android.animation.ObjectAnimator
-import android.content.Context
-import android.net.Uri
-import android.util.AttributeSet
-import android.view.LayoutInflater
-import android.view.animation.DecelerateInterpolator
-import android.widget.RelativeLayout
-import androidx.core.view.isVisible
-import com.android.intentresolver.R
-import com.android.intentresolver.widget.ImagePreviewView.TransitionElementStatusCallback
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.MainScope
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.launch
-import com.android.internal.R as IntR
-
-private const val IMAGE_FADE_IN_MILLIS = 150L
-
-class ChooserImagePreviewView : RelativeLayout, ImagePreviewView {
-
- constructor(context: Context) : this(context, null)
- constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
-
- constructor(
- context: Context, attrs: AttributeSet?, defStyleAttr: Int
- ) : this(context, attrs, defStyleAttr, 0)
-
- constructor(
- context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int
- ) : super(context, attrs, defStyleAttr, defStyleRes)
-
- private val coroutineScope = MainScope()
- private lateinit var mainImage: RoundedRectImageView
- private lateinit var secondLargeImage: RoundedRectImageView
- private lateinit var secondSmallImage: RoundedRectImageView
- private lateinit var thirdImage: RoundedRectImageView
-
- private var loadImageJob: Job? = null
- private var transitionStatusElementCallback: TransitionElementStatusCallback? = null
-
- override fun onFinishInflate() {
- LayoutInflater.from(context)
- .inflate(R.layout.chooser_image_preview_view_internals, this, true)
- mainImage = requireViewById(IntR.id.content_preview_image_1_large)
- secondLargeImage = requireViewById(IntR.id.content_preview_image_2_large)
- secondSmallImage = requireViewById(IntR.id.content_preview_image_2_small)
- thirdImage = requireViewById(IntR.id.content_preview_image_3_small)
- }
-
- /**
- * Specifies a transition animation target readiness callback. The callback will be
- * invoked once when views preparation is done.
- * Should be called before [setImages].
- */
- override fun setTransitionElementStatusCallback(callback: TransitionElementStatusCallback?) {
- transitionStatusElementCallback = callback
- }
-
- fun setImages(uris: List<Uri>, imageLoader: ImageLoader) {
- loadImageJob?.cancel()
- loadImageJob = coroutineScope.launch {
- when (uris.size) {
- 0 -> hideAllViews()
- 1 -> showOneImage(uris, imageLoader)
- 2 -> showTwoImages(uris, imageLoader)
- else -> showThreeImages(uris, imageLoader)
- }
- }
- }
-
- private fun hideAllViews() {
- mainImage.isVisible = false
- secondLargeImage.isVisible = false
- secondSmallImage.isVisible = false
- thirdImage.isVisible = false
- invokeTransitionViewReadyCallback()
- }
-
- private suspend fun showOneImage(uris: List<Uri>, imageLoader: ImageLoader) {
- secondLargeImage.isVisible = false
- secondSmallImage.isVisible = false
- thirdImage.isVisible = false
- showImages(uris, imageLoader, mainImage)
- }
-
- private suspend fun showTwoImages(uris: List<Uri>, imageLoader: ImageLoader) {
- secondSmallImage.isVisible = false
- thirdImage.isVisible = false
- showImages(uris, imageLoader, mainImage, secondLargeImage)
- }
-
- private suspend fun showThreeImages(uris: List<Uri>, imageLoader: ImageLoader) {
- secondLargeImage.isVisible = false
- showImages(uris, imageLoader, mainImage, secondSmallImage, thirdImage)
- thirdImage.setExtraImageCount(uris.size - 3)
- }
-
- private suspend fun showImages(
- uris: List<Uri>, imageLoader: ImageLoader, vararg views: RoundedRectImageView
- ) = coroutineScope {
- for (i in views.indices) {
- launch {
- loadImageIntoView(views[i], uris[i], imageLoader)
- }
- }
- }
-
- private suspend fun loadImageIntoView(
- view: RoundedRectImageView, uri: Uri, imageLoader: ImageLoader
- ) {
- val bitmap = runCatching {
- imageLoader(uri)
- }.getOrDefault(null)
- if (bitmap == null) {
- view.isVisible = false
- if (view === mainImage) {
- invokeTransitionViewReadyCallback()
- }
- } else {
- view.isVisible = true
- view.setImageBitmap(bitmap)
-
- view.alpha = 0f
- ObjectAnimator.ofFloat(view, "alpha", 0.0f, 1.0f).apply {
- interpolator = DecelerateInterpolator(1.0f)
- duration = IMAGE_FADE_IN_MILLIS
- start()
- }
- if (view === mainImage && transitionStatusElementCallback != null) {
- view.waitForPreDraw()
- invokeTransitionViewReadyCallback()
- }
- }
- }
-
- private fun invokeTransitionViewReadyCallback() {
- transitionStatusElementCallback?.apply {
- if (mainImage.isVisible && mainImage.drawable != null) {
- mainImage.transitionName?.let { onTransitionElementReady(it) }
- }
- onAllTransitionElementsReady()
- }
- transitionStatusElementCallback = null
- }
-}
diff --git a/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java b/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java
index d074e97..eb34022 100644
--- a/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java
+++ b/java/tests/src/com/android/intentresolver/UnbundledChooserActivityTest.java
@@ -104,7 +104,6 @@
import androidx.test.rule.ActivityTestRule;
import com.android.intentresolver.chooser.DisplayResolveInfo;
-import com.android.intentresolver.flags.Flags;
import com.android.intentresolver.shortcuts.ShortcutLoader;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -168,8 +167,7 @@
};
private static final List<BooleanFlag> ALL_FLAGS =
- Arrays.asList(
- Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW);
+ Arrays.asList();
private static final Map<BooleanFlag, Boolean> ALL_FLAGS_OFF =
createAllFlagsOverride(false);
@@ -178,6 +176,15 @@
@Parameterized.Parameters
public static Collection packageManagers() {
+ if (ALL_FLAGS.isEmpty()) {
+ // No flags to toggle between, so just two configurations.
+ return Arrays.asList(new Object[][] {
+ // Default PackageManager and all flags off
+ { DEFAULT_PM, ALL_FLAGS_OFF},
+ // No App Prediction Service and all flags off
+ { NO_APP_PREDICTION_SERVICE_PM, ALL_FLAGS_OFF },
+ });
+ }
return Arrays.asList(new Object[][] {
// Default PackageManager and all flags off
{ DEFAULT_PM, ALL_FLAGS_OFF},
@@ -933,74 +940,6 @@
}
@Test
- @RequireFeatureFlags(
- flags = { Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW_NAME },
- values = { false })
- public void twoVisibleImagePreview() {
- Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/"
- + R.drawable.test320x240);
-
- ArrayList<Uri> uris = new ArrayList<>();
- uris.add(uri);
- uris.add(uri);
-
- Intent sendIntent = createSendUriIntentWithPreview(uris);
- ChooserActivityOverrideData.getInstance().previewThumbnail = createBitmap();
- ChooserActivityOverrideData.getInstance().isImageType = true;
-
- List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
-
- setupResolverControllers(resolvedComponentInfos);
- mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
- waitForIdle();
- onView(withId(com.android.internal.R.id.content_preview_image_1_large))
- .check(matches(isDisplayed()));
- onView(withId(com.android.internal.R.id.content_preview_image_2_large))
- .check(matches(isDisplayed()));
- onView(withId(com.android.internal.R.id.content_preview_image_2_small))
- .check(matches(not(isDisplayed())));
- onView(withId(com.android.internal.R.id.content_preview_image_3_small))
- .check(matches(not(isDisplayed())));
- }
-
- @Test
- @RequireFeatureFlags(
- flags = { Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW_NAME },
- values = { false })
- public void threeOrMoreVisibleImagePreview() {
- Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/"
- + R.drawable.test320x240);
-
- ArrayList<Uri> uris = new ArrayList<>();
- uris.add(uri);
- uris.add(uri);
- uris.add(uri);
- uris.add(uri);
- uris.add(uri);
-
- Intent sendIntent = createSendUriIntentWithPreview(uris);
- ChooserActivityOverrideData.getInstance().previewThumbnail = createBitmap();
- ChooserActivityOverrideData.getInstance().isImageType = true;
-
- List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
-
- setupResolverControllers(resolvedComponentInfos);
- mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
- waitForIdle();
- onView(withId(com.android.internal.R.id.content_preview_image_1_large))
- .check(matches(isDisplayed()));
- onView(withId(com.android.internal.R.id.content_preview_image_2_large))
- .check(matches(not(isDisplayed())));
- onView(withId(com.android.internal.R.id.content_preview_image_2_small))
- .check(matches(isDisplayed()));
- onView(withId(com.android.internal.R.id.content_preview_image_3_small))
- .check(matches(isDisplayed()));
- }
-
- @Test
- @RequireFeatureFlags(
- flags = { Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW_NAME },
- values = { true })
public void testManyVisibleImagePreview_ScrollableImagePreview() {
Uri uri = Uri.parse("android.resource://com.android.frameworks.coretests/"
+ R.drawable.test320x240);
diff --git a/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt b/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt
index 82bf94c..7b9a0ce 100644
--- a/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt
+++ b/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt
@@ -22,11 +22,9 @@
import android.graphics.Bitmap
import android.net.Uri
import com.android.intentresolver.ImageLoader
-import com.android.intentresolver.TestFeatureFlagRepository
import com.android.intentresolver.any
import com.android.intentresolver.anyOrNull
import com.android.intentresolver.contentpreview.ChooserContentPreviewUi.ActionFactory
-import com.android.intentresolver.flags.Flags
import com.android.intentresolver.mock
import com.android.intentresolver.whenever
import com.android.intentresolver.widget.ActionRow
@@ -61,11 +59,6 @@
override fun getExcludeSharedTextAction(): Consumer<Boolean> = Consumer<Boolean> {}
}
private val transitionCallback = mock<ImagePreviewView.TransitionElementStatusCallback>()
- private val featureFlagRepository = TestFeatureFlagRepository(
- mapOf(
- Flags.SHARESHEET_SCROLLABLE_IMAGE_PREVIEW to true
- )
- )
@Test
fun test_ChooserContentPreview_non_send_intent_action_to_text_preview() {
@@ -77,7 +70,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)
@@ -98,7 +90,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)
@@ -120,7 +111,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)
@@ -142,7 +132,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)
@@ -165,7 +154,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)
@@ -191,7 +179,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)
@@ -215,7 +202,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)
@@ -245,7 +231,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)
@@ -275,7 +260,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)
@@ -307,7 +291,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)
@@ -337,7 +320,6 @@
imageLoader,
actionFactory,
transitionCallback,
- featureFlagRepository,
headlineGenerator
)
assertThat(testSubject.preferredContentPreview)