Skip to content

Commit

Permalink
Merge branch 'archie94-signal_expt'
Browse files Browse the repository at this point in the history
  • Loading branch information
n8fr8 committed Apr 17, 2019
2 parents b4b55a1 + 0788102 commit 2ff44e0
Show file tree
Hide file tree
Showing 9 changed files with 307 additions and 74 deletions.
10 changes: 6 additions & 4 deletions src/main/java/org/havenapp/main/ListActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
Expand All @@ -56,7 +56,6 @@

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
Expand Down Expand Up @@ -372,11 +371,14 @@ private void showLicenses ()
private void testNotifications ()
{

if (!TextUtils.isEmpty(preferences.getSignalUsername())) {
if (preferences.isSignalVerified()) {
SignalSender sender = SignalSender.getInstance(this, preferences.getSignalUsername().trim());
ArrayList<String> recip = new ArrayList<>();
recip.add(preferences.getRemotePhoneNumber());
sender.sendMessage(recip, resourceManager.getString(R.string.signal_test_message), null);
sender.sendMessage(recip, resourceManager.getString(R.string.signal_test_message),
null, null);
} else {
Toast.makeText(this, getString(R.string.setup_signal_toast), Toast.LENGTH_SHORT).show();
}
}
}
43 changes: 43 additions & 0 deletions src/main/java/org/havenapp/main/PreferenceManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ public class PreferenceManager {
public static final String REGISTER_SIGNAL = "register_signal";
public static final String VERIFY_SIGNAL = "verify_signal";
public static final String VOICE_VERIFY_SIGNAL = "voice_verify_signal";
public static final String RESET_SIGNAL_CONFIG = "reset_signal_config";
private static final String UNLOCK_CODE="unlock_code";

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

private static final String SIGNAL_USERNAME = "signal_username";
private static final String SIGNAL_VERIFIED_USERNAME = "signal_verified_username";

private static final String FIRST_LAUNCH = "first_launch";

Expand Down Expand Up @@ -119,6 +121,16 @@ public void setFirstLaunch(boolean firstLaunch) {
prefsEditor.commit();
}

/**
* Returns the Signal username registered. This may not be a good way to check for
* Signal set up since this may not be verified.
*
* Usages should be checked with {@link #isSignalVerified()}
*
* @see #isSignalVerified()
*
* @return the Signal username; null when nothing is set up
*/
public String getSignalUsername ()
{
return appSharedPrefs.getString(SIGNAL_USERNAME,null);
Expand All @@ -130,6 +142,37 @@ public void setSignalUsername (String signalUsername)
prefsEditor.commit();
}

/**
* Returns the Signal username verified. This may not be a good way to check for
* Signal set up since this may invalidated by a call to register with a different username.
*
* Usages should be checked with {@link #isSignalVerified()}
*
* @see #isSignalVerified()
*
* @return the verified Signal username; null when no Signal username is verified even though registered.
*/
@Nullable
public String getVerifiedSignalUsername() {
return appSharedPrefs.getString(SIGNAL_VERIFIED_USERNAME, null);
}

public void setVerifiedSignalUsername(String verifiedSignalUsername) {
prefsEditor.putString(SIGNAL_VERIFIED_USERNAME, verifiedSignalUsername);
prefsEditor.commit();
}

/**
* Checks if Signal is registered and verified for the Signal username returned by
* {@link #getSignalUsername()}
*
* @return true iff registered Signal username is same as that of the verified one.
*/
public boolean isSignalVerified() {
return !TextUtils.isEmpty(getSignalUsername()) &&
getSignalUsername().equals(getVerifiedSignalUsername());
}

public void activateRemoteAccess (boolean active) {
prefsEditor.putBoolean(REMOTE_ACCESS_ACTIVE,active);
prefsEditor.commit();
Expand Down
135 changes: 130 additions & 5 deletions src/main/java/org/havenapp/main/SettingsFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
Expand All @@ -26,6 +28,7 @@
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;

import org.havenapp.main.service.SignalExecutorTask;
import org.havenapp.main.service.SignalSender;
import org.havenapp.main.service.WebServer;
import org.havenapp.main.ui.AccelConfigureActivity;
Expand All @@ -36,6 +39,7 @@
import java.util.Locale;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
Expand Down Expand Up @@ -156,6 +160,11 @@ public void onCreatePreferences(Bundle bundle, String s) {
findPreference(PreferenceManager.NOTIFICATION_TIME).setSummary(preferences.getNotificationTimeMs()/60000 + " " + getString(R.string.minutes));
}

findPreference(PreferenceManager.RESET_SIGNAL_CONFIG).setOnPreferenceClickListener(preference -> {
showResetSignalDialog();
return true;
});

if (preferences.getHeartbeatActive())
{
((SwitchPreference) findPreference(PreferenceManager.HEARTBEAT_MONITOR_ACTIVE)).setChecked(true);
Expand Down Expand Up @@ -215,11 +224,27 @@ public void onCreatePreferences(Bundle bundle, String s) {
});

checkSignalUsername();
checkSignalUsernameVerification();
((EditTextPreference) findPreference(PreferenceManager.VERIFY_SIGNAL)).setText("");
askForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, 1);

}

