ariane/app/src/main/java/oppen/ariane/ui/bookmarks/BookmarksDialog.kt

138 lines
4.7 KiB
Kotlin

package oppen.ariane.ui.bookmarks
import android.content.Context
import android.os.Handler
import android.os.Looper
import android.view.View
import androidx.appcompat.app.AppCompatDialog
import androidx.appcompat.widget.PopupMenu
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.dialog_bookmarks.view.*
import oppen.ariane.R
import oppen.ariane.io.database.bookmarks.BookmarkEntry
import oppen.ariane.io.database.bookmarks.BookmarksDatasource
import oppen.visible
class BookmarksDialog(
context: Context,
private val bookmarkDatasource: BookmarksDatasource,
onBookmark: (bookmarkEntry: BookmarkEntry) -> Unit): AppCompatDialog(context, R.style.FSDialog) {
var bookmarksAdapter: BookmarksAdapter
var view: View = View.inflate(context, R.layout.dialog_bookmarks, null)
init {
setContentView(view)
view.bookmarks_toolbar.setNavigationIcon(R.drawable.vector_close)
view.bookmarks_toolbar.setNavigationOnClickListener {
dismiss()
}
//None as yet
view.bookmarks_toolbar.inflateMenu(R.menu.add_bookmarks)
view.bookmarks_toolbar.setOnMenuItemClickListener {_ ->
true
}
view.bookmarks_recycler.layoutManager = LinearLayoutManager(context)
bookmarksAdapter = BookmarksAdapter({ bookmark ->
//onBookmark
onBookmark(bookmark)
dismiss()
}){ view, bookmark, isFirst, isLast ->
//onOverflow
val bookmarkOverflow = PopupMenu(context, view)
bookmarkOverflow.inflate(R.menu.menu_bookmark)
if(isFirst) bookmarkOverflow.menu.removeItem(R.id.menu_bookmark_move_up)
if(isLast) bookmarkOverflow.menu.removeItem(R.id.menu_bookmark_move_down)
bookmarkOverflow.setOnMenuItemClickListener { menuItem ->
when(menuItem.itemId){
R.id.menu_bookmark_edit -> edit(bookmark)
R.id.menu_bookmark_delete -> delete(bookmark)
R.id.menu_bookmark_move_up -> moveUp(bookmark)
R.id.menu_bookmark_move_down-> moveDown(bookmark)
}
true
}
bookmarkOverflow.show()
}
view.bookmarks_recycler.adapter = bookmarksAdapter
bookmarkDatasource.get { bookmarks ->
Handler(Looper.getMainLooper()).post {
when {
bookmarks.isEmpty() -> view.bookmarks_empty_layout.visible(true)
else -> bookmarksAdapter.update(bookmarks)
}
}
}
}
private fun edit(bookmarkEntry: BookmarkEntry){
BookmarkDialog(context, BookmarkDialog.mode_edit, null, bookmarkEntry.uri.toString(), bookmarkEntry.label){ label, uri ->
bookmarkDatasource.update(bookmarkEntry, label, uri){
bookmarkDatasource.get {bookmarks ->
Handler(Looper.getMainLooper()).post {
bookmarksAdapter.update(bookmarks)
}
}
}
}.show()
}
/**
*
* Bookmark isn't actually deleted from the DB until the Snackbar disappears. Which is nice.
*
*/
private fun delete(bookmarkEntry: BookmarkEntry){
//OnDelete
bookmarksAdapter.hide(bookmarkEntry)
Snackbar.make(view, "Deleted ${bookmarkEntry.label}", Snackbar.LENGTH_SHORT).addCallback(object: Snackbar.Callback() {
override fun onDismissed(transientBottomBar: Snackbar?, event: Int) = when (event) {
BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_ACTION -> bookmarksAdapter.show(bookmarkEntry)
else -> bookmarkDatasource.delete(bookmarkEntry){
Handler(Looper.getMainLooper()).post {
bookmarksAdapter.remove(bookmarkEntry)
}
}
}
}).setAction("Undo"){
//Action listener unused
}.show()
}
private fun moveUp(bookmarkEntry: BookmarkEntry){
bookmarkDatasource.moveUp(bookmarkEntry){
bookmarkDatasource.get { bookmarks ->
Handler(Looper.getMainLooper()).post {
bookmarksAdapter.update(bookmarks)
}
}
}
}
private fun moveDown(bookmarkEntry: BookmarkEntry){
bookmarkDatasource.moveDown(bookmarkEntry){
bookmarkDatasource.get { bookmarks ->
Handler(Looper.getMainLooper()).post {
bookmarksAdapter.update(bookmarks)
}
}
}
}
}