diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 3b2ee429f..ec201402c 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -249,6 +249,11 @@
+
+
{
+ proxyGroup.setVisibility(isChecked? View.VISIBLE : View.GONE);
+ });
+ proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED) == 1);
+
+ TextInputEditText proxyHostInput = findViewById(R.id.proxy_host_text);
+ proxyHostInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.SERVER));
+ proxyHostInput.setText(DcHelper.get(this, CONFIG_SOCKS5_HOST));
+
+ TextInputEditText proxyPortInput = findViewById(R.id.proxy_port_text);
+ proxyPortInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.PORT));
+ proxyPortInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PORT));
+
+ TextInputEditText proxyUserInput = findViewById(R.id.proxy_user_text);
+ proxyUserInput.setText(DcHelper.get(this, CONFIG_SOCKS5_USER));
+
+ TextInputEditText proxyPasswordInput = findViewById(R.id.proxy_password_text);
+ proxyPasswordInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PASSWORD));
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ dynamicTheme.onResume(this);
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+ if (id == android.R.id.home) {
+ finish();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ saveConfig();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ saveConfig();
+ }
+
+ private void focusListener(View view, boolean focused, VerificationType type) {
+
+ if (!focused) {
+ TextInputEditText inputEditText = (TextInputEditText) view;
+ switch (type) {
+ case SERVER:
+ verifyServer(inputEditText);
+ break;
+ case PORT:
+ verifyPort(inputEditText);
+ break;
+ }
+ }
+ }
+
+ private void verifyServer(TextInputEditText view) {
+ String server = view.getText().toString();
+ if (!TextUtils.isEmpty(server) && !Patterns.DOMAIN_NAME.matcher(server).matches()
+ && !Patterns.IP_ADDRESS.matcher(server).matches()
+ && !Patterns.WEB_URL.matcher(server).matches()
+ && !"localhost".equals(server)) {
+ view.setError(getString(R.string.login_error_server));
+ }
+ }
+
+ private void verifyPort(TextInputEditText view) {
+ String portString = view.getText().toString();
+ if (!portString.isEmpty()) {
+ String error = getString(R.string.login_error_port);
+ try {
+ int port = Integer.valueOf(portString);
+ if (port < 1 || port > 65535) {
+ view.setError(error);
+ }
+ } catch (NumberFormatException exception) {
+ view.setError(error);
+ }
+ }
+ }
+
+ private void saveConfig() {
+ DcContext dcContext = DcHelper.getContext(this);
+ dcContext.setConfigInt(CONFIG_SOCKS5_ENABLED, proxySwitch.isChecked()? 1 : 0);
+ setConfig(R.id.proxy_host_text, CONFIG_SOCKS5_HOST, true);
+ setConfig(R.id.proxy_port_text, CONFIG_SOCKS5_PORT, true);
+ setConfig(R.id.proxy_user_text, CONFIG_SOCKS5_USER, true);
+ setConfig(R.id.proxy_password_text, CONFIG_SOCKS5_PASSWORD, false);
+ dcContext.stopIo();
+ dcContext.startIo();
+ }
+
+ private void setConfig(@IdRes int viewId, String configTarget, boolean doTrim) {
+ TextInputEditText view = findViewById(viewId);
+ String value = view.getText().toString();
+ if(doTrim) {
+ value = value.trim();
+ }
+ DcHelper.getContext(this).setConfig(configTarget, value.isEmpty()? null : value);
+ }
+
+}
diff --git a/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java b/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java
index f41c22896..8a5eb6f9e 100644
--- a/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java
+++ b/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java
@@ -96,7 +96,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
Spinner certCheck;
private SwitchCompat proxySwitch;
- private Group proxyGroup;
@Override
public void onCreate(Bundle bundle) {
@@ -127,15 +126,11 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
authMethod = findViewById(R.id.auth_method);
certCheck = findViewById(R.id.cert_check);
- proxyGroup = findViewById(R.id.socks5_group);
- proxySwitch = findViewById(R.id.socks5_switch);
- proxySwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
- proxyGroup.setVisibility(isChecked? advancedGroup.getVisibility() : View.GONE);
+ proxySwitch = findViewById(R.id.proxy_settings);
+ proxySwitch.setOnClickListener(l -> {
+ proxySwitch.setChecked(!proxySwitch.isChecked()); // revert toggle
+ startActivity(new Intent(this, ProxySettingsActivity.class));
});
- TextInputEditText proxyHostInput = findViewById(R.id.socks5_host_text);
- TextInputEditText proxyPortInput = findViewById(R.id.socks5_port_text);
- proxyHostInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.SERVER));
- proxyPortInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.PORT));
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
@@ -161,7 +156,16 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
advancedIcon.setOnClickListener(l -> onAdvancedSettings());
advancedIcon.setRotation(45);
viewLogText.setOnClickListener((view) -> showLog());
+
boolean isConfigured = DcHelper.isConfigured(getApplicationContext());
+ boolean expandAdvanced = false;
+ String strVal;
+ int intVal;
+
+ intVal = DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED);
+ proxySwitch.setChecked(intVal == 1);
+ expandAdvanced = expandAdvanced || intVal == 1;
+
if (isConfigured) {
String email = DcHelper.get(this, CONFIG_ADDRESS);
emailInput.setText(email);
@@ -170,10 +174,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
}
passwordInput.setText(DcHelper.get(this, CONFIG_MAIL_PASSWORD));
- boolean expandAdvanced = false;
- String strVal;
- int intVal;
-
TextInputEditText imapLoginInput = findViewById(R.id.imap_login_text);
strVal = DcHelper.get(this, CONFIG_MAIL_USER);
imapLoginInput.setText(strVal);
@@ -213,17 +213,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
smtpSecurity.setSelection(intVal);
expandAdvanced = expandAdvanced || intVal != 0;
- intVal = DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED);
- proxySwitch.setChecked(intVal == 1);
- expandAdvanced = expandAdvanced || intVal == 1;
-
- proxyHostInput.setText(DcHelper.get(this, CONFIG_SOCKS5_HOST));
- proxyPortInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PORT));
- TextInputEditText proxyUserInput = findViewById(R.id.socks5_user_text);
- TextInputEditText proxyPasswordInput = findViewById(R.id.socks5_password_text);
- proxyUserInput.setText(DcHelper.get(this, CONFIG_SOCKS5_USER));
- proxyPasswordInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PASSWORD));
-
int serverFlags = DcHelper.getInt(this, CONFIG_SERVER_FLAGS);
int sel = 0;
if((serverFlags&DcContext.DC_LP_AUTH_OAUTH2)!=0) {
@@ -242,8 +231,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
int certCheckFlags = DcHelper.getInt(this, "imap_certificate_checks");
certCheck.setSelection(certCheckFlags);
expandAdvanced = expandAdvanced || certCheckFlags != 0;
-
- if (expandAdvanced) { onAdvancedSettings(); }
} else if (getIntent() != null && getIntent().getBundleExtra(ACCOUNT_DATA) != null) {
// Companion app might have sent account data
Bundle b = getIntent().getBundleExtra(ACCOUNT_DATA);
@@ -261,6 +248,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
}
}
+ if (expandAdvanced) { onAdvancedSettings(); }
registerForEvents();
}
@@ -272,6 +260,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
public void onResume() {
super.onResume();
dynamicTheme.onResume(this);
+ proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED) == 1);
}
private void showLog() {
@@ -574,12 +563,10 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
private void onAdvancedSettings() {
boolean advancedViewVisible = advancedGroup.getVisibility() == View.VISIBLE;
if (advancedViewVisible) {
- proxyGroup.setVisibility(View.GONE);
advancedGroup.setVisibility(View.GONE);
advancedIcon.setRotation(45);
} else {
advancedGroup.setVisibility(View.VISIBLE);
- if (proxySwitch.isChecked()) proxyGroup.setVisibility(View.VISIBLE);
advancedIcon.setRotation(0);
}
}
@@ -621,15 +608,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
setConfig(R.id.smtp_port_text, CONFIG_SEND_PORT, true);
setConfig(R.id.smtp_login_text, CONFIG_SEND_USER, false);
setConfig(R.id.smtp_password_text, CONFIG_SEND_PASSWORD, false);
- if (proxySwitch.isChecked()) {
- DcHelper.getContext(this).setConfigInt(CONFIG_SOCKS5_ENABLED, 1);
- setConfig(R.id.socks5_host_text, CONFIG_SOCKS5_HOST, true);
- setConfig(R.id.socks5_port_text, CONFIG_SOCKS5_PORT, true);
- setConfig(R.id.socks5_user_text, CONFIG_SOCKS5_USER, true);
- setConfig(R.id.socks5_password_text, CONFIG_SOCKS5_PASSWORD, false);
- } else {
- DcHelper.getContext(this).setConfigInt(CONFIG_SOCKS5_ENABLED, 0);
- }
DcHelper.getContext(this).setConfigInt(CONFIG_MAIL_SECURITY, imapSecurity.getSelectedItemPosition());
DcHelper.getContext(this).setConfigInt(CONFIG_SEND_SECURITY, smtpSecurity.getSelectedItemPosition());
diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java
index ed633a70a..fbcf11397 100644
--- a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java
+++ b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java
@@ -37,6 +37,7 @@ import com.b44t.messenger.rpc.RpcException;
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.ConversationActivity;
import org.thoughtcrime.securesms.LogViewActivity;
+import org.thoughtcrime.securesms.ProxySettingsActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.RegistrationActivity;
import org.thoughtcrime.securesms.connect.DcEventCenter;
@@ -208,6 +209,11 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
return true;
}));
+ this.findPreference("proxy_settings_button").setOnPreferenceClickListener((preference) -> {
+ startActivity(new Intent(getActivity(), ProxySettingsActivity.class));
+ return true;
+ });
+
Preference passwordAndAccount = this.findPreference("password_account_settings_button");
passwordAndAccount.setOnPreferenceClickListener(((preference) -> {
boolean result = ScreenLockUtil.applyScreenLock(getActivity(), getString(R.string.pref_password_and_account_settings), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_ACCOUNT);
diff --git a/src/main/res/layout/proxy_settings_activity.xml b/src/main/res/layout/proxy_settings_activity.xml
new file mode 100644
index 000000000..d3660855e
--- /dev/null
+++ b/src/main/res/layout/proxy_settings_activity.xml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/registration_activity.xml b/src/main/res/layout/registration_activity.xml
index eae1b7be8..0a8007c83 100644
--- a/src/main/res/layout/registration_activity.xml
+++ b/src/main/res/layout/registration_activity.xml
@@ -123,7 +123,7 @@
android:visibility="gone"
tools:visibility="visible"
app:constraint_referenced_ids="inbox, imap_login, imap_server, imap_port, imap_security_label, imap_security, outbox_view_spacer_top,
- outbox, smtp_login, smtp_password, smtp_server, smtp_port, smtp_security_label, smtp_security, auth_method_label, auth_method, cert_check_label, cert_check, view_log_button, socks5_switch" />
+ outbox, smtp_login, smtp_password, smtp_server, smtp_port, smtp_security_label, smtp_security, auth_method_label, auth_method, cert_check_label, cert_check, view_log_button, proxy_settings" />
+
+
+ app:layout_constraintTop_toBottomOf="@id/proxy_settings" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ app:layout_constraintTop_toBottomOf="@id/cert_check" />
+
+
diff --git a/src/main/res/menu/text_secure_normal.xml b/src/main/res/menu/text_secure_normal.xml
index 84f738ddc..66d0a9e7f 100644
--- a/src/main/res/menu/text_secure_normal.xml
+++ b/src/main/res/menu/text_secure_normal.xml
@@ -7,6 +7,11 @@
android:icon="@drawable/baseline_qr_code_24"
app:showAsAction="always"/>
+
+
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 17bc0caff..9ae997edb 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -604,6 +604,8 @@
SMTP Port
SMTP Security
Authorization Method
+ Proxy Settings
+ Use Proxy
SOCKS5
Use SOCKS5
diff --git a/src/main/res/xml/preferences_advanced.xml b/src/main/res/xml/preferences_advanced.xml
index 9098d943d..0c90f637d 100644
--- a/src/main/res/xml/preferences_advanced.xml
+++ b/src/main/res/xml/preferences_advanced.xml
@@ -90,6 +90,9 @@
+
+