From 012ff83a0613e38eac711a5e7eb96f15143c627d Mon Sep 17 00:00:00 2001 From: Jonas L Date: Mon, 11 Jun 2018 09:49:02 +0200 Subject: [PATCH] Add limit for the bell (vibration) This fixes https://github.com/termux/termux-app/issues/442 --- .../main/java/com/termux/app/BellUtil.java | 63 +++++++++++++++++++ .../java/com/termux/app/TermuxActivity.java | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/termux/app/BellUtil.java diff --git a/app/src/main/java/com/termux/app/BellUtil.java b/app/src/main/java/com/termux/app/BellUtil.java new file mode 100644 index 00000000..9ae2a694 --- /dev/null +++ b/app/src/main/java/com/termux/app/BellUtil.java @@ -0,0 +1,63 @@ +package com.termux.app; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.os.SystemClock; +import android.os.Vibrator; + +public class BellUtil { + private static BellUtil instance = null; + private static final Object lock = new Object(); + + public static BellUtil with(Context context) { + if (instance == null) { + synchronized (lock) { + if (instance == null) { + instance = new BellUtil((Vibrator) context.getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE)); + } + } + } + + return instance; + } + + private static final long DURATION = 50; + private static final long MIN_PAUSE = 3 * DURATION; + + private final Handler handler = new Handler(Looper.getMainLooper()); + private long lastBell = 0; + private final Runnable bellRunnable; + + private BellUtil(final Vibrator vibrator) { + bellRunnable = new Runnable() { + @Override + public void run() { + if (vibrator != null) { + vibrator.vibrate(DURATION); + } + } + }; + } + + public synchronized void doBell() { + long now = now(); + long timeSinceLastBell = now - lastBell; + + if (timeSinceLastBell < 0) { + // there is a next bell pending; don't schedule another one + } else if (timeSinceLastBell < MIN_PAUSE) { + // there was a bell recently, scheudle the next one + handler.postDelayed(bellRunnable, MIN_PAUSE - timeSinceLastBell); + lastBell = lastBell + MIN_PAUSE; + } else { + // the last bell was long ago, do it now + bellRunnable.run(); + lastBell = now; + } + } + + private long now() { + return SystemClock.uptimeMillis(); + } +} diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 0f8dfec6..0323024a 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -400,7 +400,7 @@ public final class TermuxActivity extends Activity implements ServiceConnection mBellSoundPool.play(mBellSoundId, 1.f, 1.f, 1, 0, 1.f); break; case TermuxPreferences.BELL_VIBRATE: - ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(50); + BellUtil.with(TermuxActivity.this).doBell(); break; case TermuxPreferences.BELL_IGNORE: // Ignore the bell character.