From 956e20e53dfead797f8e279f300579484dbf985a Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Sat, 21 Aug 2021 04:22:43 +0500 Subject: [PATCH] Fixed: Fix NullPointerException when running bell/vibrate on Samsung devices on android 8 and handled deprecated code Apparently occurs on only Samsung android 8 devices and there is no fix for vibrator except catching the exception so that app doesn't crash. https://gitlab.com/juanitobananas/wave-up/-/issues/131 https://github.com/overbound/SonicTimeTwisted/issues/131 https://web.archive.org/web/20201114040257/https://www.badlogicgames.com/forum/viewtopic.php?t=28507 ``` java.lang.NullPointerException: Attempt to read from field 'android.os.VibrationEffect com.android.server.VibratorService$Vibration.mEffect' on a null object reference at android.os.Parcel.readException(Parcel.java:2035) at android.os.Parcel.readException(Parcel.java:1975) at android.os.IVibratorService$Stub$Proxy.vibrate(IVibratorService.java:292) at android.os.SystemVibrator.vibrate(SystemVibrator.java:81) at android.os.Vibrator.vibrate(Vibrator.java:191) at android.os.Vibrator.vibrate(Vibrator.java:110) at android.os.Vibrator.vibrate(Vibrator.java:89) at com.termux.app.terminal.io.BellHandler$1.run(BellHandler.java:37) at com.termux.app.terminal.io.BellHandler.doBell(BellHandler.java:55) at com.termux.app.terminal.TermuxTerminalSessionClient.onBell(TermuxTerminalSessionClient.java:178) at com.termux.terminal.TerminalSession.onBell(TerminalSession.java:278) ``` --- .../termux/app/terminal/io/BellHandler.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/terminal/io/BellHandler.java b/app/src/main/java/com/termux/app/terminal/io/BellHandler.java index 728e12e6..76f592c7 100644 --- a/app/src/main/java/com/termux/app/terminal/io/BellHandler.java +++ b/app/src/main/java/com/termux/app/terminal/io/BellHandler.java @@ -1,15 +1,21 @@ package com.termux.app.terminal.io; import android.content.Context; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.SystemClock; +import android.os.VibrationEffect; import android.os.Vibrator; +import com.termux.shared.logger.Logger; + public class BellHandler { private static BellHandler instance = null; private static final Object lock = new Object(); + private static final String LOG_TAG = "BellHandler"; + public static BellHandler getInstance(Context context) { if (instance == null) { synchronized (lock) { @@ -34,7 +40,17 @@ public class BellHandler { @Override public void run() { if (vibrator != null) { - vibrator.vibrate(DURATION); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + vibrator.vibrate(VibrationEffect.createOneShot(DURATION, VibrationEffect.DEFAULT_AMPLITUDE)); + } else { + vibrator.vibrate(DURATION); + } + } catch (Exception e) { + // Issue on samsung devices on android 8 + // java.lang.NullPointerException: Attempt to read from field 'android.os.VibrationEffect com.android.server.VibratorService$Vibration.mEffect' on a null object reference + Logger.logStackTraceWithMessage(LOG_TAG, "Failed to run vibrator", e); + } } } };