private void showResetSignalDialog() {
new AlertDialog.Builder(getActivity())
.setTitle(R.string.reset_configuration_question)
.setMessage(R.string.reset_configuration_desc)
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
dialog.dismiss();
resetSignalAndClearPrefs();
findPreference(PreferenceManager.REGISTER_SIGNAL).setSummary(R.string.signal_dialog_summary);
findPreference(PreferenceManager.NOTIFICATION_TIME).setSummary(R.string.notification_time_summary);
checkSignalUsernameVerification();
})
.setNegativeButton(android.R.string.no, (dialog, which) -> dialog.dismiss())
.show();
}

private boolean canSendRemoteNotification() {
String remotePhoneNumber = preferences.getRemotePhoneNumber();
String signalUsername = preferences.getSignalUsername();
Expand All @@ -241,6 +266,9 @@ private void collectDataForRemoteNotification() {
if (TextUtils.isEmpty(signalUsername)) {
findPreference(PreferenceManager.REGISTER_SIGNAL).performClick();
} else {
if (getActivity() != null) {
Utils.hideKeyboard(getActivity());
}
activateSignal(signalUsername, null);
}
}
Expand Down Expand Up @@ -281,8 +309,6 @@ protected void save() {

preferences.setActivateVideoMonitoring(videoMonitoringActive);

preferences.setSignalUsername(((EditTextPreference) findPreference(PreferenceManager.REGISTER_SIGNAL)).getText());

boolean remoteNotificationActive =
((SwitchPreference) findPreference(PreferenceManager.REMOTE_NOTIFICATION_ACTIVE)).isChecked();
preferences.setRemoteNotificationActive(remoteNotificationActive);
Expand Down Expand Up @@ -396,22 +422,32 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin
findPreference(PreferenceManager.REGISTER_SIGNAL).setSummary(signalNum);

resetSignal(preferences.getSignalUsername());
if (getActivity() != null) {
Utils.hideKeyboard(getActivity());
}
activateSignal(preferences.getSignalUsername(), null);
} else if (!getCountryCode().equalsIgnoreCase(signalNum)) {
preferences.setSignalUsername("");
preferences.setSignalUsername(null);
findPreference(PreferenceManager.REGISTER_SIGNAL).setSummary(R.string.register_signal_desc);
}
onRemoteNotificationParameterChange();
checkSignalUsernameVerification();
break;
case PreferenceManager.VERIFY_SIGNAL: {
String text = ((EditTextPreference) findPreference(PreferenceManager.VERIFY_SIGNAL)).getText();
if (getActivity() != null) {
Utils.hideKeyboard(getActivity());
}
activateSignal(preferences.getSignalUsername(), text);
onRemoteNotificationParameterChange();
break;
}
case PreferenceManager.REMOTE_PHONE_NUMBER:
setPhoneNumber();
onRemoteNotificationParameterChange();
if (getActivity() != null) {
Utils.hideKeyboard(getActivity());
}
break;
case PreferenceManager.NOTIFICATION_TIME:
try
Expand Down Expand Up @@ -571,14 +607,103 @@ private void checkSignalUsername() {
}
}

