0
0
mirror of https://github.com/florisboard/florisboard.git synced 2024-09-19 11:32:18 +02:00

Merge pull request #2499 from florisboard/refactor/move-lib-snygg

Move `lib.snygg` to separate module
This commit is contained in:
Patrick Goldinger 2024-07-05 20:49:19 +02:00 committed by GitHub
commit 5b7727b884
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
94 changed files with 1078 additions and 1070 deletions

View File

@ -208,6 +208,7 @@ dependencies {
implementation(project(":lib:android"))
implementation(project(":lib:kotlin"))
implementation(project(":lib:native"))
implementation(project(":lib:snygg"))
testImplementation(libs.equalsverifier)
testImplementation(libs.kotest.assertions.core)

View File

@ -33,6 +33,7 @@ import dev.patrickgold.florisboard.ime.keyboard.KeyboardManager
import dev.patrickgold.florisboard.ime.media.emoji.FlorisEmojiCompat
import dev.patrickgold.florisboard.ime.nlp.NlpManager
import dev.patrickgold.florisboard.ime.text.gestures.GlideTypingManager
import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.ime.theme.ThemeManager
import dev.patrickgold.florisboard.lib.cache.CacheManager
import dev.patrickgold.florisboard.lib.crashutility.CrashUtility
@ -60,6 +61,7 @@ class FlorisApplication : Application() {
System.loadLibrary("fl_native")
} catch (_: Exception) {
}
FlorisImeTheme.init()
}
}

View File

@ -105,13 +105,13 @@ import dev.patrickgold.florisboard.lib.devtools.flogError
import dev.patrickgold.florisboard.lib.devtools.flogInfo
import dev.patrickgold.florisboard.lib.devtools.flogWarning
import dev.patrickgold.florisboard.lib.observeAsTransformingState
import dev.patrickgold.florisboard.lib.snygg.ui.SnyggSurface
import dev.patrickgold.florisboard.lib.snygg.ui.shape
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBorder
import dev.patrickgold.florisboard.lib.snygg.ui.snyggShadow
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import dev.patrickgold.florisboard.lib.snygg.ui.spSize
import org.florisboard.lib.snygg.ui.SnyggSurface
import org.florisboard.lib.snygg.ui.shape
import org.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.snyggBorder
import org.florisboard.lib.snygg.ui.snyggShadow
import org.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.spSize
import dev.patrickgold.florisboard.lib.util.ViewUtils
import dev.patrickgold.florisboard.lib.util.debugSummarize
import dev.patrickgold.florisboard.lib.util.launchActivity

View File

@ -49,7 +49,7 @@ import dev.patrickgold.florisboard.ime.theme.extCoreTheme
import org.florisboard.lib.android.isOrientationPortrait
import dev.patrickgold.florisboard.lib.ext.ExtensionComponentName
import dev.patrickgold.florisboard.lib.observeAsTransformingState
import dev.patrickgold.florisboard.lib.snygg.SnyggLevel
import org.florisboard.lib.snygg.SnyggLevel
import dev.patrickgold.florisboard.lib.util.VersionName
import dev.patrickgold.jetpref.datastore.JetPref
import dev.patrickgold.jetpref.datastore.model.PreferenceMigrationEntry

View File

