mirror of
https://github.com/florisboard/florisboard.git
synced 2024-09-19 19:42:20 +02:00
Merge conflict solved
This commit is contained in:
commit
2be1a328b6
@ -27,7 +27,8 @@
|
||||
"greek": "Ελληνικά",
|
||||
"hebrew": "עברית",
|
||||
"serbian_latin": "Serbian (QWERTZ)",
|
||||
"serbian_cyrillic": "Serbian (ЉЊЕРТЗ)"
|
||||
"serbian_cyrillic": "Serbian (ЉЊЕРТЗ)",
|
||||
"kurdish": "کوردی"
|
||||
},
|
||||
"defaultSubtypes": [
|
||||
{
|
||||
@ -207,6 +208,11 @@
|
||||
},
|
||||
{
|
||||
"id": 2001,
|
||||
"languageTag": "ckb",
|
||||
"preferredLayout": "kurdish"
|
||||
},
|
||||
{
|
||||
"id": 2101,
|
||||
"languageTag": "sr-RS",
|
||||
"preferredLayout": "serbian_cyrillic"
|
||||
}
|
||||
|
167
app/src/main/assets/ime/text/characters/extended_popups/ckb.json
Normal file
167
app/src/main/assets/ime/text/characters/extended_popups/ckb.json
Normal file
@ -0,0 +1,167 @@
|
||||
{
|
||||
"type": "characters/extended_popups",
|
||||
"name": "ckb",
|
||||
"authors": [ "GoRaN" ],
|
||||
"mapping": {
|
||||
"all": {
|
||||
"ق": {
|
||||
"relevant": [
|
||||
{ "code": 1647, "label": "ٯ" }
|
||||
]
|
||||
},
|
||||
"ئ": {
|
||||
"relevant": [
|
||||
{"code": 1569, "label": "ء" }
|
||||
]
|
||||
},
|
||||
"ە": {
|
||||
"relevant": [
|
||||
{ "code": 1577, "label": "ة" },
|
||||
{ "code": 1729, "label": "ـہ" }
|
||||
]
|
||||
},
|
||||
"ر": {
|
||||
"relevant": [
|
||||
{ "code": 1685, "label": "ڕ" },
|
||||
{ "code": 1682, "label": "ڒ" }
|
||||
]
|
||||
},
|
||||
"ف": {
|
||||
"relevant": [
|
||||
{ "code": 1701, "label": "ڥ" },
|
||||
{ "code": 1698, "label": "ڢ" },
|
||||
{ "code": 1700, "label": "ڤ" },
|
||||
{ "code": 1697, "label": "ڡ" }
|
||||
]
|
||||
},
|
||||
"": {
|
||||
"relevant": [
|
||||
{ "code": 65163, "label": "ﺋ" },
|
||||
{ "code": 1569, "label": "ء" },
|
||||
{ "code": 65139, "label": "ﹳ" }
|
||||
]
|
||||
},
|
||||
"ع": {
|
||||
"relevant": [
|
||||
{ "code": 1551, "label": "؏" },
|
||||
{ "code": 1594, "label": "غ" }
|
||||
]
|
||||
},
|
||||
"د": {
|
||||
"relevant": [
|
||||
{ "code": 1676, "label": "ڌ" },
|
||||
{ "code": 64390, "label": "ﮆ" },
|
||||
{ "code": 1584, "label": "ذ" },
|
||||
{ "code": 1774, "label": "ۮ" }
|
||||
]
|
||||
},
|
||||
"ه": {
|
||||
"relevant": [
|
||||
{ "code": 1726, "label": "ھ" }
|
||||
]
|
||||
},
|
||||
"خ": {
|
||||
"relevant": [
|
||||
{ "code": 1567, "label": "؟" }
|
||||
]
|
||||
},
|
||||
"س": {
|
||||
"relevant": [
|
||||
{ "code": 1589, "label": "ص" }
|
||||
]
|
||||
},
|
||||
"ش": {
|
||||
"relevant": [
|
||||
{ "code": 1590, "label": "ض" }
|
||||
]
|
||||
},
|
||||
"ب": {
|
||||
"relevant": [
|
||||
{ "code": 65010, "label": "ﷲ" },
|
||||
{ "code": 65021, "label": "﷽" },
|
||||
{ "code": 65019, "label": "ﷻ" }
|
||||
]
|
||||
},
|
||||
"م": {
|
||||
"relevant": [
|
||||
{ "code": 65018, "label": "ﷺ" },
|
||||
{ "code": 65012, "label": "ﷴ" }
|
||||
]
|
||||
},
|
||||
"ل": {
|
||||
"relevant": [
|
||||
{ "code": 1718, "label": "ڶ" },
|
||||
{ "code": 1719, "label": "ڷ" },
|
||||
{ "code": 1717, "label": "ڵ" },
|
||||
{ "code": 1720, "label": "ڸ" }
|
||||
]
|
||||
},
|
||||
"ا": {
|
||||
"relevant": [
|
||||
{ "code": 1571, "label": "أ" },
|
||||
{ "code": 1573, "label": "إ" },
|
||||
{ "code": 1570, "label": "آ" },
|
||||
{ "code": 1649, "label": "ٱ" }
|
||||
]
|
||||
},
|
||||
"ک": {
|
||||
"relevant": [
|
||||
{ "code": 1706, "label": "ڪ" },
|
||||
{ "code": 1603, "label": "ك"}
|
||||
]
|
||||
},
|
||||
"ی": {
|
||||
"relevant": [
|
||||
{ "code": 1746, "label": "ے" },
|
||||
{ "code": 1610, "label": "ي" },
|
||||
{ "code": 1744, "label": "ې" },
|
||||
{ "code": 1741, "label": "ۍ" },
|
||||
{ "code": 1742, "label": "ێ" },
|
||||
{ "code": 1597, "label": "ؽ" }
|
||||
]
|
||||
},
|
||||
"ۆ": {
|
||||
"relevant": [
|
||||
{ "code": 1743, "label": "ۏ" },
|
||||
{ "code": 1735, "label": "ۇ" },
|
||||
{ "code": 1737, "label": "ۉ" },
|
||||
{ "code": 1738, "label": "ۊ" },
|
||||
{ "code": 1572, "label": "ؤ" },
|
||||
{ "code": 1739, "label": "ۋ" }
|
||||
]
|
||||
},
|
||||
"~right": {
|
||||
"main": { "code": 1567, "label": "؟" },
|
||||
"relevant": [
|
||||
{ "code": 1600, "label": "ــ" },
|
||||
{ "code": 33, "label": "!" },
|
||||
{ "code": 1548, "label": "،" },
|
||||
{ "code": 44, "label": "," },
|
||||
{ "code": 1549, "label": "؍" },
|
||||
{ "code": 1563, "label": "؛" },
|
||||
{ "code": 59, "label": ";" },
|
||||
{ "code": 58, "label": ":" },
|
||||
{ "code": 64, "label": "@" },
|
||||
{ "code": 35, "label": "#" },
|
||||
{ "code": 42, "label": "*" },
|
||||
{ "code": 95, "label": "_" },
|
||||
{ "code": 45, "label": "-" }
|
||||
]
|
||||
}
|
||||
},
|
||||
"uri": {
|
||||
"~right": {
|
||||
"main": { "code": -255, "label": ".krd"},
|
||||
"relevant": [
|
||||
{ "code": -255, "label": ".gov" },
|
||||
{ "code": -255, "label": ".edu" },
|
||||
{ "code": -255, "label": ".com" },
|
||||
{ "code": -255, "label": ".org" },
|
||||
{ "code": -255, "label": ".net" },
|
||||
{ "code": -255, "label": ".iq" },
|
||||
{ "code": -255, "label": ".tv" }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
57
app/src/main/assets/ime/text/characters/kurdish.json
Normal file
57
app/src/main/assets/ime/text/characters/kurdish.json
Normal file
@ -0,0 +1,57 @@
|
||||
{
|
||||
"type": "characters",
|
||||
"name": "kurdish",
|
||||
"authors": [ "GoRaN" ],
|
||||
"direction": "rtl",
|
||||
"modifier": "kurdish",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": 1602, "label": "ق", "popup": {
|
||||
"main": { "code": 1647, "label": "ٯ" }
|
||||
} },
|
||||
{ "code": 1608, "label": "و", "popup": {
|
||||
"main": { "code": -255, "label": "وو" }
|
||||
} },
|
||||
{ "code": 1749, "label": "ﻪ", "popup": {
|
||||
"main": { "code": 1577, "label": "ة" }
|
||||
} },
|
||||
{ "code": 1585, "label": "ر" },
|
||||
{ "code": 1578, "label": "ت", "popup": {
|
||||
"main": { "code": 1591, "label": "ط" }
|
||||
} },
|
||||
{ "code": 1740, "label": "ی" },
|
||||
{ "code": 1574, "label": "ﺋ", "popup": {
|
||||
"main": { "code": 1569, "label": "ء" }
|
||||
} },
|
||||
{ "code": 1593, "label": "ع" },
|
||||
{ "code": 1734, "label": "ۆ" },
|
||||
{ "code": 1662, "label": "پ", "popup": {
|
||||
"main": { "code": 1579, "label": "ث" }
|
||||
} }
|
||||
],
|
||||
[
|
||||
{ "code": 1575, "label": "ا" },
|
||||
{ "code": 1587, "label": "س" },
|
||||
{ "code": 1588, "label": "ش" },
|
||||
{ "code": 1583, "label": "د" },
|
||||
{ "code": 1601, "label": "ف" },
|
||||
{ "code": 1607, "label": "ھ" },
|
||||
{ "code": 1688, "label": "ژ" },
|
||||
{ "code": 1604, "label": "ل" },
|
||||
{ "code": 1705, "label": "ک" },
|
||||
{ "code": 1711, "label": "گ" }
|
||||
],
|
||||
[
|
||||
{ "code": 1586, "label": "ز", "popup": {
|
||||
"main": {"code": 1592, "label": "ظ" }
|
||||
} },
|
||||
{ "code": 1582, "label": "خ" },
|
||||
{ "code": 1580, "label": "ج" },
|
||||
{ "code": 1670, "label": "چ" },
|
||||
{ "code": 1581, "label": "ح" },
|
||||
{ "code": 1576, "label": "ب" },
|
||||
{ "code": 1606, "label": "ن" },
|
||||
{ "code": 1605, "label": "م" }
|
||||
]
|
||||
]
|
||||
}
|
27
app/src/main/assets/ime/text/characters/mod/kurdish.json
Normal file
27
app/src/main/assets/ime/text/characters/mod/kurdish.json
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "characters/mod",
|
||||
"name": "kurdish",
|
||||
"authors": [ "GoRaN" ],
|
||||
"direction": "rtl",
|
||||
"arrangement": [
|
||||
[
|
||||
{ "code": 0, "type": "placeholder" },
|
||||
{ "code": -5, "label": "delete", "type": "enter_editing" }
|
||||
],
|
||||
[
|
||||
{ "code": -202, "label": "view_symbols", "type": "system_gui" },
|
||||
{ "code": 64, "label": "@", "groupId": 1, "variation": "email_address" },
|
||||
{ "code": 1567, "label": "؟", "groupId": 1, "variation": "normal" },
|
||||
{ "code": 1548, "label": "،", "groupId": 1, "variation": "password" },
|
||||
{ "code": 47, "label": "/", "groupId": 1, "variation": "uri" },
|
||||
{ "code": -210, "label": "language_switch", "type": "system_gui" },
|
||||
{ "code": -213, "label": "switch_to_media_context", "type": "system_gui" },
|
||||
{ "code": 32, "label": " " },
|
||||
{ "code": 46, "label": ".", "groupId": 2, "variation": "email_address" },
|
||||
{ "code": 46, "label": ".", "groupId": 2, "variation": "normal" },
|
||||
{ "code": 46, "label": ".", "groupId": 2, "variation": "password" },
|
||||
{ "code": 46, "label": ".", "groupId": 2, "variation": "uri" },
|
||||
{ "code": 10, "label": "enter", "groupId": 3, "type": "enter_editing" }
|
||||
]
|
||||
]
|
||||
}
|
@ -59,6 +59,15 @@
|
||||
"smartbarButton": {
|
||||
"background": "@key/background",
|
||||
"foreground": "@key/foreground"
|
||||
},
|
||||
"extractEditLayout": {
|
||||
"background": "#E8E8E8",
|
||||
"foreground": "@window/textColor",
|
||||
"foregroundAlt": "#8A8A8A"
|
||||
},
|
||||
"extractActionButton": {
|
||||
"background": "@smartbarButton/background",
|
||||
"foreground": "@smartbarButton/foreground"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -63,6 +63,15 @@
|
||||
"smartbarButton": {
|
||||
"background": "#FFFFFF",
|
||||
"foreground": "@window/textColor"
|
||||
},
|
||||
"extractEditLayout": {
|
||||
"background": "#E8E8E8",
|
||||
"foreground": "@window/textColor",
|
||||
"foregroundAlt": "#8A8A8A"
|
||||
},
|
||||
"extractActionButton": {
|
||||
"background": "@smartbarButton/background",
|
||||
"foreground": "@smartbarButton/foreground"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -59,6 +59,15 @@
|
||||
"smartbarButton": {
|
||||
"background": "@key/background",
|
||||
"foreground": "@key/foreground"
|
||||
},
|
||||
"extractEditLayout": {
|
||||
"background": "#282828",
|
||||
"foreground": "@window/textColor",
|
||||
"foregroundAlt": "#73FFFFFF"
|
||||
},
|
||||
"extractActionButton": {
|
||||
"background": "@smartbarButton/background",
|
||||
"foreground": "@smartbarButton/foreground"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -63,6 +63,15 @@
|
||||
"smartbarButton": {
|
||||
"background": "#424242",
|
||||
"foreground": "@window/textColor"
|
||||
},
|
||||
"extractEditLayout": {
|
||||
"background": "#282828",
|
||||
"foreground": "@window/textColor",
|
||||
"foregroundAlt": "#73FFFFFF"
|
||||
},
|
||||
"extractActionButton": {
|
||||
"background": "@smartbarButton/background",
|
||||
"foreground": "@smartbarButton/foreground"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -23,16 +23,19 @@ import android.content.Intent
|
||||
import android.content.res.ColorStateList
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.Color
|
||||
import android.inputmethodservice.ExtractEditText
|
||||
import android.inputmethodservice.InputMethodService
|
||||
import android.media.AudioManager
|
||||
import android.os.*
|
||||
import android.provider.Settings
|
||||
import android.view.Gravity
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.view.inputmethod.InputConnection
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.Button
|
||||
import com.squareup.moshi.Json
|
||||
import dev.patrickgold.florisboard.BuildConfig
|
||||
import dev.patrickgold.florisboard.R
|
||||
@ -67,11 +70,12 @@ class FlorisBoard : InputMethodService(), ClipboardManager.OnPrimaryClipChangedL
|
||||
|
||||
val context: Context
|
||||
get() = inputWindowView?.context ?: this
|
||||
private var extractEditLayout: WeakReference<View?> = WeakReference(null)
|
||||
var inputView: InputView? = null
|
||||
private set
|
||||
private var inputWindowView: InputWindowView? = null
|
||||
var popupLayerView: PopupLayerView? = null
|
||||
private set
|
||||
private var inputWindowView: InputWindowView? = null
|
||||
private var eventListeners: MutableList<WeakReference<EventListener?>?> = mutableListOf()
|
||||
|
||||
private var audioManager: AudioManager? = null
|
||||
@ -204,16 +208,34 @@ class FlorisBoard : InputMethodService(), ClipboardManager.OnPrimaryClipChangedL
|
||||
baseContext.setTheme(currentThemeResId)
|
||||
|
||||
inputWindowView = layoutInflater.inflate(R.layout.florisboard, null) as InputWindowView
|
||||
popupLayerView = inputWindowView?.findViewById(R.id.popup_layer)
|
||||
|
||||
eventListeners.toList().forEach { it?.get()?.onCreateInputView() }
|
||||
|
||||
return inputWindowView
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable the default candidates view.
|
||||
*/
|
||||
override fun onCreateCandidatesView(): View? {
|
||||
return null
|
||||
}
|
||||
|
||||
@SuppressLint("InflateParams")
|
||||
override fun onCreateExtractTextView(): View? {
|
||||
val eel = super.onCreateExtractTextView()
|
||||
extractEditLayout = WeakReference(eel)
|
||||
return eel
|
||||
}
|
||||
|
||||
fun registerInputView(inputView: InputView) {
|
||||
Timber.i("registerInputView($inputView)")
|
||||
|
||||
window?.window?.findViewById<View>(android.R.id.content)?.let { content ->
|
||||
popupLayerView = PopupLayerView(content.context)
|
||||
if (content is ViewGroup) {
|
||||
content.addView(popupLayerView)
|
||||
}
|
||||
}
|
||||
this.inputView = inputView
|
||||
initializeOneHandedEnvironment()
|
||||
updateSoftInputWindowLayoutParameters()
|
||||
@ -375,6 +397,25 @@ class FlorisBoard : InputMethodService(), ClipboardManager.OnPrimaryClipChangedL
|
||||
inputView?.oneHandedCtrlCloseStart?.imageTintList = it
|
||||
inputView?.oneHandedCtrlCloseEnd?.imageTintList = it
|
||||
}
|
||||
inputView?.invalidate()
|
||||
|
||||
// Update ExtractTextView theme
|
||||
extractEditLayout.get()?.let { eel ->
|
||||
if (eel is ViewGroup) {
|
||||
eel.setBackgroundColor(theme.getAttr(Theme.Attr.EXTRACT_EDIT_LAYOUT_BACKGROUND).toSolidColor().color)
|
||||
eel.findViewById<ExtractEditText>(android.R.id.inputExtractEditText)?.let { textView ->
|
||||
textView.background?.setTint(theme.getAttr(Theme.Attr.WINDOW_COLOR_PRIMARY).toSolidColor().color)
|
||||
textView.setTextColor(theme.getAttr(Theme.Attr.EXTRACT_EDIT_LAYOUT_FOREGROUND).toSolidColor().color)
|
||||
textView.setHintTextColor(theme.getAttr(Theme.Attr.EXTRACT_EDIT_LAYOUT_FOREGROUND_ALT).toSolidColor().color)
|
||||
textView.highlightColor = theme.getAttr(Theme.Attr.WINDOW_COLOR_PRIMARY).toSolidColor().color
|
||||
}
|
||||
eel.findViewWithType(Button::class)?.let { actionButton ->
|
||||
actionButton.setBackgroundColor(theme.getAttr(Theme.Attr.EXTRACT_ACTION_BUTTON_BACKGROUND).toSolidColor().color)
|
||||
actionButton.setTextColor(theme.getAttr(Theme.Attr.EXTRACT_ACTION_BUTTON_FOREGROUND).toSolidColor().color)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
eventListeners.toList().forEach { it?.get()?.onApplyThemeAttributes() }
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
|
||||
package dev.patrickgold.florisboard.ime.media.emoji
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* Enum for emoji category.
|
||||
@ -38,9 +38,8 @@ enum class EmojiCategory {
|
||||
}
|
||||
|
||||
companion object {
|
||||
@SuppressLint("DefaultLocale")
|
||||
fun fromString(string: String): EmojiCategory {
|
||||
return valueOf(string.replace(" & ", "_").toUpperCase())
|
||||
return valueOf(string.replace(" & ", "_").toUpperCase(Locale.ENGLISH))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -20,12 +20,14 @@ import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.MotionEvent
|
||||
import android.view.ViewGroup
|
||||
import android.widget.FrameLayout
|
||||
import dev.patrickgold.florisboard.ime.core.PrefHelper
|
||||
|
||||
/**
|
||||
* Basic helper view class which acts as a non-interactive layer view, which sits above the whole
|
||||
* input UI. Automatically rejects any touch events and passes it through to the View below.
|
||||
*/
|
||||
class PopupLayerView : FrameLayout {
|
||||
private val prefs: PrefHelper = PrefHelper.getDefaultInstance(context)
|
||||
|
||||
constructor(context: Context) : this(context, null)
|
||||
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
||||
@ -34,6 +36,9 @@ class PopupLayerView : FrameLayout {
|
||||
background = null
|
||||
isClickable = false
|
||||
isFocusable = false
|
||||
layoutParams = ViewGroup.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
}
|
||||
|
||||
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
|
||||
|
@ -16,8 +16,8 @@
|
||||
|
||||
package dev.patrickgold.florisboard.ime.text.key
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import com.squareup.moshi.FromJson
|
||||
import java.util.*
|
||||
|
||||
enum class KeyVariation {
|
||||
ALL,
|
||||
@ -27,9 +27,8 @@ enum class KeyVariation {
|
||||
URI;
|
||||
|
||||
companion object {
|
||||
@SuppressLint("DefaultLocale")
|
||||
fun fromString(string: String): KeyVariation {
|
||||
return valueOf(string.toUpperCase())
|
||||
return valueOf(string.toUpperCase(Locale.ENGLISH))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
package dev.patrickgold.florisboard.ime.text.layout
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import com.squareup.moshi.FromJson
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* Defines the type of the layout.
|
||||
@ -19,15 +19,13 @@ enum class LayoutType {
|
||||
SYMBOLS2,
|
||||
SYMBOLS2_MOD;
|
||||
|
||||
@SuppressLint("DefaultLocale")
|
||||
override fun toString(): String {
|
||||
return super.toString().replace("_", "/").toLowerCase()
|
||||
return super.toString().replace("_", "/").toLowerCase(Locale.ENGLISH)
|
||||
}
|
||||
|
||||
companion object {
|
||||
@SuppressLint("DefaultLocale")
|
||||
fun fromString(string: String): LayoutType {
|
||||
return valueOf(string.replace("/", "_").toUpperCase())
|
||||
return valueOf(string.replace("/", "_").toUpperCase(Locale.ENGLISH))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -80,20 +80,20 @@ open class Theme(
|
||||
*/
|
||||
fun getUiAttrNameString(context: Context, attrName: String): String {
|
||||
val strId = when (attrName) {
|
||||
"background" -> R.string.settings__theme__attr_background
|
||||
"backgroundActive" -> R.string.settings__theme__attr_backgroundActive
|
||||
"backgroundPressed" -> R.string.settings__theme__attr_backgroundPressed
|
||||
"foreground" -> R.string.settings__theme__attr_foreground
|
||||
"foregroundAlt" -> R.string.settings__theme__attr_foregroundAlt
|
||||
"foregroundPressed" -> R.string.settings__theme__attr_foregroundPressed
|
||||
"showBorder" -> R.string.settings__theme__attr_showBorder
|
||||
"colorPrimary" -> R.string.settings__theme__attr_colorPrimary
|
||||
"colorPrimaryDark" -> R.string.settings__theme__attr_colorPrimaryDark
|
||||
"colorAccent" -> R.string.settings__theme__attr_colorAccent
|
||||
"navigationBarColor" -> R.string.settings__theme__attr_navBarColor
|
||||
"navigationBarLight" -> R.string.settings__theme__attr_navBarLight
|
||||
"semiTransparentColor" -> R.string.settings__theme__attr_semiTransparentColor
|
||||
"textColor" -> R.string.settings__theme__attr_textColor
|
||||
"background" -> R.string.settings__theme__attr_background
|
||||
"backgroundActive" -> R.string.settings__theme__attr_backgroundActive
|
||||
"backgroundPressed" -> R.string.settings__theme__attr_backgroundPressed
|
||||
"foreground" -> R.string.settings__theme__attr_foreground
|
||||
"foregroundAlt" -> R.string.settings__theme__attr_foregroundAlt
|
||||
"foregroundPressed" -> R.string.settings__theme__attr_foregroundPressed
|
||||
"showBorder" -> R.string.settings__theme__attr_showBorder
|
||||
"colorPrimary" -> R.string.settings__theme__attr_colorPrimary
|
||||
"colorPrimaryDark" -> R.string.settings__theme__attr_colorPrimaryDark
|
||||
"colorAccent" -> R.string.settings__theme__attr_colorAccent
|
||||
"navigationBarColor" -> R.string.settings__theme__attr_navBarColor
|
||||
"navigationBarLight" -> R.string.settings__theme__attr_navBarLight
|
||||
"semiTransparentColor" -> R.string.settings__theme__attr_semiTransparentColor
|
||||
"textColor" -> R.string.settings__theme__attr_textColor
|
||||
else -> null
|
||||
}
|
||||
return if (strId != null) {
|
||||
@ -121,15 +121,17 @@ open class Theme(
|
||||
)
|
||||
else -> {
|
||||
val strId = when (groupName) {
|
||||
"window" -> R.string.settings__theme__group_window
|
||||
"keyboard" -> R.string.settings__theme__group_keyboard
|
||||
"key" -> R.string.settings__theme__group_key
|
||||
"media" -> R.string.settings__theme__group_media
|
||||
"oneHanded" -> R.string.settings__theme__group_oneHanded
|
||||
"popup" -> R.string.settings__theme__group_popup
|
||||
"privateMode" -> R.string.settings__theme__group_privateMode
|
||||
"smartbar" -> R.string.settings__theme__group_smartbar
|
||||
"smartbarButton" -> R.string.settings__theme__group_smartbarButton
|
||||
"window" -> R.string.settings__theme__group_window
|
||||
"keyboard" -> R.string.settings__theme__group_keyboard
|
||||
"key" -> R.string.settings__theme__group_key
|
||||
"media" -> R.string.settings__theme__group_media
|
||||
"oneHanded" -> R.string.settings__theme__group_oneHanded
|
||||
"popup" -> R.string.settings__theme__group_popup
|
||||
"privateMode" -> R.string.settings__theme__group_privateMode
|
||||
"smartbar" -> R.string.settings__theme__group_smartbar
|
||||
"smartbarButton" -> R.string.settings__theme__group_smartbarButton
|
||||
"extractEditLayout" -> R.string.settings__theme__group_extractEditLayout
|
||||
"extractActionButton" -> R.string.settings__theme__group_extractActionButton
|
||||
else -> null
|
||||
}
|
||||
if (strId != null) {
|
||||
@ -210,6 +212,15 @@ open class Theme(
|
||||
Pair("smartbarButton", mapOf(
|
||||
Pair("background", ThemeValue.fromString("@key/background")),
|
||||
Pair("foreground", ThemeValue.fromString("@key/foreground")),
|
||||
)),
|
||||
Pair("extractEditLayout", mapOf(
|
||||
Pair("background", bgColor),
|
||||
Pair("foreground", ThemeValue.fromString("@window/textColor")),
|
||||
Pair("foregroundAlt", ThemeValue.fromString("#73FFFFFF")),
|
||||
)),
|
||||
Pair("extractActionButton", mapOf(
|
||||
Pair("background", ThemeValue.fromString("@smartbarButton/background")),
|
||||
Pair("foreground", ThemeValue.fromString("@smartbarButton/foreground")),
|
||||
))
|
||||
)
|
||||
)
|
||||
@ -306,7 +317,7 @@ open class Theme(
|
||||
getAttrOrNull(ref.copy(group = "${ref.group}::$s2"))?.let { return it }
|
||||
}
|
||||
getAttrOrNull(ref)?.let { return it }
|
||||
return ThemeValue.SolidColor(0)
|
||||
return BASE_THEME.getAttrOrNull(ref) ?: ThemeValue.SolidColor(0)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -367,6 +378,13 @@ open class Theme(
|
||||
|
||||
val SMARTBAR_BUTTON_BACKGROUND = ThemeValue.Reference("smartbarButton", "background")
|
||||
val SMARTBAR_BUTTON_FOREGROUND = ThemeValue.Reference("smartbarButton", "foreground")
|
||||
|
||||
val EXTRACT_EDIT_LAYOUT_BACKGROUND = ThemeValue.Reference("extractEditLayout", "background")
|
||||
val EXTRACT_EDIT_LAYOUT_FOREGROUND = ThemeValue.Reference("extractEditLayout", "foreground")
|
||||
val EXTRACT_EDIT_LAYOUT_FOREGROUND_ALT = ThemeValue.Reference("extractEditLayout", "foregroundAlt")
|
||||
|
||||
val EXTRACT_ACTION_BUTTON_BACKGROUND = ThemeValue.Reference("extractActionButton", "background")
|
||||
val EXTRACT_ACTION_BUTTON_FOREGROUND = ThemeValue.Reference("extractActionButton", "foreground")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -261,19 +261,24 @@ class ThemeEditorActivity : AppCompatActivity() {
|
||||
val sortedMap = baseMap.toList().sortedBy { (_, v) -> v }.toMap().toMutableMap()
|
||||
val groupIds = sortedMap.keys.toMutableList()
|
||||
val groupNames = sortedMap.values.toMutableList()
|
||||
if (groupNames.contains("keyboard")) {
|
||||
val windowGroupId = groupIds[groupNames.indexOf("keyboard")]
|
||||
groupIds.remove(windowGroupId)
|
||||
groupNames.remove("keyboard")
|
||||
groupIds.add(0, windowGroupId)
|
||||
groupNames.add(0, "keyboard")
|
||||
}
|
||||
if (groupNames.contains("window")) {
|
||||
val windowGroupId = groupIds[groupNames.indexOf("window")]
|
||||
groupIds.remove(windowGroupId)
|
||||
groupNames.remove("window")
|
||||
groupIds.add(0, windowGroupId)
|
||||
groupNames.add(0, "window")
|
||||
listOf(
|
||||
Pair("keyboard", true),
|
||||
Pair("window", true),
|
||||
Pair("extractEditLayout", false),
|
||||
Pair("extractActionButton", false),
|
||||
).forEach { (groupName, addFirst) ->
|
||||
if (groupNames.contains(groupName)) {
|
||||
val groupId = groupIds[groupNames.indexOf(groupName)]
|
||||
groupIds.remove(groupId)
|
||||
groupNames.remove(groupName)
|
||||
if (addFirst) {
|
||||
groupIds.add(0, groupId)
|
||||
groupNames.add(0, groupName)
|
||||
} else {
|
||||
groupIds.add(groupId)
|
||||
groupNames.add(groupName)
|
||||
}
|
||||
}
|
||||
}
|
||||
for ((n, groupId) in groupIds.withIndex()) {
|
||||
binding.themeAttributes.findViewById<ThemeAttrGroupView>(groupId)?.let { groupView ->
|
||||
|
@ -1,6 +1,5 @@
|
||||
package dev.patrickgold.florisboard.util
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.ContextWrapper
|
||||
import android.content.res.ColorStateList
|
||||
@ -11,6 +10,7 @@ import android.widget.Button
|
||||
import android.widget.ImageView
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.children
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
fun getColorFromAttr(
|
||||
context: Context,
|
||||
@ -73,6 +73,18 @@ fun refreshLayoutOf(view: View?) {
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T : View> ViewGroup.findViewWithType(type: KClass<T>): T? {
|
||||
for (child in this.children) {
|
||||
if (type.isInstance(child)) {
|
||||
return child as T
|
||||
} else if (child is ViewGroup) {
|
||||
child.findViewWithType(type)?.let { return it }
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Context extension function to get the Activity from the Context. Originally written by Vlad as
|
||||
* an SO answer. Modified to return an AppCompatActivity, as FlorisBoard relies on some compat
|
||||
|
@ -81,9 +81,4 @@
|
||||
|
||||
</dev.patrickgold.florisboard.ime.core.InputView>
|
||||
|
||||
<dev.patrickgold.florisboard.ime.popup.PopupLayerView
|
||||
android:id="@+id/popup_layer"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
</dev.patrickgold.florisboard.ime.core.InputWindowView>
|
||||
|
@ -134,6 +134,8 @@
|
||||
<string name="settings__theme__group_privateMode" comment="Theme group label">Private mode</string>
|
||||
<string name="settings__theme__group_smartbar" comment="Theme group label">Smartbar</string>
|
||||
<string name="settings__theme__group_smartbarButton" comment="Theme group label">Smartbar button</string>
|
||||
<string name="settings__theme__group_extractEditLayout" comment="Theme group label">Extract edit layout</string>
|
||||
<string name="settings__theme__group_extractActionButton" comment="Theme group label">Extract action button</string>
|
||||
<string name="settings__theme__group_custom" comment="Theme group label (%s is custom group name)">Custom group (%s)</string>
|
||||
|
||||
<string name="settings__theme__attr_background" comment="Theme attribute label">Background color</string>
|
||||
|
Loading…
Reference in New Issue
Block a user