Skip to content

Commit 3a155e3

Browse files
authored
[testapp] Fix vibration for testapps (kivy#2034)
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)
1 parent 74fb8e5 commit 3a155e3

File tree

6 files changed

+133
-53
lines changed

6 files changed

+133
-53
lines changed

testapps/testapp/main.py

+21-8
Original file line numberDiff line numberDiff line change
@@ -123,21 +123,34 @@ def on_pause(self):
123123

124124
def test_pyjnius(self, *args):
125125
try:
126-
from jnius import autoclass
126+
from jnius import autoclass, cast
127127
except ImportError:
128128
raise_error('Could not import pyjnius')
129129
return
130-
131130
print('Attempting to vibrate with pyjnius')
132-
# PythonActivity = autoclass('org.renpy.android.PythonActivity')
133-
# activity = PythonActivity.mActivity
131+
ANDROID_VERSION = autoclass('android.os.Build$VERSION')
132+
SDK_INT = ANDROID_VERSION.SDK_INT
133+
134+
Context = autoclass("android.content.Context")
134135
PythonActivity = autoclass('org.kivy.android.PythonActivity')
135136
activity = PythonActivity.mActivity
136-
Intent = autoclass('android.content.Intent')
137-
Context = autoclass('android.content.Context')
138-
vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)
139137

140-
vibrator.vibrate(1000)
138+
vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE)
139+
vibrator = cast("android.os.Vibrator", vibrator_service)
140+
141+
if vibrator and SDK_INT >= 26:
142+
print("Using android's `VibrationEffect` (SDK >= 26)")
143+
VibrationEffect = autoclass("android.os.VibrationEffect")
144+
vibrator.vibrate(
145+
VibrationEffect.createOneShot(
146+
1000, VibrationEffect.DEFAULT_AMPLITUDE,
147+
),
148+
)
149+
elif vibrator:
150+
print("Using deprecated android's vibrate (SDK < 26)")
151+
vibrator.vibrate(1000)
152+
else:
153+
print('Something happened...vibrator service disabled?')
141154

142155
def test_ctypes(self, *args):
143156
import ctypes

testapps/testapp_encryption/main.py

+24-9
Original file line numberDiff line numberDiff line change
@@ -324,19 +324,34 @@ def on_pause(self):
324324

325325
def test_pyjnius(self, *args):
326326
try:
327-
from jnius import autoclass
327+
from jnius import autoclass, cast
328328
except ImportError:
329329
raise_error('Could not import pyjnius')
330330
return
331-
332331
print('Attempting to vibrate with pyjnius')
333-
python_activity = autoclass('org.kivy.android.PythonActivity')
334-
activity = python_activity.mActivity
335-
intent = autoclass('android.content.Intent')
336-
context = autoclass('android.content.Context')
337-
vibrator = activity.getSystemService(context.VIBRATOR_SERVICE)
338-
339-
vibrator.vibrate(1000)
332+
ANDROID_VERSION = autoclass('android.os.Build$VERSION')
333+
SDK_INT = ANDROID_VERSION.SDK_INT
334+
335+
Context = autoclass("android.content.Context")
336+
PythonActivity = autoclass('org.kivy.android.PythonActivity')
337+
activity = PythonActivity.mActivity
338+
339+
vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE)
340+
vibrator = cast("android.os.Vibrator", vibrator_service)
341+
342+
if vibrator and SDK_INT >= 26:
343+
print("Using android's `VibrationEffect` (SDK >= 26)")
344+
VibrationEffect = autoclass("android.os.VibrationEffect")
345+
vibrator.vibrate(
346+
VibrationEffect.createOneShot(
347+
1000, VibrationEffect.DEFAULT_AMPLITUDE,
348+
),
349+
)
350+
elif vibrator:
351+
print("Using deprecated android's vibrate (SDK < 26)")
352+
vibrator.vibrate(1000)
353+
else:
354+
print('Something happened...vibrator service disabled?')
340355