@ -0,0 +1,597 @@
package dev.patrickgold.florisboard.app
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.settings.theme.DisplayColorsAs
import dev.patrickgold.florisboard.app.settings.theme.DisplayKbdAfterDialogs
import dev.patrickgold.florisboard.ime.core.DisplayLanguageNamesIn
import dev.patrickgold.florisboard.ime.input.CapitalizationBehavior
import dev.patrickgold.florisboard.ime.input.HapticVibrationMode
import dev.patrickgold.florisboard.ime.input.InputFeedbackActivationMode
import dev.patrickgold.florisboard.ime.keyboard.IncognitoMode
import dev.patrickgold.florisboard.ime.keyboard.SpaceBarMode
import dev.patrickgold.florisboard.ime.landscapeinput.LandscapeInputUiMode
import dev.patrickgold.florisboard.ime.media.emoji.EmojiSkinTone
import dev.patrickgold.florisboard.ime.nlp.SpellingLanguageMode
import dev.patrickgold.florisboard.ime.onehanded.OneHandedMode
import dev.patrickgold.florisboard.ime.smartbar.CandidatesDisplayMode
import dev.patrickgold.florisboard.ime.smartbar.ExtendedActionsPlacement
import dev.patrickgold.florisboard.ime.smartbar.IncognitoDisplayMode
import dev.patrickgold.florisboard.ime.smartbar.SmartbarLayout
import dev.patrickgold.florisboard.ime.text.gestures.SwipeAction
import dev.patrickgold.florisboard.ime.text.key.KeyHintMode
import dev.patrickgold.florisboard.ime.text.key.UtilityKeyAction
import dev.patrickgold.florisboard.ime.theme.ThemeMode
import dev.patrickgold.florisboard.lib.compose.stringRes
import org.florisboard.lib.snygg.SnyggLevel
import dev.patrickgold.jetpref.datastore.ui.ListPreferenceEntry
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
import org.florisboard.lib.kotlin.curlyFormat
import kotlin.reflect.KClass
private const val DEFAULT = ""
private val ENUM_DISPLAY_ENTRIES = mapOf<Pair<KClass<*>, String>, @Composable () -> List<ListPreferenceEntry<*>>>(
AppTheme::class to DEFAULT to {
listPrefEntries {
entry(
key = AppTheme.AUTO,
label = stringRes(R.string.settings__system_default),
)
entry(
key = AppTheme.AUTO_AMOLED,
label = stringRes(R.string.pref__advanced__settings_theme__auto_amoled),
)
entry(
key = AppTheme.LIGHT,
label = stringRes(R.string.pref__advanced__settings_theme__light),
)
entry(
key = AppTheme.DARK,
label = stringRes(R.string.pref__advanced__settings_theme__dark),
)
entry(
key = AppTheme.AMOLED_DARK,
label = stringRes(R.string.pref__advanced__settings_theme__amoled_dark),
)
}
},
CandidatesDisplayMode::class to DEFAULT to {
listPrefEntries {
entry(
key = CandidatesDisplayMode.CLASSIC,
label = stringRes(R.string.enum__candidates_display_mode__classic),
)
entry(
key = CandidatesDisplayMode.DYNAMIC,
label = stringRes(R.string.enum__candidates_display_mode__dynamic),
)
entry(
key = CandidatesDisplayMode.DYNAMIC_SCROLLABLE,
label = stringRes(R.string.enum__candidates_display_mode__dynamic_scrollable),
)
}
},
CapitalizationBehavior::class to DEFAULT to {
listPrefEntries {
entry(
key = CapitalizationBehavior.CAPSLOCK_BY_DOUBLE_TAP,
label = stringRes(R.string.enum__capitalization_behavior__capslock_by_double_tap),
)
entry(
key = CapitalizationBehavior.CAPSLOCK_BY_CYCLE,
label = stringRes(R.string.enum__capitalization_behavior__capslock_by_cycle),
)
}
},
DisplayColorsAs::class to DEFAULT to {
listPrefEntries {
entry(
key = DisplayColorsAs.HEX8,
label = stringRes(R.string.enum__display_colors_as__hex8),
description = stringRes(R.string.general__example_given).curlyFormat("example" to "#4caf50ff"),
showDescriptionOnlyIfSelected = true,
)
entry(
key = DisplayColorsAs.RGBA,
label = stringRes(R.string.enum__display_colors_as__rgba),
description = stringRes(R.string.general__example_given).curlyFormat("example" to "rgba(76,175,80,1.0)"),
showDescriptionOnlyIfSelected = true,
)
}
},
DisplayKbdAfterDialogs::class to DEFAULT to {
listPrefEntries {
entry(
key = DisplayKbdAfterDialogs.ALWAYS,
label = stringRes(R.string.enum__display_kbd_after_dialogs__always),
description = stringRes(R.string.enum__display_kbd_after_dialogs__always__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = DisplayKbdAfterDialogs.NEVER,
label = stringRes(R.string.enum__display_kbd_after_dialogs__never),
description = stringRes(R.string.enum__display_kbd_after_dialogs__never__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = DisplayKbdAfterDialogs.REMEMBER,
label = stringRes(R.string.enum__display_kbd_after_dialogs__remember),
description = stringRes(R.string.enum__display_kbd_after_dialogs__remember__description),
showDescriptionOnlyIfSelected = true,
)
}
},
DisplayLanguageNamesIn::class to DEFAULT to {
listPrefEntries {
entry(
key = DisplayLanguageNamesIn.SYSTEM_LOCALE,
label = stringRes(R.string.enum__display_language_names_in__system_locale),
description = stringRes(R.string.enum__display_language_names_in__system_locale__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = DisplayLanguageNamesIn.NATIVE_LOCALE,
label = stringRes(R.string.enum__display_language_names_in__native_locale),
description = stringRes(R.string.enum__display_language_names_in__native_locale__description),
showDescriptionOnlyIfSelected = true,
)
}
},
EmojiSkinTone::class to DEFAULT to {
listPrefEntries {
entry(
key = EmojiSkinTone.DEFAULT,
label = stringRes(
R.string.enum__emoji_skin_tone__default,
"emoji" to "\uD83D\uDC4B" // 👋
),
)
entry(
key = EmojiSkinTone.LIGHT_SKIN_TONE,
label = stringRes(
R.string.enum__emoji_skin_tone__light_skin_tone,
"emoji" to "\uD83D\uDC4B\uD83C\uDFFB" // 👋🏻
),
)
entry(
key = EmojiSkinTone.MEDIUM_LIGHT_SKIN_TONE,
label = stringRes(
R.string.enum__emoji_skin_tone__medium_light_skin_tone,
"emoji" to "\uD83D\uDC4B\uD83C\uDFFC" // 👋🏼
),
)
entry(
key = EmojiSkinTone.MEDIUM_SKIN_TONE,
label = stringRes(
R.string.enum__emoji_skin_tone__medium_skin_tone,
"emoji" to "\uD83D\uDC4B\uD83C\uDFFD" // 👋🏽
),
)
entry(
key = EmojiSkinTone.MEDIUM_DARK_SKIN_TONE,
label = stringRes(
R.string.enum__emoji_skin_tone__medium_dark_skin_tone,
"emoji" to "\uD83D\uDC4B\uD83C\uDFFE" // 👋🏾
),
)
entry(
key = EmojiSkinTone.DARK_SKIN_TONE,
label = stringRes(
R.string.enum__emoji_skin_tone__dark_skin_tone,
"emoji" to "\uD83D\uDC4B\uD83C\uDFFF" // 👋🏿
),
)
}
},
ExtendedActionsPlacement::class to DEFAULT to {
listPrefEntries {
entry(
key = ExtendedActionsPlacement.ABOVE_CANDIDATES,
label = stringRes(R.string.enum__extended_actions_placement__above_candidates),
description = stringRes(R.string.enum__extended_actions_placement__above_candidates__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = ExtendedActionsPlacement.BELOW_CANDIDATES,
label = stringRes(R.string.enum__extended_actions_placement__below_candidates),
description = stringRes(R.string.enum__extended_actions_placement__below_candidates__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = ExtendedActionsPlacement.OVERLAY_APP_UI,
label = stringRes(R.string.enum__extended_actions_placement__overlay_app_ui),
description = stringRes(R.string.enum__extended_actions_placement__overlay_app_ui__description),
showDescriptionOnlyIfSelected = true,
)
}
},
HapticVibrationMode::class to DEFAULT to {
listPrefEntries {
entry(
key = HapticVibrationMode.USE_VIBRATOR_DIRECTLY,
label = stringRes(R.string.enum__haptic_vibration_mode__use_vibrator_directly),
description = stringRes(R.string.enum__haptic_vibration_mode__use_vibrator_directly__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = HapticVibrationMode.USE_HAPTIC_FEEDBACK_INTERFACE,
label = stringRes(R.string.enum__haptic_vibration_mode__use_haptic_feedback_interface),
description = stringRes(R.string.enum__haptic_vibration_mode__use_haptic_feedback_interface__description),
showDescriptionOnlyIfSelected = true,
)
}
},
KeyHintMode::class to DEFAULT to {
listPrefEntries {
entry(
key = KeyHintMode.ACCENT_PRIORITY,
label = stringRes(R.string.enum__key_hint_mode__accent_priority),
description = stringRes(R.string.enum__key_hint_mode__accent_priority__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = KeyHintMode.HINT_PRIORITY,
label = stringRes(R.string.enum__key_hint_mode__hint_priority),
description = stringRes(R.string.enum__key_hint_mode__hint_priority__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = KeyHintMode.SMART_PRIORITY,
label = stringRes(R.string.enum__key_hint_mode__smart_priority),
description = stringRes(R.string.enum__key_hint_mode__smart_priority__description),
showDescriptionOnlyIfSelected = true,
)
}
},
IncognitoDisplayMode::class to DEFAULT to {
listPrefEntries {
entry(
key = IncognitoDisplayMode.REPLACE_SHARED_ACTIONS_TOGGLE,
label = stringRes(id = R.string.enum__incognito_display_mode__replace_shared_actions_toggle),
)
entry(
key = IncognitoDisplayMode.DISPLAY_BEHIND_KEYBOARD,
label = stringRes(id = R.string.enum__incognito_display_mode__display_behind_keyboard),
)
}
},
IncognitoMode::class to DEFAULT to {
listPrefEntries {
entry(
key = IncognitoMode.FORCE_OFF,
label = stringRes(R.string.enum__incognito_mode__force_off),
description = stringRes(R.string.enum__incognito_mode__force_off__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = IncognitoMode.DYNAMIC_ON_OFF,
label = stringRes(R.string.enum__incognito_mode__dynamic_on_off),
description = stringRes(R.string.enum__incognito_mode__dynamic_on_off__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = IncognitoMode.FORCE_ON,
label = stringRes(R.string.enum__incognito_mode__force_on),
description = stringRes(R.string.enum__incognito_mode__force_on__description),
showDescriptionOnlyIfSelected = true,
)
}
},
InputFeedbackActivationMode::class to "audio" to {
listPrefEntries {
entry(
key = InputFeedbackActivationMode.RESPECT_SYSTEM_SETTINGS,
label = stringRes(R.string.enum__input_feedback_activation_mode__audio_respect_system_settings),
)
entry(
key = InputFeedbackActivationMode.IGNORE_SYSTEM_SETTINGS,
label = stringRes(R.string.enum__input_feedback_activation_mode__audio_ignore_system_settings),
)
}
},
InputFeedbackActivationMode::class to "haptic" to {
listPrefEntries {
entry(
key = InputFeedbackActivationMode.RESPECT_SYSTEM_SETTINGS,
label = stringRes(R.string.enum__input_feedback_activation_mode__haptic_respect_system_settings),
)
entry(
key = InputFeedbackActivationMode.IGNORE_SYSTEM_SETTINGS,
label = stringRes(R.string.enum__input_feedback_activation_mode__haptic_ignore_system_settings),
)
}
},
LandscapeInputUiMode::class to DEFAULT to {
listPrefEntries {
entry(
key = LandscapeInputUiMode.NEVER_SHOW,
label = stringRes(R.string.enum__landscape_input_ui_mode__never_show),
)
entry(
key = LandscapeInputUiMode.ALWAYS_SHOW,
label = stringRes(R.string.enum__landscape_input_ui_mode__always_show),
)
entry(
key = LandscapeInputUiMode.DYNAMICALLY_SHOW,
label = stringRes(R.string.enum__landscape_input_ui_mode__dynamically_show),
)
}
},
OneHandedMode::class to DEFAULT to {
listPrefEntries {
entry(
key = OneHandedMode.OFF,
label = stringRes(R.string.enum__one_handed_mode__off),
)
entry(
key = OneHandedMode.START,
label = stringRes(R.string.enum__one_handed_mode__start),
)
entry(
key = OneHandedMode.END,
label = stringRes(R.string.enum__one_handed_mode__end),
)
}
},
SmartbarLayout::class to DEFAULT to {
listPrefEntries {
entry(
key = SmartbarLayout.SUGGESTIONS_ONLY,
label = stringRes(R.string.enum__smartbar_layout__suggestions_only),
description = stringRes(R.string.enum__smartbar_layout__suggestions_only__description),
)
entry(
key = SmartbarLayout.ACTIONS_ONLY,
label = stringRes(R.string.enum__smartbar_layout__actions_only),
description = stringRes(R.string.enum__smartbar_layout__actions_only__description),
)
entry(
key = SmartbarLayout.SUGGESTIONS_ACTIONS_SHARED,
label = stringRes(R.string.enum__smartbar_layout__suggestions_action_shared),
description = stringRes(R.string.enum__smartbar_layout__suggestions_action_shared__description),
)
entry(
key = SmartbarLayout.SUGGESTIONS_ACTIONS_EXTENDED,
label = stringRes(R.string.enum__smartbar_layout__suggestions_actions_extended),
description = stringRes(R.string.enum__smartbar_layout__suggestions_actions_extended__description),
)
}
},
SnyggLevel::class to DEFAULT to {
listPrefEntries {
entry(
key = SnyggLevel.BASIC,
label = stringRes(R.string.enum__snygg_level__basic),
description = stringRes(R.string.enum__snygg_level__basic__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = SnyggLevel.ADVANCED,
label = stringRes(R.string.enum__snygg_level__advanced),
description = stringRes(R.string.enum__snygg_level__advanced__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = SnyggLevel.DEVELOPER,
label = stringRes(R.string.enum__snygg_level__developer),
description = stringRes(R.string.enum__snygg_level__developer__description),
showDescriptionOnlyIfSelected = true,
)
}
},
SpaceBarMode::class to DEFAULT to {
listPrefEntries {
entry(
key = SpaceBarMode.NOTHING,
label = stringRes(R.string.enum__space_bar_mode__nothing),
)
entry(
key = SpaceBarMode.CURRENT_LANGUAGE,
label = stringRes(R.string.enum__space_bar_mode__current_language),
)
entry(
key = SpaceBarMode.SPACE_BAR_KEY,
label = stringRes(R.string.enum__space_bar_mode__space_bar_key),
)
}
},
SpellingLanguageMode::class to DEFAULT to {
listPrefEntries {
entry(
key = SpellingLanguageMode.USE_SYSTEM_LANGUAGES,
label = stringRes(R.string.enum__spelling_language_mode__use_system_languages),
)
entry(
key = SpellingLanguageMode.USE_KEYBOARD_SUBTYPES,
label = stringRes(R.string.enum__spelling_language_mode__use_keyboard_subtypes),
)
}
},
SwipeAction::class to "general" to {
listPrefEntries {
entry(
key = SwipeAction.NO_ACTION,
label = stringRes(R.string.enum__swipe_action__no_action),
)
entry(
key = SwipeAction.CYCLE_TO_PREVIOUS_KEYBOARD_MODE,
label = stringRes(R.string.enum__swipe_action__cycle_to_previous_keyboard_mode),
)
entry(
key = SwipeAction.CYCLE_TO_NEXT_KEYBOARD_MODE,
label = stringRes(R.string.enum__swipe_action__cycle_to_next_keyboard_mode),
)
entry(
key = SwipeAction.DELETE_WORD,
label = stringRes(R.string.enum__swipe_action__delete_word),
)
entry(
key = SwipeAction.HIDE_KEYBOARD,
label = stringRes(R.string.enum__swipe_action__hide_keyboard),
)
entry(
key = SwipeAction.INSERT_SPACE,
label = stringRes(R.string.enum__swipe_action__insert_space),
)
entry(
key = SwipeAction.MOVE_CURSOR_UP,
label = stringRes(R.string.enum__swipe_action__move_cursor_up),
)
entry(
key = SwipeAction.MOVE_CURSOR_DOWN,
label = stringRes(R.string.enum__swipe_action__move_cursor_down),
)
entry(
key = SwipeAction.MOVE_CURSOR_LEFT,
label = stringRes(R.string.enum__swipe_action__move_cursor_left),
)
entry(
key = SwipeAction.MOVE_CURSOR_RIGHT,
label = stringRes(R.string.enum__swipe_action__move_cursor_right),
)
entry(
key = SwipeAction.MOVE_CURSOR_START_OF_LINE,
label = stringRes(R.string.enum__swipe_action__move_cursor_start_of_line),
)
entry(
key = SwipeAction.MOVE_CURSOR_END_OF_LINE,
label = stringRes(R.string.enum__swipe_action__move_cursor_end_of_line),
)
entry(
key = SwipeAction.MOVE_CURSOR_START_OF_PAGE,
label = stringRes(R.string.enum__swipe_action__move_cursor_start_of_page),
)
entry(
key = SwipeAction.MOVE_CURSOR_END_OF_PAGE,
label = stringRes(R.string.enum__swipe_action__move_cursor_end_of_page),
)
entry(
key = SwipeAction.SHIFT,
label = stringRes(R.string.enum__swipe_action__shift),
)
entry(
key = SwipeAction.REDO,
label = stringRes(R.string.enum__swipe_action__redo),
)
entry(
key = SwipeAction.UNDO,
label = stringRes(R.string.enum__swipe_action__undo),
)
entry(
key = SwipeAction.SWITCH_TO_CLIPBOARD_CONTEXT,
label = stringRes(R.string.enum__swipe_action__switch_to_clipboard_context),
)
entry(
key = SwipeAction.SHOW_INPUT_METHOD_PICKER,
label = stringRes(R.string.enum__swipe_action__show_input_method_picker),
)
entry(
key = SwipeAction.SWITCH_TO_PREV_SUBTYPE,
label = stringRes(R.string.enum__swipe_action__switch_to_prev_subtype),
)
entry(
key = SwipeAction.SWITCH_TO_NEXT_SUBTYPE,
label = stringRes(R.string.enum__swipe_action__switch_to_next_subtype),
)
entry(
key = SwipeAction.SWITCH_TO_PREV_KEYBOARD,
label = stringRes(R.string.enum__swipe_action__switch_to_prev_keyboard),
)
entry(
key = SwipeAction.TOGGLE_SMARTBAR_VISIBILITY,
label = stringRes(R.string.enum__swipe_action__toggle_smartbar_visibility),
)
}
},
SwipeAction::class to "deleteSwipe" to {
listPrefEntries {
entry(
key = SwipeAction.NO_ACTION,
label = stringRes(R.string.enum__swipe_action__no_action),
)
entry(
key = SwipeAction.DELETE_CHARACTERS_PRECISELY,
label = stringRes(R.string.enum__swipe_action__delete_characters_precisely),
)
entry(
key = SwipeAction.DELETE_WORD,
label = stringRes(R.string.enum__swipe_action__delete_word),
)
entry(
key = SwipeAction.DELETE_WORDS_PRECISELY,
label = stringRes(R.string.enum__swipe_action__delete_words_precisely),
)
entry(
key = SwipeAction.SELECT_CHARACTERS_PRECISELY,
label = stringRes(R.string.enum__swipe_action__select_characters_precisely),
)
entry(
key = SwipeAction.SELECT_WORDS_PRECISELY,
label = stringRes(R.string.enum__swipe_action__select_words_precisely),
)
}
},
SwipeAction::class to "deleteLongPress" to {
listPrefEntries {
entry(
key = SwipeAction.DELETE_CHARACTER,
label = stringRes(R.string.enum__swipe_action__delete_character),
)
entry(
key = SwipeAction.DELETE_WORD,
label = stringRes(R.string.enum__swipe_action__delete_word),
)
}
},
ThemeMode::class to DEFAULT to {
listPrefEntries {
entry(
key = ThemeMode.ALWAYS_DAY,
label = stringRes(R.string.enum__theme_mode__always_day),
)
entry(
key = ThemeMode.ALWAYS_NIGHT,
label = stringRes(R.string.enum__theme_mode__always_night),
)
entry(
key = ThemeMode.FOLLOW_SYSTEM,
label = stringRes(R.string.enum__theme_mode__follow_system),
)
entry(
key = ThemeMode.FOLLOW_TIME,
label = stringRes(R.string.enum__theme_mode__follow_time),
)
}
},
UtilityKeyAction::class to DEFAULT to {
listPrefEntries {
entry(
key = UtilityKeyAction.SWITCH_TO_EMOJIS,
label = stringRes(R.string.enum__utility_key_action__switch_to_emojis),
)
entry(
key = UtilityKeyAction.SWITCH_LANGUAGE,
label = stringRes(R.string.enum__utility_key_action__switch_language),
)
entry(
key = UtilityKeyAction.SWITCH_KEYBOARD_APP,
label = stringRes(R.string.enum__utility_key_action__switch_keyboard_app),
)
entry(
key = UtilityKeyAction.DYNAMIC_SWITCH_LANGUAGE_EMOJIS,
label = stringRes(R.string.enum__utility_key_action__dynamic_switch_language_emojis),
)
}
},
)
@Composable
fun <V : Any> enumDisplayEntriesOf(
enumClass: KClass<V>,
variant: String = DEFAULT,
): List<ListPreferenceEntry<V>> {
@Suppress("UNCHECKED_CAST")
return ENUM_DISPLAY_ENTRIES[enumClass to variant]?.invoke()
as List<ListPreferenceEntry<V>>
}

View File

@ -83,7 +83,7 @@ import dev.patrickgold.florisboard.lib.ext.validate
import dev.patrickgold.florisboard.lib.io.FlorisRef
import dev.patrickgold.florisboard.lib.io.ZipUtils
import dev.patrickgold.florisboard.lib.rememberValidationResult
import dev.patrickgold.florisboard.lib.snygg.SnyggStylesheetJsonConfig
import org.florisboard.lib.snygg.SnyggStylesheetJsonConfig
import dev.patrickgold.florisboard.themeManager
import dev.patrickgold.jetpref.datastore.ui.Preference
import dev.patrickgold.jetpref.datastore.ui.vectorResource

View File

@ -30,6 +30,7 @@ import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.AppTheme
import dev.patrickgold.florisboard.app.LocalNavController
import dev.patrickgold.florisboard.app.Routes
import dev.patrickgold.florisboard.app.enumDisplayEntriesOf
import dev.patrickgold.florisboard.ime.core.DisplayLanguageNamesIn
import dev.patrickgold.florisboard.ime.keyboard.IncognitoMode
import dev.patrickgold.florisboard.lib.FlorisLocale
@ -56,28 +57,7 @@ fun AdvancedScreen() = FlorisScreen {
prefs.advanced.settingsTheme,
icon = Icons.Default.Palette,
title = stringRes(R.string.pref__advanced__settings_theme__label),
entries = listPrefEntries {
entry(
key = AppTheme.AUTO,
label = stringRes(R.string.settings__system_default),
)
entry(
key = AppTheme.AUTO_AMOLED,
label = stringRes(R.string.pref__advanced__settings_theme__auto_amoled),
)
entry(
key = AppTheme.LIGHT,
label = stringRes(R.string.pref__advanced__settings_theme__light),
)
entry(
key = AppTheme.DARK,
label = stringRes(R.string.pref__advanced__settings_theme__dark),
)
entry(
key = AppTheme.AMOLED_DARK,
label = stringRes(R.string.pref__advanced__settings_theme__amoled_dark),
)
},
entries = enumDisplayEntriesOf(AppTheme::class),
)
SwitchPreference(
pref = prefs.advanced.useMaterialYou,
@ -165,7 +145,7 @@ fun AdvancedScreen() = FlorisScreen {
prefs.advanced.incognitoMode,
icon = vectorResource(id = R.drawable.ic_incognito),
title = stringRes(R.string.pref__advanced__incognito_mode__label),
entries = IncognitoMode.listEntries(),
entries = enumDisplayEntriesOf(IncognitoMode::class),
)
Preference(
icon = Icons.Default.Adb,

View File

@ -21,6 +21,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.enumDisplayEntriesOf
import dev.patrickgold.florisboard.ime.text.gestures.SwipeAction
import dev.patrickgold.florisboard.lib.compose.FlorisInfoCard
import dev.patrickgold.florisboard.lib.compose.FlorisScreen
@ -93,25 +94,25 @@ fun GesturesScreen() = FlorisScreen {
ListPreference(
prefs.gestures.swipeUp,
title = stringRes(R.string.pref__gestures__swipe_up__label),
entries = SwipeAction.generalListEntries(),
entries = enumDisplayEntriesOf(SwipeAction::class, "general"),
enabledIf = { prefs.glide.enabled isEqualTo false },
)
ListPreference(
prefs.gestures.swipeDown,
title = stringRes(R.string.pref__gestures__swipe_down__label),
entries = SwipeAction.generalListEntries(),
entries = enumDisplayEntriesOf(SwipeAction::class, "general"),
enabledIf = { prefs.glide.enabled isEqualTo false },
)
ListPreference(
prefs.gestures.swipeLeft,
title = stringRes(R.string.pref__gestures__swipe_left__label),
entries = SwipeAction.generalListEntries(),
entries = enumDisplayEntriesOf(SwipeAction::class, "general"),
enabledIf = { prefs.glide.enabled isEqualTo false },
)
ListPreference(
prefs.gestures.swipeRight,
title = stringRes(R.string.pref__gestures__swipe_right__label),
entries = SwipeAction.generalListEntries(),
entries = enumDisplayEntriesOf(SwipeAction::class, "general"),
enabledIf = { prefs.glide.enabled isEqualTo false },
)
}
@ -120,22 +121,22 @@ fun GesturesScreen() = FlorisScreen {
ListPreference(
prefs.gestures.spaceBarSwipeUp,
title = stringRes(R.string.pref__gestures__space_bar_swipe_up__label),
entries = SwipeAction.generalListEntries(),
entries = enumDisplayEntriesOf(SwipeAction::class, "general"),
)
ListPreference(
prefs.gestures.spaceBarSwipeLeft,
title = stringRes(R.string.pref__gestures__space_bar_swipe_left__label),
entries = SwipeAction.generalListEntries(),
entries = enumDisplayEntriesOf(SwipeAction::class, "general"),
)
ListPreference(
prefs.gestures.spaceBarSwipeRight,
title = stringRes(R.string.pref__gestures__space_bar_swipe_right__label),
entries = SwipeAction.generalListEntries(),
entries = enumDisplayEntriesOf(SwipeAction::class, "general"),
)
ListPreference(
prefs.gestures.spaceBarLongPress,
title = stringRes(R.string.pref__gestures__space_bar_long_press__label),
entries = SwipeAction.generalListEntries(),
entries = enumDisplayEntriesOf(SwipeAction::class, "general"),
)
}
@ -143,12 +144,12 @@ fun GesturesScreen() = FlorisScreen {
ListPreference(
prefs.gestures.deleteKeySwipeLeft,
title = stringRes(R.string.pref__gestures__delete_key_swipe_left__label),
entries = SwipeAction.deleteSwipeListEntries(),
entries = enumDisplayEntriesOf(SwipeAction::class, "deleteSwipe"),
)
ListPreference(
prefs.gestures.deleteKeyLongPress,
title = stringRes(R.string.pref__gestures__delete_key_long_press__label),
entries = SwipeAction.deleteLongPressListEntries(),
entries = enumDisplayEntriesOf(SwipeAction::class, "deleteLongPress"),
)
DialogSliderPreference(
prefs.gestures.swipeVelocityThreshold,

View File

@ -19,6 +19,7 @@ package dev.patrickgold.florisboard.app.settings.keyboard
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.enumDisplayEntriesOf
import dev.patrickgold.florisboard.ime.input.InputFeedbackActivationMode
import dev.patrickgold.florisboard.ime.input.HapticVibrationMode
import org.florisboard.lib.android.AndroidVersion
@ -49,7 +50,7 @@ fun InputFeedbackScreen() = FlorisScreen {
switchPref = prefs.inputFeedback.audioEnabled,
title = stringRes(R.string.pref__input_feedback__audio_enabled__label),
summarySwitchDisabled = stringRes(R.string.pref__input_feedback__audio_enabled__summary_disabled),
entries = InputFeedbackActivationMode.audioListEntries(),
entries = enumDisplayEntriesOf(InputFeedbackActivationMode::class, "audio"),
)
DialogSliderPreference(
prefs.inputFeedback.audioVolume,
@ -98,13 +99,13 @@ fun InputFeedbackScreen() = FlorisScreen {
switchPref = prefs.inputFeedback.hapticEnabled,
title = stringRes(R.string.pref__input_feedback__haptic_enabled__label),
summarySwitchDisabled = stringRes(R.string.pref__input_feedback__haptic_enabled__summary_disabled),
entries = InputFeedbackActivationMode.hapticListEntries(),
entries = enumDisplayEntriesOf(InputFeedbackActivationMode::class, "haptic")
)
ListPreference(
prefs.inputFeedback.hapticVibrationMode,
title = stringRes(R.string.pref__input_feedback__haptic_vibration_mode__label),
enabledIf = { prefs.inputFeedback.hapticEnabled isEqualTo true },
entries = HapticVibrationMode.listEntries(),
entries = enumDisplayEntriesOf(HapticVibrationMode::class),
)
DialogSliderPreference(
prefs.inputFeedback.hapticVibrationDuration,

View File

@ -20,6 +20,7 @@ import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.LocalNavController
import dev.patrickgold.florisboard.app.Routes
import dev.patrickgold.florisboard.app.enumDisplayEntriesOf
import dev.patrickgold.florisboard.ime.input.CapitalizationBehavior
import dev.patrickgold.florisboard.ime.keyboard.SpaceBarMode
import dev.patrickgold.florisboard.ime.landscapeinput.LandscapeInputUiMode
@ -55,14 +56,14 @@ fun KeyboardScreen() = FlorisScreen {
switchPref = prefs.keyboard.hintedNumberRowEnabled,
title = stringRes(R.string.pref__keyboard__hinted_number_row_mode__label),
summarySwitchDisabled = stringRes(R.string.state__disabled),
entries = KeyHintMode.listEntries(),
entries = enumDisplayEntriesOf(KeyHintMode::class),
)
ListPreference(
listPref = prefs.keyboard.hintedSymbolsMode,
switchPref = prefs.keyboard.hintedSymbolsEnabled,
title = stringRes(R.string.pref__keyboard__hinted_symbols_mode__label),
summarySwitchDisabled = stringRes(R.string.state__disabled),
entries = KeyHintMode.listEntries(),
entries = enumDisplayEntriesOf(KeyHintMode::class),
)
SwitchPreference(
prefs.keyboard.utilityKeyEnabled,
@ -72,18 +73,18 @@ fun KeyboardScreen() = FlorisScreen {
ListPreference(
prefs.keyboard.utilityKeyAction,
title = stringRes(R.string.pref__keyboard__utility_key_action__label),
entries = UtilityKeyAction.listEntries(),
entries = enumDisplayEntriesOf(UtilityKeyAction::class),
visibleIf = { prefs.keyboard.utilityKeyEnabled isEqualTo true },
)
ListPreference(
prefs.keyboard.spaceBarMode,
title = stringRes(R.string.pref__keyboard__space_bar_mode__label),
entries = SpaceBarMode.listEntries(),
entries = enumDisplayEntriesOf(SpaceBarMode::class),
)
ListPreference(
prefs.keyboard.capitalizationBehavior,
title = stringRes(R.string.pref__keyboard__capitalization_behavior__label),
entries = CapitalizationBehavior.listEntries(),
entries = enumDisplayEntriesOf(CapitalizationBehavior::class),
)
DialogSliderPreference(
primaryPref = prefs.keyboard.fontSizeMultiplierPortrait,
@ -99,14 +100,14 @@ fun KeyboardScreen() = FlorisScreen {
ListPreference(
listPref = prefs.keyboard.incognitoDisplayMode,
title = stringRes(R.string.pref__keyboard__incognito_indicator__label),
entries = IncognitoDisplayMode.listEntries(),
entries = enumDisplayEntriesOf(IncognitoDisplayMode::class),
)
PreferenceGroup(title = stringRes(R.string.pref__keyboard__group_layout__label)) {
ListPreference(
prefs.keyboard.oneHandedMode,
title = stringRes(R.string.pref__keyboard__one_handed_mode__label),
entries = OneHandedMode.listEntries(),
entries = enumDisplayEntriesOf(OneHandedMode::class),
)
DialogSliderPreference(
prefs.keyboard.oneHandedModeScaleFactor,
@ -120,7 +121,7 @@ fun KeyboardScreen() = FlorisScreen {
ListPreference(
prefs.keyboard.landscapeInputUiMode,
title = stringRes(R.string.pref__keyboard__landscape_input_ui_mode__label),
entries = LandscapeInputUiMode.listEntries(),
entries = enumDisplayEntriesOf(LandscapeInputUiMode::class),
)
DialogSliderPreference(
primaryPref = prefs.keyboard.heightFactorPortrait,

View File

@ -32,6 +32,7 @@ import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.LocalNavController
import dev.patrickgold.florisboard.app.Routes
import dev.patrickgold.florisboard.app.enumDisplayEntriesOf
import dev.patrickgold.florisboard.cacheManager
import dev.patrickgold.florisboard.ime.core.DisplayLanguageNamesIn
import dev.patrickgold.florisboard.ime.keyboard.LayoutType
@ -76,12 +77,11 @@ fun LocalizationScreen() = FlorisScreen {
)
}
content {
ListPreference(
prefs.localization.displayLanguageNamesIn,
title = stringRes(R.string.settings__localization__display_language_names_in__label),
entries = DisplayLanguageNamesIn.listEntries(),
entries = enumDisplayEntriesOf(DisplayLanguageNamesIn::class),
)
Preference(
// icon = R.drawable.ic_edit,

View File

@ -18,6 +18,7 @@ package dev.patrickgold.florisboard.app.settings.media
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.enumDisplayEntriesOf
import dev.patrickgold.florisboard.ime.media.emoji.EmojiSkinTone
import dev.patrickgold.florisboard.lib.compose.FlorisScreen
import dev.patrickgold.florisboard.lib.compose.pluralsRes
@ -37,7 +38,7 @@ fun MediaScreen() = FlorisScreen {
ListPreference(
prefs.media.emojiPreferredSkinTone,
title = stringRes(R.string.prefs__media__emoji_preferred_skin_tone),
entries = EmojiSkinTone.listEntries(),
entries = enumDisplayEntriesOf(EmojiSkinTone::class),
)
DialogSliderPreference(
prefs.media.emojiRecentlyUsedMaxSize,

View File

@ -18,6 +18,7 @@ package dev.patrickgold.florisboard.app.settings.smartbar
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.enumDisplayEntriesOf
import dev.patrickgold.florisboard.ime.smartbar.CandidatesDisplayMode
import dev.patrickgold.florisboard.ime.smartbar.ExtendedActionsPlacement
import dev.patrickgold.florisboard.ime.smartbar.SmartbarLayout
@ -41,7 +42,7 @@ fun SmartbarScreen() = FlorisScreen {
ListPreference(
listPref = prefs.smartbar.layout,
title = stringRes(R.string.pref__smartbar__layout__label),
entries = SmartbarLayout.listEntries(),
entries = enumDisplayEntriesOf(SmartbarLayout::class),
enabledIf = { prefs.smartbar.enabled isEqualTo true },
)
@ -49,7 +50,7 @@ fun SmartbarScreen() = FlorisScreen {
ListPreference(
prefs.suggestion.displayMode,
title = stringRes(R.string.pref__suggestion__display_mode__label),
entries = CandidatesDisplayMode.listEntries(),
entries = enumDisplayEntriesOf(CandidatesDisplayMode::class),
enabledIf = { prefs.smartbar.enabled isEqualTo true },
visibleIf = { prefs.smartbar.layout isNotEqualTo SmartbarLayout.ACTIONS_ONLY },
)
@ -73,7 +74,7 @@ fun SmartbarScreen() = FlorisScreen {
ListPreference(
listPref = prefs.smartbar.extendedActionsPlacement,
title = stringRes(R.string.pref__smartbar__extended_actions_placement__label),
entries = ExtendedActionsPlacement.listEntries(),
entries = enumDisplayEntriesOf(ExtendedActionsPlacement::class),
enabledIf = { prefs.smartbar.enabled isEqualTo true },
visibleIf = { prefs.smartbar.layout isEqualTo SmartbarLayout.SUGGESTIONS_ACTIONS_EXTENDED },
)

View File

@ -16,34 +16,10 @@
package dev.patrickgold.florisboard.app.settings.theme
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
import org.florisboard.lib.kotlin.curlyFormat
/**
* DisplayColorsAs indicates how color strings should be visually presented to the user.
*/
enum class DisplayColorsAs {
HEX8,
RGBA;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = HEX8,
label = stringRes(R.string.enum__display_colors_as__hex8),
description = stringRes(R.string.general__example_given).curlyFormat("example" to "#4caf50ff"),
showDescriptionOnlyIfSelected = true,
)
entry(
key = RGBA,
label = stringRes(R.string.enum__display_colors_as__rgba),
description = stringRes(R.string.general__example_given).curlyFormat("example" to "rgba(76,175,80,1.0)"),
showDescriptionOnlyIfSelected = true,
)
}
}
}

View File

@ -16,11 +16,6 @@
package dev.patrickgold.florisboard.app.settings.theme
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* DisplayPreviewAfterDialogs indicates if the keyboard should auto-open after closing
* any dialog. This is useful because the dialog always hides the keyboard and one may
@ -30,28 +25,4 @@ enum class DisplayKbdAfterDialogs {
ALWAYS,
NEVER,
REMEMBER;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = ALWAYS,
label = stringRes(R.string.enum__display_kbd_after_dialogs__always),
description = stringRes(R.string.enum__display_kbd_after_dialogs__always__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = NEVER,
label = stringRes(R.string.enum__display_kbd_after_dialogs__never),
description = stringRes(R.string.enum__display_kbd_after_dialogs__never__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = REMEMBER,
label = stringRes(R.string.enum__display_kbd_after_dialogs__remember),
description = stringRes(R.string.enum__display_kbd_after_dialogs__remember__description),
showDescriptionOnlyIfSelected = true,
)
}
}
}

View File

@ -70,27 +70,27 @@ import dev.patrickgold.florisboard.lib.compose.rippleClickable
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.ext.ExtensionValidation
import dev.patrickgold.florisboard.lib.rememberValidationResult
import dev.patrickgold.florisboard.lib.snygg.SnyggLevel
import dev.patrickgold.florisboard.lib.snygg.SnyggPropertySetSpec
import dev.patrickgold.florisboard.lib.snygg.value.MaterialYouColor
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCutCornerPercentShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDefinedVarValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggImplicitInheritValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouDarkColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouLightColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggPercentShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRoundedCornerPercentShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSolidColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggValueEncoder
import dev.patrickgold.florisboard.lib.snygg.value.SnyggVarValueEncoders
import org.florisboard.lib.snygg.SnyggLevel
import org.florisboard.lib.snygg.SnyggPropertySetSpec
import org.florisboard.lib.snygg.value.MaterialYouColor
import org.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import org.florisboard.lib.snygg.value.SnyggCutCornerPercentShapeValue
import org.florisboard.lib.snygg.value.SnyggDefinedVarValue
import org.florisboard.lib.snygg.value.SnyggDpShapeValue
import org.florisboard.lib.snygg.value.SnyggDpSizeValue
import org.florisboard.lib.snygg.value.SnyggImplicitInheritValue
import org.florisboard.lib.snygg.value.SnyggMaterialYouDarkColorValue
import org.florisboard.lib.snygg.value.SnyggMaterialYouLightColorValue
import org.florisboard.lib.snygg.value.SnyggMaterialYouValue
import org.florisboard.lib.snygg.value.SnyggPercentShapeValue
import org.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import org.florisboard.lib.snygg.value.SnyggRoundedCornerPercentShapeValue
import org.florisboard.lib.snygg.value.SnyggShapeValue
import org.florisboard.lib.snygg.value.SnyggSolidColorValue
import org.florisboard.lib.snygg.value.SnyggSpSizeValue
import org.florisboard.lib.snygg.value.SnyggValue
import org.florisboard.lib.snygg.value.SnyggValueEncoder
import org.florisboard.lib.snygg.value.SnyggVarValueEncoders
import dev.patrickgold.florisboard.lib.stripUnicodeCtrlChars
import dev.patrickgold.jetpref.material.ui.ExperimentalJetPrefMaterial3Ui
import dev.patrickgold.jetpref.material.ui.JetPrefAlertDialog

View File

@ -94,8 +94,8 @@ import dev.patrickgold.florisboard.lib.compose.FlorisIconButton
import dev.patrickgold.florisboard.lib.compose.FlorisOutlinedTextField
import dev.patrickgold.florisboard.lib.compose.florisHorizontalScroll
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.snygg.SnyggLevel
import dev.patrickgold.florisboard.lib.snygg.SnyggRule
import org.florisboard.lib.snygg.SnyggLevel
import org.florisboard.lib.snygg.SnyggRule
import dev.patrickgold.florisboard.lib.util.InputMethodUtils
import dev.patrickgold.jetpref.material.ui.JetPrefAlertDialog
import org.florisboard.lib.kotlin.curlyFormat

View File

@ -20,9 +20,10 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.runtime.Composable
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.enumDisplayEntriesOf
import dev.patrickgold.florisboard.app.florisPreferenceModel
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.snygg.SnyggLevel
import org.florisboard.lib.snygg.SnyggLevel
import dev.patrickgold.jetpref.datastore.ui.ListPreference
import dev.patrickgold.jetpref.datastore.ui.PreferenceLayout
import dev.patrickgold.jetpref.material.ui.JetPrefAlertDialog
@ -40,17 +41,17 @@ fun FineTuneDialog(onDismiss: () -> Unit) {
ListPreference(
listPref = prefs.theme.editorLevel,
title = stringRes(R.string.settings__theme_editor__fine_tune__level),
entries = SnyggLevel.listEntries(),
entries = enumDisplayEntriesOf(SnyggLevel::class),
)
ListPreference(
listPref = prefs.theme.editorDisplayColorsAs,
title = stringRes(R.string.settings__theme_editor__fine_tune__display_colors_as),
entries = DisplayColorsAs.listEntries(),
entries = enumDisplayEntriesOf(DisplayColorsAs::class),
)
ListPreference(
listPref = prefs.theme.editorDisplayKbdAfterDialogs,
title = stringRes(R.string.settings__theme_editor__fine_tune__display_kbd_after_dialogs),
entries = DisplayKbdAfterDialogs.listEntries(),
entries = enumDisplayEntriesOf(DisplayKbdAfterDialogs::class),
)
}
}

View File

@ -39,15 +39,15 @@ import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDefinedVarValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSolidColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggValue
import org.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import org.florisboard.lib.snygg.value.SnyggDefinedVarValue
import org.florisboard.lib.snygg.value.SnyggDpSizeValue
import org.florisboard.lib.snygg.value.SnyggMaterialYouValue
import org.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import org.florisboard.lib.snygg.value.SnyggShapeValue
import org.florisboard.lib.snygg.value.SnyggSolidColorValue
import org.florisboard.lib.snygg.value.SnyggSpSizeValue
import org.florisboard.lib.snygg.value.SnyggValue
import dev.patrickgold.jetpref.material.ui.checkeredBackground
object SnyggValueIcon {

View File

@ -89,15 +89,6 @@ import dev.patrickgold.florisboard.lib.compose.rippleClickable
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.ext.ExtensionValidation
import dev.patrickgold.florisboard.lib.rememberValidationResult
import dev.patrickgold.florisboard.lib.snygg.SnyggLevel
import dev.patrickgold.florisboard.lib.snygg.SnyggPropertySetEditor
import dev.patrickgold.florisboard.lib.snygg.SnyggPropertySetSpec
import dev.patrickgold.florisboard.lib.snygg.SnyggRule
import dev.patrickgold.florisboard.lib.snygg.SnyggStylesheet
import dev.patrickgold.florisboard.lib.snygg.SnyggStylesheetEditor
import dev.patrickgold.florisboard.lib.snygg.SnyggStylesheetJsonConfig
import dev.patrickgold.florisboard.lib.snygg.definedVariablesRule
import dev.patrickgold.florisboard.lib.snygg.isDefinedVariablesRule
import dev.patrickgold.florisboard.themeManager
import dev.patrickgold.jetpref.datastore.model.observeAsState
import dev.patrickgold.jetpref.material.ui.JetPrefAlertDialog
@ -107,6 +98,15 @@ import kotlinx.coroutines.launch
import org.florisboard.lib.android.showLongToast
import org.florisboard.lib.kotlin.io.readJson
import org.florisboard.lib.kotlin.io.subFile
import org.florisboard.lib.snygg.SnyggLevel
import org.florisboard.lib.snygg.SnyggPropertySetEditor
import org.florisboard.lib.snygg.SnyggPropertySetSpec
import org.florisboard.lib.snygg.SnyggRule
import org.florisboard.lib.snygg.SnyggStylesheet
import org.florisboard.lib.snygg.SnyggStylesheetEditor
import org.florisboard.lib.snygg.SnyggStylesheetJsonConfig
import org.florisboard.lib.snygg.definedVariablesRule
import org.florisboard.lib.snygg.isDefinedVariablesRule
internal val IntListSaver = Saver<SnapshotStateList<Int>, ArrayList<Int>>(
save = { ArrayList(it) },

View File

@ -30,6 +30,7 @@ import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.LocalNavController
import dev.patrickgold.florisboard.app.Routes
import dev.patrickgold.florisboard.app.enumDisplayEntriesOf
import dev.patrickgold.florisboard.app.ext.AddonManagementReferenceBox
import dev.patrickgold.florisboard.app.ext.ExtensionListScreenType
import dev.patrickgold.florisboard.ime.theme.ThemeManager
@ -79,7 +80,7 @@ fun ThemeScreen() = FlorisScreen {
prefs.theme.mode,
icon = Icons.Default.BrightnessAuto,
title = stringRes(R.string.pref__theme__mode__label),
entries = ThemeMode.listEntries(),
entries = enumDisplayEntriesOf(ThemeMode::class),
)
if (themeMode == ThemeMode.FOLLOW_TIME) {
FlorisInfoCard(

View File

@ -23,27 +23,27 @@ import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import dev.patrickgold.florisboard.lib.UnicodeCtrlChar
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.snygg.Snygg
import dev.patrickgold.florisboard.lib.snygg.SnyggLevel
import dev.patrickgold.florisboard.lib.snygg.SnyggRule
import dev.patrickgold.florisboard.lib.snygg.value.RgbaColor
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCircleShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCutCornerPercentShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDefinedVarValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggExplicitInheritValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggImplicitInheritValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouDarkColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouLightColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggPercentageSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRectangleShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRoundedCornerPercentShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSolidColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggValueEncoder
import org.florisboard.lib.snygg.Snygg
import org.florisboard.lib.snygg.SnyggLevel
import org.florisboard.lib.snygg.SnyggRule
import org.florisboard.lib.snygg.value.RgbaColor
import org.florisboard.lib.snygg.value.SnyggCircleShapeValue
import org.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import org.florisboard.lib.snygg.value.SnyggCutCornerPercentShapeValue
import org.florisboard.lib.snygg.value.SnyggDefinedVarValue
import org.florisboard.lib.snygg.value.SnyggDpSizeValue
import org.florisboard.lib.snygg.value.SnyggExplicitInheritValue
import org.florisboard.lib.snygg.value.SnyggImplicitInheritValue
import org.florisboard.lib.snygg.value.SnyggMaterialYouDarkColorValue
import org.florisboard.lib.snygg.value.SnyggMaterialYouLightColorValue
import org.florisboard.lib.snygg.value.SnyggPercentageSizeValue
import org.florisboard.lib.snygg.value.SnyggRectangleShapeValue
import org.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import org.florisboard.lib.snygg.value.SnyggRoundedCornerPercentShapeValue
import org.florisboard.lib.snygg.value.SnyggSolidColorValue
import org.florisboard.lib.snygg.value.SnyggSpSizeValue
import org.florisboard.lib.snygg.value.SnyggValue
import org.florisboard.lib.snygg.value.SnyggValueEncoder
import kotlin.math.roundToInt
@Composable

View File

@ -34,6 +34,7 @@ import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.LocalNavController
import dev.patrickgold.florisboard.app.Routes
import dev.patrickgold.florisboard.app.enumDisplayEntriesOf
import dev.patrickgold.florisboard.ime.nlp.SpellingLanguageMode
import org.florisboard.lib.android.AndroidVersion
import dev.patrickgold.florisboard.lib.compose.FlorisErrorCard
@ -151,7 +152,7 @@ fun TypingScreen() = FlorisScreen {
prefs.spelling.languageMode,
icon = Icons.Default.Language,
title = stringRes(R.string.pref__spelling__language_mode__label),
entries = SpellingLanguageMode.listEntries(),
entries = enumDisplayEntriesOf(SpellingLanguageMode::class),
enabledIf = { florisSpellCheckerEnabled.value },
)
SwitchPreference(

View File

@ -105,14 +105,14 @@ import dev.patrickgold.florisboard.lib.compose.rippleClickable
import dev.patrickgold.florisboard.lib.compose.safeTimes
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.observeAsNonNullState
import dev.patrickgold.florisboard.lib.snygg.SnyggPropertySet
import dev.patrickgold.florisboard.lib.snygg.ui.SnyggSurface
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBorder
import dev.patrickgold.florisboard.lib.snygg.ui.snyggClip
import dev.patrickgold.florisboard.lib.snygg.ui.snyggShadow
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import dev.patrickgold.florisboard.lib.snygg.ui.spSize
import org.florisboard.lib.snygg.SnyggPropertySet
import org.florisboard.lib.snygg.ui.SnyggSurface
import org.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.snyggBorder
import org.florisboard.lib.snygg.ui.snyggClip
import org.florisboard.lib.snygg.ui.snyggShadow
import org.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.spSize
import dev.patrickgold.florisboard.lib.util.NetworkUtils
import dev.patrickgold.jetpref.datastore.model.observeAsState

View File

@ -16,11 +16,6 @@
package dev.patrickgold.florisboard.ime.core
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* DisplayLocalesIn indicates how language names should be visually presented to the user.
*/
@ -29,22 +24,4 @@ enum class DisplayLanguageNamesIn {
SYSTEM_LOCALE,
/** Language names are displayed in the locale referred by itself. */
NATIVE_LOCALE;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = SYSTEM_LOCALE,
label = stringRes(R.string.enum__display_language_names_in__system_locale),
description = stringRes(R.string.enum__display_language_names_in__system_locale__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = NATIVE_LOCALE,
label = stringRes(R.string.enum__display_language_names_in__native_locale),
description = stringRes(R.string.enum__display_language_names_in__native_locale__description),
showDescriptionOnlyIfSelected = true,
)
}
}
}

View File

@ -1,25 +1,6 @@
package dev.patrickgold.florisboard.ime.input
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
enum class CapitalizationBehavior {
CAPSLOCK_BY_DOUBLE_TAP,
CAPSLOCK_BY_CYCLE;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = CAPSLOCK_BY_DOUBLE_TAP,
label = stringRes(R.string.enum__capitalization_behavior__capslock_by_double_tap),
)
entry(
key = CAPSLOCK_BY_CYCLE,
label = stringRes(R.string.enum__capitalization_behavior__capslock_by_cycle),
)
}
}
}

View File

@ -16,30 +16,7 @@
package dev.patrickgold.florisboard.ime.input
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
enum class HapticVibrationMode {
USE_VIBRATOR_DIRECTLY,
USE_HAPTIC_FEEDBACK_INTERFACE;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = USE_VIBRATOR_DIRECTLY,
label = stringRes(R.string.enum__haptic_vibration_mode__use_vibrator_directly),
description = stringRes(R.string.enum__haptic_vibration_mode__use_vibrator_directly__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = USE_HAPTIC_FEEDBACK_INTERFACE,
label = stringRes(R.string.enum__haptic_vibration_mode__use_haptic_feedback_interface),
description = stringRes(R.string.enum__haptic_vibration_mode__use_haptic_feedback_interface__description),
showDescriptionOnlyIfSelected = true,
)
}
}
}

View File

@ -16,38 +16,7 @@
package dev.patrickgold.florisboard.ime.input
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
enum class InputFeedbackActivationMode {
RESPECT_SYSTEM_SETTINGS,
IGNORE_SYSTEM_SETTINGS;
companion object {
@Composable
fun audioListEntries() = listPrefEntries {
entry(
key = RESPECT_SYSTEM_SETTINGS,
label = stringRes(R.string.enum__input_feedback_activation_mode__audio_respect_system_settings),
)
entry(
key = IGNORE_SYSTEM_SETTINGS,
label = stringRes(R.string.enum__input_feedback_activation_mode__audio_ignore_system_settings),
)
}
@Composable
fun hapticListEntries() = listPrefEntries {
entry(
key = RESPECT_SYSTEM_SETTINGS,
label = stringRes(R.string.enum__input_feedback_activation_mode__haptic_respect_system_settings),
)
entry(
key = IGNORE_SYSTEM_SETTINGS,
label = stringRes(R.string.enum__input_feedback_activation_mode__haptic_ignore_system_settings),
)
}
}
}

View File

@ -16,37 +16,8 @@
package dev.patrickgold.florisboard.ime.keyboard
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
enum class IncognitoMode {
FORCE_OFF,
FORCE_ON,
DYNAMIC_ON_OFF;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = FORCE_OFF,
label = stringRes(R.string.enum__incognito_mode__force_off),
description = stringRes(R.string.enum__incognito_mode__force_off__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = DYNAMIC_ON_OFF,
label = stringRes(R.string.enum__incognito_mode__dynamic_on_off),
description = stringRes(R.string.enum__incognito_mode__dynamic_on_off__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = FORCE_ON,
label = stringRes(R.string.enum__incognito_mode__force_on),
description = stringRes(R.string.enum__incognito_mode__force_on__description),
showDescriptionOnlyIfSelected = true,
)
}
}
}

View File

@ -1,30 +1,7 @@
package dev.patrickgold.florisboard.ime.keyboard
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
enum class SpaceBarMode {
NOTHING,
CURRENT_LANGUAGE,
SPACE_BAR_KEY;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = NOTHING,
label = stringRes(R.string.enum__space_bar_mode__nothing),
)
entry(
key = CURRENT_LANGUAGE,
label = stringRes(R.string.enum__space_bar_mode__current_language),
)
entry(
key = SPACE_BAR_KEY,
label = stringRes(R.string.enum__space_bar_mode__space_bar_key),
)
}
}
}

View File

@ -16,31 +16,8 @@
package dev.patrickgold.florisboard.ime.landscapeinput
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
enum class LandscapeInputUiMode {
NEVER_SHOW,
ALWAYS_SHOW,
DYNAMICALLY_SHOW;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = NEVER_SHOW,
label = stringRes(R.string.enum__landscape_input_ui_mode__never_show),
)
entry(
key = ALWAYS_SHOW,
label = stringRes(R.string.enum__landscape_input_ui_mode__always_show),
)
entry(
key = DYNAMICALLY_SHOW,
label = stringRes(R.string.enum__landscape_input_ui_mode__dynamically_show),
)
}
}
}

View File

@ -57,7 +57,7 @@ import dev.patrickgold.florisboard.ime.text.keyboard.TextKeyData
import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import dev.patrickgold.florisboard.keyboardManager
import dev.patrickgold.florisboard.lib.snygg.ui.SnyggSurface
import org.florisboard.lib.snygg.ui.SnyggSurface
@SuppressLint("MutableCollectionMutableState")
@Composable

View File

@ -16,16 +16,12 @@
package dev.patrickgold.florisboard.ime.media.emoji
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.keyboard.AbstractKeyData
import dev.patrickgold.florisboard.ime.keyboard.ComputingEvaluator
import dev.patrickgold.florisboard.ime.keyboard.KeyData
import dev.patrickgold.florisboard.ime.popup.PopupSet
import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.ime.text.key.KeyType
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
import java.util.stream.IntStream
import kotlin.streams.toList
@ -36,54 +32,6 @@ enum class EmojiSkinTone(val id: Int) {
MEDIUM_SKIN_TONE(0x1F3FD),
MEDIUM_DARK_SKIN_TONE(0x1F3FE),
DARK_SKIN_TONE(0x1F3FF);
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = DEFAULT,
label = stringRes(
R.string.enum__emoji_skin_tone__default,
"emoji" to "\uD83D\uDC4B" // 👋
),
)
entry(
key = LIGHT_SKIN_TONE,
label = stringRes(
R.string.enum__emoji_skin_tone__light_skin_tone,
"emoji" to "\uD83D\uDC4B\uD83C\uDFFB" // 👋🏻
),
)
entry(
key = MEDIUM_LIGHT_SKIN_TONE,
label = stringRes(
R.string.enum__emoji_skin_tone__medium_light_skin_tone,
"emoji" to "\uD83D\uDC4B\uD83C\uDFFC" // 👋🏼
),
)
entry(
key = MEDIUM_SKIN_TONE,
label = stringRes(
R.string.enum__emoji_skin_tone__medium_skin_tone,
"emoji" to "\uD83D\uDC4B\uD83C\uDFFD" // 👋🏽
),
)
entry(
key = MEDIUM_DARK_SKIN_TONE,
label = stringRes(
R.string.enum__emoji_skin_tone__medium_dark_skin_tone,
"emoji" to "\uD83D\uDC4B\uD83C\uDFFE" // 👋🏾
),
)
entry(
key = DARK_SKIN_TONE,
label = stringRes(
R.string.enum__emoji_skin_tone__dark_skin_tone,
"emoji" to "\uD83D\uDC4B\uD83C\uDFFF" // 👋🏿
),
)
}
}
}
enum class EmojiHairStyle(val id: Int) {

View File

@ -92,11 +92,11 @@ import org.florisboard.lib.android.systemService
import dev.patrickgold.florisboard.lib.compose.florisScrollbar
import dev.patrickgold.florisboard.lib.compose.safeTimes
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBorder
import dev.patrickgold.florisboard.lib.snygg.ui.snyggShadow
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import dev.patrickgold.florisboard.lib.snygg.ui.spSize
import org.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.snyggBorder
import org.florisboard.lib.snygg.ui.snyggShadow
import org.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.spSize
import dev.patrickgold.jetpref.datastore.model.observeAsState
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

View File

@ -16,29 +16,10 @@
package dev.patrickgold.florisboard.ime.nlp
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* Enum for the spelling language modes.
*/
enum class SpellingLanguageMode {
USE_SYSTEM_LANGUAGES,
USE_KEYBOARD_SUBTYPES;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = USE_SYSTEM_LANGUAGES,
label = stringRes(R.string.enum__spelling_language_mode__use_system_languages),
)
entry(
key = USE_KEYBOARD_SUBTYPES,
label = stringRes(R.string.enum__spelling_language_mode__use_keyboard_subtypes),
)
}
}
}

View File

@ -16,11 +16,6 @@
package dev.patrickgold.florisboard.ime.onehanded
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* Static object which contains all possible one-handed mode strings.
*/
@ -28,22 +23,4 @@ enum class OneHandedMode {
OFF,
START,
END;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = OFF,
label = stringRes(R.string.enum__one_handed_mode__off),
)
entry(
key = START,
label = stringRes(R.string.enum__one_handed_mode__start),
)
entry(
key = END,
label = stringRes(R.string.enum__one_handed_mode__end),
)
}
}
}

View File

@ -39,8 +39,8 @@ import dev.patrickgold.florisboard.ime.keyboard.FlorisImeSizing
import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.solidColor
@Composable
fun RowScope.OneHandedPanel(

View File

@ -43,12 +43,12 @@ import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import dev.patrickgold.florisboard.lib.compose.safeTimes
import dev.patrickgold.florisboard.lib.snygg.ui.SnyggSurface
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBorder
import dev.patrickgold.florisboard.lib.snygg.ui.snyggShadow
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import dev.patrickgold.florisboard.lib.snygg.ui.spSize
import org.florisboard.lib.snygg.ui.SnyggSurface
import org.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.snyggBorder
import org.florisboard.lib.snygg.ui.snyggShadow
import org.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.spSize
@Composable
fun PopupBaseBox(

View File

@ -16,11 +16,6 @@
package dev.patrickgold.florisboard.ime.smartbar
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* Enum class defining the display mode for the candidates.
*/
@ -28,22 +23,4 @@ enum class CandidatesDisplayMode {
CLASSIC,
DYNAMIC,
DYNAMIC_SCROLLABLE;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = CLASSIC,
label = stringRes(R.string.enum__candidates_display_mode__classic),
)
entry(
key = DYNAMIC,
label = stringRes(R.string.enum__candidates_display_mode__dynamic),
)
entry(
key = DYNAMIC_SCROLLABLE,
label = stringRes(R.string.enum__candidates_display_mode__dynamic_scrollable),
)
}
}
}

View File

@ -60,9 +60,9 @@ import org.florisboard.lib.android.AndroidVersion
import dev.patrickgold.florisboard.lib.compose.florisHorizontalScroll
import dev.patrickgold.florisboard.lib.compose.safeTimes
import dev.patrickgold.florisboard.lib.observeAsNonNullState
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import dev.patrickgold.florisboard.lib.snygg.ui.spSize
import org.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.spSize
import dev.patrickgold.florisboard.nlpManager
import dev.patrickgold.florisboard.subtypeManager
import dev.patrickgold.jetpref.datastore.model.observeAsState

View File

@ -16,11 +16,6 @@
package dev.patrickgold.florisboard.ime.smartbar
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* Enum class defining the possible placements for the Smartbar extended actions.
*/
@ -28,28 +23,4 @@ enum class ExtendedActionsPlacement {
ABOVE_CANDIDATES,
BELOW_CANDIDATES,
OVERLAY_APP_UI;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = ABOVE_CANDIDATES,
label = stringRes(R.string.enum__extended_actions_placement__above_candidates),
description = stringRes(R.string.enum__extended_actions_placement__above_candidates__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = BELOW_CANDIDATES,
label = stringRes(R.string.enum__extended_actions_placement__below_candidates),
description = stringRes(R.string.enum__extended_actions_placement__below_candidates__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = OVERLAY_APP_UI,
label = stringRes(R.string.enum__extended_actions_placement__overlay_app_ui),
description = stringRes(R.string.enum__extended_actions_placement__overlay_app_ui__description),
showDescriptionOnlyIfSelected = true,
)
}
}
}

View File

@ -1,25 +1,6 @@
package dev.patrickgold.florisboard.ime.smartbar
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
enum class IncognitoDisplayMode {
REPLACE_SHARED_ACTIONS_TOGGLE,
DISPLAY_BEHIND_KEYBOARD;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = REPLACE_SHARED_ACTIONS_TOGGLE,
label = stringRes(id = R.string.enum__incognito_display_mode__replace_shared_actions_toggle),
)
entry(
key = DISPLAY_BEHIND_KEYBOARD,
label = stringRes(id = R.string.enum__incognito_display_mode__display_behind_keyboard),
)
}
}
}

View File

@ -65,10 +65,10 @@ import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import dev.patrickgold.florisboard.keyboardManager
import dev.patrickgold.florisboard.lib.compose.horizontalTween
import dev.patrickgold.florisboard.lib.compose.verticalTween
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBorder
import dev.patrickgold.florisboard.lib.snygg.ui.snyggShadow
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.snyggBorder
import org.florisboard.lib.snygg.ui.snyggShadow
import org.florisboard.lib.snygg.ui.solidColor
import dev.patrickgold.jetpref.datastore.model.observeAsState
import dev.patrickgold.jetpref.datastore.ui.vectorResource

View File

@ -16,40 +16,9 @@
package dev.patrickgold.florisboard.ime.smartbar
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
enum class SmartbarLayout {
SUGGESTIONS_ONLY,
ACTIONS_ONLY,
SUGGESTIONS_ACTIONS_SHARED,
SUGGESTIONS_ACTIONS_EXTENDED;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = SUGGESTIONS_ONLY,
label = stringRes(R.string.enum__smartbar_layout__suggestions_only),
description = stringRes(R.string.enum__smartbar_layout__suggestions_only__description),
)
entry(
key = ACTIONS_ONLY,
label = stringRes(R.string.enum__smartbar_layout__actions_only),
description = stringRes(R.string.enum__smartbar_layout__actions_only__description),
)
entry(
key = SUGGESTIONS_ACTIONS_SHARED,
label = stringRes(R.string.enum__smartbar_layout__suggestions_action_shared),
description = stringRes(R.string.enum__smartbar_layout__suggestions_action_shared__description),
)
entry(
key = SUGGESTIONS_ACTIONS_EXTENDED,
label = stringRes(R.string.enum__smartbar_layout__suggestions_actions_extended),
description = stringRes(R.string.enum__smartbar_layout__suggestions_actions_extended__description),
)
}
}
}

View File

@ -62,11 +62,11 @@ import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.ime.text.keyboard.TextKeyData
import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import dev.patrickgold.florisboard.lib.snygg.ui.shape
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBorder
import dev.patrickgold.florisboard.lib.snygg.ui.snyggClip
import dev.patrickgold.florisboard.lib.snygg.ui.snyggShadow
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.shape
import org.florisboard.lib.snygg.ui.snyggBorder
import org.florisboard.lib.snygg.ui.snyggClip
import org.florisboard.lib.snygg.ui.snyggShadow
import org.florisboard.lib.snygg.ui.solidColor
private val BackgroundAnimationSpec = tween<Color>(durationMillis = 150, easing = FastOutSlowInEasing)
private val DebugHelperColor = Color.Red.copy(alpha = 0.5f)

View File

@ -66,11 +66,11 @@ import dev.patrickgold.florisboard.keyboardManager
import dev.patrickgold.florisboard.lib.compose.FlorisIconButton
import dev.patrickgold.florisboard.lib.compose.safeTimes
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.snygg.SnyggPropertySet
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.florisboard.lib.snygg.ui.snyggClip
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import dev.patrickgold.florisboard.lib.snygg.ui.spSize
import org.florisboard.lib.snygg.SnyggPropertySet
import org.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.snyggClip
import org.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.spSize
import dev.patrickgold.florisboard.lib.toIntOffset
private const val ItemNotFound = -1

View File

@ -39,8 +39,8 @@ import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import dev.patrickgold.florisboard.keyboardManager
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.snygg.ui.SnyggButton
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.SnyggButton
import org.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.jetpref.datastore.model.observeAsState
@Composable

View File

@ -34,7 +34,7 @@ import dev.patrickgold.florisboard.ime.smartbar.SmartbarLayout
import dev.patrickgold.florisboard.ime.text.keyboard.TextKeyData
import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.keyboardManager
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.jetpref.datastore.model.observeAsState
internal val ToggleOverflowPanelAction = QuickAction.InsertKey(TextKeyData.TOGGLE_ACTIONS_OVERFLOW)

View File

@ -42,7 +42,7 @@ import dev.patrickgold.florisboard.ime.text.keyboard.TextKeyboardLayout
import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import dev.patrickgold.florisboard.keyboardManager
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.solidColor
import dev.patrickgold.jetpref.datastore.model.observeAsState
@Composable

View File

@ -16,11 +16,6 @@
package dev.patrickgold.florisboard.ime.text.gestures
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* Enum for declaring the possible actions for swipe gestures.
*/
@ -53,142 +48,4 @@ enum class SwipeAction {
SWITCH_TO_PREV_KEYBOARD,
TOGGLE_SMARTBAR_VISIBILITY,
UNDO;
companion object {
@Composable
fun generalListEntries() = listPrefEntries {
entry(
key = NO_ACTION,
label = stringRes(R.string.enum__swipe_action__no_action),
)
entry(
key = CYCLE_TO_PREVIOUS_KEYBOARD_MODE,
label = stringRes(R.string.enum__swipe_action__cycle_to_previous_keyboard_mode),
)
entry(
key = CYCLE_TO_NEXT_KEYBOARD_MODE,
label = stringRes(R.string.enum__swipe_action__cycle_to_next_keyboard_mode),
)
entry(
key = DELETE_WORD,
label = stringRes(R.string.enum__swipe_action__delete_word),
)
entry(
key = HIDE_KEYBOARD,
label = stringRes(R.string.enum__swipe_action__hide_keyboard),
)
entry(
key = INSERT_SPACE,
label = stringRes(R.string.enum__swipe_action__insert_space),
)
entry(
key = MOVE_CURSOR_UP,
label = stringRes(R.string.enum__swipe_action__move_cursor_up),
)
entry(
key = MOVE_CURSOR_DOWN,
label = stringRes(R.string.enum__swipe_action__move_cursor_down),
)
entry(
key = MOVE_CURSOR_LEFT,
label = stringRes(R.string.enum__swipe_action__move_cursor_left),
)
entry(
key = MOVE_CURSOR_RIGHT,
label = stringRes(R.string.enum__swipe_action__move_cursor_right),
)
entry(
key = MOVE_CURSOR_START_OF_LINE,
label = stringRes(R.string.enum__swipe_action__move_cursor_start_of_line),
)
entry(
key = MOVE_CURSOR_END_OF_LINE,
label = stringRes(R.string.enum__swipe_action__move_cursor_end_of_line),
)
entry(
key = MOVE_CURSOR_START_OF_PAGE,
label = stringRes(R.string.enum__swipe_action__move_cursor_start_of_page),
)
entry(
key = MOVE_CURSOR_END_OF_PAGE,
label = stringRes(R.string.enum__swipe_action__move_cursor_end_of_page),
)
entry(
key = SHIFT,
label = stringRes(R.string.enum__swipe_action__shift),
)
entry(
key = REDO,
label = stringRes(R.string.enum__swipe_action__redo),
)
entry(
key = UNDO,
label = stringRes(R.string.enum__swipe_action__undo),
)
entry(
key = SWITCH_TO_CLIPBOARD_CONTEXT,
label = stringRes(R.string.enum__swipe_action__switch_to_clipboard_context),
)
entry(
key = SHOW_INPUT_METHOD_PICKER,
label = stringRes(R.string.enum__swipe_action__show_input_method_picker),
)
entry(
key = SWITCH_TO_PREV_SUBTYPE,
label = stringRes(R.string.enum__swipe_action__switch_to_prev_subtype),
)
entry(
key = SWITCH_TO_NEXT_SUBTYPE,
label = stringRes(R.string.enum__swipe_action__switch_to_next_subtype),
)
entry(
key = SWITCH_TO_PREV_KEYBOARD,
label = stringRes(R.string.enum__swipe_action__switch_to_prev_keyboard),
)
entry(
key = TOGGLE_SMARTBAR_VISIBILITY,
label = stringRes(R.string.enum__swipe_action__toggle_smartbar_visibility),
)
}
@Composable
fun deleteSwipeListEntries() = listPrefEntries {
entry(
key = NO_ACTION,
label = stringRes(R.string.enum__swipe_action__no_action),
)
entry(
key = DELETE_CHARACTERS_PRECISELY,
label = stringRes(R.string.enum__swipe_action__delete_characters_precisely),
)
entry(
key = DELETE_WORD,
label = stringRes(R.string.enum__swipe_action__delete_word),
)
entry(
key = DELETE_WORDS_PRECISELY,
label = stringRes(R.string.enum__swipe_action__delete_words_precisely),
)
entry(
key = SELECT_CHARACTERS_PRECISELY,
label = stringRes(R.string.enum__swipe_action__select_characters_precisely),
)
entry(
key = SELECT_WORDS_PRECISELY,
label = stringRes(R.string.enum__swipe_action__select_words_precisely),
)
}
@Composable
fun deleteLongPressListEntries() = listPrefEntries {
entry(
key = DELETE_CHARACTER,
label = stringRes(R.string.enum__swipe_action__delete_character),
)
entry(
key = DELETE_WORD,
label = stringRes(R.string.enum__swipe_action__delete_word),
)
}
}
}

View File

@ -16,11 +16,6 @@
package dev.patrickgold.florisboard.ime.text.key
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* Enum for the key hint modes.
*/
@ -29,28 +24,4 @@ enum class KeyHintMode {
HINT_PRIORITY,
ACCENT_PRIORITY,
SMART_PRIORITY;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = ACCENT_PRIORITY,
label = stringRes(R.string.enum__key_hint_mode__accent_priority),
description = stringRes(R.string.enum__key_hint_mode__accent_priority__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = HINT_PRIORITY,
label = stringRes(R.string.enum__key_hint_mode__hint_priority),
description = stringRes(R.string.enum__key_hint_mode__hint_priority__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = SMART_PRIORITY,
label = stringRes(R.string.enum__key_hint_mode__smart_priority),
description = stringRes(R.string.enum__key_hint_mode__smart_priority__description),
showDescriptionOnlyIfSelected = true,
)
}
}
}

View File

@ -16,11 +16,6 @@
package dev.patrickgold.florisboard.ime.text.key
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* Enum for declaring the utility key actions.
*/
@ -30,26 +25,4 @@ enum class UtilityKeyAction {
SWITCH_KEYBOARD_APP,
DYNAMIC_SWITCH_LANGUAGE_EMOJIS,
DISABLED;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = SWITCH_TO_EMOJIS,
label = stringRes(R.string.enum__utility_key_action__switch_to_emojis),
)
entry(
key = SWITCH_LANGUAGE,
label = stringRes(R.string.enum__utility_key_action__switch_language),
)
entry(
key = SWITCH_KEYBOARD_APP,
label = stringRes(R.string.enum__utility_key_action__switch_keyboard_app),
)
entry(
key = DYNAMIC_SWITCH_LANGUAGE_EMOJIS,
label = stringRes(R.string.enum__utility_key_action__dynamic_switch_language_emojis),
)
}
}
}

