소스 검색

Merge remote-tracking branch 'origin/jtr/fix-10040' into jtr/fix-10040

tobiasKaminsky 7 달 전
부모
커밋
04ab8f0347
76개의 변경된 파일278개의 추가작업 그리고 109개의 파일을 삭제
  1. 4 4
      app/build.gradle
  2. 4 0
      app/lint.xml
  3. 2 2
      app/src/androidTest/java/com/owncloud/android/AbstractIT.java
  4. 1 1
      app/src/androidTest/java/com/owncloud/android/UploadIT.java
  5. 0 2
      app/src/main/AndroidManifest.xml
  6. 15 8
      app/src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java
  7. 13 0
      app/src/main/java/com/nextcloud/client/database/typeAdapter/OfflineOperationTypeAdapter.kt
  8. 0 1
      app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt
  9. 0 4
      app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt
  10. 7 9
      app/src/main/java/com/nextcloud/client/jobs/FilesExportWork.kt
  11. 17 0
      app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsWorker.kt
  12. 2 1
      app/src/main/java/com/nextcloud/client/onboarding/OnboardingServiceImpl.kt
  13. 9 1
      app/src/main/java/com/nextcloud/model/OfflineOperationType.kt
  14. 4 1
      app/src/main/java/com/nmc/android/ui/LauncherActivity.kt
  15. 3 4
      app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
  16. 29 0
      app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java
  17. 3 1
      app/src/main/java/com/owncloud/android/files/FileMenuFilter.java
  18. 1 1
      app/src/main/java/com/owncloud/android/operations/CreateShareWithShareeOperation.java
  19. 2 1
      app/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java
  20. 4 1
      app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java
  21. 1 1
      app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt
  22. 1 1
      app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
  23. 1 1
      app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java
  24. 2 1
      app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt
  25. 10 5
      app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.kt
  26. 4 2
      app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt
  27. 2 2
      app/src/main/java/third_parties/sufficientlysecure/CalendarSource.java
  28. 1 1
      app/src/main/java/third_parties/sufficientlysecure/ProcessVEvent.java
  29. 1 1
      app/src/main/java/third_parties/sufficientlysecure/SaveCalendar.java
  30. 18 1
      app/src/main/res/values-ar/strings.xml
  31. 10 1
      app/src/main/res/values-b+en+001/strings.xml
  32. 0 1
      app/src/main/res/values-bg-rBG/strings.xml
  33. 0 1
      app/src/main/res/values-ca/strings.xml
  34. 0 1
      app/src/main/res/values-cs-rCZ/strings.xml
  35. 0 1
      app/src/main/res/values-da/strings.xml
  36. 10 1
      app/src/main/res/values-de/strings.xml
  37. 0 1
      app/src/main/res/values-el/strings.xml
  38. 0 1
      app/src/main/res/values-es-rAR/strings.xml
  39. 0 1
      app/src/main/res/values-es-rEC/strings.xml
  40. 0 1
      app/src/main/res/values-es-rMX/strings.xml
  41. 0 1
      app/src/main/res/values-es/strings.xml
  42. 0 1
      app/src/main/res/values-eu/strings.xml
  43. 0 1
      app/src/main/res/values-fa/strings.xml
  44. 0 1
      app/src/main/res/values-fr/strings.xml
  45. 16 1
      app/src/main/res/values-ga/strings.xml
  46. 10 1
      app/src/main/res/values-gl/strings.xml
  47. 0 1
      app/src/main/res/values-hu-rHU/strings.xml
  48. 0 1
      app/src/main/res/values-in/strings.xml
  49. 0 1
      app/src/main/res/values-is/strings.xml
  50. 0 1
      app/src/main/res/values-it/strings.xml
  51. 0 1
      app/src/main/res/values-ja-rJP/strings.xml
  52. 0 1
      app/src/main/res/values-ka/strings.xml
  53. 0 1
      app/src/main/res/values-ko/strings.xml
  54. 0 1
      app/src/main/res/values-nb-rNO/strings.xml
  55. 0 1
      app/src/main/res/values-nl/strings.xml
  56. 0 1
      app/src/main/res/values-pl/strings.xml
  57. 0 1
      app/src/main/res/values-pt-rBR/strings.xml
  58. 0 1
      app/src/main/res/values-pt-rPT/strings.xml
  59. 0 1
      app/src/main/res/values-ro/strings.xml
  60. 0 1
      app/src/main/res/values-ru/strings.xml
  61. 0 1
      app/src/main/res/values-sk-rSK/strings.xml
  62. 0 1
      app/src/main/res/values-sl/strings.xml
  63. 0 1
      app/src/main/res/values-sr/strings.xml
  64. 10 1
      app/src/main/res/values-sv/strings.xml
  65. 10 1
      app/src/main/res/values-tr/strings.xml
  66. 0 1
      app/src/main/res/values-ug/strings.xml
  67. 14 1
      app/src/main/res/values-uk/strings.xml
  68. 0 1
      app/src/main/res/values-zh-rCN/strings.xml
  69. 8 1
      app/src/main/res/values-zh-rHK/strings.xml
  70. 8 1
      app/src/main/res/values-zh-rTW/strings.xml
  71. 1 1
      app/src/main/res/values/strings.xml
  72. 1 1
      app/src/main/res/values/styles.xml
  73. 9 4
      app/src/test/java/com/nextcloud/client/onboarding/OnboardingServiceTest.kt
  74. 1 1
      build.gradle
  75. 7 0
      gradle/verification-metadata.xml
  76. 2 4
      scripts/analysis/analysis-wrapper.sh

+ 4 - 4
app/build.gradle

