Implemented import external rule

This commit is contained in:
PeratX 2017-08-24 23:44:46 +08:00
parent e9c7415e10
commit 97625045b2
11 changed files with 141 additions and 45 deletions

View File

@ -100,7 +100,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
FragmentManager fm = getFragmentManager(); FragmentManager fm = getFragmentManager();
fm.beginTransaction().replace(R.id.id_content, fragment).commit(); fm.beginTransaction().replace(R.id.id_content, fragment).commit();
currentFragment = fragment; currentFragment = fragment;
} catch (Throwable e){ } catch (Exception e) {
Logger.logException(e); Logger.logException(e);
} }
} }

View File

@ -146,8 +146,7 @@ public class GlobalConfigFragment extends PreferenceFragment {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
Snackbar.make(view, R.string.notice_legacy_api, Snackbar.LENGTH_LONG) Snackbar.make(view, R.string.notice_legacy_api, Snackbar.LENGTH_LONG).show();
.setAction("Action", null).show();
} }
} }
} }

View File

@ -50,7 +50,7 @@ public class LogFragment extends ToolbarFragment implements Toolbar.OnMenuItemCl
fileWriter.close(); fileWriter.close();
Snackbar.make(getView(), getString(R.string.notice_export_complete) + file, Snackbar.LENGTH_SHORT) Snackbar.make(getView(), getString(R.string.notice_export_complete) + file, Snackbar.LENGTH_SHORT)
.setAction("Action", null).show(); .setAction("Action", null).show();
} catch (Throwable e){ } catch (Exception e) {
Logger.logException(e); Logger.logException(e);
} }
} }

View File

