|
10 | 10 | import com.vernu.sms.activities.SMSFilterActivity; |
11 | 11 | import android.os.Build; |
12 | 12 | import android.os.Bundle; |
| 13 | +import android.os.Handler; |
| 14 | +import android.os.Looper; |
| 15 | +import android.text.Editable; |
| 16 | +import android.text.TextWatcher; |
13 | 17 | import android.util.Log; |
14 | 18 | import android.view.View; |
15 | 19 | import android.widget.Button; |
@@ -49,13 +53,16 @@ public class MainActivity extends AppCompatActivity { |
49 | 53 |
|
50 | 54 | private Context mContext; |
51 | 55 | private Switch gatewaySwitch, receiveSMSSwitch, stickyNotificationSwitch; |
52 | | - private EditText apiKeyEditText, fcmTokenEditText, deviceIdEditText, deviceNameEditText; |
| 56 | + private EditText apiKeyEditText, fcmTokenEditText, deviceIdEditText, deviceNameEditText, smsSendDelayEditText; |
53 | 57 | private Button registerDeviceBtn, grantSMSPermissionBtn, scanQRBtn, checkUpdatesBtn, configureFilterBtn; |
54 | 58 | private ImageButton copyDeviceIdImgBtn; |
55 | 59 | private TextView deviceBrandAndModelTxt, deviceIdTxt, appVersionNameTxt, appVersionCodeTxt; |
56 | 60 | private RadioGroup defaultSimSlotRadioGroup; |
57 | 61 | private static final int SCAN_QR_REQUEST_CODE = 49374; |
58 | 62 | 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; |
59 | 66 | private String deviceId = null; |
60 | 67 | private static final String TAG = "MainActivity"; |
61 | 68 |
|
@@ -84,6 +91,7 @@ protected void onCreate(Bundle savedInstanceState) { |
84 | 91 | appVersionCodeTxt = findViewById(R.id.appVersionCodeTxt); |
85 | 92 | checkUpdatesBtn = findViewById(R.id.checkUpdatesBtn); |
86 | 93 | configureFilterBtn = findViewById(R.id.configureFilterBtn); |
| 94 | + smsSendDelayEditText = findViewById(R.id.smsSendDelayEditText); |
87 | 95 |
|
88 | 96 | deviceIdTxt.setText(deviceId); |
89 | 97 | deviceIdEditText.setText(deviceId); |
@@ -255,6 +263,63 @@ public void onFailure(Call<RegisterDeviceResponseDTO> call, Throwable t) { |
255 | 263 | Intent filterIntent = new Intent(MainActivity.this, SMSFilterActivity.class); |
256 | 264 | startActivity(filterIntent); |
257 | 265 | }); |
| 266 | + |
| 267 | + // SMS Send Delay setting: save 3 seconds after user stops typing |
| 268 | + int currentDelay = SharedPreferenceHelper.getSharedPreferenceInt( |
| 269 | + mContext, AppConstants.SHARED_PREFS_SMS_SEND_DELAY_SECONDS_KEY, AppConstants.DEFAULT_SMS_SEND_DELAY_SECONDS); |
| 270 | + smsSendDelayEditText.setText(String.valueOf(currentDelay)); |
| 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); |
| 283 | + } |
| 284 | + }); |
| 285 | + smsSendDelayEditText.setOnEditorActionListener((v, actionId, event) -> { |
| 286 | + smsDelaySaveHandler.removeCallbacks(smsDelaySaveRunnable); |
| 287 | + saveSendDelay(); |
| 288 | + return false; |
| 289 | + }); |
| 290 | + } |
| 291 | + |
| 292 | + private void saveSendDelay() { |
| 293 | + String text = smsSendDelayEditText.getText().toString().trim(); |
| 294 | + if (text.isEmpty()) { |
| 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(); |
| 299 | + return; |
| 300 | + } |
| 301 | + try { |
| 302 | + int value = Integer.parseInt(text); |
| 303 | + if (value < 0) { |
| 304 | + value = 0; |
| 305 | + smsSendDelayEditText.setText("0"); |
| 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(); |
| 308 | + } else if (value > 3600) { |
| 309 | + value = 3600; |
| 310 | + smsSendDelayEditText.setText("3600"); |
| 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(); |
| 316 | + } |
| 317 | + } catch (NumberFormatException e) { |
| 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(); |
| 322 | + } |
258 | 323 | } |
259 | 324 |
|
260 | 325 | private void renderAvailableSimOptions() { |
|
0 commit comments