View File

@ -91,10 +91,10 @@ import dev.patrickgold.florisboard.lib.compose.safeTimes
import dev.patrickgold.florisboard.lib.devtools.LogTopic
import dev.patrickgold.florisboard.lib.devtools.flogDebug
import dev.patrickgold.florisboard.lib.observeAsTransformingState
import dev.patrickgold.florisboard.lib.snygg.ui.SnyggSurface
import dev.patrickgold.florisboard.lib.snygg.ui.snyggBackground
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import dev.patrickgold.florisboard.lib.snygg.ui.spSize
import org.florisboard.lib.snygg.ui.SnyggSurface
import org.florisboard.lib.snygg.ui.snyggBackground
import org.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.spSize
import dev.patrickgold.florisboard.lib.toIntOffset
import dev.patrickgold.jetpref.datastore.model.observeAsState
import kotlinx.coroutines.channels.Channel

View File

@ -29,9 +29,14 @@ import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.TextStyle
import dev.patrickgold.florisboard.ime.input.InputShiftState
import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.lib.observeAsNonNullState
import dev.patrickgold.florisboard.lib.snygg.SnyggStylesheet
import org.florisboard.lib.snygg.SnyggStylesheet
import dev.patrickgold.florisboard.themeManager
import org.florisboard.lib.snygg.Snygg
import org.florisboard.lib.snygg.ui.ProvideSnyggUiDefaults
import org.florisboard.lib.snygg.ui.SnyggUiDefaults
private val LocalConfig = staticCompositionLocalOf<ThemeExtensionComponent> { error("not init") }
private val LocalStyle = staticCompositionLocalOf<SnyggStylesheet> { error("not init") }
@ -59,6 +64,44 @@ object FlorisImeTheme {
fun fallbackContentColor(): Color {
return if (config.isNightTheme) Color.White else Color.Black
}
fun init() {
Snygg.init(
stylesheetSpec = FlorisImeUiSpec,
rulePreferredElementSorting = listOf(
FlorisImeUi.Keyboard,
FlorisImeUi.Key,
FlorisImeUi.KeyHint,
FlorisImeUi.KeyPopup,
FlorisImeUi.Smartbar,
FlorisImeUi.SmartbarSharedActionsRow,
FlorisImeUi.SmartbarSharedActionsToggle,
FlorisImeUi.SmartbarExtendedActionsRow,
FlorisImeUi.SmartbarExtendedActionsToggle,
FlorisImeUi.SmartbarActionKey,
FlorisImeUi.SmartbarActionTile,
FlorisImeUi.SmartbarActionsOverflow,
FlorisImeUi.SmartbarActionsOverflowCustomizeButton,
FlorisImeUi.SmartbarActionsEditor,
FlorisImeUi.SmartbarActionsEditorHeader,
FlorisImeUi.SmartbarActionsEditorSubheader,
FlorisImeUi.SmartbarCandidatesRow,
FlorisImeUi.SmartbarCandidateWord,
FlorisImeUi.SmartbarCandidateClip,
FlorisImeUi.SmartbarCandidateSpacer,
),
rulePlaceholders = mapOf(
"c:delete" to KeyCode.DELETE,
"c:enter" to KeyCode.ENTER,
"c:shift" to KeyCode.SHIFT,
"c:space" to KeyCode.SPACE,
"sh:unshifted" to InputShiftState.UNSHIFTED.value,
"sh:shifted_manual" to InputShiftState.SHIFTED_MANUAL.value,
"sh:shifted_automatic" to InputShiftState.SHIFTED_AUTOMATIC.value,
"sh:caps_lock" to InputShiftState.CAPS_LOCK.value,
),
)
}
}
@Composable
@ -80,7 +123,12 @@ fun FlorisImeTheme(content: @Composable () -> Unit) {
LocalStyle provides activeStyle,
LocalTextStyle provides TextStyle.Default,
) {
content()
val fallbackContentColor = FlorisImeTheme.fallbackContentColor()
val fallbackSurfaceColor = FlorisImeTheme.fallbackSurfaceColor()
val snyggUiDefaults = remember(fallbackContentColor, fallbackSurfaceColor) {
SnyggUiDefaults(fallbackContentColor, fallbackSurfaceColor)
}
ProvideSnyggUiDefaults(snyggUiDefaults, content)
}
}
}

