diff --git a/src/main/scala/com/github/shadowsocks/acl/Acl.scala b/src/main/scala/com/github/shadowsocks/acl/Acl.scala index 6868f449..d943ba65 100644 --- a/src/main/scala/com/github/shadowsocks/acl/Acl.scala +++ b/src/main/scala/com/github/shadowsocks/acl/Acl.scala @@ -80,7 +80,7 @@ class Acl { } case _ => } - this.subnets ++= (if (bypass) bypassSubnets else proxySubnets) + this.subnets ++= (if (bypass) proxySubnets else bypassSubnets) this } final def fromId(id: String): Acl = fromSource(Source.fromFile(Acl.getPath(id))) @@ -90,8 +90,8 @@ class Acl { result.append(if (bypass) "[bypass_all]\n" else "[proxy_all]\n") var bypassList = bypassHostnames.toStream var proxyList = proxyHostnames.toStream - if (bypass) bypassList = subnets.toStream.map(_.toString) #::: bypassList - else proxyList = subnets.toStream.map(_.toString) #::: proxyList + if (bypass) proxyList = subnets.toStream.map(_.toString) #::: bypassList + else bypassList = subnets.toStream.map(_.toString) #::: proxyList if (bypassList.nonEmpty) { result.append("[bypass_list]\n") result.append(bypassList.mkString("\n")) diff --git a/src/main/scala/com/github/shadowsocks/acl/CustomRulesFragment.scala b/src/main/scala/com/github/shadowsocks/acl/CustomRulesFragment.scala index b66ba4af..4ab8e10e 100644 --- a/src/main/scala/com/github/shadowsocks/acl/CustomRulesFragment.scala +++ b/src/main/scala/com/github/shadowsocks/acl/CustomRulesFragment.scala @@ -95,8 +95,13 @@ class CustomRulesFragment extends ToolbarFragment with Toolbar.OnMenuItemClickLi }): DialogInterface.OnClickListener) .setPositiveButton(android.R.string.ok, ((_, _) => adapter.addFromTemplate(templateSelector.getSelectedItemPosition, editText.getText) match { - case -1 => adapter.remove(item) - case index => list.post(() => list.scrollToPosition(index)) + case -1 => + case index => + val item = this.item + list.post(() => { + list.scrollToPosition(index) + adapter.remove(item) + }) }) : DialogInterface.OnClickListener) .create().show() @@ -203,13 +208,15 @@ class CustomRulesFragment extends ToolbarFragment with Toolbar.OnMenuItemClickLi def getSectionTitle(i: Int): String = { val j = i - acl.subnets.size - (if (j < 0) acl.subnets(i).address.toString.charAt(0).toString else { + try (if (j < 0) acl.subnets(i).address.getHostAddress.substring(0, 1) else { val hostname = acl.proxyHostnames(i) PATTERN_DOMAIN.findFirstMatchIn(hostname) match { case Some(m) => m.matched.replaceAll("\\\\.", ".") // don't convert IDN yet case None => hostname } - }).substring(0, 1) + }).substring(0, 1) catch { + case _: IndexOutOfBoundsException => " " + } } } diff --git a/src/main/scala/com/github/shadowsocks/acl/Subnet.scala b/src/main/scala/com/github/shadowsocks/acl/Subnet.scala index 41e7aed3..b41465c0 100644 --- a/src/main/scala/com/github/shadowsocks/acl/Subnet.scala +++ b/src/main/scala/com/github/shadowsocks/acl/Subnet.scala @@ -18,7 +18,7 @@ class Subnet(val address: InetAddress, val prefixSize: Int) extends Comparable[S override def toString: String = if (address match { case _: Inet4Address => prefixSize == 32 case _: Inet6Address => prefixSize == 128 - }) address.toString else address.toString + '/' + prefixSize + }) address.getHostAddress else address.getHostAddress + '/' + prefixSize override def compareTo(that: Subnet): Int = { val addrThis = address.getAddress diff --git a/src/main/scala/scala/collection/mutable/SortedList.scala b/src/main/scala/scala/collection/mutable/SortedList.scala index a55eefe3..9fa9d144 100644 --- a/src/main/scala/scala/collection/mutable/SortedList.scala +++ b/src/main/scala/scala/collection/mutable/SortedList.scala @@ -39,7 +39,10 @@ class SortedList[A] private(treeRef: ObjectRef[RB.Tree[A, Null]], from: Option[A } // AbstractSeq - def apply(i: Int): A = RB.nth(treeRef.elem, i).key // Should i out of range result in NullReferenceException? + def apply(i: Int): A = try RB.nth(treeRef.elem, i).key catch { + // out of bounds will result in accessing null nodes + case e: NullPointerException => throw new IndexOutOfBoundsException().initCause(e) + } def length: Int = size // Buffer