Skip to content

Commit 8eec17b

Browse files
committed
chore(android): set default sms delay to 5 sec to avoid carrier/device throttling
1 parent 25c70eb commit 8eec17b

File tree

5 files changed

+57
-14
lines changed

5 files changed

+57
-14
lines changed

android/app/src/main/java/com/vernu/sms/AppConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ public class AppConstants {
2525
public static final String SHARED_PREFS_SMS_FILTER_CONFIG_KEY = "SMS_FILTER_CONFIG";
2626
public static final String SHARED_PREFS_DEVICE_NAME_KEY = "DEVICE_NAME";
2727
public static final String SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY = "SMS_SEND_DELAY_SECONDS";
28+
/** Default delay between SMS sends (seconds). 5s helps avoid carrier/device throttling. */
29+
public static final int DEFAULT_SMS_SEND_DELAY_SECONDS = 5;
2830
}

android/app/src/main/java/com/vernu/sms/activities/MainActivity.java

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
import com.vernu.sms.activities.SMSFilterActivity;
1111
import android.os.Build;
1212
import android.os.Bundle;
13+
import android.os.Handler;
14+
import android.os.Looper;
15+
import android.text.Editable;
16+
import android.text.TextWatcher;
1317
import android.util.Log;
1418
import android.view.View;
1519
import android.widget.Button;
@@ -56,6 +60,9 @@ public class MainActivity extends AppCompatActivity {
5660
private RadioGroup defaultSimSlotRadioGroup;
5761
private static final int SCAN_QR_REQUEST_CODE = 49374;
5862
private static final int PERMISSION_REQUEST_CODE = 0;
63+
private static final long SMS_DELAY_SAVE_DEBOUNCE_MS = 3000L;
64+
private final Handler smsDelaySaveHandler = new Handler(Looper.getMainLooper());
65+
private Runnable smsDelaySaveRunnable;
5966
private String deviceId = null;
6067
private static final String TAG = "MainActivity";
6168

@@ -257,16 +264,26 @@ public void onFailure(Call<RegisterDeviceResponseDTO> call, Throwable t) {
257264
startActivity(filterIntent);
258265
});
259266

