Skip to content

Commit 50f1efc

Browse files
committed
feat: 基础的下载功能
1 parent 33c7272 commit 50f1efc

16 files changed

Lines changed: 388 additions & 104 deletions

app/src/main/AndroidManifest.xml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools">
34

45
<uses-permission android:name="android.permission.INTERNET" />
56
<application
@@ -22,6 +23,16 @@
2223
<category android:name="android.intent.category.LAUNCHER" />
2324
</intent-filter>
2425
</activity>
26+
<provider
27+
android:name="androidx.startup.InitializationProvider"
28+
android:authorities="${applicationId}.androidx-startup"
29+
android:exported="false"
30+
tools:node="merge">
31+
<meta-data
32+
android:name="androidx.work.WorkManagerInitializer"
33+
android:value="androidx.startup"
34+
tools:node="remove" />
35+
</provider>
2536
</application>
2637

2738
</manifest>

app/src/main/java/com/par9uet/jm/App.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.fillMaxSize
55
import androidx.compose.foundation.layout.imePadding
66
import androidx.compose.foundation.layout.navigationBarsPadding
77
import androidx.compose.foundation.layout.padding
8+
import androidx.compose.material3.SnackbarDuration
89
import androidx.compose.material3.SnackbarHost
910
import androidx.compose.material3.SnackbarHostState
1011
import androidx.compose.runtime.Composable
@@ -30,17 +31,25 @@ fun App(
3031
val snackbarHostState = remember { SnackbarHostState() }
3132
LaunchedEffect(Unit) {
3233
toastManager.message.collect { text ->
33-
snackbarHostState.showSnackbar(message = text, actionLabel = "关闭")
34+
snackbarHostState.showSnackbar(
35+
message = text,
36+
actionLabel = null,
37+
withDismissAction = true,
38+
duration = SnackbarDuration.Short
39+
)
3440
}
3541
}
42+
LaunchedEffect(Unit) {
43+
toastManager.showAsync("test")
44+
}
3645
Box(modifier = Modifier.fillMaxSize()) {
3746
AppScreen()
3847
SnackbarHost(
3948
hostState = snackbarHostState,
4049
modifier = Modifier
4150
.align(Alignment.BottomCenter)
4251
.navigationBarsPadding() // 自动避开系统导航栏
43-
.padding(bottom = 80.dp) // 在导航栏之上再留出 16dp
52+
.padding(bottom = 80.dp)
4453
.imePadding()
4554
)
4655
}

app/src/main/java/com/par9uet/jm/MainActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import com.par9uet.jm.di.retrofitModule
1515
import com.par9uet.jm.di.userModule
1616
import com.par9uet.jm.ui.theme.AppTheme
1717
import org.koin.android.ext.koin.androidContext
18+
import org.koin.androidx.workmanager.koin.workManagerFactory
1819
import org.koin.core.context.startKoin
1920

2021
val moduleList = listOf(
@@ -32,6 +33,7 @@ class MainActivity : ComponentActivity() {
3233

3334
startKoin {
3435
androidContext(this@MainActivity)
36+
workManagerFactory()
3537
modules(moduleList)
3638
}
3739

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
11
package com.par9uet.jm.cache
22

33
import android.content.Context
4+
import com.par9uet.jm.utils.tryCreateDir
45
import java.io.File
56

6-
fun getCommonCacheDir(context: Context): File {
7-
return File(context.cacheDir, "common")
8-
}
9-
10-
fun getCommonPicDecodeCacheDir(context: Context, comicId: Int): File {
11-
return File(context.cacheDir, "pic_decode/$comicId")
12-
}
13-
14-
fun getDownloadDir(context: Context): File {
15-
return File(context.cacheDir, "download")
16-
}
7+
fun getCommonCacheDir(context: Context) = tryCreateDir(File(context.cacheDir, "common"))
8+
fun getCommonPicDecodeCacheDir(context: Context, comicId: Int) = tryCreateDir(File(context.cacheDir, "pic_decode/$comicId"))
9+
fun getDownloadDir(context: Context) = tryCreateDir(File(context.cacheDir, "download"))

app/src/main/java/com/par9uet/jm/database/AppDatabase.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package com.par9uet.jm.database
33
import androidx.room.Database
44
import androidx.room.RoomDatabase
55
import androidx.room.TypeConverters
6-
import com.par9uet.jm.data.models.DownloadComic
76
import com.par9uet.jm.database.converter.ListStringToStringConverter
87
import com.par9uet.jm.database.dao.DownloadComicDao
8+
import com.par9uet.jm.database.model.DownloadComic
99

1010
@Database(entities = [DownloadComic::class], version = 2)
1111
@TypeConverters(ListStringToStringConverter::class)

app/src/main/java/com/par9uet/jm/database/dao/DownloadComicDao.kt

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,35 @@ import androidx.room.Insert
77
import androidx.room.OnConflictStrategy
88
import androidx.room.Query
99
import androidx.room.Update
10-
import com.par9uet.jm.data.models.DownloadComic
10+
import com.par9uet.jm.database.model.DownloadComic
11+
import com.par9uet.jm.database.model.UpdateComicCover
12+
import com.par9uet.jm.database.model.UpdateComicProgress
13+
import com.par9uet.jm.database.model.UpdateComicStatus
14+
import com.par9uet.jm.database.model.UpdateComicZipPath
1115
import kotlinx.coroutines.flow.Flow
1216

1317
@Dao
1418
interface DownloadComicDao {
15-
@Query("SELECT * FROM download_comics")
19+
@Query("SELECT * FROM download_comics WHERE status = 'pending' OR status = 'downloading' ORDER BY createTime DESC")
1620
fun getDownloadingList(): PagingSource<Int, DownloadComic>
1721

18-
@Query("SELECT * FROM download_comics WHERE status = 'complete'")
22+
@Query("SELECT * FROM download_comics WHERE status = 'complete' ORDER BY createTime DESC")
1923
fun getCompleteList(): PagingSource<Int, DownloadComic>
2024

21-
@Query("SELECT EXISTS(SELECT 1 FROM download_comics WHERE id = :id)")
22-
fun isExist(id: String): Flow<Boolean>
25+
@Query("SELECT EXISTS(SELECT 1 FROM download_comics WHERE id = :comicId)")
26+
fun isExist(comicId: Int): Flow<Boolean>
27+
28+
@Update(entity = DownloadComic::class)
29+
suspend fun updateCover(updateComicCover: UpdateComicCover)
30+
31+
@Update(entity = DownloadComic::class)
32+
suspend fun updateStatus(updateComicStatus: UpdateComicStatus)
33+
34+
@Update(entity = DownloadComic::class)
35+
suspend fun updateProgress(updateComicProgress: UpdateComicProgress)
36+
37+
@Update(entity = DownloadComic::class)
38+
suspend fun updateZipPath(updateComicZipPath: UpdateComicZipPath)
2339

2440
@Insert(onConflict = OnConflictStrategy.REPLACE)
2541
suspend fun insert(task: DownloadComic)

app/src/main/java/com/par9uet/jm/data/models/DownloadComic.kt renamed to app/src/main/java/com/par9uet/jm/database/model/DownloadComic.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.par9uet.jm.data.models
1+
package com.par9uet.jm.database.model
22

33
import androidx.room.Entity
44
import androidx.room.PrimaryKey
@@ -10,8 +10,8 @@ data class DownloadComic(
1010
val name: String,
1111
val authorList: List<String>,
1212
val coverPath: String,
13-
val picPathList: List<String>,
1413
val zipPath: String,
1514
val progress: Float,
1615
val status: String, // pending || downloading || complete
16+
val createTime: Long,
1717
)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.par9uet.jm.database.model
2+
3+
data class UpdateComicCover(
4+
val id: Int,
5+
val coverPath: String,
6+
)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.par9uet.jm.database.model
2+
3+
data class UpdateComicProgress(
4+
val id: Int,
5+
val progress: Float
6+
)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.par9uet.jm.database.model
2+
3+
data class UpdateComicStatus(
4+
val id: Int,
5+
val status: String,
6+
)

0 commit comments

Comments
 (0)