Skip to content

Commit 471b3f2

Browse files
committed
Merge remote-tracking branch 'origin/direct_boot_aware' into direct_boot_aware
2 parents 8cab8a3 + 02bb8d6 commit 471b3f2

File tree

57 files changed

+1056
-128
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1056
-128
lines changed

app/src/main/kotlin/com/simplemobiletools/keyboard/extensions/Context.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,17 +165,21 @@ fun Context.getKeyboardLanguages(): ArrayList<RadioItem> {
165165
return arrayListOf(
166166
RadioItem(LANGUAGE_BENGALI, getKeyboardLanguageText(LANGUAGE_BENGALI)),
167167
RadioItem(LANGUAGE_BULGARIAN, getKeyboardLanguageText(LANGUAGE_BULGARIAN)),
168+
RadioItem(LANGUAGE_DANISH, getKeyboardLanguageText(LANGUAGE_DANISH)),
168169
RadioItem(LANGUAGE_ENGLISH_QWERTY, getKeyboardLanguageText(LANGUAGE_ENGLISH_QWERTY)),
169170
RadioItem(LANGUAGE_ENGLISH_QWERTZ, getKeyboardLanguageText(LANGUAGE_ENGLISH_QWERTZ)),
170171
RadioItem(LANGUAGE_ENGLISH_DVORAK, getKeyboardLanguageText(LANGUAGE_ENGLISH_DVORAK)),
171-
RadioItem(LANGUAGE_FRENCH, getKeyboardLanguageText(LANGUAGE_FRENCH)),
172+
RadioItem(LANGUAGE_FRENCH_AZERTY, getKeyboardLanguageText(LANGUAGE_FRENCH_AZERTY)),
173+
RadioItem(LANGUAGE_FRENCH_BEPO, getKeyboardLanguageText(LANGUAGE_FRENCH_BEPO)),
172174
RadioItem(LANGUAGE_GERMAN, getKeyboardLanguageText(LANGUAGE_GERMAN)),
173175
RadioItem(LANGUAGE_GREEK, getKeyboardLanguageText(LANGUAGE_GREEK)),
174176
RadioItem(LANGUAGE_LITHUANIAN, getKeyboardLanguageText(LANGUAGE_LITHUANIAN)),
177+
RadioItem(LANGUAGE_NORWEGIAN, getKeyboardLanguageText(LANGUAGE_NORWEGIAN)),
175178
RadioItem(LANGUAGE_ROMANIAN, getKeyboardLanguageText(LANGUAGE_ROMANIAN)),
176179
RadioItem(LANGUAGE_RUSSIAN, getKeyboardLanguageText(LANGUAGE_RUSSIAN)),
177180
RadioItem(LANGUAGE_SLOVENIAN, getKeyboardLanguageText(LANGUAGE_SLOVENIAN)),
178181
RadioItem(LANGUAGE_SPANISH, getKeyboardLanguageText(LANGUAGE_SPANISH)),
182+
RadioItem(LANGUAGE_SWEDISH, getKeyboardLanguageText(LANGUAGE_SWEDISH)),
179183
RadioItem(LANGUAGE_TURKISH_Q, getKeyboardLanguageText(LANGUAGE_TURKISH_Q)),
180184
)
181185
}
@@ -184,18 +188,23 @@ fun Context.getKeyboardLanguageText(language: Int): String {
184188
return when (language) {
185189
LANGUAGE_BENGALI -> getString(R.string.translation_bengali)
186190
LANGUAGE_BULGARIAN -> getString(R.string.translation_bulgarian)
191+
LANGUAGE_DANISH -> getString(R.string.translation_danish)
187192
LANGUAGE_ENGLISH_DVORAK -> "${getString(R.string.translation_english)} (DVORAK)"
188193
LANGUAGE_ENGLISH_QWERTZ -> "${getString(R.string.translation_english)} (QWERTZ)"
189-
LANGUAGE_FRENCH -> getString(R.string.translation_french)
194+
LANGUAGE_FRENCH_AZERTY -> "${getString(R.string.translation_french)} (AZERTY)"
195+
LANGUAGE_FRENCH_BEPO -> "${getString(R.string.translation_french)} (BEPO)"
190196
LANGUAGE_GERMAN -> getString(R.string.translation_german)
191197
LANGUAGE_GREEK -> getString(R.string.translation_greek)
192198
LANGUAGE_LITHUANIAN -> getString(R.string.translation_lithuanian)
199+
LANGUAGE_NORWEGIAN -> getString(R.string.translation_norwegian)
193200
LANGUAGE_ROMANIAN -> getString(R.string.translation_romanian)
194201
LANGUAGE_RUSSIAN -> getString(R.string.translation_russian)
195202
LANGUAGE_SLOVENIAN -> getString(R.string.translation_slovenian)
196203
LANGUAGE_SPANISH -> getString(R.string.translation_spanish)
204+
LANGUAGE_SWEDISH -> getString(R.string.translation_swedish)
197205
LANGUAGE_TURKISH_Q -> "${getString(R.string.translation_turkish)} (Q)"
198206
else -> "${getString(R.string.translation_english)} (QWERTY)"
199207
}
200208
}
201209

