diff --git a/mobile/src/main/AndroidManifest.xml b/mobile/src/main/AndroidManifest.xml index 2c4f35dc..cb369460 100644 --- a/mobile/src/main/AndroidManifest.xml +++ b/mobile/src/main/AndroidManifest.xml @@ -18,11 +18,8 @@ android:targetSdkVersion="25"/> diff --git a/mobile/src/main/res/values/strings.xml b/mobile/src/main/res/values/strings.xml index 7e52d5dd..1320f57c 100644 --- a/mobile/src/main/res/values/strings.xml +++ b/mobile/src/main/res/values/strings.xml @@ -26,7 +26,6 @@ Error code: #%d - Server Settings Profile Name Server Remote Port @@ -35,7 +34,6 @@ Encrypt Method - Feature Settings IPv6 Route Redirect IPv6 traffic to remote One-time Authentication @@ -75,8 +73,6 @@ No valid profile data found. - Yes - No Close Please select a profile Proxy/Password should not be empty @@ -105,8 +101,6 @@ Profile config - Changes not saved. Do you want to save? - Apply Remove Are you sure you want to remove this profile? QR code/NFC diff --git a/mobile/src/main/scala/com/github/shadowsocks/plugin/PluginManager.scala b/mobile/src/main/scala/com/github/shadowsocks/plugin/PluginManager.scala index 568e964a..df1c048c 100644 --- a/mobile/src/main/scala/com/github/shadowsocks/plugin/PluginManager.scala +++ b/mobile/src/main/scala/com/github/shadowsocks/plugin/PluginManager.scala @@ -38,7 +38,9 @@ object PluginManager { case null => case path => return path } catch { - case t: Throwable => if (throwable == null) throwable = t + case t: Throwable => + t.printStackTrace() + if (throwable == null) throwable = t } // add other plugin types here diff --git a/plugin/src/main/java/com/github/shadowsocks/plugin/PluginOptions.java b/plugin/src/main/java/com/github/shadowsocks/plugin/PluginOptions.java index a010ff05..3d693d4b 100644 --- a/plugin/src/main/java/com/github/shadowsocks/plugin/PluginOptions.java +++ b/plugin/src/main/java/com/github/shadowsocks/plugin/PluginOptions.java @@ -3,6 +3,7 @@ package com.github.shadowsocks.plugin; import android.text.TextUtils; import java.util.HashMap; +import java.util.Objects; import java.util.StringTokenizer; /** @@ -23,7 +24,7 @@ public final class PluginOptions extends HashMap { super(initialCapacity, loadFactor); } - private PluginOptions(String options, boolean parseId) throws IllegalArgumentException { + private PluginOptions(String options, boolean parseId) { if (TextUtils.isEmpty(options)) return; final StringTokenizer tokenizer = new StringTokenizer(options, "\\=;", true); final StringBuilder current = new StringBuilder(); @@ -31,8 +32,7 @@ public final class PluginOptions extends HashMap { while (tokenizer.hasMoreTokens()) { String nextToken = tokenizer.nextToken(); if ("\\".equals(nextToken)) current.append(tokenizer.nextToken()); - else if ("=".equals(nextToken)) { - if (key != null) throw new IllegalArgumentException("Duplicate keys in " + options); + else if ("=".equals(nextToken) && key == null) { key = current.toString(); current.setLength(0); } else if (";".equals(nextToken)) @@ -46,12 +46,13 @@ public final class PluginOptions extends HashMap { put(current.toString(), null); current.setLength(0); } + else current.append(nextToken); } } - public PluginOptions(String options) throws IllegalArgumentException { + public PluginOptions(String options) { this(options, true); } - public PluginOptions(String id, String options) throws IllegalArgumentException { + public PluginOptions(String id, String options) { this(options, false); this.id = id; } @@ -85,4 +86,18 @@ public final class PluginOptions extends HashMap { public String toString() { return toString(true); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + PluginOptions that = (PluginOptions) o; + return Objects.equals(id, that.id) && super.equals(that); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), id); + } } diff --git a/plugin/src/main/res/values/strings.xml b/plugin/src/main/res/values/strings.xml new file mode 100644 index 00000000..84ed3818 --- /dev/null +++ b/plugin/src/main/res/values/strings.xml @@ -0,0 +1,9 @@ + + + Server Settings + Feature Settings + Changes not saved. Do you want to save? + Yes + No + Apply + diff --git a/plugin/src/main/scala/com/github/shadowsocks/plugin/NativePluginProvider.scala b/plugin/src/main/scala/com/github/shadowsocks/plugin/NativePluginProvider.scala index 78d5b57d..9f555574 100644 --- a/plugin/src/main/scala/com/github/shadowsocks/plugin/NativePluginProvider.scala +++ b/plugin/src/main/scala/com/github/shadowsocks/plugin/NativePluginProvider.scala @@ -14,8 +14,8 @@ import android.os.ParcelFileDescriptor * ... * <application> * ... - * <provider android:name="com.github.shadowsocks.$PLUGIN_ID.PluginProvider" - * android:authorities="com.github.shadowsocks.$PLUGIN_ID"> + * <provider android:name="com.github.shadowsocks.$PLUGIN_ID.BinaryProvider" + * android:authorities="com.github.shadowsocks.plugin.$PLUGIN_ID"> * <intent-filter> * <category android:name="com.github.shadowsocks.plugin.CATEGORY_NATIVE_PLUGIN" /> * </intent-filter>