Skip to content

Commit 7ecac22

Browse files
Update UI
1 parent a22f9b2 commit 7ecac22

8 files changed

Lines changed: 182 additions & 36 deletions

File tree

app/src/main/java/io/nekohasekai/sagernet/ui/AboutFragment.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ import io.nekohasekai.sagernet.SagerNet
3636
import io.nekohasekai.sagernet.database.DataStore
3737
import moe.matsuri.nb4a.utils.Util
3838
import org.json.JSONObject
39+
import io.nekohasekai.sagernet.bg.BaseService
40+
import io.nekohasekai.sagernet.widget.StatsBar
41+
import androidx.core.widget.NestedScrollView
3942

4043
class AboutFragment : ToolbarFragment(R.layout.layout_about) {
4144

@@ -44,6 +47,8 @@ class AboutFragment : ToolbarFragment(R.layout.layout_about) {
4447

4548
val binding = LayoutAboutBinding.bind(view)
4649
val collapsingToolbar = view.findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar)
50+
val nestedScrollView = view.findViewById<NestedScrollView>(R.id.about_content)
51+
val bottomAppBar = requireActivity().findViewById<StatsBar>(R.id.stats)
4752

4853
ViewCompat.setOnApplyWindowInsetsListener(view, ListListener)
4954
collapsingToolbar.title = getString(R.string.menu_about)
@@ -52,6 +57,41 @@ class AboutFragment : ToolbarFragment(R.layout.layout_about) {
5257
.replace(R.id.about_fragment_holder, AboutContent())
5358
.commitAllowingStateLoss()
5459

60+
if (bottomAppBar != null && nestedScrollView != null) {
61+
fun updateBottomBarVisibility() {
62+
val isConnected = DataStore.serviceState == BaseService.State.Connected
63+
val showController = DataStore.showBottomBar
64+
65+
if (!isConnected) {
66+
bottomAppBar.performHide()
67+
} else {
68+
if (showController) bottomAppBar.performShow()
69+
else bottomAppBar.performHide()
70+
}
71+
}
72+
73+
updateBottomBarVisibility()
74+
75+
ViewCompat.setNestedScrollingEnabled(nestedScrollView, true)
76+
77+
nestedScrollView.setOnScrollChangeListener(
78+
NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
79+
val isConnected = DataStore.serviceState == BaseService.State.Connected
80+
val showController = DataStore.showBottomBar
81+
82+
if (isConnected && showController) {
83+
if (scrollY > oldScrollY + 6) {
84+
bottomAppBar.performHide()
85+
} else if (scrollY < oldScrollY - 6) {
86+
bottomAppBar.performShow()
87+
}
88+
} else {
89+
bottomAppBar.performHide()
90+
}
91+
}
92+
)
93+
}
94+
5595
runOnDefaultDispatcher {
5696
val license = view.context.assets.open("LICENSE").bufferedReader().readText()
5797
onMainDispatcher {

app/src/main/java/io/nekohasekai/sagernet/ui/AppListActivity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import kotlinx.coroutines.Job
4040
import kotlinx.coroutines.ensureActive
4141
import kotlinx.coroutines.withContext
4242
import kotlin.coroutines.coroutineContext
43+
import com.google.android.material.appbar.CollapsingToolbarLayout
4344

4445
class AppListActivity : ThemedActivity() {
4546
companion object {
@@ -204,10 +205,11 @@ class AppListActivity : ThemedActivity() {
204205

205206
setSupportActionBar(binding.toolbar)
206207
supportActionBar?.apply {
207-
setTitle(R.string.select_apps)
208208
setDisplayHomeAsUpEnabled(true)
209209
setHomeAsUpIndicator(R.drawable.ic_navigation_close)
210210
}
211+
212+
binding.collapsingToolbar.title = getString(R.string.select_apps)
211213

212214
initProxiedUids()
213215
binding.list.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)

app/src/main/java/io/nekohasekai/sagernet/ui/AppManagerActivity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import kotlinx.coroutines.ensureActive
4646
import kotlinx.coroutines.withContext
4747
import moe.matsuri.nb4a.utils.NGUtil
4848
import kotlin.coroutines.coroutineContext
49+
import com.google.android.material.appbar.CollapsingToolbarLayout
4950

5051
class AppManagerActivity : ThemedActivity() {
5152
companion object {
@@ -210,10 +211,11 @@ class AppManagerActivity : ThemedActivity() {
210211

211212
setSupportActionBar(binding.toolbar)
212213
supportActionBar?.apply {
213-
setTitle(R.string.proxied_apps)
214214
setDisplayHomeAsUpEnabled(true)
215215
setHomeAsUpIndicator(R.drawable.ic_navigation_close)
216216
}
217+
218+
binding.collapsingToolbar.title = getString(R.string.proxied_apps)
217219

218220
if (!DataStore.proxyApps) {
219221
DataStore.proxyApps = true

app/src/main/java/io/nekohasekai/sagernet/ui/AssetsActivity.kt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import java.io.File
2424
import java.io.FileWriter
2525
import java.util.*
2626
import java.util.concurrent.atomic.AtomicInteger
27+
import com.google.android.material.appbar.CollapsingToolbarLayout
2728

2829
class AssetsActivity : ThemedActivity() {
2930

@@ -34,26 +35,27 @@ class AssetsActivity : ThemedActivity() {
3435
override fun onCreate(savedInstanceState: Bundle?) {
3536
super.onCreate(savedInstanceState)
3637

37-
val binding = LayoutAssetsBinding.inflate(layoutInflater)
38-
layout = binding
39-
setContentView(binding.root)
38+
layout = LayoutAssetsBinding.inflate(layoutInflater)
39+
setContentView(layout.root)
4040

41-
setSupportActionBar(findViewById(R.id.toolbar))
41+
setSupportActionBar(layout.toolbar)
4242
supportActionBar?.apply {
43-
setTitle(R.string.route_assets)
4443
setDisplayHomeAsUpEnabled(true)
4544
setHomeAsUpIndicator(R.drawable.ic_navigation_close)
4645
}
4746

48-
binding.recyclerView.layoutManager = FixedLinearLayoutManager(binding.recyclerView)
47+
val collapsingToolbar = layout.collapsingToolbar
48+
collapsingToolbar.title = getString(R.string.route_assets)
49+
50+
layout.recyclerView.layoutManager = FixedLinearLayoutManager(layout.recyclerView)
4951
adapter = AssetAdapter()
50-
binding.recyclerView.adapter = adapter
52+
layout.recyclerView.adapter = adapter
5153

52-
binding.refreshLayout.setOnRefreshListener {
54+
layout.refreshLayout.setOnRefreshListener {
5355
adapter.reloadAssets()
54-
binding.refreshLayout.isRefreshing = false
56+
layout.refreshLayout.isRefreshing = false
5557
}
56-
binding.refreshLayout.setColorSchemeColors(getColorAttr(R.attr.primaryOrTextPrimary))
58+
layout.refreshLayout.setColorSchemeColors(getColorAttr(R.attr.colorPrimary))
5759

5860
undoManager = UndoSnackbarManager(this, adapter)
5961

@@ -81,7 +83,7 @@ class AssetsActivity : ThemedActivity() {
8183
target: RecyclerView.ViewHolder
8284
) = false
8385

84-
}).attachToRecyclerView(binding.recyclerView)
86+
}).attachToRecyclerView(layout.recyclerView)
8587
}
8688

8789
override fun snackbarInternal(text: CharSequence): Snackbar {

app/src/main/java/io/nekohasekai/sagernet/ui/GroupFragment.kt

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.core.view.*
1414
import androidx.recyclerview.widget.ItemTouchHelper
1515
import androidx.recyclerview.widget.LinearLayoutManager
1616
import androidx.recyclerview.widget.RecyclerView
17+
import com.google.android.material.appbar.CollapsingToolbarLayout
1718
import com.google.android.material.dialog.MaterialAlertDialogBuilder
1819
import io.nekohasekai.sagernet.GroupType
1920
import io.nekohasekai.sagernet.R
@@ -31,6 +32,8 @@ import moe.matsuri.nb4a.utils.Util
3132
import moe.matsuri.nb4a.utils.toBytesString
3233
import java.lang.NumberFormatException
3334
import java.util.*
35+
import io.nekohasekai.sagernet.bg.BaseService
36+
import io.nekohasekai.sagernet.widget.StatsBar
3437

3538
class GroupFragment : ToolbarFragment(R.layout.layout_group),
3639
Toolbar.OnMenuItemClickListener {
@@ -46,7 +49,12 @@ class GroupFragment : ToolbarFragment(R.layout.layout_group),
4649
activity = requireActivity() as MainActivity
4750

4851
ViewCompat.setOnApplyWindowInsetsListener(view, ListListener)
49-
toolbar.setTitle(R.string.menu_group)
52+
53+
val collapsingToolbar = view.findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar)
54+
val toolbarView = view.findViewById<Toolbar>(R.id.toolbar)
55+
collapsingToolbar.title = getString(R.string.menu_group)
56+
57+
toolbar = toolbarView
5058
toolbar.inflateMenu(R.menu.add_group_menu)
5159
toolbar.setOnMenuItemClickListener(this)
5260

@@ -59,6 +67,44 @@ class GroupFragment : ToolbarFragment(R.layout.layout_group),
5967

6068
undoManager = UndoSnackbarManager(activity, groupAdapter)
6169

70+
view.post {
71+
val bottomAppBar = requireActivity().findViewById<StatsBar>(R.id.stats) ?: return@post
72+
73+
fun updateBottomBarVisibility() {
74+
val isConnected = DataStore.serviceState == BaseService.State.Connected
75+
val showController = DataStore.showBottomBar
76+
77+
if (!isConnected) {
78+
bottomAppBar.performHide()
79+
} else {
80+
if (showController) bottomAppBar.performShow()
81+
else bottomAppBar.performHide()
82+
}
83+
}
84+
85+
updateBottomBarVisibility()
86+
87+
if (groupListView != null) {
88+
ViewCompat.setNestedScrollingEnabled(groupListView, true)
89+
90+
groupListView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
91+
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
92+
super.onScrolled(recyclerView, dx, dy)
93+
94+
val isConnected = DataStore.serviceState == BaseService.State.Connected
95+
val showController = DataStore.showBottomBar
96+
97+
if (isConnected && showController) {
98+
if (dy > 6) bottomAppBar.performHide()
99+
else if (dy < -6) bottomAppBar.performShow()
100+
} else {
101+
bottomAppBar.performHide()
102+
}
103+
}
104+
})
105+
}
106+
}
107+
62108
ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(
63109
ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.START
64110
) {
@@ -539,4 +585,4 @@ class GroupFragment : ToolbarFragment(R.layout.layout_group),
539585
}
540586
}
541587

542-
}
588+
}

app/src/main/java/io/nekohasekai/sagernet/ui/LogcatFragment.kt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import io.nekohasekai.sagernet.ktx.*
1919
import io.nekohasekai.sagernet.widget.ListListener
2020
import libcore.Libcore
2121
import moe.matsuri.nb4a.utils.SendLog
22+
import com.google.android.material.appbar.AppBarLayout
23+
import com.google.android.material.appbar.CollapsingToolbarLayout
2224

2325
class LogcatFragment : ToolbarFragment(R.layout.layout_logcat),
2426
Toolbar.OnMenuItemClickListener {
@@ -28,22 +30,29 @@ class LogcatFragment : ToolbarFragment(R.layout.layout_logcat),
2830
@SuppressLint("RestrictedApi", "WrongConstant")
2931
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
3032
super.onViewCreated(view, savedInstanceState)
31-
toolbar.setTitle(R.string.menu_log)
33+
binding = LayoutLogcatBinding.bind(view)
34+
35+
val collapsingToolbar = binding.collapsingToolbar
36+
val toolbar = binding.toolbar
37+
val appBarLayout = binding.appbar
3238

39+
collapsingToolbar.title = getString(R.string.menu_log)
3340
toolbar.inflateMenu(R.menu.logcat_menu)
3441
toolbar.setOnMenuItemClickListener(this)
3542

36-
binding = LayoutLogcatBinding.bind(view)
37-
3843
if (Build.VERSION.SDK_INT >= 23) {
3944
binding.textview.breakStrategy = 0 // simple
4045
}
4146

4247
ViewCompat.setOnApplyWindowInsetsListener(binding.root, ListListener)
4348

49+
binding.scroolview.setOnScrollChangeListener { _, _, scrollY, _, _ ->
50+
appBarLayout.setExpanded(scrollY == 0)
51+
}
52+
4453
reloadSession()
4554
}
46-
55+
4756
private fun getColorForLine(line: String): ForegroundColorSpan {
4857
var color = ForegroundColorSpan(Color.GRAY)
4958
when {
@@ -116,4 +125,4 @@ class LogcatFragment : ToolbarFragment(R.layout.layout_logcat),
116125
return true
117126
}
118127

119-
}
128+
}

app/src/main/java/io/nekohasekai/sagernet/ui/RouteFragment.kt

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.appcompat.widget.Toolbar
99
import androidx.core.view.ViewCompat
1010
import androidx.recyclerview.widget.ItemTouchHelper
1111
import androidx.recyclerview.widget.RecyclerView
12+
import com.google.android.material.appbar.CollapsingToolbarLayout
1213
import com.google.android.material.dialog.MaterialAlertDialogBuilder
1314
import io.nekohasekai.sagernet.R
1415
import io.nekohasekai.sagernet.database.DataStore
@@ -20,6 +21,8 @@ import io.nekohasekai.sagernet.databinding.LayoutRouteItemBinding
2021
import io.nekohasekai.sagernet.ktx.*
2122
import io.nekohasekai.sagernet.widget.ListListener
2223
import io.nekohasekai.sagernet.widget.UndoSnackbarManager
24+
import io.nekohasekai.sagernet.widget.StatsBar
25+
import io.nekohasekai.sagernet.bg.BaseService
2326

2427
class RouteFragment : ToolbarFragment(R.layout.layout_route), Toolbar.OnMenuItemClickListener {
2528

@@ -34,7 +37,12 @@ class RouteFragment : ToolbarFragment(R.layout.layout_route), Toolbar.OnMenuItem
3437
activity = requireActivity() as MainActivity
3538

3639
ViewCompat.setOnApplyWindowInsetsListener(view, ListListener)
37-
toolbar.setTitle(R.string.menu_route)
40+
41+
val collapsingToolbar = view.findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar)
42+
val toolbarView = view.findViewById<Toolbar>(R.id.toolbar)
43+
collapsingToolbar.title = getString(R.string.menu_route)
44+
45+
toolbar = toolbarView
3846
toolbar.inflateMenu(R.menu.add_route_menu)
3947
toolbar.setOnMenuItemClickListener(this)
4048

@@ -45,6 +53,44 @@ class RouteFragment : ToolbarFragment(R.layout.layout_route), Toolbar.OnMenuItem
4553
ruleListView.adapter = ruleAdapter
4654
undoManager = UndoSnackbarManager(activity, ruleAdapter)
4755

56+
view.post {
57+
val bottomAppBar = requireActivity().findViewById<StatsBar>(R.id.stats) ?: return@post
58+
59+
fun updateBottomBarVisibility() {
60+
val isConnected = DataStore.serviceState == BaseService.State.Connected
61+
val showController = DataStore.showBottomBar
62+
63+
if (!isConnected) {
64+
bottomAppBar.performHide()
65+
} else {
66+
if (showController) bottomAppBar.performShow()
67+
else bottomAppBar.performHide()
68+
}
69+
}
70+
71+
updateBottomBarVisibility()
72+
73+
if (ruleListView != null) {
74+
ViewCompat.setNestedScrollingEnabled(ruleListView, true)
75+
76+
ruleListView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
77+
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
78+
super.onScrolled(recyclerView, dx, dy)
79+
80+
val isConnected = DataStore.serviceState == BaseService.State.Connected
81+
val showController = DataStore.showBottomBar
82+
83+
if (isConnected && showController) {
84+
if (dy > 6) bottomAppBar.performHide()
85+
else if (dy < -6) bottomAppBar.performShow()
86+
} else {
87+
bottomAppBar.performHide()
88+
}
89+
}
90+
})
91+
}
92+
}
93+
4894
ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.START) {
4995

5096
override fun getSwipeDirs(
@@ -307,4 +353,4 @@ class RouteFragment : ToolbarFragment(R.layout.layout_route), Toolbar.OnMenuItem
307353

308354
}
309355

310-
}
356+
}

0 commit comments

Comments
 (0)