@ -1,8 +1,12 @@
package org.itxtech.daedalus.fragment; package org.itxtech.daedalus.fragment;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
@ -37,6 +41,7 @@ import java.net.URLConnection;
* (at your option) any later version. * (at your option) any later version.
*/ */
public class RuleConfigFragment extends ConfigFragment { public class RuleConfigFragment extends ConfigFragment {
private static final int READ_REQUEST_CODE = 1;
private Intent intent = null; private Intent intent = null;
private Thread mThread = null; private Thread mThread = null;
private RuleConfigHandler mHandler = null; private RuleConfigHandler mHandler = null;
@ -122,8 +127,32 @@ public class RuleConfigFragment extends ConfigFragment {
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
save(); save();
if (mThread == null) { if (mThread == null) {
Snackbar.make(getView(), R.string.notice_start_download, Snackbar.LENGTH_LONG) Snackbar.make(getView(), R.string.notice_start_download, Snackbar.LENGTH_SHORT).show();
.setAction("Action", null).show(); if (ruleDownloadUrl.getText().startsWith("content:/")) {
mThread = new Thread(new Runnable() {
@Override
public void run() {
try {
InputStream inputStream = getActivity().getContentResolver().openInputStream(Uri.parse(ruleDownloadUrl.getText()));
int readLen;
byte[] data = new byte[1024];
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
while ((readLen = inputStream.read(data)) != -1) {
buffer.write(data, 0, readLen);
}
inputStream.close();
buffer.flush();
mHandler.obtainMessage(RuleConfigHandler.MSG_RULE_DOWNLOADED,
new RuleData(ruleFilename.getText(), buffer.toByteArray())).sendToTarget();
stopThread();
} catch (Exception e) {
Logger.logException(e);
} finally {
stopThread();
}
}
});
} else {
mThread = new Thread(new Runnable() { mThread = new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -139,7 +168,7 @@ public class RuleConfigFragment extends ConfigFragment {
reader.close(); reader.close();
mHandler.obtainMessage(RuleConfigHandler.MSG_RULE_DOWNLOADED, mHandler.obtainMessage(RuleConfigHandler.MSG_RULE_DOWNLOADED,
new RuleData(ruleFilename.getText(), builder.toString())).sendToTarget(); new RuleData(ruleFilename.getText(), builder.toString().getBytes())).sendToTarget();
stopThread(); stopThread();
} catch (Exception e) { } catch (Exception e) {
Logger.logException(e); Logger.logException(e);
@ -148,10 +177,10 @@ public class RuleConfigFragment extends ConfigFragment {
} }
} }
}); });
}
mThread.start(); mThread.start();
} else { } else {
Snackbar.make(getView(), R.string.notice_now_downloading, Snackbar.LENGTH_LONG) Snackbar.make(getView(), R.string.notice_now_downloading, Snackbar.LENGTH_LONG).show();
.setAction("Action", null).show();
} }
return false; return false;
} }
@ -176,6 +205,19 @@ public class RuleConfigFragment extends ConfigFragment {
} }
}); });
ClickPreference ruleImportExternal = (ClickPreference) findPreference("ruleImportExternal");
ruleImportExternal.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
performFileSearch();
} else {
Snackbar.make(getView(), R.string.notice_legacy_api, Snackbar.LENGTH_LONG).show();
}
return false;
}
});
ruleImportBuildIn.setValue("0"); ruleImportBuildIn.setValue("0");
if (intent != null) { if (intent != null) {
@ -209,6 +251,50 @@ public class RuleConfigFragment extends ConfigFragment {
return view; return view;
} }
@TargetApi(Build.VERSION_CODES.KITKAT)
private void performFileSearch() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
startActivityForResult(intent, READ_REQUEST_CODE);
}
@Override
@TargetApi(Build.VERSION_CODES.KITKAT)
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
if (resultData != null) {
Uri uri = resultData.getData();
try {
getActivity().getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
String file = System.currentTimeMillis() + ".dr";//Daedalus Rule
InputStream inputStream = getActivity().getContentResolver().openInputStream(uri);
OutputStream outputStream = new FileOutputStream(Daedalus.rulePath + file);
byte[] b = new byte[1024];
while ((inputStream.read(b)) != -1) {
outputStream.write(b);
}
inputStream.close();
outputStream.close();
((EditTextPreference) findPreference("ruleFilename")).setText(file);
findPreference("ruleFilename").setSummary(file);
((EditTextPreference) findPreference("ruleDownloadUrl")).setText(uri.toString());
findPreference("ruleDownloadUrl").setSummary(uri.toString());
Snackbar.make(getView(), R.string.notice_importing_rule, Snackbar.LENGTH_LONG).show();
} catch (Exception e) {
Logger.logException(e);
}
}
}
}
private boolean save() { private boolean save() {
String ruleName = ((EditTextPreference) findPreference("ruleName")).getText(); String ruleName = ((EditTextPreference) findPreference("ruleName")).getText();
String ruleType = ((ListPreference) findPreference("ruleType")).getValue(); String ruleType = ((ListPreference) findPreference("ruleType")).getValue();
@ -274,15 +360,15 @@ public class RuleConfigFragment extends ConfigFragment {
} }
private class RuleData { private class RuleData {
private String data; private byte[] data;
private String filename; private String filename;
RuleData(String filename, String data) { RuleData(String filename, byte[] data) {
this.data = data; this.data = data;
this.filename = filename; this.filename = filename;
} }
String getData() { byte[] getData() {
return data; return data;
} }
@ -315,14 +401,13 @@ public class RuleConfigFragment extends ConfigFragment {
RuleData ruleData = (RuleData) msg.obj; RuleData ruleData = (RuleData) msg.obj;
File file = new File(Daedalus.rulePath + ruleData.getFilename()); File file = new File(Daedalus.rulePath + ruleData.getFilename());
FileOutputStream stream = new FileOutputStream(file); FileOutputStream stream = new FileOutputStream(file);
stream.write(ruleData.getData().getBytes()); stream.write(ruleData.getData());
stream.close(); stream.close();
} catch (Exception e) { } catch (Exception e) {
Logger.logException(e); Logger.logException(e);
} }
Snackbar.make(view, R.string.notice_downloaded, Snackbar.LENGTH_SHORT) Snackbar.make(view, R.string.notice_downloaded, Snackbar.LENGTH_SHORT).show();
.setAction("Action", null).show();
break; break;
} }
} }

