Skip to content

Commit

Permalink
feat: support import/export data
Browse files Browse the repository at this point in the history
  • Loading branch information
lisonge committed May 28, 2024
1 parent e3aed78 commit a75f3b9
Show file tree
Hide file tree
Showing 17 changed files with 372 additions and 72 deletions.
39 changes: 26 additions & 13 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,28 +45,41 @@
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/SplashScreenTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<!--
about android:configChanges
https://developer.android.com/guide/topics/resources/runtime-changes
https://developer.android.com/guide/topics/manifest/activity-element.html#config
-->

<activity
android:name="li.songe.gkd.OpenSchemeActivity"
android:exported="true"
android:theme="@style/TransparentTheme">
<intent-filter>
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data
android:host="import"
android:scheme="gkd" />

<data android:scheme="gkd" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</activity>

<activity
android:name=".OpenFileActivity"
android:exported="true"
android:theme="@style/TransparentTheme">
<intent-filter android:label="@string/import_desc">
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="content" />
<data android:mimeType="application/zip" />
<data android:mimeType="application/x-zip-compressed" />
</intent-filter>
</activity>

Expand Down
14 changes: 14 additions & 0 deletions app/src/main/kotlin/li/songe/gkd/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package li.songe.gkd

import android.app.Activity
import android.app.ActivityManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.runtime.CompositionLocalProvider
Expand Down Expand Up @@ -100,6 +103,17 @@ class MainActivity : CompositionActivity({

val activityVisibleFlow = MutableStateFlow(0)

fun Activity.navToMainActivity() {
val intent = this.intent?.cloneFilter()
if (intent != null) {
intent.component = ComponentName(this, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
intent.putExtra("source", this::class.java.name)
startActivity(intent)
}
finish()
}




14 changes: 2 additions & 12 deletions app/src/main/kotlin/li/songe/gkd/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@ import li.songe.gkd.data.SubsItem
import li.songe.gkd.db.DbSet
import li.songe.gkd.permission.authReasonFlow
import li.songe.gkd.util.checkUpdate
import li.songe.gkd.util.clearCache
import li.songe.gkd.util.launchTry
import li.songe.gkd.util.logZipDir
import li.songe.gkd.util.map
import li.songe.gkd.util.newVersionApkDir
import li.songe.gkd.util.snapshotZipDir
import li.songe.gkd.util.storeFlow
import li.songe.gkd.util.updateSubscription

Expand All @@ -44,15 +42,7 @@ class MainViewModel : ViewModel() {

viewModelScope.launchTry(Dispatchers.IO) {
// 每次进入删除缓存
listOf(snapshotZipDir, newVersionApkDir, logZipDir).forEach { dir ->
if (dir.isDirectory && dir.exists()) {
dir.listFiles()?.forEach { file ->
if (file.isFile) {
file.delete()
}
}
}
}
clearCache()
}

if (storeFlow.value.autoCheckAppUpdate) {
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/kotlin/li/songe/gkd/OpenFileActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package li.songe.gkd

import android.app.Activity
import android.os.Bundle

class OpenFileActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
navToMainActivity()
}
}
11 changes: 11 additions & 0 deletions app/src/main/kotlin/li/songe/gkd/OpenSchemeActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package li.songe.gkd

import android.app.Activity
import android.os.Bundle

class OpenSchemeActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
navToMainActivity()
}
}
9 changes: 9 additions & 0 deletions app/src/main/kotlin/li/songe/gkd/data/CategoryConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import androidx.room.PrimaryKey
import androidx.room.Query
import androidx.room.Update
import kotlinx.coroutines.flow.Flow
import kotlinx.serialization.Serializable

@Serializable
@Entity(
tableName = "category_config",
)
Expand All @@ -29,6 +31,9 @@ data class CategoryConfig(
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(vararg objects: CategoryConfig): List<Long>

@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insertOrIgnore(vararg objects: CategoryConfig): List<Long>

@Delete
suspend fun delete(vararg objects: CategoryConfig): Int

Expand All @@ -43,5 +48,9 @@ data class CategoryConfig(

@Query("SELECT * FROM category_config WHERE subs_item_id=:subsItemId")
fun queryConfig(subsItemId: Long): Flow<List<CategoryConfig>>

@Query("SELECT * FROM category_config WHERE subs_item_id IN (:subsItemIds)")
suspend fun querySubsItemConfig(subsItemIds: List<Long>): List<CategoryConfig>

}
}
4 changes: 4 additions & 0 deletions app/src/main/kotlin/li/songe/gkd/data/RawSubscription.kt
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@ data class RawSubscription(
apps.flatMap { a -> a.groups }
}

val groupsSize by lazy {
appGroups.size + globalGroups.size
}

val numText by lazy {
val appsSize = apps.size
val appGroupsSize = appGroups.size
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/kotlin/li/songe/gkd/data/SubsConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ import androidx.room.Query
import androidx.room.Update
import kotlinx.coroutines.flow.Flow
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Serializable

@Serializable
@Entity(
tableName = "subs_config",
)
Expand Down Expand Up @@ -42,6 +44,9 @@ data class SubsConfig(
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(vararg users: SubsConfig): List<Long>

@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insertOrIgnore(vararg users: SubsConfig): List<Long>

@Delete
suspend fun delete(vararg users: SubsConfig): Int

Expand Down Expand Up @@ -76,6 +81,10 @@ data class SubsConfig(

@Query("SELECT * FROM subs_config WHERE type=${GlobalGroupType} AND subs_item_id=:subsItemId AND group_key=:groupKey")
fun queryGlobalGroupTypeConfig(subsItemId: Long, groupKey: Int): Flow<List<SubsConfig>>

@Query("SELECT * FROM subs_config WHERE subs_item_id IN (:subsItemIds) ")
suspend fun querySubsItemConfig(subsItemIds: List<Long>): List<SubsConfig>

}

}
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/kotlin/li/songe/gkd/data/SubsItem.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@ import androidx.room.Query
import androidx.room.Transaction
import androidx.room.Update
import kotlinx.coroutines.flow.Flow
import kotlinx.serialization.Serializable
import li.songe.gkd.db.DbSet
import li.songe.gkd.util.deleteSubscription
import li.songe.gkd.util.isSafeUrl

@Serializable
@Entity(
tableName = "subs_item",
)
Expand Down Expand Up @@ -77,6 +79,9 @@ data class SubsItem(
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(vararg users: SubsItem): List<Long>

@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insertOrIgnore(vararg users: SubsItem): List<Long>

@Delete
suspend fun delete(vararg users: SubsItem): Int

Expand Down
48 changes: 48 additions & 0 deletions app/src/main/kotlin/li/songe/gkd/data/TransferData.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package li.songe.gkd.data

import kotlinx.serialization.Serializable
import li.songe.gkd.db.DbSet
import li.songe.gkd.util.subsIdToRawFlow
import li.songe.gkd.util.subsItemsFlow
import li.songe.gkd.util.updateSubscription

@Serializable
data class TransferData(
val type: String = TYPE,
val ctime: Long = System.currentTimeMillis(),

val subsItems: List<SubsItem> = emptyList(),
val subscriptions: List<RawSubscription> = emptyList(),
val subsConfigs: List<SubsConfig> = emptyList(),
val categoryConfigs: List<CategoryConfig> = emptyList(),
) {
companion object {
const val TYPE = "transfer_data"
}
}

suspend fun exportTransferData(subsItemIds: List<Long>): TransferData {
return TransferData(
subsItems = subsItemsFlow.value.filter { subsItemIds.contains(it.id) },
subscriptions = subsIdToRawFlow.value.values.filter { it.id < 0 && subsItemIds.contains(it.id) },
subsConfigs = DbSet.subsConfigDao.querySubsItemConfig(subsItemIds),
categoryConfigs = DbSet.categoryConfigDao.querySubsItemConfig(subsItemIds),
)
}

suspend fun importTransferData(transferData: TransferData) {
// TODO transaction
val localIds = arrayOf(-1L, -2L)
val maxOrder = (subsItemsFlow.value.maxOfOrNull { it.order } ?: -1) + 1
val subsItems = transferData.subsItems.mapIndexed { i, s ->
s.copy(order = maxOrder + i)
}
DbSet.subsItemDao.insertOrIgnore(*subsItems.toTypedArray())
DbSet.subsConfigDao.insertOrIgnore(*transferData.subsConfigs.toTypedArray())
DbSet.categoryConfigDao.insertOrIgnore(*transferData.categoryConfigs.toTypedArray())
transferData.subscriptions.forEach { subscription ->
if (localIds.contains(subscription.id)) {
updateSubscription(subscription)
}
}
}
Loading

0 comments on commit a75f3b9

Please sign in to comment.