210+
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.simplemobiletools.keyboard.helpers
2+
3+
import android.graphics.Rect
4+
import android.os.Bundle
5+
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
6+
import androidx.customview.widget.ExploreByTouchHelper
7+
import com.simplemobiletools.keyboard.views.MyKeyboardView
8+
9+
class AccessHelper(
10+
private val keyboardView: MyKeyboardView,
11+
private val keys: List<MyKeyboard.Key>
12+
) : ExploreByTouchHelper(keyboardView) {
13+
14+
/**
15+
* We need to populate the list with the IDs of all of the visible virtual views (the intervals in the chart).
16+
* In our case, all keys are always visible, so we’ll return a list of all IDs.
17+
*/
18+
override fun getVisibleVirtualViews(virtualViewIds: MutableList<Int>) {
19+
val keysSize = keys.size
20+
for (i in 0 until keysSize) {
21+
virtualViewIds.add(i)
22+
}
23+
}
24+
25+
/**
26+
* For this function, we need to return the ID of the virtual view that’s under the x, y position,
27+
* or ExploreByTouchHelper.HOST_ID if there’s no item at those coordinates.
28+
*/
29+
override fun getVirtualViewAt(x: Float, y: Float): Int {
30+
val rects = keys.map {
31+
Rect(it.x, it.y, it.x + it.width, it.y + it.height)
32+
}
33+
34+
return rects.firstOrNull { it.contains(x.toInt(), y.toInt()) }?.let { exactRect ->
35+
rects.indexOf(exactRect)
36+
} ?: HOST_ID
37+
}
38+
39+
/**
40+
* This is where we provide all the metadata for our virtual view.
41+
* We need to set the content description (or text, if it’s presented visually) and set the bounds in parent.
42+
*/
43+
override fun onPopulateNodeForVirtualView(virtualViewId: Int, node: AccessibilityNodeInfoCompat) {
44+
node.className = keyboardView::class.simpleName
45+
val key = keys.getOrNull(virtualViewId)
46+
node.contentDescription = key?.getContentDescription(keyboardView.context) ?: ""
47+
val bounds = updateBoundsForInterval(virtualViewId)
48+
node.setBoundsInParent(bounds)
49+
}
50+
51+
/**
52+
* We need to set the content description (or text, if it’s presented visually) and set the bounds in parent.
53+
* The bounds in the parent should match the logic in the onDraw() function.
54+
*/
55+
private fun updateBoundsForInterval(index: Int): Rect {
56+
val keys = keys
57+
val key = keys.getOrNull(index) ?: return Rect()
58+
return Rect().apply {
59+
left = key.x
60+
top = key.y
61+
right = key.x + key.width
62+
bottom = key.y + key.height
63+
}
64+
}
65+
66+
override fun onPerformActionForVirtualView(virtualViewId: Int, action: Int, arguments: Bundle?): Boolean {
67+
return false
68+
}
69+
}

app/src/main/kotlin/com/simplemobiletools/keyboard/helpers/Constants.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const val ITEM_CLIP = 1
2727

2828
const val LANGUAGE_ENGLISH_QWERTY = 0
2929
const val LANGUAGE_RUSSIAN = 1
30-
const val LANGUAGE_FRENCH = 2
30+
const val LANGUAGE_FRENCH_AZERTY = 2
3131
const val LANGUAGE_ENGLISH_QWERTZ = 3
3232
const val LANGUAGE_SPANISH = 4
3333
const val LANGUAGE_GERMAN = 5
@@ -39,6 +39,10 @@ const val LANGUAGE_TURKISH_Q = 10
3939
const val LANGUAGE_LITHUANIAN = 11
4040
const val LANGUAGE_BENGALI = 12
4141
const val LANGUAGE_GREEK = 13
42+
const val LANGUAGE_NORWEGIAN = 14
43+
const val LANGUAGE_SWEDISH = 15
44+
const val LANGUAGE_DANISH = 16
45+
const val LANGUAGE_FRENCH_BEPO = 17
4246

4347
// keyboard height multiplier options
4448
const val KEYBOARD_HEIGHT_MULTIPLIER_SMALL = 1

