Update blacklist UI

Update new functionality/streamline the blacklist UI.
This commit is contained in:
OxygenCobalt 2021-03-13 19:47:00 -07:00
parent aa0c978a65
commit 632e39f2e2
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
5 changed files with 68 additions and 45 deletions

View file

@ -13,6 +13,7 @@ import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentLoadingBinding
import org.oxycblt.auxio.logD
import org.oxycblt.auxio.music.MusicStore
/**
@ -72,6 +73,8 @@ class LoadingFragment : Fragment() {
loadingModel.load(requireContext())
}
logD("Fragment created")
return binding.root
}

View file

@ -5,12 +5,16 @@ import android.os.Environment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.children
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.RecyclerView
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.WhichButton
import com.afollestad.materialdialogs.actions.setActionButtonEnabled
import com.afollestad.materialdialogs.customview.getCustomView
import com.afollestad.materialdialogs.files.folderChooser
import com.afollestad.materialdialogs.files.selectedFolder
import com.afollestad.materialdialogs.internal.list.DialogRecyclerView
import com.afollestad.materialdialogs.utils.invalidateDividers
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentBlacklistBinding
@ -37,41 +41,59 @@ class BlacklistDialog : BottomSheetDialogFragment() {
binding.blacklistRecycler.adapter = adapter
binding.blacklistAdd.setOnClickListener {
MaterialDialog(requireActivity()).show {
positiveButton(R.string.label_add) {
onFolderSelected()
}
showFileDialog()
}
negativeButton()
folderChooser(
requireContext(),
initialDirectory = File(Environment.getExternalStorageDirectory().absolutePath),
waitForPositiveButton = false,
emptyTextRes = R.string.error_no_dirs
)
// Still need to force-reenable the positive button even after flagging the
// disabling as false when setting up the file chooser
// Gotta love third-party libraries
setActionButtonEnabled(WhichButton.POSITIVE, true)
}
binding.blacklistCancel.setOnClickListener {
dismiss()
}
// --- VIEWMODEL SETUP ---
blacklistModel.paths.observe(viewLifecycleOwner) { paths ->
adapter.submitList(paths)
binding.blacklistEmptyText.isVisible = paths.isEmpty()
}
return binding.root
}
private fun showFileDialog() {
MaterialDialog(requireActivity()).show {
positiveButton(R.string.label_add) {
onFolderSelected()
}
negativeButton()
folderChooser(
requireContext(),
initialDirectory = File(Environment.getExternalStorageDirectory().absolutePath),
waitForPositiveButton = false,
emptyTextRes = R.string.error_no_dirs
)
// Once again remove the ugly dividers from the dialog, but now with an even
// worse solution.
invalidateDividers(showTop = false, showBottom = false)
val recycler = (getCustomView() as ViewGroup)
.children.filterIsInstance<DialogRecyclerView>().firstOrNull()
recycler?.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
invalidateDividers(showTop = false, showBottom = false)
}
})
}
}
private fun MaterialDialog.onFolderSelected() {
selectedFolder()?.absolutePath?.let { path ->
// Due to how Auxio's navigation flow works, dont allow the main root directory
// to be excluded, as that would lead to the user being stuck at the "No Music Found"
// error.
// screen.
if (path == Environment.getExternalStorageDirectory().absolutePath) {
getString(R.string.error_folder_would_brick_app)
.createToast(requireContext())

View file

@ -8,6 +8,9 @@ class BlacklistViewModel : ViewModel() {
private val mPaths = MutableLiveData(mutableListOf<String>())
val paths: LiveData<MutableList<String>> get() = mPaths
var modified = false
private set
fun addPath(path: String) {
if (mPaths.value!!.contains(path)) {
return

View file

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="30dp"
android:height="30dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</vector>

View file

@ -28,33 +28,30 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
tools:itemCount="2"
tools:itemCount="1"
tools:listitem="@layout/item_blacklist_entry"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintTop_toBottomOf="@+id/blacklist_header" />
<TextView
android:id="@+id/blacklist_add"
style="@style/ItemText.Primary"
android:padding="@dimen/margin_medium"
android:id="@+id/blacklist_empty_text"
android:layout_width="match_parent"
android:layout_marginStart="0dp"
android:text="@string/label_add"
android:gravity="center_vertical|start"
android:background="@drawable/ui_ripple"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
app:drawableStartCompat="@drawable/ic_add"
android:drawablePadding="@dimen/padding_medium"
android:layout_height="wrap_content"
android:fontFamily="@font/inter_semibold"
android:textAlignment="center"
android:padding="16dp"
android:text="@string/label_empty_blacklist"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintTop_toBottomOf="@+id/blacklist_recycler" />
<Button
android:id="@+id/blacklist_cancel"
style="@style/Widget.Button.Dialog"
android:layout_marginEnd="@dimen/padding_small"
android:layout_marginTop="@dimen/margin_medium"
android:text="@android:string/cancel"
app:layout_constraintEnd_toStartOf="@+id/blacklist_confirm"
app:layout_constraintTop_toBottomOf="@+id/blacklist_add" />
app:layout_constraintTop_toTopOf="@+id/blacklist_add" />
<Button
android:id="@+id/blacklist_confirm"
@ -65,6 +62,15 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/blacklist_cancel" />
<Button
android:id="@+id/blacklist_add"
style="@style/Widget.Button.Dialog"
android:layout_marginTop="@dimen/margin_medium"
android:layout_marginStart="@dimen/margin_medium"
android:text="@string/label_add"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/blacklist_empty_text" />
</androidx.constraintlayout.widget.ConstraintLayout>