Compare commits
2
Commits
3412357526
..
v1.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aac37265a3 | ||
|
|
ba422bf089 |
@@ -30,15 +30,18 @@ import android.webkit.WebViewClient
|
|||||||
* deshalb als Alias fuer die 'ContextMenu'-Taste, ausschliesslich fuer
|
* deshalb als Alias fuer die 'ContextMenu'-Taste, ausschliesslich fuer
|
||||||
* diesen App-Anwendungsfall.
|
* diesen App-Anwendungsfall.
|
||||||
*
|
*
|
||||||
* DPAD Center/Up/Down (und die entsprechenden Medientasten) werden NUR
|
* DPAD Center/Up/Down/Left/Right, Menu und die entsprechenden Medientasten
|
||||||
* innerhalb eines Raums remapped (Space/P/N - siehe Design-Spec). Auf der
|
* werden NUR innerhalb eines Raums (Pfad "/tv/<id>") remapped - siehe
|
||||||
* Raumliste (/tv) haben sie dort keine Bedeutung: die Raumliste hat ihr
|
* isInRoom(). Auf jeder anderen Seite (Raumliste "/tv", Login, Signup, ...)
|
||||||
* eigenes Tastaturschema (ArrowUp/ArrowDown/Enter, siehe tv-rooms.js auf
|
* muessen sie unveraendert durchgereicht werden, sonst zerschiesst die
|
||||||
* der Website) und muss die echten, unveraenderten Tasten bekommen, sonst
|
* Remapping-Logik dort Texteingaben. Zwei konkrete Bugs kamen genau daher,
|
||||||
* bewegt sich der Fokus zwischen den Raum-Kacheln nie (genau der Fehler,
|
* dass frueher statt isInRoom() die Umkehrung von isRoomList() geprueft
|
||||||
* der beim ersten Hardware-Test auftrat: die Raumliste laed, aber keine
|
* wurde (also "ueberall ausser der Raumliste"), was auch Login/Signup
|
||||||
* Taste tut etwas, weil DPAD_DOWN/CENTER als 'n'/Space statt als
|
* einschloss: auf der Raumliste bewegte sich der Fokus zwischen den
|
||||||
* ArrowDown/Enter ankamen).
|
* Raum-Kacheln nicht (DPAD_DOWN/CENTER kamen als 'n'/Space statt als
|
||||||
|
* ArrowDown/Enter an), und auf der Login-Seite tippte DPAD OK ein
|
||||||
|
* Leerzeichen in das fokussierte Textfeld statt das Formular zu bestaetigen
|
||||||
|
* (DPAD_CENTER kam als Space-Taste an statt als echtes Enter).
|
||||||
*/
|
*/
|
||||||
class MainActivity : Activity() {
|
class MainActivity : Activity() {
|
||||||
|
|
||||||
@@ -88,8 +91,8 @@ class MainActivity : Activity() {
|
|||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isFullscreen() = fullscreenView != null
|
|
||||||
private fun isRoomList() = currentPath == "/tv"
|
private fun isRoomList() = currentPath == "/tv"
|
||||||
|
private fun isInRoom() = currentPath.startsWith("/tv/")
|
||||||
|
|
||||||
private fun sendKey(keyCode: Int, shift: Boolean = false) {
|
private fun sendKey(keyCode: Int, shift: Boolean = false) {
|
||||||
val metaState = if (shift) KeyEvent.META_SHIFT_ON else 0
|
val metaState = if (shift) KeyEvent.META_SHIFT_ON else 0
|
||||||
@@ -115,11 +118,12 @@ class MainActivity : Activity() {
|
|||||||
* Tastendrucks abgefangen wird (sonst haengt Chromiums interner
|
* Tastendrucks abgefangen wird (sonst haengt Chromiums interner
|
||||||
* Tastenstatus fest, weil ein Keydown ohne passendes Keyup ankaeme). */
|
* Tastenstatus fest, weil ein Keydown ohne passendes Keyup ankaeme). */
|
||||||
private fun shouldIntercept(keyCode: Int): Boolean = when (keyCode) {
|
private fun shouldIntercept(keyCode: Int): Boolean = when (keyCode) {
|
||||||
KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_RIGHT,
|
KeyEvent.KEYCODE_BACK -> true
|
||||||
KeyEvent.KEYCODE_MENU -> true
|
KeyEvent.KEYCODE_MENU -> isRoomList() || isInRoom()
|
||||||
|
KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_RIGHT,
|
||||||
KeyEvent.KEYCODE_DPAD_CENTER, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE,
|
KeyEvent.KEYCODE_DPAD_CENTER, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE,
|
||||||
KeyEvent.KEYCODE_DPAD_UP, KeyEvent.KEYCODE_DPAD_DOWN,
|
KeyEvent.KEYCODE_DPAD_UP, KeyEvent.KEYCODE_DPAD_DOWN,
|
||||||
KeyEvent.KEYCODE_MEDIA_PREVIOUS, KeyEvent.KEYCODE_MEDIA_NEXT -> !isRoomList()
|
KeyEvent.KEYCODE_MEDIA_PREVIOUS, KeyEvent.KEYCODE_MEDIA_NEXT -> isInRoom()
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,11 +138,16 @@ class MainActivity : Activity() {
|
|||||||
KeyEvent.KEYCODE_DPAD_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS -> sendKey(KeyEvent.KEYCODE_P)
|
KeyEvent.KEYCODE_DPAD_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS -> sendKey(KeyEvent.KEYCODE_P)
|
||||||
KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT -> sendKey(KeyEvent.KEYCODE_N)
|
KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT -> sendKey(KeyEvent.KEYCODE_N)
|
||||||
KeyEvent.KEYCODE_MENU -> sendKey(KeyEvent.KEYCODE_X)
|
KeyEvent.KEYCODE_MENU -> sendKey(KeyEvent.KEYCODE_X)
|
||||||
KeyEvent.KEYCODE_BACK -> when {
|
/* BACK entscheidet NICHT mehr selbst zwischen "Popup schliessen",
|
||||||
isRoomList() -> { /* verschluckt, keine weitere Aktion */ }
|
"Vollbild verlassen" und "zur Raumliste zurueck" - das kann nur
|
||||||
isFullscreen() -> sendKey(KeyEvent.KEYCODE_ESCAPE)
|
JS wissen (siehe room.js/tv-rooms.js keydown-Handler), weil nur
|
||||||
else -> webView.loadUrl(BuildConfig.WEBSITE_URL)
|
dort bekannt ist, ob z. B. das Menue-Popup gerade offen ist. Ein
|
||||||
}
|
fixer Fall genau darauf beruhte der Bug, dass BACK bei offenem
|
||||||
|
Popup direkt zur Raumliste sprang, statt das Popup zu schliessen.
|
||||||
|
Auf Login/Signup/sonstigen Seiten (weder Raumliste noch Raum)
|
||||||
|
bleibt BACK bewusst wirkungslos - sonst gehen unfertig
|
||||||
|
ausgefuellte Formulare verloren. */
|
||||||
|
KeyEvent.KEYCODE_BACK -> if (isRoomList() || isInRoom()) sendKey(KeyEvent.KEYCODE_ESCAPE)
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user