@@ -16,7 +16,7 @@ import org.gradle.internal.jvm.Jvm
 buildscript {
     dependencies {
         classpath "com.android.tools.build:gradle:$androidPluginVersion"
-        classpath 'com.github.spotbugs.snom:spotbugs-gradle-plugin:6.0.25'
+        classpath 'com.github.spotbugs.snom:spotbugs-gradle-plugin:6.0.26'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
         classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.7"
         classpath "commons-httpclient:commons-httpclient:3.1@jar" // remove after entire switch to lib v2
@@ -269,7 +269,7 @@ dependencies {
     }
 
     // Jetpack Compose
-    implementation(platform("androidx.compose:compose-bom:2024.10.00"))
+    implementation(platform("androidx.compose:compose-bom:2024.10.01"))
     implementation("androidx.compose.ui:ui")
     implementation("androidx.compose.ui:ui-graphics")
     implementation("androidx.compose.material3:material3")
@@ -280,7 +280,7 @@ dependencies {
     // remove after entire switch to lib v2
     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 'androidx.constraintlayout:constraintlayout:2.1.4'
+    implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
     implementation 'androidx.legacy:legacy-support-v4:1.0.0'
     implementation 'com.google.android.material:material:1.12.0'
     implementation 'com.jakewharton:disklrucache:2.0.2'
@@ -310,7 +310,7 @@ dependencies {
         exclude group: "com.android.support"
     }
     implementation 'com.caverock:androidsvg:1.4'
-    implementation 'androidx.annotation:annotation:1.9.0'
+    implementation 'androidx.annotation:annotation:1.9.1'
     implementation 'com.vanniktech:emoji-google:0.21.0'
     implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.6")
 

+ 4 - 0
app/lint.xml

@@ -34,6 +34,10 @@
     <issue id="UnusedQuantity">
         <ignore path="**/values-**/strings.xml" />
     </issue>
+    
+    <issue id="StringFormatCount">
+        <ignore path="**/values-**/strings.xml" />
+    </issue>
 
     <issue id="ExtraTranslation">
         <ignore path="**/strings.xml"/>

+ 2 - 2
app/src/androidTest/java/com/owncloud/android/AbstractIT.java

@@ -183,7 +183,7 @@ public abstract class AbstractIT {
         String darkModeParameter = arguments.getString("DARKMODE");
 
         if (darkModeParameter != null) {
-            if (darkModeParameter.equalsIgnoreCase("dark")) {
+            if ("dark".equalsIgnoreCase(darkModeParameter)) {
                 DARK_MODE = "dark";
                 AppPreferencesImpl.fromContext(targetContext).setDarkThemeMode(DarkMode.DARK);
                 MainApp.setAppTheme(DarkMode.DARK);
@@ -192,7 +192,7 @@ public abstract class AbstractIT {
             }
         }
 
-        if (DARK_MODE.equalsIgnoreCase("light") && COLOR.equalsIgnoreCase("blue")) {
+        if ("light".equalsIgnoreCase(DARK_MODE) && "blue".equalsIgnoreCase(COLOR)) {
             // use already existing names
             DARK_MODE = "";
             COLOR = "";

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/UploadIT.java

@@ -515,7 +515,7 @@ public class UploadIT extends AbstractOnServerIT {
 
         OCFile ocFile = null;
         for (OCFile f : files) {
-            if (f.getFileName().equals("metadata.jpg")) {
+            if ("metadata.jpg".equals(f.getFileName())) {
                 ocFile = f;
                 break;
             }

+ 0 - 2
app/src/main/AndroidManifest.xml

@@ -9,7 +9,6 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">
 
-    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
     <uses-permission android:name="android.permission.READ_CALENDAR" />
@@ -53,7 +52,6 @@
     must request the FOREGROUND_SERVICE permission
     -->
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- Runtime permissions introduced in Android 13 (API level 33) -->
-    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
     <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
     <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- Needed for Android 14 (API level 34) -->
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />

+ 15 - 8
app/src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java

@@ -1,7 +1,7 @@
 /*
  * Nextcloud - Android Client
  *
- * SPDX-FileCopyrightText: 2023 TSI-mc
+ * SPDX-FileCopyrightText: 2023-2024 TSI-mc <surinder.kumar@t-systems.com>
  * SPDX-FileCopyrightText: 2019 Chris Narkiewicz <hello@ezaquarii.com>
  * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
  */
@@ -19,8 +19,10 @@ import android.content.SharedPreferences;
 import android.preference.PreferenceManager;
 import android.text.TextUtils;
 
+import com.nextcloud.client.onboarding.FirstRunActivity;
 import com.nextcloud.common.NextcloudClient;
 import com.nextcloud.utils.extensions.AccountExtensionsKt;
+import com.nmc.android.ui.LauncherActivity;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AuthenticatorActivity;
@@ -179,19 +181,20 @@ public class UserAccountManagerImpl implements UserAccountManager {
      */
     @Nullable
     private User createUserFromAccount(@NonNull Account account) {
-        if (AccountExtensionsKt.isAnonymous(account, context)) {
+        Context safeContext = context != null ? context : MainApp.getAppContext();
+        if (safeContext == null) {
+            Log_OC.e(TAG, "Unable to obtain a valid context");
             return null;
         }
 
-        if (context == null) {
-            Log_OC.d(TAG, "Context is null MainApp.getAppContext() used");
-            context = MainApp.getAppContext();
+        if (AccountExtensionsKt.isAnonymous(account, safeContext)) {
+            return null;
         }
 
         OwnCloudAccount ownCloudAccount;
         try {
-            ownCloudAccount = new OwnCloudAccount(account, context);
-        } catch (AccountUtils.AccountNotFoundException ex) {
+            ownCloudAccount = new OwnCloudAccount(account, safeContext);
+        } catch (Exception ex) {
             return null;
         }
 
@@ -211,7 +214,7 @@ public class UserAccountManagerImpl implements UserAccountManager {
          */
         String serverAddressStr = accountManager.getUserData(account, AccountUtils.Constants.KEY_OC_BASE_URL);
         if (serverAddressStr == null || serverAddressStr.isEmpty()) {
-            return AnonymousUser.fromContext(context);
+            return AnonymousUser.fromContext(safeContext);
         }
         URI serverUri = URI.create(serverAddressStr); // TODO: validate
 
@@ -397,6 +400,10 @@ public class UserAccountManagerImpl implements UserAccountManager {
 
     @Override
     public void startAccountCreation(final Activity activity) {
+
+        // skipping AuthenticatorActivity redirection when user is on Launcher or FirstRun Activity
+        if (activity instanceof LauncherActivity || activity instanceof FirstRunActivity) return;
+
         Intent intent = new Intent(context, AuthenticatorActivity.class);
 
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

+ 13 - 0
app/src/main/java/com/nextcloud/client/database/typeAdapter/OfflineOperationTypeAdapter.kt

@@ -40,8 +40,15 @@ class OfflineOperationTypeAdapter : JsonSerializer<OfflineOperationType>, JsonDe
                 jsonObject.addProperty("mimeType", src.mimeType)
             }
 
+            is OfflineOperationType.RenameFile -> {
+                jsonObject.addProperty("type", src.type)
+                jsonObject.addProperty("ocFileId", src.ocFileId)
+                jsonObject.addProperty("newName", src.newName)
+            }
+
             null -> Unit
         }
+
         return jsonObject
     }
 
@@ -65,6 +72,12 @@ class OfflineOperationTypeAdapter : JsonSerializer<OfflineOperationType>, JsonDe
                 jsonObject.get("mimeType").asString
             )
 
+            OfflineOperationRawType.RenameFile.name -> OfflineOperationType.RenameFile(
+                jsonObject.get("type").asString,
+                jsonObject.get("ocFileId").asLong,
+                jsonObject.get("newName").asString
+            )
+
             else -> null
         }
     }

+ 0 - 1
app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt

@@ -173,5 +173,4 @@ interface BackgroundJobManager {
     fun startOfflineOperations()
     fun startPeriodicallyOfflineOperation()
     fun scheduleInternal2WaySync(intervalMinutes: Long)
-    fun cancelInternal2WaySyncJob()
 }

+ 0 - 4
app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt

@@ -711,8 +711,4 @@ internal class BackgroundJobManagerImpl(
 
         workManager.enqueueUniquePeriodicWork(JOB_INTERNAL_TWO_WAY_SYNC, ExistingPeriodicWorkPolicy.UPDATE, request)
     }
-
-    override fun cancelInternal2WaySyncJob() {
-        workManager.cancelJob(JOB_INTERNAL_TWO_WAY_SYNC)
-    }
 }

+ 7 - 9
app/src/main/java/com/nextcloud/client/jobs/FilesExportWork.kt

@@ -57,6 +57,8 @@ class FilesExportWork(
     }
 
     private fun exportFiles(fileIDs: LongArray): Int {
+        val fileDownloadHelper = FileDownloadHelper.instance()
+
         var successfulExports = 0
         fileIDs
             .asSequence()
@@ -76,7 +78,11 @@ class FilesExportWork(
                         showErrorNotification(successfulExports)
                     }
                 } else {
-                    downloadFile(ocFile)
+                    fileDownloadHelper.downloadFile(
+                        user,
+                        ocFile,
+                        downloadType = DownloadType.EXPORT
+                    )
                 }
 
                 successfulExports++
@@ -95,14 +101,6 @@ class FilesExportWork(
         )
     }
 
-    private fun downloadFile(ocFile: OCFile) {
-        FileDownloadHelper.instance().downloadFile(
-            user,
-            ocFile,
-            downloadType = DownloadType.EXPORT
-        )
-    }
-
     private fun showErrorNotification(successfulExports: Int) {
         val message = if (successfulExports == 0) {
             appContext.resources.getQuantityString(R.plurals.export_failed, successfulExports, successfulExports)

+ 17 - 0
app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsWorker.kt

@@ -25,6 +25,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult
 import com.owncloud.android.lib.common.utils.Log_OC
 import com.owncloud.android.lib.resources.files.UploadFileRemoteOperation
 import com.owncloud.android.operations.CreateFolderOperation
+import com.owncloud.android.operations.RenameFileOperation
 import com.owncloud.android.utils.theme.ViewThemeUtils
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.NonCancellable
@@ -98,6 +99,7 @@ class OfflineOperationsWorker(
             Result.success()
         } catch (e: Exception) {
             Log_OC.d(TAG, "OfflineOperationsWorker terminated: $e")
+            notificationManager.dismissNotification()
             Result.failure()
         }
     }
@@ -146,6 +148,21 @@ class OfflineOperationsWorker(
                 createFileOperation.execute(client) to createFileOperation
             }
 
+            is OfflineOperationType.RenameFile -> {
+                val renameFileOperation = withContext(NonCancellable) {
+                    val operationType = (operation.type as OfflineOperationType.RenameFile)
+                    fileDataStorageManager.getFileById(operationType.ocFileId)?.remotePath?.let { updatedRemotePath ->
+                        RenameFileOperation(
+                            updatedRemotePath,
+                            operationType.newName,
+                            fileDataStorageManager
+                        )
+                    }
+                }
+
+                renameFileOperation?.execute(client) to renameFileOperation
+            }
+
             else -> {
                 Log_OC.d(TAG, "Unsupported operation type: ${operation.type}")
                 null

+ 2 - 1
app/src/main/java/com/nextcloud/client/onboarding/OnboardingServiceImpl.kt

@@ -2,6 +2,7 @@
  * Nextcloud - Android Client
  *
  * SPDX-FileCopyrightText: 2019 Chris Narkiewicz <hello@ezaquarii.com>
+ * SPDX-FileCopyrightText: 2024 TSI-mc <surinder.kumar@t-systems.com>
  * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
  */
 package com.nextcloud.client.onboarding
@@ -42,7 +43,7 @@ internal class OnboardingServiceImpl constructor(
 
     override val isFirstRun: Boolean
         get() {
-            return accountProvider.currentAccount == null
+            return accountProvider.user.isAnonymous
         }
 
     override fun shouldShowWhatsNew(callingContext: Context): Boolean {

+ 9 - 1
app/src/main/java/com/nextcloud/model/OfflineOperationType.kt

@@ -11,15 +11,23 @@ sealed class OfflineOperationType {
     abstract val type: String
 
     data class CreateFolder(override val type: String, var path: String) : OfflineOperationType()
+
     data class CreateFile(
         override val type: String,
         val localPath: String,
         var remotePath: String,
         val mimeType: String
     ) : OfflineOperationType()
+
+    data class RenameFile(
+        override val type: String,
+        var ocFileId: Long,
+        val newName: String
+    ) : OfflineOperationType()
 }
 
 enum class OfflineOperationRawType {
     CreateFolder,
-    CreateFile
+    CreateFile,
+    RenameFile
 }

+ 4 - 1
app/src/main/java/com/nmc/android/ui/LauncherActivity.kt

@@ -3,7 +3,7 @@
  *
  * SPDX-FileCopyrightText: 2023 Alper Ozturk <alper.ozturk@nextcloud.com>
  * SPDX-FileCopyrightText: 2023 Andy Scherzinger <info@andy-scherzinger.de>
- * SPDX-FileCopyrightText: 2023 TSI-mc
+ * SPDX-FileCopyrightText: 2023-2024 TSI-mc <surinder.kumar@t-systems.com>
  * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
  */
 package com.nmc.android.ui
@@ -18,6 +18,7 @@ import androidx.annotation.VisibleForTesting
 import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
 import com.nextcloud.client.preferences.AppPreferences
 import com.owncloud.android.R
+import com.owncloud.android.authentication.AuthenticatorActivity
 import com.owncloud.android.databinding.ActivitySplashBinding
 import com.owncloud.android.ui.activity.BaseActivity
 import com.owncloud.android.ui.activity.FileDisplayActivity
@@ -65,6 +66,8 @@ class LauncherActivity : BaseActivity() {
         Handler(Looper.getMainLooper()).postDelayed({
             if (user.isPresent) {
                 startActivity(Intent(this, FileDisplayActivity::class.java))
+            } else {
+                startActivity(Intent(this, AuthenticatorActivity::class.java))
             }
             finish()
         }, SPLASH_DURATION)

+ 3 - 4
app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java

@@ -1,7 +1,7 @@
 /*
  * Nextcloud - Android Client
  *
- * SPDX-FileCopyrightText: 2023 TSI-mc
+ * SPDX-FileCopyrightText: 2023-2024 TSI-mc <surinder.kumar@t-systems.com>
  * SPDX-FileCopyrightText: 2019-2021 Tobias Kaminsky <tobias@kaminsky.me>
  * SPDX-FileCopyrightText: 2018 Andy Scherzinger <info@andy-scherzinger>
  * SPDX-FileCopyrightText: 2017 Mario Danic <mario@lovelyhq.com>
@@ -1364,14 +1364,13 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
     }
 
     private void endSuccess() {
-        if (onlyAdd) {
-            finish();
-        } else {
+        if (!onlyAdd) {
             Intent i = new Intent(this, FileDisplayActivity.class);
             i.setAction(FileDisplayActivity.RESTART);
             i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             startActivity(i);
         }
+        finish();
     }
 
     private void getUserCapabilitiesAndFinish() {

+ 29 - 0
app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java

@@ -217,6 +217,35 @@ public class FileDataStorageManager {
         offlineOperationsRepository.deleteOperation(file);
     }
 
+    public void addRenameFileOfflineOperation(OCFile file, String newName) {
+        OfflineOperationEntity entity = new OfflineOperationEntity();
+
+        entity.setFilename(newName);
+        entity.setParentOCFileId(file.getParentId());
+
+        OfflineOperationType operationType = new OfflineOperationType.RenameFile(OfflineOperationRawType.RenameFile.name(), file.getFileId(), newName);
+        entity.setType(operationType);
+        entity.setPath(file.getDecryptedRemotePath());
+
+        long createdAt = System.currentTimeMillis();
+        long modificationTimestamp = System.currentTimeMillis();
+
+        entity.setCreatedAt(createdAt);
+        entity.setModifiedAt(modificationTimestamp / 1000);
+
+        offlineOperationDao.insert(entity);
+    }
+
+    public String getFilenameConsideringOfflineOperation(OCFile file) {
+        String filename = file.getDecryptedFileName();
+        OfflineOperationEntity renameEntity = offlineOperationDao.getByPath(file.getDecryptedRemotePath());
+        if (renameEntity != null && renameEntity.getType() instanceof OfflineOperationType.RenameFile renameFile) {
+            filename = renameFile.getNewName();
+        }
+
+        return filename;
+    }
+
     public void renameOfflineOperation(OCFile file, String newFolderName) {
         var entity = offlineOperationDao.getByPath(file.getDecryptedRemotePath());
         if (entity == null) {

+ 3 - 1
app/src/main/java/com/owncloud/android/files/FileMenuFilter.java

@@ -397,8 +397,10 @@ public class FileMenuFilter {
     }
 
     private boolean anyFileDownloading() {
+        final var fileDownloadHelper = FileDownloadHelper.Companion.instance();
+
         for (OCFile file : files) {
-            if (FileDownloadHelper.Companion.instance().isDownloading(user, file)) {
+            if (fileDownloadHelper.isDownloading(user, file)) {
                 return true;
             }
         }

+ 1 - 1
app/src/main/java/com/owncloud/android/operations/CreateShareWithShareeOperation.java

@@ -124,7 +124,7 @@ public class CreateShareWithShareeOperation extends SyncOperation {
             try {
                 String publicKey = EncryptionUtils.getPublicKey(user, shareeName, arbitraryDataProvider);
 
-                if (publicKey.equals("")) {
+                if ("".equals(publicKey)) {
                     NextcloudClient nextcloudClient = new ClientFactoryImpl(context).createNextcloudClient(user);
                     RemoteOperationResult<String> result = new GetPublicKeyRemoteOperation(shareeName).execute(nextcloudClient);
                     if (result.isSuccess()) {

+ 2 - 1
app/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java

@@ -441,7 +441,8 @@ public class SynchronizeFolderOperation extends SyncOperation {
     }
 
     private void startDirectDownloads() {
-        mFilesForDirectDownload.forEach(file -> FileDownloadHelper.Companion.instance().downloadFile(user, file));
+        final var fileDownloadHelper = FileDownloadHelper.Companion.instance();
+        mFilesForDirectDownload.forEach(file -> fileDownloadHelper.downloadFile(user, file));
     }
 
     /**

+ 4 - 1
app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java

@@ -2,6 +2,7 @@
  * Nextcloud - Android Client
  *
  * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2024 TSI-mc <surinder.kumar@t-systems.com>
  * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
  */
 package com.owncloud.android.ui.activity;
@@ -115,7 +116,9 @@ public abstract class BaseActivity extends AppCompatActivity implements Injectab
     protected void onRestart() {
         Log_OC.v(TAG, "onRestart() start");
         super.onRestart();
-        mixinRegistry.onRestart();
+        if (enableAccountHandling) {
+            mixinRegistry.onRestart();
+        }
     }
 
     private void onThemeSettingsModeChanged() {

+ 1 - 1
app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt

@@ -181,7 +181,7 @@ class InternalTwoWaySyncActivity :
             if (isChecked) {
                 backgroundJobManager.scheduleInternal2WaySync(preferences.twoWaySyncInterval)
             } else {
-                backgroundJobManager.cancelInternal2WaySyncJob()
+                backgroundJobManager.cancelTwoWaySyncJob()
             }
         }
     }

+ 1 - 1
app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java

@@ -142,7 +142,7 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
         String title;
         boolean isRoot = isRoot(chosenFile);
 
-        title = isRoot ? themeUtils.getDefaultDisplayNameForRootFolder(this) : chosenFile.getFileName();
+        title = isRoot ? themeUtils.getDefaultDisplayNameForRootFolder(this) : fileDataStorageManager.getFilenameConsideringOfflineOperation(chosenFile);
         updateActionBarTitleAndHomeButtonByString(title);
 
         if (mAppBar != null) {

+ 1 - 1
app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java

@@ -518,7 +518,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
     }
 
     private void bindListGridItemViewHolder(ListGridItemViewHolder holder, OCFile file) {
-        holder.getFileName().setText(file.getDecryptedFileName());
+        holder.getFileName().setText(mStorageManager.getFilenameConsideringOfflineOperation(file));
 
         boolean gridImage = MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file);
         if (gridView && gridImage) {

+ 2 - 1
app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt

@@ -335,10 +335,11 @@ class OCFileListDelegate(
 
     private fun showLocalFileIndicator(file: OCFile, gridViewHolder: ListViewHolder) {
         val operationsServiceBinder = transferServiceGetter.operationsServiceBinder
+        val fileDownloadHelper = FileDownloadHelper.instance()
 
         val icon: Int? = when {
             operationsServiceBinder?.isSynchronizing(user, file) == true ||
-                FileDownloadHelper.instance().isDownloading(user, file) ||
+                fileDownloadHelper.isDownloading(user, file) ||
                 fileUploadHelper.isUploading(user, file) -> {
                 // synchronizing, downloading or uploading
                 R.drawable.ic_synchronizing

+ 10 - 5
app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.kt

@@ -24,6 +24,7 @@ import com.google.common.collect.Sets
 import com.nextcloud.client.account.CurrentAccountProvider
 import com.nextcloud.client.di.Injectable
 import com.nextcloud.utils.extensions.getParcelableArgument
+import com.nextcloud.utils.extensions.typedActivity
 import com.nextcloud.utils.fileNameValidator.FileNameValidator.checkFileName
 import com.nextcloud.utils.fileNameValidator.FileNameValidator.isFileHidden
 import com.owncloud.android.R
@@ -147,12 +148,16 @@ class RenameFileDialogFragment : DialogFragment(), DialogInterface.OnClickListen
 
             if (mTargetFile?.isOfflineOperation == true) {
                 fileDataStorageManager.renameOfflineOperation(mTargetFile, newFileName)
-                if (requireActivity() is FileDisplayActivity) {
-                    val activity = requireActivity() as FileDisplayActivity
-                    activity.refreshCurrentDirectory()
-                }
+                typedActivity<FileDisplayActivity>()?.refreshCurrentDirectory()
             } else {
-                (requireActivity() as ComponentsGetter).fileOperationsHelper.renameFile(mTargetFile, newFileName)
+                typedActivity<FileDisplayActivity>()?.connectivityService?.isNetworkAndServerAvailable { result ->
+                    if (result) {
+                        typedActivity<ComponentsGetter>()?.fileOperationsHelper?.renameFile(mTargetFile, newFileName)
+                    } else {
+                        fileDataStorageManager.addRenameFileOfflineOperation(mTargetFile, newFileName)
+                        typedActivity<FileDisplayActivity>()?.refreshCurrentDirectory()
+                    }
+                }
             }
         }
     }

+ 4 - 2
app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt

@@ -653,13 +653,15 @@ class PreviewMediaActivity :
         packageName: String? = null,
         activityName: String? = null
     ) {
-        if (FileDownloadHelper.instance().isDownloading(user, file)) {
+        val fileDownloadHelper = FileDownloadHelper.instance()
+
+        if (fileDownloadHelper.isDownloading(user, file)) {
             return
         }
 
         user?.let { user ->
             file?.let { file ->
-                FileDownloadHelper.instance().downloadFile(
+                fileDownloadHelper.downloadFile(
                     user,
                     file,
                     downloadBehavior ?: "",

+ 2 - 2
app/src/main/java/third_parties/sufficientlysecure/CalendarSource.java

@@ -50,13 +50,13 @@ public class CalendarSource {
             String protocol = mUrl.getProtocol();
             String userPass = mUsername + ":" + mPassword;
 
-            if (protocol.equalsIgnoreCase("ftp") || protocol.equalsIgnoreCase("ftps")) {
+            if ("ftp".equalsIgnoreCase(protocol) || "ftps".equalsIgnoreCase(protocol)) {
                 String external = mUrl.toExternalForm();
                 String end = external.substring(protocol.length() + HTTP_SEP.length());
                 return new URL(protocol + HTTP_SEP + userPass + "@" + end).openConnection();
             }
 
-            if (protocol.equalsIgnoreCase("http") || protocol.equalsIgnoreCase("https")) {
+            if ("http".equalsIgnoreCase(protocol) || "https".equalsIgnoreCase(protocol)) {
                 String encoded = new String(new Base64().encode(userPass.getBytes("UTF-8")));
                 URLConnection connection = mUrl.openConnection();
                 connection.setRequestProperty("Authorization", "Basic " + encoded);

+ 1 - 1
app/src/main/java/third_parties/sufficientlysecure/ProcessVEvent.java

@@ -567,7 +567,7 @@ public class ProcessVEvent {
         String expected = parts.length > 1 ? parts[1] : "";
         String got = c.getAsString(key);
 
-        if (expected.equals("<non-null>") && got != null) {
+        if ("<non-null>".equals(expected) && got != null) {
             got = "<non-null>"; // Sentinel for testing present and non-null
         }
         if (got == null) {

+ 1 - 1
app/src/main/java/third_parties/sufficientlysecure/SaveCalendar.java

@@ -478,7 +478,7 @@ public class SaveCalendar {
             return true;
         }
         final String utz = tz.toUpperCase(Locale.US);
-        return utz.equals("UTC") || utz.equals("UTC-0") || utz.equals("UTC+0") || utz.endsWith("/UTC");
+        return "UTC".equals(utz) || "UTC-0".equals(utz) || "UTC+0".equals(utz) || utz.endsWith("/UTC");
     }
 
     private Date getDateTime(Cursor cur, String dbName, String dbTzName, Calendar cal) {

+ 18 - 1
app/src/main/res/values-ar/strings.xml

@@ -700,7 +700,9 @@
     <string name="prefs_synced_folders_local_path_title">مجلد محلي</string>
     <string name="prefs_synced_folders_remote_path_title">مجلد عن بعد</string>
     <string name="prefs_theme_title">السمة</string>
+    <string name="prefs_two_way_sync_interval">الفسحة الزمنية</string>
     <string name="prefs_two_way_sync_summary">إدارة المجلدات الداخلية للمزامنة في الاتجاهين</string>
+    <string name="prefs_two_way_sync_switch_title">تمكين المزامنة في الاتجاهين</string>
     <string name="prefs_value_theme_dark">غامق</string>
     <string name="prefs_value_theme_light">فاتح</string>
     <string name="prefs_value_theme_system">اتبع النظام</string>
@@ -1091,12 +1093,27 @@
     <string name="whats_new_skip">تخطى</string>
     <string name="whats_new_title">جديد على %1$s</string>
     <string name="whats_your_status">ماهي حالتك؟</string>
-    <string name="widgets_not_available">الأدوات مُتاحة فقط في %1$s الإصدار 25 و ما بعده  </string>
     <string name="widgets_not_available_title">غير متوفر</string>
     <string name="worker_download">جارٍ تنزيل الملفات…</string>
     <string name="write_email">إرسال بريد</string>
     <string name="wrong_storage_path">مجلد التخزين غير موجود !</string>
     <string name="wrong_storage_path_desc">قد يكون هذا بسبب استعادة نسخة احتياطية على جهاز آخر . العودة الى الافتراضي . يرجى التحقق من الإعدادات لضبط مجلد تخزين البيانات.</string>
+    <plurals name="hours">
+        <item quantity="zero">%d ساعة</item>
+        <item quantity="one">%d ساعة</item>
+        <item quantity="two">%d ساعة</item>
+        <item quantity="few">%d ساعات</item>
+        <item quantity="many">%d ساعة</item>
+        <item quantity="other">%d ساعة</item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="zero">%d دقيقة</item>
+        <item quantity="one">%d دقيقة</item>
+        <item quantity="two">%d دقيقة</item>
+        <item quantity="few">%d دقائق</item>
+        <item quantity="many">%d دقيقة</item>
+        <item quantity="other">%d دقيقة</item>
+    </plurals>
     <plurals name="sync_fail_in_favourites_content">
         <item quantity="zero">تعذرت مزامنة الملفات %1$d (التعارضات:%2$d)</item>
         <item quantity="one">تعذرت مزامنة الملفات %1$d (التعارضات:%2$d)</item>

+ 10 - 1
app/src/main/res/values-b+en+001/strings.xml

@@ -696,7 +696,9 @@
     <string name="prefs_synced_folders_local_path_title">Local folder</string>
     <string name="prefs_synced_folders_remote_path_title">Remote folder</string>
     <string name="prefs_theme_title">Theme</string>
+    <string name="prefs_two_way_sync_interval">Interval</string>
     <string name="prefs_two_way_sync_summary">Manage internal folders for two way sync</string>
+    <string name="prefs_two_way_sync_switch_title">Enable two way sync</string>
     <string name="prefs_value_theme_dark">Dark</string>
     <string name="prefs_value_theme_light">Light</string>
     <string name="prefs_value_theme_system">Follow system</string>
@@ -1064,12 +1066,19 @@
     <string name="whats_new_skip">Skip</string>
     <string name="whats_new_title">New in %1$s</string>
     <string name="whats_your_status">What is your status?</string>
-    <string name="widgets_not_available">Widgets are only available on %1$s 25 or later</string>
     <string name="widgets_not_available_title">Not available</string>
     <string name="worker_download">Downloading files…</string>
     <string name="write_email">Send email</string>
     <string name="wrong_storage_path">Data storage folder does not exist!</string>
     <string name="wrong_storage_path_desc">This might be due to a backup restore on another device. Falling back to default. Please check settings to adjust data storage folder.</string>
+    <plurals name="hours">
+        <item quantity="one">%d hour</item>
+        <item quantity="other">%d hours</item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="one">%d minute</item>
+        <item quantity="other">%d minutes</item>
+    </plurals>
     <plurals name="sync_fail_in_favourites_content">
         <item quantity="one">Could not sync %1$d file (conflicts: %2$d)</item>
         <item quantity="other">Could not sync %1$d files (conflicts: %2$d)</item>

+ 0 - 1
app/src/main/res/values-bg-rBG/strings.xml

@@ -904,7 +904,6 @@
     <string name="whats_new_skip">Пропусни</string>
     <string name="whats_new_title">Ново в %1$s</string>
     <string name="whats_your_status">Какъв е вашият статус?</string>
-    <string name="widgets_not_available">Изпълнимите модули са налични само в %1$s, 25 или по-нова версия</string>
     <string name="widgets_not_available_title">Не е наличен</string>
     <string name="worker_download">Сваляне на файлове...</string>
     <string name="write_email">Изпращане на имейл</string>

+ 0 - 1
app/src/main/res/values-ca/strings.xml

@@ -898,7 +898,6 @@
     <string name="whats_new_skip">Omet</string>
     <string name="whats_new_title">Nou a %1$s</string>
     <string name="whats_your_status">Quin és el vostre estat?</string>
-    <string name="widgets_not_available">Els ginys només estan disponibles a %1$s 25 o una versió posterior</string>
     <string name="widgets_not_available_title">No disponible</string>
     <string name="worker_download">S\'està descarregant fitxers…</string>
     <string name="write_email">Enviar correu</string>

+ 0 - 1
app/src/main/res/values-cs-rCZ/strings.xml

@@ -1060,7 +1060,6 @@
     <string name="whats_new_skip">Přeskočit</string>
     <string name="whats_new_title">Co je v %1$s nového</string>
     <string name="whats_your_status">Jaký je váš stav?</string>
-    <string name="widgets_not_available">Ovládací prvky jsou k dispozici pouze na %1$s 25 a novějším</string>
     <string name="widgets_not_available_title">Není k dispozici</string>
     <string name="worker_download">Stahování souborů…</string>
     <string name="write_email">Odeslat e-mail</string>

+ 0 - 1
app/src/main/res/values-da/strings.xml

@@ -970,7 +970,6 @@ Enheds legitimationsoplysninger er sat op
     <string name="whats_new_skip">Spring over</string>
     <string name="whats_new_title">Nyt i %1$s</string>
     <string name="whats_your_status">Hvad er din status</string>
-    <string name="widgets_not_available">Widgets er kun tilgængelige for %1$s 25 eller senere</string>
     <string name="widgets_not_available_title">Ikke tilgængelig</string>
     <string name="worker_download">Henter filer...</string>
     <string name="write_email">Send email</string>

+ 10 - 1
app/src/main/res/values-de/strings.xml

@@ -696,7 +696,9 @@
     <string name="prefs_synced_folders_local_path_title">Lokaler Ordner</string>
     <string name="prefs_synced_folders_remote_path_title">Remote-Ordner</string>
     <string name="prefs_theme_title">Design</string>
+    <string name="prefs_two_way_sync_interval">Intervall</string>
     <string name="prefs_two_way_sync_summary">Interne Ordner für 2-Wege-Synchronisierung verwalten</string>
+    <string name="prefs_two_way_sync_switch_title">2-Wege-Synchronisierung aktivieren</string>
     <string name="prefs_value_theme_dark">Dunkel</string>
     <string name="prefs_value_theme_light">Hell</string>
     <string name="prefs_value_theme_system">Systemvorgaben verwenden</string>
@@ -1064,12 +1066,19 @@
     <string name="whats_new_skip">Überspringen</string>
     <string name="whats_new_title">Neu in %1$s</string>
     <string name="whats_your_status">Wie ist Ihr Status?</string>
-    <string name="widgets_not_available">Widgets sind nur auf %1$s 25 oder neuer verfügbar</string>
     <string name="widgets_not_available_title">Nicht verfügbar</string>
     <string name="worker_download">Dateien werden heruntergeladen…</string>
     <string name="write_email">E-Mail senden</string>
     <string name="wrong_storage_path">Speicherordner existiert nicht!</string>
     <string name="wrong_storage_path_desc">Ursache könnte die Wiederherstellung einer Sicherungskopie auf einem anderen Gerät sein. Der Standard-Ordner wird jetzt wieder verwendet. Bitte überprüfen Sie die Einstellungen bezüglich des Speicherortes.</string>
+    <plurals name="hours">
+        <item quantity="one">%d Stunde</item>
+        <item quantity="other">%d Stunden</item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="one">%d Minute</item>
+        <item quantity="other">%d Minuten</item>
+    </plurals>
     <plurals name="sync_fail_in_favourites_content">
         <item quantity="one">Inhalte von %1$d Datei konnten nicht synchronisiert werden (Konflikte: %2$d)</item>
         <item quantity="other">Inhalte von %1$d Dateien konnten nicht synchronisiert werden (Konflikte: %2$d)</item>

+ 0 - 1
app/src/main/res/values-el/strings.xml

@@ -911,7 +911,6 @@
     <string name="whats_new_skip">Παράλειψη</string>
     <string name="whats_new_title">Τι νέο υπάρχει στο %1$s</string>
     <string name="whats_your_status">Ποια είναι η κατάστασή σας;</string>
-    <string name="widgets_not_available">Τα γραφικά στοιχεία είναι διαθέσιμα μόνο στην %1$s 25 ή νεότερη</string>
     <string name="widgets_not_available_title">Δεν είναι διαθέσιμο</string>
     <string name="worker_download">Λήψη αρχείων…</string>
     <string name="write_email">Αποστολή email</string>

+ 0 - 1
app/src/main/res/values-es-rAR/strings.xml

@@ -1023,7 +1023,6 @@
     <string name="whats_new_skip">Saltar</string>
     <string name="whats_new_title">Nuevo en %1$s</string>
     <string name="whats_your_status">¿Cuál es su estado?</string>
-    <string name="widgets_not_available">Los widgets sólo están disponibles para %1$s 25 o superior</string>
     <string name="widgets_not_available_title">No disponible</string>
     <string name="worker_download">Descargando archivos…</string>
     <string name="write_email">Enviar correo electrónico</string>

+ 0 - 1
app/src/main/res/values-es-rEC/strings.xml

@@ -913,7 +913,6 @@
     <string name="whats_new_skip">Omitir</string>
     <string name="whats_new_title">Nuevo en %1$s</string>
     <string name="whats_your_status">¿Cuál es tu estado?</string>
-    <string name="widgets_not_available">Los widgets solo están disponibles en %1$s 25 o posterior</string>
     <string name="widgets_not_available_title">No disponible</string>
     <string name="worker_download">Descargando archivos…</string>
     <string name="write_email">Enviar correo electrónico</string>

+ 0 - 1
app/src/main/res/values-es-rMX/strings.xml

@@ -1024,7 +1024,6 @@
     <string name="whats_new_skip">Omitir</string>
     <string name="whats_new_title">Nuevo en %1$s</string>
     <string name="whats_your_status">¿Cuál es su estado?</string>
-    <string name="widgets_not_available">Los widgets sólo están disponibles para %1$s 25 o superior</string>
     <string name="widgets_not_available_title">No disponible</string>
     <string name="worker_download">Descargando archivos…</string>
     <string name="write_email">Enviar correo electrónico</string>

+ 0 - 1
app/src/main/res/values-es/strings.xml

@@ -1028,7 +1028,6 @@
     <string name="whats_new_skip">Omitir</string>
     <string name="whats_new_title">Nuevo en %1$s</string>
     <string name="whats_your_status">¿Cuál es su estado?</string>
-    <string name="widgets_not_available">Los widgets solo están disponibles para %1$s 25 o superior</string>
     <string name="widgets_not_available_title">No disponible</string>
     <string name="worker_download">Bajando archivos…</string>
     <string name="write_email">Enviar email</string>

+ 0 - 1
app/src/main/res/values-eu/strings.xml

@@ -1060,7 +1060,6 @@
     <string name="whats_new_skip">Salto egin</string>
     <string name="whats_new_title">Berria %1$s-n</string>
     <string name="whats_your_status">Zein da zure egoera?</string>
-    <string name="widgets_not_available">Widgetak %1$s 25 edo geroago bakarrik daude eskuragarri</string>
     <string name="widgets_not_available_title">Ez dago erabilgarri</string>
     <string name="worker_download">Fitxategiak deskargatzen…</string>
     <string name="write_email">Bidali mezu elektronikoa</string>

+ 0 - 1
app/src/main/res/values-fa/strings.xml

@@ -981,7 +981,6 @@
     <string name="whats_new_skip">رد شدن</string>
     <string name="whats_new_title">جدید در %1$s</string>
     <string name="whats_your_status">وضعیت شما چیست؟</string>
-    <string name="widgets_not_available">ویجت ها فقط در%1$s 25 یا بالاتر در دسترس هستند</string>
     <string name="widgets_not_available_title">در دسترس نیست</string>
     <string name="worker_download">در حال دریافت فایل ها...</string>
     <string name="write_email">ارسال ایمیل</string>

+ 0 - 1
app/src/main/res/values-fr/strings.xml

@@ -1064,7 +1064,6 @@
     <string name="whats_new_skip">Ignorer</string>
     <string name="whats_new_title">Nouveautés dans %1$s</string>
     <string name="whats_your_status">Quel est votre statut ?</string>
-    <string name="widgets_not_available">Les widgets ne sont disponibles que sur %1$s 25 ou plus tard</string>
     <string name="widgets_not_available_title">Non disponible</string>
     <string name="worker_download">Téléchargement des fichiers…</string>
     <string name="write_email">Envoyer un e-mail</string>

+ 16 - 1
app/src/main/res/values-ga/strings.xml

@@ -696,7 +696,9 @@
     <string name="prefs_synced_folders_local_path_title">Fillteán áitiúil</string>
     <string name="prefs_synced_folders_remote_path_title">Fillteán cianda</string>
     <string name="prefs_theme_title">Téama</string>
+    <string name="prefs_two_way_sync_interval">Eatramh</string>
     <string name="prefs_two_way_sync_summary">Bainistigh fillteáin inmheánacha le haghaidh sioncronaithe dhá bhealach</string>
+    <string name="prefs_two_way_sync_switch_title">Cumasaigh sioncronú dhá bhealach</string>
     <string name="prefs_value_theme_dark">Dorcha</string>
     <string name="prefs_value_theme_light">Solas</string>
     <string name="prefs_value_theme_system">Lean an córas</string>
@@ -1064,12 +1066,25 @@
     <string name="whats_new_skip">Scipeáil</string>
     <string name="whats_new_title">Nua i %1$s</string>
     <string name="whats_your_status">Cad é do stádas?</string>
-    <string name="widgets_not_available">Níl giuirléidí ar fáil ach ar %1$s 25 nó níos déanaí</string>
     <string name="widgets_not_available_title">Níl sé ar fáil</string>
     <string name="worker_download">Comhaid á n-íoslódáil…</string>
     <string name="write_email">Seol ríomhphost</string>
     <string name="wrong_storage_path">Níl fillteán stórála sonraí ann!</string>
     <string name="wrong_storage_path_desc">D\'fhéadfadh sé seo a bheith mar gheall ar aischur cúltaca ar ghléas eile. Ag titim ar ais go réamhshocraithe. Seiceáil le do thoil socruithe chun fillteán stórála sonraí a choigeartú.</string>
+    <plurals name="hours">
+        <item quantity="one">%d uair</item>
+        <item quantity="two">%d uair an chloig</item>
+        <item quantity="few">%d uair an chloig</item>
+        <item quantity="many">%d uair an chloig</item>
+        <item quantity="other">%d uair an chloig</item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="one">%d nóiméad</item>
+        <item quantity="two">%d nóiméad</item>
+        <item quantity="few">%d nóiméad</item>
+        <item quantity="many">%d nóiméad</item>
+        <item quantity="other">%d nóiméad</item>
+    </plurals>
     <plurals name="sync_fail_in_favourites_content">
         <item quantity="one">Níorbh fhéidir comhad %1$d a shioncronú (coimhlint: %2$d)</item>
         <item quantity="two">Níorbh fhéidir %1$d comhad a shioncronú (coimhlint: %2$d)</item>

+ 10 - 1
app/src/main/res/values-gl/strings.xml

@@ -697,7 +697,9 @@
     <string name="prefs_synced_folders_local_path_title">Cartafol local</string>
     <string name="prefs_synced_folders_remote_path_title">Cartafol remoto</string>
     <string name="prefs_theme_title">Tema</string>
+    <string name="prefs_two_way_sync_interval">Intervalo</string>
     <string name="prefs_two_way_sync_summary">Xestionar os cartafoles internos para a sincronización bidireccional</string>
+    <string name="prefs_two_way_sync_switch_title">Activar a sincronización bidireccional</string>
     <string name="prefs_value_theme_dark">Escuro</string>
     <string name="prefs_value_theme_light">Claro</string>
     <string name="prefs_value_theme_system">Seguir o sistema</string>
@@ -1065,12 +1067,19 @@
     <string name="whats_new_skip">Omitir</string>
     <string name="whats_new_title">Novo en %1$s</string>
     <string name="whats_your_status">Cal é o seu estado?</string>
-    <string name="widgets_not_available">Os trebellos só están dispoñíbeis en %1$s 25 ou posterior</string>
     <string name="widgets_not_available_title">Non dispoñíbel</string>
     <string name="worker_download">Descargando ficheiros…</string>
     <string name="write_email">Enviar o correo</string>
     <string name="wrong_storage_path">O cartafol de almacenamento de datos non existe.</string>
     <string name="wrong_storage_path_desc">Isto pode deberse a unha restauración de copia de seguranza noutro dispositivo. Volvendo ao predeterminado. Comprobe as opcións para axustar o cartafol de almacenamento de datos.</string>
+    <plurals name="hours">
+        <item quantity="one">%d hora</item>
+        <item quantity="other">%d horas</item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="one">%d minuto</item>
+        <item quantity="other">%d minutos</item>
+    </plurals>
     <plurals name="sync_fail_in_favourites_content">
         <item quantity="one">Non foi posíbel sincronizar  %1$d ficheiro (conflitos: %2$d)</item>
         <item quantity="other">Non foi posíbel sincronizar  %1$d ficheiros (conflitos: %2$d)</item>

+ 0 - 1
app/src/main/res/values-hu-rHU/strings.xml

@@ -949,7 +949,6 @@
     <string name="whats_new_skip">Kihagyás</string>
     <string name="whats_new_title">Új itt: %1$s</string>
     <string name="whats_your_status">Mi az állapota?</string>
-    <string name="widgets_not_available">A modulok csak %1$s 25 vagy újabb esetén érhetők el</string>
     <string name="widgets_not_available_title">Nem érhető el</string>
     <string name="worker_download">Fájlok letöltése…</string>
     <string name="write_email">E-mail küldése</string>

+ 0 - 1
app/src/main/res/values-in/strings.xml

@@ -931,7 +931,6 @@ Berikut ini adalah daftar berkas lokal, dan berkas jarak jauh di %5$s yang terhu
     <string name="whats_new_skip">Lewat</string>
     <string name="whats_new_title">Apa yang baru di %1$s</string>
     <string name="whats_your_status">Apa status Anda?</string>
-    <string name="widgets_not_available">Widget hanya tersedia di %1$s 25 atau versi yang lebih baru.</string>
     <string name="widgets_not_available_title">Tidak tersedia</string>
     <string name="worker_download">Mengunduh berkas…</string>
     <string name="write_email">Kirim surel</string>

+ 0 - 1
app/src/main/res/values-is/strings.xml

@@ -914,7 +914,6 @@
     <string name="whats_new_skip">Sleppa</string>
     <string name="whats_new_title">(Nýtt í %s)</string>
     <string name="whats_your_status">Hver er staðan á þér?</string>
-    <string name="widgets_not_available">Viðmótshlutar eru einungis í boði á %1$s 25 eða nýrra</string>
     <string name="widgets_not_available_title">Not available</string>
     <string name="worker_download">Sæki skrár…</string>
     <string name="write_email">Senda tölvupóst</string>

+ 0 - 1
app/src/main/res/values-it/strings.xml

@@ -971,7 +971,6 @@
     <string name="whats_new_skip">Salta</string>
     <string name="whats_new_title">Prima volta su %1$s</string>
     <string name="whats_your_status">Qual è il tuo stato?</string>
-    <string name="widgets_not_available">I widget sono disponibili solo su %1$s 25 o dopo </string>
     <string name="widgets_not_available_title">Non disponibile</string>
     <string name="worker_download">Scaricamento file in corso…</string>
     <string name="write_email">Invia email</string>

+ 0 - 1
app/src/main/res/values-ja-rJP/strings.xml

@@ -985,7 +985,6 @@
     <string name="whats_new_skip">スキップ</string>
     <string name="whats_new_title">%1$sの新機能</string>
     <string name="whats_your_status">あなたのステータスは?</string>
-    <string name="widgets_not_available">ウィジェットは %1$s 25 以上でのみ利用可能です </string>
     <string name="widgets_not_available_title">利用できません</string>
     <string name="worker_download">ファイルをダウンロード中…</string>
     <string name="write_email">メールを送信</string>

+ 0 - 1
app/src/main/res/values-ka/strings.xml

@@ -940,7 +940,6 @@
     <string name="whats_new_skip">Skip</string>
     <string name="whats_new_title">New in %1$s</string>
     <string name="whats_your_status">What is your status?</string>
-    <string name="widgets_not_available">Widgets are only available on %1$s 25 or later</string>
     <string name="widgets_not_available_title">Not available</string>
     <string name="worker_download">Downloading files…</string>
     <string name="write_email">Send email</string>

+ 0 - 1
app/src/main/res/values-ko/strings.xml

@@ -1023,7 +1023,6 @@
     <string name="whats_new_skip">건너뛰기</string>
     <string name="whats_new_title">%1$s의 새로운 것</string>
     <string name="whats_your_status">당신의 상태는?</string>
-    <string name="widgets_not_available">위젯 기능은 %1$s 버전 25 이후부터 사용할 수 있습니다.</string>
     <string name="widgets_not_available_title">사용할 수 없음</string>
     <string name="worker_download">파일 다운로드 중…</string>
     <string name="write_email">이메일 보내기</string>

+ 0 - 1
app/src/main/res/values-nb-rNO/strings.xml

@@ -1037,7 +1037,6 @@
     <string name="whats_new_skip">Hopp over</string>
     <string name="whats_new_title">Nytt i %1$s</string>
     <string name="whats_your_status">Hva er din status?</string>
-    <string name="widgets_not_available">Widgeter er bare tilgjengelige på %1$s 25 eller nyere</string>
     <string name="widgets_not_available_title">Ikke tilgjengelig</string>
     <string name="worker_download">Laster ned filer…</string>
     <string name="write_email">Send e-post</string>

+ 0 - 1
app/src/main/res/values-nl/strings.xml

@@ -1019,7 +1019,6 @@
     <string name="whats_new_skip">Overslaan</string>
     <string name="whats_new_title">Nieuw in %1$s</string>
     <string name="whats_your_status">Wat is jouw status?</string>
-    <string name="widgets_not_available">Widgets zijn alleen beschikbaar op %1$s 25 of later</string>
     <string name="widgets_not_available_title">Niet beschikbaar</string>
     <string name="worker_download">Downloaden bestanden…</string>
     <string name="write_email">Stuur e-mail</string>

+ 0 - 1
app/src/main/res/values-pl/strings.xml

@@ -1034,7 +1034,6 @@
     <string name="whats_new_skip">Pomiń</string>
     <string name="whats_new_title">Co nowego w %1$s</string>
     <string name="whats_your_status">Jaki jest Twój status?</string>
-    <string name="widgets_not_available">Widżety są dostępne tylko w wersji %1$s 25 lub nowszej</string>
     <string name="widgets_not_available_title">Niedostępny</string>
     <string name="worker_download">Pobieranie plików…</string>
     <string name="write_email">Wyślij e-mail</string>

+ 0 - 1
app/src/main/res/values-pt-rBR/strings.xml

@@ -1064,7 +1064,6 @@
     <string name="whats_new_skip">Saltar</string>
     <string name="whats_new_title">Novo em %1$s</string>
     <string name="whats_your_status">Qual é o seu status?</string>
-    <string name="widgets_not_available">Widgets apenas estão disponíveis em %1$s 25 ou posterior</string>
     <string name="widgets_not_available_title">Indisponível</string>
     <string name="worker_download">Baixando arquivos…</string>
     <string name="write_email">Enviar e-mail</string>

+ 0 - 1
app/src/main/res/values-pt-rPT/strings.xml

@@ -909,7 +909,6 @@ Aproveite o novo e melhorado envio automático.</string>
     <string name="whats_new_skip">Passar à frente</string>
     <string name="whats_new_title">Novo em %1$s</string>
     <string name="whats_your_status">Qual é o seu estado?</string>
-    <string name="widgets_not_available">Os widgets só estão disponíveis em %1$s 25 ou posterior</string>
     <string name="widgets_not_available_title">Não disponível</string>
     <string name="worker_download">A transferir os ficheiros…</string>
     <string name="write_email">Enviar mensagem</string>

+ 0 - 1
app/src/main/res/values-ro/strings.xml

@@ -931,7 +931,6 @@
     <string name="whats_new_skip">Sari peste</string>
     <string name="whats_new_title">Nou în %1$s</string>
     <string name="whats_your_status">Care este statusul tău?</string>
-    <string name="widgets_not_available">Widgeturile sunt disponibile începând cu %1$s 25</string>
     <string name="widgets_not_available_title">Nu este disponibil</string>
     <string name="worker_download">Se descarcă fișiere…</string>
     <string name="write_email">Expediază mesajul</string>

+ 0 - 1
app/src/main/res/values-ru/strings.xml

@@ -1048,7 +1048,6 @@
     <string name="whats_new_skip">Пропустить</string>
     <string name="whats_new_title">Новое в %1$s</string>
     <string name="whats_your_status">Ваш статус?</string>
-    <string name="widgets_not_available">Виджеты доступны только на%1$s25 или более</string>
     <string name="widgets_not_available_title">Не доступен</string>
     <string name="worker_download">Получение файлов…</string>
     <string name="write_email">Отправить письмо</string>

+ 0 - 1
app/src/main/res/values-sk-rSK/strings.xml

@@ -1008,7 +1008,6 @@
     <string name="whats_new_skip">Preskočiť</string>
     <string name="whats_new_title">Nové v %1$s</string>
     <string name="whats_your_status">Aký je váš stav?</string>
-    <string name="widgets_not_available">Widgety sú dostupné iba na %1$s 25 alebo vyšší</string>
     <string name="widgets_not_available_title">Nie je k dispozícií</string>
     <string name="worker_download">Sťahovanie súborov…</string>
     <string name="write_email">Odoslať email</string>

+ 0 - 1
app/src/main/res/values-sl/strings.xml

@@ -941,7 +941,6 @@
     <string name="whats_new_skip">Preskoči</string>
     <string name="whats_new_title">Novo v %1$s</string>
     <string name="whats_your_status">Kako želite nastaviti stanje?</string>
-    <string name="widgets_not_available">Gradniki so na voljo samo na %1$s 25 ali pozneje</string>
     <string name="widgets_not_available_title">Ni na voljo</string>
     <string name="worker_download">Poteka prejemanje datotek …</string>
     <string name="write_email">Pošlji elektronsko sporočilo</string>

+ 0 - 1
app/src/main/res/values-sr/strings.xml

@@ -1064,7 +1064,6 @@
     <string name="whats_new_skip">Прескочи</string>
     <string name="whats_new_title">Ново у %1$s</string>
     <string name="whats_your_status">Који је ваш статус?</string>
-    <string name="widgets_not_available">Виџети су доступни само на %1$s 25 или новијем</string>
     <string name="widgets_not_available_title">Није доступно</string>
     <string name="worker_download">Преузимам фајлове…</string>
     <string name="write_email">Пошаљи е-пошту</string>

+ 10 - 1
app/src/main/res/values-sv/strings.xml

@@ -697,7 +697,9 @@
     <string name="prefs_synced_folders_local_path_title">Lokal mapp</string>
     <string name="prefs_synced_folders_remote_path_title">Extern mapp</string>
     <string name="prefs_theme_title">Tema</string>
+    <string name="prefs_two_way_sync_interval">Intervall </string>
     <string name="prefs_two_way_sync_summary">Hantera interna mappar för tvåvägssynk</string>
+    <string name="prefs_two_way_sync_switch_title">Aktivera tvåvägssynk</string>
     <string name="prefs_value_theme_dark">Mörkt</string>
     <string name="prefs_value_theme_light">Ljust</string>
     <string name="prefs_value_theme_system">Följ systemet</string>
@@ -1065,12 +1067,19 @@
     <string name="whats_new_skip">Hoppa över</string>
     <string name="whats_new_title">Ny i %1$s</string>
     <string name="whats_your_status">Vad är din status?</string>
-    <string name="widgets_not_available">Widgets är endast tillgängliga på %1$s 25 eller senare</string>
     <string name="widgets_not_available_title">Inte tillgänglig</string>
     <string name="worker_download">Hämtar filer…</string>
     <string name="write_email">Skicka e-post</string>
     <string name="wrong_storage_path">Datalagringsmapp finns inte!</string>
     <string name="wrong_storage_path_desc">Detta kan bero på en säkerhetskopiering som återställts på en annan enhet. Kommer använda standarden. Vänligen kontrollera inställningarna för att konfigurera datalagringsmappen.</string>
+    <plurals name="hours">
+        <item quantity="one">%d timme</item>
+        <item quantity="other">%d timmar</item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="one">%d minut</item>
+        <item quantity="other">%d minuter</item>
+    </plurals>
     <plurals name="sync_fail_in_favourites_content">
         <item quantity="one">Kunde inte synkronisera %1$d fil (konflikter: %2$d)</item>
         <item quantity="other">Kunde inte synkronisera %1$d filer (konflikter: %2$d)</item>

+ 10 - 1
app/src/main/res/values-tr/strings.xml

@@ -696,7 +696,9 @@
     <string name="prefs_synced_folders_local_path_title">Yerel klasör</string>
     <string name="prefs_synced_folders_remote_path_title">Uzak klasör</string>
     <string name="prefs_theme_title">Tema</string>
+    <string name="prefs_two_way_sync_interval">Aralık</string>
     <string name="prefs_two_way_sync_summary">İç klasörleri iki yönlü eşitleme ile yönetin</string>
+    <string name="prefs_two_way_sync_switch_title">İki yönlü eşitlemeyi aç</string>
     <string name="prefs_value_theme_dark">Koyu</string>
     <string name="prefs_value_theme_light">Açık</string>
     <string name="prefs_value_theme_system">Sistem ayarı</string>
@@ -1064,12 +1066,19 @@
     <string name="whats_new_skip">Atla</string>
     <string name="whats_new_title">%1$s yenilikleri</string>
     <string name="whats_your_status">Durumunuz nedir?</string>
-    <string name="widgets_not_available">Pano bileşenleri yalnızca %1$s 25 ve üzeri sürümlerde kullanılabilir</string>
     <string name="widgets_not_available_title">Kullanılamaz</string>
     <string name="worker_download">Dosyalar indiriliyor…</string>
     <string name="write_email">E-posta gönder</string>
     <string name="wrong_storage_path">Veri depolama klasörü bulunamadı!</string>
     <string name="wrong_storage_path_desc">Bunun nedeni bir yedeğin başka bir aygıta geri yüklenmesi olabilir. Varsayılan değerlere geri dönülüyor. Lütfen veri depolama klasörünü ayarlamak için ayarları denetleyin.</string>
+    <plurals name="hours">
+        <item quantity="one">%d saat</item>
+        <item quantity="other">%d saat</item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="one">%d dakika</item>
+        <item quantity="other">%d dakika</item>
+    </plurals>
     <plurals name="sync_fail_in_favourites_content">
         <item quantity="one">%1$d dosya eşitlenemedi (çakışma: %2$d)</item>
         <item quantity="other">%1$d dosya eşitlenemedi (çakışma: %2$d)</item>

+ 0 - 1
app/src/main/res/values-ug/strings.xml

@@ -1064,7 +1064,6 @@
     <string name="whats_new_skip">ئاتلاش</string>
     <string name="whats_new_title">% 1 $ s دىكى يېڭى</string>
     <string name="whats_your_status">ئەھۋالىڭىز نېمە؟</string>
-    <string name="widgets_not_available">كىچىك قوراللار پەقەت% 1 $ s 25 ياكى ئۇنىڭدىن يۇقىرى نەشرىدە بولىدۇ</string>
     <string name="widgets_not_available_title">ئىشلەتكىلى بولمايدۇ</string>
     <string name="worker_download">ھۆججەتلەرنى چۈشۈرۈش…</string>
     <string name="write_email">ئېلېكترونلۇق خەت ئەۋەتىڭ</string>

+ 14 - 1
app/src/main/res/values-uk/strings.xml

@@ -688,7 +688,9 @@
     <string name="prefs_synced_folders_local_path_title">Каталог на пристрої</string>
     <string name="prefs_synced_folders_remote_path_title">Віддалений каталог</string>
     <string name="prefs_theme_title">Тема</string>
+    <string name="prefs_two_way_sync_interval">Інтервал</string>
     <string name="prefs_two_way_sync_summary">Керувати внутрішніми каталогами для двосторонньої синхронізації</string>
+    <string name="prefs_two_way_sync_switch_title">Увімкнути двосторонню синхронізацію</string>
     <string name="prefs_value_theme_dark">Темна</string>
     <string name="prefs_value_theme_light">Світла</string>
     <string name="prefs_value_theme_system">Системна</string>
@@ -1053,12 +1055,23 @@
     <string name="whats_new_skip">Пропустити</string>
     <string name="whats_new_title">Нове у %1$s</string>
     <string name="whats_your_status">Який ваш статус?</string>
-    <string name="widgets_not_available">Віджети доступні тільки з версії %1$s 25 або пізніше</string>
     <string name="widgets_not_available_title">Не доступно</string>
     <string name="worker_download">Звантаження файлів...</string>
     <string name="write_email">Надіслати лист</string>
     <string name="wrong_storage_path">Каталог для збереження даних не існує!</string>
     <string name="wrong_storage_path_desc">Можливо, це пов’язано з відновленням резервної копії на іншому пристрої. Повернення до стандартного. Будь ласка, перевірте налаштування, щоб налаштувати каталог для збереження даних.</string>
+    <plurals name="hours">
+        <item quantity="one">%d година</item>
+        <item quantity="few">%d години</item>
+        <item quantity="many">%d годин</item>
+        <item quantity="other">%d годин</item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="one">%d хвилина</item>
+        <item quantity="few">%d хвилини</item>
+        <item quantity="many">%d хвилин</item>
+        <item quantity="other">%d хвилин</item>
+    </plurals>
     <plurals name="sync_fail_in_favourites_content">
         <item quantity="one">Не вдалося синхронізувати %1$d файл (конфлікти: %2$d)</item>
         <item quantity="few">Не вдалося синхронізувати %1$d файлів (конфлікти: %2$d)</item>

+ 0 - 1
app/src/main/res/values-zh-rCN/strings.xml

@@ -1083,7 +1083,6 @@ Nextcloud 是一个私有文件同步、共享和通信服务器。它是自由
     <string name="whats_new_skip">跳过</string>
     <string name="whats_new_title">新建%1$s</string>
     <string name="whats_your_status">你什么状态?</string>
-    <string name="widgets_not_available">小工具仅在%1$s25及更高版本中可用</string>
     <string name="widgets_not_available_title">不可用</string>
     <string name="worker_download">正在下载文件…</string>
     <string name="write_email">发送邮件</string>

+ 8 - 1
app/src/main/res/values-zh-rHK/strings.xml

@@ -696,7 +696,9 @@
     <string name="prefs_synced_folders_local_path_title">近端資料夾</string>
     <string name="prefs_synced_folders_remote_path_title">遠端資料夾</string>
     <string name="prefs_theme_title">佈景主題</string>
+    <string name="prefs_two_way_sync_interval">間距</string>
     <string name="prefs_two_way_sync_summary">管理內部資料夾以進行雙向同步</string>
+    <string name="prefs_two_way_sync_switch_title">啟用雙向同步</string>
     <string name="prefs_value_theme_dark">深色</string>
     <string name="prefs_value_theme_light">淺色</string>
     <string name="prefs_value_theme_system">跟隨系統</string>
@@ -1064,12 +1066,17 @@
     <string name="whats_new_skip">略過</string>
     <string name="whats_new_title">新增到 %1$s </string>
     <string name="whats_your_status">您目前的狀態是什麼呢?</string>
-    <string name="widgets_not_available">小部件僅在 %1$s 25 或更新提供</string>
     <string name="widgets_not_available_title">不可用</string>
     <string name="worker_download">下載檔案中…</string>
     <string name="write_email">傳送電子郵件</string>
     <string name="wrong_storage_path">資料儲存資料夾不存在!</string>
     <string name="wrong_storage_path_desc">這可能是由於另一部設備上的備份還原所致。退回默認值。請檢查設置以調整數據存儲資料夾。</string>
+    <plurals name="hours">
+        <item quantity="other">%d 小時</item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="other">%d 分鐘</item>
+    </plurals>
     <plurals name="sync_fail_in_favourites_content">
         <item quantity="other">無法同步 %1$d 檔案(抵觸: %2$d)</item>
     </plurals>

+ 8 - 1
app/src/main/res/values-zh-rTW/strings.xml

@@ -696,7 +696,9 @@
     <string name="prefs_synced_folders_local_path_title">本機資料夾</string>
     <string name="prefs_synced_folders_remote_path_title">遠端資料夾</string>
     <string name="prefs_theme_title">佈景主題</string>
+    <string name="prefs_two_way_sync_interval">間隔</string>
     <string name="prefs_two_way_sync_summary">管理內部資料夾以進行雙向同步</string>
+    <string name="prefs_two_way_sync_switch_title">啟用雙向同步</string>
     <string name="prefs_value_theme_dark">深色</string>
     <string name="prefs_value_theme_light">淺色</string>
     <string name="prefs_value_theme_system">跟隨系統</string>
@@ -1064,12 +1066,17 @@
     <string name="whats_new_skip">略過</string>
     <string name="whats_new_title">%1$s 有什麼新功能</string>
     <string name="whats_your_status">您目前的狀態是什麼呢?</string>
-    <string name="widgets_not_available">小工具僅在 %1$s 25 或後續版本提供</string>
     <string name="widgets_not_available_title">無法使用</string>
     <string name="worker_download">正在下載檔案……</string>
     <string name="write_email">傳送電子郵件</string>
     <string name="wrong_storage_path">資料儲存資料夾不存在!</string>
     <string name="wrong_storage_path_desc">這可能是因為在另一台裝置上備份還原的關係。正在退回至預設值。請檢查設定以調整資料儲存資料夾。</string>
+    <plurals name="hours">
+        <item quantity="other">%d小時 </item>
+    </plurals>
+    <plurals name="minutes">
+        <item quantity="other">%d分鐘</item>
+    </plurals>
     <plurals name="sync_fail_in_favourites_content">
         <item quantity="other">無法同步 %1$d 個檔案(衝突:%2$d)</item>
     </plurals>

+ 1 - 1
app/src/main/res/values/strings.xml

@@ -1176,7 +1176,7 @@
     <string name="icon_of_widget_entry">Icon of widget entry</string>
     <string name="choose_widget">Choose widget</string>
     <string name="reload">Reload</string>
-    <string name="widgets_not_available">Widgets are only available on %1$s 25 or later</string>
+    <string name="widgets_not_available">Widgets are only available in %1$s 25 or later when the Dashboard app is enabled</string>
     <string name="widgets_not_available_title">Not available</string>
     <string name="icon_for_empty_list">Icon for empty list</string>
     <string name="no_items">No items</string>

+ 1 - 1
app/src/main/res/values/styles.xml

@@ -252,7 +252,7 @@
 
     <!-- Launch screen -->
     <style name="Theme.ownCloud.Launcher">
-        <item name="android:statusBarColor">@color/primary</item>
+        <item name="android:statusBarColor">@android:color/transparent</item>
         <item name="android:navigationBarColor">@color/primary</item>
         <item name="android:windowBackground">@color/primary</item>
         <item name="android:textColorHint">@color/secondary_text_color</item>

+ 9 - 4
app/src/test/java/com/nextcloud/client/onboarding/OnboardingServiceTest.kt

@@ -2,13 +2,15 @@
  * Nextcloud - Android Client
  *
  * SPDX-FileCopyrightText: 2019 Chris Narkiewicz <hello@ezaquarii.com>
+ * SPDX-FileCopyrightText: 2024 TSI-mc <surinder.kumar@t-systems.com>
  * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
  */
 package com.nextcloud.client.onboarding
 
-import android.accounts.Account
 import android.content.res.Resources
+import com.nextcloud.client.account.AnonymousUser
 import com.nextcloud.client.account.CurrentAccountProvider
+import com.nextcloud.client.account.User
 import com.nextcloud.client.preferences.AppPreferences
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
@@ -30,7 +32,7 @@ class OnboardingServiceTest {
     private lateinit var currentAccountProvider: CurrentAccountProvider
 
     @Mock
-    private lateinit var account: Account
+    private lateinit var user: User
 
     private lateinit var onboardingService: OnboardingServiceImpl
 
@@ -43,13 +45,16 @@ class OnboardingServiceTest {
     @Test
     fun `first run flag toggles with current current account`() {
         // GIVEN
-        //      current account is not set
+        //      current account is anonymous
+        whenever(currentAccountProvider.user).thenReturn(AnonymousUser("dummy"))
+
+        // THEN
         //      first run flag is true
         assertTrue(onboardingService.isFirstRun)
 
         // WHEN
         //      current account is set
-        whenever(currentAccountProvider.currentAccount).thenReturn(account)
+        whenever(currentAccountProvider.user).thenReturn(user)
 
         // THEN
         //      first run flag toggles

+ 1 - 1
build.gradle

@@ -11,7 +11,7 @@
 buildscript {
     ext {
         androidLibraryVersion ="ceb3812b688f2288911acf4d917596283fab0ea5"
-        androidPluginVersion = '8.7.1'
+        androidPluginVersion = '8.7.2'
         androidxMediaVersion = '1.4.1'
         androidxTestVersion = "1.6.1"
         appCompatVersion = '1.7.0'

+ 7 - 0
gradle/verification-metadata.xml

@@ -259,11 +259,13 @@
             <trusting group="androidx.annotation"/>
             <trusting group="androidx.appcompat"/>
             <trusting group="androidx.collection"/>
+            <trusting group="androidx.constraintlayout"/>
             <trusting group="androidx.core"/>
             <trusting group="androidx.databinding"/>
             <trusting group="androidx.fragment"/>
             <trusting group="androidx.graphics"/>
             <trusting group="androidx.lifecycle"/>
+            <trusting group="androidx.profileinstaller"/>
             <trusting group="androidx.transition" name="transition" version="1.5.0"/>
             <trusting group="androidx.webkit" name="webkit" version="1.11.0"/>
             <trusting group="androidx.webkit" name="webkit" version="1.12.0"/>
@@ -873,6 +875,11 @@
             <sha256 value="61f162bcc78a43f88415bec61aa80060ab14a968aad73696a4373ddb17211ae2" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
+      <component group="androidx.compose" name="compose-bom" version="2024.10.01">
+         <artifact name="compose-bom-2024.10.01.pom">
+            <sha256 value="e4b122da072402de71c8a20b85289d68e4d4446d7b1bee6dee4fef9d4677130b" origin="Generated by Gradle" reason="Artifact is not signed"/>
+         </artifact>
+      </component>
       <component group="androidx.compose.animation" name="animation-core" version="1.0.0-beta03">
          <artifact name="animation-core-1.0.0-beta03.aar">
             <sha256 value="4626086855eb6582dda9c3050c05bb56632f5a0308a3bb71a0f58def958602ca" origin="Generated by Gradle" reason="Artifact is not signed"/>

+ 2 - 4
scripts/analysis/analysis-wrapper.sh

@@ -18,6 +18,8 @@ ruby scripts/analysis/lint-up.rb
 lintValue=$?
 
 curl "https://www.kaminsky.me/nc-dev/$repository-findbugs/$stableBranch.xml" -o "/tmp/$stableBranch.xml"
+[[ ! -e test1 ]] && exit 1
+
 ruby scripts/analysis/spotbugs-up.rb "$stableBranch"
 spotbugsValue=$?
 
@@ -132,10 +134,6 @@ else
         exit 1
     fi
 
-    if [ $checkLibrary -eq 1 ]; then
-        exit 1
-    fi
-
     if [ ! $lintValue -eq 2 ]; then
         exit $lintValue
     fi