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 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
} }

View file

@ -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())

View file

@ -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

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_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>