From 8ae8c4a3f25cc5c0da3196fa0a3f0f07dfe87066 Mon Sep 17 00:00:00 2001 From: Andrey Epin Date: Fri, 7 Apr 2023 17:54:25 -0700 Subject: Hide thumbnail prview if no preview has loaded In a case when a text is shared along with an image and image preview has failed to load, text exclusion from sharing does not hides the text but just greys it out (TextView marked disabled). This is to avoid unpleasant collapsing animation, something we'd need to address separately. Bug: 274643406 Test: manual testing Change-Id: I9fb9ce530afc1b31b2e075e15392bba256f36048 --- .../contentpreview/UnifiedContentPreviewUi.java | 15 +++++++++++---- .../intentresolver/widget/ScrollableImagePreviewView.kt | 15 ++++++++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) (limited to 'java/src') diff --git a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java index 748f7421..2e6ecb0e 100644 --- a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java @@ -91,6 +91,7 @@ class UnifiedContentPreviewUi extends ContentPreviewUi { R.layout.chooser_grid_preview_image, parent, false); ScrollableImagePreviewView imagePreview = contentPreviewLayout.findViewById(R.id.scrollable_image_preview); + imagePreview.setOnNoPreviewCallback(() -> imagePreview.setVisibility(View.GONE)); final ActionRow actionRow = contentPreviewLayout.findViewById(com.android.internal.R.id.chooser_action_row); @@ -132,7 +133,7 @@ class UnifiedContentPreviewUi extends ContentPreviewUi { mImageLoader); if (!TextUtils.isEmpty(mText) && mFiles.size() == 1 && allImages) { - setTextInImagePreviewVisibility(contentPreviewLayout, mActionFactory); + setTextInImagePreviewVisibility(contentPreviewLayout, imagePreview, mActionFactory); updateTextWithImageHeadline(contentPreviewLayout); } else { if (allImages) { @@ -175,7 +176,9 @@ class UnifiedContentPreviewUi extends ContentPreviewUi { } private void setTextInImagePreviewVisibility( - ViewGroup contentPreview, ChooserContentPreviewUi.ActionFactory actionFactory) { + ViewGroup contentPreview, + ScrollableImagePreviewView imagePreview, + ChooserContentPreviewUi.ActionFactory actionFactory) { final TextView textView = contentPreview .requireViewById(com.android.internal.R.id.content_preview_text); CheckBox actionView = contentPreview @@ -194,8 +197,12 @@ class UnifiedContentPreviewUi extends ContentPreviewUi { 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); + textView.setEnabled(isChecked); + if (imagePreview.getVisibility() == View.VISIBLE) { + // animate only only if we have preview + TransitionManager.beginDelayedTransition((ViewGroup) textView.getParent()); + textView.setVisibility(isChecked ? View.VISIBLE : View.GONE); + } shareTextAction.accept(!isChecked); updateTextWithImageHeadline(contentPreview); }); diff --git a/java/src/com/android/intentresolver/widget/ScrollableImagePreviewView.kt b/java/src/com/android/intentresolver/widget/ScrollableImagePreviewView.kt index d1b0f5b4..8dcaacb8 100644 --- a/java/src/com/android/intentresolver/widget/ScrollableImagePreviewView.kt +++ b/java/src/com/android/intentresolver/widget/ScrollableImagePreviewView.kt @@ -40,6 +40,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.takeWhile import kotlinx.coroutines.joinAll import kotlinx.coroutines.launch @@ -129,13 +130,18 @@ class ScrollableImagePreviewView : RecyclerView, ImagePreviewView { imageLoader, previews, otherItemCount, - ).apply { + ) { + onNoPreviewCallback?.run() + } + .apply { if (isMeasured) { loadAspectRatios(getMaxWidth(), this@ScrollableImagePreviewView::calcPreviewWidth) } } } + var onNoPreviewCallback: Runnable? = null + private fun getMaxWidth(): Int = when { maxWidthHint > 0 -> maxWidthHint @@ -187,6 +193,7 @@ class ScrollableImagePreviewView : RecyclerView, ImagePreviewView { private var totalItemCount: Int = 0 private val hasOtherItem get() = previews.size < totalItemCount + val hasPreviews: Boolean get() = previews.isNotEmpty() var transitionStatusElementCallback: TransitionElementStatusCallback? = null @@ -369,6 +376,7 @@ class ScrollableImagePreviewView : RecyclerView, ImagePreviewView { private val imageLoader: ImageLoader, previews: List, otherItemCount: Int, + private val onNoPreviewCallback: (() -> Unit) ) { private val pendingPreviews = ArrayDeque(previews) private val totalItemCount = previews.size + otherItemCount @@ -393,6 +401,11 @@ class ScrollableImagePreviewView : RecyclerView, ImagePreviewView { reportFlow .takeWhile { it !== completedEvent } .throttle(ADAPTER_UPDATE_INTERVAL_MS) + .onCompletion { cause -> + if (cause == null && !adapter.hasPreviews) { + onNoPreviewCallback() + } + } .collect { if (isFirstUpdate) { isFirstUpdate = false -- cgit v1.2.3-59-g8ed1b