): ResponseBody {
- return ProgressResponseBody(this, progressState)
+suspend fun BufferedSink.writeAllCancellable(source: Source) = withContext(Dispatchers.IO) {
+ writeAll(source.cancellable())
}
diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt
index badf5ae7c..a5054b5e0 100644
--- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt
@@ -1,5 +1,7 @@
package org.koitharu.kotatsu.utils.ext
+import java.util.UUID
+
inline fun String?.ifNullOrEmpty(defaultValue: () -> String): String {
return if (this.isNullOrEmpty()) defaultValue() else this
}
@@ -11,4 +13,11 @@ fun String.longHashCode(): Long {
h = 31 * h + this[i].code
}
return h
-}
\ No newline at end of file
+}
+
+fun String.toUUIDOrNull(): UUID? = try {
+ UUID.fromString(this)
+} catch (e: IllegalArgumentException) {
+ e.printStackTraceDebug()
+ null
+}
diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/progress/PausingProgressJob.kt b/app/src/main/java/org/koitharu/kotatsu/utils/progress/PausingProgressJob.kt
index e53806080..eba6501d9 100644
--- a/app/src/main/java/org/koitharu/kotatsu/utils/progress/PausingProgressJob.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/utils/progress/PausingProgressJob.kt
@@ -3,7 +3,7 @@ package org.koitharu.kotatsu.utils.progress
import androidx.annotation.AnyThread
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.StateFlow
-import org.koitharu.kotatsu.download.ui.service.PausingHandle
+import org.koitharu.kotatsu.download.ui.worker.PausingHandle
class PausingProgressJob(
job: Job,
@@ -23,4 +23,4 @@ class PausingProgressJob
(
@AnyThread
fun resume() = pausingHandle.resume()
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/progress/TimeLeftEstimator.kt b/app/src/main/java/org/koitharu/kotatsu/utils/progress/TimeLeftEstimator.kt
index f998a5119..b454535f7 100644
--- a/app/src/main/java/org/koitharu/kotatsu/utils/progress/TimeLeftEstimator.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/utils/progress/TimeLeftEstimator.kt
@@ -42,9 +42,14 @@ class TimeLeftEstimator {
return if (eta < tooLargeTime) eta else NO_TIME
}
+ fun getEta(): Long {
+ val etl = getEstimatedTimeLeft()
+ return if (etl == NO_TIME) NO_TIME else System.currentTimeMillis() + etl
+ }
+
private class Tick(
- val value: Int,
- val total: Int,
- val time: Long,
+ @JvmField val value: Int,
+ @JvmField val total: Int,
+ @JvmField val time: Long,
)
-}
\ No newline at end of file
+}
diff --git a/app/src/main/res/drawable-anydpi-v24/ic_stat_paused.xml b/app/src/main/res/drawable-anydpi-v24/ic_stat_paused.xml
new file mode 100644
index 000000000..55d7a60db
--- /dev/null
+++ b/app/src/main/res/drawable-anydpi-v24/ic_stat_paused.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable-hdpi/ic_stat_paused.png b/app/src/main/res/drawable-hdpi/ic_stat_paused.png
new file mode 100644
index 000000000..e42a3d68c
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_stat_paused.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_stat_paused.png b/app/src/main/res/drawable-mdpi/ic_stat_paused.png
new file mode 100644
index 000000000..979fc6fc3
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_stat_paused.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_stat_paused.png b/app/src/main/res/drawable-xhdpi/ic_stat_paused.png
new file mode 100644
index 000000000..834a83c8d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_stat_paused.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_stat_paused.png b/app/src/main/res/drawable-xxhdpi/ic_stat_paused.png
new file mode 100644
index 000000000..883a124a3
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_stat_paused.png differ
diff --git a/app/src/main/res/drawable/ic_action_pause.xml b/app/src/main/res/drawable/ic_action_pause.xml
new file mode 100644
index 000000000..8e5ee878f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_action_pause.xml
@@ -0,0 +1,11 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_action_resume.xml b/app/src/main/res/drawable/ic_action_resume.xml
new file mode 100644
index 000000000..876e2efff
--- /dev/null
+++ b/app/src/main/res/drawable/ic_action_resume.xml
@@ -0,0 +1,11 @@
+
+
+
+
diff --git a/app/src/main/res/layout/activity_downloads.xml b/app/src/main/res/layout/activity_downloads.xml
index 64c63cffe..4c1397a85 100644
--- a/app/src/main/res/layout/activity_downloads.xml
+++ b/app/src/main/res/layout/activity_downloads.xml
@@ -41,15 +41,4 @@
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
tools:listitem="@layout/item_download" />
-
-
diff --git a/app/src/main/res/layout/item_download.xml b/app/src/main/res/layout/item_download.xml
index c8d6176b0..21f6b6466 100644
--- a/app/src/main/res/layout/item_download.xml
+++ b/app/src/main/res/layout/item_download.xml
@@ -3,26 +3,25 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
+ style="?materialCardViewFilledStyle"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:cardCornerRadius="16dp">
+ android:layout_height="wrap_content">
+ android:paddingBottom="12dp">
+
+
@@ -87,39 +96,47 @@
android:ellipsize="end"
android:maxLines="4"
android:textAppearance="?attr/textAppearanceBodySmall"
- app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintEnd_toStartOf="@id/textView_percent"
app:layout_constraintStart_toEndOf="@id/imageView_cover"
app:layout_constraintTop_toBottomOf="@id/textView_status"
tools:text="@tools:sample/lorem[3]" />
+
+
+ app:layout_constraintTop_toBottomOf="@id/progressBar" />
diff --git a/app/src/main/res/menu/mode_downloads.xml b/app/src/main/res/menu/mode_downloads.xml
new file mode 100644
index 000000000..107ab434b
--- /dev/null
+++ b/app/src/main/res/menu/mode_downloads.xml
@@ -0,0 +1,36 @@
+
+
diff --git a/app/src/main/res/menu/opt_downloads.xml b/app/src/main/res/menu/opt_downloads.xml
new file mode 100644
index 000000000..49ac78fe5
--- /dev/null
+++ b/app/src/main/res/menu/opt_downloads.xml
@@ -0,0 +1,30 @@
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index eafc92e1f..0148884e4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -441,4 +441,11 @@
Ignore SSL errors
Choose mirror automatically
Automatically switch domains for remote sources on errors if mirrors are available
+ Pause
+ Resume
+ Paused
+ Remove completed
+ Cancel all
+ Download only via Wi-Fi
+ Stop downloading when switching to a mobile network
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 48d1517d9..64a33ab19 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -238,6 +238,10 @@
- 16dp
+
+
diff --git a/app/src/main/res/xml/pref_content.xml b/app/src/main/res/xml/pref_content.xml
index ebe1806db..1ecc73d25 100644
--- a/app/src/main/res/xml/pref_content.xml
+++ b/app/src/main/res/xml/pref_content.xml
@@ -30,26 +30,6 @@
app:useSimpleSummaryProvider="true"
tools:isPreferenceVisible="true" />
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/pref_root.xml b/app/src/main/res/xml/pref_root.xml
index 4d3d12ff6..5d3298421 100644
--- a/app/src/main/res/xml/pref_root.xml
+++ b/app/src/main/res/xml/pref_root.xml
@@ -34,6 +34,11 @@
android:icon="@drawable/ic_feed"
android:title="@string/check_for_new_chapters" />
+
+