260-
// SMS Send Delay setting
267+
// SMS Send Delay setting: save 3 seconds after user stops typing
261268
int currentDelay = SharedPreferenceHelper.getSharedPreferenceInt(
262-
mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, 1);
269+
mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, AppConstants.DEFAULT_SMS_SEND_DELAY_SECONDS);
263270
smsSendDelayEditText.setText(String.valueOf(currentDelay));
264-
smsSendDelayEditText.setOnFocusChangeListener((v, hasFocus) -> {
265-
if (!hasFocus) {
266-
saveSendDelay();
271+
smsDelaySaveRunnable = this::saveSendDelay;
272+
smsSendDelayEditText.addTextChangedListener(new TextWatcher() {
273+
@Override
274+
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
275+
276+
@Override
277+
public void onTextChanged(CharSequence s, int start, int before, int count) {}
278+
279+
@Override
280+
public void afterTextChanged(Editable s) {
281+
smsDelaySaveHandler.removeCallbacks(smsDelaySaveRunnable);
282+
smsDelaySaveHandler.postDelayed(smsDelaySaveRunnable, SMS_DELAY_SAVE_DEBOUNCE_MS);
267283
}
268284
});
269285
smsSendDelayEditText.setOnEditorActionListener((v, actionId, event) -> {
286+
smsDelaySaveHandler.removeCallbacks(smsDelaySaveRunnable);
270287
saveSendDelay();
271288
return false;
272289
});
@@ -275,25 +292,33 @@ public void onFailure(Call<RegisterDeviceResponseDTO> call, Throwable t) {
275292
private void saveSendDelay() {
276293
String text = smsSendDelayEditText.getText().toString().trim();
277294
if (text.isEmpty()) {
278-
smsSendDelayEditText.setText("1");
279-
SharedPreferenceHelper.setSharedPreferenceInt(mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, 1);
295+
int defaultDelay = AppConstants.DEFAULT_SMS_SEND_DELAY_SECONDS;
296+
smsSendDelayEditText.setText(String.valueOf(defaultDelay));
297+
SharedPreferenceHelper.setSharedPreferenceInt(mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, defaultDelay);
298+
Snackbar.make(smsSendDelayEditText, "SMS send delay saved (" + defaultDelay + " sec)", Snackbar.LENGTH_SHORT).show();
280299
return;
281300
}
282301
try {
283302
int value = Integer.parseInt(text);
284303
if (value < 0) {
285304
value = 0;
286305
smsSendDelayEditText.setText("0");
287-
Snackbar.make(smsSendDelayEditText, "Minimum delay is 0 seconds", Snackbar.LENGTH_SHORT).show();
306+
SharedPreferenceHelper.setSharedPreferenceInt(mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, 0);
307+
Snackbar.make(smsSendDelayEditText, "Minimum delay is 0 seconds. Saved.", Snackbar.LENGTH_SHORT).show();
288308
} else if (value > 3600) {
289309
value = 3600;
290310
smsSendDelayEditText.setText("3600");
291-
Snackbar.make(smsSendDelayEditText, "Maximum delay is 3600 seconds", Snackbar.LENGTH_SHORT).show();
311+
SharedPreferenceHelper.setSharedPreferenceInt(mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, 3600);
312+
Snackbar.make(smsSendDelayEditText, "Maximum delay is 3600 seconds. Saved.", Snackbar.LENGTH_SHORT).show();
313+
} else {
314+
SharedPreferenceHelper.setSharedPreferenceInt(mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, value);
315+
Snackbar.make(smsSendDelayEditText, "SMS send delay saved (" + value + " sec)", Snackbar.LENGTH_SHORT).show();
292316
}
293-
SharedPreferenceHelper.setSharedPreferenceInt(mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, value);
294317
} catch (NumberFormatException e) {
295-
smsSendDelayEditText.setText("1");
296-
SharedPreferenceHelper.setSharedPreferenceInt(mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, 1);
318+
int defaultDelay = AppConstants.DEFAULT_SMS_SEND_DELAY_SECONDS;
319+
smsSendDelayEditText.setText(String.valueOf(defaultDelay));
320+
SharedPreferenceHelper.setSharedPreferenceInt(mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, defaultDelay);
321+
Snackbar.make(smsSendDelayEditText, "Invalid value. Reset to " + defaultDelay + " sec.", Snackbar.LENGTH_SHORT).show();
297322
}
298323
}
299324

android/app/src/main/java/com/vernu/sms/dtos/HeartbeatInputDTO.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class HeartbeatInputDTO {
1616
private String timezone;
1717
private String locale;
1818
private Boolean receiveSMSEnabled;
19+
private Integer smsSendDelaySeconds;
1920
private SimInfoCollectionDTO simInfo;
2021

2122
public HeartbeatInputDTO() {
@@ -141,6 +142,14 @@ public void setReceiveSMSEnabled(Boolean receiveSMSEnabled) {
141142
this.receiveSMSEnabled = receiveSMSEnabled;
142143
}
143144

145+
public Integer getSmsSendDelaySeconds() {
146+
return smsSendDelaySeconds;
147+
}
148+
149+
public void setSmsSendDelaySeconds(Integer smsSendDelaySeconds) {
150+
this.smsSendDelaySeconds = smsSendDelaySeconds;
151+
}
152+
144153
public SimInfoCollectionDTO getSimInfo() {
145154
return simInfo;
146155
}

android/app/src/main/java/com/vernu/sms/helpers/HeartbeatHelper.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,14 @@ public static boolean sendHeartbeat(Context context, String deviceId, String api
138138
);
139139
heartbeatInput.setReceiveSMSEnabled(receiveSMSEnabled);
140140

141+
// SMS send delay (device queue)
142+
int smsSendDelaySeconds = SharedPreferenceHelper.getSharedPreferenceInt(
143+
context,
144+
AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY,
145+
AppConstants.DEFAULT_SMS_SEND_DELAY_SECONDS
146+
);
147+
heartbeatInput.setSmsSendDelaySeconds(smsSendDelaySeconds);
148+
141149
// Collect SIM information
142150
SimInfoCollectionDTO simInfoCollection = new SimInfoCollectionDTO();
143151
simInfoCollection.setLastUpdated(System.currentTimeMillis());

android/app/src/main/java/com/vernu/sms/workers/SmsSendWorker.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
public class SmsSendWorker extends Worker {
2020
private static final String TAG = "SmsSendWorker";
21-
private static final int DEFAULT_DELAY_SECONDS = 1;
2221
private static final String QUEUE_NAME = "sms_send_queue";
2322

2423
public static final String KEY_PHONE = "phone";
@@ -58,7 +57,7 @@ public Result doWork() {
5857

5958
// Enforce rate limit delay
6059
int delaySeconds = SharedPreferenceHelper.getSharedPreferenceInt(
61-
context, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, DEFAULT_DELAY_SECONDS);
60+
context, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, AppConstants.DEFAULT_SMS_SEND_DELAY_SECONDS);
6261
delaySeconds = Math.max(0, Math.min(delaySeconds, 3600));
6362

6463
if (delaySeconds > 0) {

0 commit comments

Comments
 (0)