diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 4f8db047..72f2e81b 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -53,6 +53,8 @@
+
+
+
+
+
+
+
diff --git a/src/main/res/xml/shortcuts.xml b/src/main/res/xml/shortcuts.xml
new file mode 100644
index 00000000..b68fad43
--- /dev/null
+++ b/src/main/res/xml/shortcuts.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/src/main/scala/com/github/shadowsocks/QuickToggleShortcut.scala b/src/main/scala/com/github/shadowsocks/QuickToggleShortcut.scala
new file mode 100644
index 00000000..1d19d304
--- /dev/null
+++ b/src/main/scala/com/github/shadowsocks/QuickToggleShortcut.scala
@@ -0,0 +1,39 @@
+package com.github.shadowsocks
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import com.github.shadowsocks.utils.{State, Utils}
+
+/**
+ * @author Mygod
+ */
+class QuickToggleShortcut extends Activity with ServiceBoundContext {
+ override def onCreate(savedInstanceState: Bundle) {
+ super.onCreate(savedInstanceState)
+ getIntent.getAction match {
+ case Intent.ACTION_CREATE_SHORTCUT =>
+ setResult(Activity.RESULT_OK, new Intent()
+ .putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(this, classOf[QuickToggleShortcut]))
+ .putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.quick_toggle))
+ .putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
+ Intent.ShortcutIconResource.fromContext(this, R.mipmap.ic_launcher)))
+ finish()
+ case _ => attachService()
+ }
+ }
+
+ override def onDestroy() {
+ detachService()
+ super.onDestroy()
+ }
+
+ override def onServiceConnected() {
+ bgService.getState match {
+ case State.STOPPED => Utils.startSsService(this)
+ case State.CONNECTED => Utils.stopSsService(this)
+ case _ => // ignore
+ }
+ finish()
+ }
+}