From d338e6196c085ed208a5df69f9e534ce148cc2cf Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Wed, 6 Jul 2022 19:18:26 +0200 Subject: [PATCH] Circumvention for SDL2 focus bug --- main.py | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 342980d..db14f5b 100644 --- a/main.py +++ b/main.py @@ -26,6 +26,10 @@ from kivymd.uix.dialog import MDDialog __version__ = "0.1.5" __variant__ = "alpha" +if RNS.vendor.platformutils.get_platform() == "android": + from jnius import autoclass + from android.runnable import run_on_ui_thread + class SidebandApp(MDApp): def __init__(self, **kwargs): super().__init__(**kwargs) @@ -85,16 +89,48 @@ class SidebandApp(MDApp): if self.announces_view != None: self.announces_view.update() - def on_start(self): + def on_start(self): self.last_exit_event = time.time() EventLoop.window.bind(on_keyboard=self.keyboard_event) EventLoop.window.bind(on_key_down=self.keydown_event) + + # This incredibly hacky hack circumvents a bug in SDL2 + # that prevents focus from being correctly released from + # the software keyboard on Android. Without this the back + # button/gesture does not work after the soft-keyboard has + # appeared for the first time. + if RNS.vendor.platformutils.get_platform() == "android": + BIND_CLASSES = ["kivymd.uix.textfield.textfield.MDTextField",] + + for e in self.root.ids: + te = self.root.ids[e] + ts = str(te).split(" ")[0].replace("<", "") + + if ts in BIND_CLASSES: + te.bind(focus=self.android_focus_fix) + # RNS.log("Bound "+str(e)+" / "+ts) + # else: + # RNS.log("Did not bind "+str(e)+" / "+ts) + + # RNS.log(str(e)) self.root.ids.screen_manager.app = self self.root.ids.app_version_info.text = "Sideband v"+__version__+" "+__variant__ self.open_conversations() Clock.schedule_interval(self.jobs, 1) + + # Part of the focus hack fix + def android_focus_fix(self, sender, val): + if not val: + @run_on_ui_thread + def fix_back_button(): + activity = autoclass('org.kivy.android.PythonActivity').mActivity + activity.onWindowFocusChanged(False) + activity.onWindowFocusChanged(True) + + fix_back_button() + def keydown_event(self, instance, keyboard, keycode, text, modifiers): if len(modifiers) > 0 and modifiers[0] == 'ctrl' and (text == "w" or text == "q"):