View File

@ -20,7 +20,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import dev.patrickgold.florisboard.ime.input.InputShiftState
import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.lib.snygg.SnyggStylesheet
import org.florisboard.lib.snygg.SnyggStylesheet
val FlorisImeThemeBaseStyle = SnyggStylesheet {
defines {

View File

@ -16,21 +16,21 @@
package dev.patrickgold.florisboard.ime.theme
import dev.patrickgold.florisboard.lib.snygg.Snygg
import dev.patrickgold.florisboard.lib.snygg.SnyggLevel
import dev.patrickgold.florisboard.lib.snygg.SnyggPropertySetSpecBuilder
import dev.patrickgold.florisboard.lib.snygg.SnyggSpec
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCircleShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCutCornerPercentShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouDarkColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouLightColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRectangleShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRoundedCornerPercentShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSolidColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSpSizeValue
import org.florisboard.lib.snygg.Snygg
import org.florisboard.lib.snygg.SnyggLevel
import org.florisboard.lib.snygg.SnyggPropertySetSpecBuilder
import org.florisboard.lib.snygg.SnyggSpec
import org.florisboard.lib.snygg.value.SnyggCircleShapeValue
import org.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import org.florisboard.lib.snygg.value.SnyggCutCornerPercentShapeValue
import org.florisboard.lib.snygg.value.SnyggDpSizeValue
import org.florisboard.lib.snygg.value.SnyggMaterialYouDarkColorValue
import org.florisboard.lib.snygg.value.SnyggMaterialYouLightColorValue
import org.florisboard.lib.snygg.value.SnyggRectangleShapeValue
import org.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import org.florisboard.lib.snygg.value.SnyggRoundedCornerPercentShapeValue
import org.florisboard.lib.snygg.value.SnyggSolidColorValue
import org.florisboard.lib.snygg.value.SnyggSpSizeValue
fun SnyggPropertySetSpecBuilder.background() {
property(

View File

@ -18,7 +18,7 @@ package dev.patrickgold.florisboard.ime.theme
import dev.patrickgold.florisboard.lib.ext.ExtensionComponent
import dev.patrickgold.florisboard.lib.ext.ExtensionComponentName
import dev.patrickgold.florisboard.lib.snygg.SnyggStylesheetEditor
import org.florisboard.lib.snygg.SnyggStylesheetEditor
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@ -47,11 +47,6 @@ import dev.patrickgold.florisboard.appContext
import dev.patrickgold.florisboard.extensionManager
import dev.patrickgold.florisboard.lib.ext.ExtensionComponentName
import dev.patrickgold.florisboard.lib.io.ZipUtils
import dev.patrickgold.florisboard.lib.snygg.SnyggStylesheet
import dev.patrickgold.florisboard.lib.snygg.SnyggStylesheetJsonConfig
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import dev.patrickgold.florisboard.lib.snygg.value.MaterialYouColor
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSolidColorValue
import dev.patrickgold.florisboard.lib.util.ViewUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@ -59,7 +54,11 @@ import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.serialization.decodeFromString
import org.florisboard.lib.snygg.SnyggStylesheet
import org.florisboard.lib.snygg.SnyggStylesheetJsonConfig
import org.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.value.MaterialYouColor
import org.florisboard.lib.snygg.value.SnyggSolidColorValue
import kotlin.properties.Delegates
/**

View File

@ -16,11 +16,6 @@
package dev.patrickgold.florisboard.ime.theme
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* Enum class which specifies all theme modes available. Used in the Settings
* to properly manage different use cases when the day or night theme should
@ -31,26 +26,4 @@ enum class ThemeMode {
ALWAYS_NIGHT,
FOLLOW_SYSTEM,
FOLLOW_TIME;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = ALWAYS_DAY,
label = stringRes(R.string.enum__theme_mode__always_day),
)
entry(
key = ALWAYS_NIGHT,
label = stringRes(R.string.enum__theme_mode__always_night),
)
entry(
key = FOLLOW_SYSTEM,
label = stringRes(R.string.enum__theme_mode__follow_system),
)
entry(
key = FOLLOW_TIME,
label = stringRes(R.string.enum__theme_mode__follow_time),
)
}
}
}

View File

@ -30,7 +30,7 @@ import androidx.core.view.WindowInsetsControllerCompat
import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import org.florisboard.lib.android.AndroidVersion
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
import org.florisboard.lib.snygg.ui.solidColor
@Composable

View File

@ -20,17 +20,17 @@ import androidx.core.text.trimmedLength
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.theme.ThemeExtensionComponent
import dev.patrickgold.florisboard.lib.ValidationRule
import dev.patrickgold.florisboard.lib.snygg.SnyggStylesheet
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggPercentShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSolidColorValue
import org.florisboard.lib.snygg.SnyggStylesheet
import org.florisboard.lib.snygg.value.SnyggDpShapeValue
import org.florisboard.lib.snygg.value.SnyggPercentShapeValue
import org.florisboard.lib.snygg.value.SnyggSolidColorValue
import dev.patrickgold.florisboard.lib.validate
import org.florisboard.lib.snygg.value.SnyggVarValue
object ExtensionValidation {
private val MetaIdRegex = """^[a-z][a-z0-9_]*(\.[a-z0-9][a-z0-9_]*)*${'$'}""".toRegex()
private val ComponentIdRegex = """^[a-z][a-z0-9_]*${'$'}""".toRegex()
private val ThemeComponentStylesheetPathRegex = """^[^:*<>"']*${'$'}""".toRegex()
val ThemeComponentVariableNameRegex = """^[a-zA-Z0-9-_]+${'$'}""".toRegex()
val MetaId = ValidationRule<String> {
forKlass = ExtensionMeta::class
@ -148,8 +148,8 @@ object ExtensionValidation {
when {
str.isBlank() -> resultInvalid(error = R.string.ext__validation__enter_property)
str == "-" || str.startsWith("--") -> resultValid()
!ThemeComponentVariableNameRegex.matches(str) -> {
resultInvalid(error = R.string.ext__validation__error_property, "variable_name_regex" to ThemeComponentVariableNameRegex)
!SnyggVarValue.VariableNameRegex.matches(str) -> {
resultInvalid(error = R.string.ext__validation__error_property, "variable_name_regex" to SnyggVarValue.VariableNameRegex)
}
else -> resultValid(hint = R.string.ext__validation__hint_property)
}
@ -163,7 +163,7 @@ object ExtensionValidation {
val str = input.trim()
when {
str.isBlank() -> resultInvalid(error = R.string.ext__validation__enter_color)
dev.patrickgold.florisboard.lib.snygg.value.SnyggSolidColorValue.deserialize(str).isFailure -> {
org.florisboard.lib.snygg.value.SnyggSolidColorValue.deserialize(str).isFailure -> {
resultInvalid(error = R.string.ext__validation__error_color)
}
else -> resultValid()

View File

@ -1,60 +0,0 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* 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 dev.patrickgold.florisboard.lib.snygg
import androidx.compose.runtime.Composable
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.jetpref.datastore.ui.listPrefEntries
/**
* SnyggLevel indicates if a rule property is intended to be edited by all users (BASIC) or only by advanced users
* (ADVANCED). This level is intended for theme editor UIs to hide certain properties in a "basic" mode, for the Snygg
* theme engine internally this level will be ignored completely.
*/
enum class SnyggLevel : Comparable<SnyggLevel> {
/** A property is intended to be edited by all users **/
BASIC,
/** A property is intended to be edited by advanced users **/
ADVANCED,
/** A property is intended to be edited by developers **/
DEVELOPER;
companion object {
@Composable
fun listEntries() = listPrefEntries {
entry(
key = BASIC,
label = stringRes(R.string.enum__snygg_level__basic),
description = stringRes(R.string.enum__snygg_level__basic__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = ADVANCED,
label = stringRes(R.string.enum__snygg_level__advanced),
description = stringRes(R.string.enum__snygg_level__advanced__description),
showDescriptionOnlyIfSelected = true,
)
entry(
key = DEVELOPER,
label = stringRes(R.string.enum__snygg_level__developer),
description = stringRes(R.string.enum__snygg_level__developer__description),
showDescriptionOnlyIfSelected = true,
)
}
}
}

View File

@ -817,6 +817,9 @@
<string name="enum__key_hint_mode__smart_priority" comment="Enum value label">Smart prioritization</string>
<string name="enum__key_hint_mode__smart_priority__description" comment="Enum value description">The initial character selected after long press is dynamically decided to be either the primary accent or the hint symbol, based on the current language and layout</string>
<string name="enum__incognito_display_mode__replace_shared_actions_toggle" comment="Enum value label">Replace shared actions toggle icon with the incognito indicator</string>
<string name="enum__incognito_display_mode__display_behind_keyboard" comment="Enum value label">Display the incognito indicator behind the keyboard</string>
<string name="enum__incognito_mode__force_off" comment="Enum value label">Force off</string>
<string name="enum__incognito_mode__force_off__description" comment="Enum value description">Incognito mode will always be disabled, regardless of the target app\'s passed options. The incognito quick action in the Smartbar will not be available with this option.</string>
<string name="enum__incognito_mode__force_on" comment="Enum value label">Force on</string>
@ -824,9 +827,6 @@
<string name="enum__incognito_mode__dynamic_on_off" comment="Enum value label">Dynamically on/off</string>
<string name="enum__incognito_mode__dynamic_on_off__description" comment="Enum value description">Recommended option. Incognito mode will be dynamically enabled or disabled either through the target app\'s passed options or by manually toggling it through the incognito quick action in the Smartbar.</string>
<string name="enum__incognito_display_mode__replace_shared_actions_toggle" comment="Enum value label">Replace shared actions toggle icon with the incognito indicator</string>
<string name="enum__incognito_display_mode__display_behind_keyboard" comment="Enum value label">Display the incognito indicator behind the keyboard</string>
<string name="enum__input_feedback_activation_mode__audio_respect_system_settings" comment="Enum value label">Dynamically play sounds for input events, depending on system settings</string>
<string name="enum__input_feedback_activation_mode__audio_ignore_system_settings" comment="Enum value label">Always play sounds for input events, regardless of system settings</string>
<string name="enum__input_feedback_activation_mode__haptic_respect_system_settings" comment="Enum value label">Dynamically vibrate for input events, depending on system settings</string>

View File

@ -1,4 +1,4 @@
package dev.patrickgold.florisboard.lib.snygg
package org.florisboard.lib.snygg
import io.kotest.core.spec.style.FunSpec
import io.kotest.data.forAll

View File

@ -1,4 +1,4 @@
package dev.patrickgold.florisboard.lib.snygg.value
package org.florisboard.lib.snygg.value
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

View File

@ -1,6 +1,7 @@
plugins {
alias(libs.plugins.agp.library)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.serialization)
}
val projectMinSdk: String by project

View File

@ -1,24 +0,0 @@
package org.florisboard.lib.android
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("org.florisboard.lib.android.test", appContext.packageName)
}
}

View File

@ -1,17 +0,0 @@
package org.florisboard.lib.android
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}

1
lib/snygg/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -0,0 +1,53 @@
plugins {
alias(libs.plugins.agp.library)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.serialization)
}
val projectMinSdk: String by project
val projectCompileSdk: String by project
android {
namespace = "org.florisboard.lib.snygg"
compileSdk = projectCompileSdk.toInt()
defaultConfig {
minSdk = projectMinSdk.toInt()
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get()
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation(project(":lib:android"))
implementation(project(":lib:kotlin"))
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.ui)
implementation(libs.kotlinx.serialization.json)
}

