From c0e517f62004865498d271b3dc76fced3fc0656f Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Wed, 15 Jul 2026 10:40:03 +0200 Subject: [PATCH 1/2] build(deps): bump com.android.tools.build:gradle from 8.7.2 to 9.2.1 Signed-off-by: Jorge Aguado Recio --- gradle.properties | 2 - gradle/libs.versions.toml | 10 +- gradle/wrapper/gradle-wrapper.properties | 2 +- owncloudApp/build.gradle | 80 ++---- .../android/media/MediaControlView.java | 52 ++-- .../shares/PublicShareDialogFragment.kt | 6 +- .../spaces/links/SetPasswordDialogFragment.kt | 6 +- .../ReceiveExternalFilesActivity.java | 33 ++- owncloudComLibrary/build.gradle | 11 +- owncloudData/build.gradle | 13 +- .../49.json | 248 ++++++------------ .../roommigrations/MigrationToDB29Test.kt | 6 +- .../roommigrations/MigrationToDB33Test.kt | 6 +- .../roommigrations/MigrationToDB35Test.kt | 6 +- .../roommigrations/MigrationToDB36Test.kt | 6 +- .../mapper/RemoteCapabilityMapper.kt | 9 +- .../capabilities/db/OCCapabilityEntity.kt | 10 +- owncloudDomain/build.gradle | 11 +- .../domain/capabilities/model/OCCapability.kt | 50 ++-- .../capabilities/model/OCCapabilityTest.kt | 6 +- owncloudTestUtil/build.gradle | 11 +- .../owncloud/android/testutil/OCCapability.kt | 6 +- 22 files changed, 229 insertions(+), 361 deletions(-) diff --git a/gradle.properties b/gradle.properties index 022f0d32f33..2516ecb8211 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,4 @@ -android.defaults.buildfeatures.buildconfig=true android.enableJetifier=true -android.nonFinalResIds=false android.nonTransitiveRClass=false android.useAndroidX=true org.gradle.jvmargs=-Xmx1536M diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a965f1c1cdb..58264908596 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -androidGradlePlugin = "8.7.2" +androidGradlePlugin = "9.2.1" androidxActivity = "1.6.1" androidxAnnotation = "1.6.0" androidxAppCompat = "1.6.1" @@ -15,8 +15,8 @@ androidxFragment = "1.5.7" androidxLegacy = "1.0.0" androidxLifecycle = "2.5.1" androidxLifecycleExtensions = "2.2.0" -androidxRoom = "2.5.1" -androidxSqlite = "2.3.1" +androidxRoom = "2.8.4" +androidxSqlite = "2.5.2" androidxTest = "1.4.0" androidxTestExt = "1.1.5" androidxTestMonitor = "1.6.1" @@ -33,9 +33,9 @@ glide = "4.15.1" glideToVectorYou = "v2.0.0" junit4 = "4.13.2" koin = "3.3.3" -kotlin = "1.9.20" +kotlin = "2.3.10" kotlinxCoroutines = "1.9.0" -ksp = "1.9.20-1.0.14" +ksp = "2.3.10" ktlint = "14.2.0" markwon = "4.6.2" material = "1.8.0" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 19cfad969ba..221c4f98228 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/owncloudApp/build.gradle b/owncloudApp/build.gradle index 273c44cc2f1..4f538140926 100644 --- a/owncloudApp/build.gradle +++ b/owncloudApp/build.gradle @@ -1,6 +1,5 @@ apply plugin: 'com.android.application' apply plugin: 'com.google.devtools.ksp' -apply plugin: 'kotlin-android' apply plugin: 'kotlin-parcelize' def commitSHA1 = 'COMMIT_SHA1' @@ -93,11 +92,11 @@ dependencies { } android { - compileSdkVersion sdkCompileVersion + compileSdk sdkCompileVersion defaultConfig { - minSdkVersion sdkMinVersion - targetSdkVersion sdkTargetVersion + minSdk sdkMinVersion + targetSdk sdkTargetVersion testInstrumentationRunner "com.owncloud.android.utils.OCTestAndroidJUnitRunner" @@ -113,10 +112,6 @@ android { targetCompatibility JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - sourceSets { androidTest.java.srcDirs += "src/test-common/java" test.java.srcDirs += "src/test-common/java" @@ -166,11 +161,6 @@ android { } } - applicationVariants.all { variant -> - def appName = System.env.OC_APP_NAME - setOutputFileName(variant, appName, project) - } - testOptions { packagingOptions { jniLibs { @@ -183,9 +173,10 @@ android { buildFeatures { viewBinding true + buildConfig true } - packagingOptions { + packaging { resources.excludes.add("META-INF/*") } @@ -194,50 +185,23 @@ android { } // Updates output file names of a given variant to format -// [appName].[variant.versionName].[OC_BUILD_NUMBER]-[variant.name].apk. -// -// OC_BUILD_NUMBER is an environment variable read directly in this method. If undefined, it's not added. -// -// @param variant Build variant instance which output file name will be updated. -// @param appName String to use as first part of the new file name. May be undefined, the original -// project.archivesBaseName property will be used instead. -// @param callerProject Caller project. - -def setOutputFileName(variant, appName, callerProject) { - logger.info("Setting new name for output of variant $variant.name") - - def originalFile = variant.outputs[0].outputFile - def originalName = originalFile.name - println "originalName is $originalName" - - def newName = "" - - if (appName) { - newName += appName - } else { - newName += "owncloud" - } - - def versionName = "$variant.mergedFlavor.versionName" - if (variant.mergedFlavor.manifestPlaceholders.versionName != null) { - versionName = "$variant.mergedFlavor.manifestPlaceholders.versionName" - } - if (variant.buildType.manifestPlaceholders.versionName != null) { - versionName = "$variant.buildType.manifestPlaceholders.versionName" - } - newName += "_$versionName" - - def buildNumber = System.env.OC_BUILD_NUMBER - if (buildNumber) { - newName += "_$buildNumber" - } - - newName += originalName.substring(callerProject.archivesBaseName.length()) - - println "$variant.name: newName is $newName" - - variant.outputs.all { - outputFileName = newName +// [appName].[variant.versionName].[OC_BUILD_NUMBER]-[variant.name].apk using the new AGP Variant API (androidComponents) +androidComponents { + onVariants(selector().all()) { variant -> + def appName = System.env.OC_APP_NAME ?: "owncloud" + def buildNumber = System.env.OC_BUILD_NUMBER + variant.outputs.each { output -> + if (output.outputType == com.android.build.api.variant.VariantOutputConfiguration.OutputType.SINGLE) { + output.outputFileName.set(output.versionName.map { versionName -> + def newName = appName + "_" + versionName + if (buildNumber) { + newName += "_" + buildNumber + } + newName += "-" + variant.name + ".apk" + newName + }) + } + } } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/media/MediaControlView.java b/owncloudApp/src/main/java/com/owncloud/android/media/MediaControlView.java index c2ae87da5a7..e459398a5ba 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/media/MediaControlView.java +++ b/owncloudApp/src/main/java/com/owncloud/android/media/MediaControlView.java @@ -4,7 +4,9 @@ * @author David A. Velasco * @author Christian Schabesberger * @author David González Verdugo - * Copyright (C) 2020 ownCloud GmbH. + * @author Jorge Aguado Recio + * + * Copyright (C) 2026 ownCloud GmbH. *

* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -292,32 +294,28 @@ public void setEnabled(boolean enabled) { public void onClick(View v) { int pos; boolean playing = mPlayer.isPlaying(); - switch (v.getId()) { - - case R.id.playBtn: - doPauseResume(); - break; - - case R.id.rewindBtn: - pos = mPlayer.getCurrentPosition(); - pos -= 5000; - mPlayer.seekTo(pos); - if (!playing) { - mPlayer.pause(); // necessary in some 2.3.x devices - } - setProgress(); - break; - - case R.id.forwardBtn: - pos = mPlayer.getCurrentPosition(); - pos += 15000; - mPlayer.seekTo(pos); - if (!playing) { - mPlayer.pause(); // necessary in some 2.3.x devices - } - setProgress(); - break; - + int id = v.getId(); + + // Using an if / else if / else block because Java switch statements + // with resource ID comparisons are no longer supported in AGP 9 + if (id == R.id.playBtn) { + doPauseResume(); + } else if (id == R.id.rewindBtn) { + pos = mPlayer.getCurrentPosition(); + pos -= 5000; + mPlayer.seekTo(pos); + if (!playing) { + mPlayer.pause(); // necessary in some 2.3.x devices + } + setProgress(); + } else if (id == R.id.forwardBtn) { + pos = mPlayer.getCurrentPosition(); + pos += 15000; + mPlayer.seekTo(pos); + if (!playing) { + mPlayer.pause(); // necessary in some 2.3.x devices + } + setProgress(); } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/sharing/shares/PublicShareDialogFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/sharing/shares/PublicShareDialogFragment.kt index 3853466b2e8..3defd0e45ab 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/sharing/shares/PublicShareDialogFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/sharing/shares/PublicShareDialogFragment.kt @@ -6,8 +6,9 @@ * @author Christian Schabesberger * @author Aitor Ballesteros Pavón * @author Juan Carlos Garrote Gascón + * @author Jorge Aguado Recio * - * Copyright (C) 2024 ownCloud GmbH. + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -50,6 +51,7 @@ import com.owncloud.android.R import com.owncloud.android.databinding.SharePublicDialogBinding import com.owncloud.android.domain.capabilities.model.CapabilityBooleanType import com.owncloud.android.domain.capabilities.model.OCCapability +import com.owncloud.android.domain.capabilities.model.PasswordPolicy import com.owncloud.android.domain.exceptions.UnhandledHttpCodeException import com.owncloud.android.domain.files.model.OCFile import com.owncloud.android.domain.sharing.shares.model.OCShare @@ -364,7 +366,7 @@ class PublicShareDialogFragment : DialogFragment() { } } - private fun updateRequirementsPasswordPolicy(password: String, passwordPolicy: OCCapability.PasswordPolicy) { + private fun updateRequirementsPasswordPolicy(password: String, passwordPolicy: PasswordPolicy) { var hasMinCharacters = true var hasMaxCharacters = true diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SetPasswordDialogFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SetPasswordDialogFragment.kt index c4ec3d50126..15025da1d1b 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SetPasswordDialogFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SetPasswordDialogFragment.kt @@ -37,7 +37,7 @@ import androidx.core.widget.doOnTextChanged import androidx.fragment.app.DialogFragment import com.owncloud.android.R import com.owncloud.android.databinding.SetPasswordDialogBinding -import com.owncloud.android.domain.capabilities.model.OCCapability +import com.owncloud.android.domain.capabilities.model.PasswordPolicy import com.owncloud.android.presentation.capabilities.CapabilityViewModel import com.owncloud.android.presentation.common.UIResult import com.owncloud.android.presentation.sharing.generatePassword @@ -57,7 +57,7 @@ class SetPasswordDialogFragment: DialogFragment() { private lateinit var setPasswordListener: SetPasswordListener - private var passwordPolicy: OCCapability.PasswordPolicy? = null + private var passwordPolicy: PasswordPolicy? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { _binding = SetPasswordDialogBinding.inflate(inflater, container, false) @@ -134,7 +134,7 @@ class SetPasswordDialogFragment: DialogFragment() { setPasswordListener.onCancelPassword() } - private fun updatePasswordPolicyRequirements(password: String, passwordPolicy: OCCapability.PasswordPolicy) { + private fun updatePasswordPolicyRequirements(password: String, passwordPolicy: PasswordPolicy) { var hasMinCharacters = true var hasMaxCharacters = true var hasUpperCase = true diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java index 8186f00a679..2d0af9aeca0 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java @@ -506,23 +506,22 @@ public void onItemClick(AdapterView parent, View view, int position, long id) @Override public void onClick(View v) { // click on button - switch (v.getId()) { - case R.id.uploader_choose_folder: - mUploadPath = ""; // first element in mParents is root dir, represented by ""; - // init mUploadPath with "/" results in a "//" prefix - for (String p : mParents) { - mUploadPath += p + File.separator; - } - if (!isPlainTextUpload()) { - Timber.d("Uploading file to dir %s", mUploadPath); - uploadFiles(); - } else { - showUploadTextDialog(); - } - break; - - default: - throw new IllegalArgumentException("Wrong element clicked"); + // Using an if / else if / else block because Java switch statements + // with resource ID comparisons are no longer supported in AGP 9 + if (v.getId() == R.id.uploader_choose_folder) { + mUploadPath = ""; // first element in mParents is root dir, represented by ""; + // init mUploadPath with "/" results in a "//" prefix + for (String p : mParents) { + mUploadPath += p + File.separator; + } + if (!isPlainTextUpload()) { + Timber.d("Uploading file to dir %s", mUploadPath); + uploadFiles(); + } else { + showUploadTextDialog(); + } + } else { + throw new IllegalArgumentException("Wrong element clicked"); } } diff --git a/owncloudComLibrary/build.gradle b/owncloudComLibrary/build.gradle index 3eae2deb971..24a945520be 100644 --- a/owncloudComLibrary/build.gradle +++ b/owncloudComLibrary/build.gradle @@ -1,5 +1,4 @@ apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' apply plugin: 'com.google.devtools.ksp' apply plugin: 'kotlin-parcelize' @@ -33,11 +32,11 @@ dependencies { } android { - compileSdkVersion sdkCompileVersion + compileSdk sdkCompileVersion defaultConfig { - minSdkVersion sdkMinVersion - targetSdkVersion sdkTargetVersion + minSdk sdkMinVersion + targetSdk sdkTargetVersion } compileOptions { @@ -45,10 +44,6 @@ android { targetCompatibility JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - lint { abortOnError false ignoreWarnings true diff --git a/owncloudData/build.gradle b/owncloudData/build.gradle index 7f50823a276..43d47d11110 100644 --- a/owncloudData/build.gradle +++ b/owncloudData/build.gradle @@ -1,13 +1,12 @@ apply plugin: 'com.android.library' apply plugin: 'com.google.devtools.ksp' -apply plugin: 'kotlin-android' android { - compileSdkVersion sdkCompileVersion + compileSdk sdkCompileVersion defaultConfig { - minSdkVersion sdkMinVersion - targetSdkVersion sdkTargetVersion + minSdk sdkMinVersion + targetSdk sdkTargetVersion testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -31,10 +30,6 @@ android { targetCompatibility JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - sourceSets { androidTest.java.srcDirs += "src/test-common/java" test.java.srcDirs += "src/test-common/java" @@ -42,7 +37,7 @@ android { androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) } - packagingOptions { + packaging { resources.excludes.add("META-INF/*") } diff --git a/owncloudData/schemas/com.owncloud.android.data.OwncloudDatabase/49.json b/owncloudData/schemas/com.owncloud.android.data.OwncloudDatabase/49.json index 94eb514764b..94855211980 100644 --- a/owncloudData/schemas/com.owncloud.android.data.OwncloudDatabase/49.json +++ b/owncloudData/schemas/com.owncloud.android.data.OwncloudDatabase/49.json @@ -23,8 +23,7 @@ { "fieldPath": "ext", "columnName": "ext", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "appProviders", @@ -35,32 +34,27 @@ { "fieldPath": "name", "columnName": "name", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "icon", "columnName": "icon", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "description", "columnName": "description", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "allowCreation", "columnName": "allow_creation", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "defaultApplication", "columnName": "default_application", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" } ], "primaryKey": { @@ -69,9 +63,7 @@ "account_name", "mime_type" ] - }, - "indices": [], - "foreignKeys": [] + } }, { "tableName": "folder_backup", @@ -128,8 +120,7 @@ { "fieldPath": "spaceId", "columnName": "spaceId", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "id", @@ -143,9 +134,7 @@ "columnNames": [ "id" ] - }, - "indices": [], - "foreignKeys": [] + } }, { "tableName": "capabilities", @@ -154,8 +143,7 @@ { "fieldPath": "accountName", "columnName": "account", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "versionMajor", @@ -178,14 +166,12 @@ { "fieldPath": "versionString", "columnName": "version_string", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "versionEdition", "columnName": "version_edition", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "corePollInterval", @@ -354,98 +340,82 @@ { "fieldPath": "appProviders.enabled", "columnName": "app_providers_enabled", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "appProviders.version", "columnName": "app_providers_version", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "appProviders.appsUrl", "columnName": "app_providers_appsUrl", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "appProviders.openUrl", "columnName": "app_providers_openUrl", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "appProviders.openWebUrl", "columnName": "app_providers_openWebUrl", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "appProviders.newUrl", "columnName": "app_providers_newUrl", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "spaces.enabled", "columnName": "spaces_enabled", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "spaces.projects", "columnName": "spaces_projects", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "spaces.shareJail", "columnName": "spaces_shareJail", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "spaces.hasMultiplePersonalSpaces", "columnName": "spaces_hasMultiplePersonalSpaces", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "passwordPolicy.maxCharacters", "columnName": "password_policy_maxCharacters", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "passwordPolicy.minCharacters", "columnName": "password_policy_minCharacters", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "passwordPolicy.minDigits", "columnName": "password_policy_minDigits", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "passwordPolicy.minLowercaseCharacters", "columnName": "password_policy_minLowercaseCharacters", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "passwordPolicy.minSpecialCharacters", "columnName": "password_policy_minSpecialCharacters", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "passwordPolicy.minUppercaseCharacters", "columnName": "password_policy_minUppercaseCharacters", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" } ], "primaryKey": { @@ -453,9 +423,7 @@ "columnNames": [ "id" ] - }, - "indices": [], - "foreignKeys": [] + } }, { "tableName": "files", @@ -464,8 +432,7 @@ { "fieldPath": "parentId", "columnName": "parentId", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "owner", @@ -482,8 +449,7 @@ { "fieldPath": "remoteId", "columnName": "remoteId", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "length", @@ -494,8 +460,7 @@ { "fieldPath": "creationTimestamp", "columnName": "creationTimestamp", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "modificationTimestamp", @@ -512,62 +477,52 @@ { "fieldPath": "etag", "columnName": "etag", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "permissions", "columnName": "permissions", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "privateLink", "columnName": "privateLink", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "storagePath", "columnName": "storagePath", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "name", "columnName": "name", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "treeEtag", "columnName": "treeEtag", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "availableOfflineStatus", "columnName": "keepInSync", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "lastSyncDateForData", "columnName": "lastSyncDateForData", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "lastUsage", "columnName": "lastUsage", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "fileShareViaLink", "columnName": "fileShareViaLink", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "needsToUpdateThumbnail", @@ -578,26 +533,22 @@ { "fieldPath": "modifiedAtLastSyncForData", "columnName": "modifiedAtLastSyncForData", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "etagInConflict", "columnName": "etagInConflict", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "fileIsDownloading", "columnName": "fileIsDownloading", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "sharedWithSharee", "columnName": "sharedWithSharee", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "sharedByLink", @@ -608,8 +559,7 @@ { "fieldPath": "spaceId", "columnName": "spaceId", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "id", @@ -624,7 +574,6 @@ "id" ] }, - "indices": [], "foreignKeys": [ { "table": "spaces", @@ -654,14 +603,12 @@ { "fieldPath": "uploadWorkerUuid", "columnName": "uploadWorkerUuid", - "affinity": "BLOB", - "notNull": false + "affinity": "BLOB" }, { "fieldPath": "downloadWorkerUuid", "columnName": "downloadWorkerUuid", - "affinity": "BLOB", - "notNull": false + "affinity": "BLOB" }, { "fieldPath": "isSynchronizing", @@ -676,7 +623,6 @@ "fileId" ] }, - "indices": [], "foreignKeys": [ { "table": "files", @@ -704,8 +650,7 @@ { "fieldPath": "shareWith", "columnName": "share_with", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "path", @@ -734,20 +679,17 @@ { "fieldPath": "token", "columnName": "token", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "sharedWithDisplayName", "columnName": "shared_with_display_name", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "sharedWithAdditionalInfo", "columnName": "share_with_additional_info", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "isFolder", @@ -770,14 +712,12 @@ { "fieldPath": "name", "columnName": "name", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "shareLink", "columnName": "url", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "id", @@ -791,9 +731,7 @@ "columnNames": [ "id" ] - }, - "indices": [], - "foreignKeys": [] + } }, { "tableName": "transfers", @@ -844,14 +782,12 @@ { "fieldPath": "transferEndTimestamp", "columnName": "transferEndTimestamp", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "lastResult", "columnName": "lastResult", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "createdBy", @@ -862,20 +798,17 @@ { "fieldPath": "transferId", "columnName": "transferId", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "spaceId", "columnName": "spaceId", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "sourcePath", "columnName": "sourcePath", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "id", @@ -889,9 +822,7 @@ "columnNames": [ "id" ] - }, - "indices": [], - "foreignKeys": [] + } }, { "tableName": "spaces", @@ -906,8 +837,7 @@ { "fieldPath": "driveAlias", "columnName": "drive_alias", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "driveType", @@ -924,8 +854,7 @@ { "fieldPath": "lastModifiedDateTime", "columnName": "last_modified_date_time", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "name", @@ -936,50 +865,42 @@ { "fieldPath": "ownerId", "columnName": "owner_id", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "webUrl", "columnName": "web_url", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "description", "columnName": "description", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "quota.remaining", "columnName": "quota_remaining", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "quota.state", "columnName": "quota_state", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "quota.total", "columnName": "quota_total", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "quota.used", "columnName": "quota_used", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "root.eTag", "columnName": "root_etag", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "root.id", @@ -996,14 +917,12 @@ { "fieldPath": "root.deleteState", "columnName": "root_deleted_state", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "root.role", "columnName": "space_role", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" } ], "primaryKey": { @@ -1012,9 +931,7 @@ "account_name", "space_id" ] - }, - "indices": [], - "foreignKeys": [] + } }, { "tableName": "spaces_special", @@ -1053,8 +970,7 @@ { "fieldPath": "lastModifiedDateTime", "columnName": "last_modified_date_time", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" }, { "fieldPath": "name", @@ -1088,7 +1004,6 @@ "special_id" ] }, - "indices": [], "foreignKeys": [ { "table": "spaces", @@ -1130,14 +1045,12 @@ { "fieldPath": "total", "columnName": "total", - "affinity": "INTEGER", - "notNull": false + "affinity": "INTEGER" }, { "fieldPath": "state", "columnName": "state", - "affinity": "TEXT", - "notNull": false + "affinity": "TEXT" } ], "primaryKey": { @@ -1145,12 +1058,9 @@ "columnNames": [ "accountName" ] - }, - "indices": [], - "foreignKeys": [] + } } ], - "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '608dd4806a3630dc41bcc6d380576fb6')" diff --git a/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB29Test.kt b/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB29Test.kt index 66ee3be1289..3e5ad7d4a60 100644 --- a/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB29Test.kt +++ b/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB29Test.kt @@ -2,7 +2,9 @@ * ownCloud Android client application * * @author Abel García de Prada - * Copyright (C) 2020 ownCloud GmbH. + * @author Jorge Aguado Recio + * + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -134,7 +136,7 @@ class MigrationToDB29Test : MigrationTest() { "file_source)" + " VALUES " + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - arrayOf( + arrayOf( OC_SHARE.shareType, OC_SHARE.shareWith, OC_SHARE.path, diff --git a/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB33Test.kt b/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB33Test.kt index b8b475c2769..2603b02300d 100644 --- a/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB33Test.kt +++ b/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB33Test.kt @@ -2,7 +2,9 @@ * ownCloud Android client application * * @author Abel García de Prada - * Copyright (C) 2020 ownCloud GmbH. + * @author Jorge Aguado Recio + * + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -104,7 +106,7 @@ class MigrationToDB33Test : MigrationTest() { "file_source)" + " VALUES " + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - arrayOf( + arrayOf( OC_SHARE.shareType, OC_SHARE.shareWith, OC_SHARE.path, diff --git a/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB35Test.kt b/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB35Test.kt index 7ac33097818..d6e501d2b61 100644 --- a/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB35Test.kt +++ b/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB35Test.kt @@ -2,7 +2,9 @@ * ownCloud Android client application * * @author Fernando Sanz Velasco - * Copyright (C) 2021 ownCloud GmbH. + * @author Jorge Aguado Recio + * + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -79,7 +81,7 @@ class MigrationToDB35Test : MigrationTest() { "lastSyncTimeStamp)" + " VALUES " + "(?, ?, ?, ?, ?, ?, ?)", - arrayOf( + arrayOf( OC_BACKUP.accountName, OC_BACKUP.behavior, OC_BACKUP.sourcePath, diff --git a/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB36Test.kt b/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB36Test.kt index 1e26d4afc00..efbbb61c8f8 100644 --- a/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB36Test.kt +++ b/owncloudData/src/androidTest/java/com/owncloud/android/data/roommigrations/MigrationToDB36Test.kt @@ -2,7 +2,9 @@ * ownCloud Android client application * * @author Fernando Sanz Velasco - * Copyright (C) 2021 ownCloud GmbH. + * @author Jorge Aguado Recio + * + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -98,7 +100,7 @@ class MigrationToDB36Test : MigrationTest() { "files_versioning)" + " VALUES " + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", - arrayOf( + arrayOf( OC_CAPABILITY.accountName, OC_CAPABILITY.versionMajor, OC_CAPABILITY.versionMinor, diff --git a/owncloudData/src/main/java/com/owncloud/android/data/capabilities/datasources/mapper/RemoteCapabilityMapper.kt b/owncloudData/src/main/java/com/owncloud/android/data/capabilities/datasources/mapper/RemoteCapabilityMapper.kt index 92a9da6a984..7b0d62c42b7 100644 --- a/owncloudData/src/main/java/com/owncloud/android/data/capabilities/datasources/mapper/RemoteCapabilityMapper.kt +++ b/owncloudData/src/main/java/com/owncloud/android/data/capabilities/datasources/mapper/RemoteCapabilityMapper.kt @@ -22,8 +22,11 @@ package com.owncloud.android.data.capabilities.datasources.mapper +import com.owncloud.android.domain.capabilities.model.AppProviders import com.owncloud.android.domain.capabilities.model.CapabilityBooleanType import com.owncloud.android.domain.capabilities.model.OCCapability +import com.owncloud.android.domain.capabilities.model.PasswordPolicy +import com.owncloud.android.domain.capabilities.model.Spaces import com.owncloud.android.domain.mappers.RemoteMapper import com.owncloud.android.lib.resources.status.RemoteCapability import com.owncloud.android.lib.resources.status.RemoteCapability.CapabilityBooleanType as RemoteCapabilityBooleanType @@ -124,11 +127,11 @@ class RemoteCapabilityMapper : RemoteMapper { } private fun RemoteCapability.RemoteAppProviders.toAppProviders() = - OCCapability.AppProviders(enabled, version, appsUrl, openUrl, openWebUrl, newUrl) + AppProviders(enabled, version, appsUrl, openUrl, openWebUrl, newUrl) private fun RemoteCapability.RemoteSpaces.toSpaces() = - OCCapability.Spaces(enabled, projects, shareJail, hasMultiplePersonalSpaces) + Spaces(enabled, projects, shareJail, hasMultiplePersonalSpaces) private fun RemoteCapability.RemotePasswordPolicy.toPasswordPolicy() = - OCCapability.PasswordPolicy(maxCharacters, minCharacters, minDigits, minLowercaseCharacters, minSpecialCharacters, minUppercaseCharacters) + PasswordPolicy(maxCharacters, minCharacters, minDigits, minLowercaseCharacters, minSpecialCharacters, minUppercaseCharacters) } diff --git a/owncloudData/src/main/java/com/owncloud/android/data/capabilities/db/OCCapabilityEntity.kt b/owncloudData/src/main/java/com/owncloud/android/data/capabilities/db/OCCapabilityEntity.kt index ead39e9dd38..1b679cc3c23 100644 --- a/owncloudData/src/main/java/com/owncloud/android/data/capabilities/db/OCCapabilityEntity.kt +++ b/owncloudData/src/main/java/com/owncloud/android/data/capabilities/db/OCCapabilityEntity.kt @@ -60,9 +60,11 @@ import com.owncloud.android.data.ProviderMeta.ProviderTableMeta.CAPABILITIES_VER import com.owncloud.android.data.ProviderMeta.ProviderTableMeta.CAPABILITIES_VERSION_MICRO import com.owncloud.android.data.ProviderMeta.ProviderTableMeta.CAPABILITIES_VERSION_MINOR import com.owncloud.android.data.ProviderMeta.ProviderTableMeta.CAPABILITIES_VERSION_STRING +import com.owncloud.android.domain.capabilities.model.AppProviders import com.owncloud.android.domain.capabilities.model.CapabilityBooleanType import com.owncloud.android.domain.capabilities.model.CapabilityBooleanType.Companion.capabilityBooleanTypeUnknownString -import com.owncloud.android.domain.capabilities.model.OCCapability +import com.owncloud.android.domain.capabilities.model.PasswordPolicy +import com.owncloud.android.domain.capabilities.model.Spaces /** * Represents one record of the Capabilities table. @@ -128,11 +130,11 @@ data class OCCapabilityEntity( @ColumnInfo(name = CAPABILITIES_FILES_PRIVATE_LINKS, defaultValue = capabilityBooleanTypeUnknownString) val filesPrivateLinks: Int, @Embedded(prefix = CAPABILITIES_APP_PROVIDERS_PREFIX) - val appProviders: OCCapability.AppProviders?, + val appProviders: AppProviders?, @Embedded(prefix = CAPABILITIES_SPACES_PREFIX) - val spaces: OCCapability.Spaces?, + val spaces: Spaces?, @Embedded(prefix = CAPABILITIES_PASSWORD_POLICY_PREFIX) - val passwordPolicy: OCCapability.PasswordPolicy?, + val passwordPolicy: PasswordPolicy?, ) { @PrimaryKey(autoGenerate = true) var id: Int = 0 diff --git a/owncloudDomain/build.gradle b/owncloudDomain/build.gradle index e547d68bcd2..9b43b3ad3e9 100644 --- a/owncloudDomain/build.gradle +++ b/owncloudDomain/build.gradle @@ -1,13 +1,12 @@ apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' apply plugin: 'kotlin-parcelize' android { - compileSdkVersion sdkCompileVersion + compileSdk sdkCompileVersion defaultConfig { - minSdkVersion sdkMinVersion - targetSdkVersion sdkTargetVersion + minSdk sdkMinVersion + targetSdk sdkTargetVersion } buildTypes { @@ -22,10 +21,6 @@ android { targetCompatibility JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - sourceSets { test.java.srcDirs += "src/test-common/java" } diff --git a/owncloudDomain/src/main/java/com/owncloud/android/domain/capabilities/model/OCCapability.kt b/owncloudDomain/src/main/java/com/owncloud/android/domain/capabilities/model/OCCapability.kt index 8ba78de369c..b63b5f8ed89 100644 --- a/owncloudDomain/src/main/java/com/owncloud/android/domain/capabilities/model/OCCapability.kt +++ b/owncloudDomain/src/main/java/com/owncloud/android/domain/capabilities/model/OCCapability.kt @@ -70,33 +70,33 @@ data class OCCapability( fun isSpacesAllowed(): Boolean = spaces?.enabled == true fun isSpacesProjectsAllowed(): Boolean = spaces?.projects == true - - data class AppProviders( - val enabled: Boolean, - val version: String, - val appsUrl: String?, - val openUrl: String?, - val openWebUrl: String?, - val newUrl: String?, - ) - - data class Spaces( - val enabled: Boolean, - val projects: Boolean, - val shareJail: Boolean?, - val hasMultiplePersonalSpaces: Boolean?, - ) - - data class PasswordPolicy( - val maxCharacters: Int?, - val minCharacters: Int?, - val minDigits: Int?, - val minLowercaseCharacters: Int?, - val minSpecialCharacters: Int?, - val minUppercaseCharacters: Int?, - ) } +data class AppProviders( + val enabled: Boolean, + val version: String, + val appsUrl: String?, + val openUrl: String?, + val openWebUrl: String?, + val newUrl: String?, +) + +data class Spaces( + val enabled: Boolean, + val projects: Boolean, + val shareJail: Boolean?, + val hasMultiplePersonalSpaces: Boolean?, +) + +data class PasswordPolicy( + val maxCharacters: Int?, + val minCharacters: Int?, + val minDigits: Int?, + val minLowercaseCharacters: Int?, + val minSpecialCharacters: Int?, + val minUppercaseCharacters: Int?, +) + /** * Enum for Boolean Type in capabilities, with values: * -1 - Unknown diff --git a/owncloudDomain/src/test/java/com/owncloud/android/domain/capabilities/model/OCCapabilityTest.kt b/owncloudDomain/src/test/java/com/owncloud/android/domain/capabilities/model/OCCapabilityTest.kt index 064ae3c411d..dd414c3f89b 100644 --- a/owncloudDomain/src/test/java/com/owncloud/android/domain/capabilities/model/OCCapabilityTest.kt +++ b/owncloudDomain/src/test/java/com/owncloud/android/domain/capabilities/model/OCCapabilityTest.kt @@ -2,7 +2,9 @@ * ownCloud Android client application * * @author Abel García de Prada - * Copyright (C) 2020 ownCloud GmbH. + * @author Jorge Aguado Recio + * + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -76,7 +78,7 @@ class OCCapabilityTest { @Test fun isOpenInWebAllowed() { - val item1 = OC_CAPABILITY.copy(filesAppProviders = OCCapability.AppProviders(true, "", null, null, "/open-with-web", null)) + val item1 = OC_CAPABILITY.copy(filesAppProviders = AppProviders(true, "", null, null, "/open-with-web", null)) assertTrue(item1.isOpenInWebAllowed()) val item2 = OC_CAPABILITY.copy(filesAppProviders = null) diff --git a/owncloudTestUtil/build.gradle b/owncloudTestUtil/build.gradle index 52a902d188f..4b017d8d712 100644 --- a/owncloudTestUtil/build.gradle +++ b/owncloudTestUtil/build.gradle @@ -1,12 +1,11 @@ apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' android { - compileSdkVersion sdkCompileVersion + compileSdk sdkCompileVersion defaultConfig { - minSdkVersion sdkMinVersion - targetSdkVersion sdkTargetVersion + minSdk sdkMinVersion + targetSdk sdkTargetVersion } compileOptions { @@ -14,10 +13,6 @@ android { targetCompatibility JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - buildTypes { release { minifyEnabled false diff --git a/owncloudTestUtil/src/main/java/com/owncloud/android/testutil/OCCapability.kt b/owncloudTestUtil/src/main/java/com/owncloud/android/testutil/OCCapability.kt index 7b66fa15a69..732df1ac03a 100644 --- a/owncloudTestUtil/src/main/java/com/owncloud/android/testutil/OCCapability.kt +++ b/owncloudTestUtil/src/main/java/com/owncloud/android/testutil/OCCapability.kt @@ -21,8 +21,10 @@ package com.owncloud.android.testutil +import com.owncloud.android.domain.capabilities.model.AppProviders import com.owncloud.android.domain.capabilities.model.CapabilityBooleanType import com.owncloud.android.domain.capabilities.model.OCCapability +import com.owncloud.android.domain.capabilities.model.Spaces val OC_CAPABILITY = OCCapability( @@ -61,7 +63,7 @@ val OC_CAPABILITY = ) val OC_CAPABILITY_WITH_FILES_APP_PROVIDERS = OC_CAPABILITY.copy( - filesAppProviders = OCCapability.AppProviders( + filesAppProviders = AppProviders( enabled = true, version = "1.1.1", appsUrl = "/app-url", @@ -72,7 +74,7 @@ val OC_CAPABILITY_WITH_FILES_APP_PROVIDERS = OC_CAPABILITY.copy( ) val OC_CAPABILITY_WITH_MULTIPERSONAL_ENABLED = OC_CAPABILITY.copy( - spaces = OCCapability.Spaces( + spaces = Spaces( enabled = true, projects = true, shareJail = null, From fd2837d5ede667b4e441b80e78a5223afd7804fb Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Wed, 15 Jul 2026 10:49:53 +0200 Subject: [PATCH 2/2] chore: add calens file Signed-off-by: Jorge Aguado Recio --- changelog/unreleased/4865 | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 changelog/unreleased/4865 diff --git a/changelog/unreleased/4865 b/changelog/unreleased/4865 new file mode 100644 index 00000000000..edc93418b32 --- /dev/null +++ b/changelog/unreleased/4865 @@ -0,0 +1,6 @@ +Change: Bump AGP from 8.7.2 to 9.2.1 + +Android Gradle Plugin (AGP) has been updated from version 8.7.2 to 9.2.1, along +with other dependencies required to build the app with this new version. + +https://github.com/owncloud/android/pull/4865