From d221a6b178942c17d689350bedd3b093296c5815 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Thu, 17 Feb 2022 20:13:42 +0100 Subject: [PATCH] Apply grid columns settings to grid --- .../mm20/launcher2/ui/base/ProvideSettings.kt | 50 ++++++++++++ .../ui/launcher/search/SearchView.kt | 74 +++++------------- .../search/common/grid/SearchResultGrid.kt | 9 ++- .../widgets/picker/PickAppWidgetActivity.kt | 78 ++++++------------- .../launcher2/ui/locals/CompositionLocals.kt | 3 + 5 files changed, 104 insertions(+), 110 deletions(-) create mode 100644 ui/src/main/java/de/mm20/launcher2/ui/base/ProvideSettings.kt diff --git a/ui/src/main/java/de/mm20/launcher2/ui/base/ProvideSettings.kt b/ui/src/main/java/de/mm20/launcher2/ui/base/ProvideSettings.kt new file mode 100644 index 00000000..73be8429 --- /dev/null +++ b/ui/src/main/java/de/mm20/launcher2/ui/base/ProvideSettings.kt @@ -0,0 +1,50 @@ +package de.mm20.launcher2.ui.base + +import androidx.compose.runtime.* +import de.mm20.launcher2.preferences.LauncherDataStore +import de.mm20.launcher2.preferences.Settings +import de.mm20.launcher2.ui.component.ProvideIconShape +import de.mm20.launcher2.ui.locals.LocalCardStyle +import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled +import de.mm20.launcher2.ui.locals.LocalGridColumns +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map +import org.koin.androidx.compose.inject + +@Composable +fun ProvideSettings( + content: @Composable () -> Unit +) { + val dataStore: LauncherDataStore by inject() + + val cardStyle by remember { + dataStore.data.map { it.cards }.distinctUntilChanged() + }.collectAsState( + Settings.CardSettings.getDefaultInstance() + ) + val iconShape by remember { + dataStore.data.map { + if (it.easterEgg) Settings.IconSettings.IconShape.EasterEgg + else it.icons.shape + }.distinctUntilChanged() + }.collectAsState(Settings.IconSettings.IconShape.Circle) + + val favoritesEnabled by remember { + dataStore.data.map { it.favorites.enabled }.distinctUntilChanged() + }.collectAsState(true) + + val gridColumns by remember { + dataStore.data.map { it.grid.columnCount }.distinctUntilChanged() + }.collectAsState(5) + + CompositionLocalProvider( + LocalCardStyle provides cardStyle, + LocalFavoritesEnabled provides favoritesEnabled, + LocalGridColumns provides gridColumns, + ) { + ProvideIconShape(iconShape) { + content() + } + } + +} \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchView.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchView.kt index 53708621..751fdd69 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchView.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchView.kt @@ -3,18 +3,15 @@ package de.mm20.launcher2.ui.launcher.search import android.content.Context import android.util.AttributeSet import android.widget.FrameLayout -import androidx.compose.foundation.layout.* -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.unit.dp -import de.mm20.launcher2.preferences.LauncherDataStore -import de.mm20.launcher2.preferences.Settings import de.mm20.launcher2.ui.MdcLauncherTheme -import de.mm20.launcher2.ui.component.ProvideIconShape +import de.mm20.launcher2.ui.base.ProvideSettings import de.mm20.launcher2.ui.launcher.search.apps.AppResults import de.mm20.launcher2.ui.launcher.search.calculator.CalculatorResults import de.mm20.launcher2.ui.launcher.search.calendar.CalendarResults @@ -24,20 +21,12 @@ import de.mm20.launcher2.ui.launcher.search.files.FileResults import de.mm20.launcher2.ui.launcher.search.unitconverter.UnitConverterResults import de.mm20.launcher2.ui.launcher.search.website.WebsiteResults import de.mm20.launcher2.ui.launcher.search.wikipedia.WikipediaResults -import de.mm20.launcher2.ui.locals.LocalCardStyle -import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.map -import org.koin.android.ext.android.inject import org.koin.core.component.KoinComponent -import org.koin.core.component.inject class SearchView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : FrameLayout(context, attrs), KoinComponent { - private val dataStore: LauncherDataStore by inject() - init { val view = ComposeView(context) view.layoutParams = LayoutParams( @@ -46,43 +35,22 @@ class SearchView @JvmOverloads constructor( ) view.setContent { MdcLauncherTheme { - val cardStyle by remember { - dataStore.data.map { it.cards }.distinctUntilChanged() - }.collectAsState( - Settings.CardSettings.getDefaultInstance() - ) - val iconShape by remember { - dataStore.data.map { - if (it.easterEgg) Settings.IconSettings.IconShape.EasterEgg - else it.icons.shape - }.distinctUntilChanged() - }.collectAsState(Settings.IconSettings.IconShape.Circle) - - val favoritesEnabled by remember { - dataStore.data.map { it.favorites.enabled }.distinctUntilChanged() - }.collectAsState(true) - - CompositionLocalProvider( - LocalCardStyle provides cardStyle, - LocalFavoritesEnabled provides favoritesEnabled - ) { - ProvideIconShape(iconShape) { - Column( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .padding(8.dp) - ) { - FavoritesResults() - AppResults() - UnitConverterResults() - CalculatorResults() - CalendarResults() - ContactResults() - WikipediaResults() - WebsiteResults() - FileResults() - } + ProvideSettings { + Column( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight() + .padding(8.dp) + ) { + FavoritesResults() + AppResults() + UnitConverterResults() + CalculatorResults() + CalendarResults() + ContactResults() + WikipediaResults() + WebsiteResults() + FileResults() } } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/grid/SearchResultGrid.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/grid/SearchResultGrid.kt index 05f146cd..9d5e244c 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/grid/SearchResultGrid.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/grid/SearchResultGrid.kt @@ -27,18 +27,21 @@ import de.mm20.launcher2.ui.component.LauncherCard import de.mm20.launcher2.ui.component.ShapedLauncherIcon import de.mm20.launcher2.ui.ktx.toDp import de.mm20.launcher2.ui.launcher.search.apps.AppItemGridPopup +import de.mm20.launcher2.ui.locals.LocalGridColumns import kotlinx.coroutines.delay import kotlin.math.ceil @Composable fun SearchResultGrid(items: List) { + + val columns = LocalGridColumns.current Column( modifier = Modifier.animateContentSize().fillMaxWidth().padding(4.dp) ) { - for (i in 0 until ceil(items.size / 5f).toInt()) { + for (i in 0 until ceil(items.size / columns.toFloat()).toInt()) { Row { - for (j in 0 until 5) { - val item = items.getOrNull(i * 5 + j) + for (j in 0 until columns) { + val item = items.getOrNull(i * columns + j) if (item != null) { GridItem( modifier = Modifier diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/picker/PickAppWidgetActivity.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/picker/PickAppWidgetActivity.kt index 5fe4ec7d..05242ec0 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/picker/PickAppWidgetActivity.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/picker/PickAppWidgetActivity.kt @@ -7,33 +7,20 @@ import android.content.Intent import android.os.Bundle import android.util.Log import androidx.activity.compose.setContent -import androidx.activity.result.ActivityResultLauncher -import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import de.mm20.launcher2.preferences.LauncherDataStore -import de.mm20.launcher2.preferences.Settings import de.mm20.launcher2.ui.MdcLauncherTheme import de.mm20.launcher2.ui.base.BaseActivity -import de.mm20.launcher2.ui.component.ProvideIconShape -import de.mm20.launcher2.ui.locals.LocalCardStyle -import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.map -import org.koin.android.ext.android.inject +import de.mm20.launcher2.ui.base.ProvideSettings class PickAppWidgetActivity : BaseActivity() { - private val dataStore: LauncherDataStore by inject() private val viewModel by viewModels() private lateinit var widgetHost: AppWidgetHost @@ -49,43 +36,25 @@ class PickAppWidgetActivity : BaseActivity() { val selectedAppWidget = viewModel.selectedAppWidget setContent { MdcLauncherTheme { - val cardStyle by remember { - dataStore.data.map { it.cards }.distinctUntilChanged() - }.collectAsState( - Settings.CardSettings.getDefaultInstance() - ) - val iconShape by remember { - dataStore.data.map { - if (it.easterEgg) Settings.IconSettings.IconShape.EasterEgg - else it.icons.shape - }.distinctUntilChanged() - }.collectAsState(Settings.IconSettings.IconShape.Circle) - - val favoritesEnabled by remember { - dataStore.data.map { it.favorites.enabled }.distinctUntilChanged() - }.collectAsState(true) - - CompositionLocalProvider( - LocalCardStyle provides cardStyle, - LocalFavoritesEnabled provides favoritesEnabled - ) { - ProvideIconShape(iconShape) { - val available by availableWidgets.observeAsState() - val selected by selectedAppWidget.observeAsState() - val widgets = available - if (selected == null) { - if (widgets != null) { - AppWidgetList( - modifier = Modifier.fillMaxSize(), - widgets = widgets, - onWidgetSelected = { - selectAppWidget(it) - } - ) - } else { - Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - CircularProgressIndicator() + ProvideSettings { + val available by availableWidgets.observeAsState() + val selected by selectedAppWidget.observeAsState() + val widgets = available + if (selected == null) { + if (widgets != null) { + AppWidgetList( + modifier = Modifier.fillMaxSize(), + widgets = widgets, + onWidgetSelected = { + selectAppWidget(it) } + ) + } else { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator() } } } @@ -123,15 +92,16 @@ class PickAppWidgetActivity : BaseActivity() { } else { startActivityForResult( Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply { - putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) - putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, widget.provider) - }, RequestCodeBind) + putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) + putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, widget.provider) + }, RequestCodeBind + ) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - when(requestCode) { + when (requestCode) { RequestCodeBind -> { if (resultCode == RESULT_OK) { configureWidget() diff --git a/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt b/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt index d13c5650..a2d9da68 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt @@ -3,6 +3,7 @@ package de.mm20.launcher2.ui.locals import android.appwidget.AppWidgetHost import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.geometry.Size +import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavController import de.mm20.launcher2.preferences.Settings @@ -16,6 +17,8 @@ val LocalCardStyle = compositionLocalOf { Settings.CardSe val LocalFavoritesEnabled = compositionLocalOf { true } +val LocalGridColumns = compositionLocalOf { 5 } + /** * Workaround a bug in Jetpack Compose which incorrectly places popups * that are nested inside other popups.