Updated hide fragment with more robust filtering UI
This commit is contained in:
parent
d48e9d5d72
commit
dad52724db
@ -2,9 +2,8 @@ package com.topjohnwu.magisk.redesign.hide
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Insets
|
import android.graphics.Insets
|
||||||
import android.view.Menu
|
import android.os.Bundle
|
||||||
import android.view.MenuInflater
|
import android.view.View
|
||||||
import android.view.MenuItem
|
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding
|
import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding
|
||||||
import com.topjohnwu.magisk.redesign.compat.CompatFragment
|
import com.topjohnwu.magisk.redesign.compat.CompatFragment
|
||||||
@ -20,16 +19,14 @@ class HideFragment : CompatFragment<HideViewModel, FragmentHideMd2Binding>() {
|
|||||||
override fun onAttach(context: Context) {
|
override fun onAttach(context: Context) {
|
||||||
super.onAttach(context)
|
super.onAttach(context)
|
||||||
activity.setTitle(R.string.magiskhide)
|
activity.setTitle(R.string.magiskhide)
|
||||||
setHasOptionsMenu(true)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
inflater.inflate(R.menu.menu_hide_md2, menu)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
menu.findItem(R.id.action_show_system)?.isChecked = viewModel.isShowSystem
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
binding.hideActionScrollUp.setOnClickListener {
|
||||||
return viewModel.menuItemPressed(item)
|
binding.hideScrollContainer.fullScroll(View.FOCUS_UP)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,12 +1,14 @@
|
|||||||
package com.topjohnwu.magisk.redesign.hide
|
package com.topjohnwu.magisk.redesign.hide
|
||||||
|
|
||||||
import android.content.pm.ApplicationInfo
|
import android.content.pm.ApplicationInfo
|
||||||
import android.view.MenuItem
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
|
import androidx.databinding.Bindable
|
||||||
import com.topjohnwu.magisk.BR
|
import com.topjohnwu.magisk.BR
|
||||||
import com.topjohnwu.magisk.R
|
|
||||||
import com.topjohnwu.magisk.data.repository.MagiskRepository
|
import com.topjohnwu.magisk.data.repository.MagiskRepository
|
||||||
import com.topjohnwu.magisk.databinding.ComparableRvItem
|
import com.topjohnwu.magisk.databinding.ComparableRvItem
|
||||||
import com.topjohnwu.magisk.extensions.subscribeK
|
import com.topjohnwu.magisk.extensions.subscribeK
|
||||||
|
import com.topjohnwu.magisk.extensions.toggle
|
||||||
import com.topjohnwu.magisk.model.entity.HideAppInfo
|
import com.topjohnwu.magisk.model.entity.HideAppInfo
|
||||||
import com.topjohnwu.magisk.model.entity.HideTarget
|
import com.topjohnwu.magisk.model.entity.HideTarget
|
||||||
import com.topjohnwu.magisk.model.entity.ProcessHideApp
|
import com.topjohnwu.magisk.model.entity.ProcessHideApp
|
||||||
@ -19,18 +21,31 @@ import com.topjohnwu.magisk.utils.DiffObservableList
|
|||||||
import com.topjohnwu.magisk.utils.FilterableDiffObservableList
|
import com.topjohnwu.magisk.utils.FilterableDiffObservableList
|
||||||
import com.topjohnwu.magisk.utils.KObservableField
|
import com.topjohnwu.magisk.utils.KObservableField
|
||||||
import com.topjohnwu.magisk.utils.currentLocale
|
import com.topjohnwu.magisk.utils.currentLocale
|
||||||
|
import io.reactivex.Single
|
||||||
|
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||||
|
|
||||||
class HideViewModel(
|
class HideViewModel(
|
||||||
private val magiskRepo: MagiskRepository
|
private val magiskRepo: MagiskRepository
|
||||||
) : CompatViewModel() {
|
) : CompatViewModel() {
|
||||||
|
|
||||||
|
private val queryHandler = Handler(Looper.getMainLooper())
|
||||||
|
private val queryRunnable = Runnable { query() }
|
||||||
|
|
||||||
var isShowSystem = false
|
var isShowSystem = false
|
||||||
|
@Bindable get
|
||||||
set(value) {
|
set(value) {
|
||||||
field = value
|
field = value
|
||||||
|
notifyPropertyChanged(BR.showSystem)
|
||||||
query()
|
query()
|
||||||
}
|
}
|
||||||
|
|
||||||
val query = KObservableField("")
|
var query = ""
|
||||||
|
@Bindable get
|
||||||
|
set(value) {
|
||||||
|
field = value
|
||||||
|
notifyPropertyChanged(BR.query)
|
||||||
|
submitQuery()
|
||||||
|
}
|
||||||
val items = filterableListOf<HideItem>()
|
val items = filterableListOf<HideItem>()
|
||||||
val itemBinding = itemBindingOf<HideItem> {
|
val itemBinding = itemBindingOf<HideItem> {
|
||||||
it.bindExtra(BR.viewModel, this)
|
it.bindExtra(BR.viewModel, this)
|
||||||
@ -39,6 +54,8 @@ class HideViewModel(
|
|||||||
it.bindExtra(BR.viewModel, this)
|
it.bindExtra(BR.viewModel, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val isFilterExpanded = KObservableField(false)
|
||||||
|
|
||||||
override fun refresh() = magiskRepo.fetchApps()
|
override fun refresh() = magiskRepo.fetchApps()
|
||||||
.map { it to magiskRepo.fetchHideTargets().blockingGet() }
|
.map { it to magiskRepo.fetchHideTargets().blockingGet() }
|
||||||
.map { pair -> pair.first.map { mergeAppTargets(it, pair.second) } }
|
.map { pair -> pair.first.map { mergeAppTargets(it, pair.second) } }
|
||||||
@ -70,8 +87,13 @@ class HideViewModel(
|
|||||||
|
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
|
private fun submitQuery() {
|
||||||
|
queryHandler.removeCallbacks(queryRunnable)
|
||||||
|
queryHandler.postDelayed(queryRunnable, 1000)
|
||||||
|
}
|
||||||
|
|
||||||
private fun query(
|
private fun query(
|
||||||
query: String = this.query.value,
|
query: String = this.query,
|
||||||
showSystem: Boolean = isShowSystem
|
showSystem: Boolean = isShowSystem
|
||||||
) = items.filter {
|
) = items.filter {
|
||||||
fun filterSystem(): Boolean {
|
fun filterSystem(): Boolean {
|
||||||
@ -90,18 +112,22 @@ class HideViewModel(
|
|||||||
|
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
fun menuItemPressed(menuItem: MenuItem) = when (menuItem.itemId) {
|
|
||||||
R.id.action_show_system -> isShowSystem = (!menuItem.isChecked)
|
|
||||||
.also { menuItem.isChecked = it }
|
|
||||||
else -> null
|
|
||||||
}?.let { true } ?: false
|
|
||||||
|
|
||||||
fun toggleItem(item: HideProcessItem) = magiskRepo
|
fun toggleItem(item: HideProcessItem) = magiskRepo
|
||||||
.toggleHide(item.isHidden.value, item.item.packageName, item.item.name)
|
.toggleHide(item.isHidden.value, item.item.packageName, item.item.name)
|
||||||
// might wanna reorder the list to display the item at the top
|
// might wanna reorder the list to display the item at the top
|
||||||
.subscribeK()
|
.subscribeK()
|
||||||
.add()
|
.add()
|
||||||
|
|
||||||
|
fun toggle(item: KObservableField<Boolean>) = item.toggle()
|
||||||
|
|
||||||
|
fun resetQuery() {
|
||||||
|
query = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
fun hideFilter() {
|
||||||
|
isFilterExpanded.value = false
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <T : ComparableRvItem<T>> filterableListOf(
|
inline fun <T : ComparableRvItem<T>> filterableListOf(
|
||||||
|
@ -15,6 +15,7 @@ import androidx.appcompat.widget.AppCompatImageView
|
|||||||
import androidx.appcompat.widget.Toolbar
|
import androidx.appcompat.widget.Toolbar
|
||||||
import androidx.core.animation.doOnEnd
|
import androidx.core.animation.doOnEnd
|
||||||
import androidx.core.view.*
|
import androidx.core.view.*
|
||||||
|
import androidx.core.widget.NestedScrollView
|
||||||
import androidx.databinding.BindingAdapter
|
import androidx.databinding.BindingAdapter
|
||||||
import androidx.databinding.InverseBindingAdapter
|
import androidx.databinding.InverseBindingAdapter
|
||||||
import androidx.databinding.InverseBindingListener
|
import androidx.databinding.InverseBindingListener
|
||||||
@ -26,6 +27,7 @@ import androidx.recyclerview.widget.RecyclerView
|
|||||||
import androidx.viewpager.widget.ViewPager
|
import androidx.viewpager.widget.ViewPager
|
||||||
import com.google.android.material.button.MaterialButton
|
import com.google.android.material.button.MaterialButton
|
||||||
import com.google.android.material.card.MaterialCardView
|
import com.google.android.material.card.MaterialCardView
|
||||||
|
import com.google.android.material.chip.Chip
|
||||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
import com.google.android.material.navigation.NavigationView
|
import com.google.android.material.navigation.NavigationView
|
||||||
import com.google.android.material.textfield.TextInputLayout
|
import com.google.android.material.textfield.TextInputLayout
|
||||||
@ -411,3 +413,20 @@ fun Toolbar.setOnMenuClickListener(listener: Toolbar.OnMenuItemClickListener) {
|
|||||||
fun View.setTooltipTextCompat(text: String) {
|
fun View.setTooltipTextCompat(text: String) {
|
||||||
ViewCompat.setTooltipText(this, text)
|
ViewCompat.setTooltipText(this, text)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@BindingAdapter("onCloseClicked")
|
||||||
|
fun Chip.setOnCloseClickedListenerBinding(listener: View.OnClickListener) {
|
||||||
|
setOnCloseIconClickListener(listener)
|
||||||
|
}
|
||||||
|
|
||||||
|
@BindingAdapter("onScrollStateChanged")
|
||||||
|
fun NestedScrollView.setOnScrollStateChangeListener(listener: Runnable) {
|
||||||
|
setOnScrollChangeListener { _: NestedScrollView?, _: Int, _: Int, _: Int, _: Int ->
|
||||||
|
if (!handler.hasCallbacks(listener)) {
|
||||||
|
listener.run()
|
||||||
|
} else {
|
||||||
|
handler.removeCallbacksAndMessages(null)
|
||||||
|
}
|
||||||
|
handler.postDelayed(listener, 1000)
|
||||||
|
}
|
||||||
|
}
|
12
app/src/main/res/drawable/ic_filter.xml
Normal file
12
app/src/main/res/drawable/ic_filter.xml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?colorOnSurface"
|
||||||
|
android:pathData="M6,13H18V11H6M3,6V8H21V6M10,18H14V16H10V18Z"
|
||||||
|
tools:fillColor="@android:color/black" />
|
||||||
|
</vector>
|
18
app/src/main/res/drawable/ic_search_md2.xml
Normal file
18
app/src/main/res/drawable/ic_search_md2.xml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="475.084"
|
||||||
|
android:viewportHeight="475.084">
|
||||||
|
|
||||||
|
<group
|
||||||
|
android:pivotX="237.542"
|
||||||
|
android:pivotY="237.542"
|
||||||
|
android:scaleX="0.8"
|
||||||
|
android:scaleY="0.8">
|
||||||
|
<path
|
||||||
|
android:fillColor="?colorOnSurface"
|
||||||
|
android:pathData="M464.524,412.846l-97.929,-97.925c23.6,-34.068 35.406,-72.047 35.406,-113.917c0,-27.218 -5.284,-53.249 -15.852,-78.087c-10.561,-24.842 -24.838,-46.254 -42.825,-64.241c-17.987,-17.987 -39.396,-32.264 -64.233,-42.826C254.246,5.285 228.217,0.003 200.999,0.003c-27.216,0 -53.247,5.282 -78.085,15.847C98.072,26.412 76.66,40.689 58.673,58.676c-17.989,17.987 -32.264,39.403 -42.827,64.241C5.282,147.758 0,173.786 0,201.004c0,27.216 5.282,53.238 15.846,78.083c10.562,24.838 24.838,46.247 42.827,64.234c17.987,17.993 39.403,32.264 64.241,42.832c24.841,10.563 50.869,15.844 78.085,15.844c41.879,0 79.852,-11.807 113.922,-35.405l97.929,97.641c6.852,7.231 15.406,10.849 25.693,10.849c9.897,0 18.467,-3.617 25.694,-10.849c7.23,-7.23 10.848,-15.796 10.848,-25.693C475.088,428.458 471.567,419.889 464.524,412.846zM291.363,291.358c-25.029,25.033 -55.148,37.549 -90.364,37.549c-35.21,0 -65.329,-12.519 -90.36,-37.549c-25.031,-25.029 -37.546,-55.144 -37.546,-90.36c0,-35.21 12.518,-65.334 37.546,-90.36c25.026,-25.032 55.15,-37.546 90.36,-37.546c35.212,0 65.331,12.519 90.364,37.546c25.033,25.026 37.548,55.15 37.548,90.36C328.911,236.214 316.392,266.329 291.363,291.358z"
|
||||||
|
tools:fillColor="@android:color/black" />
|
||||||
|
</group>
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_up_md2.xml
Normal file
10
app/src/main/res/drawable/ic_up_md2.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?colorOnSurface"
|
||||||
|
android:pathData="M16.59,9.42L12,4.83L7.41,9.42L6,8L12,2L18,8L16.59,9.42M16.59,15.42L12,10.83L7.41,15.42L6,14L12,8L18,14L16.59,15.42M16.59,21.42L12,16.83L7.41,21.42L6,20L12,14L18,20L16.59,21.42Z" />
|
||||||
|
</vector>
|
@ -17,22 +17,137 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<androidx.core.widget.NestedScrollView
|
||||||
|
android:id="@+id/hide_scroll_container"
|
||||||
|
onScrollStateChanged="@{() -> viewModel.hideFilter()}"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:fillViewport="true"
|
||||||
|
android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}"
|
||||||
|
android:paddingBottom="@{viewModel.insets.bottom}"
|
||||||
|
tools:paddingTop="40dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
style="?styleCardVariant"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/l1"
|
||||||
|
android:layout_marginEnd="@dimen/l1">
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
android:id="@+id/hide_filter_icon"
|
||||||
|
style="?styleIconNormal"
|
||||||
|
android:onClick="@{() -> viewModel.toggle(viewModel.isFilterExpanded)}"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/ic_filter" />
|
||||||
|
|
||||||
|
<com.google.android.material.chip.ChipGroup
|
||||||
|
android:id="@+id/hide_filter_chip_group"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingStart="@dimen/l_50"
|
||||||
|
android:paddingEnd="0dp"
|
||||||
|
app:chipSpacing="2dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/hide_filter_barrier"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/hide_filter_icon"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<com.google.android.material.chip.Chip
|
||||||
|
style="@style/Widget.MaterialComponents.Chip.Filter"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:checked="@={viewModel.showSystem}"
|
||||||
|
android:text="@string/show_system_app"
|
||||||
|
android:textAppearance="?appearanceTextCaptionNormal" />
|
||||||
|
|
||||||
|
<com.google.android.material.chip.Chip
|
||||||
|
style="@style/Widget.MaterialComponents.Chip.Entry"
|
||||||
|
gone="@{viewModel.query.empty}"
|
||||||
|
onCloseClicked="@{() -> viewModel.resetQuery()}"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:checkable="false"
|
||||||
|
android:text="@{viewModel.query}"
|
||||||
|
android:textAppearance="?appearanceTextCaptionNormal" />
|
||||||
|
|
||||||
|
</com.google.android.material.chip.ChipGroup>
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.Barrier
|
||||||
|
android:id="@+id/hide_filter_barrier"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:barrierDirection="bottom"
|
||||||
|
app:constraint_referenced_ids="hide_filter_icon,hide_filter_chip_group" />
|
||||||
|
|
||||||
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:id="@+id/hide_filter_search"
|
||||||
|
style="?styleCardNormal"
|
||||||
|
goneUnless="@{viewModel.isFilterExpanded}"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="@dimen/l1"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/hide_filter_barrier"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
style="?styleIconNormal"
|
||||||
|
app:srcCompat="@drawable/ic_search_md2"
|
||||||
|
app:tint="?colorDisabled" />
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatEditText
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="48dp"
|
||||||
|
android:background="@null"
|
||||||
|
android:hint="@string/hide_filter_hint"
|
||||||
|
android:inputType="textUri"
|
||||||
|
android:minHeight="48dp"
|
||||||
|
android:paddingStart="0dp"
|
||||||
|
android:paddingEnd="@dimen/l1"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@={viewModel.query}"
|
||||||
|
android:textAppearance="?appearanceTextBodyNormal" />
|
||||||
|
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
dividerVertical="@{R.drawable.divider_l1}"
|
dividerVertical="@{R.drawable.divider_l1}"
|
||||||
invisibleUnless="@{viewModel.loaded || !viewModel.items.empty}"
|
invisibleUnless="@{viewModel.loaded || !viewModel.items.empty}"
|
||||||
itemBinding="@{viewModel.itemBinding}"
|
itemBinding="@{viewModel.itemBinding}"
|
||||||
items="@{viewModel.items}"
|
items="@{viewModel.items}"
|
||||||
|
nestedScrollingEnabled="@{false}"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginTop="@dimen/l1"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:paddingStart="@dimen/l1"
|
android:paddingStart="@dimen/l1"
|
||||||
android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}"
|
|
||||||
android:paddingEnd="@dimen/l1"
|
android:paddingEnd="@dimen/l1"
|
||||||
android:paddingBottom="@{viewModel.insets.bottom}"
|
|
||||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
tools:listitem="@layout/item_hide_md2"
|
tools:listitem="@layout/item_hide_md2" />
|
||||||
tools:paddingTop="40dp" />
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</androidx.core.widget.NestedScrollView>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
goneUnless="@{viewModel.loading && viewModel.items.empty}"
|
goneUnless="@{viewModel.loading && viewModel.items.empty}"
|
||||||
@ -55,6 +170,18 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
|
android:id="@+id/hide_action_scroll_up"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="bottom|end"
|
||||||
|
android:layout_marginEnd="@dimen/l1"
|
||||||
|
android:layout_marginBottom="@{viewModel.insets.bottom + (int) @dimen/l1}"
|
||||||
|
app:backgroundTint="?colorSurface"
|
||||||
|
app:srcCompat="@drawable/ic_up_md2"
|
||||||
|
app:tint="?colorOnSurface"
|
||||||
|
tools:layout_marginBottom="64dp" />
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
</layout>
|
</layout>
|
@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
|
||||||
<item
|
|
||||||
android:id="@+id/action_show_system"
|
|
||||||
android:checkable="true"
|
|
||||||
android:title="@string/show_system_app"
|
|
||||||
app:showAsAction="never" />
|
|
||||||
</menu>
|
|
@ -79,4 +79,6 @@
|
|||||||
<string name="superuser_toggle_notification">Toggles “toast” notifications</string>
|
<string name="superuser_toggle_notification">Toggles “toast” notifications</string>
|
||||||
<string name="superuser_toggle_revoke">Revoke</string>
|
<string name="superuser_toggle_revoke">Revoke</string>
|
||||||
|
|
||||||
|
<string name="hide_filter_hint">Filter by name</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in New Issue
Block a user