private void checkSignalUsernameVerification() {
String signalUsername = preferences.getSignalUsername();

// this will fail for all users currently has signal verified
if (checkValidString(signalUsername) &&
signalUsername.equals(preferences.getVerifiedSignalUsername())) {
findPreference(PreferenceManager.VERIFY_SIGNAL)
.setSummary(R.string.verification_dialog_summary_verified);
} else {
findPreference(PreferenceManager.VERIFY_SIGNAL)
.setSummary(R.string.verification_dialog_summary);
}
}

private void activateSignal(String username, String verifyCode) {
SignalSender sender = SignalSender.getInstance(mActivity, username);

if (TextUtils.isEmpty(verifyCode)) {
sender.register(preferences.getVoiceVerificationEnabled());
ProgressDialog progressDialog = ProgressDialog.show(getContext(), getString(R.string.registering_to_signal),
getString(R.string.signal_registration_desc));
sender.register(preferences.getVoiceVerificationEnabled(),
new SignalExecutorTask.TaskResult() {
@Override
public void onSuccess(@NonNull String msg) {
if (isAdded() && getActivity() != null) {
progressDialog.dismiss();
}
showRegistrationSuccessDialog();
}

@Override
public void onFailure(@NonNull String msg) {
if (isAdded() && getActivity() != null) {
progressDialog.dismiss();
}
Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();
}
});
} else {
sender.verify(verifyCode);
ProgressDialog progressDialog = ProgressDialog.show(getContext(), getString(R.string.verifying_signal),
getString(R.string.verifying_signal_desc));
sender.verify(verifyCode, new SignalExecutorTask.TaskResult() {
@Override
public void onSuccess(@NonNull String msg) {
if (isAdded() && getActivity() != null) {
progressDialog.dismiss();
}
// mark that the current registered signal username is verified
preferences.setVerifiedSignalUsername(preferences.getSignalUsername());
checkSignalUsernameVerification();
showVerificationSuccessDialog();
}

@Override
public void onFailure(@NonNull String msg) {
if (isAdded() && getActivity() != null) {
progressDialog.dismiss();
}
Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();
}
});
}
}

private void showRegistrationSuccessDialog() {
if (!isAdded() || getActivity() == null) {
return;
}

new AlertDialog.Builder(getActivity())
.setTitle(R.string.registration_successful)
.setMessage(getString(R.string.signal_reg_success_desc, preferences.getSignalUsername()))
.setPositiveButton(R.string.verify, (dialog, which) -> {
dialog.dismiss();
findPreference(PreferenceManager.VERIFY_SIGNAL).performClick();
})
.setNegativeButton(R.string.ok, (dialog, which) -> dialog.dismiss())
.show();
}

private void showVerificationSuccessDialog() {
if (!isAdded() || getActivity() == null) {
return;
}

new AlertDialog.Builder(getActivity())
.setTitle(R.string.verification_successful)
.setMessage(R.string.signal_verification_success_desc)
.setPositiveButton(R.string.ok, (dialog, which) -> dialog.dismiss())
.show();
}

private void resetSignalAndClearPrefs() {
resetSignal(preferences.getSignalUsername());
preferences.setSignalUsername(null);
preferences.setVerifiedSignalUsername(null);
preferences.setNotificationTimeMs(-1);
}

private void resetSignal(String username) {
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/org/havenapp/main/Utils.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package org.havenapp.main;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.view.inputmethod.InputMethodManager;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

import androidx.annotation.NonNull;

/**
* Created by Anupam Das (opticod) on 28/12/17.
* <p>
Expand Down Expand Up @@ -70,4 +74,13 @@ public static int getBatteryPercentage(Context context) {

return (int) (batteryPct * 100);
}

public static void hideKeyboard(@NonNull Activity activity) {
if (activity.getCurrentFocus() != null) {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(),
0);
}
}
}
5 changes: 2 additions & 3 deletions src/main/java/org/havenapp/main/service/MonitorService.java
Original file line number Diff line number Diff line change
Expand Up @@ -369,8 +369,7 @@ else if (mPrefs.getNotificationTimeMs() > 0 && mLastNotification != null)
alertMessage.append(getString(R.string.intrusion_detected,
eventTrigger.getStringType(new ResourceManager(this))));

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

sender.sendMessage(recips, alertMessage.toString(), attachment);
sender.sendMessage(recips, alertMessage.toString(), attachment, null);
}
}

Expand Down
Loading

0 comments on commit 2ff44e0

Please sign in to comment.