From d0c4384cc7ba50fc7ab67ec278e274be49c1a105 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sat, 17 Dec 2016 16:28:09 +0800 Subject: [PATCH] Avoid attach/detach service in the fragment --- build.sbt | 3 +++ .../scala/com/github/shadowsocks/MainActivity.scala | 11 ++++++++++- .../com/github/shadowsocks/ProfilesFragment.scala | 11 ++++------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/build.sbt b/build.sbt index f4669e8e..fdc9d4d3 100644 --- a/build.sbt +++ b/build.sbt @@ -43,6 +43,9 @@ libraryDependencies ++= "com.google.android.gms" % "play-services-gcm" % "10.0.1" :: "com.j256.ormlite" % "ormlite-android" % "5.0" :: "com.mikepenz" % "materialdrawer" % "5.8.1" :: + "com.mikepenz" % "materialize" % "1.0.0" :: + "com.mikepenz" % "iconics-core" % "2.8.0" :: + "com.mikepenz" % "fastadapter" % "2.1.0" :: "com.twofortyfouram" % "android-plugin-api-for-locale" % "1.0.2" :: "dnsjava" % "dnsjava" % "2.1.7" :: "eu.chainfire" % "libsuperuser" % "1.0.0.201608240809" :: diff --git a/src/main/scala/com/github/shadowsocks/MainActivity.scala b/src/main/scala/com/github/shadowsocks/MainActivity.scala index 076a00ac..6cf843bb 100644 --- a/src/main/scala/com/github/shadowsocks/MainActivity.scala +++ b/src/main/scala/com/github/shadowsocks/MainActivity.scala @@ -51,8 +51,12 @@ import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem import com.mikepenz.materialdrawer.model.{PrimaryDrawerItem, SecondaryDrawerItem} import com.mikepenz.materialdrawer.{Drawer, DrawerBuilder} +trait TrafficCallback { + def update(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long) +} + object MainActivity { - private final val TAG = "MainActivity" + private final val TAG = "ShadowsocksMainActivity" private final val REQUEST_CONNECT = 1 private final val DRAWER_PROFILES = 0L @@ -72,6 +76,9 @@ class MainActivity extends Activity with ServiceBoundContext with Drawer.OnDrawe var state = State.STOPPED var currentProfile = new Profile var drawer: Drawer = _ + + @volatile var trafficCallback: TrafficCallback = _ + private lazy val profilesFragment = new ProfilesFragment() private lazy val globalSettingsFragment = new GlobalSettingsFragment() @@ -133,6 +140,7 @@ class MainActivity extends Activity with ServiceBoundContext with Drawer.OnDrawe rxText.setText(TrafficMonitor.formatTraffic(rxTotal)) txRateText.setText(TrafficMonitor.formatTraffic(txRate) + "/s") rxRateText.setText(TrafficMonitor.formatTraffic(rxRate) + "/s") + if (trafficCallback != null) trafficCallback.update(txRate, rxRate, txTotal, rxTotal) } def attachServiceCallback(): Unit = attachService(callback) @@ -372,6 +380,7 @@ class MainActivity extends Activity with ServiceBoundContext with Drawer.OnDrawe private def updateState() { if (bgService != null) { + Log.d(TAG, "bgService " + bgService.getState) bgService.getState match { case State.CONNECTING => fab.setBackgroundTintList(greyTint) diff --git a/src/main/scala/com/github/shadowsocks/ProfilesFragment.scala b/src/main/scala/com/github/shadowsocks/ProfilesFragment.scala index 9ad70a1c..94b99ceb 100644 --- a/src/main/scala/com/github/shadowsocks/ProfilesFragment.scala +++ b/src/main/scala/com/github/shadowsocks/ProfilesFragment.scala @@ -216,25 +216,22 @@ final class ProfilesFragment extends ToolbarFragment with OnMenuItemClickListene override def onAttach(activity: Activity) { super.onAttach(activity) - activity.asInstanceOf[ServiceBoundContext].attachService(new IShadowsocksServiceCallback.Stub { - def stateChanged(state: Int, profileName: String, msg: String): Unit = () // ignore - def trafficUpdated(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long): Unit = + activity.asInstanceOf[MainActivity].trafficCallback = new TrafficCallback { + def update(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long): Unit = if (selectedItem != null) selectedItem.updateText(txTotal, rxTotal) - }) + } } override def onStart() { super.onStart() - getActivity.asInstanceOf[ServiceBoundContext].registerCallback() } override def onStop() { super.onStop() - getActivity.asInstanceOf[ServiceBoundContext].unregisterCallback() } override def onDetach() { - getActivity.asInstanceOf[ServiceBoundContext].detachService() + getActivity.asInstanceOf[MainActivity].trafficCallback = null undoManager.flush() super.onDetach() }