From 797c10869157ed583225d82ebda0c9e52f4ff56a Mon Sep 17 00:00:00 2001 From: Andrey Epin Date: Wed, 29 May 2024 14:41:37 -0700 Subject: Fix shared element animation for partially visible image When launching an image editor, do not run the shared element transition animation for a paritally visible image. Fix: 339583191 Test: atest IntentResolver-tests-unit Test: atest IntentResolver-tests-activity Test: manual testing Flag: com.android.intentresolver.fix_partial_image_edit_transition Change-Id: Idbcf3712d4d13966e656387b803d56486fa8e1a2 --- .../com/android/intentresolver/ChooserActionFactory.java | 14 ++++++++++---- java/src/com/android/intentresolver/ChooserActivity.java | 3 ++- .../com/android/intentresolver/widget/ViewExtensions.kt | 7 +++++++ 3 files changed, 19 insertions(+), 5 deletions(-) (limited to 'java') diff --git a/java/src/com/android/intentresolver/ChooserActionFactory.java b/java/src/com/android/intentresolver/ChooserActionFactory.java index 79998fbc..4dff2177 100644 --- a/java/src/com/android/intentresolver/ChooserActionFactory.java +++ b/java/src/com/android/intentresolver/ChooserActionFactory.java @@ -16,6 +16,8 @@ package com.android.intentresolver; +import static com.android.intentresolver.widget.ViewExtensionsKt.isFullyVisible; + import android.app.Activity; import android.app.ActivityOptions; import android.app.PendingIntent; @@ -129,7 +131,8 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio ActionActivityStarter activityStarter, @Nullable ShareResultSender shareResultSender, Consumer finishCallback, - ClipboardManager clipboardManager) { + ClipboardManager clipboardManager, + FeatureFlags featureFlags) { this( context, makeCopyButtonRunnable( @@ -145,7 +148,8 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio imageEditor), firstVisibleImageQuery, activityStarter, - log), + log, + featureFlags.fixPartialImageEditTransition()), chooserActions, onUpdateSharedTextIsExcluded, log, @@ -333,7 +337,8 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio @Nullable TargetInfo editSharingTarget, Callable firstVisibleImageQuery, ActionActivityStarter activityStarter, - EventLog log) { + EventLog log, + boolean requireFullVisibility) { if (editSharingTarget == null) return null; return () -> { // Log share completion via edit. @@ -344,7 +349,8 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio firstImageView = firstVisibleImageQuery.call(); } catch (Exception e) { /* ignore */ } // Action bar is user-independent; always start as primary. - if (firstImageView == null) { + if (firstImageView == null + || (requireFullVisibility && !isFullyVisible(firstImageView))) { activityStarter.safelyStartActivityAsPersonalProfileUser(editSharingTarget); } else { activityStarter.safelyStartActivityAsPersonalProfileUserWithSharedElementTransition( diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index 9643b9f0..1b2e2a3f 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -2198,7 +2198,8 @@ public class ChooserActivity extends Hilt_ChooserActivity implements }, mShareResultSender, this::finishWithStatus, - mClipboardManager); + mClipboardManager, + mFeatureFlags); } private Supplier createModifyShareActionFactory() { diff --git a/java/src/com/android/intentresolver/widget/ViewExtensions.kt b/java/src/com/android/intentresolver/widget/ViewExtensions.kt index d19933f5..64aa9352 100644 --- a/java/src/com/android/intentresolver/widget/ViewExtensions.kt +++ b/java/src/com/android/intentresolver/widget/ViewExtensions.kt @@ -16,6 +16,7 @@ package com.android.intentresolver.widget +import android.graphics.Rect import android.util.Log import android.view.View import androidx.core.view.OneShotPreDrawListener @@ -42,3 +43,9 @@ internal suspend fun View.waitForPreDraw(): Unit = suspendCancellableCoroutine { ) continuation.invokeOnCancellation { callback.removeListener() } } + +internal fun View.isFullyVisible(): Boolean { + val rect = Rect() + val isVisible = getLocalVisibleRect(rect) + return isVisible && rect.width() == width && rect.height() == height +} -- cgit v1.2.3-59-g8ed1b