refer to our keyboard attributes, not the system ones

This commit is contained in:
tibbi 2022-01-08 23:08:08 +01:00
parent 731c599c78
commit ed00de9606
5 changed files with 194 additions and 215 deletions

View File

@ -24,9 +24,9 @@ import android.text.TextUtils
import android.util.TypedValue
import android.util.Xml
import androidx.annotation.XmlRes
import com.simplemobiletools.commons.helpers.mydebug
import com.simplemobiletools.keyboard.R
import org.xmlpull.v1.XmlPullParserException
import java.io.IOException
import java.io.FileNotFoundException
import java.util.*
/**
@ -87,7 +87,7 @@ class MyKeyboard {
var mKeys: MutableList<Key?>? = null
/** List of modifier keys such as Shift & Alt, if any */
private var mModifierKeys: MutableList<Key?>? = null
private var mModifierKeys = ArrayList<Key?>()
/** Width of the screen available to fit the keyboard */
private var mDisplayWidth = 0
@ -160,6 +160,7 @@ class MyKeyboard {
/** Vertical gap following this row. */
var verticalGap = 0
var mKeys = ArrayList<Key>()
/**
@ -255,8 +256,7 @@ class MyKeyboard {
/**
* Flags that specify the anchoring to edges of the keyboard for detecting touch events
* that are just out of the boundary of the key. This is a bit mask of
* [MyKeyboard.EDGE_LEFT], [MyKeyboard.EDGE_RIGHT], [MyKeyboard.EDGE_TOP] and
* [MyKeyboard.EDGE_BOTTOM].
* [MyKeyboard.EDGE_LEFT], [MyKeyboard.EDGE_RIGHT], [MyKeyboard.EDGE_TOP] and [MyKeyboard.EDGE_BOTTOM].
*/
var edgeFlags: Int
@ -275,8 +275,7 @@ class MyKeyboard {
/** Create a key with the given top-left coordinate and extract its attributes from
* the XML parser.
* @param res resources associated with the caller's context
* @param parent the row that this key belongs to. The row must already be attached to
* a [Keyboard].
* @param parent the row that this key belongs to. The row must already be attached to a [MyKeyboard].
* @param x the x coordinate of the top-left
* @param y the y coordinate of the top-left
* @param parser the XML parser containing the attributes for this key
@ -315,8 +314,9 @@ class MyKeyboard {
icon?.setBounds(0, 0, icon!!.intrinsicWidth, icon!!.intrinsicHeight)
label = a.getText(R.styleable.Keyboard_Key_keyLabel)
label = a.getText(R.styleable.Keyboard_Key_keyLabel) ?: ""
text = a.getText(R.styleable.Keyboard_Key_keyOutputText)
if (!TextUtils.isEmpty(label)) {
codes = arrayListOf(label[0].toInt())
}
@ -378,6 +378,7 @@ class MyKeyboard {
try {
values[count++] = st.nextToken().toInt()
} catch (nfe: NumberFormatException) {
mydebug("NumberFormatException $nfe")
}
}
return values
@ -454,26 +455,6 @@ class MyKeyboard {
}
}
/**
* Creates a keyboard from the given xml key layout file. Weeds out rows
* that have a keyboard mode defined but don't match the specified mode.
* @param context the application or service context
* @param xmlLayoutResId the resource file that contains the keyboard layout and keys.
* @param modeId keyboard mode identifier
* @param width sets width of keyboard
* @param height sets height of keyboard
*/
constructor(context: Context, @XmlRes xmlLayoutResId: Int, modeId: Int, width: Int, height: Int) {
mDisplayWidth = width
mDisplayHeight = height
mDefaultHorizontalGap = 0
mDefaultWidth = mDisplayWidth / 10
mDefaultVerticalGap = 0
mDefaultHeight = mDefaultWidth
mKeys = ArrayList()
mKeyboardMode = modeId
loadKeyboard(context, context.resources.getXml(xmlLayoutResId))
}
/**
* Creates a keyboard from the given xml key layout file. Weeds out rows
* that have a keyboard mode defined but don't match the specified mode.
@ -640,12 +621,12 @@ class MyKeyboard {
* point is out of range, then an array of size zero is returned.
*/
fun getNearestKeys(x: Int, y: Int): IntArray {
if (x in 0 until minWidth && y >= 0 && y < height) {
/*if (x in 0 until minWidth && y >= 0 && y < height) {
val index: Int = y / mCellHeight * GRID_WIDTH + x / mCellWidth
if (index < GRID_SIZE) {
return mGridNeighbors[index]!!
}
}
}*/
return IntArray(0)
}
@ -660,25 +641,24 @@ class MyKeyboard {
private fun loadKeyboard(context: Context, parser: XmlResourceParser) {
var inKey = false
var inRow = false
val leftMostKey = false
var row = 0
var x = 0
var y = 0
var key: Key? = null
var currentRow: Row? = null
val res = context.resources
var skipRow = false
try {
var event: Int
while (parser.next().also { event = it } != XmlResourceParser.END_DOCUMENT) {
if (event == XmlResourceParser.START_TAG) {
val tag = parser.name
if (TAG_ROW == tag) {
//mydebug("row $currentRow")
inRow = true
x = 0
currentRow = createRowFromXml(res, parser)
rows.add(currentRow)
skipRow = currentRow.mode != 0 && currentRow.mode != mKeyboardMode
val skipRow = currentRow.mode != 0 && currentRow.mode != mKeyboardMode
if (skipRow) {
skipToEndOfRow(parser)
inRow = false
@ -696,9 +676,9 @@ class MyKeyboard {
break
}
}
mModifierKeys!!.add(key)
mModifierKeys.add(key)
} else if (key.codes[0] == KEYCODE_ALT) {
mModifierKeys!!.add(key)
mModifierKeys.add(key)
}
currentRow.mKeys.add(key)
} else if (TAG_KEYBOARD == tag) {
@ -719,12 +699,12 @@ class MyKeyboard {
}
}
}
} catch (e: Exception) {
} catch (e: FileNotFoundException) {
mydebug("Exception $e")
}
height = y - mDefaultVerticalGap
}
@Throws(XmlPullParserException::class, IOException::class)
private fun skipToEndOfRow(parser: XmlResourceParser) {
var event: Int
while (parser.next().also { event = it } != XmlResourceParser.END_DOCUMENT) {

View File

@ -1,4 +1,5 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -9,11 +10,10 @@
android:id="@+id/keyboardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@android:color/transparent"
android:keyPreviewLayout="@layout/keyboard_key_preview"
android:keyTextSize="22sp"
android:popupLayout="@layout/keyboard_popup_keyboard"
app:keyPreviewLayout="@layout/keyboard_key_preview"
app:keyTextSize="22sp"
app:popupLayout="@layout/keyboard_popup_keyboard"
tools:ignore="ResourceCycle" />
<ImageButton
@ -23,7 +23,6 @@
android:layout_gravity="center"
android:layout_marginStart="8dp"
android:background="@android:color/transparent"
android:clickable="true"
android:src="@drawable/ic_cross_vector" />
</LinearLayout>

View File

@ -3,4 +3,89 @@
<declare-styleable name="KeyboardViewPreviewState">
<attr name="state_long_pressable" format="boolean" />
</declare-styleable>
<declare-styleable name="MyKeyboardView">
<attr name="keyboardViewStyle" format="reference" />
<!-- Image for the key. This image needs to be a StateListDrawable, with the following possible states:
normal, pressed, checkable, checkable+pressed, checkable+checked, checkable+checked+pressed. -->
<attr name="keyBackground" format="reference" />
<!-- Size of the text for character keys. -->
<attr name="keyTextSize" format="dimension" />
<!-- Size of the text for custom keys with some text and no icon. -->
<attr name="labelTextSize" format="dimension" />
<!-- Color to use for the label in a key. -->
<attr name="keyTextColor" format="color" />
<!-- Layout resource for key press feedback. -->
<attr name="keyPreviewLayout" format="reference" />
<!-- Vertical offset of the key press feedback from the key. -->
<attr name="keyPreviewOffset" format="dimension" />
<!-- Height of the key press feedback popup. -->
<attr name="keyPreviewHeight" format="dimension" />
<!-- Amount to offset the touch Y coordinate by, for bias correction. -->
<attr name="verticalCorrection" format="dimension" />
<!-- Layout resource for popup keyboards. -->
<attr name="popupLayout" format="reference" />
<attr name="shadowColor" format="color" />
<!-- Horizontal offset of the text shadow. -->
<attr name="shadowDx" format="dimension" />
<!-- Vertical offset of the text shadow. -->
<attr name="shadowDy" format="dimension" />
<!-- Blur radius of the text shadow. -->
<attr name="shadowRadius" format="float" />
</declare-styleable>
<declare-styleable name="Keyboard">
<!-- Default width of a key, in pixels or percentage of display width. -->
<attr name="keyWidth" format="dimension|fraction" />
<!-- Default height of a key, in pixels or percentage of display width. -->
<attr name="keyHeight" format="dimension|fraction" />
<!-- Default horizontal gap between keys. -->
<attr name="horizontalGap" format="dimension|fraction" />
<!-- Default vertical gap between rows of keys. -->
<attr name="verticalGap" format="dimension|fraction" />
</declare-styleable>
<declare-styleable name="Keyboard_Row">
<!-- Row edge flags. -->
<attr name="rowEdgeFlags">
<!-- Row is anchored to the top of the keyboard. -->
<flag name="top" value="4" />
<!-- Row is anchored to the bottom of the keyboard. -->
<flag name="bottom" value="8" />
</attr>
<!-- Mode of the keyboard. If the mode doesn't match the requested keyboard mode, the row will be skipped. -->
<attr name="keyboardMode" format="reference" />
</declare-styleable>
<declare-styleable name="Keyboard_Key">
<!-- The unicode value or comma-separated values that this key outputs. -->
<attr name="codes" format="integer|string" />
<!-- The XML keyboard layout of any popup keyboard. -->
<attr name="popupKeyboard" format="reference" />
<!-- The characters to display in the popup keyboard. -->
<attr name="popupCharacters" format="string" />
<!-- Key edge flags. -->
<attr name="keyEdgeFlags">
<!-- Key is anchored to the left of the keyboard. -->
<flag name="left" value="1" />
<!-- Key is anchored to the right of the keyboard. -->
<flag name="right" value="2" />
</attr>
<!-- Whether this is a modifier key such as Alt or Shift. -->
<attr name="isModifier" format="boolean" />
<!-- Whether this is a toggle key. -->
<attr name="isSticky" format="boolean" />
<!-- Whether long-pressing on this key will make it repeat. -->
<attr name="isRepeatable" format="boolean" />
<!-- The icon to show in the popup preview. -->
<attr name="iconPreview" format="reference" />
<!-- The string of characters to output when this key is pressed. -->
<attr name="keyOutputText" format="string" />
<!-- The label to display on the key. -->
<attr name="keyLabel" format="string" />
<!-- The icon to display on the key instead of the label. -->
<attr name="keyIcon" format="reference" />
<!-- Mode of the keyboard. If the mode doesn't match the requested keyboard mode, the key will be skipped. -->
<attr name="keyboardMode" />
</declare-styleable>
</resources>

View File

@ -20,89 +20,4 @@
<item name="shadowColor">#BB000000</item>
<item name="shadowRadius">2.75</item>
</style>
<declare-styleable name="MyKeyboardView">
<attr name="keyboardViewStyle" format="reference" />
<!-- Image for the key. This image needs to be a StateListDrawable, with the following possible states:
normal, pressed, checkable, checkable+pressed, checkable+checked, checkable+checked+pressed. -->
<attr name="keyBackground" format="reference" />
<!-- Size of the text for character keys. -->
<attr name="keyTextSize" format="dimension" />
<!-- Size of the text for custom keys with some text and no icon. -->
<attr name="labelTextSize" format="dimension" />
<!-- Color to use for the label in a key. -->
<attr name="keyTextColor" format="color" />
<!-- Layout resource for key press feedback. -->
<attr name="keyPreviewLayout" format="reference" />
<!-- Vertical offset of the key press feedback from the key. -->
<attr name="keyPreviewOffset" format="dimension" />
<!-- Height of the key press feedback popup. -->
<attr name="keyPreviewHeight" format="dimension" />
<!-- Amount to offset the touch Y coordinate by, for bias correction. -->
<attr name="verticalCorrection" format="dimension" />
<!-- Layout resource for popup keyboards. -->
<attr name="popupLayout" format="reference" />
<attr name="shadowColor" format="color" />
<!-- Horizontal offset of the text shadow. -->
<attr name="shadowDx" format="dimension" />
<!-- Vertical offset of the text shadow. -->
<attr name="shadowDy" format="dimension" />
<!-- Blur radius of the text shadow. -->
<attr name="shadowRadius" format="float" />
</declare-styleable>
<declare-styleable name="Keyboard">
<!-- Default width of a key, in pixels or percentage of display width. -->
<attr name="keyWidth" format="dimension|fraction" />
<!-- Default height of a key, in pixels or percentage of display width. -->
<attr name="keyHeight" format="dimension|fraction" />
<!-- Default horizontal gap between keys. -->
<attr name="horizontalGap" format="dimension|fraction" />
<!-- Default vertical gap between rows of keys. -->
<attr name="verticalGap" format="dimension|fraction" />
</declare-styleable>
<declare-styleable name="Keyboard_Row">
<!-- Row edge flags. -->
<attr name="rowEdgeFlags">
<!-- Row is anchored to the top of the keyboard. -->
<flag name="top" value="4" />
<!-- Row is anchored to the bottom of the keyboard. -->
<flag name="bottom" value="8" />
</attr>
<!-- Mode of the keyboard. If the mode doesn't match the requested keyboard mode, the row will be skipped. -->
<attr name="keyboardMode" format="reference" />
</declare-styleable>
<declare-styleable name="Keyboard_Key">
<!-- The unicode value or comma-separated values that this key outputs. -->
<attr name="codes" format="integer|string" />
<!-- The XML keyboard layout of any popup keyboard. -->
<attr name="popupKeyboard" format="reference" />
<!-- The characters to display in the popup keyboard. -->
<attr name="popupCharacters" format="string" />
<!-- Key edge flags. -->
<attr name="keyEdgeFlags">
<!-- Key is anchored to the left of the keyboard. -->
<flag name="left" value="1" />
<!-- Key is anchored to the right of the keyboard. -->
<flag name="right" value="2" />
</attr>
<!-- Whether this is a modifier key such as Alt or Shift. -->
<attr name="isModifier" format="boolean" />
<!-- Whether this is a toggle key. -->
<attr name="isSticky" format="boolean" />
<!-- Whether long-pressing on this key will make it repeat. -->
<attr name="isRepeatable" format="boolean" />
<!-- The icon to show in the popup preview. -->
<attr name="iconPreview" format="reference" />
<!-- The string of characters to output when this key is pressed. -->
<attr name="keyOutputText" format="string" />
<!-- The label to display on the key. -->
<attr name="keyLabel" format="string" />
<!-- The icon to display on the key instead of the label. -->
<attr name="keyIcon" format="reference" />
<!-- Mode of the keyboard. If the mode doesn't match the requested keyboard mode, the key will be skipped. -->
<attr name="keyboardMode" />
</declare-styleable>
</resources>

View File

@ -1,129 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<MyKeyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%"
android:keyHeight="60dp"
android:keyBackground="@color/color_primary_dark"
android:keyTextColor="@color/color_accent"
android:verticalGap="3px">
<MyKeyboard xmlns:app="http://schemas.android.com/apk/res-auto"
app:keyBackground="@color/color_primary_dark"
app:keyHeight="60dp"
app:keyTextColor="@color/color_accent"
app:keyWidth="10%"
app:verticalGap="3px">
<Row>
<Key
android:codes="113"
android:keyEdgeFlags="left"
android:keyLabel="q" />
app:codes="113"
app:keyEdgeFlags="left"
app:keyLabel="q" />
<Key
android:codes="119"
android:keyLabel="w" />
app:codes="119"
app:keyLabel="w" />
<Key
android:codes="101"
android:keyLabel="e" />
app:codes="101"
app:keyLabel="e" />
<Key
android:codes="114"
android:keyLabel="r" />
app:codes="114"
app:keyLabel="r" />
<Key
android:codes="116"
android:keyLabel="t" />
app:codes="116"
app:keyLabel="t" />
<Key
android:codes="121"
android:keyLabel="y" />
app:codes="121"
app:keyLabel="y" />
<Key
android:codes="117"
android:keyLabel="u" />
app:codes="117"
app:keyLabel="u" />
<Key
android:codes="105"
android:keyLabel="i" />
app:codes="105"
app:keyLabel="i" />
<Key
android:codes="111"
android:keyLabel="o" />
app:codes="111"
app:keyLabel="o" />
<Key
android:codes="112"
android:keyEdgeFlags="right"
android:keyLabel="p" />
app:codes="112"
app:keyEdgeFlags="right"
app:keyLabel="p" />
</Row>
<Row>
<Key
android:codes="97"
android:horizontalGap="5%"
android:keyEdgeFlags="left"
android:keyLabel="a" />
app:codes="97"
app:horizontalGap="5%"
app:keyEdgeFlags="left"
app:keyLabel="a" />
<Key
android:codes="115"
android:keyLabel="s" />
app:codes="115"
app:keyLabel="s" />
<Key
android:codes="100"
android:keyLabel="d" />
app:codes="100"
app:keyLabel="d" />
<Key
android:codes="102"
android:keyLabel="f" />
app:codes="102"
app:keyLabel="f" />
<Key
android:codes="103"
android:keyLabel="g" />
app:codes="103"
app:keyLabel="g" />
<Key
android:codes="104"
android:keyLabel="h" />
app:codes="104"
app:keyLabel="h" />
<Key
android:codes="106"
android:keyLabel="j" />
app:codes="106"
app:keyLabel="j" />
<Key
android:codes="107"
android:keyLabel="k" />
app:codes="107"
app:keyLabel="k" />
<Key
android:codes="108"
android:keyLabel="l" />
app:codes="108"
app:keyLabel="l" />
</Row>
<Row>
<Key
android:codes="-1"
android:keyWidth="15%p"
android:keyEdgeFlags="left"
android:keyIcon="@drawable/ic_caps_outline_vector" />
app:codes="-1"
app:keyEdgeFlags="left"
app:keyIcon="@drawable/ic_caps_outline_vector"
app:keyWidth="15%p" />
<Key
android:codes="122"
android:keyLabel="z" />
app:codes="122"
app:keyLabel="z" />
<Key
android:codes="120"
android:keyLabel="x" />
app:codes="120"
app:keyLabel="x" />
<Key
android:codes="99"
android:keyLabel="c" />
app:codes="99"
app:keyLabel="c" />
<Key
android:codes="118"
android:keyLabel="v" />
app:codes="118"
app:keyLabel="v" />
<Key
android:codes="98"
android:keyLabel="b" />
app:codes="98"
app:keyLabel="b" />
<Key
android:codes="110"
android:keyLabel="n" />
app:codes="110"
app:keyLabel="n" />
<Key
android:codes="109"
android:keyLabel="m" />
app:codes="109"
app:keyLabel="m" />
<Key
android:codes="-5"
android:iconPreview="@null"
android:isRepeatable="true"
android:keyWidth="15%p"
android:keyEdgeFlags="right"
android:keyIcon="@drawable/ic_clear_vector" />
app:codes="-5"
app:iconPreview="@null"
app:isRepeatable="true"
app:keyEdgeFlags="right"
app:keyIcon="@drawable/ic_clear_vector"
app:keyWidth="15%p" />
</Row>
<Row android:rowEdgeFlags="bottom">
<Row app:rowEdgeFlags="bottom">
<Key
android:codes="44"
android:keyWidth="10%p"
android:keyEdgeFlags="left"
android:keyLabel="," />
app:codes="44"
app:keyEdgeFlags="left"
app:keyLabel=","
app:keyWidth="10%p" />
<Key
android:codes="32"
android:iconPreview="@null"
android:isRepeatable="true"
android:keyWidth="60%p"
android:keyLabel="" />
app:codes="32"
app:iconPreview="@null"
app:isRepeatable="true"
app:keyLabel=""
app:keyWidth="60%p" />
<Key
android:codes="46"
android:keyLabel="." />
app:codes="46"
app:keyLabel="." />
<Key
android:codes="-4"
android:keyWidth="20%p"
android:keyEdgeFlags="right"
android:keyIcon="@drawable/ic_enter_vector" />
app:codes="-4"
app:keyEdgeFlags="right"
app:keyIcon="@drawable/ic_enter_vector"
app:keyWidth="20%p" />
</Row>
</MyKeyboard>