Fixed crash caused by missing custom DNS server

This commit is contained in:
PeratX 2017-05-01 15:34:57 +08:00
parent 2a4cfbfd79
commit d2ebad1f5a
10 changed files with 162 additions and 104 deletions

View File

@ -74,6 +74,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
return instance; return instance;
} }
public int getCurrentFragment() {
return currentFragment;
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme_NoActionBar_TransparentStatusBar); setTheme(R.style.AppTheme_NoActionBar_TransparentStatusBar);

View File

@ -5,6 +5,7 @@ import android.os.Bundle;
import android.preference.EditTextPreference; import android.preference.EditTextPreference;
import android.preference.Preference; import android.preference.Preference;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
@ -27,6 +28,7 @@ import org.itxtech.daedalus.util.CustomDnsServer;
*/ */
public class DnsServerConfigFragment extends PreferenceFragment implements Toolbar.OnMenuItemClickListener { public class DnsServerConfigFragment extends PreferenceFragment implements Toolbar.OnMenuItemClickListener {
private Intent intent = null; private Intent intent = null;
private View view;
private int index; private int index;
public void setIntent(Intent intent) { public void setIntent(Intent intent) {
@ -38,6 +40,7 @@ public class DnsServerConfigFragment extends PreferenceFragment implements Toolb
super.onDestroy(); super.onDestroy();
intent = null; intent = null;
view = null;
} }
@Override @Override
@ -48,7 +51,7 @@ public class DnsServerConfigFragment extends PreferenceFragment implements Toolb
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState); view = super.onCreateView(inflater, container, savedInstanceState);
EditTextPreference serverName = (EditTextPreference) findPreference("serverName"); EditTextPreference serverName = (EditTextPreference) findPreference("serverName");
serverName.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { serverName.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@ -101,17 +104,23 @@ public class DnsServerConfigFragment extends PreferenceFragment implements Toolb
switch (id) { switch (id) {
case R.id.action_apply: case R.id.action_apply:
String serverName = ((EditTextPreference) findPreference("serverName")).getText();
String serverAddress = ((EditTextPreference) findPreference("serverAddress")).getText();
String serverPort = ((EditTextPreference) findPreference("serverPort")).getText();
if (serverName.equals("") | serverAddress.equals("") | serverPort.equals("")) {
Snackbar.make(view, R.string.notice_fill_in_all, Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
break;
}
if (index == DnsServerConfigActivity.CUSTOM_DNS_SERVER_ID_NONE) { if (index == DnsServerConfigActivity.CUSTOM_DNS_SERVER_ID_NONE) {
Daedalus.configurations.getCustomDnsServers().add(new CustomDnsServer( Daedalus.configurations.getCustomDnsServers().add(new CustomDnsServer(serverName, serverAddress, Integer.parseInt(serverPort)));
((EditTextPreference) findPreference("serverName")).getText(),
((EditTextPreference) findPreference("serverAddress")).getText(),
Integer.parseInt(((EditTextPreference) findPreference("serverPort")).getText())
));
} else { } else {
CustomDnsServer server = Daedalus.configurations.getCustomDnsServers().get(index); CustomDnsServer server = Daedalus.configurations.getCustomDnsServers().get(index);
server.setName(((EditTextPreference) findPreference("serverName")).getText()); server.setName(serverName);
server.setAddress(((EditTextPreference) findPreference("serverAddress")).getText()); server.setAddress(serverAddress);
server.setPort(Integer.parseInt(((EditTextPreference) findPreference("serverPort")).getText())); server.setPort(Integer.parseInt(serverPort));
} }
getActivity().finish(); getActivity().finish();
break; break;

View File

@ -20,7 +20,8 @@ import de.measite.minidns.record.A;
import de.measite.minidns.util.InetAddressUtil; import de.measite.minidns.util.InetAddressUtil;
import org.itxtech.daedalus.Daedalus; import org.itxtech.daedalus.Daedalus;
import org.itxtech.daedalus.R; import org.itxtech.daedalus.R;
import org.itxtech.daedalus.util.DnsServer; import org.itxtech.daedalus.activity.MainActivity;
import org.itxtech.daedalus.util.DnsServerHelper;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.ArrayList; import java.util.ArrayList;
@ -51,9 +52,9 @@ public class DnsTestFragment extends Fragment {
final TextView textViewTestInfo = (TextView) view.findViewById(R.id.textView_test_info); final TextView textViewTestInfo = (TextView) view.findViewById(R.id.textView_test_info);
final Spinner spinnerServerChoice = (Spinner) view.findViewById(R.id.spinner_server_choice); final Spinner spinnerServerChoice = (Spinner) view.findViewById(R.id.spinner_server_choice);
ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, DnsServer.getDnsServerNames(Daedalus.getInstance())); ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, DnsServerHelper.getDnsServerNames(Daedalus.getInstance()));
spinnerServerChoice.setAdapter(spinnerArrayAdapter); spinnerServerChoice.setAdapter(spinnerArrayAdapter);
spinnerServerChoice.setSelection(Integer.valueOf(Daedalus.getPrefs().getString("primary_server", "0"))); spinnerServerChoice.setSelection(Integer.parseInt(DnsServerHelper.getPrimaryDnsServer()));
final AutoCompleteTextView textViewTestUrl = (AutoCompleteTextView) view.findViewById(R.id.autoCompleteTextView_test_url); final AutoCompleteTextView textViewTestUrl = (AutoCompleteTextView) view.findViewById(R.id.autoCompleteTextView_test_url);
ArrayAdapter autoCompleteArrayAdapter = new ArrayAdapter<>(Daedalus.getInstance(), android.R.layout.simple_list_item_1, Daedalus.DEFAULT_TEST_DOMAINS); ArrayAdapter autoCompleteArrayAdapter = new ArrayAdapter<>(Daedalus.getInstance(), android.R.layout.simple_list_item_1, Daedalus.DEFAULT_TEST_DOMAINS);
@ -69,7 +70,7 @@ public class DnsTestFragment extends Fragment {
} }
StringBuilder testText = new StringBuilder(); StringBuilder testText = new StringBuilder();
ArrayList<String> dnsServers = new ArrayList<String>() {{ ArrayList<String> dnsServers = new ArrayList<String>() {{
add(DnsServer.getDnsServerAddressByStringDescription(Daedalus.getInstance(), spinnerServerChoice.getSelectedItem().toString())); add(DnsServerHelper.getDnsServerAddressByStringDescription(Daedalus.getInstance(), spinnerServerChoice.getSelectedItem().toString()));
String servers = Daedalus.getPrefs().getString("dns_test_servers", ""); String servers = Daedalus.getPrefs().getString("dns_test_servers", "");
if (!servers.equals("")) { if (!servers.equals("")) {
for (String server : servers.split(",")) { for (String server : servers.split(",")) {
@ -200,10 +201,14 @@ public class DnsTestFragment extends Fragment {
switch (msg.what) { switch (msg.what) {
case MSG_DISPLAY_STATUS: case MSG_DISPLAY_STATUS:
if (MainActivity.getInstance().getCurrentFragment() == MainActivity.FRAGMENT_DNS_TEST) {
textViewTestInfo.setText((String) msg.obj); textViewTestInfo.setText((String) msg.obj);
}
break; break;
case MSG_TEST_DONE: case MSG_TEST_DONE:
if (MainActivity.getInstance().getCurrentFragment() == MainActivity.FRAGMENT_DNS_TEST) {
startTestBtn.setVisibility(View.VISIBLE); startTestBtn.setVisibility(View.VISIBLE);
}
stopThread(); stopThread();
break; break;
} }

View File

@ -16,7 +16,7 @@ import org.itxtech.daedalus.Daedalus;
import org.itxtech.daedalus.R; import org.itxtech.daedalus.R;
import org.itxtech.daedalus.activity.MainActivity; import org.itxtech.daedalus.activity.MainActivity;
import org.itxtech.daedalus.service.DaedalusVpnService; import org.itxtech.daedalus.service.DaedalusVpnService;
import org.itxtech.daedalus.util.DnsServer; import org.itxtech.daedalus.util.DnsServerHelper;
/** /**
* Daedalus Project * Daedalus Project
@ -86,8 +86,8 @@ public class MainFragment extends Fragment {
public void onActivityResult(int request, int result, Intent data) { public void onActivityResult(int request, int result, Intent data) {
if (result == Activity.RESULT_OK) { if (result == Activity.RESULT_OK) {
DaedalusVpnService.primaryServer = DnsServer.getDnsServerAddressById(Daedalus.getPrefs().getString("primary_server", "0")); DaedalusVpnService.primaryServer = DnsServerHelper.getDnsServerAddressById(DnsServerHelper.getPrimaryDnsServer());
DaedalusVpnService.secondaryServer = DnsServer.getDnsServerAddressById(Daedalus.getPrefs().getString("secondary_server", "1")); DaedalusVpnService.secondaryServer = DnsServerHelper.getDnsServerAddressById(DnsServerHelper.getSecondaryDnsServer());
Daedalus.getInstance().startService(Daedalus.getInstance().getServiceIntent().setAction(DaedalusVpnService.ACTION_ACTIVATE)); Daedalus.getInstance().startService(Daedalus.getInstance().getServiceIntent().setAction(DaedalusVpnService.ACTION_ACTIVATE));

View File

@ -11,7 +11,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.itxtech.daedalus.Daedalus; import org.itxtech.daedalus.Daedalus;
import org.itxtech.daedalus.R; import org.itxtech.daedalus.R;
import org.itxtech.daedalus.util.DnsServer; import org.itxtech.daedalus.util.DnsServerHelper;
/** /**
* Daedalus Project * Daedalus Project
@ -28,16 +28,22 @@ public class SettingsFragment extends PreferenceFragment {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Daedalus.getPrefs().edit()
.putString("primary_server", DnsServerHelper.getPrimaryDnsServer())
.putString("secondary_server", DnsServerHelper.getSecondaryDnsServer())
.apply();
addPreferencesFromResource(R.xml.perf_settings); addPreferencesFromResource(R.xml.perf_settings);
ListPreference primaryServer = (ListPreference) findPreference("primary_server"); ListPreference primaryServer = (ListPreference) findPreference("primary_server");
primaryServer.setEntries(DnsServer.getDnsServerNames(Daedalus.getInstance())); primaryServer.setEntries(DnsServerHelper.getDnsServerNames(Daedalus.getInstance()));
primaryServer.setEntryValues(DnsServer.getDnsServerIds()); primaryServer.setEntryValues(DnsServerHelper.getDnsServerIds());
primaryServer.setSummary(DnsServer.getDnsServerDescription(primaryServer.getValue(), Daedalus.getInstance())); primaryServer.setSummary(DnsServerHelper.getDnsServerDescription(primaryServer.getValue(), Daedalus.getInstance()));
primaryServer.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { primaryServer.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
preference.setSummary(DnsServer.getDnsServerDescription((String) newValue, Daedalus.getInstance())); preference.setSummary(DnsServerHelper.getDnsServerDescription((String) newValue, Daedalus.getInstance()));
Snackbar.make(view, R.string.notice_need_restart, Snackbar.LENGTH_LONG) Snackbar.make(view, R.string.notice_need_restart, Snackbar.LENGTH_LONG)
.setAction("Action", null).show(); .setAction("Action", null).show();
return true; return true;
@ -45,13 +51,13 @@ public class SettingsFragment extends PreferenceFragment {
}); });
ListPreference secondaryServer = (ListPreference) findPreference("secondary_server"); ListPreference secondaryServer = (ListPreference) findPreference("secondary_server");
secondaryServer.setEntries(DnsServer.getDnsServerNames(Daedalus.getInstance())); secondaryServer.setEntries(DnsServerHelper.getDnsServerNames(Daedalus.getInstance()));
secondaryServer.setEntryValues(DnsServer.getDnsServerIds()); secondaryServer.setEntryValues(DnsServerHelper.getDnsServerIds());
secondaryServer.setSummary(DnsServer.getDnsServerDescription(secondaryServer.getValue(), Daedalus.getInstance())); secondaryServer.setSummary(DnsServerHelper.getDnsServerDescription(secondaryServer.getValue(), Daedalus.getInstance()));
secondaryServer.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { secondaryServer.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
preference.setSummary(DnsServer.getDnsServerDescription((String) newValue, Daedalus.getInstance())); preference.setSummary(DnsServerHelper.getDnsServerDescription((String) newValue, Daedalus.getInstance()));
Snackbar.make(view, R.string.notice_need_restart, Snackbar.LENGTH_LONG) Snackbar.make(view, R.string.notice_need_restart, Snackbar.LENGTH_LONG)
.setAction("Action", null).show(); .setAction("Action", null).show();
return true; return true;

View File

@ -7,7 +7,7 @@ import android.net.VpnService;
import android.util.Log; import android.util.Log;
import org.itxtech.daedalus.Daedalus; import org.itxtech.daedalus.Daedalus;
import org.itxtech.daedalus.service.DaedalusVpnService; import org.itxtech.daedalus.service.DaedalusVpnService;
import org.itxtech.daedalus.util.DnsServer; import org.itxtech.daedalus.util.DnsServerHelper;
/** /**
* Daedalus Project * Daedalus Project
@ -28,8 +28,8 @@ public class BootBroadcastReceiver extends BroadcastReceiver {
context.startActivity(vIntent); context.startActivity(vIntent);
} }
DaedalusVpnService.primaryServer = DnsServer.getDnsServerAddressById(Daedalus.getPrefs().getString("primary_server", "0")); DaedalusVpnService.primaryServer = DnsServerHelper.getDnsServerAddressById(DnsServerHelper.getPrimaryDnsServer());
DaedalusVpnService.secondaryServer = DnsServer.getDnsServerAddressById(Daedalus.getPrefs().getString("secondary_server", "1")); DaedalusVpnService.secondaryServer = DnsServerHelper.getDnsServerAddressById(DnsServerHelper.getSecondaryDnsServer());
context.startService((new Intent(context, DaedalusVpnService.class)).setAction(DaedalusVpnService.ACTION_ACTIVATE)); context.startService((new Intent(context, DaedalusVpnService.class)).setAction(DaedalusVpnService.ACTION_ACTIVATE));

View File

@ -1,9 +1,6 @@
package org.itxtech.daedalus.util; package org.itxtech.daedalus.util;
import android.content.Context; import android.content.Context;
import org.itxtech.daedalus.Daedalus;
import java.util.ArrayList;
/** /**
* Daedalus Project * Daedalus Project
@ -36,77 +33,7 @@ public class DnsServer {
return address; return address;
} }
public int getDescription() {
return description;
}
public String getStringDescription(Context context) { public String getStringDescription(Context context) {
return context.getResources().getString(description); return context.getResources().getString(description);
} }
public static String getDnsServerAddressById(String id) {
for (DnsServer server : Daedalus.DNS_SERVERS) {
if (server.getId().equals(id)) {
return server.getAddress();
}
}
for (CustomDnsServer customDnsServer : Daedalus.configurations.getCustomDnsServers()) {
if (customDnsServer.getId().equals(id)) {
return customDnsServer.getAddress();
}
}
return Daedalus.DNS_SERVERS.get(0).getAddress();
}
public static String getDnsServerAddressByStringDescription(Context context, String description) {
for (DnsServer server : Daedalus.DNS_SERVERS) {
if (server.getStringDescription(context).equals(description)) {
return server.getAddress();
}
}
for (CustomDnsServer customDnsServer : Daedalus.configurations.getCustomDnsServers()) {
if (customDnsServer.getName().equals(description)) {
return customDnsServer.getAddress();
}
}
return Daedalus.DNS_SERVERS.get(0).getAddress();
}
public static String[] getDnsServerIds() {
ArrayList<String> servers = new ArrayList<>(Daedalus.DNS_SERVERS.size());
for (DnsServer server : Daedalus.DNS_SERVERS) {
servers.add(server.getId());
}
for (CustomDnsServer customDnsServer : Daedalus.configurations.getCustomDnsServers()) {
servers.add(customDnsServer.getId());
}
String[] stringServers = new String[Daedalus.DNS_SERVERS.size()];
return servers.toArray(stringServers);
}
public static String[] getDnsServerNames(Context context) {
ArrayList<String> servers = new ArrayList<>(Daedalus.DNS_SERVERS.size());
for (DnsServer server : Daedalus.DNS_SERVERS) {
servers.add(server.getStringDescription(context));
}
for (CustomDnsServer customDnsServer : Daedalus.configurations.getCustomDnsServers()) {
servers.add(customDnsServer.getName());
}
String[] stringServers = new String[Daedalus.DNS_SERVERS.size()];
return servers.toArray(stringServers);
}
public static String getDnsServerDescription(String id, Context context) {
for (DnsServer server : Daedalus.DNS_SERVERS) {
if (server.getId().equals(id)) {
return server.getStringDescription(context);
}
}
for (CustomDnsServer customDnsServer : Daedalus.configurations.getCustomDnsServers()) {
if (customDnsServer.getId().equals(id)) {
return customDnsServer.getName();
}
}
return Daedalus.DNS_SERVERS.get(0).getStringDescription(context);
}
} }

View File

@ -0,0 +1,105 @@
package org.itxtech.daedalus.util;
import android.content.Context;
import org.itxtech.daedalus.Daedalus;
import java.util.ArrayList;
/**
* Daedalus Project
*
* @author iTXTech
* @link https://itxtech.org
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*/
public class DnsServerHelper {
public static String getPrimaryDnsServer() {
return String.valueOf(DnsServerHelper.checkServerId(Integer.parseInt(Daedalus.getPrefs().getString("primary_server", "0"))));
}
public static String getSecondaryDnsServer() {
return String.valueOf(DnsServerHelper.checkServerId(Integer.parseInt(Daedalus.getPrefs().getString("secondary_server", "1"))));
}
private static int checkServerId(int id) {
if (id < (Daedalus.DNS_SERVERS.size() - 1)) {
return id;
}
for (CustomDnsServer server : Daedalus.configurations.getCustomDnsServers()) {
if (server.getId().equals(String.valueOf(id))) {
return id;
}
}
return 0;
}
public static String getDnsServerAddressById(String id) {
for (DnsServer server : Daedalus.DNS_SERVERS) {
if (server.getId().equals(id)) {
return server.getAddress();
}
}
for (CustomDnsServer customDnsServer : Daedalus.configurations.getCustomDnsServers()) {
if (customDnsServer.getId().equals(id)) {
return customDnsServer.getAddress();
}
}
return Daedalus.DNS_SERVERS.get(0).getAddress();
}
public static String getDnsServerAddressByStringDescription(Context context, String description) {
for (DnsServer server : Daedalus.DNS_SERVERS) {
if (server.getStringDescription(context).equals(description)) {
return server.getAddress();
}
}
for (CustomDnsServer customDnsServer : Daedalus.configurations.getCustomDnsServers()) {
if (customDnsServer.getName().equals(description)) {
return customDnsServer.getAddress();
}
}
return Daedalus.DNS_SERVERS.get(0).getAddress();
}
public static String[] getDnsServerIds() {
ArrayList<String> servers = new ArrayList<>(Daedalus.DNS_SERVERS.size());
for (DnsServer server : Daedalus.DNS_SERVERS) {
servers.add(server.getId());
}
for (CustomDnsServer customDnsServer : Daedalus.configurations.getCustomDnsServers()) {
servers.add(customDnsServer.getId());
}
String[] stringServers = new String[Daedalus.DNS_SERVERS.size()];
return servers.toArray(stringServers);
}
public static String[] getDnsServerNames(Context context) {
ArrayList<String> servers = new ArrayList<>(Daedalus.DNS_SERVERS.size());
for (DnsServer server : Daedalus.DNS_SERVERS) {
servers.add(server.getStringDescription(context));
}
for (CustomDnsServer customDnsServer : Daedalus.configurations.getCustomDnsServers()) {
servers.add(customDnsServer.getName());
}
String[] stringServers = new String[Daedalus.DNS_SERVERS.size()];
return servers.toArray(stringServers);
}
public static String getDnsServerDescription(String id, Context context) {
for (DnsServer server : Daedalus.DNS_SERVERS) {
if (server.getId().equals(id)) {
return server.getStringDescription(context);
}
}
for (CustomDnsServer customDnsServer : Daedalus.configurations.getCustomDnsServers()) {
if (customDnsServer.getId().equals(id)) {
return customDnsServer.getName();
}
}
return Daedalus.DNS_SERVERS.get(0).getStringDescription(context);
}
}

View File

@ -62,4 +62,5 @@
<string name="settings_server_port">服务器端口</string> <string name="settings_server_port">服务器端口</string>
<string name="delete">删除</string> <string name="delete">删除</string>
<string name="apply">应用</string> <string name="apply">应用</string>
<string name="notice_fill_in_all">请填写所有配置项。</string>
</resources> </resources>

View File

@ -40,7 +40,7 @@
<string name="server_aixyz_south_china">AIXYZ DNS South China</string> <string name="server_aixyz_south_china">AIXYZ DNS South China</string>
<string name="server_aixyz_east_china">AIXYZ DNS East China</string> <string name="server_aixyz_east_china">AIXYZ DNS East China</string>
<string name="nav_github">GitHub</string> <string name="nav_github">GitHub</string>
<string name="settings_advanced">Advanced system Settings</string> <string name="settings_advanced">Advanced System Settings</string>
<string name="settings_advanced_on">On</string> <string name="settings_advanced_on">On</string>
<string name="settings_local_hosts_resolution">Local hosts resolution</string> <string name="settings_local_hosts_resolution">Local hosts resolution</string>
<string name="notice_need_restart">Re-activate Daedalus to make the settings take effect.</string> <string name="notice_need_restart">Re-activate Daedalus to make the settings take effect.</string>
@ -62,4 +62,5 @@
<string name="settings_server_port">Server Port</string> <string name="settings_server_port">Server Port</string>
<string name="delete">Delete</string> <string name="delete">Delete</string>
<string name="apply">Apply</string> <string name="apply">Apply</string>
<string name="notice_fill_in_all">Please fill in all configuration items.</string>
</resources> </resources>