From b9e995f30da029c34fd6f4dd054745a738dbf6be Mon Sep 17 00:00:00 2001 From: choelzl Date: Wed, 2 Sep 2026 23:12:08 +0200 Subject: [PATCH] Archiving Sync --- .../android/bill_edit/EditBillActivity.kt | 24 ++------ .../currencies/ManageCurrenciesActivity.kt | 12 ++-- .../android/main/BillsListViewActivity.kt | 25 +++++--- .../project/edit/EditProjectActivity.kt | 33 +++++----- .../persistence/CowspentSQLiteOpenHelper.kt | 60 ++++--------------- .../persistence/CowspentServerSyncHelper.kt | 29 +++++---- .../util/VersatileProjectSyncClient.kt | 6 +- 7 files changed, 83 insertions(+), 106 deletions(-) diff --git a/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt b/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt index 9127582..73de227 100644 --- a/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt +++ b/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt @@ -415,16 +415,8 @@ class EditBillActivity : AppCompatActivity() { val proj = db.getProject(bill.projectId) if (proj != null) db.syncIfRemote(proj) db.updateProject( - bill.projectId, - null, - null, - null, - viewModel.payerId, - null, - null, - null, - null, - null + projId = bill.projectId, + newLastPayerId = viewModel.payerId ) return@withContext firstSavedId @@ -468,16 +460,8 @@ class EditBillActivity : AppCompatActivity() { newOwersIds.forEach { newBill.billOwers += DBBillOwer(0, 0, it) } val newBillId = db.addBill(newBill) db.updateProject( - bill.projectId, - null, - null, - null, - viewModel.payerId, - null, - null, - null, - null, - null + projId = bill.projectId, + newLastPayerId = viewModel.payerId ) val proj = db.getProject(bill.projectId) if (proj != null) db.syncIfRemote(proj) diff --git a/app/src/main/java/net/helcel/cowspent/android/currencies/ManageCurrenciesActivity.kt b/app/src/main/java/net/helcel/cowspent/android/currencies/ManageCurrenciesActivity.kt index a49f441..437e7b4 100644 --- a/app/src/main/java/net/helcel/cowspent/android/currencies/ManageCurrenciesActivity.kt +++ b/app/src/main/java/net/helcel/cowspent/android/currencies/ManageCurrenciesActivity.kt @@ -84,9 +84,8 @@ class ManageCurrenciesActivity : AppCompatActivity() { lifecycleScope.launch { withContext(Dispatchers.IO) { db!!.updateProject( - selectedProjectID, null, null, null, - null, null, newMainCurrencyName, - null, null, null + projId = selectedProjectID, + newCurrencyName = newMainCurrencyName ) val project = db!!.getProject(selectedProjectID) if (project != null) { @@ -94,7 +93,12 @@ class ManageCurrenciesActivity : AppCompatActivity() { if (project.type == ProjectType.COSPEND) { withContext(Dispatchers.Main) { if (!db!!.cowspentServerSyncHelper - .editRemoteProject(selectedProjectID, project.name, null, null, newMainCurrencyName, editMainCurrencyCallBack) + .editRemoteProject( + projId = selectedProjectID, + newName = project.name, + newMainCurrencyName = newMainCurrencyName, + callback = editMainCurrencyCallBack + ) ) { showToast(this@ManageCurrenciesActivity, getString(R.string.remote_project_operation_no_network), Toast.LENGTH_LONG) } diff --git a/app/src/main/java/net/helcel/cowspent/android/main/BillsListViewActivity.kt b/app/src/main/java/net/helcel/cowspent/android/main/BillsListViewActivity.kt index c089426..a657ce4 100644 --- a/app/src/main/java/net/helcel/cowspent/android/main/BillsListViewActivity.kt +++ b/app/src/main/java/net/helcel/cowspent/android/main/BillsListViewActivity.kt @@ -427,19 +427,26 @@ class BillsListViewActivity : withContext(Dispatchers.IO) { db.updateProject( projId = projectId, - newName = null, - newEmail = null, - newPassword = null, - newLastPayerId = null, - newLastSyncedTimestamp = null, - newCurrencyName = null, - newDeletionDisabled = null, - newMyAccessLevel = null, - newBearerToken = null, newArchivedTs = newArchivedTs ) } + if (!proj.isLocal) { + db.cowspentServerSyncHelper.editRemoteProject( + projId = projectId, + newArchivedTs = newArchivedTs, + callback = object : ICallback { + override fun onFinish() {} + override fun onFinish(result: String, message: String) { + if (message.isNotEmpty()) { + showToast(this@BillsListViewActivity, getString(R.string.error_sync, message)) + } + } + override fun onScheduled() {} + } + ) + } + setupDrawerProjects() refreshLists() diff --git a/app/src/main/java/net/helcel/cowspent/android/project/edit/EditProjectActivity.kt b/app/src/main/java/net/helcel/cowspent/android/project/edit/EditProjectActivity.kt index 4afcf0c..08422be 100644 --- a/app/src/main/java/net/helcel/cowspent/android/project/edit/EditProjectActivity.kt +++ b/app/src/main/java/net/helcel/cowspent/android/project/edit/EditProjectActivity.kt @@ -85,10 +85,11 @@ class EditProjectActivity : AppCompatActivity() { lifecycleScope.launch { withContext(Dispatchers.IO) { db.updateProject( - project.id, newName, newEmail, targetPwd, - null, project.type, null, - null, null, - null, null + projId = project.id, + newName = newName, + newEmail = newEmail, + newPassword = targetPwd, + projectType = project.type ) } closeOnEdit(project.id) @@ -103,18 +104,21 @@ class EditProjectActivity : AppCompatActivity() { project.password = currentPwd lifecycleScope.launch { withContext(Dispatchers.IO) { - db.updateProject(project.id, null, null, currentPwd, null, project.type, null, null, null, null, null) + db.updateProject( + projId = project.id, + newPassword = currentPwd, + projectType = project.type + ) } } } if (!db.cowspentServerSyncHelper.editRemoteProject( - project.id, - newName, - newEmail, - if (pwdChanged) newPwd else null, - null, - editCallBack + projId = project.id, + newName = newName, + newEmail = newEmail, + newPassword = if (pwdChanged) newPwd else null, + callback = editCallBack ) ) { showToast(this, getString(R.string.remote_project_operation_no_network), Toast.LENGTH_LONG) @@ -124,10 +128,9 @@ class EditProjectActivity : AppCompatActivity() { lifecycleScope.launch { withContext(Dispatchers.IO) { db.updateProject( - project.id, null, null, currentPwd, - null, project.type, null, - null, null, - null, null + projId = project.id, + newPassword = currentPwd, + projectType = project.type ) } closeOnEdit(project.id) diff --git a/app/src/main/java/net/helcel/cowspent/persistence/CowspentSQLiteOpenHelper.kt b/app/src/main/java/net/helcel/cowspent/persistence/CowspentSQLiteOpenHelper.kt index e4b082e..dd8d076 100644 --- a/app/src/main/java/net/helcel/cowspent/persistence/CowspentSQLiteOpenHelper.kt +++ b/app/src/main/java/net/helcel/cowspent/persistence/CowspentSQLiteOpenHelper.kt @@ -271,12 +271,18 @@ class CowspentSQLiteOpenHelper private constructor(val context: Context) : } fun updateProject( - projId: Long, newName: String?, newEmail: String?, - newPassword: String?, newLastPayerId: Long?, - newLastSyncedTimestamp: Long?, - newCurrencyName: String?, newDeletionDisabled: Boolean?, - newMyAccessLevel: Int?, newBearerToken: String?, - newArchivedTs: Long? = null + projId: Long, + newName: String? = null, + newEmail: String? = null, + newPassword: String? = null, + newLastPayerId: Long? = null, + newLastSyncedTimestamp: Long? = null, + newCurrencyName: String? = null, + newDeletionDisabled: Boolean? = null, + newMyAccessLevel: Int? = null, + newBearerToken: String? = null, + newArchivedTs: Long? = null, + projectType: ProjectType? = null ) { val db = writableDatabase val values = ContentValues() @@ -290,47 +296,7 @@ class CowspentSQLiteOpenHelper private constructor(val context: Context) : if (newDeletionDisabled != null) values.put(key_deletionDisabled, if (newDeletionDisabled) 1 else 0) if (newMyAccessLevel != null) values.put(key_myAccessLevel, newMyAccessLevel) if (newArchivedTs != null) values.put(key_archived, newArchivedTs) - if (values.size() > 0) { - db.update(table_projects, values, "$key_id = ?", arrayOf(projId.toString())) - } - } - - fun updateProject( - projId: Long, newName: String?, newEmail: String?, - newPassword: String?, newLastPayerId: Long?, - projectType: ProjectType, newLastSyncedTimestamp: Long?, - newCurrencyName: String?, newDeletionDisabled: Boolean?, - newMyAccessLevel: Int?, newBearerToken: String?, - newArchivedTs: Long? = null - ) { - val db = writableDatabase - updateProject( - projId, newName, newEmail, newPassword, newLastPayerId, projectType, - newLastSyncedTimestamp, newCurrencyName, newDeletionDisabled, newMyAccessLevel, - newBearerToken, newArchivedTs, db - ) - } - - private fun updateProject( - projId: Long, newName: String?, newEmail: String?, - newPassword: String?, newLastPayerId: Long?, - projectType: ProjectType, newLastSyncedTimestamp: Long?, - newCurrencyName: String?, newDeletionDisabled: Boolean?, - newMyAccessLevel: Int?, newBearerToken: String?, - newArchivedTs: Long?, db: SQLiteDatabase - ) { - val values = ContentValues() - if (newName != null) values.put(key_name, newName) - if (newEmail != null) values.put(key_email, newEmail) - if (newPassword != null) SecureStorage.savePasswordSync(context, "ProjectPassword_$projId", newPassword) - if (newBearerToken != null) values.put(key_bearer_token, newBearerToken) - if (newLastPayerId != null) values.put(key_lastPayerId, newLastPayerId) - if (newLastSyncedTimestamp != null) values.put(key_lastSyncTimestamp, newLastSyncedTimestamp) - if (newCurrencyName != null) values.put(key_currencyName, newCurrencyName) - if (newDeletionDisabled != null) values.put(key_deletionDisabled, if (newDeletionDisabled) 1 else 0) - if (newMyAccessLevel != null) values.put(key_myAccessLevel, newMyAccessLevel) - if (newArchivedTs != null) values.put(key_archived, newArchivedTs) - values.put(key_type, projectType.id) + if (projectType != null) values.put(key_type, projectType.id) if (values.size() > 0) { db.update(table_projects, values, "$key_id = ?", arrayOf(projId.toString())) } diff --git a/app/src/main/java/net/helcel/cowspent/persistence/CowspentServerSyncHelper.kt b/app/src/main/java/net/helcel/cowspent/persistence/CowspentServerSyncHelper.kt index d6272ca..7b0fa37 100644 --- a/app/src/main/java/net/helcel/cowspent/persistence/CowspentServerSyncHelper.kt +++ b/app/src/main/java/net/helcel/cowspent/persistence/CowspentServerSyncHelper.kt @@ -817,10 +817,8 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen } dbHelper.updateProject( - project.id, null, null, - null, null, serverSyncTimestamp, - null, null, null, - null + projId = project.id, + newLastSyncedTimestamp = serverSyncTimestamp ) LoginStatus.OK } catch (_: ServerResponse.NotModifiedException) { @@ -935,11 +933,18 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen return isCospend && projUrl == accountUrl } - fun editRemoteProject(projId: Long, newName: String?, newEmail: String?, - newPassword: String?, newMainCurrencyName: String?, callback: ICallback): Boolean { + fun editRemoteProject( + projId: Long, + newName: String? = null, + newEmail: String? = null, + newPassword: String? = null, + newMainCurrencyName: String? = null, + newArchivedTs: Long? = null, + callback: ICallback + ): Boolean { updateNetworkStatus() if (isSyncPossible) { - EditRemoteProjectTask(projId, newName, newEmail, newPassword, newMainCurrencyName, callback).execute() + EditRemoteProjectTask(projId, newName, newEmail, newPassword, newMainCurrencyName, newArchivedTs, callback).execute() return true } return false @@ -951,6 +956,7 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen private val newEmail: String?, private val newPassword: String?, private val newMainCurrencyName: String?, + private val newArchivedTs: Long?, private val callback: ICallback ) { private val project: DBProject? = dbHelper.getProject(projId) @@ -985,7 +991,7 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen var status = LoginStatus.OK try { val response = client!!.editRemoteProject( - project!!, newName, newEmail, newPassword, newMainCurrencyName + project!!, newName, newEmail, newPassword, newMainCurrencyName, newArchivedTs ) if (BillsListViewActivity.DEBUG) { Log.i(TAG, "RESPONSE edit remote project : ${response.stringContent}") @@ -1025,8 +1031,11 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen } } else { dbHelper.updateProject( - project!!.id, newName, newEmail, newPassword, - null, null, null, null, null, null + projId = project!!.id, + newName = newName, + newEmail = newEmail, + newPassword = newPassword, + newArchivedTs = newArchivedTs ) } callback.onFinish(newName ?: "", errorString) diff --git a/app/src/main/java/net/helcel/cowspent/util/VersatileProjectSyncClient.kt b/app/src/main/java/net/helcel/cowspent/util/VersatileProjectSyncClient.kt index 1918ecb..3f232bb 100644 --- a/app/src/main/java/net/helcel/cowspent/util/VersatileProjectSyncClient.kt +++ b/app/src/main/java/net/helcel/cowspent/util/VersatileProjectSyncClient.kt @@ -114,7 +114,7 @@ class VersatileProjectSyncClient( @Throws(IOException::class, TokenMismatchException::class, NextcloudHttpRequestFailedException::class) fun editRemoteProject( project: DBProject, newName: String?, newEmail: String?, newPassword: String?, - newMainCurrencyName: String? + newMainCurrencyName: String?, newArchivedTs: Long? = null ): ServerResponse.EditRemoteProjectResponse { val paramKeys: MutableList = ArrayList() val paramValues: MutableList = ArrayList() @@ -130,6 +130,10 @@ class VersatileProjectSyncClient( paramKeys.add("password") paramValues.add(newPassword) } + if (newArchivedTs != null) { + paramKeys.add("archived_ts") + paramValues.add(newArchivedTs.toString()) + } var target: String var username: String? = null