From f754a6d83ab5954958a50c03fd19bc146b1a7097 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Fri, 8 Nov 2024 14:15:41 +0300 Subject: [PATCH 1/8] feat: Begin initial work for SMS/MMS --- .../main/kotlin/com/xayah/core/model/Enum.kt | 27 +++++++- .../core/model/database/MessageEntity.kt | 63 +++++++++++++++++++ .../messages/AbstractMessagesService.kt | 5 ++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt create mode 100644 source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt diff --git a/source/core/model/src/main/kotlin/com/xayah/core/model/Enum.kt b/source/core/model/src/main/kotlin/com/xayah/core/model/Enum.kt index 70bfe8945c..7b2a8af450 100644 --- a/source/core/model/src/main/kotlin/com/xayah/core/model/Enum.kt +++ b/source/core/model/src/main/kotlin/com/xayah/core/model/Enum.kt @@ -1,6 +1,7 @@ package com.xayah.core.model import android.content.Context +import android.provider.Telephony const val TAR_SUFFIX = "tar" const val ZSTD_SUFFIX = "tar.zst" @@ -169,4 +170,28 @@ enum class ProcessingInfoType { BACKUP_ITSELF, SAVE_ICONS, SET_UP_INST_ENV, -} \ No newline at end of file +} + +enum class MessageType { + SMS, + MMS, +} + +enum class SMSMessageBox(val type: Int) { + ALL(Telephony.Sms.MESSAGE_TYPE_ALL), + DRAFT(Telephony.Sms.MESSAGE_TYPE_DRAFT), + FAILED(Telephony.Sms.MESSAGE_TYPE_FAILED), + INBOX(Telephony.Sms.MESSAGE_TYPE_INBOX), + OUTBOX(Telephony.Sms.MESSAGE_TYPE_OUTBOX), + QUEUED(Telephony.Sms.MESSAGE_TYPE_QUEUED), + SENT(Telephony.Sms.MESSAGE_TYPE_SENT), +} + +enum class MMSMessageBox(val type: Int) { + ALL(Telephony.Mms.MESSAGE_BOX_ALL), + DRAFTS(Telephony.Mms.MESSAGE_BOX_DRAFTS), + FAILED(Telephony.Mms.MESSAGE_BOX_FAILED), + INBOX(Telephony.Mms.MESSAGE_BOX_INBOX), + OUTBOX(Telephony.Mms.MESSAGE_BOX_OUTBOX), + SENT(Telephony.Mms.MESSAGE_BOX_SENT), +} diff --git a/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt b/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt new file mode 100644 index 0000000000..dd9559d17d --- /dev/null +++ b/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt @@ -0,0 +1,63 @@ +package com.xayah.core.model.database + +import com.xayah.core.model.MMSMessageBox +import com.xayah.core.model.MessageType +import com.xayah.core.model.SMSMessageBox +import kotlinx.serialization.Serializable + +data class MMSExtra( + val id: Long, + val contentClass: Long, + val contentLocation: String, + val contentType: String, + val deliveryReport: Long, + val deliveryTime: Long, + val expiry: Long, + val messageBox: MMSMessageBox, + val messageClass: String, + val messageId: String, + val messageSize: Long, + val messageType: Long, + val mmsVersion: Long, + val priority: Long, + val readReport: Long, + val readStatus: Long, + val reportAllowed: Long, + val responseStatus: Long, + val responseText: String, + val retrieveStatus: Long, + val retrieveText: String, + val retrieveTextCharset: Long, + val subjectCharset: Long, + val textOnly: Long, + val threadId: Long, + val transactionId: String, + + // Mms.Part + val filename: String, +) + +data class SMSExtra( + val creator: String, + val errorCode: Long, + val person: Long, + val protocol: Long, + val replyPathPresent: Long, + val serviceCenter: String, + val type: SMSMessageBox, +) + +@Serializable +data class MessageInfo( + val messageInfoType: MessageType, + val address: String, + val body: String, // SMS: body, MMS: text + val date: Long, + val dateSent: Long, + val locked: Long, + val read: Long, + val seen: Long, + val status: Long, + val subject: String, + val subscriptionId: Long, +) diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt new file mode 100644 index 0000000000..af6455f121 --- /dev/null +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt @@ -0,0 +1,5 @@ +package com.xayah.core.service.messages + +abstract class AbstractMessagesService { + +} \ No newline at end of file From de8443281b43a9c990e33474bfad98a17711aff9 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Fri, 8 Nov 2024 15:14:49 +0300 Subject: [PATCH 2/8] feat: Add message entity (WIP) --- .../core/model/database/MessageEntity.kt | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt b/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt index dd9559d17d..17dc7d4a25 100644 --- a/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt +++ b/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt @@ -1,11 +1,16 @@ package com.xayah.core.model.database +import androidx.room.Embedded +import androidx.room.Entity +import androidx.room.PrimaryKey import com.xayah.core.model.MMSMessageBox import com.xayah.core.model.MessageType import com.xayah.core.model.SMSMessageBox import kotlinx.serialization.Serializable -data class MMSExtra( +interface BaseMessageExtraInfo + +data class MMSExtraInfo( val id: Long, val contentClass: Long, val contentLocation: String, @@ -35,9 +40,9 @@ data class MMSExtra( // Mms.Part val filename: String, -) +) : BaseMessageExtraInfo -data class SMSExtra( +data class SMSExtraInfo( val creator: String, val errorCode: Long, val person: Long, @@ -45,7 +50,7 @@ data class SMSExtra( val replyPathPresent: Long, val serviceCenter: String, val type: SMSMessageBox, -) +) : BaseMessageExtraInfo @Serializable data class MessageInfo( @@ -61,3 +66,11 @@ data class MessageInfo( val subject: String, val subscriptionId: Long, ) + +@Serializable +@Entity +data class MessageEntity( + @PrimaryKey(autoGenerate = true) var id: Long, + @Embedded(prefix = "messageInfo_") var messageInfo: MessageInfo, + @Embedded(prefix = "messageExtraInfo_") var messageExtraInfo: BaseMessageExtraInfo, +) From ba0d870109072c9596fb35b7230e100e5f48ed05 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Fri, 8 Nov 2024 16:43:34 +0300 Subject: [PATCH 3/8] feat: Continue to implementing SMS/MMS support (WIP) --- .../com/xayah/core/database/dao/MessageDao.kt | 14 +++++++ .../com/xayah/core/database/dao/TaskDao.kt | 4 ++ .../core/model/database/MessageEntity.kt | 5 +++ .../com/xayah/core/model/util/ModelUtil.kt | 13 ++++++ .../messages/AbstractMessagesService.kt | 18 +++++++- .../messages/backup/AbstractBackupService.kt | 41 +++++++++++++++++++ .../kotlin/com/xayah/core/util/PathUtil.kt | 5 +++ 7 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 source/core/database/src/main/kotlin/com/xayah/core/database/dao/MessageDao.kt create mode 100644 source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt diff --git a/source/core/database/src/main/kotlin/com/xayah/core/database/dao/MessageDao.kt b/source/core/database/src/main/kotlin/com/xayah/core/database/dao/MessageDao.kt new file mode 100644 index 0000000000..bfb62771ec --- /dev/null +++ b/source/core/database/src/main/kotlin/com/xayah/core/database/dao/MessageDao.kt @@ -0,0 +1,14 @@ +package com.xayah.core.database.dao + +import androidx.room.Dao +import androidx.room.Upsert +import com.xayah.core.model.database.MessageEntity + +@Dao +interface MessageDao { + @Upsert(entity = MessageEntity::class) + suspend fun upsert(items: List) + + @Upsert(entity = MessageEntity::class) + suspend fun upsert(item: MessageEntity) +} \ No newline at end of file diff --git a/source/core/database/src/main/kotlin/com/xayah/core/database/dao/TaskDao.kt b/source/core/database/src/main/kotlin/com/xayah/core/database/dao/TaskDao.kt index 6b0296782d..3475b1b0ed 100644 --- a/source/core/database/src/main/kotlin/com/xayah/core/database/dao/TaskDao.kt +++ b/source/core/database/src/main/kotlin/com/xayah/core/database/dao/TaskDao.kt @@ -4,6 +4,7 @@ import androidx.room.Dao import androidx.room.Query import androidx.room.Upsert import com.xayah.core.model.ProcessingType +import com.xayah.core.model.database.MessageEntity import com.xayah.core.model.database.ProcessingInfoEntity import com.xayah.core.model.database.TaskDetailMediaEntity import com.xayah.core.model.database.TaskDetailPackageEntity @@ -24,6 +25,9 @@ interface TaskDao { @Upsert(entity = ProcessingInfoEntity::class) suspend fun upsert(item: ProcessingInfoEntity): Long + @Upsert(entity = MessageEntity::class) + suspend fun upsert(item: MessageEntity): Long + @Query("SELECT * FROM TaskEntity WHERE id = :id LIMIT 1") fun queryTaskFlow(id: Long): Flow diff --git a/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt b/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt index 17dc7d4a25..7851eebfe0 100644 --- a/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt +++ b/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt @@ -1,10 +1,12 @@ package com.xayah.core.model.database +import androidx.room.ColumnInfo import androidx.room.Embedded import androidx.room.Entity import androidx.room.PrimaryKey import com.xayah.core.model.MMSMessageBox import com.xayah.core.model.MessageType +import com.xayah.core.model.OperationState import com.xayah.core.model.SMSMessageBox import kotlinx.serialization.Serializable @@ -71,6 +73,9 @@ data class MessageInfo( @Entity data class MessageEntity( @PrimaryKey(autoGenerate = true) var id: Long, + val taskId: Long, + var state: OperationState = OperationState.IDLE, + @ColumnInfo(defaultValue = "0") var processingIndex: Int = 0, @Embedded(prefix = "messageInfo_") var messageInfo: MessageInfo, @Embedded(prefix = "messageExtraInfo_") var messageExtraInfo: BaseMessageExtraInfo, ) diff --git a/source/core/model/src/main/kotlin/com/xayah/core/model/util/ModelUtil.kt b/source/core/model/src/main/kotlin/com/xayah/core/model/util/ModelUtil.kt index a8e6e8c299..0ff47288fc 100644 --- a/source/core/model/src/main/kotlin/com/xayah/core/model/util/ModelUtil.kt +++ b/source/core/model/src/main/kotlin/com/xayah/core/model/util/ModelUtil.kt @@ -16,6 +16,7 @@ import com.xayah.core.model.ThemeType import com.xayah.core.model.ZSTD_SUFFIX import com.xayah.core.model.database.Info import com.xayah.core.model.database.MediaEntity +import com.xayah.core.model.database.MessageEntity import com.xayah.core.model.database.PackageEntity import com.xayah.core.model.database.ProcessingInfoEntity import com.xayah.core.model.database.TaskDetailMediaEntity @@ -109,6 +110,18 @@ fun TaskDetailPackageEntity.set( if (packageEntity != null) this.packageEntity = packageEntity } +fun MessageEntity.set( + state: OperationState? = null, + processingIndex: Int? = null, + messageEntity: MessageEntity? = null, +) = run { + if (state != null) this.state = state + if (processingIndex != null) this.processingIndex = processingIndex + if (messageEntity?.id != null) this.id = messageEntity.id + if (messageEntity?.messageInfo != null) this.messageInfo = messageEntity.messageInfo + if (messageEntity?.messageExtraInfo != null) this.messageExtraInfo = messageEntity.messageExtraInfo +} + fun TaskDetailPackageEntity.set( dataType: DataType, bytes: Long? = null, diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt index af6455f121..8ad5176c0b 100644 --- a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt @@ -1,5 +1,21 @@ package com.xayah.core.service.messages -abstract class AbstractMessagesService { +import com.xayah.core.model.OperationState +import com.xayah.core.model.database.MessageEntity +import com.xayah.core.model.util.set +import com.xayah.core.service.AbstractProcessingService +internal abstract class AbstractMessagesService : AbstractProcessingService() { + protected val mMessageEntities: MutableList = mutableListOf() + + protected suspend fun MessageEntity.update( + state: OperationState? = null, + processingIndex: Int? = null, + messageEntity: MessageEntity? = null, + ) = run { + set(state, processingIndex, messageEntity) + mTaskDao.upsert(this) + } + + protected abstract val mMessagesDir: String } \ No newline at end of file diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt new file mode 100644 index 0000000000..8a8844170a --- /dev/null +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt @@ -0,0 +1,41 @@ +package com.xayah.core.service.messages.backup + +import com.xayah.core.model.OperationState +import com.xayah.core.model.ProcessingInfoType +import com.xayah.core.model.ProcessingType +import com.xayah.core.model.database.ProcessingInfoEntity +import com.xayah.core.service.R +import com.xayah.core.service.messages.AbstractMessagesService + +internal abstract class AbstractBackupService : AbstractMessagesService() { + override suspend fun onInitializingPreprocessingEntities(entities: MutableList) { + entities.apply { + add(ProcessingInfoEntity( + taskId = mTaskEntity.id, + title = mContext.getString(R.string.necessary_preparations), + type = ProcessingType.PREPROCESSING, + infoType = ProcessingInfoType.NECESSARY_PREPARATIONS + ).apply { + id = mTaskDao.upsert(this) + }) + } + } + + override suspend fun onInitializingPostProcessingEntities(entities: MutableList) { + } + + override suspend fun onPreprocessing(entity: ProcessingInfoEntity) { + when (entity.infoType) { + ProcessingInfoType.NECESSARY_PREPARATIONS -> { + log { "Trying to create: $mMessagesDir." } + mRootService.mkdirs(mMessagesDir) + val isSuccess = runCatchingOnService { onTargetDirsCreated() } + entity.update(progress = 1f, state = if (isSuccess) OperationState.DONE else OperationState.ERROR) + } + + else -> {} + } + } + + protected open suspend fun onTargetDirsCreated() {} +} \ No newline at end of file diff --git a/source/core/util/src/main/kotlin/com/xayah/core/util/PathUtil.kt b/source/core/util/src/main/kotlin/com/xayah/core/util/PathUtil.kt index da038641b1..d39d4d96e7 100644 --- a/source/core/util/src/main/kotlin/com/xayah/core/util/PathUtil.kt +++ b/source/core/util/src/main/kotlin/com/xayah/core/util/PathUtil.kt @@ -17,6 +17,7 @@ const val ApksRelativeDir = "apks" const val AppsRelativeDir = "apps" const val FilesRelativeDir = "files" const val ConfigsRelativeDir = "configs" +const val MessagesRelativeDir = "messages" const val ConfigsPackageRestoreName = "package_restore_config.json" const val ConfigsMediaRestoreName = "media_restore_config.json" const val ConfigsConfigurationsName = "configurations.json" @@ -68,6 +69,7 @@ class PathUtil @Inject constructor( fun getAppsRelativeDir(): String = AppsRelativeDir fun getFilesRelativeDir(): String = FilesRelativeDir + fun getMessagesRelativeDir(): String = MessagesRelativeDir fun getPackageRestoreConfigDst(dstDir: String): String = "${dstDir}/$ConfigsPackageRestoreName" @@ -94,12 +96,15 @@ class PathUtil @Inject constructor( private fun getAppsDir(parent: String): String = "${parent}/${getAppsRelativeDir()}" private fun getFilesDir(parent: String): String = "${parent}/${getFilesRelativeDir()}" + private fun getMessagesDir(parent: String): String = "${parent}/${getMessagesRelativeDir()}" fun getLocalBackupAppsDir(): String = getAppsDir(parent = context.localBackupSaveDir()) fun getCloudTmpAppsDir(): String = getAppsDir(parent = context.cloudTmpAbsoluteDir()) fun getCloudRemoteAppsDir(remote: String): String = getAppsDir(parent = remote) fun getLocalBackupFilesDir(): String = getFilesDir(parent = context.localBackupSaveDir()) fun getCloudTmpFilesDir(): String = getFilesDir(parent = context.cloudTmpAbsoluteDir()) fun getCloudRemoteFilesDir(remote: String): String = getFilesDir(parent = remote) + fun getLocalMessagesDir(): String = getMessagesDir(parent = context.localBackupSaveDir()) + fun getCloudTmpMessagesDir(): String = getMessagesDir(parent = context.cloudTmpAbsoluteDir()) fun getTmpApkPath(packageName: String): String = "${context.tmpApksDir()}/$packageName" From 9e33371899022bf29ebf0e3e500c98acc0c7aa3c Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Fri, 8 Nov 2024 20:48:47 +0300 Subject: [PATCH 4/8] feat: Begin cloud backup impl (WIP) --- .../main/kotlin/com/xayah/core/model/Enum.kt | 3 +- .../messages/AbstractMessagesService.kt | 3 ++ .../messages/backup/AbstractBackupService.kt | 12 +++++ .../messages/backup/BackupServiceCloudImpl.kt | 52 +++++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt diff --git a/source/core/model/src/main/kotlin/com/xayah/core/model/Enum.kt b/source/core/model/src/main/kotlin/com/xayah/core/model/Enum.kt index 7b2a8af450..e80530a2d3 100644 --- a/source/core/model/src/main/kotlin/com/xayah/core/model/Enum.kt +++ b/source/core/model/src/main/kotlin/com/xayah/core/model/Enum.kt @@ -38,7 +38,8 @@ enum class OpType { enum class TaskType { PACKAGE, - MEDIA; + MEDIA, + MESSAGE; companion object } diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt index 8ad5176c0b..afdcae5c6c 100644 --- a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt @@ -1,5 +1,6 @@ package com.xayah.core.service.messages +import com.xayah.core.database.dao.MessageDao import com.xayah.core.model.OperationState import com.xayah.core.model.database.MessageEntity import com.xayah.core.model.util.set @@ -17,5 +18,7 @@ internal abstract class AbstractMessagesService : AbstractProcessingService() { mTaskDao.upsert(this) } + protected abstract val mMessageDao: MessageDao + protected abstract val mRootDir: String protected abstract val mMessagesDir: String } \ No newline at end of file diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt index 8a8844170a..6bc6b6637d 100644 --- a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt @@ -24,6 +24,10 @@ internal abstract class AbstractBackupService : AbstractMessagesService() { override suspend fun onInitializingPostProcessingEntities(entities: MutableList) { } + override suspend fun onInitializing() { + + } + override suspend fun onPreprocessing(entity: ProcessingInfoEntity) { when (entity.infoType) { ProcessingInfoType.NECESSARY_PREPARATIONS -> { @@ -37,5 +41,13 @@ internal abstract class AbstractBackupService : AbstractMessagesService() { } } + override suspend fun onProcessing() { + + } + + override suspend fun onPostProcessing(entity: ProcessingInfoEntity) { + + } + protected open suspend fun onTargetDirsCreated() {} } \ No newline at end of file diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt new file mode 100644 index 0000000000..c9bcf6f7aa --- /dev/null +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt @@ -0,0 +1,52 @@ +package com.xayah.core.service.messages.backup + +import com.xayah.core.data.repository.TaskRepository +import com.xayah.core.database.dao.MessageDao +import com.xayah.core.database.dao.TaskDao +import com.xayah.core.model.OpType +import com.xayah.core.model.TaskType +import com.xayah.core.model.database.ProcessingInfoEntity +import com.xayah.core.model.database.TaskEntity +import com.xayah.core.rootservice.service.RemoteRootService +import com.xayah.core.service.util.CommonBackupUtil +import com.xayah.core.util.PathUtil +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +internal class BackupServiceCloudImpl @Inject constructor() : AbstractBackupService() { + override val mTAG: String = "BackupServiceCloudImpl" + + @Inject + override lateinit var mRootService: RemoteRootService + + @Inject + override lateinit var mPathUtil: PathUtil + + @Inject + override lateinit var mCommonBackupUtil: CommonBackupUtil + + @Inject + override lateinit var mTaskDao: TaskDao + + @Inject + override lateinit var mTaskRepo: TaskRepository + + override val mTaskEntity by lazy { + TaskEntity( + id = 0, + opType = OpType.BACKUP, + taskType = TaskType.MESSAGE, + startTimestamp = mStartTimestamp, + endTimestamp = mEndTimestamp, + backupDir = mRootDir, + isProcessing = true, + ) + } + + @Inject + override lateinit var mMessageDao: MessageDao + + override val mRootDir by lazy { mPathUtil.getCloudTmpDir() } + override val mMessagesDir by lazy { mPathUtil.getCloudTmpMessagesDir() } +} \ No newline at end of file From c7ad6af1cd736c3426d05e251b0e6be2c13600f6 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Sat, 9 Nov 2024 13:49:56 +0300 Subject: [PATCH 5/8] feat(messages): Add remote paths for backup impl --- .../messages/backup/BackupServiceCloudImpl.kt | 26 ++++++++++++++++++- .../kotlin/com/xayah/core/util/PathUtil.kt | 1 + 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt index c9bcf6f7aa..424f0cd175 100644 --- a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt @@ -1,12 +1,15 @@ package com.xayah.core.service.messages.backup +import com.xayah.core.data.repository.CloudRepository import com.xayah.core.data.repository.TaskRepository import com.xayah.core.database.dao.MessageDao import com.xayah.core.database.dao.TaskDao import com.xayah.core.model.OpType import com.xayah.core.model.TaskType +import com.xayah.core.model.database.CloudEntity import com.xayah.core.model.database.ProcessingInfoEntity import com.xayah.core.model.database.TaskEntity +import com.xayah.core.network.client.CloudClient import com.xayah.core.rootservice.service.RemoteRootService import com.xayah.core.service.util.CommonBackupUtil import com.xayah.core.util.PathUtil @@ -44,9 +47,30 @@ internal class BackupServiceCloudImpl @Inject constructor() : AbstractBackupServ ) } + override suspend fun onTargetDirsCreated() { + mCloudRepo.getClient().also { (c, e) -> + mCloudEntity = e + mClient = c + } + + mRemotePath = mCloudEntity.remote + mRemoteMessagesDir = mPathUtil.getCloudRemoteMessagesDir(mRemotePath) + mTaskEntity.update(cloud = mCloudEntity.name, backupDir = mRemotePath) + + log { "Trying to create: $mRemoteMessagesDir." } + mClient.mkdirRecursively(mRemoteMessagesDir) + } + @Inject override lateinit var mMessageDao: MessageDao + @Inject + lateinit var mCloudRepo: CloudRepository + + private lateinit var mCloudEntity: CloudEntity + private lateinit var mClient: CloudClient override val mRootDir by lazy { mPathUtil.getCloudTmpDir() } override val mMessagesDir by lazy { mPathUtil.getCloudTmpMessagesDir() } -} \ No newline at end of file + private lateinit var mRemotePath: String + private lateinit var mRemoteMessagesDir: String +} diff --git a/source/core/util/src/main/kotlin/com/xayah/core/util/PathUtil.kt b/source/core/util/src/main/kotlin/com/xayah/core/util/PathUtil.kt index d39d4d96e7..8b414073d5 100644 --- a/source/core/util/src/main/kotlin/com/xayah/core/util/PathUtil.kt +++ b/source/core/util/src/main/kotlin/com/xayah/core/util/PathUtil.kt @@ -105,6 +105,7 @@ class PathUtil @Inject constructor( fun getCloudRemoteFilesDir(remote: String): String = getFilesDir(parent = remote) fun getLocalMessagesDir(): String = getMessagesDir(parent = context.localBackupSaveDir()) fun getCloudTmpMessagesDir(): String = getMessagesDir(parent = context.cloudTmpAbsoluteDir()) + fun getCloudRemoteMessagesDir(remote: String): String = getMessagesDir(parent = remote) fun getTmpApkPath(packageName: String): String = "${context.tmpApksDir()}/$packageName" From 00a6949e04cb20ebf6cbab2687aed867d0e8ea4f Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Sat, 9 Nov 2024 14:50:57 +0300 Subject: [PATCH 6/8] feat(messages): Begin to implement MessagesRepository --- .../core/data/repository/MediaRepository.kt | 2 +- .../data/repository/MessagesRepository.kt | 31 +++++++++++++++++++ .../messages/backup/AbstractBackupService.kt | 10 ++++++ .../messages/backup/BackupServiceCloudImpl.kt | 5 +-- .../core/service/util/MessagesBackupUtil.kt | 22 +++++++++++++ 5 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 source/core/data/src/main/kotlin/com/xayah/core/data/repository/MessagesRepository.kt create mode 100644 source/core/service/src/main/kotlin/com/xayah/core/service/util/MessagesBackupUtil.kt diff --git a/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MediaRepository.kt b/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MediaRepository.kt index 3f161ef060..39bdf63d2f 100644 --- a/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MediaRepository.kt +++ b/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MediaRepository.kt @@ -31,7 +31,7 @@ class MediaRepository @Inject constructor( private val pathUtil: PathUtil, ) { companion object { - private const val TAG = "PackageRepository" + private val TAG = this::class.java.simpleName } private fun log(onMsg: () -> String): String = run { diff --git a/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MessagesRepository.kt b/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MessagesRepository.kt new file mode 100644 index 0000000000..47d484fb7d --- /dev/null +++ b/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MessagesRepository.kt @@ -0,0 +1,31 @@ +package com.xayah.core.data.repository + +import android.content.Context +import com.xayah.core.database.dao.MessageDao +import com.xayah.core.rootservice.service.RemoteRootService +import com.xayah.core.util.LogUtil +import com.xayah.core.util.PathUtil +import com.xayah.core.util.localBackupSaveDir +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class MessagesRepository @Inject constructor( + @ApplicationContext private val context: Context, + private val rootService: RemoteRootService, + private val cloudRepository: CloudRepository, + private val mediaDao: MessageDao, + private val pathUtil: PathUtil, +) { + companion object { + private val TAG = this::class.java.simpleName + } + + private fun log(onMsg: () -> String): String = run { + val msg = onMsg() + LogUtil.log { TAG to msg } + msg + } + + private val localBackupSaveDir get() = context.localBackupSaveDir() + val backupMessagesDir get() = pathUtil.getLocalMessagesDir() +} \ No newline at end of file diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt index 6bc6b6637d..4aed829a9e 100644 --- a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt @@ -1,11 +1,14 @@ package com.xayah.core.service.messages.backup +import com.xayah.core.model.OpType import com.xayah.core.model.OperationState import com.xayah.core.model.ProcessingInfoType import com.xayah.core.model.ProcessingType +import com.xayah.core.model.TaskType import com.xayah.core.model.database.ProcessingInfoEntity import com.xayah.core.service.R import com.xayah.core.service.messages.AbstractMessagesService +import com.xayah.core.util.NotificationUtil internal abstract class AbstractBackupService : AbstractMessagesService() { override suspend fun onInitializingPreprocessingEntities(entities: MutableList) { @@ -28,6 +31,10 @@ internal abstract class AbstractBackupService : AbstractMessagesService() { } + override suspend fun beforePreprocessing() { + NotificationUtil.notify(mContext, mNotificationBuilder, mContext.getString(R.string.backing_up), mContext.getString(R.string.preprocessing)) + } + override suspend fun onPreprocessing(entity: ProcessingInfoEntity) { when (entity.infoType) { ProcessingInfoType.NECESSARY_PREPARATIONS -> { @@ -42,6 +49,9 @@ internal abstract class AbstractBackupService : AbstractMessagesService() { } override suspend fun onProcessing() { + mTaskEntity.update(rawBytes = mTaskRepo.getRawBytes(TaskType.MESSAGE), availableBytes = mTaskRepo.getAvailableBytes(OpType.BACKUP), totalBytes = mTaskRepo.getTotalBytes(OpType.BACKUP), totalCount = mMessageEntities.size) + log { "Task count: ${mMessageEntities.size}." } + } diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt index 424f0cd175..99be6f445e 100644 --- a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt @@ -67,10 +67,11 @@ internal class BackupServiceCloudImpl @Inject constructor() : AbstractBackupServ @Inject lateinit var mCloudRepo: CloudRepository - private lateinit var mCloudEntity: CloudEntity - private lateinit var mClient: CloudClient override val mRootDir by lazy { mPathUtil.getCloudTmpDir() } override val mMessagesDir by lazy { mPathUtil.getCloudTmpMessagesDir() } + + private lateinit var mCloudEntity: CloudEntity + private lateinit var mClient: CloudClient private lateinit var mRemotePath: String private lateinit var mRemoteMessagesDir: String } diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/util/MessagesBackupUtil.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/util/MessagesBackupUtil.kt new file mode 100644 index 0000000000..83648a9a3d --- /dev/null +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/util/MessagesBackupUtil.kt @@ -0,0 +1,22 @@ +package com.xayah.core.service.util + +import android.content.Context +import com.xayah.core.data.repository.CloudRepository +import com.xayah.core.data.repository.MediaRepository +import com.xayah.core.database.dao.TaskDao +import com.xayah.core.rootservice.service.RemoteRootService +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class MessagesBackupUtil @Inject constructor( + @ApplicationContext val context: Context, + private val rootService: RemoteRootService, + private val taskDao: TaskDao, + private val mediaRepository: MediaRepository, + private val commonBackupUtil: CommonBackupUtil, + private val cloudRepository: CloudRepository, +) { + companion object { + private val TAG = this::class.java.simpleName + } +} \ No newline at end of file From 0f0d953f38e051d95fe2f988963e11c40de6eb02 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Mon, 9 Dec 2024 15:45:23 +0300 Subject: [PATCH 7/8] feat: Add more SMS/MMS related methods (WIP) --- .../data/repository/MessagesRepository.kt | 21 +++- .../com/xayah/core/database/dao/MessageDao.kt | 97 +++++++++++++++++++ .../com/xayah/core/database/dao/TaskDao.kt | 4 + .../core/model/database/MessageEntity.kt | 21 +++- .../core/model/database/TaskDetailEntity.kt | 9 ++ .../com/xayah/core/model/util/ModelUtil.kt | 7 +- .../messages/AbstractMessagesService.kt | 7 +- .../messages/backup/AbstractBackupService.kt | 34 +++++++ .../messages/backup/BackupServiceCloudImpl.kt | 6 ++ 9 files changed, 194 insertions(+), 12 deletions(-) diff --git a/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MessagesRepository.kt b/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MessagesRepository.kt index 47d484fb7d..b3d80a1540 100644 --- a/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MessagesRepository.kt +++ b/source/core/data/src/main/kotlin/com/xayah/core/data/repository/MessagesRepository.kt @@ -2,18 +2,23 @@ package com.xayah.core.data.repository import android.content.Context import com.xayah.core.database.dao.MessageDao +import com.xayah.core.model.CompressionType +import com.xayah.core.model.OpType +import com.xayah.core.model.database.MediaEntity +import com.xayah.core.model.database.MessageEntity import com.xayah.core.rootservice.service.RemoteRootService import com.xayah.core.util.LogUtil import com.xayah.core.util.PathUtil import com.xayah.core.util.localBackupSaveDir import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.distinctUntilChanged import javax.inject.Inject class MessagesRepository @Inject constructor( @ApplicationContext private val context: Context, private val rootService: RemoteRootService, private val cloudRepository: CloudRepository, - private val mediaDao: MessageDao, + private val messageDao: MessageDao, private val pathUtil: PathUtil, ) { companion object { @@ -26,6 +31,20 @@ class MessagesRepository @Inject constructor( msg } + fun queryFlow(opType: OpType) = messageDao.queryFlow(opType).distinctUntilChanged() + suspend fun query(opType: OpType) = messageDao.query(opType) + suspend fun upsert(item: MessageEntity) = messageDao.upsert(item) + suspend fun upsert(items: List) = messageDao.upsert(items) + suspend fun delete(id: Long) = messageDao.delete(id) + suspend fun queryActivated(opType: OpType) = messageDao.queryActivated(opType) + suspend fun queryActivated(opType: OpType, cloud: String, backupDir: String) = messageDao.queryActivated(opType, cloud, backupDir) + suspend fun query(opType: OpType, preserveId: Long, name: String, cloud: String, backupDir: String) = messageDao.query(opType, preserveId, name, cloud, backupDir) + suspend fun query(opType: OpType, preserveId: Long, name: String, ct: CompressionType, cloud: String, backupDir: String) = messageDao.query(opType, preserveId, name, ct, cloud, backupDir) + suspend fun query(opType: OpType, name: String, cloud: String, backupDir: String) = messageDao.query(opType, name, cloud, backupDir) + suspend fun query(opType: OpType, preserveId: Long, cloud: String, backupDir: String) = messageDao.query(opType, preserveId, cloud, backupDir) + suspend fun query(opType: OpType, cloud: String, backupDir: String) = messageDao.query(opType, cloud, backupDir) + suspend fun query(name: String, opType: OpType) = messageDao.query(name, opType) + private val localBackupSaveDir get() = context.localBackupSaveDir() val backupMessagesDir get() = pathUtil.getLocalMessagesDir() } \ No newline at end of file diff --git a/source/core/database/src/main/kotlin/com/xayah/core/database/dao/MessageDao.kt b/source/core/database/src/main/kotlin/com/xayah/core/database/dao/MessageDao.kt index bfb62771ec..41788c056d 100644 --- a/source/core/database/src/main/kotlin/com/xayah/core/database/dao/MessageDao.kt +++ b/source/core/database/src/main/kotlin/com/xayah/core/database/dao/MessageDao.kt @@ -1,8 +1,14 @@ package com.xayah.core.database.dao import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Query +import androidx.room.Update import androidx.room.Upsert +import com.xayah.core.model.CompressionType +import com.xayah.core.model.OpType import com.xayah.core.model.database.MessageEntity +import kotlinx.coroutines.flow.Flow @Dao interface MessageDao { @@ -11,4 +17,95 @@ interface MessageDao { @Upsert(entity = MessageEntity::class) suspend fun upsert(item: MessageEntity) + + @Query( + "SELECT * FROM MessageEntity WHERE" + + " indexInfo_opType = :opType" + ) + suspend fun query(opType: OpType): List + + @Query( + "SELECT * FROM MessageEntity" + + " WHERE indexInfo_opType = :opType AND indexInfo_preserveId = :preserveId" + + " AND indexInfo_cloud = :cloud AND indexInfo_backupDir = :backupDir" + ) + suspend fun query(opType: OpType, preserveId: Long, cloud: String, backupDir: String): List + + @Query( + "SELECT * FROM MessageEntity WHERE" + + " indexInfo_opType = :opType AND indexInfo_cloud = :cloud AND indexInfo_backupDir = :backupDir" + ) + suspend fun query(opType: OpType, cloud: String, backupDir: String): List + + @Query( + "SELECT * FROM MessageEntity" + + " WHERE indexInfo_opType = :opType AND indexInfo_name = :name" + + " AND indexInfo_cloud = :cloud AND indexInfo_backupDir = :backupDir" + ) + suspend fun query(opType: OpType, name: String, cloud: String, backupDir: String): List + + @Query( + "SELECT * FROM MessageEntity" + + " WHERE indexInfo_opType = :opType AND indexInfo_preserveId = :preserveId AND indexInfo_name = :name" + + " AND indexInfo_cloud = :cloud AND indexInfo_backupDir = :backupDir" + + " LIMIT 1" + ) + suspend fun query(opType: OpType, preserveId: Long, name: String, cloud: String, backupDir: String): MessageEntity? + + @Query( + "SELECT * FROM MessageEntity WHERE" + + " indexInfo_name = :name AND indexInfo_opType = :opType" + + " LIMIT 1" + ) + suspend fun query(name: String, opType: OpType): MessageEntity? + + @Query( + "SELECT * FROM MessageEntity WHERE" + + " indexInfo_opType = :opType AND indexInfo_preserveId = :preserveId AND indexInfo_name = :name AND indexInfo_compressionType = :ct" + + " AND indexInfo_cloud = :cloud AND indexInfo_backupDir = :backupDir" + + " LIMIT 1" + ) + suspend fun query(opType: OpType, preserveId: Long, name: String, ct: CompressionType, cloud: String, backupDir: String): MessageEntity? + + @Query("SELECT * FROM MessageEntity WHERE indexInfo_opType = :opType") + suspend fun queryActivated(opType: OpType): List + + @Query("SELECT * FROM MessageEntity WHERE indexInfo_opType = :opType AND indexInfo_cloud = :cloud AND indexInfo_backupDir = :backupDir") + suspend fun queryActivated(opType: OpType, cloud: String, backupDir: String): List + + @Query( + "SELECT * FROM MessageEntity WHERE" + + " indexInfo_opType = :opType" + ) + fun queryFlow(opType: OpType): Flow> + + @Query( + "SELECT * FROM MessageEntity WHERE" + + " indexInfo_opType = :opType AND indexInfo_cloud = :cloud AND indexInfo_backupDir = :backupDir" + ) + fun queryFlow(opType: OpType, cloud: String, backupDir: String): Flow> + + @Query("SELECT * FROM MessageEntity WHERE indexInfo_opType = :opType AND indexInfo_preserveId = :preserveId") + fun queryFlow(opType: OpType, preserveId: Long): Flow> + + @Query("SELECT * FROM MessageEntity WHERE indexInfo_name = :name AND indexInfo_opType = :opType AND indexInfo_preserveId = :preserveId LIMIT 1") + fun queryFlow(name: String, opType: OpType, preserveId: Long): Flow + + @Query("SELECT * FROM MessageEntity WHERE indexInfo_name = :name AND indexInfo_opType = :opType") + fun queryFlow(name: String, opType: OpType): Flow> + + @Query("SELECT COUNT(*) FROM MessageEntity") + suspend fun count(): Long + + @Delete(entity = MessageEntity::class) + suspend fun delete(item: MessageEntity) + + @Query("DELETE FROM MessageEntity WHERE id = :id") + suspend fun delete(id: Long) + + @Query("DELETE FROM MessageEntity WHERE id in (:ids)") + suspend fun delete(ids: List) + + @Update(MessageEntity::class) + suspend fun update(item: MessageEntity) } \ No newline at end of file diff --git a/source/core/database/src/main/kotlin/com/xayah/core/database/dao/TaskDao.kt b/source/core/database/src/main/kotlin/com/xayah/core/database/dao/TaskDao.kt index 3475b1b0ed..03bdcf65f5 100644 --- a/source/core/database/src/main/kotlin/com/xayah/core/database/dao/TaskDao.kt +++ b/source/core/database/src/main/kotlin/com/xayah/core/database/dao/TaskDao.kt @@ -7,6 +7,7 @@ import com.xayah.core.model.ProcessingType import com.xayah.core.model.database.MessageEntity import com.xayah.core.model.database.ProcessingInfoEntity import com.xayah.core.model.database.TaskDetailMediaEntity +import com.xayah.core.model.database.TaskDetailMessageEntity import com.xayah.core.model.database.TaskDetailPackageEntity import com.xayah.core.model.database.TaskEntity import kotlinx.coroutines.flow.Flow @@ -22,6 +23,9 @@ interface TaskDao { @Upsert(entity = TaskDetailMediaEntity::class) suspend fun upsert(item: TaskDetailMediaEntity): Long + @Upsert(entity = TaskDetailMessageEntity::class) + suspend fun upsert(item: TaskDetailMessageEntity): Long + @Upsert(entity = ProcessingInfoEntity::class) suspend fun upsert(item: ProcessingInfoEntity): Long diff --git a/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt b/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt index 7851eebfe0..96ddb89217 100644 --- a/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt +++ b/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt @@ -4,14 +4,27 @@ import androidx.room.ColumnInfo import androidx.room.Embedded import androidx.room.Entity import androidx.room.PrimaryKey +import com.xayah.core.model.CompressionType import com.xayah.core.model.MMSMessageBox import com.xayah.core.model.MessageType +import com.xayah.core.model.OpType import com.xayah.core.model.OperationState import com.xayah.core.model.SMSMessageBox import kotlinx.serialization.Serializable interface BaseMessageExtraInfo +@Serializable +data class MessageIndexInfo( + var opType: OpType, + var name: String, + var compressionType: CompressionType, + var preserveId: Long, + var cloud: String, + var backupDir: String, + var messageType: MessageType, +) + data class MMSExtraInfo( val id: Long, val contentClass: Long, @@ -55,8 +68,7 @@ data class SMSExtraInfo( ) : BaseMessageExtraInfo @Serializable -data class MessageInfo( - val messageInfoType: MessageType, +data class MessageBaseInfo( val address: String, val body: String, // SMS: body, MMS: text val date: Long, @@ -73,9 +85,8 @@ data class MessageInfo( @Entity data class MessageEntity( @PrimaryKey(autoGenerate = true) var id: Long, - val taskId: Long, - var state: OperationState = OperationState.IDLE, @ColumnInfo(defaultValue = "0") var processingIndex: Int = 0, - @Embedded(prefix = "messageInfo_") var messageInfo: MessageInfo, + @Embedded(prefix = "indexInfo_") var indexInfo: MessageIndexInfo, + @Embedded(prefix = "messageBaseInfo_") var messageBaseInfo: MessageBaseInfo, @Embedded(prefix = "messageExtraInfo_") var messageExtraInfo: BaseMessageExtraInfo, ) diff --git a/source/core/model/src/main/kotlin/com/xayah/core/model/database/TaskDetailEntity.kt b/source/core/model/src/main/kotlin/com/xayah/core/model/database/TaskDetailEntity.kt index 469d5ce1bc..e5c5bc2ca3 100644 --- a/source/core/model/src/main/kotlin/com/xayah/core/model/database/TaskDetailEntity.kt +++ b/source/core/model/src/main/kotlin/com/xayah/core/model/database/TaskDetailEntity.kt @@ -57,6 +57,15 @@ data class TaskDetailMediaEntity( } } +@Entity +data class TaskDetailMessageEntity( + @PrimaryKey(autoGenerate = true) var id: Long = 0, + var taskId: Long, + var state: OperationState = OperationState.IDLE, + @ColumnInfo(defaultValue = "0") var processingIndex: Int = 0, + @Embedded(prefix = "messageEntity_") var messageEntity: MessageEntity, +) + @Entity data class ProcessingInfoEntity( @PrimaryKey(autoGenerate = true) var id: Long = 0, diff --git a/source/core/model/src/main/kotlin/com/xayah/core/model/util/ModelUtil.kt b/source/core/model/src/main/kotlin/com/xayah/core/model/util/ModelUtil.kt index 0ff47288fc..602c4065f8 100644 --- a/source/core/model/src/main/kotlin/com/xayah/core/model/util/ModelUtil.kt +++ b/source/core/model/src/main/kotlin/com/xayah/core/model/util/ModelUtil.kt @@ -20,6 +20,7 @@ import com.xayah.core.model.database.MessageEntity import com.xayah.core.model.database.PackageEntity import com.xayah.core.model.database.ProcessingInfoEntity import com.xayah.core.model.database.TaskDetailMediaEntity +import com.xayah.core.model.database.TaskDetailMessageEntity import com.xayah.core.model.database.TaskDetailPackageEntity import com.xayah.core.model.database.TaskEntity import java.text.DecimalFormat @@ -110,16 +111,14 @@ fun TaskDetailPackageEntity.set( if (packageEntity != null) this.packageEntity = packageEntity } -fun MessageEntity.set( +fun TaskDetailMessageEntity.set( state: OperationState? = null, processingIndex: Int? = null, messageEntity: MessageEntity? = null, ) = run { if (state != null) this.state = state if (processingIndex != null) this.processingIndex = processingIndex - if (messageEntity?.id != null) this.id = messageEntity.id - if (messageEntity?.messageInfo != null) this.messageInfo = messageEntity.messageInfo - if (messageEntity?.messageExtraInfo != null) this.messageExtraInfo = messageEntity.messageExtraInfo + if (messageEntity != null) this.messageEntity = messageEntity } fun TaskDetailPackageEntity.set( diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt index afdcae5c6c..d3f3dd02f9 100644 --- a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/AbstractMessagesService.kt @@ -1,15 +1,17 @@ package com.xayah.core.service.messages +import com.xayah.core.data.repository.MessagesRepository import com.xayah.core.database.dao.MessageDao import com.xayah.core.model.OperationState import com.xayah.core.model.database.MessageEntity +import com.xayah.core.model.database.TaskDetailMessageEntity import com.xayah.core.model.util.set import com.xayah.core.service.AbstractProcessingService internal abstract class AbstractMessagesService : AbstractProcessingService() { - protected val mMessageEntities: MutableList = mutableListOf() + protected val mMessageEntities: MutableList = mutableListOf() - protected suspend fun MessageEntity.update( + protected suspend fun TaskDetailMessageEntity.update( state: OperationState? = null, processingIndex: Int? = null, messageEntity: MessageEntity? = null, @@ -19,6 +21,7 @@ internal abstract class AbstractMessagesService : AbstractProcessingService() { } protected abstract val mMessageDao: MessageDao + protected abstract val mMessagesRepo: MessagesRepository protected abstract val mRootDir: String protected abstract val mMessagesDir: String } \ No newline at end of file diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt index 4aed829a9e..45ad00a5a9 100644 --- a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt @@ -1,11 +1,15 @@ package com.xayah.core.service.messages.backup +import com.xayah.core.model.DataType import com.xayah.core.model.OpType import com.xayah.core.model.OperationState import com.xayah.core.model.ProcessingInfoType import com.xayah.core.model.ProcessingType import com.xayah.core.model.TaskType +import com.xayah.core.model.database.Info import com.xayah.core.model.database.ProcessingInfoEntity +import com.xayah.core.model.database.TaskDetailMediaEntity +import com.xayah.core.model.database.TaskDetailMessageEntity import com.xayah.core.service.R import com.xayah.core.service.messages.AbstractMessagesService import com.xayah.core.util.NotificationUtil @@ -28,7 +32,17 @@ internal abstract class AbstractBackupService : AbstractMessagesService() { } override suspend fun onInitializing() { + val messages = mMessagesRepo.queryActivated(OpType.BACKUP) + messages.forEach { message -> + mMessageEntities.add( + TaskDetailMessageEntity( + taskId = mTaskEntity.id, + messageEntity = message, + ).apply { + id = mTaskDao.upsert(this) + }) + } } override suspend fun beforePreprocessing() { @@ -52,7 +66,27 @@ internal abstract class AbstractBackupService : AbstractMessagesService() { mTaskEntity.update(rawBytes = mTaskRepo.getRawBytes(TaskType.MESSAGE), availableBytes = mTaskRepo.getAvailableBytes(OpType.BACKUP), totalBytes = mTaskRepo.getTotalBytes(OpType.BACKUP), totalCount = mMessageEntities.size) log { "Task count: ${mMessageEntities.size}." } + mMessageEntities.forEachIndexed { index, message -> + executeAtLeast { + val p = message.messageEntity.messageBaseInfo.address + + NotificationUtil.notify( + mContext, + mNotificationBuilder, + mContext.getString(R.string.backing_up), + p, + mMessageEntities.size, + index + ) + log { "Current message: $p" } + + message.update(state = OperationState.PROCESSING) + val dstDir = mMessagesDir + + } + mTaskEntity.update(processingIndex = mTaskEntity.processingIndex + 1) + } } override suspend fun onPostProcessing(entity: ProcessingInfoEntity) { diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt index 99be6f445e..33d165f7f2 100644 --- a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/BackupServiceCloudImpl.kt @@ -1,7 +1,10 @@ package com.xayah.core.service.messages.backup import com.xayah.core.data.repository.CloudRepository +import com.xayah.core.data.repository.MediaRepository +import com.xayah.core.data.repository.MessagesRepository import com.xayah.core.data.repository.TaskRepository +import com.xayah.core.database.dao.MediaDao import com.xayah.core.database.dao.MessageDao import com.xayah.core.database.dao.TaskDao import com.xayah.core.model.OpType @@ -35,6 +38,9 @@ internal class BackupServiceCloudImpl @Inject constructor() : AbstractBackupServ @Inject override lateinit var mTaskRepo: TaskRepository + @Inject + override lateinit var mMessagesRepo: MessagesRepository + override val mTaskEntity by lazy { TaskEntity( id = 0, From 1c25e6830aae644130c8bac6250a4c1094254301 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Mon, 20 Jan 2025 19:23:12 +0300 Subject: [PATCH 8/8] perf: Send unfinished latest code --- .../core/model/database/MessageEntity.kt | 38 ++++++++++++++----- .../messages/backup/AbstractBackupService.kt | 3 +- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt b/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt index 96ddb89217..a5597c5735 100644 --- a/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt +++ b/source/core/model/src/main/kotlin/com/xayah/core/model/database/MessageEntity.kt @@ -4,15 +4,16 @@ import androidx.room.ColumnInfo import androidx.room.Embedded import androidx.room.Entity import androidx.room.PrimaryKey +import com.google.gson.Gson +import com.google.gson.JsonElement import com.xayah.core.model.CompressionType import com.xayah.core.model.MMSMessageBox import com.xayah.core.model.MessageType import com.xayah.core.model.OpType -import com.xayah.core.model.OperationState import com.xayah.core.model.SMSMessageBox import kotlinx.serialization.Serializable -interface BaseMessageExtraInfo +interface BaseMessageTypeInfo @Serializable data class MessageIndexInfo( @@ -25,7 +26,7 @@ data class MessageIndexInfo( var messageType: MessageType, ) -data class MMSExtraInfo( +data class MMSTypeInfo( val id: Long, val contentClass: Long, val contentLocation: String, @@ -55,9 +56,9 @@ data class MMSExtraInfo( // Mms.Part val filename: String, -) : BaseMessageExtraInfo +) : BaseMessageTypeInfo -data class SMSExtraInfo( +data class SMSTypeInfo( val creator: String, val errorCode: Long, val person: Long, @@ -65,7 +66,7 @@ data class SMSExtraInfo( val replyPathPresent: Long, val serviceCenter: String, val type: SMSMessageBox, -) : BaseMessageExtraInfo +) : BaseMessageTypeInfo @Serializable data class MessageBaseInfo( @@ -81,12 +82,31 @@ data class MessageBaseInfo( val subscriptionId: Long, ) +@Serializable +data class MessageToggleInfo( + var blocked: Boolean, + var activated: Boolean, + var existed: Boolean, +) + @Serializable @Entity data class MessageEntity( @PrimaryKey(autoGenerate = true) var id: Long, @ColumnInfo(defaultValue = "0") var processingIndex: Int = 0, @Embedded(prefix = "indexInfo_") var indexInfo: MessageIndexInfo, - @Embedded(prefix = "messageBaseInfo_") var messageBaseInfo: MessageBaseInfo, - @Embedded(prefix = "messageExtraInfo_") var messageExtraInfo: BaseMessageExtraInfo, -) + @Embedded(prefix = "baseInfo_") var messageBaseInfo: MessageBaseInfo, + @Embedded(prefix = "typeInfo_") var messageTypeInfo: BaseMessageTypeInfo, + @Embedded(prefix = "toggleInfo_") var messageToggleInfo: MessageToggleInfo, +) { + fun asString(): String { + return Gson().let { + it.toJson( + mapOf( + Pair("baseInfo", it.toJsonTree(messageBaseInfo)), + Pair("typeInfo", it.toJsonTree(messageTypeInfo)), + ) + ) + } + } +} diff --git a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt index 45ad00a5a9..1610b4d5af 100644 --- a/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt +++ b/source/core/service/src/main/kotlin/com/xayah/core/service/messages/backup/AbstractBackupService.kt @@ -81,9 +81,8 @@ internal abstract class AbstractBackupService : AbstractMessagesService() { log { "Current message: $p" } message.update(state = OperationState.PROCESSING) - val dstDir = mMessagesDir - + val jsonString = message.messageEntity.asString() } mTaskEntity.update(processingIndex = mTaskEntity.processingIndex + 1) }