Skip to content

Commit 0788102

Browse files
committed
Merge branch 'signal_expt' of https://github.com/archie94/haven into archie94-signal_expt
2 parents b4b55a1 + a570c3e commit 0788102

File tree

9 files changed

+307
-74
lines changed

9 files changed

+307
-74
lines changed

src/main/java/org/havenapp/main/ListActivity.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
import android.graphics.drawable.Drawable;
2929
import android.os.Build;
3030
import android.os.Bundle;
31-
import android.telephony.SmsManager;
3231
import android.text.TextUtils;
3332
import android.util.Log;
3433
import android.view.Menu;
3534
import android.view.MenuItem;
3635
import android.view.View;
36+
import android.widget.Toast;
3737

3838
import com.google.android.material.floatingactionbutton.FloatingActionButton;
3939
import com.google.android.material.snackbar.Snackbar;
@@ -56,7 +56,6 @@
5656

5757
import java.util.ArrayList;
5858
import java.util.List;
59-
import java.util.StringTokenizer;
6059

6160
import androidx.annotation.NonNull;
6261
import androidx.appcompat.app.AppCompatActivity;
@@ -372,11 +371,14 @@ private void showLicenses ()
372371
private void testNotifications ()
373372
{
374373

375-
if (!TextUtils.isEmpty(preferences.getSignalUsername())) {
374+
if (preferences.isSignalVerified()) {
376375
SignalSender sender = SignalSender.getInstance(this, preferences.getSignalUsername().trim());
377376
ArrayList<String> recip = new ArrayList<>();
378377
recip.add(preferences.getRemotePhoneNumber());
379-
sender.sendMessage(recip, resourceManager.getString(R.string.signal_test_message), null);
378+
sender.sendMessage(recip, resourceManager.getString(R.string.signal_test_message),
379+
null, null);
380+
} else {
381+
Toast.makeText(this, getString(R.string.setup_signal_toast), Toast.LENGTH_SHORT).show();
380382
}
381383
}
382384
}

