77import android .Manifest ;
88import android .annotation .SuppressLint ;
99import android .app .Activity ;
10+ import android .app .ProgressDialog ;
1011import android .content .Context ;
12+ import android .content .DialogInterface ;
1113import android .content .Intent ;
1214import android .content .SharedPreferences ;
1315import android .content .pm .PackageManager ;
2628import com .google .i18n .phonenumbers .PhoneNumberUtil ;
2729import com .wdullaer .materialdatetimepicker .time .TimePickerDialog ;
2830
31+ import org .havenapp .main .service .SignalExecutorTask ;
2932import org .havenapp .main .service .SignalSender ;
3033import org .havenapp .main .service .WebServer ;
3134import org .havenapp .main .ui .AccelConfigureActivity ;
3639import java .util .Locale ;
3740
3841import androidx .annotation .NonNull ;
42+ import androidx .appcompat .app .AlertDialog ;
3943import androidx .appcompat .app .AppCompatActivity ;
4044import androidx .core .app .ActivityCompat ;
4145import androidx .core .content .ContextCompat ;
@@ -156,6 +160,11 @@ public void onCreatePreferences(Bundle bundle, String s) {
156160 findPreference (PreferenceManager .NOTIFICATION_TIME ).setSummary (preferences .getNotificationTimeMs ()/60000 + " " + getString (R .string .minutes ));
157161 }
158162
163+ findPreference (PreferenceManager .RESET_SIGNAL_CONFIG ).setOnPreferenceClickListener (preference -> {
164+ showResetSignalDialog ();
165+ return true ;
166+ });
167+
159168 if (preferences .getHeartbeatActive ())
160169 {
161170 ((SwitchPreference ) findPreference (PreferenceManager .HEARTBEAT_MONITOR_ACTIVE )).setChecked (true );
@@ -215,11 +224,27 @@ public void onCreatePreferences(Bundle bundle, String s) {
215224 });
216225
217226 checkSignalUsername ();
227+ checkSignalUsernameVerification ();
218228 ((EditTextPreference ) findPreference (PreferenceManager .VERIFY_SIGNAL )).setText ("" );
219229 askForPermission (Manifest .permission .WRITE_EXTERNAL_STORAGE , 1 );
220230
221231 }
222232
233+ private void showResetSignalDialog () {
234+ new AlertDialog .Builder (getActivity ())
235+ .setTitle (R .string .reset_configuration_question )
236+ .setMessage (R .string .reset_configuration_desc )
237+ .setPositiveButton (android .R .string .yes , (dialog , which ) -> {
238+ dialog .dismiss ();
239+ resetSignalAndClearPrefs ();
240+ findPreference (PreferenceManager .REGISTER_SIGNAL ).setSummary (R .string .signal_dialog_summary );
241+ findPreference (PreferenceManager .NOTIFICATION_TIME ).setSummary (R .string .notification_time_summary );
242+ checkSignalUsernameVerification ();
243+ })
244+ .setNegativeButton (android .R .string .no , (dialog , which ) -> dialog .dismiss ())
245+ .show ();
246+ }
247+
223248 private boolean canSendRemoteNotification () {
224249 String remotePhoneNumber = preferences .getRemotePhoneNumber ();
225250 String signalUsername = preferences .getSignalUsername ();
@@ -241,6 +266,9 @@ private void collectDataForRemoteNotification() {
241266 if (TextUtils .isEmpty (signalUsername )) {
242267 findPreference (PreferenceManager .REGISTER_SIGNAL ).performClick ();
243268 } else {
269+ if (getActivity () != null ) {
270+ Utils .hideKeyboard (getActivity ());
271+ }
244272 activateSignal (signalUsername , null );
245273 }
246274 }
@@ -281,8 +309,6 @@ protected void save() {
281309
282310 preferences .setActivateVideoMonitoring (videoMonitoringActive );
283311
284- preferences .setSignalUsername (((EditTextPreference ) findPreference (PreferenceManager .REGISTER_SIGNAL )).getText ());
285-
286312 boolean remoteNotificationActive =
287313 ((SwitchPreference ) findPreference (PreferenceManager .REMOTE_NOTIFICATION_ACTIVE )).isChecked ();
288314 preferences .setRemoteNotificationActive (remoteNotificationActive );
@@ -396,22 +422,32 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin
396422 findPreference (PreferenceManager .REGISTER_SIGNAL ).setSummary (signalNum );
397423
398424 resetSignal (preferences .getSignalUsername ());
425+ if (getActivity () != null ) {
426+ Utils .hideKeyboard (getActivity ());
427+ }
399428 activateSignal (preferences .getSignalUsername (), null );
400429 } else if (!getCountryCode ().equalsIgnoreCase (signalNum )) {
401- preferences .setSignalUsername ("" );
430+ preferences .setSignalUsername (null );
402431 findPreference (PreferenceManager .REGISTER_SIGNAL ).setSummary (R .string .register_signal_desc );
403432 }
404433 onRemoteNotificationParameterChange ();
434+ checkSignalUsernameVerification ();
405435 break ;
406436 case PreferenceManager .VERIFY_SIGNAL : {
407437 String text = ((EditTextPreference ) findPreference (PreferenceManager .VERIFY_SIGNAL )).getText ();
438+ if (getActivity () != null ) {
439+ Utils .hideKeyboard (getActivity ());
440+ }
408441 activateSignal (preferences .getSignalUsername (), text );
409442 onRemoteNotificationParameterChange ();
410443 break ;
411444 }
412445 case PreferenceManager .REMOTE_PHONE_NUMBER :
413446 setPhoneNumber ();
414447 onRemoteNotificationParameterChange ();
448+ if (getActivity () != null ) {
449+ Utils .hideKeyboard (getActivity ());
450+ }
415451 break ;
416452 case PreferenceManager .NOTIFICATION_TIME :
417453 try
@@ -571,14 +607,103 @@ private void checkSignalUsername() {
571607 }
572608 }
573609
610+ private void checkSignalUsernameVerification () {
611+ String signalUsername = preferences .getSignalUsername ();
612+
613+ // this will fail for all users currently has signal verified
614+ if (checkValidString (signalUsername ) &&
615+ signalUsername .equals (preferences .getVerifiedSignalUsername ())) {
616+ findPreference (PreferenceManager .VERIFY_SIGNAL )
617+ .setSummary (R .string .verification_dialog_summary_verified );
618+ } else {
619+ findPreference (PreferenceManager .VERIFY_SIGNAL )
620+ .setSummary (R .string .verification_dialog_summary );
621+ }
622+ }
623+
574624 private void activateSignal (String username , String verifyCode ) {
575625 SignalSender sender = SignalSender .getInstance (mActivity , username );
576626
577627 if (TextUtils .isEmpty (verifyCode )) {
578- sender .register (preferences .getVoiceVerificationEnabled ());
628+ ProgressDialog progressDialog = ProgressDialog .show (getContext (), getString (R .string .registering_to_signal ),
629+ getString (R .string .signal_registration_desc ));
630+ sender .register (preferences .getVoiceVerificationEnabled (),
631+ new SignalExecutorTask .TaskResult () {
632+ @ Override
633+ public void onSuccess (@ NonNull String msg ) {
634+ if (isAdded () && getActivity () != null ) {
635+ progressDialog .dismiss ();
636+ }
637+ showRegistrationSuccessDialog ();
638+ }
639+
640+ @ Override
641+ public void onFailure (@ NonNull String msg ) {
642+ if (isAdded () && getActivity () != null ) {
643+ progressDialog .dismiss ();
644+ }
645+ Toast .makeText (getContext (), msg , Toast .LENGTH_SHORT ).show ();
646+ }
647+ });
579648 } else {
580- sender .verify (verifyCode );
649+ ProgressDialog progressDialog = ProgressDialog .show (getContext (), getString (R .string .verifying_signal ),
650+ getString (R .string .verifying_signal_desc ));
651+ sender .verify (verifyCode , new SignalExecutorTask .TaskResult () {
652+ @ Override
653+ public void onSuccess (@ NonNull String msg ) {
654+ if (isAdded () && getActivity () != null ) {
655+ progressDialog .dismiss ();
656+ }
657+ // mark that the current registered signal username is verified
658+ preferences .setVerifiedSignalUsername (preferences .getSignalUsername ());
659+ checkSignalUsernameVerification ();
660+ showVerificationSuccessDialog ();
661+ }
662+
663+ @ Override
664+ public void onFailure (@ NonNull String msg ) {
665+ if (isAdded () && getActivity () != null ) {
666+ progressDialog .dismiss ();
667+ }
668+ Toast .makeText (getContext (), msg , Toast .LENGTH_SHORT ).show ();
669+ }
670+ });
671+ }
672+ }
673+
674+ private void showRegistrationSuccessDialog () {
675+ if (!isAdded () || getActivity () == null ) {
676+ return ;
581677 }
678+
679+ new AlertDialog .Builder (getActivity ())
680+ .setTitle (R .string .registration_successful )
681+ .setMessage (getString (R .string .signal_reg_success_desc , preferences .getSignalUsername ()))
682+ .setPositiveButton (R .string .verify , (dialog , which ) -> {
683+ dialog .dismiss ();
684+ findPreference (PreferenceManager .VERIFY_SIGNAL ).performClick ();
685+ })
686+ .setNegativeButton (R .string .ok , (dialog , which ) -> dialog .dismiss ())
687+ .show ();
688+ }
689+
690+ private void showVerificationSuccessDialog () {
691+ if (!isAdded () || getActivity () == null ) {
692+ return ;
693+ }
694+
695+ new AlertDialog .Builder (getActivity ())
696+ .setTitle (R .string .verification_successful )
697+ .setMessage (R .string .signal_verification_success_desc )
698+ .setPositiveButton (R .string .ok , (dialog , which ) -> dialog .dismiss ())
699+ .show ();
700+ }
701+
702+ private void resetSignalAndClearPrefs () {
703+ resetSignal (preferences .getSignalUsername ());
704+ preferences .setSignalUsername (null );
705+ preferences .setVerifiedSignalUsername (null );
706+ preferences .setNotificationTimeMs (-1 );
582707 }
583708
584709 private void resetSignal (String username ) {
0 commit comments