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

Modularize lib.kotlin (#2404)

* extract dev.patrickgold.florisboard.lib.kotlin to org.florisboard.lib.kotlin

* apply review suggestions
This commit is contained in:
Lars Mühlbauer 2024-03-07 04:57:31 +01:00 committed by GitHub
parent 74dd67642c
commit 22b7a675e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
52 changed files with 132 additions and 95 deletions

View File

@ -236,6 +236,9 @@ dependencies {
implementation(libs.patrickgold.jetpref.datastore.ui)
implementation(libs.patrickgold.jetpref.material.ui)
implementation(project(":lib:kotlin"))
testImplementation(libs.equalsverifier)
testImplementation(libs.kotest.assertions.core)
testImplementation(libs.kotest.extensions.roboelectric)

View File

@ -45,9 +45,9 @@ import dev.patrickgold.florisboard.lib.ext.ExtensionManager
import dev.patrickgold.florisboard.lib.io.AssetManager
import dev.patrickgold.florisboard.lib.io.deleteContentsRecursively
import dev.patrickgold.florisboard.lib.io.subFile
import dev.patrickgold.florisboard.lib.kotlin.tryOrNull
import dev.patrickgold.florisboard.lib.toNativeStr
import dev.patrickgold.jetpref.datastore.JetPref
import org.florisboard.lib.kotlin.tryOrNull
import java.lang.ref.WeakReference
/**

View File

@ -112,7 +112,6 @@ import dev.patrickgold.florisboard.lib.devtools.LogTopic
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.kotlin.collectLatestIn
import dev.patrickgold.florisboard.lib.observeAsTransformingState
import dev.patrickgold.florisboard.lib.snygg.ui.SnyggSurface
import dev.patrickgold.florisboard.lib.snygg.ui.shape
@ -124,6 +123,7 @@ import dev.patrickgold.florisboard.lib.snygg.ui.spSize
import dev.patrickgold.florisboard.lib.util.ViewUtils
import dev.patrickgold.florisboard.lib.util.debugSummarize
import dev.patrickgold.jetpref.datastore.model.observeAsState
import org.florisboard.lib.kotlin.collectLatestIn
import java.lang.ref.WeakReference
/**

View File

@ -23,14 +23,14 @@ import android.view.textservice.TextInfo
import dev.patrickgold.florisboard.app.florisPreferenceModel
import dev.patrickgold.florisboard.ime.core.Subtype
import dev.patrickgold.florisboard.ime.dictionary.DictionaryManager
import dev.patrickgold.florisboard.ime.nlp.SpellingResult
import dev.patrickgold.florisboard.ime.nlp.SpellingLanguageMode
import dev.patrickgold.florisboard.ime.nlp.SpellingResult
import dev.patrickgold.florisboard.lib.FlorisLocale
import dev.patrickgold.florisboard.lib.devtools.LogTopic
import dev.patrickgold.florisboard.lib.devtools.flogInfo
import dev.patrickgold.florisboard.lib.kotlin.map
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import org.florisboard.lib.kotlin.map
class FlorisSpellCheckerService : SpellCheckerService() {
private val prefs by florisPreferenceModel()

View File

@ -56,7 +56,7 @@ import dev.patrickgold.florisboard.app.settings.theme.ThemeManagerScreenAction
import dev.patrickgold.florisboard.app.settings.theme.ThemeScreen
import dev.patrickgold.florisboard.app.settings.typing.TypingScreen
import dev.patrickgold.florisboard.app.setup.SetupScreen
import dev.patrickgold.florisboard.lib.kotlin.curlyFormat
import org.florisboard.lib.kotlin.curlyFormat
@Suppress("FunctionName")
object Routes {

View File

@ -61,9 +61,8 @@ import dev.patrickgold.florisboard.lib.compose.FlorisScreen
import dev.patrickgold.florisboard.lib.compose.defaultFlorisOutlinedBox
import dev.patrickgold.florisboard.lib.compose.florisHorizontalScroll
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.devtools.flogDebug
import dev.patrickgold.florisboard.lib.io.FileRegistry
import dev.patrickgold.florisboard.lib.kotlin.resultOk
import org.florisboard.lib.kotlin.resultOk
enum class ExtensionImportScreenType(
val id: String,

View File

@ -19,8 +19,8 @@ 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.florisboard.lib.kotlin.curlyFormat
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.

View File

@ -68,8 +68,6 @@ import dev.patrickgold.florisboard.lib.compose.FlorisTextButton
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.kotlin.curlyFormat
import dev.patrickgold.florisboard.lib.kotlin.toStringWithoutDotZero
import dev.patrickgold.florisboard.lib.rememberValidationResult
import dev.patrickgold.florisboard.lib.snygg.SnyggLevel
import dev.patrickgold.florisboard.lib.snygg.SnyggPropertySetSpec
@ -97,6 +95,8 @@ import dev.patrickgold.jetpref.material.ui.ExperimentalJetPrefMaterialUi
import dev.patrickgold.jetpref.material.ui.JetPrefAlertDialog
import dev.patrickgold.jetpref.material.ui.JetPrefColorPicker
import dev.patrickgold.jetpref.material.ui.rememberJetPrefColorPickerState
import org.florisboard.lib.kotlin.curlyFormat
import org.florisboard.lib.kotlin.toStringWithoutDotZero
internal val SnyggEmptyPropertyInfoForAdding = PropertyInfo(
name = "- select -",

View File

@ -67,6 +67,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.input.InputKeyEventReceiver
import dev.patrickgold.florisboard.ime.input.InputShiftState
import dev.patrickgold.florisboard.ime.keyboard.ComputingEvaluator
import dev.patrickgold.florisboard.ime.keyboard.DefaultComputingEvaluator
import dev.patrickgold.florisboard.ime.keyboard.Key
@ -75,7 +76,6 @@ import dev.patrickgold.florisboard.ime.keyboard.Keyboard
import dev.patrickgold.florisboard.ime.keyboard.KeyboardMode
import dev.patrickgold.florisboard.ime.keyboard.computeIconResId
import dev.patrickgold.florisboard.ime.keyboard.computeLabel
import dev.patrickgold.florisboard.ime.input.InputShiftState
import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.ime.text.keyboard.TextKeyData
import dev.patrickgold.florisboard.ime.theme.FlorisImeUiSpec
@ -90,12 +90,12 @@ 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.kotlin.curlyFormat
import dev.patrickgold.florisboard.lib.kotlin.getKeyByValue
import dev.patrickgold.florisboard.lib.snygg.SnyggLevel
import dev.patrickgold.florisboard.lib.snygg.SnyggRule
import dev.patrickgold.florisboard.lib.util.InputMethodUtils
import dev.patrickgold.jetpref.material.ui.JetPrefAlertDialog
import org.florisboard.lib.kotlin.curlyFormat
import org.florisboard.lib.kotlin.getKeyByValue
private val TransparentTextSelectionColors = TextSelectionColors(
handleColor = Color.Transparent,

View File

@ -33,7 +33,6 @@ import dev.patrickgold.florisboard.lib.android.AndroidClipboardManager_OnPrimary
import dev.patrickgold.florisboard.lib.android.setOrClearPrimaryClip
import dev.patrickgold.florisboard.lib.android.showShortToast
import dev.patrickgold.florisboard.lib.android.systemService
import dev.patrickgold.florisboard.lib.kotlin.tryOrNull
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@ -46,6 +45,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import org.florisboard.lib.kotlin.tryOrNull
import java.io.Closeable
/**

View File

@ -40,7 +40,7 @@ import androidx.room.TypeConverter
import androidx.room.TypeConverters
import androidx.room.Update
import dev.patrickgold.florisboard.lib.android.query
import dev.patrickgold.florisboard.lib.kotlin.tryOrNull
import org.florisboard.lib.kotlin.tryOrNull
private const val CLIPBOARD_HISTORY_TABLE = "clipboard_history"
private const val CLIPBOARD_FILES_TABLE = "clipboard_files"

View File

@ -30,11 +30,11 @@ import android.provider.OpenableColumns
import androidx.exifinterface.media.ExifInterface
import dev.patrickgold.florisboard.BuildConfig
import dev.patrickgold.florisboard.lib.devtools.flogError
import dev.patrickgold.florisboard.lib.kotlin.tryOrNull
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import org.florisboard.lib.kotlin.tryOrNull
/**
* Allows apps to access images and videos on the clipboard.

View File

@ -38,7 +38,7 @@ import dev.patrickgold.florisboard.lib.FlorisLocale
import dev.patrickgold.florisboard.lib.ValidationRule
import dev.patrickgold.florisboard.lib.android.readText
import dev.patrickgold.florisboard.lib.android.writeText
import dev.patrickgold.florisboard.lib.kotlin.tryOrNull
import org.florisboard.lib.kotlin.tryOrNull
import java.lang.ref.WeakReference
private const val WORDS_TABLE = "words"

View File

@ -29,16 +29,16 @@ import dev.patrickgold.florisboard.ime.nlp.BreakIteratorGroup
import dev.patrickgold.florisboard.ime.text.composing.Composer
import dev.patrickgold.florisboard.keyboardManager
import dev.patrickgold.florisboard.lib.ext.ExtensionComponentName
import dev.patrickgold.florisboard.lib.kotlin.guardedByLock
import dev.patrickgold.florisboard.nlpManager
import dev.patrickgold.florisboard.subtypeManager
import kotlin.math.max
import kotlin.math.min
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.florisboard.lib.kotlin.guardedByLock
import kotlin.math.max
import kotlin.math.min
@Suppress("BlockingMethodInNonBlockingContext")
abstract class AbstractEditorInstance(context: Context) {

View File

@ -16,7 +16,7 @@
package dev.patrickgold.florisboard.ime.editor
import dev.patrickgold.florisboard.lib.kotlin.safeSubstring
import org.florisboard.lib.kotlin.safeSubstring
/**
* A snapshot window of an input editor content around the selection/cursor.
@ -25,8 +25,8 @@ import dev.patrickgold.florisboard.lib.kotlin.safeSubstring
* @property offset The offset of the whole editor content snapshot. `-1` indicates the value is unknown.
* @property localSelection The selection reported by the editor, without [offset] included.
* @property localComposing The composing region for the editor, without [offset] included.
* @property localCurrentWord The current word for the editor (typically the same as [localComposing]), without
* [offset] included.
* @property localCurrentWord The current word for the editor (typically the same as [localComposing]), without [offset]
* included.
*/
data class EditorContent(
val text: String,

View File

@ -28,7 +28,6 @@ import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.ime.text.keyboard.TextKeyData
import dev.patrickgold.florisboard.lib.android.removeAndReturn
import dev.patrickgold.florisboard.lib.devtools.flogDebug
import dev.patrickgold.florisboard.lib.kotlin.guardedByLock
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@ -39,6 +38,7 @@ import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import org.florisboard.lib.kotlin.guardedByLock
class InputEventDispatcher private constructor(private val repeatableKeyCodes: IntArray) {
companion object {

View File

@ -22,7 +22,6 @@ import android.view.KeyEvent
import android.widget.Toast
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.MutableLiveData
import dev.patrickgold.florisboard.FlorisImeService
@ -63,10 +62,8 @@ import dev.patrickgold.florisboard.lib.android.systemService
import dev.patrickgold.florisboard.lib.devtools.LogTopic
import dev.patrickgold.florisboard.lib.devtools.flogError
import dev.patrickgold.florisboard.lib.ext.ExtensionComponentName
import dev.patrickgold.florisboard.lib.kotlin.collectIn
import dev.patrickgold.florisboard.lib.kotlin.collectLatestIn
import dev.patrickgold.florisboard.lib.kotlin.titlecase
import dev.patrickgold.florisboard.lib.kotlin.uppercase
import dev.patrickgold.florisboard.lib.titlecase
import dev.patrickgold.florisboard.lib.uppercase
import dev.patrickgold.florisboard.lib.util.InputMethodUtils
import dev.patrickgold.florisboard.nlpManager
import dev.patrickgold.florisboard.subtypeManager
@ -78,6 +75,8 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import org.florisboard.lib.kotlin.collectIn
import org.florisboard.lib.kotlin.collectLatestIn
import java.lang.ref.WeakReference
private val DoubleSpacePeriodMatcher = """([^.!?‽\s]\s)""".toRegex()

View File

@ -34,8 +34,6 @@ import dev.patrickgold.florisboard.lib.devtools.flogDebug
import dev.patrickgold.florisboard.lib.devtools.flogWarning
import dev.patrickgold.florisboard.lib.ext.ExtensionComponentName
import dev.patrickgold.florisboard.lib.io.ZipUtils
import dev.patrickgold.florisboard.lib.kotlin.DeferredResult
import dev.patrickgold.florisboard.lib.kotlin.runCatchingAsync
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
@ -44,6 +42,8 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.cancel
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import org.florisboard.lib.kotlin.DeferredResult
import org.florisboard.lib.kotlin.runCatchingAsync
private data class LTN(
val type: LayoutType,

View File

@ -18,9 +18,9 @@ package dev.patrickgold.florisboard.ime.nlp
import android.icu.text.BreakIterator
import dev.patrickgold.florisboard.lib.FlorisLocale
import dev.patrickgold.florisboard.lib.kotlin.GuardedByLock
import dev.patrickgold.florisboard.lib.kotlin.guardedByLock
import io.github.reactivecircus.cache4k.Cache
import org.florisboard.lib.kotlin.GuardedByLock
import org.florisboard.lib.kotlin.guardedByLock
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract

View File

@ -3,31 +3,17 @@ package dev.patrickgold.florisboard.ime.nlp
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteException
import dev.patrickgold.florisboard.appContext
import dev.patrickgold.florisboard.assetManager
import dev.patrickgold.florisboard.lib.FlorisLocale
import dev.patrickgold.florisboard.lib.android.copy
import dev.patrickgold.florisboard.lib.devtools.flogDebug
import dev.patrickgold.florisboard.lib.devtools.flogError
import dev.patrickgold.florisboard.lib.ext.Extension
import dev.patrickgold.florisboard.lib.ext.ExtensionComponent
import dev.patrickgold.florisboard.lib.ext.ExtensionComponentName
import dev.patrickgold.florisboard.lib.ext.ExtensionEditor
import dev.patrickgold.florisboard.lib.ext.ExtensionMeta
import dev.patrickgold.florisboard.lib.io.FlorisRef
import dev.patrickgold.florisboard.lib.io.FsDir
import dev.patrickgold.florisboard.lib.io.parentDir
import dev.patrickgold.florisboard.lib.io.subFile
import dev.patrickgold.florisboard.lib.kotlin.tryOrNull
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
@Serializable
class LanguagePackComponent(

View File

@ -34,12 +34,10 @@ import dev.patrickgold.florisboard.ime.clipboard.provider.ItemType
import dev.patrickgold.florisboard.ime.core.Subtype
import dev.patrickgold.florisboard.ime.editor.EditorContent
import dev.patrickgold.florisboard.ime.editor.EditorRange
import dev.patrickgold.florisboard.ime.nlp.latin.LatinLanguageProvider
import dev.patrickgold.florisboard.ime.nlp.han.HanShapeBasedLanguageProvider
import dev.patrickgold.florisboard.ime.nlp.latin.LatinLanguageProvider
import dev.patrickgold.florisboard.keyboardManager
import dev.patrickgold.florisboard.lib.devtools.flogError
import dev.patrickgold.florisboard.lib.kotlin.collectLatestIn
import dev.patrickgold.florisboard.lib.kotlin.guardedByLock
import dev.patrickgold.florisboard.lib.util.NetworkUtils
import dev.patrickgold.florisboard.subtypeManager
import kotlinx.coroutines.CoroutineScope
@ -51,6 +49,8 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import org.florisboard.lib.kotlin.collectLatestIn
import org.florisboard.lib.kotlin.guardedByLock
import java.util.*
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger

View File

@ -27,12 +27,12 @@ import dev.patrickgold.florisboard.ime.nlp.SuggestionProvider
import dev.patrickgold.florisboard.ime.nlp.WordSuggestionCandidate
import dev.patrickgold.florisboard.lib.android.readText
import dev.patrickgold.florisboard.lib.devtools.flogDebug
import dev.patrickgold.florisboard.lib.kotlin.guardedByLock
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.serialization.builtins.MapSerializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.Json
import org.florisboard.lib.kotlin.guardedByLock
class LatinLanguageProvider(context: Context) : SpellingProvider, SuggestionProvider {
companion object {

View File

@ -30,7 +30,7 @@ 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.ime.text.key.KeyVariation
import dev.patrickgold.florisboard.lib.kotlin.lowercase
import dev.patrickgold.florisboard.lib.lowercase
class TextKey(override val data: AbstractKeyData) : Key(data) {
var computedData: KeyData = TextKeyData.UNSPECIFIED

View File

@ -25,8 +25,8 @@ import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.ime.text.key.KeyType
import dev.patrickgold.florisboard.lib.FlorisLocale
import dev.patrickgold.florisboard.lib.Unicode
import dev.patrickgold.florisboard.lib.kotlin.lowercase
import dev.patrickgold.florisboard.lib.kotlin.uppercase
import dev.patrickgold.florisboard.lib.lowercase
import dev.patrickgold.florisboard.lib.uppercase
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient

View File

@ -18,8 +18,6 @@ package dev.patrickgold.florisboard.lib
import android.content.Context
import dev.patrickgold.florisboard.extensionManager
import dev.patrickgold.florisboard.ime.nlp.LanguagePackExtension
import dev.patrickgold.florisboard.lib.kotlin.titlecase
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
@ -362,3 +360,11 @@ class FlorisLocale private constructor(val base: Locale) {
}
}
}
inline fun String.lowercase(locale: FlorisLocale): String = this.lowercase(locale.base)
inline fun String.uppercase(locale: FlorisLocale): String = this.uppercase(locale.base)
inline fun String.titlecase(locale: FlorisLocale = FlorisLocale.ROOT): String {
return this.replaceFirstChar { if (it.isLowerCase()) it.titlecase(locale.base) else it.toString() }
}

View File

@ -20,8 +20,8 @@ import androidx.annotation.StringRes
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.kotlin.CurlyArg
import dev.patrickgold.florisboard.lib.kotlin.curlyFormat
import org.florisboard.lib.kotlin.CurlyArg
import org.florisboard.lib.kotlin.curlyFormat
import kotlin.contracts.contract
import kotlin.reflect.KClass

View File

@ -28,7 +28,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import dev.patrickgold.florisboard.lib.kotlin.tryOrNull
import org.florisboard.lib.kotlin.tryOrNull
import java.lang.reflect.Modifier
import kotlin.reflect.KClass

View File

@ -20,8 +20,8 @@ package dev.patrickgold.florisboard.lib.android
import android.content.Context
import androidx.annotation.StringRes
import dev.patrickgold.florisboard.lib.kotlin.CurlyArg
import dev.patrickgold.florisboard.lib.kotlin.curlyFormat
import org.florisboard.lib.kotlin.CurlyArg
import org.florisboard.lib.kotlin.curlyFormat
import kotlin.reflect.KClass
/**

View File

@ -24,7 +24,7 @@ import androidx.annotation.StringRes
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.devtools.flogError
import dev.patrickgold.florisboard.lib.io.FlorisRef
import dev.patrickgold.florisboard.lib.kotlin.CurlyArg
import org.florisboard.lib.kotlin.CurlyArg
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import kotlin.reflect.KClass

View File

@ -19,7 +19,7 @@ package dev.patrickgold.florisboard.lib.android
import android.content.Context
import android.widget.Toast
import androidx.annotation.StringRes
import dev.patrickgold.florisboard.lib.kotlin.CurlyArg
import org.florisboard.lib.kotlin.CurlyArg
/**
* Shows a short toast with specified text.

View File

@ -27,8 +27,8 @@ import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.LayoutDirection
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.kotlin.CurlyArg
import dev.patrickgold.florisboard.lib.kotlin.curlyFormat
import org.florisboard.lib.kotlin.CurlyArg
import org.florisboard.lib.kotlin.curlyFormat
private val LocalResourcesContext = staticCompositionLocalOf<Context> {
error("resources context not initialized!!")

View File

@ -24,7 +24,7 @@ import dev.patrickgold.florisboard.BuildConfig
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.AppPrefs
import dev.patrickgold.florisboard.lib.android.systemService
import dev.patrickgold.florisboard.lib.kotlin.titlecase
import dev.patrickgold.florisboard.lib.titlecase
import dev.patrickgold.florisboard.lib.util.TimeUtils
import dev.patrickgold.florisboard.lib.util.UnitUtils
import java.io.BufferedReader

View File

@ -21,11 +21,11 @@ import dev.patrickgold.florisboard.lib.io.FlorisRef
import dev.patrickgold.florisboard.lib.io.FsDir
import dev.patrickgold.florisboard.lib.io.FsFile
import dev.patrickgold.florisboard.lib.io.ZipUtils
import dev.patrickgold.florisboard.lib.kotlin.resultErr
import dev.patrickgold.florisboard.lib.kotlin.resultOk
import kotlinx.serialization.Polymorphic
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import org.florisboard.lib.kotlin.resultErr
import org.florisboard.lib.kotlin.resultOk
/**
* An extension container holding a parsed config, a working directory file

View File

@ -17,7 +17,6 @@
package dev.patrickgold.florisboard.lib.ext
import androidx.compose.runtime.saveable.Saver
import dev.patrickgold.florisboard.lib.kotlin.tryOrNull
import dev.patrickgold.jetpref.datastore.model.PreferenceSerializer
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
@ -25,6 +24,7 @@ import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import org.florisboard.lib.kotlin.tryOrNull
/**
* An extension component, typically a layout, theme, file, etc. descriptor.

View File

@ -16,7 +16,7 @@
package dev.patrickgold.florisboard.lib.ext
import dev.patrickgold.florisboard.lib.kotlin.curlyFormat
import org.florisboard.lib.kotlin.curlyFormat
object ExtensionDefaults {
private const val ID_LOCAL_TEMPLATE = "local.{groupName}.{extensionName}"

View File

@ -38,7 +38,6 @@ import dev.patrickgold.florisboard.lib.io.FlorisRef
import dev.patrickgold.florisboard.lib.io.FsFile
import dev.patrickgold.florisboard.lib.io.ZipUtils
import dev.patrickgold.florisboard.lib.io.writeJson
import dev.patrickgold.florisboard.lib.kotlin.throwOnFailure
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -49,6 +48,7 @@ import kotlinx.serialization.KSerializer
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import org.florisboard.lib.kotlin.throwOnFailure
@OptIn(ExperimentalSerializationApi::class)
val ExtensionJsonConfig = Json {

View File

@ -30,13 +30,13 @@ import dev.patrickgold.florisboard.ime.text.keyboard.AutoTextKeyData
import dev.patrickgold.florisboard.ime.text.keyboard.MultiTextKeyData
import dev.patrickgold.florisboard.ime.text.keyboard.TextKeyData
import dev.patrickgold.florisboard.lib.android.reader
import dev.patrickgold.florisboard.lib.kotlin.resultErr
import dev.patrickgold.florisboard.lib.kotlin.resultErrStr
import dev.patrickgold.florisboard.lib.kotlin.resultOk
import kotlinx.serialization.KSerializer
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import org.florisboard.lib.kotlin.resultErr
import org.florisboard.lib.kotlin.resultErrStr
import org.florisboard.lib.kotlin.resultOk
import java.io.File
val DefaultJsonConfig = Json {

View File

@ -20,13 +20,13 @@ 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 dev.patrickgold.florisboard.lib.kotlin.curlyFormat
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import org.florisboard.lib.kotlin.curlyFormat
@Serializable(with = SnyggRule.Serializer::class)
data class SnyggRule(

View File

@ -16,7 +16,7 @@
package dev.patrickgold.florisboard.lib.snygg.value
import dev.patrickgold.florisboard.lib.kotlin.toStringWithoutDotZero
import org.florisboard.lib.kotlin.toStringWithoutDotZero
interface SnyggValueSpec {
val id: String?

View File

@ -1,4 +1,4 @@
package dev.patrickgold.florisboard.lib.kotlin
package org.florisboard.lib.kotlin
import io.kotest.core.spec.style.FreeSpec
import io.kotest.matchers.shouldBe

View File

@ -19,6 +19,7 @@ plugins {
alias(libs.plugins.agp.library) apply false
alias(libs.plugins.agp.test) apply false
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.kotlin.jvm) apply false
alias(libs.plugins.kotlin.serialization) apply false
alias(libs.plugins.ksp) apply false
alias(libs.plugins.mannodermaus.android.junit5) apply false

View File

@ -85,6 +85,7 @@ agp-application = { id = "com.android.application", version.ref = "android-gradl
agp-library = { id = "com.android.library", version.ref = "android-gradle-plugin" }
agp-test = { id = "com.android.test", version.ref = "android-gradle-plugin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
mannodermaus-android-junit5 = { id = "de.mannodermaus.android-junit5", version.ref = "mannodermaus-android-junit5" }

View File

@ -0,0 +1,51 @@
/*
* Copyright 2024 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.
*/
plugins {
alias(libs.plugins.kotlin.jvm)
}
val projectGroupId: String by project
val artifactId = "florisboard-lib-kotlin"
val projectVersion: String by project
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
sourceSets {
maybeCreate("main").apply {
java.srcDir("src/main/kotlin")
}
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = listOf(
"-Xallow-result-return-type",
"-opt-in=kotlin.contracts.ExperimentalContracts",
"-Xjvm-default=all-compatibility",
)
}
}
dependencies {
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.coroutines)
}

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.kotlin
package org.florisboard.lib.kotlin
@Throws(NoSuchElementException::class)
fun <K, V> Map<K, V>.getKeyByValue(value: V): K {

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.kotlin
package org.florisboard.lib.kotlin
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.kotlin
package org.florisboard.lib.kotlin
import kotlinx.coroutines.sync.Mutex
import kotlin.contracts.InvocationKind

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.kotlin
package org.florisboard.lib.kotlin
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract

View File

@ -14,6 +14,6 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.kotlin
package org.florisboard.lib.kotlin
fun Number.toStringWithoutDotZero(): String = this.toString().removeSuffix(".0")

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
package dev.patrickgold.florisboard.lib.kotlin
package org.florisboard.lib.kotlin
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind

View File

@ -16,7 +16,7 @@
@file:Suppress("NOTHING_TO_INLINE")
package dev.patrickgold.florisboard.lib.kotlin
package org.florisboard.lib.kotlin
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred

View File

@ -14,21 +14,11 @@
* limitations under the License.
*/
@file:Suppress("NOTHING_TO_INLINE")
package org.florisboard.lib.kotlin
package dev.patrickgold.florisboard.lib.kotlin
import dev.patrickgold.florisboard.lib.FlorisLocale
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
inline fun String.lowercase(locale: FlorisLocale): String = this.lowercase(locale.base)
inline fun String.uppercase(locale: FlorisLocale): String = this.uppercase(locale.base)
inline fun String.titlecase(locale: FlorisLocale = FlorisLocale.ROOT): String {
return this.replaceFirstChar { if (it.isLowerCase()) it.titlecase(locale.base) else it.toString() }
}
fun String.safeSubstring(startIndex: Int): String {
return try {

View File

@ -35,3 +35,4 @@ dependencyResolutionManagement {
include(":app")
include(":benchmark")
include(":lib:kotlin")