summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
author 1 <mrcasey@google.com> 2023-04-04 21:00:37 +0000
committer 1 <mrcasey@google.com> 2023-04-05 12:12:05 +0000
commit964676869a6edcacccae658ba6ab4290f90166c2 (patch)
tree65232f9908591ca2abf837e6b3ff791ca4cf4463 /java/src
parentc75013c73c79fac3c9f64661d0e09825c5bde345 (diff)
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
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/intentresolver/ChooserActivity.java16
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java51
-rw-r--r--java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java4
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ImageContentPreviewUi.java188
-rw-r--r--java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java4
-rw-r--r--java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java4
-rw-r--r--java/src/com/android/intentresolver/flags/Flags.kt9
-rw-r--r--java/src/com/android/intentresolver/widget/ChooserImagePreviewView.kt163
8 files changed, 9 insertions, 430 deletions
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java
index 270fc299..dd0be4f0 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.ChooserContentPreviewUi;
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 @@ public class ChooserActivity extends ResolverActivity implements
createPreviewImageLoader(),
createChooserActionFactory(),
mEnterTransitionAnimationDelegate,
- mFeatureFlagRepository,
new HeadlineGeneratorImpl(this));
setAdditionalTargets(mChooserRequest.getAdditionalTargets());
@@ -1341,15 +1339,11 @@ public class ChooserActivity extends ResolverActivity implements
@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 3509c67d..318aa627 100644
--- a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
@@ -39,14 +39,11 @@ import android.view.ViewGroup;
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 @@ public final class ChooserContentPreviewUi {
ImageLoader imageLoader,
ActionFactory actionFactory,
TransitionElementStatusCallback transitionElementStatusCallback,
- FeatureFlagRepository featureFlagRepository,
HeadlineGenerator headlineGenerator) {
mContentPreviewUi = createContentPreview(
@@ -113,7 +109,6 @@ public final class ChooserContentPreviewUi {
imageLoader,
actionFactory,
transitionElementStatusCallback,
- featureFlagRepository,
headlineGenerator);
if (mContentPreviewUi.getType() != CONTENT_PREVIEW_IMAGE) {
transitionElementStatusCallback.onAllTransitionElementsReady();
@@ -127,7 +122,6 @@ public final class ChooserContentPreviewUi {
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 @@ public final class ChooserContentPreviewUi {
targetIntent,
actionFactory,
imageLoader,
- featureFlagRepository,
headlineGenerator);
}
List<Uri> uris = extractContentUris(targetIntent);
@@ -154,7 +147,6 @@ public final class ChooserContentPreviewUi {
targetIntent,
actionFactory,
imageLoader,
- featureFlagRepository,
headlineGenerator);
}
ArrayList<FileInfo> files = new ArrayList<>(uris.size());
@@ -164,50 +156,15 @@ public final class ChooserContentPreviewUi {
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 @@ public final class ChooserContentPreviewUi {
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 @@ public final class ChooserContentPreviewUi {
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 e65538ae..3012eec2 100644
--- a/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
@@ -29,7 +29,6 @@ import androidx.annotation.LayoutRes;
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 @@ class FileContentPreviewUi extends ContentPreviewUi {
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 85ae2adb..00000000
--- 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 6b5676cc..70df6479 100644
--- a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
@@ -30,7 +30,6 @@ 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 java.util.ArrayList;
@@ -45,7 +44,6 @@ class TextContentPreviewUi extends ContentPreviewUi {
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 @@ class TextContentPreviewUi extends ContentPreviewUi {
@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 a849ddb9..00a11e30 100644
--- a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
@@ -35,7 +35,6 @@ 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.ImagePreviewView.TransitionElementStatusCallback;
import com.android.intentresolver.widget.ScrollableImagePreviewView;
@@ -53,7 +52,6 @@ class UnifiedContentPreviewUi extends ContentPreviewUi {
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 @@ class UnifiedContentPreviewUi extends ContentPreviewUi {
ImageLoader imageLoader,
MimeTypeClassifier typeClassifier,
TransitionElementStatusCallback transitionElementStatusCallback,
- FeatureFlagRepository featureFlagRepository,
HeadlineGenerator headlineGenerator) {
mFiles = files;
mText = text;
@@ -71,7 +68,6 @@ class UnifiedContentPreviewUi extends ContentPreviewUi {
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 0440b3d6..b303dd1a 100644
--- a/java/src/com/android/intentresolver/flags/Flags.kt
+++ b/java/src/com/android/intentresolver/flags/Flags.kt
@@ -21,15 +21,8 @@ import com.android.systemui.flags.UnreleasedFlag
// 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 6273296d..00000000
--- 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
- }
-}