From dfe469e1e66590db19bdad267f56a5ce4796db8b Mon Sep 17 00:00:00 2001 From: Mygod Date: Wed, 28 Dec 2016 04:51:43 +0800 Subject: [PATCH] Prevent bandwidth and border flashing in ProfilesFragment --- .../com/github/shadowsocks/BaseService.scala | 10 ++--- .../com/github/shadowsocks/MainActivity.scala | 2 +- .../github/shadowsocks/ProfilesFragment.scala | 42 +++++++++---------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/scala/com/github/shadowsocks/BaseService.scala b/src/main/scala/com/github/shadowsocks/BaseService.scala index bc0a1109..e51517df 100644 --- a/src/main/scala/com/github/shadowsocks/BaseService.scala +++ b/src/main/scala/com/github/shadowsocks/BaseService.scala @@ -93,7 +93,7 @@ trait BaseService extends Service { if (timer == null) { timer = new Timer(true) timer.schedule(new TimerTask { - def run(): Unit = if (TrafficMonitor.updateRate()) updateTrafficRate() + def run(): Unit = if (state == State.CONNECTED && TrafficMonitor.updateRate()) updateTrafficRate() }, 1000, 1000) } TrafficMonitor.updateRate() @@ -288,8 +288,8 @@ trait BaseService extends Service { protected def changeState(s: Int, msg: String = null) { val handler = new Handler(getMainLooper) - handler.post(() => if (state != s || msg != null) { - if (callbacks.getRegisteredCallbackCount > 0) { + if (state != s || msg != null) { + if (callbacks.getRegisteredCallbackCount > 0) handler.post(() => { val n = callbacks.beginBroadcast() for (i <- 0 until n) { try { @@ -299,9 +299,9 @@ trait BaseService extends Service { } } callbacks.finishBroadcast() - } + }) state = s - }) + } } def getBlackList: String = { diff --git a/src/main/scala/com/github/shadowsocks/MainActivity.scala b/src/main/scala/com/github/shadowsocks/MainActivity.scala index 4a9eab45..7bd6bcb7 100644 --- a/src/main/scala/com/github/shadowsocks/MainActivity.scala +++ b/src/main/scala/com/github/shadowsocks/MainActivity.scala @@ -143,7 +143,7 @@ class MainActivity extends Activity with ServiceBoundContext with Drawer.OnDrawe txRateText.setText(TrafficMonitor.formatTraffic(txRate) + "/s") rxRateText.setText(TrafficMonitor.formatTraffic(rxRate) + "/s") val child = getFragmentManager.findFragmentById(R.id.content).asInstanceOf[ToolbarFragment] - if (child != null) child.onTrafficUpdated(txRate, rxRate, txTotal, rxTotal) + if (state != State.STOPPING && child != null) child.onTrafficUpdated(txRate, rxRate, txTotal, rxTotal) } override def onServiceConnected() { diff --git a/src/main/scala/com/github/shadowsocks/ProfilesFragment.scala b/src/main/scala/com/github/shadowsocks/ProfilesFragment.scala index e358e6bb..3e483597 100644 --- a/src/main/scala/com/github/shadowsocks/ProfilesFragment.scala +++ b/src/main/scala/com/github/shadowsocks/ProfilesFragment.scala @@ -23,7 +23,7 @@ package com.github.shadowsocks import java.util.GregorianCalendar import android.content._ -import android.os.{Bundle, Handler} +import android.os.Bundle import android.support.v7.widget.RecyclerView.ViewHolder import android.support.v7.widget._ import android.support.v7.widget.helper.ItemTouchHelper @@ -93,27 +93,21 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic share.setOnLongClickListener(cardButtonLongClickListener) } - def updateText(txTotal: Long = 0, rxTotal: Long = 0) { - val tx = item.tx + txTotal - val rx = item.rx + rxTotal - val title = item.getName - val address = if (item.nameIsEmpty) "" else item.formattedAddress - val traffic = getString(R.string.stat_profiles, - TrafficMonitor.formatTraffic(tx), TrafficMonitor.formatTraffic(rx)) - - handler.post(() => { - this.title.setText(title) - this.address.setText(address) - this.traffic.setText(traffic) - }) - } - def bind(item: Profile) { this.item = item val editable = isProfileEditable(item.id) edit.setEnabled(editable) edit.setAlpha(if (editable) 1 else 0.5F) - updateText() + var tx = item.tx + var rx = item.rx + if (item.id == app.profileId) { + tx += txTotal + rx += rxTotal + } + title.setText(item.getName) + address.setText(if (item.nameIsEmpty) "" else item.formattedAddress) + traffic.setText(getString(R.string.stat_profiles, + TrafficMonitor.formatTraffic(tx), TrafficMonitor.formatTraffic(rx))) if (item.id == app.profileId) { indicator.setBackgroundResource(R.drawable.background_selected) @@ -239,10 +233,11 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic } private var selectedItem: ProfileViewHolder = _ - private val handler = new Handler lazy val profilesAdapter = new ProfilesAdapter private var undoManager: UndoSnackbarManager[Profile] = _ + private var txTotal: Long = _ + private var rxTotal: Long = _ private lazy val clipboard = getActivity.getSystemService(Context.CLIPBOARD_SERVICE).asInstanceOf[ClipboardManager] @@ -262,7 +257,9 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic val profilesList = view.findViewById(R.id.profilesList).asInstanceOf[RecyclerView] val layoutManager = new LinearLayoutManager(getActivity) profilesList.setLayoutManager(layoutManager) - profilesList.setItemAnimator(new DefaultItemAnimator()) + val animator = new DefaultItemAnimator() + animator.setSupportsChangeAnimations(false) // prevent fading-in/out when rebinding + profilesList.setItemAnimator(animator) profilesList.setAdapter(profilesAdapter) instance = this layoutManager.scrollToPosition(profilesAdapter.profiles.zipWithIndex.collectFirst { @@ -289,8 +286,11 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic }).attachToRecyclerView(profilesList) } - override def onTrafficUpdated(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long): Unit = - if (selectedItem != null) selectedItem.updateText(txTotal, rxTotal) + override def onTrafficUpdated(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long): Unit = { + this.txTotal = txTotal + this.rxTotal = rxTotal + profilesAdapter.refreshId(app.profileId) + } override def onDetach() { undoManager.flush()