From 5ef8803d6d568326f96b02377f5161de57fecbeb Mon Sep 17 00:00:00 2001 From: opacam Date: Thu, 5 Dec 2019 14:07:39 +0100 Subject: [PATCH] [testapp] Fix vibration for testapps Method `vibrate(milliseconds)` was deprecated in API level 26, now we should use ` vibrate(android.os.VibrationEffect)`. See also: https://developer.android.com/reference/android/os/Vibrator#vibrate(long) --- testapps/testapp/main.py | 29 ++++++++++++----- testapps/testapp_encryption/main.py | 33 ++++++++++++++------ testapps/testapp_flask/main.py | 23 ++++++++++++-- testapps/testapp_keyboard/main.py | 29 ++++++++++++----- testapps/testapp_pillow/main.py | 41 +++++++++++++++---------- testapps/testapp_sqlite_openssl/main.py | 31 +++++++++++++------ 6 files changed, 133 insertions(+), 53 deletions(-) diff --git a/testapps/testapp/main.py b/testapps/testapp/main.py index 5baa420f3c..2148e7c68a 100644 --- a/testapps/testapp/main.py +++ b/testapps/testapp/main.py @@ -123,21 +123,34 @@ def on_pause(self): def test_pyjnius(self, *args): try: - from jnius import autoclass + from jnius import autoclass, cast except ImportError: raise_error('Could not import pyjnius') return - print('Attempting to vibrate with pyjnius') - # PythonActivity = autoclass('org.renpy.android.PythonActivity') - # activity = PythonActivity.mActivity + ANDROID_VERSION = autoclass('android.os.Build$VERSION') + SDK_INT = ANDROID_VERSION.SDK_INT + + Context = autoclass("android.content.Context") PythonActivity = autoclass('org.kivy.android.PythonActivity') activity = PythonActivity.mActivity - Intent = autoclass('android.content.Intent') - Context = autoclass('android.content.Context') - vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE) - vibrator.vibrate(1000) + vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) + vibrator = cast("android.os.Vibrator", vibrator_service) + + if vibrator and SDK_INT >= 26: + print("Using android's `VibrationEffect` (SDK >= 26)") + VibrationEffect = autoclass("android.os.VibrationEffect") + vibrator.vibrate( + VibrationEffect.createOneShot( + 1000, VibrationEffect.DEFAULT_AMPLITUDE, + ), + ) + elif vibrator: + print("Using deprecated android's vibrate (SDK < 26)") + vibrator.vibrate(1000) + else: + print('Something happened...vibrator service disabled?') def test_ctypes(self, *args): import ctypes diff --git a/testapps/testapp_encryption/main.py b/testapps/testapp_encryption/main.py index b3289e857a..3b4db91020 100644 --- a/testapps/testapp_encryption/main.py +++ b/testapps/testapp_encryption/main.py @@ -324,19 +324,34 @@ def on_pause(self): def test_pyjnius(self, *args): try: - from jnius import autoclass + from jnius import autoclass, cast except ImportError: raise_error('Could not import pyjnius') return - print('Attempting to vibrate with pyjnius') - python_activity = autoclass('org.kivy.android.PythonActivity') - activity = python_activity.mActivity - intent = autoclass('android.content.Intent') - context = autoclass('android.content.Context') - vibrator = activity.getSystemService(context.VIBRATOR_SERVICE) - - vibrator.vibrate(1000) + ANDROID_VERSION = autoclass('android.os.Build$VERSION') + SDK_INT = ANDROID_VERSION.SDK_INT + + Context = autoclass("android.content.Context") + PythonActivity = autoclass('org.kivy.android.PythonActivity') + activity = PythonActivity.mActivity + + vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) + vibrator = cast("android.os.Vibrator", vibrator_service) + + if vibrator and SDK_INT >= 26: + print("Using android's `VibrationEffect` (SDK >= 26)") + VibrationEffect = autoclass("android.os.VibrationEffect") + vibrator.vibrate( + VibrationEffect.createOneShot( + 1000, VibrationEffect.DEFAULT_AMPLITUDE, + ), + ) + elif vibrator: + print("Using deprecated android's vibrate (SDK < 26)") + vibrator.vibrate(1000) + else: + print('Something happened...vibrator service disabled?') def test_ctypes(self, *args): import ctypes diff --git a/testapps/testapp_flask/main.py b/testapps/testapp_flask/main.py index fcd0f232e3..1f74d1e9e6 100644 --- a/testapps/testapp_flask/main.py +++ b/testapps/testapp_flask/main.py @@ -26,12 +26,16 @@ print('imported flask etc') print('importing pyjnius') -from jnius import autoclass +from jnius import autoclass, cast + +ANDROID_VERSION = autoclass('android.os.Build$VERSION') +SDK_INT = ANDROID_VERSION.SDK_INT Context = autoclass('android.content.Context') PythonActivity = autoclass('org.kivy.android.PythonActivity') activity = PythonActivity.mActivity -vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE) +vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) +vibrator = cast("android.os.Vibrator", vibrator_service) ActivityInfo = autoclass('android.content.pm.ActivityInfo') @@ -50,7 +54,20 @@ def vibrate(): print('ERROR: asked to vibrate but without time argument') print('asked to vibrate', args['time']) - vibrator.vibrate(float(args['time']) * 1000) + if vibrator and SDK_INT >= 26: + print("Using android's `VibrationEffect` (SDK >= 26)") + VibrationEffect = autoclass("android.os.VibrationEffect") + vibrator.vibrate( + VibrationEffect.createOneShot( + int(float(args['time']) * 1000), + VibrationEffect.DEFAULT_AMPLITUDE, + ), + ) + elif vibrator: + print("Using deprecated android's vibrate (SDK < 26)") + vibrator.vibrate(int(float(args['time']) * 1000)) + else: + print('Something happened...vibrator service disabled?') print('vibrated') @app.route('/loadUrl') diff --git a/testapps/testapp_keyboard/main.py b/testapps/testapp_keyboard/main.py index cb76b7af99..27cea40d18 100644 --- a/testapps/testapp_keyboard/main.py +++ b/testapps/testapp_keyboard/main.py @@ -121,21 +121,34 @@ def on_pause(self): def test_pyjnius(self, *args): try: - from jnius import autoclass + from jnius import autoclass, cast except ImportError: raise_error('Could not import pyjnius') return - print('Attempting to vibrate with pyjnius') - # PythonActivity = autoclass('org.renpy.android.PythonActivity') - # activity = PythonActivity.mActivity + ANDROID_VERSION = autoclass('android.os.Build$VERSION') + SDK_INT = ANDROID_VERSION.SDK_INT + + Context = autoclass("android.content.Context") PythonActivity = autoclass('org.kivy.android.PythonActivity') activity = PythonActivity.mActivity - Intent = autoclass('android.content.Intent') - Context = autoclass('android.content.Context') - vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE) - vibrator.vibrate(1000) + vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) + vibrator = cast("android.os.Vibrator", vibrator_service) + + if vibrator and SDK_INT >= 26: + print("Using android's `VibrationEffect` (SDK >= 26)") + VibrationEffect = autoclass("android.os.VibrationEffect") + vibrator.vibrate( + VibrationEffect.createOneShot( + 1000, VibrationEffect.DEFAULT_AMPLITUDE, + ), + ) + elif vibrator: + print("Using deprecated android's vibrate (SDK < 26)") + vibrator.vibrate(1000) + else: + print('Something happened...vibrator service disabled?') def test_ctypes(self, *args): import ctypes diff --git a/testapps/testapp_pillow/main.py b/testapps/testapp_pillow/main.py index ec0aa4add5..fa0c1255df 100644 --- a/testapps/testapp_pillow/main.py +++ b/testapps/testapp_pillow/main.py @@ -337,25 +337,34 @@ def on_stop(self): def test_pyjnius(self, *args): try: - from jnius import autoclass + from jnius import autoclass, cast except ImportError: - raise_error("Could not import pyjnius") + raise_error('Could not import pyjnius') return - - print("Attempting to vibrate with pyjnius") - # Todo: fix vibrate with Api level >= 26 - # vibrate was deprecated in API level 26: - # https://developer.android.com/reference/android/os/Vibrator - try: - PythonActivity = autoclass("org.kivy.android.PythonActivity") - activity = PythonActivity.mActivity - Intent = autoclass("android.content.Intent") - Context = autoclass("android.content.Context") - vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE) - + print('Attempting to vibrate with pyjnius') + ANDROID_VERSION = autoclass('android.os.Build$VERSION') + SDK_INT = ANDROID_VERSION.SDK_INT + + Context = autoclass("android.content.Context") + PythonActivity = autoclass('org.kivy.android.PythonActivity') + activity = PythonActivity.mActivity + + vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) + vibrator = cast("android.os.Vibrator", vibrator_service) + + if vibrator and SDK_INT >= 26: + print("Using android's `VibrationEffect` (SDK >= 26)") + VibrationEffect = autoclass("android.os.VibrationEffect") + vibrator.vibrate( + VibrationEffect.createOneShot( + 1000, VibrationEffect.DEFAULT_AMPLITUDE, + ), + ) + elif vibrator: + print("Using deprecated android's vibrate (SDK < 26)") vibrator.vibrate(1000) - except Exception as e: - raise_error("Error when trying to vibrate: {}".format(e)) + else: + print('Something happened...vibrator service disabled?') def test_ctypes(self, *args): try: diff --git a/testapps/testapp_sqlite_openssl/main.py b/testapps/testapp_sqlite_openssl/main.py index a8083ab961..9b75c755ef 100644 --- a/testapps/testapp_sqlite_openssl/main.py +++ b/testapps/testapp_sqlite_openssl/main.py @@ -192,24 +192,37 @@ def on_pause(self): def test_pyjnius(self, *args): try: - from jnius import autoclass + from jnius import autoclass, cast except ImportError: raise_error('Could not import pyjnius') return - print('Attempting to vibrate with pyjnius') - # PythonActivity = autoclass('org.renpy.android.PythonActivity') - # activity = PythonActivity.mActivity + ANDROID_VERSION = autoclass('android.os.Build$VERSION') + SDK_INT = ANDROID_VERSION.SDK_INT + + Context = autoclass("android.content.Context") PythonActivity = autoclass('org.kivy.android.PythonActivity') activity = PythonActivity.mActivity - Intent = autoclass('android.content.Intent') - Context = autoclass('android.content.Context') - vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE) - vibrator.vibrate(1000) + vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) + vibrator = cast("android.os.Vibrator", vibrator_service) + + if vibrator and SDK_INT >= 26: + print("Using android's `VibrationEffect` (SDK >= 26)") + VibrationEffect = autoclass("android.os.VibrationEffect") + vibrator.vibrate( + VibrationEffect.createOneShot( + 1000, VibrationEffect.DEFAULT_AMPLITUDE, + ), + ) + elif vibrator: + print("Using deprecated android's vibrate (SDK < 26)") + vibrator.vibrate(1000) + else: + print('Something happened...vibrator service disabled?') def test_ctypes(self, *args): - import ctypes + pass def test_numpy(self, *args): import numpy