Update blacklist UI
Update new functionality/streamline the blacklist UI.
This commit is contained in:
parent
aa0c978a65
commit
632e39f2e2
5 changed files with 68 additions and 45 deletions
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
||||
|
|
Loading…
Reference in a new issue