341356
def test_ctypes(self, *args):
342357
import ctypes

testapps/testapp_flask/main.py

+20-3
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,16 @@
2626
print('imported flask etc')
2727
print('importing pyjnius')
2828

29-
from jnius import autoclass
29+
from jnius import autoclass, cast
30+
31+
ANDROID_VERSION = autoclass('android.os.Build$VERSION')
32+
SDK_INT = ANDROID_VERSION.SDK_INT
3033
Context = autoclass('android.content.Context')
3134
PythonActivity = autoclass('org.kivy.android.PythonActivity')
3235
activity = PythonActivity.mActivity
3336

34-
vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)
37+
vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE)
38+
vibrator = cast("android.os.Vibrator", vibrator_service)
3539

3640
ActivityInfo = autoclass('android.content.pm.ActivityInfo')
3741

@@ -50,7 +54,20 @@ def vibrate():
5054
print('ERROR: asked to vibrate but without time argument')
5155
print('asked to vibrate', args['time'])
5256

53-
vibrator.vibrate(float(args['time']) * 1000)
57+
if vibrator and SDK_INT >= 26:
58+
print("Using android's `VibrationEffect` (SDK >= 26)")
59+
VibrationEffect = autoclass("android.os.VibrationEffect")
60+
vibrator.vibrate(
61+
VibrationEffect.createOneShot(
62+
int(float(args['time']) * 1000),
63+
VibrationEffect.DEFAULT_AMPLITUDE,
64+
),
65+
)
66+
elif vibrator:
67+
print("Using deprecated android's vibrate (SDK < 26)")
68+
vibrator.vibrate(int(float(args['time']) * 1000))
69+
else:
70+
print('Something happened...vibrator service disabled?')
5471
print('vibrated')
5572

5673
@app.route('/loadUrl')

testapps/testapp_keyboard/main.py

+21-8
Original file line numberDiff line numberDiff line change
@@ -121,21 +121,34 @@ def on_pause(self):
121121

122122
def test_pyjnius(self, *args):
123123
try:
124-
from jnius import autoclass
124+
from jnius import autoclass, cast
125125
except ImportError:
126126
raise_error('Could not import pyjnius')
127127
return
128-
129128
print('Attempting to vibrate with pyjnius')
130-
# PythonActivity = autoclass('org.renpy.android.PythonActivity')
131-
# activity = PythonActivity.mActivity
129+
ANDROID_VERSION = autoclass('android.os.Build$VERSION')
130+
SDK_INT = ANDROID_VERSION.SDK_INT
131+
132+
Context = autoclass("android.content.Context")
132133
PythonActivity = autoclass('org.kivy.android.PythonActivity')
133134
activity = PythonActivity.mActivity
134-
Intent = autoclass('android.content.Intent')
135-
Context = autoclass('android.content.Context')
136-
vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)
137135

138-
vibrator.vibrate(1000)
136+
vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE)
137+
vibrator = cast("android.os.Vibrator", vibrator_service)
138+
139+
if vibrator and SDK_INT >= 26:
140+
print("Using android's `VibrationEffect` (SDK >= 26)")
141+
VibrationEffect = autoclass("android.os.VibrationEffect")
142+
vibrator.vibrate(
143+
VibrationEffect.createOneShot(
144+
1000, VibrationEffect.DEFAULT_AMPLITUDE,
145+
),
146+
)
147+
elif vibrator:
148+
print("Using deprecated android's vibrate (SDK < 26)")
149+
vibrator.vibrate(1000)
150+
else:
151+
print('Something happened...vibrator service disabled?')
139152

140153
def test_ctypes(self, *args):
141154
import ctypes

testapps/testapp_pillow/main.py

+25-16
Original file line numberDiff line numberDiff line change
@@ -337,25 +337,34 @@ def on_stop(self):
337337

