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