diff --git a/build.sbt b/build.sbt index b92b4671..f09a917b 100644 --- a/build.sbt +++ b/build.sbt @@ -2,7 +2,7 @@ import android.Keys._ android.Plugin.androidBuild -platformTarget in Android := "android-23" +platformTarget in Android := "android-24" name := "shadowsocks" @@ -35,9 +35,9 @@ libraryDependencies ++= Seq( "com.google.android.gms" % "play-services-base" % "9.0.2", "com.google.android.gms" % "play-services-ads" % "9.0.2", "com.google.android.gms" % "play-services-analytics" % "9.0.2", - "com.android.support" % "design" % "23.4.0", - "com.android.support" % "gridlayout-v7" % "23.4.0", - "com.android.support" % "cardview-v7" % "23.4.0", + "com.android.support" % "design" % "24.0.0", + "com.android.support" % "gridlayout-v7" % "24.0.0", + "com.android.support" % "cardview-v7" % "24.0.0", "com.github.jorgecastilloprz" % "fabprogresscircle" % "1.01", "com.j256.ormlite" % "ormlite-core" % "4.48", "com.j256.ormlite" % "ormlite-android" % "4.48", diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 7a19ccc7..2e0b4d38 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -48,6 +48,9 @@ + + + + + + + + + diff --git a/src/main/scala/com/github/shadowsocks/AppManager.scala b/src/main/scala/com/github/shadowsocks/AppManager.scala index cdfbb5f4..ea5b0689 100644 --- a/src/main/scala/com/github/shadowsocks/AppManager.scala +++ b/src/main/scala/com/github/shadowsocks/AppManager.scala @@ -203,7 +203,7 @@ class AppManager extends AppCompatActivity with OnMenuItemClickListener { this.setContentView(R.layout.layout_apps) toolbar = findViewById(R.id.toolbar).asInstanceOf[Toolbar] toolbar.setTitle(R.string.proxied_apps) - toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha) + toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_material) toolbar.setNavigationOnClickListener((v: View) => { val intent = getParentActivityIntent if (intent == null) finish else navigateUpTo(intent) diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksTileService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksTileService.scala new file mode 100644 index 00000000..474ec719 --- /dev/null +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksTileService.scala @@ -0,0 +1,57 @@ +package com.github.shadowsocks + +import android.content.Intent +import android.graphics.drawable.Icon +import android.service.quicksettings.{Tile, TileService} +import com.github.shadowsocks.aidl.IShadowsocksServiceCallback +import com.github.shadowsocks.utils.State +import com.github.shadowsocks.ShadowsocksApplication.app + +/** + * @author Mygod + */ +final class ShadowsocksTileService extends TileService with ServiceBoundContext { + private lazy val iconIdle = Icon.createWithResource(this, R.drawable.ic_start_idle).setTint(0x80ffffff) + private lazy val iconBusy = Icon.createWithResource(this, R.drawable.ic_start_busy) + private lazy val iconConnected = Icon.createWithResource(this, R.drawable.ic_start_connected) + private lazy val callback = new IShadowsocksServiceCallback.Stub { + def trafficUpdated(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long) = () + def stateChanged(state: Int, msg: String) { + val tile = getQsTile + state match { + case State.STOPPED => + tile.setIcon(iconIdle) + tile.setLabel(getString(R.string.app_name)) + tile.setState(Tile.STATE_INACTIVE) + case State.CONNECTED => + tile.setIcon(iconConnected) + tile.setLabel(app.currentProfile match { + case Some(profile) => profile.name + case None => getString(R.string.app_name) + }) + tile.setState(Tile.STATE_ACTIVE) + case _ => + tile.setIcon(iconBusy) + tile.setLabel(getString(R.string.app_name)) + tile.setState(Tile.STATE_UNAVAILABLE) + } + tile.updateTile + } + } + + override def onServiceConnected = callback.stateChanged(bgService.getState, null) + + override def onStartListening { + super.onStartListening + attachService(callback) + } + + override def onStopListening { + super.onStopListening + detachService // just in case the user switches to NAT mode + } + + override def onClick = if (isLocked) unlockAndRun(configure) else configure() + + private def configure() = startActivityAndCollapse(new Intent(this, classOf[Shadowsocks])) +}