From c704940462d31626b88abcf088072abbc1ac5f54 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Wed, 11 Jan 2023 21:13:41 +0800 Subject: [PATCH] Support drag reordering for downloads Resolve #54 --- .../main/java/com/hippo/ehviewer/EhDB.java | 24 +++++++++++ .../com/hippo/ehviewer/dao/DownloadsDao.kt | 6 +++ .../hippo/ehviewer/ui/scene/DownloadsScene.kt | 41 ++++++++++++++++++- 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/EhDB.java b/app/src/main/java/com/hippo/ehviewer/EhDB.java index 442fb2dac..08525145a 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhDB.java +++ b/app/src/main/java/com/hippo/ehviewer/EhDB.java @@ -111,6 +111,30 @@ public class EhDB { return list; } + public static synchronized void moveDownloadInfo(int fromPosition, int toPosition) { + if (fromPosition == toPosition) { + return; + } + + boolean reverse = fromPosition > toPosition; + int offset = reverse ? toPosition : fromPosition; + int limit = reverse ? fromPosition - toPosition + 1 : toPosition - fromPosition + 1; + + DownloadsDao dao = db.downloadsDao(); + List list = dao.list(offset, limit); + + int step = reverse ? 1 : -1; + int start = reverse ? limit - 1 : 0; + int end = reverse ? 0 : limit - 1; + long toTime = list.get(end).time; + for (int i = end; reverse ? i < start : i > start; i += step) { + list.get(i).time = list.get(i + step).time; + } + list.get(start).time = toTime; + + dao.update(list); + } + // Insert or update public static synchronized void putDownloadInfo(DownloadInfo downloadInfo) { DownloadsDao dao = db.downloadsDao(); diff --git a/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.kt b/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.kt index 55d4102d1..23a0aae92 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/DownloadsDao.kt @@ -11,9 +11,15 @@ interface DownloadsDao : BasicDao { @Query("SELECT * FROM DOWNLOADS ORDER BY TIME DESC") override fun list(): List + @Query("SELECT * FROM DOWNLOADS ORDER BY TIME DESC LIMIT :limit OFFSET :offset") + fun list(offset: Int, limit: Int): List + @Query("SELECT * FROM DOWNLOADS WHERE GID = :gid") fun load(gid: Long): DownloadInfo? + @Update + fun update(downloadInfos: List) + @Update fun update(downloadInfo: DownloadInfo) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt index 4eed33299..d471a0123 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt @@ -286,6 +286,8 @@ class DownloadsScene : BaseToolbarScene(), DownloadInfoListener, OnClickFabListe mRecyclerView!!.scrollToPosition(mInitPosition) mInitPosition = -1 } + val itemTouchHelper = ItemTouchHelper(DownloadItemTouchHelperCallback()) + itemTouchHelper.attachToRecyclerView(mRecyclerView) mFastScroller!!.attachToRecyclerView(mRecyclerView) val handlerDrawable = HandlerDrawable() handlerDrawable.setColor(theme.resolveColor(com.google.android.material.R.attr.colorPrimary)) @@ -1149,7 +1151,6 @@ class DownloadsScene : BaseToolbarScene(), DownloadInfoListener, OnClickFabListe ) } - @SuppressLint("NotifyDataSetChanged") override fun onMove( recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, @@ -1164,7 +1165,7 @@ class DownloadsScene : BaseToolbarScene(), DownloadInfoListener, OnClickFabListe downloadManager.moveLabel(fromPosition - 1, toPosition - 1) val item = mLabels.removeAt(fromPosition) mLabels.add(toPosition, item) - mLabelAdapter!!.notifyDataSetChanged() + mLabelAdapter!!.notifyItemMoved(fromPosition, toPosition) return true } @@ -1192,6 +1193,42 @@ class DownloadsScene : BaseToolbarScene(), DownloadInfoListener, OnClickFabListe } } + private inner class DownloadItemTouchHelperCallback : ItemTouchHelper.Callback() { + override fun getMovementFlags( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder + ): Int { + return makeMovementFlags( + ItemTouchHelper.UP or ItemTouchHelper.DOWN, + 0 + ) + } + + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean { + val fromPosition = viewHolder.bindingAdapterPosition + val toPosition = target.bindingAdapterPosition + if (fromPosition == toPosition) { + return false + } + lifecycleScope.launchIO { + EhDB.moveDownloadInfo(fromPosition, toPosition) + val item = mList!!.removeAt(fromPosition) + mList!!.add(toPosition, item) + withUIContext { + mAdapter!!.notifyItemMoved(fromPosition, toPosition) + } + } + return true + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + } + } + companion object { const val KEY_GID = "gid" const val KEY_ACTION = "action"