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 androidx.navigation.fragment.findNavController
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.databinding.FragmentLoadingBinding
|
import org.oxycblt.auxio.databinding.FragmentLoadingBinding
|
||||||
|
import org.oxycblt.auxio.logD
|
||||||
import org.oxycblt.auxio.music.MusicStore
|
import org.oxycblt.auxio.music.MusicStore
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -72,6 +73,8 @@ class LoadingFragment : Fragment() {
|
||||||
loadingModel.load(requireContext())
|
loadingModel.load(requireContext())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logD("Fragment created")
|
||||||
|
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,12 +5,16 @@ import android.os.Environment
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.view.children
|
||||||
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
import com.afollestad.materialdialogs.WhichButton
|
import com.afollestad.materialdialogs.customview.getCustomView
|
||||||
import com.afollestad.materialdialogs.actions.setActionButtonEnabled
|
|
||||||
import com.afollestad.materialdialogs.files.folderChooser
|
import com.afollestad.materialdialogs.files.folderChooser
|
||||||
import com.afollestad.materialdialogs.files.selectedFolder
|
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 com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.databinding.FragmentBlacklistBinding
|
import org.oxycblt.auxio.databinding.FragmentBlacklistBinding
|
||||||
|
@ -37,41 +41,59 @@ class BlacklistDialog : BottomSheetDialogFragment() {
|
||||||
|
|
||||||
binding.blacklistRecycler.adapter = adapter
|
binding.blacklistRecycler.adapter = adapter
|
||||||
binding.blacklistAdd.setOnClickListener {
|
binding.blacklistAdd.setOnClickListener {
|
||||||
MaterialDialog(requireActivity()).show {
|
showFileDialog()
|
||||||
positiveButton(R.string.label_add) {
|
}
|
||||||
onFolderSelected()
|
|
||||||
}
|
|
||||||
|
|
||||||
negativeButton()
|
binding.blacklistCancel.setOnClickListener {
|
||||||
|
dismiss()
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- VIEWMODEL SETUP ---
|
// --- VIEWMODEL SETUP ---
|
||||||
|
|
||||||
blacklistModel.paths.observe(viewLifecycleOwner) { paths ->
|
blacklistModel.paths.observe(viewLifecycleOwner) { paths ->
|
||||||
adapter.submitList(paths)
|
adapter.submitList(paths)
|
||||||
|
|
||||||
|
binding.blacklistEmptyText.isVisible = paths.isEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
return binding.root
|
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() {
|
private fun MaterialDialog.onFolderSelected() {
|
||||||
selectedFolder()?.absolutePath?.let { path ->
|
selectedFolder()?.absolutePath?.let { path ->
|
||||||
// Due to how Auxio's navigation flow works, dont allow the main root directory
|
// 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"
|
// to be excluded, as that would lead to the user being stuck at the "No Music Found"
|
||||||
// error.
|
// screen.
|
||||||
if (path == Environment.getExternalStorageDirectory().absolutePath) {
|
if (path == Environment.getExternalStorageDirectory().absolutePath) {
|
||||||
getString(R.string.error_folder_would_brick_app)
|
getString(R.string.error_folder_would_brick_app)
|
||||||
.createToast(requireContext())
|
.createToast(requireContext())
|
||||||
|
|
|
@ -8,6 +8,9 @@ class BlacklistViewModel : ViewModel() {
|
||||||
private val mPaths = MutableLiveData(mutableListOf<String>())
|
private val mPaths = MutableLiveData(mutableListOf<String>())
|
||||||
val paths: LiveData<MutableList<String>> get() = mPaths
|
val paths: LiveData<MutableList<String>> get() = mPaths
|
||||||
|
|
||||||
|
var modified = false
|
||||||
|
private set
|
||||||
|
|
||||||
fun addPath(path: String) {
|
fun addPath(path: String) {
|
||||||
if (mPaths.value!!.contains(path)) {
|
if (mPaths.value!!.contains(path)) {
|
||||||
return
|
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_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:overScrollMode="never"
|
android:overScrollMode="never"
|
||||||
tools:itemCount="2"
|
tools:itemCount="1"
|
||||||
tools:listitem="@layout/item_blacklist_entry"
|
tools:listitem="@layout/item_blacklist_entry"
|
||||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/blacklist_header" />
|
app:layout_constraintTop_toBottomOf="@+id/blacklist_header" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/blacklist_add"
|
android:id="@+id/blacklist_empty_text"
|
||||||
style="@style/ItemText.Primary"
|
|
||||||
android:padding="@dimen/margin_medium"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_marginStart="0dp"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/label_add"
|
android:fontFamily="@font/inter_semibold"
|
||||||
android:gravity="center_vertical|start"
|
android:textAlignment="center"
|
||||||
android:background="@drawable/ui_ripple"
|
android:padding="16dp"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
|
android:text="@string/label_empty_blacklist"
|
||||||
app:drawableStartCompat="@drawable/ic_add"
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
android:drawablePadding="@dimen/padding_medium"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/blacklist_recycler" />
|
app:layout_constraintTop_toBottomOf="@+id/blacklist_recycler" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/blacklist_cancel"
|
android:id="@+id/blacklist_cancel"
|
||||||
style="@style/Widget.Button.Dialog"
|
style="@style/Widget.Button.Dialog"
|
||||||
android:layout_marginEnd="@dimen/padding_small"
|
android:layout_marginEnd="@dimen/padding_small"
|
||||||
android:layout_marginTop="@dimen/margin_medium"
|
|
||||||
android:text="@android:string/cancel"
|
android:text="@android:string/cancel"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/blacklist_confirm"
|
app:layout_constraintEnd_toStartOf="@+id/blacklist_confirm"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/blacklist_add" />
|
app:layout_constraintTop_toTopOf="@+id/blacklist_add" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/blacklist_confirm"
|
android:id="@+id/blacklist_confirm"
|
||||||
|
@ -65,6 +62,15 @@
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@+id/blacklist_cancel" />
|
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>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue