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 {
minSdkVersion = 21
sdkVersion = 29
compileSdkVersion = 29
lifecycleVersion = '2.2.0-alpha03'
junitVersion = '4.12'
androidTestVersion = '1.2.0'
androidEspressoVersion = '3.2.0'
......
......@@ -50,13 +50,13 @@ androidExtensions {
}
def coroutinesVersion = '1.3.0'
def lifecycleVersion = '2.1.0-rc01'
def roomVersion = '2.1.0'
def workVersion = '2.2.0'
dependencies {
api project(':plugin')
api "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion"
api "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion"
api "androidx.lifecycle:lifecycle-livedata-core-ktx:$lifecycleVersion"
api "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"
api 'androidx.preference:preference:1.1.0-rc01'
api "androidx.room:room-runtime:$roomVersion"
......
......@@ -62,6 +62,7 @@ dependencies {
implementation project(':core')
implementation 'androidx.browser:browser:1.2.0-alpha07'
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.firebase:firebase-ads:18.1.1'
implementation 'com.takisoft.preferencex:preferencex-simplemenu:1.0.0'
......
......@@ -27,16 +27,15 @@ import android.view.View
import android.widget.TextView
import androidx.appcompat.widget.TooltipCompat
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.get
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.observe
import com.github.shadowsocks.MainActivity
import com.github.shadowsocks.R
import com.github.shadowsocks.bg.BaseService
import com.github.shadowsocks.net.HttpsTest
import com.google.android.material.bottomappbar.BottomAppBar
import kotlin.math.abs
class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null,
defStyleAttr: Int = R.attr.bottomAppBarStyle) :
......@@ -46,16 +45,14 @@ class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet?
private lateinit var rxText: TextView
private lateinit var txRateText: 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
override fun getBehavior(): 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,
dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int,
type: Int, consumed: IntArray) {
val dy = dyConsumed + dyUnconsumed
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, if (abs(dy) >= threshold) dy else 0,
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed + dyUnconsumed,
dxUnconsumed, 0, type, consumed)
}
}
......@@ -78,7 +75,11 @@ class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet?
fun changeState(state: BaseService.State) {
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)
tester.status.removeObservers(activity)
if (state != BaseService.State.Idle) tester.invalidate()
......@@ -87,11 +88,6 @@ class StatsBar @JvmOverloads constructor(context: Context, attrs: AttributeSet?
BaseService.State.Stopping -> R.string.stopping
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 @@
<dimen name="profile_padding">8dp</dimen>
<dimen name="main_list_padding_bottom">88dp</dimen>
<dimen name="bottom_sheet_padding">8dp</dimen>
<dimen name="stats_bar_scroll_threshold">4dp</dimen>
</resources>
......@@ -32,9 +32,9 @@ import android.text.format.Formatter
import android.util.Log
import android.widget.Toast
import androidx.leanback.preference.LeanbackPreferenceFragmentCompat
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.get
import androidx.lifecycle.observe
import androidx.preference.*
import com.crashlytics.android.Crashlytics
import com.github.shadowsocks.BootReceiver
......@@ -113,14 +113,13 @@ class MainPreferenceFragment : LeanbackPreferenceFragmentCompat(), ShadowsocksCo
else -> R.string.connect
})
stats.setTitle(R.string.connection_test_pending)
stats.isVisible = state == BaseService.State.Connected
if (state != BaseService.State.Connected) {
if ((state == BaseService.State.Connected).also { stats.isVisible = it }) tester.status.observe(this) {
it.retrieve(stats::setTitle) { msg -> Toast.makeText(context, msg, Toast.LENGTH_LONG).show() }
} else {
trafficUpdated(0, TrafficStats())
tester.status.removeObservers(this)
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()
this.state = state
val stopped = state == BaseService.State.Stopped
......@@ -192,7 +191,7 @@ class MainPreferenceFragment : LeanbackPreferenceFragmentCompat(), ShadowsocksCo
serviceMode.onPreferenceChangeListener = onServiceModeChange
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
connection.connect(requireContext(), 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