View File

@ -122,14 +122,14 @@ public class Configurations {
if (file.exists()) { if (file.exists()) {
try { try {
config = Daedalus.parseJson(Configurations.class, new JsonReader(new FileReader(file))); config = Daedalus.parseJson(Configurations.class, new JsonReader(new FileReader(file)));
Logger.info("Loading configuration successfully from " + file); Logger.info("Load configuration successfully from " + file);
} catch (Exception e) { } catch (Exception e) {
Logger.logException(e); Logger.logException(e);
} }
} }
if (config == null) { if (config == null) {
Logger.info("Loading configuration failed. Generating default configurations."); Logger.info("Load configuration failed. Generating default configurations.");
config = new Configurations(); config = new Configurations();
} }

View File

@ -58,7 +58,7 @@ public class Logger {
error(getExceptionMessage(e)); error(getExceptionMessage(e));
} }
private static String getExceptionMessage(Throwable e) { public static String getExceptionMessage(Throwable e) {
StringWriter stringWriter = new StringWriter(); StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter); PrintWriter printWriter = new PrintWriter(stringWriter);
e.printStackTrace(printWriter); e.printStackTrace(printWriter);

View File

@ -2,6 +2,7 @@ package org.itxtech.daedalus.util;
import org.itxtech.daedalus.Daedalus; import org.itxtech.daedalus.Daedalus;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
@ -120,6 +121,8 @@ public class Rule {
} else if (getType() == Rule.TYPE_DNAMASQ) { } else if (getType() == Rule.TYPE_DNAMASQ) {
Daedalus.configurations.getDnsmasqRules().remove(this); Daedalus.configurations.getDnsmasqRules().remove(this);
} }
File file = new File(getFileName());
Logger.info("Delete rule " + getName() + " result: " + String.valueOf(file.delete()));
} }

View File

@ -71,7 +71,8 @@
<string name="settings_rule_sync">同步规则</string> <string name="settings_rule_sync">同步规则</string>
<string name="settings_rule_filename">规则文件名</string> <string name="settings_rule_filename">规则文件名</string>
<string name="settings_rule_import">导入</string> <string name="settings_rule_import">导入</string>
<string name="settings_rule_import_build_in">从内置规则导入</string> <string name="settings_rule_import_build_in">内置</string>
<string name="settings_rule_import_external">外部</string>
<string name="notice_after_stop">请在服务停止后更改启用的规则。</string> <string name="notice_after_stop">请在服务停止后更改启用的规则。</string>
<string name="settings_manual">使用手册</string> <string name="settings_manual">使用手册</string>
<string name="settings_manual_summary">访问 GitHub wiki 页面。</string> <string name="settings_manual_summary">访问 GitHub wiki 页面。</string>
@ -83,4 +84,5 @@
<string name="action_reload">重新加载规则</string> <string name="action_reload">重新加载规则</string>
<string name="notice_check_dynamic_rule_reload">请在设置中勾选“允许动态更新规则”</string> <string name="notice_check_dynamic_rule_reload">请在设置中勾选“允许动态更新规则”</string>
<string name="notice_export_complete">导出完成。</string> <string name="notice_export_complete">导出完成。</string>
<string name="notice_importing_rule">正在导入规则,请稍等。</string>
</resources> </resources>

View File

@ -56,7 +56,7 @@
<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="export">导出</string> <string name="export">导出 TODO</string>
<string name="notice_fill_in_all">請填寫所有設定項。</string> <string name="notice_fill_in_all">請填寫所有設定項。</string>
<string name="settings_dns_over_tcp">DNS over TCP</string> <string name="settings_dns_over_tcp">DNS over TCP</string>
<string name="action_removed">已移除。</string> <string name="action_removed">已移除。</string>
@ -71,7 +71,8 @@
<string name="settings_rule_sync">同步規則</string> <string name="settings_rule_sync">同步規則</string>
<string name="settings_rule_filename">規則檔案名稱</string> <string name="settings_rule_filename">規則檔案名稱</string>
<string name="settings_rule_import">匯入</string> <string name="settings_rule_import">匯入</string>
<string name="settings_rule_import_build_in">自內建規則匯入</string> <string name="settings_rule_import_build_in">内置</string>
<string name="settings_rule_import_external">外部</string>
<string name="notice_after_stop">請在服務停止後變更啟動的規則。</string> <string name="notice_after_stop">請在服務停止後變更啟動的規則。</string>
<string name="settings_manual">使用手冊</string> <string name="settings_manual">使用手冊</string>
<string name="settings_manual_summary">造訪 GitHub wiki 頁面。</string> <string name="settings_manual_summary">造訪 GitHub wiki 頁面。</string>
@ -82,5 +83,6 @@
<string name="settings_allow_dynamic_rule_reload">允許動態規則重新載入</string> <string name="settings_allow_dynamic_rule_reload">允許動態規則重新載入</string>
<string name="action_reload">重新載入</string> <string name="action_reload">重新載入</string>
<string name="notice_check_dynamic_rule_reload">請在設定中開啟「允許動態規則重新載入」</string> <string name="notice_check_dynamic_rule_reload">請在設定中開啟「允許動態規則重新載入」</string>
<string name="notice_export_complete">导出完成。</string> <string name="notice_export_complete">导出完成。 TODO</string>
<string name="notice_importing_rule">正在导入规则,请稍等。 TODO</string>
</resources> </resources>

View File

@ -4,7 +4,7 @@
<string name="notice_main">See the world outside.</string> <string name="notice_main">See the world outside.</string>
<string name="notice_activated">iTXTech Daedalus is activated.</string> <string name="notice_activated">iTXTech Daedalus is activated.</string>
<string name="notice_start_test">Testing specified DNS server </string> <string name="notice_start_test">Testing specified DNS server…</string>
<string name="notice_queries">DNS query times:</string> <string name="notice_queries">DNS query times:</string>
<string name="notice_legacy_api">The current Android API can not support all the features.</string> <string name="notice_legacy_api">The current Android API can not support all the features.</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>
@ -16,6 +16,7 @@
<string name="notice_after_stop">Please modify activated rules after stopping service.</string> <string name="notice_after_stop">Please modify activated rules after stopping service.</string>
<string name="notice_check_dynamic_rule_reload">Please enable "Allow dynamic rule reload" in Settings</string> <string name="notice_check_dynamic_rule_reload">Please enable "Allow dynamic rule reload" in Settings</string>
<string name="notice_export_complete">Export completed.</string> <string name="notice_export_complete">Export completed.</string>
<string name="notice_importing_rule">Importing rule… Please wait until blanks are filled.</string>
<string name="action_settings">Settings</string> <string name="action_settings">Settings</string>
<string name="action_about">About</string> <string name="action_about">About</string>
@ -70,7 +71,8 @@
<string name="settings_rule_sync">Sync Rule</string> <string name="settings_rule_sync">Sync Rule</string>
<string name="settings_rule_filename">Rule Filename</string> <string name="settings_rule_filename">Rule Filename</string>
<string name="settings_rule_import">Import</string> <string name="settings_rule_import">Import</string>
<string name="settings_rule_import_build_in">Import from build in rules</string> <string name="settings_rule_import_build_in">Build-in</string>
<string name="settings_rule_import_external">External</string>
<string name="settings_server_name">Server Name</string> <string name="settings_server_name">Server Name</string>
<string name="settings_server_address">Server Address</string> <string name="settings_server_address">Server Address</string>

View File

@ -33,5 +33,8 @@
<ListPreference <ListPreference
android:key="ruleImportBuildIn" android:key="ruleImportBuildIn"
android:title="@string/settings_rule_import_build_in"/> android:title="@string/settings_rule_import_build_in"/>
<org.itxtech.daedalus.widget.ClickPreference
android:key="ruleImportExternal"
android:title="@string/settings_rule_import_external"/>
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>