Skip to content

Commit d54fc48

Browse files
authored
Merge pull request #595 from square/ray/custom-dialog
2 parents 45ece5a + b455dde commit d54fc48

File tree

35 files changed

+856
-452
lines changed

35 files changed

+856
-452
lines changed
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package com.squareup.sample.container
22

33
import com.squareup.sample.container.overviewdetail.OverviewDetailContainer
4-
import com.squareup.sample.container.panel.PanelContainer
5-
import com.squareup.sample.container.panel.ScrimContainer
6-
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
4+
import com.squareup.sample.container.panel.PanelOverlayDialogFactory
75
import com.squareup.workflow1.ui.ViewRegistry
6+
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
87

98
@OptIn(WorkflowUiExperimentalApi::class)
109
val SampleContainers = ViewRegistry(
11-
BackButtonViewFactory, OverviewDetailContainer, PanelContainer, ScrimContainer
10+
BackButtonViewFactory, OverviewDetailContainer, PanelOverlayDialogFactory, ScrimContainer
1211
)
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package com.squareup.sample.container.panel
1+
package com.squareup.sample.container
22

33
import android.animation.ValueAnimator
44
import android.content.Context
55
import android.util.AttributeSet
66
import android.view.View
77
import android.view.ViewGroup
88
import androidx.core.content.ContextCompat
9-
import com.squareup.sample.container.R
9+
import com.squareup.sample.container.panel.ScrimScreen
1010
import com.squareup.workflow1.ui.ManualScreenViewFactory
1111
import com.squareup.workflow1.ui.ScreenViewFactory
1212
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
@@ -17,9 +17,9 @@ import com.squareup.workflow1.ui.bindShowRendering
1717
* A view that renders only its first child, behind a smoke scrim if
1818
* [isDimmed] is true (tablets only). Other children are ignored.
1919
*
20-
* Able to [render][com.squareup.workflow1.ui.showRendering] [ScrimContainerScreen].
20+
* Able to [render][com.squareup.workflow1.ui.showRendering] [ScrimScreen].
2121
*/
22-
class ScrimContainer @JvmOverloads constructor(
22+
internal class ScrimContainer @JvmOverloads constructor(
2323
context: Context,
2424
attributeSet: AttributeSet? = null,
2525
defStyle: Int = 0,
@@ -91,21 +91,21 @@ class ScrimContainer @JvmOverloads constructor(
9191
}
9292

9393
@OptIn(WorkflowUiExperimentalApi::class)
94-
companion object : ScreenViewFactory<ScrimContainerScreen<*>> by ManualScreenViewFactory(
95-
type = ScrimContainerScreen::class,
94+
companion object : ScreenViewFactory<ScrimScreen<*>> by ManualScreenViewFactory(
95+
type = ScrimScreen::class,
9696
viewConstructor = { initialRendering, initialViewEnvironment, contextForNewView, _ ->
9797
val stub = WorkflowViewStub(contextForNewView)
9898

9999
ScrimContainer(contextForNewView)
100-
.apply {
101-
layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
102-
addView(stub)
100+
.also { view ->
101+
view.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
102+
view.addView(stub)
103103

104-
bindShowRendering(
105-
initialRendering, initialViewEnvironment
104+
view.bindShowRendering(
105+
initialRendering, initialViewEnvironment
106106
) { rendering, environment ->
107-
stub.show(rendering.wrapped, environment)
108-
isDimmed = rendering.dimmed
107+
stub.show(rendering.content, environment)
108+
view.isDimmed = rendering.dimmed
109109
}
110110
}
111111
}

samples/containers/android/src/main/java/com/squareup/sample/container/panel/Contexts.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,9 @@ package com.squareup.sample.container.panel
22

33
import android.content.Context
44
import android.content.Context.WINDOW_SERVICE
5-
import android.view.Display
65
import android.view.WindowManager
76
import com.squareup.sample.container.R
87

9-
val Context.isPortrait: Boolean get() = resources.getBoolean(R.bool.is_portrait)
10-
118
val Context.isTablet: Boolean get() = resources.getBoolean(R.bool.is_tablet)
129

1310
val Context.windowManager: WindowManager get() = getSystemService(WINDOW_SERVICE) as WindowManager
14-
15-
@Suppress("DEPRECATION")
16-
val Context.defaultDisplay: Display get() = windowManager.defaultDisplay

samples/containers/android/src/main/java/com/squareup/sample/container/panel/PanelContainer.kt

Lines changed: 0 additions & 72 deletions
This file was deleted.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.squareup.sample.container.panel
2+
3+
import android.app.Dialog
4+
import android.graphics.Rect
5+
import android.graphics.drawable.ColorDrawable
6+
import android.util.TypedValue
7+
import android.view.View
8+
import com.squareup.sample.container.R
9+
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
10+
import com.squareup.workflow1.ui.container.ModalScreenOverlayDialogFactory
11+
import com.squareup.workflow1.ui.container.setBounds
12+
13+
/**
14+
* Android support for [PanelOverlay].
15+
*/
16+
@OptIn(WorkflowUiExperimentalApi::class)
17+
internal object PanelOverlayDialogFactory : ModalScreenOverlayDialogFactory<PanelOverlay<*>>(
18+
type = PanelOverlay::class
19+
) {
20+
override fun buildDialogWithContentView(contentView: View): Dialog {
21+
val context = contentView.context
22+
return Dialog(context, R.style.PanelDialog).also { dialog ->
23+
dialog.setContentView(contentView)
24+
25+
// Welcome to Android. Nothing workflow-related here, this is just how one
26+
// finds the window background color for the theme. I sure hope it's better in Compose.
27+
val maybeWindowColor = TypedValue()
28+
context.theme.resolveAttribute(android.R.attr.windowBackground, maybeWindowColor, true)
29+
if (
30+
maybeWindowColor.type in TypedValue.TYPE_FIRST_COLOR_INT..TypedValue.TYPE_LAST_COLOR_INT
31+
) {
32+
dialog.window!!.setBackgroundDrawable(ColorDrawable(maybeWindowColor.data))
33+
}
34+
}
35+
}
36+
37+
override fun updateBounds(
38+
dialog: Dialog,
39+
bounds: Rect
40+
) {
41+
val refinedBounds: Rect = if (!dialog.context.isTablet) {
42+
// On a phone, fill the bounds entirely.
43+
bounds
44+
} else {
45+
if (bounds.height() > bounds.width()) {
46+
val margin = bounds.height() - bounds.width()
47+
val topDelta = margin / 2
48+
val bottomDelta = margin - topDelta
49+
Rect(bounds).apply {
50+
top = bounds.top + topDelta
51+
bottom = bounds.bottom - bottomDelta
52+
}
53+
} else {
54+
val margin = bounds.width() - bounds.height()
55+
val leftDelta = margin / 2
56+
val rightDelta = margin - leftDelta
57+
Rect(bounds).apply {
58+
left = bounds.left + leftDelta
59+
right = bounds.right - rightDelta
60+
}
61+
}
62+
}
63+
dialog.setBounds(refinedBounds)
64+
}
65+
}

samples/containers/android/src/main/res/values-land/bools.xml

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3-
<bool name="is_portrait">true</bool>
43
<bool name="is_tablet">false</bool>
54
</resources>

samples/containers/common/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ plugins {
55

66
dependencies {
77
implementation(project(":workflow-ui:container-common"))
8+
implementation(project(":workflow-ui:core-android"))
89
implementation(project(":workflow-core"))
910

1011
implementation(Dependencies.Kotlin.Stdlib.jdk6)

samples/containers/common/src/main/java/com/squareup/sample/container/panel/PanelContainerScreen.kt

Lines changed: 0 additions & 55 deletions
This file was deleted.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.squareup.sample.container.panel
2+
3+
import com.squareup.workflow1.ui.Screen
4+
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
5+
import com.squareup.workflow1.ui.container.ScreenOverlay
6+
7+
@OptIn(WorkflowUiExperimentalApi::class)
8+
class PanelOverlay<T : Screen>(
9+
override val content: T
10+
) : ScreenOverlay<T>

0 commit comments

Comments
 (0)