diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java index a585eb0f9..8ac78bff3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java @@ -39,10 +39,14 @@ import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; +import android.preference.EditTextPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceManager; import android.provider.Settings; +import android.widget.EditText; + +import androidx.annotation.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java index d4922d543..a912cea18 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java @@ -24,6 +24,8 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.media.AudioManager; +import android.os.Handler; +import android.os.Looper; import android.telephony.TelephonyManager; import org.slf4j.Logger; @@ -42,12 +44,14 @@ public class PhoneCallReceiver extends BroadcastReceiver { private boolean mRestoreMutedCall = false; private int mLastRingerMode; + private final Handler delayHandler = new Handler(Looper.getMainLooper()); + @Override public void onReceive(Context context, Intent intent) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE); if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) { mSavedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER"); - } else if(intent.getAction().equals("nodomain.freeyourgadget.gadgetbridge.MUTE_CALL")) { + } else if (intent.getAction().equals("nodomain.freeyourgadget.gadgetbridge.MUTE_CALL")) { // Handle the mute request only if the phone is currently ringing if (mLastState != TelephonyManager.CALL_STATE_RINGING) return; @@ -95,7 +99,7 @@ public class PhoneCallReceiver extends BroadcastReceiver { } else { callCommand = CallSpec.CALL_END; } - if(mRestoreMutedCall) { + if (mRestoreMutedCall) { mRestoreMutedCall = false; AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); audioManager.setRingerMode(mLastRingerMode); @@ -129,8 +133,39 @@ public class PhoneCallReceiver extends BroadcastReceiver { callSpec.number = mSavedNumber; callSpec.command = callCommand; callSpec.dndSuppressed = dndSuppressed; - GBApplication.deviceService().onSetCallState(callSpec); + + int callDelay = prefs.getInt("notification_delay_calls", 0); + if (callCommand == CallSpec.CALL_INCOMING) { + // Delay incoming call notifications by a configurable number of seconds + if (callDelay <= 0) { + GBApplication.deviceService().onSetCallState(callSpec); + } else { + scheduleOnSetCallState(callSpec, callDelay); + } + } else { + if (callCommand == CallSpec.CALL_START || callCommand == CallSpec.CALL_END) { + // Call started or ended, unschedule any outstanding notifications + unscheduleAllOnSetCallState(); + } + + // propagate the event to the device + GBApplication.deviceService().onSetCallState(callSpec); + } } mLastState = state; } + + private void scheduleOnSetCallState(final CallSpec callSpec, final int delaySeconds) { + final Runnable runnable = new Runnable() { + @Override public void run() { + GBApplication.deviceService().onSetCallState(callSpec); + } + }; + + delayHandler.postDelayed(runnable, delaySeconds * 1000); + } + + private void unscheduleAllOnSetCallState() { + delayHandler.removeCallbacksAndMessages(null); + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3805107fe..e41050a0a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -163,6 +163,8 @@ Notifications Repetitions Phone Calls + Call notification delay + Delay before sending incoming call notifications to the device, in seconds. Enable VoIP app calls Ping tone SMS diff --git a/app/src/main/res/xml/notifications_preferences.xml b/app/src/main/res/xml/notifications_preferences.xml index 33f4ac10f..7f732a5ea 100644 --- a/app/src/main/res/xml/notifications_preferences.xml +++ b/app/src/main/res/xml/notifications_preferences.xml @@ -42,6 +42,14 @@ android:key="notification_support_voip_calls" android:layout="@layout/preference_checkbox" android:title="@string/pref_title_support_voip_calls" /> +