From d018c355d6e608ec86998239ef6e331fc0fe02ee Mon Sep 17 00:00:00 2001 From: Ray Ryan Date: Wed, 2 Mar 2022 14:38:35 -0800 Subject: [PATCH] Introduces OverlayDialogFactoryFinder Like ScreenViewFactoryFinder, but for dialogs. Ensures that app code can customize how AndroidOverlay and AlertOverlay behave. --- .../sample/compose/preview/PreviewActivity.kt | 2 +- workflow-ui/core-android/api/core-android.api | 14 +++++++ .../ModalScreenOverlayDialogFactory.kt | 1 - .../ui/container/OverlayDialogFactory.kt | 14 +------ .../container/OverlayDialogFactoryFinder.kt | 38 +++++++++++++++++++ 5 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/OverlayDialogFactoryFinder.kt diff --git a/samples/compose-samples/src/main/java/com/squareup/sample/compose/preview/PreviewActivity.kt b/samples/compose-samples/src/main/java/com/squareup/sample/compose/preview/PreviewActivity.kt index f2578e0761..bbde08bd18 100644 --- a/samples/compose-samples/src/main/java/com/squareup/sample/compose/preview/PreviewActivity.kt +++ b/samples/compose-samples/src/main/java/com/squareup/sample/compose/preview/PreviewActivity.kt @@ -1,4 +1,4 @@ -@file:OptIn(WorkflowUiExperimentalApi::class, WorkflowUiExperimentalApi::class) +@file:OptIn(WorkflowUiExperimentalApi::class) package com.squareup.sample.compose.preview diff --git a/workflow-ui/core-android/api/core-android.api b/workflow-ui/core-android/api/core-android.api index 03c44fa1a6..64b1b38ad6 100644 --- a/workflow-ui/core-android/api/core-android.api +++ b/workflow-ui/core-android/api/core-android.api @@ -626,6 +626,20 @@ public abstract interface class com/squareup/workflow1/ui/container/OverlayDialo public abstract fun updateDialog (Landroid/app/Dialog;Lcom/squareup/workflow1/ui/container/Overlay;Lcom/squareup/workflow1/ui/ViewEnvironment;)V } +public abstract interface class com/squareup/workflow1/ui/container/OverlayDialogFactoryFinder { + public static final field Companion Lcom/squareup/workflow1/ui/container/OverlayDialogFactoryFinder$Companion; + public abstract fun getDialogFactoryForRendering (Lcom/squareup/workflow1/ui/ViewEnvironment;Lcom/squareup/workflow1/ui/container/Overlay;)Lcom/squareup/workflow1/ui/container/OverlayDialogFactory; +} + +public final class com/squareup/workflow1/ui/container/OverlayDialogFactoryFinder$Companion : com/squareup/workflow1/ui/ViewEnvironmentKey { + public fun getDefault ()Lcom/squareup/workflow1/ui/container/OverlayDialogFactoryFinder; + public synthetic fun getDefault ()Ljava/lang/Object; +} + +public final class com/squareup/workflow1/ui/container/OverlayDialogFactoryFinder$DefaultImpls { + public static fun getDialogFactoryForRendering (Lcom/squareup/workflow1/ui/container/OverlayDialogFactoryFinder;Lcom/squareup/workflow1/ui/ViewEnvironment;Lcom/squareup/workflow1/ui/container/Overlay;)Lcom/squareup/workflow1/ui/container/OverlayDialogFactory; +} + public final class com/squareup/workflow1/ui/container/OverlayDialogFactoryKt { public static final fun toDialogFactory (Lcom/squareup/workflow1/ui/container/Overlay;Lcom/squareup/workflow1/ui/ViewEnvironment;)Lcom/squareup/workflow1/ui/container/OverlayDialogFactory; } diff --git a/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/ModalScreenOverlayDialogFactory.kt b/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/ModalScreenOverlayDialogFactory.kt index 501b34c787..843488cbb0 100644 --- a/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/ModalScreenOverlayDialogFactory.kt +++ b/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/ModalScreenOverlayDialogFactory.kt @@ -18,7 +18,6 @@ import com.squareup.workflow1.ui.buildView import com.squareup.workflow1.ui.environment import com.squareup.workflow1.ui.showRendering import com.squareup.workflow1.ui.start -import java.lang.IllegalStateException import kotlin.reflect.KClass /** diff --git a/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/OverlayDialogFactory.kt b/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/OverlayDialogFactory.kt index 1f5d11fba8..4bd302f048 100644 --- a/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/OverlayDialogFactory.kt +++ b/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/OverlayDialogFactory.kt @@ -37,15 +37,5 @@ public interface OverlayDialogFactory : ViewRegistry.Entry @WorkflowUiExperimentalApi public fun T.toDialogFactory( viewEnvironment: ViewEnvironment -): OverlayDialogFactory { - val entry = viewEnvironment[ViewRegistry].getEntryFor(this::class) - - @Suppress("UNCHECKED_CAST") - return entry as? OverlayDialogFactory - ?: (this as? AndroidOverlay<*>)?.dialogFactory as? OverlayDialogFactory - ?: (this as? AlertOverlay)?.let { AlertOverlayDialogFactory as OverlayDialogFactory } - ?: throw IllegalArgumentException( - "An OverlayDialogFactory should have been registered to display $this, " + - "or that class should implement AndroidOverlay. Instead found $entry." - ) -} +): OverlayDialogFactory = + viewEnvironment[OverlayDialogFactoryFinder].getDialogFactoryForRendering(viewEnvironment, this) diff --git a/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/OverlayDialogFactoryFinder.kt b/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/OverlayDialogFactoryFinder.kt new file mode 100644 index 0000000000..c3d9825c4f --- /dev/null +++ b/workflow-ui/core-android/src/main/java/com/squareup/workflow1/ui/container/OverlayDialogFactoryFinder.kt @@ -0,0 +1,38 @@ +package com.squareup.workflow1.ui.container + +import com.squareup.workflow1.ui.ViewEnvironment +import com.squareup.workflow1.ui.ViewEnvironmentKey +import com.squareup.workflow1.ui.ViewRegistry +import com.squareup.workflow1.ui.WorkflowUiExperimentalApi + +/** + * [ViewEnvironment] service object used by [Overlay.toDialogFactory] to find the right + * [OverlayDialogFactoryScreenViewFactory]. The default implementation makes [AndroidOverlay] + * work, and provides a default binding for [AlertOverlay]. + */ +@WorkflowUiExperimentalApi +public interface OverlayDialogFactoryFinder { + public fun getDialogFactoryForRendering( + environment: ViewEnvironment, + rendering: OverlayT + ): OverlayDialogFactory { + val entry = environment[ViewRegistry].getEntryFor(rendering::class) + + @Suppress("UNCHECKED_CAST") + return entry as? OverlayDialogFactory + ?: (rendering as? AndroidOverlay<*>)?.dialogFactory as? OverlayDialogFactory + ?: (rendering as? AlertOverlay)?.let { + AlertOverlayDialogFactory as OverlayDialogFactory + } + ?: throw IllegalArgumentException( + "An OverlayDialogFactory should have been registered to display $this, " + + "or that class should implement AndroidOverlay. Instead found $entry." + ) + } + + public companion object : ViewEnvironmentKey( + OverlayDialogFactoryFinder::class + ) { + override val default: OverlayDialogFactoryFinder = object : OverlayDialogFactoryFinder {} + } +}