Support drag reordering for downloads

Resolve #54
This commit is contained in:
FooIbar authored and tarsin committed 2023-01-11 21:31:18 +08:00
1 parent 6a7cd1b89a
commit c704940462
3 files changed
+69 -2

No files matched your search

@@ -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<DownloadInfo> 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();
@@ -11,9 +11,15 @@ interface DownloadsDao : BasicDao<DownloadInfo> {
@Query("SELECT * FROM DOWNLOADS ORDER BY TIME DESC")
override fun list(): List<DownloadInfo>
@Query("SELECT * FROM DOWNLOADS ORDER BY TIME DESC LIMIT :limit OFFSET :offset")
fun list(offset: Int, limit: Int): List<DownloadInfo>
@Query("SELECT * FROM DOWNLOADS WHERE GID = :gid")
fun load(gid: Long): DownloadInfo?
@Update
fun update(downloadInfos: List<DownloadInfo>)
@Update
fun update(downloadInfo: DownloadInfo)
@@ -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"