Add WindowSizeInfo to :core:ui:compose:common to determine the WindowSizeClasses and current height and width

This commit is contained in:
Wolf Montwé 2023-03-20 17:51:43 +01:00
parent 3f8a3ff0c9
commit f129080e36
No known key found for this signature in database
GPG key ID: 6D45B21512ACBF72
3 changed files with 147 additions and 0 deletions

View file

@ -0,0 +1,37 @@
package app.k9mail.core.ui.compose.common.window
/**
* WindowSizeClass as defined by supporting different screen sizes.
*
* See: https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes#window_size_classes
*/
enum class WindowSizeClass {
Compact,
Medium,
Expanded,
;
companion object {
private const val COMPACT_MAX_WIDTH = 600
private const val COMPACT_MAX_HEIGHT = 480
private const val MEDIUM_MAX_WIDTH = 840
private const val MEDIUM_MAX_HEIGHT = 900
fun fromWidth(width: Int): WindowSizeClass {
return when {
width < COMPACT_MAX_WIDTH -> Compact
width < MEDIUM_MAX_WIDTH -> Medium
else -> Expanded
}
}
fun fromHeight(height: Int): WindowSizeClass {
return when {
height < COMPACT_MAX_HEIGHT -> Compact
height < MEDIUM_MAX_HEIGHT -> Medium
else -> Expanded
}
}
}
}

View file

@ -0,0 +1,30 @@
package app.k9mail.core.ui.compose.common.window
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
/**
* Returns the current window size info based on current Configuration.
*/
@Composable
fun getWindowSizeInfo(): WindowSizeInfo {
val configuration = LocalConfiguration.current
return WindowSizeInfo(
screenWidthSizeClass = WindowSizeClass.fromWidth(configuration.screenWidthDp),
screenHeightSizeClass = WindowSizeClass.fromHeight(configuration.screenHeightDp),
screenWidth = configuration.screenWidthDp.dp,
screenHeight = configuration.screenHeightDp.dp,
)
}
@Immutable
data class WindowSizeInfo(
val screenWidthSizeClass: WindowSizeClass,
val screenHeightSizeClass: WindowSizeClass,
val screenWidth: Dp,
val screenHeight: Dp,
)

View file

@ -0,0 +1,80 @@
package app.k9mail.core.ui.compose.common.window
import assertk.assertThat
import assertk.assertions.isEqualTo
import org.junit.Test
class WindowSizeClassTest {
@Test
fun `should return compact when width is less than 600`() {
val width = 599
val windowSizeClass = WindowSizeClass.fromWidth(width)
assertThat(windowSizeClass).isEqualTo(WindowSizeClass.Compact)
}
@Test
fun `should return medium when width is 600`() {
val width = 600
val windowSizeClass = WindowSizeClass.fromWidth(width)
assertThat(windowSizeClass).isEqualTo(WindowSizeClass.Medium)
}
@Test
fun `should return medium when width is less than 840`() {
val width = 839
val windowSizeClass = WindowSizeClass.fromWidth(width)
assertThat(windowSizeClass).isEqualTo(WindowSizeClass.Medium)
}
@Test
fun `should return expanded when width is 840`() {
val width = 840
val windowSizeClass = WindowSizeClass.fromWidth(width)
assertThat(windowSizeClass).isEqualTo(WindowSizeClass.Expanded)
}
@Test
fun `should return compact when height is less than 480`() {
val height = 479
val windowSizeClass = WindowSizeClass.fromHeight(height)
assertThat(windowSizeClass).isEqualTo(WindowSizeClass.Compact)
}
@Test
fun `should return medium when height is 480`() {
val height = 480
val windowSizeClass = WindowSizeClass.fromHeight(height)
assertThat(windowSizeClass).isEqualTo(WindowSizeClass.Medium)
}
@Test
fun `should return medium when height is less than 900`() {
val height = 899
val windowSizeClass = WindowSizeClass.fromHeight(height)
assertThat(windowSizeClass).isEqualTo(WindowSizeClass.Medium)
}
@Test
fun `should return expanded when height is 900`() {
val height = 900
val windowSizeClass = WindowSizeClass.fromHeight(height)
assertThat(windowSizeClass).isEqualTo(WindowSizeClass.Expanded)
}
}