blob: 0266c27395d16adcbbb3d53fd456e506ebf26d2c [file]
/*
* Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.photopicker.core.theme
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
import androidx.compose.material3.windowsizeclass.WindowSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.graphics.toComposeRect
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.window.layout.WindowMetricsCalculator
import com.android.photopicker.core.configuration.LocalPhotopickerConfiguration
/**
* Provider for the [WindowSizeClass] inside of composables. A [staticCompositionLocalOf] is used
* here, due to the nature of WindowSizes; if the WindowSize is changing, recomposition is
* unavoidable so there is no sense in keeping track of references that use this value.
*/
val LocalWindowSizeClass =
staticCompositionLocalOf<WindowSizeClass> {
throw IllegalStateException(
"No WindowSizeClass configured. Make sure to use LocalWindowSizeClass in a Composable" +
" surrounded by a PhotopickerTheme {}."
)
}
/**
* Helper function which calculates a WindowSizeClass incorporating the window rect and
* [LocalDensity].
*
* Note: This method observes [LocalPhotopickerConfiguration] and requires that to be provided
* higher in the tree.
*/
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
@Composable
fun calculateWindowSizeClass(): WindowSizeClass {
// Observe PhotopickerConfiguration changes and recalculate the size class on each change.
LocalPhotopickerConfiguration.current
val context = LocalContext.current
val density = LocalDensity.current
val metrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(context)
val size = with(density) { metrics.bounds.toComposeRect().size.toDpSize() }
return WindowSizeClass.calculateFromSize(size)
}