app/src/main/kotlin/com/simplemobiletools/keyboard/helpers/MyKeyboard.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class MyKeyboard {
4343
var mMinWidth = 0
4444

4545
/** List of keys in this keyboard */
46-
var mKeys: MutableList<Key?>? = null
46+
var mKeys: MutableList<Key>? = null
4747

4848
/** Width of the screen available to fit the keyboard */
4949
private var mDisplayWidth = 0
@@ -225,6 +225,21 @@ class MyKeyboard {
225225
a.recycle()
226226
}
227227

228+
/**
229+
* Content description for talkback functional
230+
*/
231+
fun getContentDescription(context: Context): CharSequence {
232+
return when (code) {
233+
KEYCODE_SHIFT -> context.getString(R.string.keycode_shift)
234+
KEYCODE_MODE_CHANGE -> context.getString(R.string.keycode_mode_change)
235+
KEYCODE_ENTER -> context.getString(R.string.keycode_enter)
236+
KEYCODE_DELETE -> context.getString(R.string.keycode_delete)
237+
KEYCODE_SPACE -> context.getString(R.string.keycode_space)
238+
KEYCODE_EMOJI -> context.getString(R.string.emojis)
239+
else -> label
240+
}
241+
}
242+
228243
/** Create an empty key with no attributes. */
229244
init {
230245
height = parent.defaultHeight
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.simplemobiletools.keyboard.interfaces
2+
3+
interface OnKeyboardActionListener {
4+
/**
5+
* Called when the user presses a key. This is sent before the [.onKey] is called. For keys that repeat, this is only called once.
6+
* @param primaryCode the unicode of the key being pressed. If the touch is not on a valid key, the value will be zero.
7+
*/
8+
fun onPress(primaryCode: Int)
9+
10+
/**
11+
* Send a key press to the listener.
12+
* @param code this is the key that was pressed
13+
*/
14+
fun onKey(code: Int)
15+
16+
/**
17+
* Called when the finger has been lifted after pressing a key
18+
*/
19+
fun onActionUp()
20+
21+
/**
22+
* Called when the user long presses Space and moves to the left
23+
*/
24+
fun moveCursorLeft()
25+
26+
/**
27+
* Called when the user long presses Space and moves to the right
28+
*/
29+
fun moveCursorRight()
30+
31+
/**
32+
* Sends a sequence of characters to the listener.
33+
* @param text the string to be displayed.
34+
*/
35+
fun onText(text: String)
36+
37+
/**
38+
* Called to force the KeyboardView to reload the keyboard
39+
*/
40+
fun reloadKeyboard()
41+
}

app/src/main/kotlin/com/simplemobiletools/keyboard/services/SimpleKeyboardIME.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ import com.simplemobiletools.keyboard.R
1616
import com.simplemobiletools.keyboard.extensions.config
1717
import com.simplemobiletools.keyboard.extensions.safeStorageContext
1818
import com.simplemobiletools.keyboard.helpers.*
19+
import com.simplemobiletools.keyboard.interfaces.OnKeyboardActionListener
1920
import com.simplemobiletools.keyboard.views.MyKeyboardView
2021
import kotlinx.android.synthetic.main.keyboard_view_keyboard.view.*
2122

2223
// based on https://www.androidauthority.com/lets-build-custom-keyboard-android-832362/
23-
class SimpleKeyboardIME : InputMethodService(), MyKeyboardView.OnKeyboardActionListener, SharedPreferences.OnSharedPreferenceChangeListener {
24+
class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, SharedPreferences.OnSharedPreferenceChangeListener {
2425
private var SHIFT_PERM_TOGGLE_SPEED = 500 // how quickly do we have to doubletap shift to enable permanent caps lock
2526
private val KEYBOARD_LETTERS = 0
2627
private val KEYBOARD_SYMBOLS = 1
@@ -283,15 +284,19 @@ class SimpleKeyboardIME : InputMethodService(), MyKeyboardView.OnKeyboardActionL
283284
return when (baseContext.config.keyboardLanguage) {
284285
LANGUAGE_BENGALI -> R.xml.keys_letters_bengali
285286
LANGUAGE_BULGARIAN -> R.xml.keys_letters_bulgarian
287+
LANGUAGE_DANISH -> R.xml.keys_letters_danish
286288
LANGUAGE_ENGLISH_DVORAK -> R.xml.keys_letters_english_dvorak
287289
LANGUAGE_ENGLISH_QWERTZ -> R.xml.keys_letters_english_qwertz
288-
LANGUAGE_FRENCH -> R.xml.keys_letters_french
290+
LANGUAGE_FRENCH_AZERTY -> R.xml.keys_letters_french_azerty
291+
LANGUAGE_FRENCH_BEPO -> R.xml.keys_letters_french_bepo
289292
LANGUAGE_GERMAN -> R.xml.keys_letters_german
290293
LANGUAGE_GREEK -> R.xml.keys_letters_greek
291294
LANGUAGE_LITHUANIAN -> R.xml.keys_letters_lithuanian
295+
LANGUAGE_NORWEGIAN -> R.xml.keys_letters_norwegian
292296
LANGUAGE_ROMANIAN -> R.xml.keys_letters_romanian
293297
LANGUAGE_RUSSIAN -> R.xml.keys_letters_russian
294298
LANGUAGE_SLOVENIAN -> R.xml.keys_letters_slovenian
299+
LANGUAGE_SWEDISH -> R.xml.keys_letters_swedish
295300
LANGUAGE_SPANISH -> R.xml.keys_letters_spanish_qwerty
296301
LANGUAGE_TURKISH_Q -> R.xml.keys_letters_turkish_q
297302
else -> R.xml.keys_letters_english_qwerty

0 commit comments

Comments
 (0)