Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.squareup.sample.container

import com.squareup.sample.container.overviewdetail.OverviewDetailContainer
import com.squareup.sample.container.panel.PanelContainer
import com.squareup.sample.container.panel.ScrimContainer
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
import com.squareup.sample.container.panel.PanelOverlayDialogFactory
import com.squareup.workflow1.ui.ViewRegistry
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi

@OptIn(WorkflowUiExperimentalApi::class)
val SampleContainers = ViewRegistry(
BackButtonViewFactory, OverviewDetailContainer, PanelContainer, ScrimContainer
BackButtonViewFactory, OverviewDetailContainer, PanelOverlayDialogFactory, ScrimContainer
)
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.squareup.sample.container.panel
package com.squareup.sample.container

import android.animation.ValueAnimator
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import com.squareup.sample.container.R
import com.squareup.sample.container.panel.ScrimScreen
import com.squareup.workflow1.ui.ManualScreenViewFactory
import com.squareup.workflow1.ui.ScreenViewFactory
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
Expand All @@ -17,9 +17,9 @@ import com.squareup.workflow1.ui.bindShowRendering
* A view that renders only its first child, behind a smoke scrim if
* [isDimmed] is true (tablets only). Other children are ignored.
*
* Able to [render][com.squareup.workflow1.ui.showRendering] [ScrimContainerScreen].
* Able to [render][com.squareup.workflow1.ui.showRendering] [ScrimScreen].
*/
class ScrimContainer @JvmOverloads constructor(
internal class ScrimContainer @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyle: Int = 0,
Expand Down Expand Up @@ -91,21 +91,21 @@ class ScrimContainer @JvmOverloads constructor(
}

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

ScrimContainer(contextForNewView)
.apply {
layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
addView(stub)
.also { view ->
view.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
view.addView(stub)

bindShowRendering(
initialRendering, initialViewEnvironment
view.bindShowRendering(
initialRendering, initialViewEnvironment
) { rendering, environment ->
stub.show(rendering.wrapped, environment)
isDimmed = rendering.dimmed
stub.show(rendering.content, environment)
view.isDimmed = rendering.dimmed
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,9 @@ package com.squareup.sample.container.panel

import android.content.Context
import android.content.Context.WINDOW_SERVICE
import android.view.Display
import android.view.WindowManager
import com.squareup.sample.container.R

val Context.isPortrait: Boolean get() = resources.getBoolean(R.bool.is_portrait)

val Context.isTablet: Boolean get() = resources.getBoolean(R.bool.is_tablet)

val Context.windowManager: WindowManager get() = getSystemService(WINDOW_SERVICE) as WindowManager

@Suppress("DEPRECATION")
val Context.defaultDisplay: Display get() = windowManager.defaultDisplay

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.squareup.sample.container.panel

import android.app.Dialog
import android.graphics.Rect
import android.graphics.drawable.ColorDrawable
import android.util.TypedValue
import android.view.View
import com.squareup.sample.container.R
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
import com.squareup.workflow1.ui.container.ModalScreenOverlayDialogFactory
import com.squareup.workflow1.ui.container.setBounds

/**
* Android support for [PanelOverlay].
*/
@OptIn(WorkflowUiExperimentalApi::class)
internal object PanelOverlayDialogFactory : ModalScreenOverlayDialogFactory<PanelOverlay<*>>(
type = PanelOverlay::class
) {
override fun buildDialogWithContentView(contentView: View): Dialog {
val context = contentView.context
return Dialog(context, R.style.PanelDialog).also { dialog ->
dialog.setContentView(contentView)

// Welcome to Android. Nothing workflow-related here, this is just how one
// finds the window background color for the theme. I sure hope it's better in Compose.
val maybeWindowColor = TypedValue()
context.theme.resolveAttribute(android.R.attr.windowBackground, maybeWindowColor, true)
if (
maybeWindowColor.type in TypedValue.TYPE_FIRST_COLOR_INT..TypedValue.TYPE_LAST_COLOR_INT
) {
dialog.window!!.setBackgroundDrawable(ColorDrawable(maybeWindowColor.data))
}
}
}

override fun updateBounds(
dialog: Dialog,
bounds: Rect
) {
val refinedBounds: Rect = if (!dialog.context.isTablet) {
// On a phone, fill the bounds entirely.
bounds
} else {
if (bounds.height() > bounds.width()) {
val margin = bounds.height() - bounds.width()
val topDelta = margin / 2
val bottomDelta = margin - topDelta
Rect(bounds).apply {
top = bounds.top + topDelta
bottom = bounds.bottom - bottomDelta
}
} else {
val margin = bounds.width() - bounds.height()
val leftDelta = margin / 2
val rightDelta = margin - leftDelta
Rect(bounds).apply {
left = bounds.left + leftDelta
right = bounds.right - rightDelta
}
}
}
dialog.setBounds(refinedBounds)
}
}
4 changes: 0 additions & 4 deletions samples/containers/android/src/main/res/values-land/bools.xml

This file was deleted.

1 change: 0 additions & 1 deletion samples/containers/android/src/main/res/values/bools.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_portrait">true</bool>
<bool name="is_tablet">false</bool>
</resources>
1 change: 1 addition & 0 deletions samples/containers/common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ plugins {

dependencies {
implementation(project(":workflow-ui:container-common"))
implementation(project(":workflow-ui:core-android"))
implementation(project(":workflow-core"))

implementation(Dependencies.Kotlin.Stdlib.jdk6)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.squareup.sample.container.panel

import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
import com.squareup.workflow1.ui.container.ScreenOverlay

@OptIn(WorkflowUiExperimentalApi::class)
class PanelOverlay<T : Screen>(
override val content: T
) : ScreenOverlay<T>

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.squareup.sample.container.panel

import com.squareup.workflow1.ui.Compatible
import com.squareup.workflow1.ui.Compatible.Companion.keyFor
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi

/**
* Show a scrim over some [content], which is invisible if [dimmed] is false,
* visible if it is true.
*/
@OptIn(WorkflowUiExperimentalApi::class)
class ScrimScreen<T : Screen>(
val content: T,
val dimmed: Boolean
) : Screen, Compatible {
override val compatibilityKey = keyFor(content, "ScrimScreen")
}
Loading