From e7a1979477de2cd41c77a08bbdd77ce82fe55232 Mon Sep 17 00:00:00 2001 From: lufebe16 Date: Sat, 16 Sep 2023 15:27:58 +0200 Subject: [PATCH] android version: - screen rotation lock added as proposed by issue #320 - triggered (maybe experimental) by a long tap (5 seconds) to the play ground. --- pysollib/kivy/LApp.py | 19 +++++++++++++++ pysollib/kivy/androidrot.py | 46 +++++++++++++++++++++++++++++++++++ pysollib/kivy/androidtoast.py | 37 ++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 pysollib/kivy/androidrot.py create mode 100644 pysollib/kivy/androidtoast.py diff --git a/pysollib/kivy/LApp.py b/pysollib/kivy/LApp.py index 8fc5d8b5..6edc0c5e 100644 --- a/pysollib/kivy/LApp.py +++ b/pysollib/kivy/LApp.py @@ -51,8 +51,10 @@ from kivy.uix.treeview import TreeView from kivy.uix.treeview import TreeViewLabel from kivy.uix.widget import Widget from kivy.utils import platform +from kivy.properties import NumericProperty from pysollib.kivy.androidperms import requestStoragePerm +from pysollib.kivy.androidrot import AndroidScreenRotation from pysollib.resource import CSI if platform != 'android': @@ -1583,6 +1585,9 @@ class LStack: class LMainWindow(BoxLayout, LTkBase): + + longPress = NumericProperty(0) + def __init__(self, **kw): super(LMainWindow, self).__init__(orientation='vertical') LTkBase.__init__(self) @@ -1680,6 +1685,14 @@ class LMainWindow(BoxLayout, LTkBase): def on_touch_up(self, touch): ret = False + # long press only on playground. + pgs = self.workStack.peek('playground') + if pgs: + pg = pgs[1] + if pg.collide_point(*touch.pos): + if (touch.time_end-touch.time_start) > 4.5: + self.longPress = touch.time_end + # standard notifikation: for c in self.children: ret = c.on_touch_up(touch) @@ -1693,6 +1706,10 @@ class LMainWindow(BoxLayout, LTkBase): ''' return ret + def on_longPress(self, instance, timestamp): + print('longPressed at {time}'.format(time=timestamp)) + AndroidScreenRotation.toggle() + # Menubar: def setMenu(self, menu): @@ -1914,6 +1931,8 @@ class LApp(App): if app is None: return + AndroidScreenRotation.unlock() + so = get_screen_ori() go = so # flake8: F841 nonsense! so = go diff --git a/pysollib/kivy/androidrot.py b/pysollib/kivy/androidrot.py new file mode 100644 index 00000000..e4809e5f --- /dev/null +++ b/pysollib/kivy/androidrot.py @@ -0,0 +1,46 @@ +# flake8: noqa +# LB230914. + +from pysollib.kivy.androidtoast import AndroidToaster +from pysollib.mygettext import _ +try: + import jnius +except ImportError: + jnius = None + +class AndroidRot(object): + def __init__(self): + self.locked = False + if jnius is None: + return + self.PythonActivity = jnius.autoclass('org.kivy.android.PythonActivity') + self.ActivityInfo = jnius.autoclass('android.content.pm.ActivityInfo') + self.currentActivity = jnius.cast('android.app.Activity', self.PythonActivity.mActivity) + + def isLocked(self): + return self.locked + + def lock(self): + if jnius is not None: + self.currentActivity.setRequestedOrientation( + self.ActivityInfo.SCREEN_ORIENTATION_LOCKED) + self.locked = True + + def unlock(self): + if jnius is not None: + self.currentActivity.setRequestedOrientation( + self.ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR) + self.locked = False + + def toggle(self): + if self.locked: + self.unlock() + if jnius is not None: + AndroidToaster.toastShort(_("screen rotation enabled")) + else: + self.lock() + if jnius is not None: + AndroidToaster.toastShort(_("screen rotation disabled")) + return self.isLocked() + +AndroidScreenRotation = AndroidRot() diff --git a/pysollib/kivy/androidtoast.py b/pysollib/kivy/androidtoast.py new file mode 100644 index 00000000..5cc1474c --- /dev/null +++ b/pysollib/kivy/androidtoast.py @@ -0,0 +1,37 @@ +# flake8: noqa +# LB230914. + +try: + import jnius + from android.runnable import run_on_ui_thread +except ImportError: + jnius = None + def run_on_ui_thread(a): + pass + +class AndroidToast(object): + def __init__(self): + if jnius is None: + return + self.PythonActivity = jnius.autoclass('org.kivy.android.PythonActivity') + self.Toast = jnius.autoclass('android.widget.Toast') + self.String = jnius.autoclass('java.lang.String') + self.context = self.PythonActivity.mActivity + + @run_on_ui_thread + def toastShort(self, message): + if jnius is not None: + jtext = jnius.cast('java.lang.CharSequence', self.String(message)) + toast = self.Toast.makeText( + self.context, jtext, self.Toast.LENGTH_SHORT) + toast.show() + + @run_on_ui_thread + def toastLong(self, message): + if jnius is not None: + jtext = jnius.cast('java.lang.CharSequence', self.String(message)) + toast = self.Toast.makeText( + self.context, jtext, self.Toast.LENGTH_LONG) + toast.show() + +AndroidToaster = AndroidToast()