Dock widget provider support (#3108)

Co-authored-by: Daria Hamrah Paytakht <info@dariarnd.ir>
This commit is contained in:
Yasan
2022-11-14 14:57:56 +03:30
committed by GitHub
parent f578bf5286
commit 89475edf3e
8 changed files with 163 additions and 37 deletions
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<com.android.launcher3.qsb.QsbContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="@dimen/qsb_widget_height"
android:id="@id/search_container_workspace"
android:padding="0dp" >
<fragment
android:name="com.android.launcher3.qsb.QsbContainerView$QsbFragment"
android:layout_width="match_parent"
android:tag="qsb_view"
android:layout_height="match_parent"/>
</com.android.launcher3.qsb.QsbContainerView>
+3 -1
View File
@@ -81,9 +81,11 @@
<!-- which time format to use by default on smartspace -->
<string name="config_default_smartspace_time_format" translatable="false">system</string>
<!-- which hotseat mode to use by default -->
<string name="config_default_hotseat_mode" translatable="false">lawnchair</string>
<bool name="config_default_always_reload_icons">true</bool>
<bool name="config_default_dark_status_bar">false</bool>
<bool name="config_default_dock_search_bar">true</bool>
<bool name="config_default_show_notification_count">false</bool>
<bool name="config_default_themed_hotseat_qsb">true</bool>
<bool name="config_default_dock_search_bar_force_website">false</bool>
+5 -2
View File
@@ -280,8 +280,11 @@
<!-- DockPreferences -->
<!-- <string name="dock_label" /> -->
<string name="search_bar_label">Search Bar</string>
<string name="hotseat_qsb_label">Show Search Bar</string>
<string name="hotseat_mode_label">Search Bar Widget</string>
<string name="hotseat_mode_disabled">Disabled</string>
<string name="hotseat_mode_lawnchair">Lawnchair</string>
<string name="hotseat_mode_google_search">Google Search Bar</string>
<string name="search_bar_label">Search Bar</string>
<string name="corner_radius_label">Corner Radius</string>
<string name="apply_accent_color_label">Apply Accent Color</string>
<string name="search_provider">Search Provider</string>
@@ -0,0 +1,60 @@
package app.lawnchair.hotseat
import android.content.Context
import androidx.annotation.LayoutRes
import androidx.annotation.StringRes
import app.lawnchair.util.isPackageInstalledAndEnabled
import com.android.launcher3.R
sealed class HotseatMode(
@StringRes val nameResourceId: Int,
@LayoutRes val layoutResourceId: Int,
) {
companion object {
fun fromString(value: String): HotseatMode = when (value) {
"disabled" -> DisabledHotseat
"google_search" -> GoogleSearchHotseat
else -> LawnchairHotseat
}
/**
* @return The list of all hot seat modes.
*/
fun values() = listOf(
DisabledHotseat,
LawnchairHotseat,
GoogleSearchHotseat,
)
}
abstract fun isAvailable(context: Context): Boolean
}
object LawnchairHotseat : HotseatMode(
nameResourceId = R.string.hotseat_mode_lawnchair,
layoutResourceId = R.layout.search_container_hotseat,
) {
override fun toString() = "lawnchair"
override fun isAvailable(context: Context): Boolean = true
}
object GoogleSearchHotseat : HotseatMode(
nameResourceId = R.string.hotseat_mode_google_search,
layoutResourceId = R.layout.search_container_hotseat_google_search,
) {
override fun toString(): String = "google_search"
override fun isAvailable(context: Context): Boolean =
context.packageManager.isPackageInstalledAndEnabled("com.google.android.googlequicksearchbox")
}
object DisabledHotseat : HotseatMode(
nameResourceId = R.string.hotseat_mode_disabled,
layoutResourceId = R.layout.empty_view,
) {
override fun toString(): String = "disabled"
override fun isAvailable(context: Context): Boolean = true
}
@@ -24,6 +24,7 @@ import androidx.datastore.preferences.core.*
import androidx.datastore.preferences.preferencesDataStore
import app.lawnchair.font.FontCache
import app.lawnchair.gestures.config.GestureHandlerConfig
import app.lawnchair.hotseat.HotseatMode
import app.lawnchair.icons.CustomAdaptiveIconDrawable
import app.lawnchair.icons.shape.IconShape
import app.lawnchair.icons.shape.IconShapeManager
@@ -76,9 +77,11 @@ class PreferenceManager2(private val context: Context) : PreferenceManager {
defaultValue = context.resources.getBoolean(R.bool.config_default_dark_status_bar),
)
val hotseatQsb = preference(
key = booleanPreferencesKey(name = "dock_search_bar"),
defaultValue = context.resources.getBoolean(R.bool.config_default_dock_search_bar),
val hotseatMode = preference(
key = stringPreferencesKey("hotseat_mode"),
defaultValue = HotseatMode.fromString(context.getString(R.string.config_default_hotseat_mode)),
parse = { HotseatMode.fromString(it) },
save = { it.toString() },
onSet = { reloadHelper.restart() },
)
@@ -17,14 +17,21 @@
package app.lawnchair.ui.preferences
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavGraphBuilder
import app.lawnchair.hotseat.HotseatMode
import app.lawnchair.hotseat.LawnchairHotseat
import app.lawnchair.preferences.PreferenceAdapter
import app.lawnchair.preferences.getAdapter
import app.lawnchair.preferences.preferenceManager
import app.lawnchair.preferences2.preferenceManager2
import app.lawnchair.qsb.providers.QsbSearchProvider
import app.lawnchair.ui.preferences.components.DividerColumn
import app.lawnchair.ui.preferences.components.ExpandAndShrink
import app.lawnchair.ui.preferences.components.ListPreference
import app.lawnchair.ui.preferences.components.ListPreferenceEntry
import app.lawnchair.ui.preferences.components.NavigationActionPreference
import app.lawnchair.ui.preferences.components.PreferenceGroup
import app.lawnchair.ui.preferences.components.PreferenceLayout
@@ -48,34 +55,35 @@ fun DockPreferences() {
val prefs2 = preferenceManager2()
PreferenceLayout(label = stringResource(id = R.string.dock_label)) {
PreferenceGroup(heading = stringResource(id = R.string.search_bar_label)) {
val hotseatQsbAdapter = prefs2.hotseatQsb.getAdapter()
SwitchPreference(
adapter = hotseatQsbAdapter,
label = stringResource(id = R.string.hotseat_qsb_label),
)
ExpandAndShrink(visible = hotseatQsbAdapter.state.value) {
DividerColumn {
SwitchPreference(
adapter = prefs2.themedHotseatQsb.getAdapter(),
label = stringResource(id = R.string.apply_accent_color_label),
)
SliderPreference(
label = stringResource(id = R.string.corner_radius_label),
adapter = prefs.hotseatQsbCornerRadius.getAdapter(),
step = 0.05F,
valueRange = 0F..1F,
showAsPercentage = true,
)
val hotseatQsbProviderAdapter by preferenceManager2().hotseatQsbProvider.getAdapter()
NavigationActionPreference(
label = stringResource(R.string.search_provider),
destination = subRoute(DockRoutes.SEARCH_PROVIDER),
subtitle = stringResource(
id = QsbSearchProvider.values()
.first { it == hotseatQsbProviderAdapter }
.name,
),
)
DividerColumn {
val hotseatModeAdapter = prefs2.hotseatMode.getAdapter()
HotseatModePreference(
adapter = hotseatModeAdapter,
)
ExpandAndShrink(visible = hotseatModeAdapter.state.value == LawnchairHotseat) {
DividerColumn {
SwitchPreference(
adapter = prefs2.themedHotseatQsb.getAdapter(),
label = stringResource(id = R.string.apply_accent_color_label),
)
SliderPreference(
label = stringResource(id = R.string.corner_radius_label),
adapter = prefs.hotseatQsbCornerRadius.getAdapter(),
step = 0.05F,
valueRange = 0F..1F,
showAsPercentage = true,
)
val hotseatQsbProviderAdapter by preferenceManager2().hotseatQsbProvider.getAdapter()
NavigationActionPreference(
label = stringResource(R.string.search_provider),
destination = subRoute(DockRoutes.SEARCH_PROVIDER),
subtitle = stringResource(
id = QsbSearchProvider.values()
.first { it == hotseatQsbProviderAdapter }
.name,
),
)
}
}
}
}
@@ -89,3 +97,27 @@ fun DockPreferences() {
}
}
}
@Composable
private fun HotseatModePreference(
adapter: PreferenceAdapter<HotseatMode>,
) {
val context = LocalContext.current
val entries = remember {
HotseatMode.values().map { mode ->
ListPreferenceEntry(
value = mode,
label = { stringResource(id = mode.nameResourceId) },
enabled = mode.isAvailable(context = context),
)
}
}
ListPreference(
adapter = adapter,
entries = entries,
label = stringResource(id = R.string.hotseat_mode_label),
)
}
+2 -1
View File
@@ -51,6 +51,7 @@ import com.patrykmichalik.opto.core.PreferenceExtensionsKt;
import java.io.PrintWriter;
import app.lawnchair.DeviceProfileOverrides;
import app.lawnchair.hotseat.DisabledHotseat;
import app.lawnchair.preferences2.PreferenceManager2;
import app.lawnchair.theme.color.ColorOption;
@@ -351,7 +352,7 @@ public class DeviceProfile {
int hotseatBottomPaddingRes;
int hotseatBottomNonTallPaddingRes;
int hotseatExtraVerticalSizeRes;
boolean hotseatQsb = PreferenceExtensionsKt.firstBlocking(preferenceManager2.getHotseatQsb());
boolean hotseatQsb = PreferenceExtensionsKt.firstBlocking(preferenceManager2.getHotseatMode()) != DisabledHotseat.INSTANCE;
if (hotseatQsb) {
hotseatTopPaddingRes = R.dimen.dynamic_grid_hotseat_top_padding;
hotseatBottomPaddingRes = R.dimen.dynamic_grid_hotseat_bottom_padding;
+12 -2
View File
@@ -35,7 +35,10 @@ import com.patrykmichalik.opto.core.PreferenceExtensionsKt;
import java.util.function.Consumer;
import app.lawnchair.hotseat.HotseatMode;
import app.lawnchair.hotseat.LawnchairHotseat;
import app.lawnchair.preferences2.PreferenceManager2;
import app.lawnchair.smartspace.model.LawnchairSmartspace;
/**
* View class that represents the bottom row of the home screen.
@@ -67,8 +70,15 @@ public class Hotseat extends CellLayout implements Insettable {
super(context, attrs, defStyle);
PreferenceManager2 preferenceManager2 = PreferenceManager2.getInstance(context);
boolean hotseatQsb = PreferenceExtensionsKt.firstBlocking(preferenceManager2.getHotseatQsb());
int layoutId = hotseatQsb ? R.layout.search_container_hotseat : R.layout.empty_view;
HotseatMode hotseatMode = PreferenceExtensionsKt.firstBlocking(preferenceManager2.getHotseatMode());
if (!hotseatMode.isAvailable(context)) {
// The current hotseat mode is not available,
// setting the hotseat mode to one that is always available
hotseatMode = LawnchairHotseat.INSTANCE;
PreferenceExtensionsKt.setBlocking(mPreferenceManager2.getHotseatMode(), hotseatMode);
}
int layoutId = hotseatMode.getLayoutResourceId();
mQsb = LayoutInflater.from(context).inflate(layoutId, this, false);
mQsbHeight = mQsb.getLayoutParams().height;
addView(mQsb);