From e4ebc2915e15c0959b2c9cbbc5f09af6369d610b Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Mon, 2 Jun 2025 19:43:58 +0600 Subject: [PATCH 1/4] chore: Improve code quality based on authState set Improve code quality where is the AuthState is setting up. issue: https://gitlab.e.foundation/e/os/backlog/-/issues/3293 --- .../at/bitfire/davdroid/settings/AccountSettings.kt | 4 ++-- .../at/bitfire/davdroid/syncadapter/AccountUtils.kt | 4 ++-- .../davdroid/syncadapter/ContactsSyncManager.kt | 2 +- .../DefaultAccountAuthenticatorService.kt | 3 +++ .../at/bitfire/davdroid/ui/ShowUrlActivity.kt | 2 +- .../davdroid/ui/setup/AccountDetailsFragment.kt | 12 +++++++----- .../ui/setup/DefaultLoginCredentialsFragment.kt | 6 +++--- .../davdroid/ui/setup/EeloAuthenticatorFragment.kt | 2 +- .../ui/setup/OpenIdAuthenticationViewModel.kt | 4 ++++ .../at/bitfire/davdroid/util/AuthStatePrefUtils.kt | 13 +++++++------ .../at/bitfire/davdroid/webdav/CredentialsStore.kt | 2 +- .../bitfire/davdroid/webdav/DavDocumentsProvider.kt | 4 ---- 12 files changed, 32 insertions(+), 26 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/settings/AccountSettings.kt b/app/src/main/kotlin/at/bitfire/davdroid/settings/AccountSettings.kt index c027c872c..f94002a38 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/settings/AccountSettings.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/settings/AccountSettings.kt @@ -158,7 +158,7 @@ class AccountSettings( } } - if (!cookies.isNullOrEmpty()) { + if (!cookies.isNullOrBlank()) { bundle.putString(COOKIE_KEY, cookies) } @@ -265,7 +265,7 @@ class AccountSettings( // authentication settings fun credentials(): Credentials { - return if (accountManager.getUserData(account, KEY_AUTH_STATE).isNullOrEmpty()) { + return if (accountManager.getUserData(account, KEY_AUTH_STATE).isNullOrBlank()) { Credentials( accountManager.getUserData(account, KEY_USERNAME), accountManager.getPassword(account), diff --git a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/AccountUtils.kt b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/AccountUtils.kt index 17dfd311e..50fb93e15 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/AccountUtils.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/AccountUtils.kt @@ -186,8 +186,8 @@ object AccountUtils { fun isLoggedInWithMurenaSso(context: Context, account: Account): Boolean { val accountManager = AccountManager.get(context) - val hasAuthStateData = accountManager.getUserData(account, AccountSettings.KEY_AUTH_STATE) != null - val isPasswordNull = accountManager.getPassword(account).isNullOrEmpty() + val hasAuthStateData = !accountManager.getUserData(account, AccountSettings.KEY_AUTH_STATE).isNullOrBlank() + val isPasswordNull = accountManager.getPassword(account).isNullOrBlank() return isPasswordNull && hasAuthStateData } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/ContactsSyncManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/ContactsSyncManager.kt index 33982fd44..56fff7b1d 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/ContactsSyncManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/ContactsSyncManager.kt @@ -409,7 +409,7 @@ class ContactsSyncManager( .get() .url(httpUrl) - if (!accessToken.isNullOrEmpty()) { + if (!accessToken.isNullOrBlank()) { requestBuilder.header("Authorization", "Bearer $accessToken") } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt index 16adca035..cf75304e5 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/DefaultAccountAuthenticatorService.kt @@ -182,6 +182,9 @@ abstract class DefaultAccountAuthenticatorService : Service(), OnAccountsUpdateL ): Bundle? { val accountManager = AccountManager.get(context) val authStateString = accountManager.getUserData(account, AccountSettings.KEY_AUTH_STATE) ?: return null + if (authStateString.isBlank()) { + return null + } val authState = AuthState.jsonDeserialize(authStateString) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/ShowUrlActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/ShowUrlActivity.kt index 728393835..1e7632601 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/ShowUrlActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/ShowUrlActivity.kt @@ -33,7 +33,7 @@ class ShowUrlActivity : AppCompatActivity() { val url = intent.getStringExtra(URL) - if (url.isNullOrEmpty()) { + if (url.isNullOrBlank()) { finish() return } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt index 9a92e7699..86853a8d6 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt @@ -226,7 +226,7 @@ class AccountDetailsFragment : Fragment() { private fun handlePostMurenaSsoMigrationOperations() { val authState = requireActivity().intent.getStringExtra(LoginActivity.AUTH_STATE) - val isMigratedToMurenaSso = !authState.isNullOrEmpty() + val isMigratedToMurenaSso = !authState.isNullOrBlank() if (isMigratedToMurenaSso) { stopMurenaSsoMigrationService() @@ -378,14 +378,16 @@ class AccountDetailsFragment : Fragment() { } } - if (!credentials?.authState?.accessToken.isNullOrEmpty()) { - accountManager.setAuthToken(account, Constants.AUTH_TOKEN_TYPE, credentials?.authState?.accessToken) + if (credentials?.authState != null && !credentials.authState.accessToken.isNullOrBlank()) { + accountManager.setAuthToken(account, Constants.AUTH_TOKEN_TYPE, + credentials.authState.accessToken + ) } var pass: String? = null - if (!credentials?.password.isNullOrEmpty()) { - pass = credentials?.password + if (!credentials?.password.isNullOrBlank()) { + pass = credentials.password } pass?.let { diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DefaultLoginCredentialsFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DefaultLoginCredentialsFragment.kt index b76cebe6c..5b65b4ec9 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DefaultLoginCredentialsFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/DefaultLoginCredentialsFragment.kt @@ -113,7 +113,7 @@ class DefaultLoginCredentialsFragment : Fragment() { fun validatePassword(): String? { model.passwordError.value = null val password = model.password.value - if (password.isNullOrEmpty()) { + if (password.isNullOrBlank()) { valid = false model.passwordError.value = getString(R.string.login_password_required) } @@ -149,7 +149,7 @@ class DefaultLoginCredentialsFragment : Fragment() { model.usernameError.value = null val username = model.username.value - if (username.isNullOrEmpty()) { + if (username.isNullOrBlank()) { valid = false model.usernameError.value = getString(R.string.login_user_name_required) } @@ -177,7 +177,7 @@ class DefaultLoginCredentialsFragment : Fragment() { val password = model.password.value if (model.loginUseUsernamePassword.value == true) { - if (username.isNullOrEmpty()) { + if (username.isNullOrBlank()) { valid = false model.usernameError.value = getString(R.string.login_user_name_required) } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt index 50d1b90e2..56c1d817e 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/EeloAuthenticatorFragment.kt @@ -192,7 +192,7 @@ class EeloAuthenticatorFragment : Fragment() { private fun computeDomain(username: CharSequence?) : String { var domain = "https://${Constants.EELO_SYNC_HOST}" - if (!username.isNullOrEmpty() && username.toString().contains("@")) { + if (!username.isNullOrBlank() && username.toString().contains("@")) { var dns = username.toString().substringAfter("@") if (dns == Constants.E_SYNC_URL) { dns = Constants.EELO_SYNC_HOST diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/OpenIdAuthenticationViewModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/OpenIdAuthenticationViewModel.kt index f777a8d80..bb2d794e4 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/OpenIdAuthenticationViewModel.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/OpenIdAuthenticationViewModel.kt @@ -84,6 +84,10 @@ class OpenIdAuthenticationViewModel(application: Application) : AndroidViewModel intent.getStringExtra(LoginActivity.AUTH_STATE) ?: return OpenIdAuthStateSetupState.SET_UP_FAILED + if (authStateString.isBlank()) { + return OpenIdAuthStateSetupState.SET_UP_FAILED + } + authState = AuthState.jsonDeserialize(authStateString) if (authState == null) { diff --git a/app/src/main/kotlin/at/bitfire/davdroid/util/AuthStatePrefUtils.kt b/app/src/main/kotlin/at/bitfire/davdroid/util/AuthStatePrefUtils.kt index 19ad813d7..a520c1d63 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/util/AuthStatePrefUtils.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/util/AuthStatePrefUtils.kt @@ -19,6 +19,7 @@ package at.bitfire.davdroid.util import android.accounts.Account import android.content.Context import android.content.SharedPreferences +import androidx.core.content.edit object AuthStatePrefUtils { @@ -26,9 +27,9 @@ object AuthStatePrefUtils { fun saveAuthState(context: Context, account: Account, value: String?) { val preferences = getSharedPref(context) - preferences.edit() - .putString(getKey(account), value) - .apply() + preferences.edit { + putString(getKey(account), value) + } } fun loadAuthState(context: Context, name: String, type: String): String? { @@ -38,9 +39,9 @@ object AuthStatePrefUtils { val authState = if (value.isNullOrBlank()) null else value authState.let { - preferences.edit() - .remove(key) - .apply() + preferences.edit { + remove(key) + } } return authState diff --git a/app/src/main/kotlin/at/bitfire/davdroid/webdav/CredentialsStore.kt b/app/src/main/kotlin/at/bitfire/davdroid/webdav/CredentialsStore.kt index 6f98426d2..4082ba897 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/webdav/CredentialsStore.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/webdav/CredentialsStore.kt @@ -44,7 +44,7 @@ class CredentialsStore(context: Context) { return null val authStateString = prefs.getString(keyName(mountId, AUTH_STATE), null) - val authState = if (authStateString != null) AuthState.jsonDeserialize(authStateString) else null + val authState = if (!authStateString.isNullOrBlank()) AuthState.jsonDeserialize(authStateString) else null return Credentials( prefs.getString(keyName(mountId, USER_NAME), null), diff --git a/app/src/main/kotlin/at/bitfire/davdroid/webdav/DavDocumentsProvider.kt b/app/src/main/kotlin/at/bitfire/davdroid/webdav/DavDocumentsProvider.kt index f2cc9ece2..42ec613a3 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/webdav/DavDocumentsProvider.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/webdav/DavDocumentsProvider.kt @@ -463,8 +463,6 @@ class DavDocumentsProvider: DocumentsProvider() { } val fileInfo = headResponseCache.get(doc) { - val accessToken = credentialsStore.getCredentials(doc.mountId)?.authState?.accessToken - val deferredFileInfo = executor.submit(HeadInfoDownloader(client, url)) signal?.setOnCancelListener { deferredFileInfo.cancel(true) @@ -481,8 +479,6 @@ class DavDocumentsProvider: DocumentsProvider() { (fileInfo.eTag != null || fileInfo.lastModified != null) && // we need a method to determine whether the document has changed during access fileInfo.supportsPartial != false // WebDAV server must support random access ) { - val accessToken = credentialsStore.getCredentials(doc.mountId)?.authState?.accessToken - val accessor = RandomAccessCallback.Wrapper(ourContext, client, url, doc.mimeType, fileInfo, signal) storageManager.openProxyFileDescriptor(modeFlags, accessor, accessor.workerHandler) } else { -- GitLab From 54b100fdbd4128271a8ddac58ee4268353460c26 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Mon, 2 Jun 2025 19:50:59 +0600 Subject: [PATCH 2/4] fix: revert the kotlin preference block --- .../at/bitfire/davdroid/util/AuthStatePrefUtils.kt | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/util/AuthStatePrefUtils.kt b/app/src/main/kotlin/at/bitfire/davdroid/util/AuthStatePrefUtils.kt index a520c1d63..19ad813d7 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/util/AuthStatePrefUtils.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/util/AuthStatePrefUtils.kt @@ -19,7 +19,6 @@ package at.bitfire.davdroid.util import android.accounts.Account import android.content.Context import android.content.SharedPreferences -import androidx.core.content.edit object AuthStatePrefUtils { @@ -27,9 +26,9 @@ object AuthStatePrefUtils { fun saveAuthState(context: Context, account: Account, value: String?) { val preferences = getSharedPref(context) - preferences.edit { - putString(getKey(account), value) - } + preferences.edit() + .putString(getKey(account), value) + .apply() } fun loadAuthState(context: Context, name: String, type: String): String? { @@ -39,9 +38,9 @@ object AuthStatePrefUtils { val authState = if (value.isNullOrBlank()) null else value authState.let { - preferences.edit { - remove(key) - } + preferences.edit() + .remove(key) + .apply() } return authState -- GitLab From 73d521d9d5ba1a885362f0effb2ce3e33c2171be Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Mon, 2 Jun 2025 19:57:52 +0600 Subject: [PATCH 3/4] fix: build --- .../at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt index 86853a8d6..395c2d0cb 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.kt @@ -378,16 +378,16 @@ class AccountDetailsFragment : Fragment() { } } - if (credentials?.authState != null && !credentials.authState.accessToken.isNullOrBlank()) { + if (credentials?.authState != null && !credentials?.authState?.accessToken.isNullOrBlank()) { accountManager.setAuthToken(account, Constants.AUTH_TOKEN_TYPE, - credentials.authState.accessToken + credentials?.authState?.accessToken ) } var pass: String? = null if (!credentials?.password.isNullOrBlank()) { - pass = credentials.password + pass = credentials?.password } pass?.let { -- GitLab From 132c9f72fee45e7f3768c0dfaa1994b46ea17d33 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Tue, 3 Jun 2025 22:30:18 +0600 Subject: [PATCH 4/4] chore: update nc-android-lib to v2.0.2-u2.17 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 03d288376..5c806d348 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -253,7 +253,7 @@ dependencies { implementation "commons-httpclient:commons-httpclient:3.1@jar" // remove after entire switch to lib v2 implementation 'org.apache.jackrabbit:jackrabbit-webdav:2.13.5' // remove after entire switch to lib v2 implementation 'com.google.code.gson:gson:2.10.1' - implementation("foundation.e:Nextcloud-Android-Library:2.0.1-u2.17-release") { + implementation("foundation.e:Nextcloud-Android-Library:2.0.2-u2.17-release") { exclude group: 'foundation.e.dav4jvm', module: 'dav4jvm' exclude group: 'com.gitlab.bitfireAT', module: 'dav4jvm' exclude group: 'org.ogce', module: 'xpp3' // unused in Android and brings wrong Junit version -- GitLab