View File

21
lib/snygg/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg
package org.florisboard.lib.snygg
/**
* Main object for defining all known Snygg property names.
@ -41,4 +41,14 @@ object Snygg {
const val ShadowElevation = "shadow-elevation"
const val Shape = "shape"
fun init(
stylesheetSpec: SnyggSpec,
rulePreferredElementSorting: List<String>,
rulePlaceholders: Map<String, Int>,
) {
SnyggStylesheetSerializer.GlobalStylesheetSpec = stylesheetSpec
SnyggRule.PreferredElementSorting = rulePreferredElementSorting
SnyggRule.Placeholders = rulePlaceholders
}
}

View File

@ -0,0 +1,31 @@
/*
* Copyright (C) 2021 Patrick Goldinger
*
* 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 org.florisboard.lib.snygg
/**
* SnyggLevel indicates if a rule property is intended to be edited by all users (BASIC) or only by advanced users
* (ADVANCED). This level is intended for theme editor UIs to hide certain properties in a "basic" mode, for the Snygg
* theme engine internally this level will be ignored completely.
*/
enum class SnyggLevel : Comparable<SnyggLevel> {
/** A property is intended to be edited by all users **/
BASIC,
/** A property is intended to be edited by advanced users **/
ADVANCED,
/** A property is intended to be edited by developers **/
DEVELOPER;
}

