diff --git a/src/main/assets/pages/about.html b/src/main/assets/pages/about.html
new file mode 100644
index 00000000..d22cdf3b
--- /dev/null
+++ b/src/main/assets/pages/about.html
@@ -0,0 +1,291 @@
+
+
+
+MarkdownPad Document
+
+
+
+
+A Shadowsocks client for Android, written in Scala.
+Copyright (C) 2013 Max Lv max.c.lv@gmail.com
+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, either version 3 of the License, or
+(at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+You should have received a copy of the GNU General Public License
+along with this program. If not, see http://www.gnu.org/licenses/.
+
+
+
+
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index b0803fb7..1744befc 100755
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -74,9 +74,9 @@
Reset
About
- Shadowsocks is an open source socks proxy.\n\nYou can find more details
- here:\ngithub.com/shadowsocks
-
+ Shadowsocks %s
+ Donate
+ http://forum.xda-developers.com/donatetome.php?u=3604670
diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala
index 100508f2..2da1f7e0 100644
--- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala
+++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala
@@ -67,7 +67,11 @@ import net.saik0.android.unifiedpreference.UnifiedPreferenceFragment
import net.saik0.android.unifiedpreference.UnifiedSherlockPreferenceActivity
import org.jraf.android.backport.switchwidget.Switch
import android.content.pm.PackageManager
-import android.net.VpnService
+import android.net.{Uri, VpnService}
+import android.text.SpannableString
+import android.text.util.Linkify
+import android.text.method.LinkMovementMethod
+import android.webkit.{WebViewClient, WebView}
object Shadowsocks {
val PREFS_NAME = "Shadowsocks"
@@ -245,7 +249,7 @@ class Shadowsocks extends UnifiedSherlockPreferenceActivity with CompoundButton.
private def isTextEmpty(s: String, msg: String): Boolean = {
if (s == null || s.length <= 0) {
- showAToast(msg)
+ showDialog(msg)
return true
}
false
@@ -322,6 +326,7 @@ class Shadowsocks extends UnifiedSherlockPreferenceActivity with CompoundButton.
override def onCreateOptionsMenu(menu: Menu): Boolean = {
menu.add(0, 0, 0, R.string.recovery).setIcon(android.R.drawable.ic_menu_revert).setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT)
menu.add(0, 1, 1, R.string.about).setIcon(android.R.drawable.ic_menu_info_details).setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT)
+ menu.add(0, 2, 2, R.string.donate).setIcon(android.R.drawable.ic_menu_info_details).setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT)
true
}
@@ -344,16 +349,9 @@ class Shadowsocks extends UnifiedSherlockPreferenceActivity with CompoundButton.
case 0 =>
recovery()
case 1 =>
- var versionName = ""
- try {
- versionName = getPackageManager.getPackageInfo(getPackageName, 0).versionName
- }
- catch {
- case ex: PackageManager.NameNotFoundException => {
- versionName = ""
- }
- }
- showAToast(getString(R.string.about) + " (" + versionName + ")\n\n" + getString(R.string.copy_rights))
+ showAbout()
+ case 2 =>
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.donate_address))))
}
super.onOptionsItemSelected(item)
}
@@ -548,13 +546,13 @@ class Shadowsocks extends UnifiedSherlockPreferenceActivity with CompoundButton.
try {
val port: Int = Integer.valueOf(portText)
if (port <= 1024) {
- this.showAToast(getString(R.string.port_alert))
+ this.showDialog(getString(R.string.port_alert))
return false
}
}
catch {
case ex: Exception => {
- this.showAToast(getString(R.string.port_alert))
+ this.showDialog(getString(R.string.port_alert))
return false
}
}
@@ -578,7 +576,36 @@ class Shadowsocks extends UnifiedSherlockPreferenceActivity with CompoundButton.
true
}
- private def showAToast(msg: String) {
+ private def showAbout() {
+
+ val web = new WebView(this)
+ web.loadUrl("file:///android_asset/pages/about.html")
+ web.setWebViewClient(new WebViewClient() {
+ override def shouldOverrideUrlLoading(view: WebView, url: String): Boolean = {
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)))
+ true
+ }
+ })
+
+ var versionName = ""
+ try {
+ versionName = getPackageManager.getPackageInfo(getPackageName, 0).versionName
+ } catch {
+ case ex: PackageManager.NameNotFoundException => {
+ versionName = ""
+ }
+ }
+
+ new AlertDialog.Builder(this).setTitle(getString(R.string.about_title).format(versionName))
+ .setCancelable(false)
+ .setNegativeButton(getString(R.string.ok_iknow), new DialogInterface.OnClickListener() {
+ override def onClick(dialog: DialogInterface, id: Int) {
+ dialog.cancel()
+ }
+ }).setView(web).create().show()
+ }
+
+ private def showDialog(msg: String) {
val builder: AlertDialog.Builder = new AlertDialog.Builder(this)
builder.setMessage(msg).setCancelable(false).setNegativeButton(getString(R.string.ok_iknow), new DialogInterface.OnClickListener {
def onClick(dialog: DialogInterface, id: Int) {