src/main/java/org/havenapp/main/PreferenceManager.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public class PreferenceManager {
7070
public static final String REGISTER_SIGNAL = "register_signal";
7171
public static final String VERIFY_SIGNAL = "verify_signal";
7272
public static final String VOICE_VERIFY_SIGNAL = "voice_verify_signal";
73+
public static final String RESET_SIGNAL_CONFIG = "reset_signal_config";
7374
private static final String UNLOCK_CODE="unlock_code";
7475

7576
private static final String ACCESS_TOKEN="access_token";
@@ -86,6 +87,7 @@ public class PreferenceManager {
8687
public static final String REMOTE_ACCESS_CRED = "remote_access_credential";
8788

8889
private static final String SIGNAL_USERNAME = "signal_username";
90+
private static final String SIGNAL_VERIFIED_USERNAME = "signal_verified_username";
8991

9092
private static final String FIRST_LAUNCH = "first_launch";
9193

@@ -119,6 +121,16 @@ public void setFirstLaunch(boolean firstLaunch) {
119121
prefsEditor.commit();
120122
}
121123

124+
/**
125+
* Returns the Signal username registered. This may not be a good way to check for
126+
* Signal set up since this may not be verified.
127+
*
128+
* Usages should be checked with {@link #isSignalVerified()}
129+
*
130+
* @see #isSignalVerified()
131+
*
132+
* @return the Signal username; null when nothing is set up
133+
*/
122134
public String getSignalUsername ()
123135
{
124136
return appSharedPrefs.getString(SIGNAL_USERNAME,null);
@@ -130,6 +142,37 @@ public void setSignalUsername (String signalUsername)
130142
prefsEditor.commit();
131143
}
132144

145+
/**
146+
* Returns the Signal username verified. This may not be a good way to check for
147+
* Signal set up since this may invalidated by a call to register with a different username.
148+
*
149+
* Usages should be checked with {@link #isSignalVerified()}
150+
*
151+
* @see #isSignalVerified()
152+
*
153+
* @return the verified Signal username; null when no Signal username is verified even though registered.
154+
*/
155+
@Nullable
156+
public String getVerifiedSignalUsername() {
157+
return appSharedPrefs.getString(SIGNAL_VERIFIED_USERNAME, null);
158+
}
159+
160+
public void setVerifiedSignalUsername(String verifiedSignalUsername) {
161+
prefsEditor.putString(SIGNAL_VERIFIED_USERNAME, verifiedSignalUsername);
162+
prefsEditor.commit();
163+
}
164+
165+
/**
166+
* Checks if Signal is registered and verified for the Signal username returned by
167+
* {@link #getSignalUsername()}
168+
*
169+
* @return true iff registered Signal username is same as that of the verified one.
170+
*/
171+
public boolean isSignalVerified() {
172+
return !TextUtils.isEmpty(getSignalUsername()) &&
173+
getSignalUsername().equals(getVerifiedSignalUsername());
174+
}
175+
133176
public void activateRemoteAccess (boolean active) {
134177
prefsEditor.putBoolean(REMOTE_ACCESS_ACTIVE,active);
135178
prefsEditor.commit();

src/main/java/org/havenapp/main/SettingsFragment.java

Lines changed: 130 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import android.Manifest;
88
import android.annotation.SuppressLint;
99
import android.app.Activity;
10+
import android.app.ProgressDialog;
1011
import android.content.Context;
12+
import android.content.DialogInterface;
1113
import android.content.Intent;
1214
import android.content.SharedPreferences;
1315
import android.content.pm.PackageManager;
@@ -26,6 +28,7 @@
2628
import com.google.i18n.phonenumbers.PhoneNumberUtil;
2729
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;
2830

31+
import org.havenapp.main.service.SignalExecutorTask;
2932
import org.havenapp.main.service.SignalSender;
3033
import org.havenapp.main.service.WebServer;
3134
import org.havenapp.main.ui.AccelConfigureActivity;
@@ -36,6 +39,7 @@
3639
import java.util.Locale;
3740

3841
import androidx.annotation.NonNull;
42+
import androidx.appcompat.app.AlertDialog;
3943
import androidx.appcompat.app.AppCompatActivity;
4044
import androidx.core.app.ActivityCompat;
4145
import 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) {

src/main/java/org/havenapp/main/Utils.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package org.havenapp.main;
22

3+
import android.app.Activity;
34
import android.content.Context;
45
import android.content.Intent;
56
import android.content.IntentFilter;
67
import android.os.BatteryManager;
8+
import android.view.inputmethod.InputMethodManager;
79

810
import java.text.SimpleDateFormat;
911
import java.util.Date;
1012
import java.util.Locale;
1113
import java.util.concurrent.TimeUnit;
1214

15+
import androidx.annotation.NonNull;
16+
1317
/**
1418
* Created by Anupam Das (opticod) on 28/12/17.
1519
* <p>
@@ -70,4 +74,13 @@ public static int getBatteryPercentage(Context context) {
7074

7175
return (int) (batteryPct * 100);
7276
}
77+
78+
public static void hideKeyboard(@NonNull Activity activity) {
79+
if (activity.getCurrentFocus() != null) {
80+
InputMethodManager inputMethodManager =
81+
(InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
82+
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(),
83+
0);
84+
}
85+
}
7386
}

src/main/java/org/havenapp/main/service/MonitorService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,7 @@ else if (mPrefs.getNotificationTimeMs() > 0 && mLastNotification != null)
369369
alertMessage.append(getString(R.string.intrusion_detected,
370370
eventTrigger.getStringType(new ResourceManager(this))));
371371

372-
if (mPrefs.isRemoteNotificationActive() &&
373-
mPrefs.getSignalUsername() != null) {
372+
if (mPrefs.isRemoteNotificationActive() && mPrefs.isSignalVerified()) {
374373
//since this is a secure channel, we can add the Onion address
375374
if (mPrefs.getRemoteAccessActive() && (!TextUtils.isEmpty(mPrefs.getRemoteAccessOnion()))) {
376375
alertMessage.append(" http://").append(mPrefs.getRemoteAccessOnion())
@@ -393,7 +392,7 @@ else if (eventTrigger.getType() == EventTrigger.CAMERA_VIDEO) {
393392
attachment = eventTrigger.getPath();
394393
}
395394

396-
sender.sendMessage(recips, alertMessage.toString(), attachment);
395+
sender.sendMessage(recips, alertMessage.toString(), attachment, null);
397396
}
398397
}
399398

0 commit comments

Comments
 (0)