From c5aa7d6a91bf152f73f86bdd124e06c5f2e41ced Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 28 Aug 2022 01:34:16 +0530 Subject: [PATCH 01/12] Add dialpad tones, vibration preferences --- app/src/main/AndroidManifest.xml | 1 + .../dialer/activities/DialpadActivity.kt | 23 +++++++++- .../dialer/activities/SettingsActivity.kt | 18 ++++++++ .../dialer/extensions/Context.kt | 9 ++++ .../dialer/helpers/Config.kt | 8 ++++ .../dialer/helpers/Constants.kt | 5 +- .../dialer/helpers/ToneGeneratorHelper.kt | 46 +++++++++++++++++++ app/src/main/res/layout/activity_settings.xml | 34 +++++++++++++- 8 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a1d69f9..55d3de36 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,6 +18,7 @@ + ().apply { + put('0', ToneGenerator.TONE_DTMF_0) + put('1', ToneGenerator.TONE_DTMF_1) + put('2', ToneGenerator.TONE_DTMF_2) + put('3', ToneGenerator.TONE_DTMF_3) + put('4', ToneGenerator.TONE_DTMF_4) + put('5', ToneGenerator.TONE_DTMF_5) + put('6', ToneGenerator.TONE_DTMF_6) + put('7', ToneGenerator.TONE_DTMF_7) + put('8', ToneGenerator.TONE_DTMF_8) + put('9', ToneGenerator.TONE_DTMF_9) + put('#', ToneGenerator.TONE_DTMF_P) + put('*', ToneGenerator.TONE_DTMF_S) + } + } + } +} diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 4696282a..2980c77f 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -189,7 +189,7 @@ style="@style/SettingsHolderCheckboxStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/ripple_bottom_corners"> + android:background="@drawable/ripple_background"> + + + + + + + + + + + + Date: Sun, 28 Aug 2022 02:17:22 +0530 Subject: [PATCH 02/12] Wait a little before stopping tone --- .../com/simplemobiletools/dialer/helpers/CallManager.kt | 5 ++++- .../kotlin/com/simplemobiletools/dialer/helpers/Constants.kt | 2 ++ .../simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt | 3 +-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt index 8ff7fa19..5a3b3ad0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.dialer.helpers import android.annotation.SuppressLint +import android.os.Handler import android.telecom.Call import android.telecom.InCallService import android.telecom.VideoProfile @@ -169,7 +170,9 @@ class CallManager { fun keypad(c: Char) { call?.playDtmfTone(c) - call?.stopDtmfTone() + Handler().postDelayed({ + call?.stopDtmfTone() + }, DIALPAD_TONE_LENGTH_MS) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt index f3a59130..fed05215 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt @@ -24,3 +24,5 @@ val tabsList = arrayListOf(TAB_CONTACTS, TAB_FAVORITES, TAB_CALL_HISTORY) private const val PATH = "com.simplemobiletools.dialer.action." const val ACCEPT_CALL = PATH + "accept_call" const val DECLINE_CALL = PATH + "decline_call" + +const val DIALPAD_TONE_LENGTH_MS = 150L // The length of DTMF tones in milliseconds diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt index e4de767d..6e1453e6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt @@ -14,7 +14,7 @@ class ToneGeneratorHelper(context: Context) { fun playTone(char: Char) = playTone(charToTone[char] ?: -1) - fun playTone(tone: Int, durationMs: Int = TONE_LENGTH_MS) { + fun playTone(tone: Int, durationMs: Int = DIALPAD_TONE_LENGTH_MS.toInt()) { if (tone != -1 && !isSilent) { toneGenerator.stopTone() toneGenerator.startTone(tone, durationMs) @@ -22,7 +22,6 @@ class ToneGeneratorHelper(context: Context) { } companion object { - const val TONE_LENGTH_MS = 150 // The length of DTMF tones in milliseconds const val TONE_RELATIVE_VOLUME = 80 // The DTMF tone volume relative to other sounds in the stream const val DIAL_TONE_STREAM_TYPE = STREAM_DTMF From 004515bc4622e65736000dcbd3eeb7b5870068f8 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sun, 28 Aug 2022 02:26:29 +0530 Subject: [PATCH 03/12] Try to respect in-app dialpad tone preference --- .../dialer/activities/CallActivity.kt | 2 +- .../dialer/helpers/CallManager.kt | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt index 97d53bb9..42bdb03d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt @@ -364,7 +364,7 @@ class CallActivity : SimpleActivity() { } private fun dialpadPressed(char: Char) { - CallManager.keypad(char) + CallManager.keypad(this, char) dialpad_input.addCharacter(char) } diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt index 5a3b3ad0..f86f09ab 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt @@ -1,10 +1,12 @@ package com.simplemobiletools.dialer.helpers import android.annotation.SuppressLint +import android.content.Context import android.os.Handler import android.telecom.Call import android.telecom.InCallService import android.telecom.VideoProfile +import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.getStateCompat import com.simplemobiletools.dialer.extensions.hasCapability import com.simplemobiletools.dialer.extensions.isConference @@ -168,11 +170,15 @@ class CallManager { fun getState() = getPrimaryCall()?.getStateCompat() - fun keypad(c: Char) { - call?.playDtmfTone(c) - Handler().postDelayed({ + fun keypad(context: Context, char: Char) { + call?.playDtmfTone(char) + if (context.config.dialpadBeeps) { + Handler().postDelayed({ + call?.stopDtmfTone() + }, DIALPAD_TONE_LENGTH_MS) + } else { call?.stopDtmfTone() - }, DIALPAD_TONE_LENGTH_MS) + } } } } From 091c4d9d9bf34a563d78059ef64efa3aeb6843df Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 29 Aug 2022 00:57:20 +0530 Subject: [PATCH 04/12] Move helper extension to activity --- .../dialer/activities/DialpadActivity.kt | 6 ++++-- .../com/simplemobiletools/dialer/extensions/Context.kt | 9 --------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt index f1037fe1..dd987b47 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt @@ -19,6 +19,7 @@ import com.simplemobiletools.commons.models.SimpleContact import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.adapters.ContactsAdapter import com.simplemobiletools.dialer.extensions.* +import com.simplemobiletools.dialer.helpers.ToneGeneratorHelper import com.simplemobiletools.dialer.models.SpeedDial import kotlinx.android.synthetic.main.activity_dialpad.* import kotlinx.android.synthetic.main.activity_dialpad.dialpad_holder @@ -31,6 +32,7 @@ class DialpadActivity : SimpleActivity() { private val russianCharsMap = HashMap() private var hasRussianLocale = false private var privateCursor: Cursor? = null + private var toneGeneratorHelper: ToneGeneratorHelper? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -296,9 +298,9 @@ class DialpadActivity : SimpleActivity() { if (config.dialpadBeeps) { if (char == '+') { // 0 is being long pressed - playOnetimeTone('0') + toneGeneratorHelper?.playTone('0') } else { - playOnetimeTone(char) + toneGeneratorHelper?.playTone(char) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/Context.kt index 0b377fb3..ac7a3e65 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/Context.kt @@ -7,7 +7,6 @@ import android.net.Uri import android.os.PowerManager import com.simplemobiletools.commons.extensions.telecomManager import com.simplemobiletools.dialer.helpers.Config -import com.simplemobiletools.dialer.helpers.ToneGeneratorHelper import com.simplemobiletools.dialer.models.SIMAccount val Context.config: Config get() = Config.newInstance(applicationContext) @@ -45,11 +44,3 @@ fun Context.areMultipleSIMsAvailable(): Boolean { false } } - -private var toneGeneratorHelperInstance: ToneGeneratorHelper? = null -fun Context.playOnetimeTone(char: Char) { - if (toneGeneratorHelperInstance == null) { - toneGeneratorHelperInstance = ToneGeneratorHelper(this) - } - toneGeneratorHelperInstance?.playTone(char) -} From 21c6c3c83511a439310841e8874c7cd8a31b08ab Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 29 Aug 2022 00:57:48 +0530 Subject: [PATCH 05/12] Convert property to function --- .../dialer/helpers/ToneGeneratorHelper.kt | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt index 6e1453e6..271381cd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt @@ -9,13 +9,14 @@ class ToneGeneratorHelper(context: Context) { private val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager private val toneGenerator = ToneGenerator(DIAL_TONE_STREAM_TYPE, TONE_RELATIVE_VOLUME) - private val isSilent: Boolean - get() = audioManager.ringerMode in arrayOf(AudioManager.RINGER_MODE_SILENT, AudioManager.RINGER_MODE_VIBRATE) + private fun isSilent(): Boolean { + return audioManager.ringerMode in arrayOf(AudioManager.RINGER_MODE_SILENT, AudioManager.RINGER_MODE_VIBRATE) + } fun playTone(char: Char) = playTone(charToTone[char] ?: -1) fun playTone(tone: Int, durationMs: Int = DIALPAD_TONE_LENGTH_MS.toInt()) { - if (tone != -1 && !isSilent) { + if (tone != -1 && !isSilent()) { toneGenerator.stopTone() toneGenerator.startTone(tone, durationMs) } @@ -25,21 +26,19 @@ class ToneGeneratorHelper(context: Context) { const val TONE_RELATIVE_VOLUME = 80 // The DTMF tone volume relative to other sounds in the stream const val DIAL_TONE_STREAM_TYPE = STREAM_DTMF - private val charToTone by lazy { - HashMap().apply { - put('0', ToneGenerator.TONE_DTMF_0) - put('1', ToneGenerator.TONE_DTMF_1) - put('2', ToneGenerator.TONE_DTMF_2) - put('3', ToneGenerator.TONE_DTMF_3) - put('4', ToneGenerator.TONE_DTMF_4) - put('5', ToneGenerator.TONE_DTMF_5) - put('6', ToneGenerator.TONE_DTMF_6) - put('7', ToneGenerator.TONE_DTMF_7) - put('8', ToneGenerator.TONE_DTMF_8) - put('9', ToneGenerator.TONE_DTMF_9) - put('#', ToneGenerator.TONE_DTMF_P) - put('*', ToneGenerator.TONE_DTMF_S) - } + private val charToTone = HashMap().apply { + put('0', ToneGenerator.TONE_DTMF_0) + put('1', ToneGenerator.TONE_DTMF_1) + put('2', ToneGenerator.TONE_DTMF_2) + put('3', ToneGenerator.TONE_DTMF_3) + put('4', ToneGenerator.TONE_DTMF_4) + put('5', ToneGenerator.TONE_DTMF_5) + put('6', ToneGenerator.TONE_DTMF_6) + put('7', ToneGenerator.TONE_DTMF_7) + put('8', ToneGenerator.TONE_DTMF_8) + put('9', ToneGenerator.TONE_DTMF_9) + put('#', ToneGenerator.TONE_DTMF_P) + put('*', ToneGenerator.TONE_DTMF_S) } } } From afd81341bbb033d1e2e670f841eeb326c729c67c Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 29 Aug 2022 00:58:17 +0530 Subject: [PATCH 06/12] Fix type --- .../kotlin/com/simplemobiletools/dialer/helpers/Constants.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt index fed05215..3ed434d7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt @@ -15,7 +15,7 @@ const val SHOW_TABS = "show_tabs" const val FAVORITES_CONTACTS_ORDER = "favorites_contacts_order" const val FAVORITES_CUSTOM_ORDER_SELECTED = "favorites_custom_order_selected" const val WAS_OVERLAY_SNACKBAR_CONFIRMED = "was_overlay_snackbar_confirmed" -const val DIALPAD_VIBRATION = "touch_vibration" +const val DIALPAD_VIBRATION = "dialpad_vibration" const val DIALPAD_BEEPS = "dialpad_beeps" const val ALL_TABS_MASK = TAB_CONTACTS or TAB_FAVORITES or TAB_CALL_HISTORY From 60ea4ec0f354797805c79ad6be4b65074b90b0d7 Mon Sep 17 00:00:00 2001 From: Naveen Date: Mon, 29 Aug 2022 02:26:42 +0530 Subject: [PATCH 07/12] Init tone generator --- .../com/simplemobiletools/dialer/activities/DialpadActivity.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt index dd987b47..23e285c3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt @@ -47,6 +47,8 @@ class DialpadActivity : SimpleActivity() { speedDialValues = config.getSpeedDialValues() privateCursor = getMyContactsCursor(false, true) + toneGeneratorHelper = ToneGeneratorHelper(this) + if (hasRussianLocale) { initRussianChars() dialpad_2_letters.append("\nАБВГ") From a1e2684269c437928a6d1c7af21b031bae600876 Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 2 Sep 2022 17:20:42 +0530 Subject: [PATCH 08/12] Continuously play tone while button is pressed --- .../dialer/activities/DialpadActivity.kt | 107 ++++++++++++------ .../dialer/helpers/ToneGeneratorHelper.kt | 11 +- 2 files changed, 82 insertions(+), 36 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt index 23e285c3..ce35d8af 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt @@ -1,17 +1,22 @@ package com.simplemobiletools.dialer.activities +import android.annotation.SuppressLint import android.annotation.TargetApi import android.content.Intent import android.database.Cursor import android.net.Uri import android.os.Build import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.provider.Telephony.Sms.Intents.SECRET_CODE_ACTION import android.telephony.PhoneNumberUtils import android.telephony.TelephonyManager import android.util.TypedValue import android.view.KeyEvent +import android.view.MotionEvent import android.view.View +import android.view.ViewConfiguration import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* @@ -33,6 +38,9 @@ class DialpadActivity : SimpleActivity() { private var hasRussianLocale = false private var privateCursor: Cursor? = null private var toneGeneratorHelper: ToneGeneratorHelper? = null + private val longPressTimeout = ViewConfiguration.getLongPressTimeout().toLong() + private val longPressHandler = Handler(Looper.getMainLooper()) + private val pressedKeys = mutableSetOf() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -69,30 +77,19 @@ class DialpadActivity : SimpleActivity() { } } - dialpad_0_holder.setOnClickListener { dialpadPressed('0', it) } - dialpad_1_holder.setOnClickListener { dialpadPressed('1', it) } - dialpad_2_holder.setOnClickListener { dialpadPressed('2', it) } - dialpad_3_holder.setOnClickListener { dialpadPressed('3', it) } - dialpad_4_holder.setOnClickListener { dialpadPressed('4', it) } - dialpad_5_holder.setOnClickListener { dialpadPressed('5', it) } - dialpad_6_holder.setOnClickListener { dialpadPressed('6', it) } - dialpad_7_holder.setOnClickListener { dialpadPressed('7', it) } - dialpad_8_holder.setOnClickListener { dialpadPressed('8', it) } - dialpad_9_holder.setOnClickListener { dialpadPressed('9', it) } + setupCharClick(dialpad_1_holder, '1') + setupCharClick(dialpad_2_holder, '2') + setupCharClick(dialpad_3_holder, '3') + setupCharClick(dialpad_4_holder, '4') + setupCharClick(dialpad_5_holder, '5') + setupCharClick(dialpad_6_holder, '6') + setupCharClick(dialpad_7_holder, '7') + setupCharClick(dialpad_8_holder, '8') + setupCharClick(dialpad_9_holder, '9') + setupCharClick(dialpad_0_holder, '0') + setupCharClick(dialpad_asterisk_holder, '*', longClickable = false) + setupCharClick(dialpad_hashtag_holder, '#', longClickable = false) - dialpad_1_holder.setOnLongClickListener { speedDial(1); true } - dialpad_2_holder.setOnLongClickListener { speedDial(2); true } - dialpad_3_holder.setOnLongClickListener { speedDial(3); true } - dialpad_4_holder.setOnLongClickListener { speedDial(4); true } - dialpad_5_holder.setOnLongClickListener { speedDial(5); true } - dialpad_6_holder.setOnLongClickListener { speedDial(6); true } - dialpad_7_holder.setOnLongClickListener { speedDial(7); true } - dialpad_8_holder.setOnLongClickListener { speedDial(8); true } - dialpad_9_holder.setOnLongClickListener { speedDial(9); true } - - dialpad_0_holder.setOnLongClickListener { dialpadPressed('+', null); true } - dialpad_asterisk_holder.setOnClickListener { dialpadPressed('*', it) } - dialpad_hashtag_holder.setOnClickListener { dialpadPressed('#', it) } dialpad_clear_char.setOnClickListener { clearChar(it) } dialpad_clear_char.setOnLongClickListener { clearInput(); true } dialpad_call_button.setOnClickListener { initCall(dialpad_input.value, 0) } @@ -169,7 +166,6 @@ class DialpadActivity : SimpleActivity() { private fun dialpadPressed(char: Char, view: View?) { dialpad_input.addCharacter(char) maybePerformDialpadHapticFeedback(view) - maybePlayDialpadTone(char) } private fun clearChar(view: View) { @@ -275,14 +271,15 @@ class DialpadActivity : SimpleActivity() { } } - private fun speedDial(id: Int) { - maybePlayDialpadTone(id.digitToChar()) - if (dialpad_input.value.isEmpty()) { + private fun speedDial(id: Int): Boolean { + if (dialpad_input.value.length == 1) { val speedDial = speedDialValues.firstOrNull { it.id == id } if (speedDial?.isValid() == true) { initCall(speedDial.number, -1) + return true } } + return false } private fun initRussianChars() { @@ -296,13 +293,20 @@ class DialpadActivity : SimpleActivity() { russianCharsMap['ь'] = 9; russianCharsMap['э'] = 9; russianCharsMap['ю'] = 9; russianCharsMap['я'] = 9 } - private fun maybePlayDialpadTone(char: Char) { + private fun startDialpadTone(char: Char) { if (config.dialpadBeeps) { - if (char == '+') { - // 0 is being long pressed - toneGeneratorHelper?.playTone('0') + pressedKeys.add(char) + toneGeneratorHelper?.startTone(char) + } + } + + private fun stopDialpadTone(char: Char) { + if (config.dialpadBeeps) { + pressedKeys.remove(char) + if (pressedKeys.isEmpty()) { + toneGeneratorHelper?.stopTone() } else { - toneGeneratorHelper?.playTone(char) + startDialpadTone(pressedKeys.last()) } } } @@ -312,4 +316,43 @@ class DialpadActivity : SimpleActivity() { view?.performHapticFeedback() } } + + private fun performLongClick(view: View, char: Char) { + if (char == '0') { + clearChar(view) + dialpadPressed('+', view) + } else { + val result = speedDial(char.digitToInt()) + if (result) { + stopDialpadTone(char) + } + } + } + + @SuppressLint("ClickableViewAccessibility") + private fun setupCharClick(view: View, char: Char, longClickable: Boolean = true) { + view.isClickable = true + view.isLongClickable = true + view.setOnTouchListener { _, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> { + dialpadPressed(char, view) + startDialpadTone(char) + if (longClickable) { + longPressHandler.removeCallbacksAndMessages(null) + longPressHandler.postDelayed({ + performLongClick(view, char) + }, longPressTimeout) + } + } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + stopDialpadTone(char) + if (longClickable) { + longPressHandler.removeCallbacksAndMessages(null) + } + } + } + false + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt index 271381cd..f2008ecc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/ToneGeneratorHelper.kt @@ -13,15 +13,18 @@ class ToneGeneratorHelper(context: Context) { return audioManager.ringerMode in arrayOf(AudioManager.RINGER_MODE_SILENT, AudioManager.RINGER_MODE_VIBRATE) } - fun playTone(char: Char) = playTone(charToTone[char] ?: -1) + fun startTone(char: Char) { + startTone(charToTone[char] ?: -1) + } - fun playTone(tone: Int, durationMs: Int = DIALPAD_TONE_LENGTH_MS.toInt()) { + private fun startTone(tone: Int) { if (tone != -1 && !isSilent()) { - toneGenerator.stopTone() - toneGenerator.startTone(tone, durationMs) + toneGenerator.startTone(tone) } } + fun stopTone() = toneGenerator.stopTone() + companion object { const val TONE_RELATIVE_VOLUME = 80 // The DTMF tone volume relative to other sounds in the stream const val DIAL_TONE_STREAM_TYPE = STREAM_DTMF From 9c4ef6b6287feaab72c41d49bd3a3b8fa81e2963 Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 2 Sep 2022 17:59:49 +0530 Subject: [PATCH 09/12] Stop playing tone on action move --- .../dialer/activities/DialpadActivity.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt index ce35d8af..0ca18c9a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.annotation.TargetApi import android.content.Intent import android.database.Cursor +import android.graphics.Rect import android.net.Uri import android.os.Build import android.os.Bundle @@ -30,6 +31,8 @@ import kotlinx.android.synthetic.main.activity_dialpad.* import kotlinx.android.synthetic.main.activity_dialpad.dialpad_holder import kotlinx.android.synthetic.main.dialpad.* import java.util.* +import kotlin.math.roundToInt + class DialpadActivity : SimpleActivity() { private var allContacts = ArrayList() @@ -351,6 +354,18 @@ class DialpadActivity : SimpleActivity() { longPressHandler.removeCallbacksAndMessages(null) } } + MotionEvent.ACTION_MOVE -> { + val outLocation = IntArray(2) + view.getLocationOnScreen(outLocation) + val rect = Rect(outLocation[0], outLocation[1], outLocation[0] + view.width, outLocation[1] + view.height) + val viewContainsTouchEvent = rect.contains(event.rawX.roundToInt(), event.rawY.roundToInt()) + if (!viewContainsTouchEvent) { + stopDialpadTone(char) + if (longClickable) { + longPressHandler.removeCallbacksAndMessages(null) + } + } + } } false } From 0ddaaceed147606c15070f1007a75e940f7ec6f7 Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 2 Sep 2022 18:07:14 +0530 Subject: [PATCH 10/12] Minor readability improvement --- .../dialer/activities/DialpadActivity.kt | 6 +----- .../com/simplemobiletools/dialer/extensions/View.kt | 8 ++++++++ 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/dialer/extensions/View.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt index 0ca18c9a..fe59ab9c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import android.annotation.TargetApi import android.content.Intent import android.database.Cursor -import android.graphics.Rect import android.net.Uri import android.os.Build import android.os.Bundle @@ -355,10 +354,7 @@ class DialpadActivity : SimpleActivity() { } } MotionEvent.ACTION_MOVE -> { - val outLocation = IntArray(2) - view.getLocationOnScreen(outLocation) - val rect = Rect(outLocation[0], outLocation[1], outLocation[0] + view.width, outLocation[1] + view.height) - val viewContainsTouchEvent = rect.contains(event.rawX.roundToInt(), event.rawY.roundToInt()) + val viewContainsTouchEvent = view.boundingBox.contains(event.rawX.roundToInt(), event.rawY.roundToInt()) if (!viewContainsTouchEvent) { stopDialpadTone(char) if (longClickable) { diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/View.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/View.kt new file mode 100644 index 00000000..60980027 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/View.kt @@ -0,0 +1,8 @@ +package com.simplemobiletools.dialer.extensions + +import android.graphics.Rect +import android.view.View + +val View.boundingBox + get() = Rect().also { getGlobalVisibleRect(it) } + From d2c0d714872409403fabdcd918c7449dcdad3c12 Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 2 Sep 2022 18:45:12 +0530 Subject: [PATCH 11/12] Avoid calling startTone repeatedly --- .../com/simplemobiletools/dialer/activities/DialpadActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt index fe59ab9c..0e9906d7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt @@ -304,7 +304,7 @@ class DialpadActivity : SimpleActivity() { private fun stopDialpadTone(char: Char) { if (config.dialpadBeeps) { - pressedKeys.remove(char) + if (!pressedKeys.remove(char)) return if (pressedKeys.isEmpty()) { toneGeneratorHelper?.stopTone() } else { From a78f9cfb061864f05bad507cb9a92e70b38e9d6d Mon Sep 17 00:00:00 2001 From: Naveen Date: Sat, 3 Sep 2022 00:02:48 +0530 Subject: [PATCH 12/12] Clear char on speed dial --- .../com/simplemobiletools/dialer/activities/DialpadActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt index 0e9906d7..bb7aba04 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt @@ -327,6 +327,7 @@ class DialpadActivity : SimpleActivity() { val result = speedDial(char.digitToInt()) if (result) { stopDialpadTone(char) + clearChar(view) } } }