[DO NOT USE] Refine drag and drop reordering, part 3/3
This commit is contained in:
1 parent
3599ffb805
commit
5c33ca1c9a
7 files changed
+535
-75
No files matched your search
@@ -61,7 +61,15 @@ object EhDB {
|
||||
}
|
||||
|
||||
suspend fun removeDownloadInfo(downloadInfo: DownloadInfo) {
|
||||
db.downloadsDao().delete(downloadInfo)
|
||||
val dao = db.downloadsDao()
|
||||
dao.delete(downloadInfo)
|
||||
dao.fill(downloadInfo.position)
|
||||
}
|
||||
|
||||
suspend fun removeDownloadInfo(downloadInfo: List<DownloadInfo>) {
|
||||
val dao = db.downloadsDao()
|
||||
dao.delete(downloadInfo)
|
||||
dao.fill(downloadInfo.first().position, downloadInfo.size)
|
||||
}
|
||||
|
||||
suspend fun getDownloadDirname(gid: Long): String? {
|
||||
|
||||
@@ -31,6 +31,12 @@ class DownloadLabelMigration : AutoMigrationSpec {
|
||||
}
|
||||
}
|
||||
|
||||
class DownloadMigration : AutoMigrationSpec {
|
||||
override fun onPostMigrate(db: SupportSQLiteDatabase) {
|
||||
db.execSQL("UPDATE DOWNLOADS SET POSITION = (SELECT COUNT(*) FROM DOWNLOADS T WHERE T.TIME < DOWNLOADS.TIME)")
|
||||
}
|
||||
}
|
||||
|
||||
class ThumbKeyMigration : AutoMigrationSpec {
|
||||
override fun onPostMigrate(db: SupportSQLiteDatabase) {
|
||||
val needMigrationTables = arrayOf(
|
||||
@@ -53,7 +59,7 @@ class ThumbKeyMigration : AutoMigrationSpec {
|
||||
|
||||
@Database(
|
||||
entities = [DownloadInfo::class, DownloadLabel::class, DownloadDirname::class, Filter::class, HistoryInfo::class, LocalFavoriteInfo::class, QuickSearch::class],
|
||||
version = 12,
|
||||
version = 13,
|
||||
exportSchema = true,
|
||||
autoMigrations = [
|
||||
AutoMigration(
|
||||
@@ -93,6 +99,11 @@ class ThumbKeyMigration : AutoMigrationSpec {
|
||||
to = 12,
|
||||
spec = DownloadLabelMigration::class,
|
||||
),
|
||||
AutoMigration(
|
||||
from = 12,
|
||||
to = 13,
|
||||
spec = DownloadMigration::class,
|
||||
),
|
||||
],
|
||||
)
|
||||
@TypeConverters(FilterModeConverter::class)
|
||||
|
||||
@@ -20,6 +20,9 @@ class DownloadInfo() : BaseGalleryInfo() {
|
||||
@ColumnInfo(name = "LABEL")
|
||||
var label: String? = null
|
||||
|
||||
@ColumnInfo(name = "POSITION", defaultValue = "0")
|
||||
var position: Int = 0
|
||||
|
||||
@Ignore
|
||||
var speed: Long = 0
|
||||
|
||||
|
||||
@@ -8,15 +8,18 @@ import androidx.room.Update
|
||||
|
||||
@Dao
|
||||
interface DownloadsDao {
|
||||
@Query("SELECT * FROM DOWNLOADS ORDER BY TIME DESC")
|
||||
@Query("SELECT * FROM DOWNLOADS ORDER BY POSITION DESC")
|
||||
suspend fun list(): List<DownloadInfo>
|
||||
|
||||
@Query("SELECT * FROM DOWNLOADS ORDER BY TIME DESC LIMIT :limit OFFSET :offset")
|
||||
@Query("SELECT * FROM DOWNLOADS ORDER BY POSITION DESC LIMIT :limit OFFSET :offset")
|
||||
suspend fun list(offset: Int, limit: Int): List<DownloadInfo>
|
||||
|
||||
@Query("SELECT * FROM DOWNLOADS WHERE GID = :gid")
|
||||
suspend fun load(gid: Long): DownloadInfo?
|
||||
|
||||
@Query("UPDATE DOWNLOADS SET POSITION = POSITION - :offset WHERE POSITION > :position")
|
||||
suspend fun fill(position: Int, offset: Int = 1)
|
||||
|
||||
@Update
|
||||
suspend fun update(downloadInfo: List<DownloadInfo>)
|
||||
|
||||
@@ -28,4 +31,7 @@ interface DownloadsDao {
|
||||
|
||||
@Delete
|
||||
suspend fun delete(downloadInfo: DownloadInfo)
|
||||
|
||||
@Delete
|
||||
suspend fun delete(downloadInfo: List<DownloadInfo>)
|
||||
}
|
||||
@@ -207,6 +207,7 @@ object DownloadManager : OnSpiderListener {
|
||||
info.label = label
|
||||
info.state = DownloadInfo.STATE_WAIT
|
||||
info.time = System.currentTimeMillis()
|
||||
info.position = allInfoList.size
|
||||
|
||||
// Add to label download list
|
||||
val list = getInfoListForLabel(info.label)
|
||||
@@ -326,33 +327,21 @@ object DownloadManager : OnSpiderListener {
|
||||
}
|
||||
|
||||
suspend fun addDownload(downloadInfoList: List<DownloadInfo>, notify: Boolean = true) {
|
||||
for (info in downloadInfoList) {
|
||||
if (containDownloadInfo(info.gid)) {
|
||||
// Contain
|
||||
return
|
||||
}
|
||||
|
||||
downloadInfoList.filterNot { containDownloadInfo(it.gid) }.forEach { info ->
|
||||
// Ensure download state
|
||||
if (DownloadInfo.STATE_WAIT == info.state ||
|
||||
DownloadInfo.STATE_DOWNLOAD == info.state
|
||||
) {
|
||||
info.state = DownloadInfo.STATE_NONE
|
||||
}
|
||||
info.position = allInfoList.size
|
||||
|
||||
// Add to label download list
|
||||
var list = getInfoListForLabel(info.label)
|
||||
if (null == list) {
|
||||
// Can't find the label in label list
|
||||
list = LinkedList()
|
||||
map[info.label] = list
|
||||
if (!containLabel(info.label)) {
|
||||
// Add label to DB and list
|
||||
labelList.add(EhDB.addDownloadLabel(DownloadLabel(info.label!!, position = labelList.size)))
|
||||
}
|
||||
}
|
||||
val list = getInfoListForLabel(info.label)
|
||||
?: addLabel(info.label).let { getInfoListForLabel(info.label)!! }
|
||||
list.add(info)
|
||||
// Sort
|
||||
list.sortByDateDescending()
|
||||
list.sortByPositionDescending()
|
||||
|
||||
// Add to all download list and map
|
||||
allInfoList.add(info)
|
||||
@@ -363,7 +352,7 @@ object DownloadManager : OnSpiderListener {
|
||||
}
|
||||
|
||||
// Sort all download list
|
||||
allInfoList.sortByDateDescending()
|
||||
allInfoList.sortByPositionDescending()
|
||||
|
||||
// Notify
|
||||
if (notify) {
|
||||
@@ -393,6 +382,7 @@ object DownloadManager : OnSpiderListener {
|
||||
info.label = label
|
||||
info.state = DownloadInfo.STATE_NONE
|
||||
info.time = System.currentTimeMillis()
|
||||
info.position = allInfoList.size
|
||||
|
||||
// Add to label download list
|
||||
val list = getInfoListForLabel(info.label)
|
||||
@@ -508,25 +498,11 @@ object DownloadManager : OnSpiderListener {
|
||||
|
||||
suspend fun deleteRangeDownload(gidList: LongList) {
|
||||
stopRangeDownloadInternal(gidList)
|
||||
for (i in 0 until gidList.size) {
|
||||
val gid = gidList[i]
|
||||
val info = mAllInfoMap[gid]
|
||||
if (null == info) {
|
||||
Log.d(TAG, "Can't get download info with gid: $gid")
|
||||
continue
|
||||
}
|
||||
|
||||
// Remove from DB
|
||||
EhDB.removeDownloadInfo(info)
|
||||
|
||||
// Remove from all info map
|
||||
allInfoList.remove(info)
|
||||
mAllInfoMap.remove(info.gid)
|
||||
|
||||
// Remove from label list
|
||||
val list = getInfoListForLabel(info.label)
|
||||
list?.remove(info)
|
||||
val list = gidList.mapNotNull { gid ->
|
||||
mAllInfoMap.remove(gid)?.also { getInfoListForLabel(it.label)?.remove(it) }
|
||||
}
|
||||
EhDB.removeDownloadInfo(list)
|
||||
allInfoList.removeAll(list.toSet())
|
||||
|
||||
// Update listener
|
||||
for (l in mDownloadInfoListeners) {
|
||||
@@ -537,36 +513,24 @@ object DownloadManager : OnSpiderListener {
|
||||
ensureDownload()
|
||||
}
|
||||
|
||||
suspend fun moveDownload(fromPosition: Int, toPosition: Int) {
|
||||
if (fromPosition > toPosition) {
|
||||
val time = allInfoList[toPosition].time
|
||||
for (i in toPosition until fromPosition) {
|
||||
allInfoList[i].time = allInfoList[i + 1].time
|
||||
}
|
||||
allInfoList[fromPosition].time = time
|
||||
EhDB.updateDownloadInfo(allInfoList.slice(toPosition..fromPosition))
|
||||
} else {
|
||||
val time = allInfoList[fromPosition].time
|
||||
for (i in fromPosition until toPosition) {
|
||||
allInfoList[i].time = allInfoList[i + 1].time
|
||||
}
|
||||
allInfoList[toPosition].time = time
|
||||
EhDB.updateDownloadInfo(allInfoList.slice(fromPosition..toPosition))
|
||||
}
|
||||
fun moveDownload(fromPosition: Int, toPosition: Int): List<DownloadInfo> {
|
||||
val info = allInfoList.removeAt(fromPosition)
|
||||
allInfoList.add(toPosition, info)
|
||||
val range = if (fromPosition < toPosition) fromPosition..toPosition else toPosition..fromPosition
|
||||
val list = allInfoList.slice(range)
|
||||
val limit = allInfoList.size - 1
|
||||
list.zip(range).forEach { it.first.position = limit - it.second }
|
||||
val label = allInfoList[fromPosition].label
|
||||
allInfoList.sortByDateDescending()
|
||||
val list = getInfoListForLabel(label)!!
|
||||
list.sortByDateDescending()
|
||||
getInfoListForLabel(label)!!.sortByPositionDescending()
|
||||
return list
|
||||
}
|
||||
|
||||
suspend fun moveDownload(label: String?, fromPosition: Int, toPosition: Int) {
|
||||
val list = getInfoListForLabel(label)
|
||||
list?.let {
|
||||
fun moveDownload(label: String?, fromPosition: Int, toPosition: Int) =
|
||||
getInfoListForLabel(label)!!.let {
|
||||
val absFromPosition = allInfoList.indexOf(it[fromPosition])
|
||||
val absToPosition = allInfoList.indexOf(it[toPosition])
|
||||
moveDownload(absFromPosition, absToPosition)
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun resetAllReadingProgress() = coroutineScope {
|
||||
mAllInfoMap.keys.forEach { gid ->
|
||||
@@ -699,7 +663,7 @@ object DownloadManager : OnSpiderListener {
|
||||
srcList.remove(info)
|
||||
dstList.add(info)
|
||||
info.label = label
|
||||
dstList.sortByDateDescending()
|
||||
dstList.sortByPositionDescending()
|
||||
|
||||
// Save to DB
|
||||
EhDB.putDownloadInfo(info)
|
||||
@@ -780,7 +744,7 @@ object DownloadManager : OnSpiderListener {
|
||||
}
|
||||
|
||||
// Sort
|
||||
defaultInfoList.sortByDateDescending()
|
||||
defaultInfoList.sortByPositionDescending()
|
||||
}
|
||||
|
||||
val isIdle: Boolean
|
||||
@@ -1199,8 +1163,8 @@ object DownloadManager : OnSpiderListener {
|
||||
private const val TYPE_ON_PAGE_FAILURE = 4
|
||||
private const val TYPE_ON_FINISH = 5
|
||||
|
||||
private fun MutableList<DownloadInfo>.sortByDateDescending() {
|
||||
sortByDescending { it.time }
|
||||
private fun MutableList<DownloadInfo>.sortByPositionDescending() {
|
||||
sortByDescending { it.position }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -322,15 +322,14 @@ class DownloadsScene :
|
||||
if (fromPosition == toPosition) {
|
||||
return false
|
||||
}
|
||||
val list = when (mLabel) {
|
||||
null -> DownloadManager.moveDownload(fromPosition, toPosition)
|
||||
getString(R.string.default_download_label_name) -> DownloadManager.moveDownload(null, fromPosition, toPosition)
|
||||
else -> DownloadManager.moveDownload(mLabel, fromPosition, toPosition)
|
||||
}
|
||||
mAdapter!!.notifyItemMoved(fromPosition, toPosition)
|
||||
lifecycleScope.launchIO {
|
||||
when (mLabel) {
|
||||
null -> DownloadManager.moveDownload(fromPosition, toPosition)
|
||||
getString(R.string.default_download_label_name) -> DownloadManager.moveDownload(null, fromPosition, toPosition)
|
||||
else -> DownloadManager.moveDownload(mLabel, fromPosition, toPosition)
|
||||
}
|
||||
withUIContext {
|
||||
mAdapter!!.notifyItemMoved(fromPosition, toPosition)
|
||||
}
|
||||
EhDB.updateDownloadInfo(list)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user