View File

@ -14,28 +14,28 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg
package org.florisboard.lib.snygg
import androidx.annotation.FloatRange
import androidx.annotation.IntRange
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit
import dev.patrickgold.florisboard.lib.snygg.value.RgbaColor
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCircleShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCutCornerPercentShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDefinedVarValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggImageRefValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggImplicitInheritValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggPercentageSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRectangleShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRoundedCornerPercentShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSolidColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggValue
import org.florisboard.lib.snygg.value.RgbaColor
import org.florisboard.lib.snygg.value.SnyggCircleShapeValue
import org.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import org.florisboard.lib.snygg.value.SnyggCutCornerPercentShapeValue
import org.florisboard.lib.snygg.value.SnyggDefinedVarValue
import org.florisboard.lib.snygg.value.SnyggDpSizeValue
import org.florisboard.lib.snygg.value.SnyggImageRefValue
import org.florisboard.lib.snygg.value.SnyggImplicitInheritValue
import org.florisboard.lib.snygg.value.SnyggPercentageSizeValue
import org.florisboard.lib.snygg.value.SnyggRectangleShapeValue
import org.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import org.florisboard.lib.snygg.value.SnyggRoundedCornerPercentShapeValue
import org.florisboard.lib.snygg.value.SnyggSolidColorValue
import org.florisboard.lib.snygg.value.SnyggSpSizeValue
import org.florisboard.lib.snygg.value.SnyggValue
class SnyggPropertySet(val properties: Map<String, SnyggValue>) {
val width = properties[Snygg.Width] ?: SnyggImplicitInheritValue

View File

@ -14,12 +14,9 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg
package org.florisboard.lib.snygg
import androidx.compose.runtime.saveable.Saver
import dev.patrickgold.florisboard.ime.input.InputShiftState
import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
@ -60,39 +57,9 @@ data class SnyggRule(
private val RuleValidator =
"""^(@?)[a-zA-Z0-9-]+(\[(code|group|shiftstate)=(\+|-)?([0-9]+)(\|(\+|-)?([0-9]+))*\])*(:(pressed|focus|disabled))*${'$'}""".toRegex()
val Placeholders = mapOf(
"c:delete" to KeyCode.DELETE,
"c:enter" to KeyCode.ENTER,
"c:shift" to KeyCode.SHIFT,
"c:space" to KeyCode.SPACE,
"sh:unshifted" to InputShiftState.UNSHIFTED.value,
"sh:shifted_manual" to InputShiftState.SHIFTED_MANUAL.value,
"sh:shifted_automatic" to InputShiftState.SHIFTED_AUTOMATIC.value,
"sh:caps_lock" to InputShiftState.CAPS_LOCK.value,
)
var Placeholders = mapOf<String, Int>()
private val PreferredElementSorting = listOf(
FlorisImeUi.Keyboard,
FlorisImeUi.Key,
FlorisImeUi.KeyHint,
FlorisImeUi.KeyPopup,
FlorisImeUi.Smartbar,
FlorisImeUi.SmartbarSharedActionsRow,
FlorisImeUi.SmartbarSharedActionsToggle,
FlorisImeUi.SmartbarExtendedActionsRow,
FlorisImeUi.SmartbarExtendedActionsToggle,
FlorisImeUi.SmartbarActionKey,
FlorisImeUi.SmartbarActionTile,
FlorisImeUi.SmartbarActionsOverflow,
FlorisImeUi.SmartbarActionsOverflowCustomizeButton,
FlorisImeUi.SmartbarActionsEditor,
FlorisImeUi.SmartbarActionsEditorHeader,
FlorisImeUi.SmartbarActionsEditorSubheader,
FlorisImeUi.SmartbarCandidatesRow,
FlorisImeUi.SmartbarCandidateWord,
FlorisImeUi.SmartbarCandidateClip,
FlorisImeUi.SmartbarCandidateSpacer,
)
internal var PreferredElementSorting = listOf<String>()
val Saver = Saver<SnyggRule?, String>(
save = { it?.toString() ?: "" },

View File

@ -14,11 +14,11 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg
package org.florisboard.lib.snygg
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDefinedVarValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggExplicitInheritValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggValueEncoder
import org.florisboard.lib.snygg.value.SnyggDefinedVarValue
import org.florisboard.lib.snygg.value.SnyggExplicitInheritValue
import org.florisboard.lib.snygg.value.SnyggValueEncoder
open class SnyggSpec(init: SnyggSpecBuilder.() -> Unit) {
val elements: Map<String, SnyggPropertySetSpec>

View File

@ -14,15 +14,10 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg
package org.florisboard.lib.snygg
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import dev.patrickgold.florisboard.ime.theme.FlorisImeUiSpec
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDefinedVarValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggImplicitInheritValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggVarValueEncoders
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.builtins.MapSerializer
@ -30,6 +25,10 @@ import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import org.florisboard.lib.snygg.value.SnyggDefinedVarValue
import org.florisboard.lib.snygg.value.SnyggImplicitInheritValue
import org.florisboard.lib.snygg.value.SnyggValue
import org.florisboard.lib.snygg.value.SnyggVarValueEncoders
val SnyggStylesheetJsonConfig = Json
@ -251,6 +250,10 @@ class SnyggStylesheetSerializer : KSerializer<SnyggStylesheet> {
override val descriptor = ruleMapSerializer.descriptor
companion object {
var GlobalStylesheetSpec: SnyggSpec? = null
}
override fun serialize(encoder: Encoder, value: SnyggStylesheet) {
val rawRuleMap = value.rules.mapValues { (_, propertySet) ->
propertySet.properties.mapValues { (_, snyggValue) ->
@ -264,8 +267,8 @@ class SnyggStylesheetSerializer : KSerializer<SnyggStylesheet> {
val rawRuleMap = ruleMapSerializer.deserialize(decoder)
val ruleMap = mutableMapOf<SnyggRule, SnyggPropertySet>()
for ((rule, rawProperties) in rawRuleMap) {
// FIXME: hardcoding which spec to use, the selection should happen dynamically
val stylesheetSpec = FlorisImeUiSpec
val stylesheetSpec = GlobalStylesheetSpec ?:
throw IllegalStateException("No global stylesheet spec defined")
if (rule.isDefinedVariablesRule()) {
val parsedProperties = rawProperties.mapValues { (_, rawValue) ->
SnyggVarValueEncoders.firstNotNullOfOrNull { it.deserialize(rawValue).getOrNull() }

View File

@ -14,24 +14,23 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.ui
package org.florisboard.lib.snygg.ui
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.lib.snygg.SnyggPropertySet
import org.florisboard.lib.snygg.SnyggPropertySet
@Composable
fun SnyggButton(
@ -44,6 +43,7 @@ fun SnyggButton(
contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
) {
val context = LocalContext.current
val uiDefaults = LocalSnyggUiDefaults.current
val border = remember (style) {
BorderStroke(style.borderWidth.dpSize(default = 0.dp), style.borderColor.solidColor(context))
}
@ -51,7 +51,7 @@ fun SnyggButton(
Button(
modifier = modifier,
enabled = enabled,
elevation = ButtonDefaults.elevation(
elevation = ButtonDefaults.buttonElevation(
defaultElevation = elevation,
pressedElevation = elevation,
disabledElevation = elevation,
@ -61,8 +61,8 @@ fun SnyggButton(
shape = style.shape.shape(),
border = border,
colors = ButtonDefaults.buttonColors(
backgroundColor = style.background.solidColor(context, default = FlorisImeTheme.fallbackContentColor()),
contentColor = style.foreground.solidColor(context, default = FlorisImeTheme.fallbackSurfaceColor()),
containerColor = style.background.solidColor(context, default = uiDefaults.fallbackContentColor),
contentColor = style.foreground.solidColor(context, default = uiDefaults.fallbackSurfaceColor),
),
contentPadding = contentPadding,
onClick = onClick,

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.ui
package org.florisboard.lib.snygg.ui
import android.content.Context
import androidx.compose.foundation.background
@ -30,14 +30,13 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.takeOrElse
import dev.patrickgold.florisboard.lib.snygg.SnyggPropertySet
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouLightColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSolidColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggSpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggValue
import org.florisboard.lib.snygg.SnyggPropertySet
import org.florisboard.lib.snygg.value.SnyggDpSizeValue
import org.florisboard.lib.snygg.value.SnyggMaterialYouValue
import org.florisboard.lib.snygg.value.SnyggShapeValue
import org.florisboard.lib.snygg.value.SnyggSolidColorValue
import org.florisboard.lib.snygg.value.SnyggSpSizeValue
import org.florisboard.lib.snygg.value.SnyggValue
fun Modifier.snyggBackground(
context: Context,

View File

@ -14,22 +14,21 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.ui
package org.florisboard.lib.snygg.ui
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding
import androidx.compose.material.LocalAbsoluteElevation
import androidx.compose.material.LocalContentColor
import androidx.compose.material3.LocalAbsoluteTonalElevation
import androidx.compose.material3.LocalContentColor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.takeOrElse
import dev.patrickgold.florisboard.ime.theme.FlorisImeTheme
import dev.patrickgold.florisboard.lib.snygg.SnyggPropertySet
import org.florisboard.lib.snygg.SnyggPropertySet
val NoContentPadding = PaddingValues(all = 0.dp)
@ -43,12 +42,13 @@ fun SnyggSurface(
content: @Composable BoxScope.() -> Unit,
) {
val context = LocalContext.current
val uiDefaults = LocalSnyggUiDefaults.current
val elevationDp = style.shadowElevation.dpSize().takeOrElse { 0.dp }.coerceAtLeast(0.dp)
val contentColor = style.foreground.solidColor(context, default = FlorisImeTheme.fallbackContentColor())
val absoluteElevation = LocalAbsoluteElevation.current + elevationDp
val contentColor = style.foreground.solidColor(context, default = uiDefaults.fallbackContentColor)
val absoluteElevation = LocalAbsoluteTonalElevation.current + elevationDp
CompositionLocalProvider(
LocalContentColor provides contentColor,
LocalAbsoluteElevation provides absoluteElevation,
LocalAbsoluteTonalElevation provides absoluteElevation,
) {
Box(
modifier = modifier

View File

@ -0,0 +1,27 @@
package org.florisboard.lib.snygg.ui
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.graphics.Color
data class SnyggUiDefaults(
val fallbackContentColor: Color,
val fallbackSurfaceColor: Color,
)
internal val LocalSnyggUiDefaults = staticCompositionLocalOf {
SnyggUiDefaults(
fallbackContentColor = Color.Black,
fallbackSurfaceColor = Color.White,
)
}
@Composable fun ProvideSnyggUiDefaults(
defaults: SnyggUiDefaults,
content: @Composable () -> Unit,
) {
CompositionLocalProvider(LocalSnyggUiDefaults provides defaults) {
content()
}
}

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.value
package org.florisboard.lib.snygg.value
import androidx.compose.ui.graphics.Color
import kotlin.math.roundToInt

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.value
package org.florisboard.lib.snygg.value
@Suppress("UNCHECKED_CAST")
@JvmInline

View File

@ -14,17 +14,17 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.value
package org.florisboard.lib.snygg.value
import android.content.Context
import androidx.compose.material3.ColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.ui.graphics.Color
import dev.patrickgold.florisboard.lib.snygg.value.MaterialYouColor.ColorName
import dev.patrickgold.florisboard.lib.snygg.value.MaterialYouColor.ColorNameId
import dev.patrickgold.florisboard.lib.snygg.value.MaterialYouColor.darkColorName
import dev.patrickgold.florisboard.lib.snygg.value.MaterialYouColor.lightColorName
import org.florisboard.lib.snygg.value.MaterialYouColor.ColorName
import org.florisboard.lib.snygg.value.MaterialYouColor.ColorNameId
import org.florisboard.lib.snygg.value.MaterialYouColor.darkColorName
import org.florisboard.lib.snygg.value.MaterialYouColor.lightColorName
sealed interface SnyggMaterialYouValue : SnyggValue {
val colorName: String

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.value
package org.florisboard.lib.snygg.value
private const val RelPath = "relPath"
private const val ImageFunction = "image"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.value
package org.florisboard.lib.snygg.value
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.CutCornerShape

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.value
package org.florisboard.lib.snygg.value
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.value
package org.florisboard.lib.snygg.value
import org.florisboard.lib.android.AndroidVersion

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.value
package org.florisboard.lib.snygg.value
/**
* SnyggValueEncoder is responsible for the representation of a [SnyggValue] specification and for providing methods

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.value
package org.florisboard.lib.snygg.value
import org.florisboard.lib.kotlin.toStringWithoutDotZero

View File

@ -14,18 +14,20 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.snygg.value
import dev.patrickgold.florisboard.lib.ext.ExtensionValidation
package org.florisboard.lib.snygg.value
private const val VarKey = "varKey"
sealed interface SnyggVarValue : SnyggValue
sealed interface SnyggVarValue : SnyggValue {
companion object {
val VariableNameRegex = """^[a-zA-Z0-9-_]+${'$'}""".toRegex()
}
}
data class SnyggDefinedVarValue(val key: String) : SnyggVarValue {
companion object : SnyggValueEncoder {
override val spec = SnyggValueSpec {
function(name = "var") { string(id = VarKey, regex = ExtensionValidation.ThemeComponentVariableNameRegex) }
function(name = "var") { string(id = VarKey, regex = SnyggVarValue.VariableNameRegex) }
}
override fun defaultValue() = SnyggDefinedVarValue("")

View File

@ -38,3 +38,4 @@ include(":benchmark")
include(":lib:android")
include(":lib:kotlin")
include(":lib:native")
include(":lib:snygg")