diff --git a/app/src/main/java/net/helcel/cowspent/android/account/AccountActivity.kt b/app/src/main/java/net/helcel/cowspent/android/account/AccountActivity.kt index 6fdd291..cb2ff09 100644 --- a/app/src/main/java/net/helcel/cowspent/android/account/AccountActivity.kt +++ b/app/src/main/java/net/helcel/cowspent/android/account/AccountActivity.kt @@ -38,6 +38,8 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import net.helcel.cowspent.R import net.helcel.cowspent.android.main.MainConstants +import net.helcel.cowspent.persistence.CowspentSQLiteOpenHelper +import net.helcel.cowspent.persistence.CowspentServerSyncHelper import net.helcel.cowspent.theme.ThemeUtils import net.helcel.cowspent.util.CospendClientUtil import net.helcel.cowspent.util.CospendClientUtil.LoginStatus @@ -188,6 +190,12 @@ class AccountActivity : AppCompatActivity() { } } + private fun startInitialAccountSync() { + if (!CowspentServerSyncHelper.isNextcloudAccountConfigured(applicationContext)) return + CowspentSQLiteOpenHelper.getInstance(applicationContext) + .cowspentServerSyncHelper.runAccountProjectsSync() + } + @Deprecated("Deprecated in Java") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) @@ -207,6 +215,8 @@ class AccountActivity : AppCompatActivity() { viewModel.serverUrl = ssoAccount.url viewModel.username = ssoAccount.userId + startInitialAccountSync() + val resultData = Intent() resultData.putExtra(MainConstants.CREDENTIALS_CHANGED, CREDENTIALS_CHANGED) setResult(RESULT_OK, resultData) @@ -312,6 +322,8 @@ class AccountActivity : AppCompatActivity() { remove(SETTINGS_KEY_LAST_MODIFIED) } + startInitialAccountSync() + val data = Intent() data.putExtra(MainConstants.CREDENTIALS_CHANGED, CREDENTIALS_CHANGED) setResult(RESULT_OK, data) diff --git a/app/src/main/java/net/helcel/cowspent/android/account/AccountViewModel.kt b/app/src/main/java/net/helcel/cowspent/android/account/AccountViewModel.kt index c08b63f..3962f97 100644 --- a/app/src/main/java/net/helcel/cowspent/android/account/AccountViewModel.kt +++ b/app/src/main/java/net/helcel/cowspent/android/account/AccountViewModel.kt @@ -2,6 +2,7 @@ package net.helcel.cowspent.android.account import android.app.Application import android.content.SharedPreferences +import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue @@ -12,6 +13,7 @@ import androidx.preference.PreferenceManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import net.helcel.cowspent.persistence.CowspentSQLiteOpenHelper import net.helcel.cowspent.util.CospendClientUtil import net.helcel.cowspent.util.SecureStorage @@ -88,8 +90,28 @@ class AccountViewModel(application: Application) : AndroidViewModel(application) } } + private fun forgetProjectsTheAccountProvided() { + try { + val db = CowspentSQLiteOpenHelper.getInstance(getApplication()) + val offered = db.accountProjects + val cospendPath = "/index.php/apps/cospend" + for (project in db.projects) { + val matches = offered.any { + it.remoteId == project.remoteId && + project.serverUrl?.replace("/+$".toRegex(), "") == + it.ncUrl.replace("/+$".toRegex(), "") + cospendPath + } + if (matches) db.deleteProject(project.id) + } + db.clearAccountProjects() + } catch (e: Exception) { + Log.e("AccountViewModel", "Could not remove the account's projects on logout", e) + } + } + fun logout() { viewModelScope.launch { + withContext(Dispatchers.IO) { forgetProjectsTheAccountProvided() } SecureStorage.removePassword(getApplication(), AccountActivity.SETTINGS_PASSWORD) } preferences.edit { diff --git a/app/src/main/java/net/helcel/cowspent/android/settings/PreferencesActivity.kt b/app/src/main/java/net/helcel/cowspent/android/settings/PreferencesActivity.kt index 623c2fd..40dffef 100644 --- a/app/src/main/java/net/helcel/cowspent/android/settings/PreferencesActivity.kt +++ b/app/src/main/java/net/helcel/cowspent/android/settings/PreferencesActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.activity.OnBackPressedCallback import androidx.activity.enableEdgeToEdge import androidx.activity.compose.setContent +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf @@ -25,6 +26,14 @@ import net.helcel.cowspent.util.ColorUtils */ class PreferencesActivity : AppCompatActivity() { + private val accountLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { result -> + if (result.resultCode == RESULT_OK) { + setResult(RESULT_OK, result.data) + } + } + override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) @@ -59,7 +68,7 @@ class PreferencesActivity : AppCompatActivity() { SettingsScreen( onBack = { NavUtils.navigateUpFromSameTask(this) }, onAccountSettingsClick = { - startActivity(Intent(this, AccountActivity::class.java)) + accountLauncher.launch(Intent(this, AccountActivity::class.java)) }, onAboutClick = { startActivity(Intent(this, AboutActivity::class.java))