338338
def test_pyjnius(self, *args):
339339
try:
340-
from jnius import autoclass
340+
from jnius import autoclass, cast
341341
except ImportError:
342-
raise_error("Could not import pyjnius")
342+
raise_error('Could not import pyjnius')
343343
return
344-
345-
print("Attempting to vibrate with pyjnius")
346-
# Todo: fix vibrate with Api level >= 26
347-
# vibrate was deprecated in API level 26:
348-
# https://developer.android.com/reference/android/os/Vibrator
349-
try:
350-
PythonActivity = autoclass("org.kivy.android.PythonActivity")
351-
activity = PythonActivity.mActivity
352-
Intent = autoclass("android.content.Intent")
353-
Context = autoclass("android.content.Context")
354-
vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)
355-
344+
print('Attempting to vibrate with pyjnius')
345+
ANDROID_VERSION = autoclass('android.os.Build$VERSION')
346+
SDK_INT = ANDROID_VERSION.SDK_INT
347+
348+
Context = autoclass("android.content.Context")
349+
PythonActivity = autoclass('org.kivy.android.PythonActivity')
350+
activity = PythonActivity.mActivity
351+
352+
vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE)
353+
vibrator = cast("android.os.Vibrator", vibrator_service)
354+
355+
if vibrator and SDK_INT >= 26:
356+
print("Using android's `VibrationEffect` (SDK >= 26)")
357+
VibrationEffect = autoclass("android.os.VibrationEffect")
358+
vibrator.vibrate(
359+
VibrationEffect.createOneShot(
360+
1000, VibrationEffect.DEFAULT_AMPLITUDE,
361+
),
362+
)
363+
elif vibrator:
364+
print("Using deprecated android's vibrate (SDK < 26)")
356365
vibrator.vibrate(1000)
357-
except Exception as e:
358-
raise_error("Error when trying to vibrate: {}".format(e))
366+
else:
367+
print('Something happened...vibrator service disabled?')
359368

360369
def test_ctypes(self, *args):
361370
try:

testapps/testapp_sqlite_openssl/main.py

+22-9
Original file line numberDiff line numberDiff line change
@@ -192,24 +192,37 @@ def on_pause(self):
192192

193193
def test_pyjnius(self, *args):
194194
try:
195-
from jnius import autoclass
195+
from jnius import autoclass, cast
196196
except ImportError:
197197
raise_error('Could not import pyjnius')
198198
return
199-
200199
print('Attempting to vibrate with pyjnius')
201-
# PythonActivity = autoclass('org.renpy.android.PythonActivity')
202-
# activity = PythonActivity.mActivity
200+
ANDROID_VERSION = autoclass('android.os.Build$VERSION')
201+
SDK_INT = ANDROID_VERSION.SDK_INT
202+
203+
Context = autoclass("android.content.Context")
203204
PythonActivity = autoclass('org.kivy.android.PythonActivity')
204205
activity = PythonActivity.mActivity
205-
Intent = autoclass('android.content.Intent')
206-
Context = autoclass('android.content.Context')
207-
vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)
208206

209-
vibrator.vibrate(1000)
207+
vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE)
208+
vibrator = cast("android.os.Vibrator", vibrator_service)
209+
210+
if vibrator and SDK_INT >= 26:
211+
print("Using android's `VibrationEffect` (SDK >= 26)")
212+
VibrationEffect = autoclass("android.os.VibrationEffect")
213+
vibrator.vibrate(
214+
VibrationEffect.createOneShot(
215+
1000, VibrationEffect.DEFAULT_AMPLITUDE,
216+
),
217+
)
218+
elif vibrator:
219+
print("Using deprecated android's vibrate (SDK < 26)")
220+
vibrator.vibrate(1000)
221+
else:
222+
print('Something happened...vibrator service disabled?')
210223

211224
def test_ctypes(self, *args):
212-
import ctypes
225+
pass
213226

214227
def test_numpy(self, *args):
215228
import numpy

0 commit comments

Comments
 (0)