Unverified Commit 41730631 authored by Max Lv's avatar Max Lv Committed by GitHub

Merge pull request #2296 from Mygod/stats-when-connected

Show stats bar only when connected
parents bf1961aa 64ff0f2a
...@@ -9,6 +9,7 @@ buildscript { ...@@ -9,6 +9,7 @@ buildscript {
minSdkVersion = 21 minSdkVersion = 21
sdkVersion = 29 sdkVersion = 29
compileSdkVersion = 29 compileSdkVersion = 29
lifecycleVersion = '2.2.0-alpha03'
junitVersion = '4.12' junitVersion = '4.12'
androidTestVersion = '1.2.0' androidTestVersion = '1.2.0'
androidEspressoVersion = '3.2.0' androidEspressoVersion = '3.2.0'
......
...@@ -50,13 +50,13 @@ androidExtensions { ...@@ -50,13 +50,13 @@ androidExtensions {
} }
def coroutinesVersion = '1.3.0' def coroutinesVersion = '1.3.0'
def lifecycleVersion = '2.1.0-rc01'
def roomVersion = '2.1.0' def roomVersion = '2.1.0'
def workVersion = '2.2.0' def workVersion = '2.2.0'
dependencies { dependencies {
api project(':plugin') api project(':plugin')
api "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion" api "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion"
api "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion" api "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion"
api "androidx.lifecycle:lifecycle-livedata-core-ktx:$lifecycleVersion"
api "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion" api "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"
api 'androidx.preference:preference:1.1.0-rc01' api 'androidx.preference:preference:1.1.0-rc01'
api "androidx.room:room-runtime:$roomVersion" api "androidx.room:room-runtime:$roomVersion"
......
...@@ -62,6 +62,7 @@ dependencies { ...@@ -62,6 +62,7 @@ dependencies {
implementation project(':core') implementation project(':core')
implementation 'androidx.browser:browser:1.2.0-alpha07' implementation 'androidx.browser:browser:1.2.0-alpha07'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion"
implementation 'com.google.android.gms:play-services-vision:18.0.0' implementation 'com.google.android.gms:play-services-vision:18.0.0'
implementation 'com.google.firebase:firebase-ads:18.1.1' implementation 'com.google.firebase:firebase-ads:18.1.1'
implementation 'com.takisoft.preferencex:preferencex-simplemenu:1.0.0' implementation 'com.takisoft.preferencex:preferencex-simplemenu:1.0.0'
......
...@@ -27,16 +27,15 @@ import android.view.View ...@@ -27,16 +27,15 @@ import android.view.View
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.widget.TooltipCompat import androidx.appcompat.widget.TooltipCompat
import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.fragment.app.FragmentActivity import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.lifecycle.get import androidx.lifecycle.get
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.observe
import com.github.shadowsocks.MainActivity import com.github.shadowsocks.MainActivity
import com.github.shadowsocks.R import com.github.shadowsocks.R
import com.github.shadowsocks.bg.BaseService import com.github.shadowsocks.bg.BaseService
import com.github.shadowsocks.net.HttpsTest import com.github.shadowsocks.net.HttpsTest
import com.google.android.material.bottomappbar.BottomAppBar import com.google.android.material.bottomappbar.BottomAppBar
import kotlin.math.abs
class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null,
defStyleAttr: Int = R.attr.bottomAppBarStyle) : defStyleAttr: Int = R.attr.bottomAppBarStyle) :
...@@ -46,16 +45,14 @@ class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? ...@@ -46,16 +45,14 @@ class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet?
private lateinit var rxText: TextView private lateinit var rxText: TextView
private lateinit var txRateText: TextView private lateinit var txRateText: TextView
private lateinit var rxRateText: TextView private lateinit var rxRateText: TextView
private val tester = ViewModelProviders.of(context as FragmentActivity).get<HttpsTest>() private val tester = ViewModelProvider(context as MainActivity).get<HttpsTest>()
private lateinit var behavior: Behavior private lateinit var behavior: Behavior
override fun getBehavior(): Behavior { override fun getBehavior(): Behavior {
if (!this::behavior.isInitialized) behavior = object : Behavior() { if (!this::behavior.isInitialized) behavior = object : Behavior() {
val threshold = context.resources.getDimensionPixelSize(R.dimen.stats_bar_scroll_threshold)
override fun onNestedScroll(coordinatorLayout: CoordinatorLayout, child: BottomAppBar, target: View, override fun onNestedScroll(coordinatorLayout: CoordinatorLayout, child: BottomAppBar, target: View,
dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int,
type: Int, consumed: IntArray) { type: Int, consumed: IntArray) {
val dy = dyConsumed + dyUnconsumed super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed + dyUnconsumed,
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, if (abs(dy) >= threshold) dy else 0,
dxUnconsumed, 0, type, consumed) dxUnconsumed, 0, type, consumed)
} }
} }
...@@ -78,7 +75,11 @@ class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? ...@@ -78,7 +75,11 @@ class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet?
fun changeState(state: BaseService.State) { fun changeState(state: BaseService.State) {
val activity = context as MainActivity val activity = context as MainActivity
if (state != BaseService.State.Connected) { if ((state == BaseService.State.Connected).also { hideOnScroll = it }) {
activity.lifecycleScope.launchWhenStarted { performShow() }
tester.status.observe(activity) { it.retrieve(this::setStatus) { msg -> activity.snackbar(msg).show() } }
} else {
activity.lifecycleScope.launchWhenStarted { performHide() }
updateTraffic(0, 0, 0, 0) updateTraffic(0, 0, 0, 0)
tester.status.removeObservers(activity) tester.status.removeObservers(activity)
if (state != BaseService.State.Idle) tester.invalidate() if (state != BaseService.State.Idle) tester.invalidate()
...@@ -87,11 +88,6 @@ class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? ...@@ -87,11 +88,6 @@ class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet?
BaseService.State.Stopping -> R.string.stopping BaseService.State.Stopping -> R.string.stopping
else -> R.string.not_connected else -> R.string.not_connected
})) }))
} else {
behavior.slideUp(this)
tester.status.observe(activity, Observer {
it.retrieve(this::setStatus) { activity.snackbar(it).show() }
})
} }
} }
......
...@@ -4,5 +4,4 @@ ...@@ -4,5 +4,4 @@
<dimen name="profile_padding">8dp</dimen> <dimen name="profile_padding">8dp</dimen>
<dimen name="main_list_padding_bottom">88dp</dimen> <dimen name="main_list_padding_bottom">88dp</dimen>
<dimen name="bottom_sheet_padding">8dp</dimen> <dimen name="bottom_sheet_padding">8dp</dimen>
<dimen name="stats_bar_scroll_threshold">4dp</dimen>
</resources> </resources>
...@@ -32,9 +32,9 @@ import android.text.format.Formatter ...@@ -32,9 +32,9 @@ import android.text.format.Formatter
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.leanback.preference.LeanbackPreferenceFragmentCompat import androidx.leanback.preference.LeanbackPreferenceFragmentCompat
import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProviders
import androidx.lifecycle.get import androidx.lifecycle.get
import androidx.lifecycle.observe
import androidx.preference.* import androidx.preference.*
import com.crashlytics.android.Crashlytics import com.crashlytics.android.Crashlytics
import com.github.shadowsocks.BootReceiver import com.github.shadowsocks.BootReceiver
...@@ -113,14 +113,13 @@ class MainPreferenceFragment : LeanbackPreferenceFragmentCompat(), ShadowsocksCo ...@@ -113,14 +113,13 @@ class MainPreferenceFragment : LeanbackPreferenceFragmentCompat(), ShadowsocksCo
else -> R.string.connect else -> R.string.connect
}) })
stats.setTitle(R.string.connection_test_pending) stats.setTitle(R.string.connection_test_pending)
stats.isVisible = state == BaseService.State.Connected if ((state == BaseService.State.Connected).also { stats.isVisible = it }) tester.status.observe(this) {
if (state != BaseService.State.Connected) { it.retrieve(stats::setTitle) { msg -> Toast.makeText(context, msg, Toast.LENGTH_LONG).show() }
} else {
trafficUpdated(0, TrafficStats()) trafficUpdated(0, TrafficStats())
tester.status.removeObservers(this) tester.status.removeObservers(this)
if (state != BaseService.State.Idle) tester.invalidate() if (state != BaseService.State.Idle) tester.invalidate()
} else tester.status.observe(this, Observer { }
it.retrieve(stats::setTitle) { Toast.makeText(context, it, Toast.LENGTH_LONG).show() }
})
if (msg != null) Toast.makeText(context, getString(R.string.vpn_error, msg), Toast.LENGTH_SHORT).show() if (msg != null) Toast.makeText(context, getString(R.string.vpn_error, msg), Toast.LENGTH_SHORT).show()
this.state = state this.state = state
val stopped = state == BaseService.State.Stopped val stopped = state == BaseService.State.Stopped
...@@ -192,7 +191,7 @@ class MainPreferenceFragment : LeanbackPreferenceFragmentCompat(), ShadowsocksCo ...@@ -192,7 +191,7 @@ class MainPreferenceFragment : LeanbackPreferenceFragmentCompat(), ShadowsocksCo
serviceMode.onPreferenceChangeListener = onServiceModeChange serviceMode.onPreferenceChangeListener = onServiceModeChange
findPreference<Preference>(Key.about)!!.summary = getString(R.string.about_title, BuildConfig.VERSION_NAME) findPreference<Preference>(Key.about)!!.summary = getString(R.string.about_title, BuildConfig.VERSION_NAME)
tester = ViewModelProviders.of(this).get() tester = ViewModelProvider(this).get()
changeState(BaseService.State.Idle) // reset everything to init state changeState(BaseService.State.Idle) // reset everything to init state
connection.connect(requireContext(), this) connection.connect(requireContext(), this)
DataStore.publicStore.registerChangeListener(this) DataStore.publicStore.registerChangeListener(this)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment