浏览代码

Merge master

Signed-off-by: alperozturk <alper_ozturk@proton.me>
alperozturk 1 年之前
父节点
当前提交
751fa5690d
共有 32 个文件被更改,包括 221 次插入151 次删除
  1. 1 1
      .github/workflows/assembleFlavors.yml
  2. 1 1
      .github/workflows/check.yml
  3. 2 2
      .github/workflows/codeql.yml
  4. 1 1
      .github/workflows/detectWrongSettings.yml
  5. 1 1
      .github/workflows/qa.yml
  6. 1 1
      .github/workflows/scorecard.yml
  7. 1 1
      .github/workflows/screenShotTest.yml
  8. 1 1
      .github/workflows/unit-tests.yml
  9. 二进制
      app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog.png
  10. 1 1
      app/src/androidTest/java/com/owncloud/android/AbstractIT.java
  11. 14 4
      app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java
  12. 2 26
      app/src/androidTest/java/com/owncloud/android/UploadIT.java
  13. 8 0
      app/src/androidTest/java/com/owncloud/android/ui/LoginIT.kt
  14. 9 1
      app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
  15. 1 1
      app/src/main/java/com/owncloud/android/ui/dialog/ChooseRichDocumentsTemplateDialogFragment.java
  16. 1 1
      app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.kt
  17. 1 1
      app/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java
  18. 1 1
      app/src/main/java/com/owncloud/android/ui/dialog/NoteDialogFragment.java
  19. 68 54
      app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java
  20. 1 1
      app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java
  21. 1 1
      app/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java
  22. 10 16
      app/src/main/java/com/owncloud/android/utils/KeyboardUtils.kt
  23. 1 0
      app/src/main/res/values-ar/strings.xml
  24. 1 0
      app/src/main/res/values-b+en+001/strings.xml
  25. 1 0
      app/src/main/res/values-bg-rBG/strings.xml
  26. 1 0
      app/src/main/res/values-br/strings.xml
  27. 1 0
      app/src/main/res/values-ca/strings.xml
  28. 1 0
      app/src/main/res/values-da/strings.xml
  29. 1 0
      app/src/main/res/values-el/strings.xml
  30. 12 12
      app/src/main/res/values-eu/strings.xml
  31. 1 1
      app/src/main/res/values-ko/strings.xml
  32. 74 21
      app/src/main/res/values-pt-rPT/strings.xml

+ 1 - 1
.github/workflows/assembleFlavors.yml

@@ -21,7 +21,7 @@ jobs:
         steps:
             -   uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v3
             -   name: set up JDK 17
-                uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3
+                uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3
                 with:
                     distribution: "temurin"
                     java-version: 17

+ 1 - 1
.github/workflows/check.yml

@@ -21,7 +21,7 @@ jobs:
         steps:
             -   uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v3
             -   name: Set up JDK 17
-                uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3
+                uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3
                 with:
                     distribution: "temurin"
                     java-version: 17

+ 2 - 2
.github/workflows/codeql.yml

@@ -32,7 +32,7 @@ jobs:
         with:
           swap-size-gb: 10
       - name: Initialize CodeQL
-        uses: github/codeql-action/init@fdcae64e1484d349b3366718cdfef3d404390e85 # v2.22.1
+        uses: github/codeql-action/init@0116bc2df50751f9724a2e35ef1f24d22f90e4e1 # v2.22.3
         with:
           languages: ${{ matrix.language }}
       - name: Set up JDK 17
@@ -46,4 +46,4 @@ jobs:
           echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties"
           ./gradlew assembleDebug
       - name: Perform CodeQL Analysis
-        uses: github/codeql-action/analyze@fdcae64e1484d349b3366718cdfef3d404390e85 # v2.22.1
+        uses: github/codeql-action/analyze@0116bc2df50751f9724a2e35ef1f24d22f90e4e1 # v2.22.3

+ 1 - 1
.github/workflows/detectWrongSettings.yml

@@ -18,7 +18,7 @@ jobs:
         steps:
             -   uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v3
             -   name: Set up JDK 17
-                uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3
+                uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3
                 with:
                     distribution: "temurin"
                     java-version: 17

+ 1 - 1
.github/workflows/qa.yml

@@ -22,7 +22,7 @@ jobs:
             -   uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v3
                 if: ${{ steps.check-secrets.outputs.ok == 'true' }}
             -   name: set up JDK 17
-                uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3
+                uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3
                 if: ${{ steps.check-secrets.outputs.ok == 'true' }}
                 with:
                     distribution: "temurin"

+ 1 - 1
.github/workflows/scorecard.yml

@@ -37,6 +37,6 @@ jobs:
 
       # Upload the results to GitHub's code scanning dashboard.
       - name: "Upload to code-scanning"
-        uses: github/codeql-action/upload-sarif@fdcae64e1484d349b3366718cdfef3d404390e85 # v2.22.1
+        uses: github/codeql-action/upload-sarif@0116bc2df50751f9724a2e35ef1f24d22f90e4e1 # v2.22.3
         with:
           sarif_file: results.sarif

+ 1 - 1
.github/workflows/screenShotTest.yml

@@ -40,7 +40,7 @@ jobs:
                         ~/.android/adb*
                     key: avd-${{ matrix.api-level }}
 
-            -   uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3
+            -   uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3
                 with:
                     distribution: "temurin"
                     java-version: 17

+ 1 - 1
.github/workflows/unit-tests.yml

@@ -20,7 +20,7 @@ jobs:
         steps:
             -   uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
             -   name: Set up JDK 17
-                uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3.12.0
+                uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3.13.0
                 with:
                     distribution: "temurin"
                     java-version: 17

二进制
app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog.png


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

@@ -314,7 +314,7 @@ public abstract class AbstractIT {
         return currentActivity;
     }
 
-    protected void shortSleep() {
+    protected static void shortSleep() {
         try {
             Thread.sleep(2000);
         } catch (InterruptedException e) {

+ 14 - 4
app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java

@@ -135,10 +135,20 @@ public abstract class AbstractOnServerIT extends AbstractIT {
                                    .isSuccess());
                 }
 
-                assertTrue(new RemoveFileRemoteOperation(remoteFile.getRemotePath())
-                               .execute(client)
-                               .isSuccess()
-                          );
+                boolean removeResult = false;
+                for (int i = 0; i < 5; i++) {
+                    removeResult = new RemoveFileRemoteOperation(remoteFile.getRemotePath())
+                        .execute(client)
+                        .isSuccess();
+                    
+                    if (removeResult) {
+                        break;
+                    }
+
+                    shortSleep();
+                }
+
+                assertTrue(removeResult);
             }
         }
     }

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

@@ -41,7 +41,6 @@ import com.owncloud.android.operations.RemoveFileOperation;
 import com.owncloud.android.operations.UploadFileOperation;
 import com.owncloud.android.utils.FileStorageUtils;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -106,29 +105,6 @@ public class UploadIT extends AbstractOnServerIT {
         createDummyFiles();
     }
 
-    @After
-    public void after() {
-        RemoteOperationResult result = new RefreshFolderOperation(getStorageManager().getFileByPath("/"),
-                                                                  System.currentTimeMillis() / 1000L,
-                                                                  false,
-                                                                  true,
-                                                                  getStorageManager(),
-                                                                  user,
-                                                                  targetContext)
-            .execute(client);
-
-        // cleanup only if folder exists
-        if (result.isSuccess() && getStorageManager().getFileByDecryptedRemotePath(FOLDER) != null) {
-            new RemoveFileOperation(getStorageManager().getFileByDecryptedRemotePath(FOLDER),
-                                    false,
-                                    user,
-                                    false,
-                                    targetContext,
-                                    getStorageManager())
-                .execute(client);
-        }
-    }
-
     @Test
     public void testEmptyUpload() {
         OCUpload ocUpload = new OCUpload(FileStorageUtils.getTemporalPath(account.name) + "/empty.txt",
@@ -529,8 +505,8 @@ public class UploadIT extends AbstractOnServerIT {
 
         assertNotNull(ocFile);
         assertEquals(remotePath, ocFile.getRemotePath());
-        assertEquals(new ImageDimension(451f, 529f), ocFile.getImageDimension());
-        assertEquals(new GeoLocation(49.99679166666667, 8.67198611111111), ocFile.getGeoLocation());
+        assertEquals(new ImageDimension(300f, 200f), ocFile.getImageDimension());
+        assertEquals(new GeoLocation(64, -46), ocFile.getGeoLocation());
     }
 
     private void verifyStoragePath(OCFile file) {

+ 8 - 0
app/src/androidTest/java/com/owncloud/android/ui/LoginIT.kt

@@ -20,6 +20,7 @@
  */
 package com.owncloud.android.ui
 
+import android.os.Build
 import androidx.test.core.app.ActivityScenario
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.action.ViewActions
@@ -28,6 +29,7 @@ import androidx.test.espresso.web.sugar.Web
 import androidx.test.espresso.web.webdriver.DriverAtoms
 import androidx.test.espresso.web.webdriver.Locator
 import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.nextcloud.client.account.UserAccountManager
 import com.nextcloud.client.account.UserAccountManagerImpl
@@ -59,6 +61,12 @@ class LoginIT : AbstractIT() {
     @Test
     @Throws(InterruptedException::class)
     @Suppress("MagicNumber", "SwallowedException")
+
+    /**
+     * The CI/CD pipeline is encountering issues related to the Android version for this functionality.
+     * Therefore the test will only be executed on Android versions 10 and above.
+     */
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     fun login() {
         val arguments = InstrumentationRegistry.getArguments()
         val baseUrl = arguments.getString("TEST_SERVER_URL")!!

+ 9 - 1
app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java

@@ -26,6 +26,7 @@ package com.nextcloud.client.preferences;
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.res.Configuration;
 
 import com.google.gson.Gson;
 import com.nextcloud.appReview.AppReviewShownModel;
@@ -437,7 +438,14 @@ public final class AppPreferencesImpl implements AppPreferences {
 
     @Override
     public boolean isDarkModeEnabled() {
-        return getDarkThemeMode() == DarkMode.DARK;
+        DarkMode mode = getDarkThemeMode();
+
+        if (mode == DarkMode.SYSTEM) {
+            int currentNightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
+            return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
+        }
+
+        return mode == DarkMode.DARK;
     }
 
     @Override

+ 1 - 1
app/src/main/java/com/owncloud/android/ui/dialog/ChooseRichDocumentsTemplateDialogFragment.java

@@ -138,7 +138,7 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
     @Override
     public void onResume() {
         super.onResume();
-        keyboardUtils.showKeyboardForEditText(binding.filename);
+        keyboardUtils.showKeyboardForEditText(requireDialog().getWindow(), binding.filename);
     }
 
     @NonNull

+ 1 - 1
app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.kt

@@ -119,7 +119,7 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
 
     override fun onResume() {
         super.onResume()
-        keyboardUtils.showKeyboardForEditText(binding.filename)
+        keyboardUtils.showKeyboardForEditText(dialog?.window, binding.filename)
     }
 
     override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

+ 1 - 1
app/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java

@@ -115,7 +115,7 @@ public class CreateFolderDialogFragment
         super.onResume();
 
         bindButton();
-        keyboardUtils.showKeyboardForEditText(binding.userInput);
+        keyboardUtils.showKeyboardForEditText(requireDialog().getWindow(), binding.userInput);
     }
 
     @NonNull

+ 1 - 1
app/src/main/java/com/owncloud/android/ui/dialog/NoteDialogFragment.java

@@ -90,7 +90,7 @@ public class NoteDialogFragment extends DialogFragment implements DialogInterfac
     @Override
     public void onResume() {
         super.onResume();
-        keyboardUtils.showKeyboardForEditText(binding.noteText);
+        keyboardUtils.showKeyboardForEditText(requireDialog().getWindow(), binding.noteText);
     }
 
     @NonNull

+ 68 - 54
app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java

@@ -34,8 +34,8 @@ import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.Button;
 
+import com.google.android.material.button.MaterialButton;
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.google.common.collect.Sets;
 import com.nextcloud.client.di.Injectable;
@@ -65,7 +65,7 @@ import androidx.fragment.app.DialogFragment;
  * Triggers the rename operation when name is confirmed.
  */
 public class RenameFileDialogFragment
-    extends DialogFragment implements DialogInterface.OnClickListener, Injectable {
+    extends DialogFragment implements DialogInterface.OnClickListener, TextWatcher, Injectable {
 
     private static final String ARG_TARGET_FILE = "TARGET_FILE";
     private static final String ARG_PARENT_FOLDER = "PARENT_FOLDER";
@@ -76,8 +76,8 @@ public class RenameFileDialogFragment
 
     private EditBoxDialogBinding binding;
     private OCFile mTargetFile;
-    private Button positiveButton;
-
+    private MaterialButton positiveButton;
+    private Set<String> fileNames;
 
     /**
      * Public factory method to create new RenameFileDialogFragment instances.
@@ -97,20 +97,13 @@ public class RenameFileDialogFragment
     @Override
     public void onStart() {
         super.onStart();
-
-        AlertDialog alertDialog = (AlertDialog) getDialog();
-
-        if (alertDialog != null) {
-            positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
-            viewThemeUtils.platform.colorTextButtons(positiveButton,
-                                                     alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
-        }
+        initAlertDialog();
     }
 
     @Override
     public void onResume() {
         super.onResume();
-        keyboardUtils.showKeyboardForEditText(binding.userInput);
+        keyboardUtils.showKeyboardForEditText(requireDialog().getWindow(), binding.userInput);
     }
 
     @NonNull
@@ -133,62 +126,46 @@ public class RenameFileDialogFragment
 
         OCFile parentFolder = requireArguments().getParcelable(ARG_PARENT_FOLDER);
         List<OCFile> folderContent = fileDataStorageManager.getFolderContent(parentFolder, false);
-        Set<String> fileNames = Sets.newHashSetWithExpectedSize(folderContent.size());
+        fileNames = Sets.newHashSetWithExpectedSize(folderContent.size());
 
         for (OCFile file : folderContent) {
             fileNames.add(file.getFileName());
         }
 
         // Add TextChangedListener to handle showing/hiding the input warning message
-        binding.userInput.addTextChangedListener(new TextWatcher() {
-            @Override
-            public void afterTextChanged(Editable s) {
-            }
+        binding.userInput.addTextChangedListener(this);
 
-            @Override
-            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-            }
+        // Build the dialog
+        MaterialAlertDialogBuilder builder = buildMaterialAlertDialog(view);
 
-            /**
-             * When user enters a hidden file name, the 'hidden file' message is shown.
-             * Otherwise, the message is ensured to be hidden.
-             */
-            @Override
-            public void onTextChanged(CharSequence s, int start, int before, int count) {
-                String newFileName = "";
-                if (binding.userInput.getText() != null) {
-                    newFileName = binding.userInput.getText().toString().trim();
-                }
-
-                if (!TextUtils.isEmpty(newFileName) && newFileName.charAt(0) == '.') {
-                    binding.userInputContainer.setError(getText(R.string.hidden_file_name_warning));
-                } else if (TextUtils.isEmpty(newFileName)) {
-                    binding.userInputContainer.setError(getString(R.string.filename_empty));
-                    positiveButton.setEnabled(false);
-                } else if (fileNames.contains(newFileName)) {
-                    binding.userInputContainer.setError(getText(R.string.file_already_exists));
-                    positiveButton.setEnabled(false);
-                } else if (binding.userInputContainer.getError() != null) {
-                    binding.userInputContainer.setError(null);
-                    // Called to remove extra padding
-                    binding.userInputContainer.setErrorEnabled(false);
-                    positiveButton.setEnabled(true);
-                }
-            }
-        });
+        viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.userInputContainer.getContext(), builder);
 
-        // Build the dialog
+        return builder.create();
+    }
+
+    private MaterialAlertDialogBuilder buildMaterialAlertDialog(View view) {
         MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity());
-        builder.setView(view)
+
+        builder
+            .setView(view)
             .setPositiveButton(R.string.file_rename, this)
-            .setNeutralButton(R.string.common_cancel, this)
+            .setNegativeButton(R.string.common_cancel, this)
             .setTitle(R.string.rename_dialog_title);
 
-        viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.userInputContainer.getContext(), builder);
-
-        return builder.create();
+        return builder;
     }
 
+    private void initAlertDialog() {
+        AlertDialog alertDialog = (AlertDialog) getDialog();
+
+        if (alertDialog != null) {
+            positiveButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
+            MaterialButton negativeButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE);
+
+            viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton);
+            viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton);
+        }
+    }
 
     @Override
     public void onClick(DialogInterface dialog, int which) {
@@ -219,4 +196,41 @@ public class RenameFileDialogFragment
         super.onDestroyView();
         binding = null;
     }
+
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+    }
+
+    /**
+     * When user enters a hidden file name, the 'hidden file' message is shown.
+     * Otherwise, the message is ensured to be hidden.
+     */
+    @Override
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+        String newFileName = "";
+        if (binding.userInput.getText() != null) {
+            newFileName = binding.userInput.getText().toString().trim();
+        }
+
+        if (!TextUtils.isEmpty(newFileName) && newFileName.charAt(0) == '.') {
+            binding.userInputContainer.setError(getText(R.string.hidden_file_name_warning));
+        } else if (TextUtils.isEmpty(newFileName)) {
+            binding.userInputContainer.setError(getString(R.string.filename_empty));
+            positiveButton.setEnabled(false);
+        } else if (fileNames.contains(newFileName)) {
+            binding.userInputContainer.setError(getText(R.string.file_already_exists));
+            positiveButton.setEnabled(false);
+        } else if (binding.userInputContainer.getError() != null) {
+            binding.userInputContainer.setError(null);
+            // Called to remove extra padding
+            binding.userInputContainer.setErrorEnabled(false);
+            positiveButton.setEnabled(true);
+        }
+    }
+
+    @Override
+    public void afterTextChanged(Editable s) {
+
+    }
 }

+ 1 - 1
app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java

@@ -83,7 +83,7 @@ public class RenamePublicShareDialogFragment
     @Override
     public void onResume() {
         super.onResume();
-        keyboardUtils.showKeyboardForEditText(binding.userInput);
+        keyboardUtils.showKeyboardForEditText(requireDialog().getWindow(), binding.userInput);
     }
 
     @NonNull

+ 1 - 1
app/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java

@@ -99,7 +99,7 @@ public class SharePasswordDialogFragment extends DialogFragment implements Dialo
     @Override
     public void onResume() {
         super.onResume();
-        keyboardUtils.showKeyboardForEditText(binding.sharePassword);
+        keyboardUtils.showKeyboardForEditText(requireDialog().getWindow(), binding.sharePassword);
     }
 
     /**

+ 10 - 16
app/src/main/java/com/owncloud/android/utils/KeyboardUtils.kt

@@ -1,7 +1,9 @@
 /*
  * Nextcloud Android client application
  *
+ *  @author ZetaTom
  *  @author Álvaro Brey
+ *  Copyright (C) 2023 ZetaTom
  *  Copyright (C) 2022 Álvaro Brey
  *  Copyright (C) 2022 Nextcloud GmbH
  *
@@ -22,26 +24,18 @@
 
 package com.owncloud.android.utils
 
-import android.content.Context
-import android.view.inputmethod.InputMethodManager
+import android.view.Window
 import android.widget.EditText
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsCompat
 import javax.inject.Inject
 
 class KeyboardUtils @Inject constructor() {
 
-    fun showKeyboardForEditText(editText: EditText) {
-        editText.requestFocus()
-        // needs 100ms delay to account for focus animations
-        editText.postDelayed({
-            val context = editText.context
-            if (context != null) {
-                val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
-                inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT)
-            }
-        }, SHOW_INPUT_DELAY_MILLIS)
-    }
-
-    companion object {
-        private const val SHOW_INPUT_DELAY_MILLIS = 100L
+    fun showKeyboardForEditText(window: Window?, editText: EditText) {
+        if (window != null) {
+            editText.requestFocus()
+            WindowCompat.getInsetsController(window, editText).show(WindowInsetsCompat.Type.ime())
+        }
     }
 }

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

@@ -843,6 +843,7 @@
     <string name="trashbin_empty_message">ستتمكن من استعادة الملفات المحذوفة من هنا.</string>
     <string name="trashbin_file_not_deleted">الملف %1$s لا يمكن حذفه!</string>
     <string name="trashbin_file_not_restored">الملف %1$s لا يمكن إسترجاعه!</string>
+    <string name="trashbin_file_remove">حذف نهائي</string>
     <string name="trashbin_loading_failed">فشل تحميل سلة المحذوفات</string>
     <string name="trashbin_not_emptied">تعذر حذف الملفات نهائياً!</string>
     <string name="unlock_file">فتح قفل الملف</string>

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

@@ -836,6 +836,7 @@
     <string name="trashbin_empty_message">You will be able to recover deleted files from here.</string>
     <string name="trashbin_file_not_deleted">File %1$s could not be deleted!</string>
     <string name="trashbin_file_not_restored">File %1$s could not be restored!</string>
+    <string name="trashbin_file_remove">Delete permanently</string>
     <string name="trashbin_loading_failed">Loading trash bin failed!</string>
     <string name="trashbin_not_emptied">Files could not be deleted permanently!</string>
     <string name="unlock_file">Unlock file</string>

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

@@ -807,6 +807,7 @@
     <string name="trashbin_empty_message">Ще можете да възстановите изтритите файлове от тук.</string>
     <string name="trashbin_file_not_deleted">Файлът %1$s не може да бъде изтрит!</string>
     <string name="trashbin_file_not_restored">Файлът %1$s не може да бъде възстановен!</string>
+    <string name="trashbin_file_remove">Изтрий завинаги</string>
     <string name="trashbin_loading_failed">Зареждането на кошчето е неуспешно!</string>
     <string name="trashbin_not_emptied">Файловете не могат да бъдат окончателно изтрити!</string>
     <string name="unlock_file">Отключване на файл</string>

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

@@ -666,6 +666,7 @@
     <string name="trashbin_empty_message">Posupl eo deoc\'h adtapout ar restroù lamet adalek al lec\'h mañ</string>
     <string name="trashbin_file_not_deleted">Ar restr %1$s n\'eo ket evit bezhaãn lamet !</string>
     <string name="trashbin_file_not_restored">Ar restr %1$s n\'eo ket evit bezha adlakaet !</string>
+    <string name="trashbin_file_remove">Lamet da viken</string>
     <string name="trashbin_not_emptied">N\'eo ket posupl lemel ar restr da virviken !</string>
     <string name="unlock_file">Dibrennan ar restr</string>
     <string name="unread_comments">Bez eez eus kemenadennom n\'int ket bet lennet</string>

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

@@ -796,6 +796,7 @@
     <string name="trashbin_empty_message">Des d\'aquí es podran recuperar fitxers suprimits.</string>
     <string name="trashbin_file_not_deleted">El fitxer %1$s no es pot suprimir!</string>
     <string name="trashbin_file_not_restored">El fitxer %1$s no es pot restaurar!</string>
+    <string name="trashbin_file_remove">Suprimeix permanentment</string>
     <string name="trashbin_loading_failed">No s\'ha pogut carregar la paperera!</string>
     <string name="trashbin_not_emptied">Els fitxers no s\'han pogut suprimir permanentment!</string>
     <string name="unlock_file">Desbloca el fitxer</string>

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

@@ -819,6 +819,7 @@ Enheds legitimationsoplysninger er sat op
     <string name="trashbin_empty_message">Du vil kunne gendanne slettede filer herfra.</string>
     <string name="trashbin_file_not_deleted">Fil %1$s kunne ikke slettes!</string>
     <string name="trashbin_file_not_restored">Fil %1$s kunne ikke genskabes!</string>
+    <string name="trashbin_file_remove">Slet permanent</string>
     <string name="trashbin_loading_failed">Indlæsning af papirkurv mislykkedes!</string>
     <string name="trashbin_not_emptied">Filer kunne ikke permanent slettes!</string>
     <string name="unlock_file">Lås op filen</string>

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

@@ -811,6 +811,7 @@
     <string name="trashbin_empty_message">Μπορείτε να ανακτήσετε διαγραμμένα αρχεία από εδώ.</string>
     <string name="trashbin_file_not_deleted">Το αρχείο %1$s δεν μπορεί να διαγραφεί!</string>
     <string name="trashbin_file_not_restored">Το αρχείο %1$s δεν μπορεί να ανακτηθεί!</string>
+    <string name="trashbin_file_remove">Διαγραφή οριστικά</string>
     <string name="trashbin_loading_failed">Αποτυχία φόρτωσης κάδου ανακύκλωσης!</string>
     <string name="trashbin_not_emptied">Τα αρχεία δεν θα διαγραφούν μόνιμα!</string>
     <string name="unlock_file">Ξεκλείδωμα αρχείου</string>

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

@@ -312,7 +312,7 @@
     <string name="etm_transfer_remote_path">Urruneko bide-izena</string>
     <string name="etm_transfer_type">Transferitu</string>
     <string name="etm_transfer_type_download">Deskargatu</string>
-    <string name="etm_transfer_type_upload">Kargatu</string>
+    <string name="etm_transfer_type_upload">Igo</string>
     <string name="fab_label">Gehitu edo igo</string>
     <string name="failed_to_download">Huts egin du fitxategia deskarga-kudeatzailera pasatzean</string>
     <string name="failed_to_print">Huts egin du fitxategia inprimatzean</string>
@@ -347,7 +347,7 @@
     <string name="file_management_permission">Baimenak behar dira</string>
     <string name="file_management_permission_optional">Biltegiratze-baimenak</string>
     <string name="file_management_permission_optional_text">%1$shobeto dabil biltegia atzitzeko baimenekin. Fitxategi guztietarako sarbide osoa aukera dezakezu, edo argazki eta bideoak \"irakurtzeko soilik\" baimena eman.</string>
-    <string name="file_management_permission_text">%1$s-k fitxategiak kudeatzeko baimenak behar ditu fitxategiak kargatzeko. Fitxategi guztietarako sarbide osoa aukera dezakezu, edo \"irakurtzeko soilik\" baimena argazki eta bideoentzat.</string>
+    <string name="file_management_permission_text">%1$s-k fitxategiak kudeatzeko baimenak behar ditu fitxategiak igotzeko. Fitxategi guztietarako sarbide osoa aukera dezakezu, edo \"irakurtzeko soilik\" baimena argazki eta bideoentzat.</string>
     <string name="file_migration_checking_destination">Helburua egiaztatzen...</string>
     <string name="file_migration_cleaning">Garbitzen…</string>
     <string name="file_migration_dialog_title">Datu-biltegiratze karpeta eguneratzen</string>
@@ -430,7 +430,7 @@
     <string name="image_preview_unit_millimetres">%s mm</string>
     <string name="image_preview_unit_seconds">%s s</string>
     <string name="in_folder">%1$skarpetan</string>
-    <string name="instant_upload_existing">Existitzen diren fitxategiak ere kargatu</string>
+    <string name="instant_upload_existing">Existitzen diren fitxategiak ere igo</string>
     <string name="instant_upload_on_charging">Igo bakarrik gailua kargatzean</string>
     <string name="instant_upload_path">/InstantUpload</string>
     <string name="invalid_url">URL baliogabea</string>
@@ -439,7 +439,7 @@
     <string name="last_backup">Azken babeskopia: %1$s</string>
     <string name="link">Esteka</string>
     <string name="link_name">Esteka-izena</string>
-    <string name="link_share_allow_upload_and_editing">Onartu kargatzea eta edizioa</string>
+    <string name="link_share_allow_upload_and_editing">Onartu igotzea eta edizioa</string>
     <string name="link_share_editing">Edizioa</string>
     <string name="link_share_file_drop">Fitxategia jaregitea (igotzeko soilik)</string>
     <string name="link_share_view_only">Ikustea soilik</string>
@@ -529,7 +529,7 @@
     <string name="notification_channel_push_description">Erakutsi zerbitzariak bidalitako push jakinarazpenak: Aipamenak iruzkinetan, urruneko partekatze berrien harrera, administratzaileak argitaratutako argitalpenak etab.</string>
     <string name="notification_channel_push_name">Push jakinarazpenak</string>
     <string name="notification_channel_upload_description">Erakutsi igoeraren egoera</string>
-    <string name="notification_channel_upload_name_short">Kargak</string>
+    <string name="notification_channel_upload_name_short">Igotzeak</string>
     <string name="notification_icon">Jakinarazpen ikonoa</string>
     <string name="notifications_no_results_headline">Jakinarazpenik ez</string>
     <string name="notifications_no_results_message">Begiratu beranduago, mesedez.</string>
@@ -563,13 +563,13 @@
     <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
     <string name="player_stop">gelditu</string>
     <string name="player_toggle">txandakatu</string>
-    <string name="power_save_check_dialog_message">Energia aurrezteko kontrola desgaituz gero, fitxategiak bateria baxu dagoenean kargatu litezke!</string>
+    <string name="power_save_check_dialog_message">Energia aurrezteko kontrola desgaituz gero, fitxategiak bateria baxu dagoenean igo litezke!</string>
     <string name="pref_behaviour_entries_delete_file">ezabatua</string>
     <string name="pref_behaviour_entries_keep_file">jatorrizko karpetan mantenduko da</string>
     <string name="pref_behaviour_entries_move">aplikazioaren karpetara mugitu da</string>
     <string name="pref_instant_name_collision_policy_dialogTitle">Zer egin fitxategia dagoeneko existitzen bada?</string>
     <string name="pref_instant_name_collision_policy_entries_always_ask">Galdetu beti</string>
-    <string name="pref_instant_name_collision_policy_entries_cancel">Saltatu karga</string>
+    <string name="pref_instant_name_collision_policy_entries_cancel">Saltatu igotzea</string>
     <string name="pref_instant_name_collision_policy_entries_overwrite">Gainidatzi urruneko bertsioa</string>
     <string name="pref_instant_name_collision_policy_entries_rename">Aldatu izena bertsio berriari</string>
     <string name="pref_instant_name_collision_policy_title">Zer egin fitxategia dagoeneko existitzen bada?</string>
@@ -617,7 +617,7 @@
     <string name="prefs_show_hidden_files">Erakutsi ezkutuko fitxategiak</string>
     <string name="prefs_sourcecode">Eskuratu iturburu-kodea</string>
     <string name="prefs_storage_path">Datu-biltegiratze karpeta</string>
-    <string name="prefs_sycned_folders_summary">Kudeatu karpeten kargatze automatikoa</string>
+    <string name="prefs_sycned_folders_summary">Kudeatu karpeten igotze automatikoa</string>
     <string name="prefs_synced_folders_local_path_title">Karpeta lokala</string>
     <string name="prefs_synced_folders_remote_path_title">Urruneko karpeta</string>
     <string name="prefs_theme_title">Gaia</string>
@@ -806,7 +806,7 @@
     <string name="sync_fail_ticker_unauthorized">Sinkronizazioak huts egin du, hasi saioa berriz</string>
     <string name="sync_file_nothing_to_do_msg">Fitxategien edukiak dagoeneko sinkronizaturik</string>
     <string name="sync_folder_failed_content">%1$s karpetaren sinkronizazioa ezin izan da osatu</string>
-    <string name="sync_foreign_files_forgotten_explanation">1.3.16 bertsiotik aurrera, gailu honetatik kargatzen diren fitxategiak %1$s  karpeta lokalera kopiatzen dira, fitxategi bat hainbat konturekin sinkronizatzen denean datuak gal ez daitezen.\n\nAldaketa honen ondorioz, aplikazio honen aurreko bertsioekin kargatutako fitxategi guztiak %2$s karpetara kopiatu dira. Hala ere, kontua sinkronizatzean gertatutako akats batek eragiketa hori osatzea eragotzi du. Fitxategiak dauden bezala utz ditzakezu eta %3$s(r)ako esteka ezabatu, edo fitxategia(k) %1$s karpetara eraman eta %4$s(r)ako esteka mantendu.\n\nBehean zerrendatuta daude fitxategi lokala(k) eta estekatutako %5$s(e)ko urruneko fitxategia(k).</string>
+    <string name="sync_foreign_files_forgotten_explanation">1.3.16 bertsiotik aurrera, gailu honetatik kargatzen diren fitxategiak %1$s  karpeta lokalera kopiatzen dira, fitxategi bat hainbat konturekin sinkronizatzen denean datuak gal ez daitezen.\n\nAldaketa honen ondorioz, aplikazio honen aurreko bertsioekin igotako fitxategi guztiak %2$s karpetara kopiatu dira. Hala ere, kontua sinkronizatzean gertatutako akats batek eragiketa hori osatzea eragotzi du. Fitxategiak dauden bezala utz ditzakezu eta %3$s(r)ako esteka ezabatu, edo fitxategia(k) %1$s karpetara eraman eta %4$s(r)ako esteka mantendu.\n\nBehean zerrendatuta daude fitxategi lokala(k) eta estekatutako %5$s(e)ko urruneko fitxategia(k).</string>
     <string name="sync_foreign_files_forgotten_ticker">Fitxategi lokal batzuk ahaztu dira</string>
     <string name="sync_in_progress">Fitxategiaren bertsio berriena ekartzen.</string>
     <string name="sync_not_enough_space_dialog_action_choose">Aukeratu zer sinkronizatu</string>
@@ -817,7 +817,7 @@
     <string name="sync_string_files">Fitxategiak</string>
     <string name="synced_folder_settings_button">Ezarpenak botoia</string>
     <string name="synced_folders_configure_folders">Konfiguratu karpetak</string>
-    <string name="synced_folders_new_info">Berehalako karga erabat aldatu da. Konfiguratu berriro zure karga automatikoa menu nagusitik.\n\nGozatu karga automatiko berri eta hedatuaz. </string>
+    <string name="synced_folders_new_info">Berehalako igotzeak guztiz aldatu dira. Konfiguratu berriro zure igotze automatikoa menu nagusitik.\n\nGozatu igotze automatiko berri eta hedatuaz. </string>
     <string name="synced_folders_no_results">Ez da multimedia karpetarik aurkitu</string>
     <string name="synced_folders_preferences_folder_path"> %1$s-(r)entzat</string>
     <string name="synced_folders_type">Mota</string>
@@ -863,7 +863,7 @@
     <string name="upload_file_dialog_filetype_snippet_text">Kode-zati testu-fitxategia(.txt)</string>
     <string name="upload_file_dialog_title">Sartu igoko den fitxategi-izena eta fitxategi mota</string>
     <string name="upload_files">Igo fitxategiak</string>
-    <string name="upload_item_action_button">Kargatu elementuaren ekintza botoia</string>
+    <string name="upload_item_action_button">Elementua igotzeko ekintza botoia</string>
     <string name="upload_list_delete">Ezabatu</string>
     <string name="upload_list_empty_headline">Ezin dira fitxategiak igo</string>
     <string name="upload_list_empty_text_auto_upload">Edukiak igo edo auto-igotzea aktiba ezazu.</string>
@@ -882,7 +882,7 @@
     <string name="uploader_error_message_read_permission_not_granted">%1$s ez dago baimendua jasotako fitxategia irakurtzeko</string>
     <string name="uploader_error_message_source_file_not_copied">Fitxategia ezin izan da aldi baterako karpetan kopiatu. Saiatu berriro bidaltzen.</string>
     <string name="uploader_error_message_source_file_not_found">Kargatzeko hautatutako fitxategia ez da aurkitu. Mesedez, egiaztatu fitxategia existitzen dela.</string>
-    <string name="uploader_error_title_file_cannot_be_uploaded">Fitxategi hau ezin da kargatu</string>
+    <string name="uploader_error_title_file_cannot_be_uploaded">Fitxategi hau ezin da igo</string>
     <string name="uploader_error_title_no_file_to_upload">Ez dago fitxategirik kargatzeko</string>
     <string name="uploader_info_dirname">Karpetaren izena</string>
     <string name="uploader_top_message">Aukeratu karga-karpeta</string>

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

@@ -426,7 +426,7 @@
     <string name="last_backup">마지막 백업: %1$s</string>
     <string name="link">링크</string>
     <string name="link_name">링크 이름</string>
-    <string name="link_share_allow_upload_and_editing">업로드 및 편집 허용</string>
+    <string name="link_share_allow_upload_and_editing">업로드와 수정 허용</string>
     <string name="link_share_editing">글 수정</string>
     <string name="link_share_file_drop">파일 보관소 (업로드만 허용)</string>
     <string name="link_share_view_only">읽기 전용</string>

+ 74 - 21
app/src/main/res/values-pt-rPT/strings.xml

@@ -129,7 +129,7 @@
     <string name="common_switch_to_account">Mudar para a conta</string>
     <string name="common_yes">Sim</string>
     <string name="community_beta_headline">Teste a versão de desenvolvimento</string>
-    <string name="community_beta_text">Inclui todas as futuras e mais recentes funcionalidades. Falhas/erros podem ocorrer, se e quando tal acontecer, por favor, reporte as suas descobertas.</string>
+    <string name="community_beta_text">Isto inclui todas as futuras e mais recentes funcionalidades. Podem ocorrer falhas/erros, se e quando tal acontecer, por favor, reporte as suas descobertas.</string>
     <string name="community_contribute_forum_forum">fórum</string>
     <string name="community_contribute_forum_text">Ajude outros em</string>
     <string name="community_contribute_github_text">Reveja, emende e escreva o código, consulte %1$s para detalhes.</string>
@@ -141,12 +141,12 @@
     <string name="community_rc_fdroid">Obter versão candidata a lançamento a partir da aplicação F-Droid</string>
     <string name="community_rc_play_store">Obter versão candidata a lançamento a partir da loja Google Play</string>
     <string name="community_release_candidate_headline">Versão candidata a lançamento</string>
-    <string name="community_release_candidate_text">A versão candidata a lançamento (RC) é um snapshot da próxima versão e é espectável que seja estável. Através do teste da sua configuração individual pode ajudar-nos a assegurá-lo. Para testar, inscreva-se na loja Play ou verifique a secção \"Version\" do F-Droid.</string>
+    <string name="community_release_candidate_text">A versão candidata de lançamento (RC) é um \'\'snapshot\'\' da próxima versão e é expetável que seja estável. Se testar a sua configuração individual pode ajudar-nos a assegurá-lo. Para testar, inscreva-se na loja Play ou consulte a secção \"Version\" do F-Droid.</string>
     <string name="community_testing_bug_text">Encontrou um erro? Ocorrências estranhas?</string>
     <string name="community_testing_headline">Ajude-nos, testando</string>
     <string name="community_testing_report_text">Reportar um problema no Github</string>
     <string name="configure_new_media_folder_detection_notifications">Configure</string>
-    <string name="confirm_removal">Remove localmente a criptografia</string>
+    <string name="confirm_removal">Remove encriptação local</string>
     <string name="confirmation_remove_file_alert">Deseja realmente apagar %1$s?</string>
     <string name="confirmation_remove_files_alert">Quer realmente remover os itens seleccionados?</string>
     <string name="confirmation_remove_folder_alert">Deseja realmente apagar %1$s e o seu conteúdo?</string>
@@ -156,7 +156,7 @@
     <string name="conflict_file_headline">Ficheiro em conflito %1$s</string>
     <string name="conflict_local_file">Ficheiro local</string>
     <string name="conflict_message_description">Se selecionou ambas as versões, o ficheiro local terá um número acrescentado ao seu nome.</string>
-    <string name="conflict_server_file">Arquivo do servidor</string>
+    <string name="conflict_server_file">Ficheiro do servidor</string>
     <string name="contact_backup_title">Cópia de segurança dos contactos</string>
     <string name="contactlist_item_icon">Ícone de utilizador de lista de contactos</string>
     <string name="contactlist_no_permission">Sem permissão concedida, nada para importar.</string>
@@ -195,7 +195,7 @@
     <string name="delete_entries">Apagar entradas</string>
     <string name="delete_link">Eliminar hiperligação</string>
     <string name="deselect_all">Desseleccionado tudo</string>
-    <string name="destination_filename">Nome do arquivo de destino</string>
+    <string name="destination_filename">Nome do ficheiro de destino</string>
     <string name="dev_version_new_version_available">Nova versão disponível</string>
     <string name="dev_version_no_information_available">Nenhuma informação disponível.</string>
     <string name="dev_version_no_new_version_available">Nenhuma nova versão disponível</string>
@@ -207,12 +207,16 @@
     <string name="disable_new_media_folder_detection_notifications">Desativar</string>
     <string name="dismiss">Dispensar</string>
     <string name="dismiss_notification_description">Dispensar notificação</string>
-    <string name="displays_mnemonic">Apresenta a sua frase-chave de 12 palavras</string>
+    <string name="displays_mnemonic">Exibe a sua frase-chave de 12 palavras</string>
     <string name="dnd">Não incomodar</string>
     <string name="document_scan_export_dialog_images">Múltiplas imagens</string>
+    <string name="document_scan_export_dialog_pdf">Ficheiro PDF</string>
+    <string name="document_scan_export_dialog_title">Escolher tipo de exportação</string>
+    <string name="document_scan_pdf_generation_failed">Geração de PDF falhou</string>
+    <string name="document_scan_pdf_generation_in_progress">A gerar PDF...</string>
     <string name="done">Concluído</string>
     <string name="dontClear">Não limpar</string>
-    <string name="download_cannot_create_file">Não é possível criar ficheiro local</string>
+    <string name="download_cannot_create_file">Não é possível criar o ficheiro local</string>
     <string name="download_latest_dev_version">Transferir a última versão de desenvolvimento</string>
     <string name="downloader_download_failed_content">Não foi possível transferir %1$s</string>
     <string name="downloader_download_failed_credentials_error">A transferência falhou, inicie novamente a sessão</string>
@@ -243,7 +247,11 @@
     <string name="drawer_quota_unlimited">%1$s utilizado</string>
     <string name="drawer_synced_folders">Carregamento automático</string>
     <string name="ecosystem_apps_display_more">Mais</string>
+    <string name="ecosystem_apps_display_notes">Notas</string>
     <string name="ecosystem_apps_display_talk">Falar</string>
+    <string name="ecosystem_apps_more">Mais Aplicações Nextcloud</string>
+    <string name="ecosystem_apps_notes">Nextcloud Notes</string>
+    <string name="ecosystem_apps_talk">Nextcloud Talk</string>
     <string name="encrypted">Definir como encriptado</string>
     <string name="end_to_end_encryption_confirm_button">Definir encriptação</string>
     <string name="end_to_end_encryption_decrypting">Decryption…</string>
@@ -260,15 +268,19 @@
     <string name="end_to_end_encryption_title">Definir encriptação</string>
     <string name="end_to_end_encryption_unsuccessful">Não foi possível guardar as chaves, por favor, tente novamente.</string>
     <string name="end_to_end_encryption_wrong_password">Erro ao encriptar. Palavra-passe errada?</string>
+    <string name="enter_destination_filename">Inserir nome do ficheiro de destino</string>
     <string name="enter_filename">Por favor, introduza um nome para o ficheiro</string>
     <string name="error__upload__local_file_not_copied">Não foi possível copiar %1$s para a pasta local %2$s</string>
     <string name="error_cant_bind_to_operations_service">Erro crítico: impossível concluir a operação</string>
     <string name="error_choosing_date">Erro ao escolher a data</string>
     <string name="error_comment_file">Erro ao comentar ficheiro</string>
     <string name="error_crash_title">%1$s crachou</string>
+    <string name="error_creating_file_from_template">Erro ao criar o ficheiro com o modelo</string>
+    <string name="error_file_actions">Erro ao mostrar as ações do ficheiro</string>
     <string name="error_report_issue_action">Relatório</string>
     <string name="error_retrieving_file">Erro ao obter o ficheiro</string>
     <string name="error_retrieving_templates">Erro ao obter modelos</string>
+    <string name="error_showing_encryption_dialog">Erro ao mostrar a janela da configuração de encriptação!</string>
     <string name="error_starting_direct_camera_upload">Erro ao iniciar câmara</string>
     <string name="etm_accounts">Contas</string>
     <string name="etm_background_job_name">Nome do Trabalho</string>
@@ -294,11 +306,12 @@
     <string name="etm_transfer_type_upload">Enviar</string>
     <string name="fab_label">Adicionar ou enviar</string>
     <string name="failed_to_download">Falhou a passagem do ficheiro ao gestor de transferências</string>
-    <string name="failed_to_print">Falhou a impressão do ficheiro</string>
+    <string name="failed_to_print">Não foi possível imprimir o ficheiro</string>
     <string name="failed_to_start_editor">Falha ao iniciar o editor</string>
     <string name="failed_update_ui">Falha ao atualizar a IU</string>
     <string name="favorite">Adicionar aos favoritos</string>
     <string name="favorite_icon">Favorito</string>
+    <string name="file_already_exists">O nome do ficheiro já existe</string>
     <string name="file_delete">Apagar</string>
     <string name="file_detail_activity_error">Erro ao obter as atividades para o ficheiro</string>
     <string name="file_details_no_content">Falha ao carregar detalhes</string>
@@ -312,10 +325,10 @@
     <string name="file_list_empty_headline_search">Sem resultados nesta pasta</string>
     <string name="file_list_empty_headline_server_search">Sem resultados</string>
     <string name="file_list_empty_moving">Não está aqui nada. Pode adicionar uma pasta.</string>
-    <string name="file_list_empty_on_device">Ficheiros e pastas que foram descarregados aparecem aqui.</string>
+    <string name="file_list_empty_on_device">Os ficheiros e as pastas que foram transferidos serão mostrados aqui.</string>
     <string name="file_list_empty_recently_modified">Não foi encontrado nenhum arquivo modificado nos últimos 7 dias</string>
     <string name="file_list_empty_search">Poderá estar numa pasta diferente?</string>
-    <string name="file_list_empty_shared">Ficheiros e pastas que partilhou aparecem aqui.</string>
+    <string name="file_list_empty_shared">Os ficheiros e as pastas que partilhou serão mostrados aqui.</string>
     <string name="file_list_empty_shared_headline">Ainda sem partilhas</string>
     <string name="file_list_empty_unified_search_no_results">Nenhum resultado encontrado para a sua consulta</string>
     <string name="file_list_folder">pasta</string>
@@ -323,6 +336,7 @@
     <string name="file_list_no_app_for_file_type">Nenhuma aplicação para usar este tipo de ficheiro.</string>
     <string name="file_list_seconds_ago">há segundos</string>
     <string name="file_management_permission">Permissões necessárias</string>
+    <string name="file_management_permission_optional">Permissões de armazenamento</string>
     <string name="file_management_permission_text">%1$s precisa de permissões de gestão de ficheiros para carregar ficheiros. Pode escolher acesso total a todos os ficheiros ou acesso só de leitura a fotografias e vídeos.</string>
     <string name="file_migration_checking_destination">Verificando destino…</string>
     <string name="file_migration_cleaning">Limpando…</string>
@@ -389,11 +403,11 @@
     <string name="host_not_available">Servidor não disponível</string>
     <string name="host_your_own_server">Hospede o seu próprio servidor</string>
     <string name="icon_for_empty_list">Ícone para lista vazia</string>
-    <string name="icon_of_dashboard_widget">Ícone do widget do painel de controlo</string>
-    <string name="icon_of_widget_entry">Ícone do widget da entrada </string>
+    <string name="icon_of_dashboard_widget">Ícone do \'\'widget\'\' do painel de controlo</string>
+    <string name="icon_of_widget_entry">Ícone do \'\'widget\'\' da entrada </string>
     <string name="image_editor_file_edited_suffix">editado</string>
-    <string name="image_editor_flip_horizontal">Virar horizontalmente</string>
-    <string name="image_editor_flip_vertical">Virar verticalmente</string>
+    <string name="image_editor_flip_horizontal">Inverter horizontalmente</string>
+    <string name="image_editor_flip_vertical">Inverter verticalmente</string>
     <string name="image_editor_rotate_ccw">Rodar no sentido anti-horário</string>
     <string name="image_editor_rotate_cw">Rodar no sentido horário</string>
     <string name="image_editor_unable_to_edit_image">Não é possível editar a imagem.</string>
@@ -410,7 +424,7 @@
     <string name="instant_upload_path">/Envio Instantâneo </string>
     <string name="invalid_url">URL inválido</string>
     <string name="invisible">Invisível </string>
-    <string name="label_empty">Nome não pode ficar em branco</string>
+    <string name="label_empty">O nome não pode ficar em branco</string>
     <string name="last_backup">Última cópia de segurança: %1$s</string>
     <string name="link">Hiperligação</string>
     <string name="link_name">Nome da hiperligação</string>
@@ -424,9 +438,14 @@
     <string name="local_file_not_found_message">Ficheiros não encontrados no sistema de ficheiros local</string>
     <string name="local_folder_friendly_path">%1$s/%2$s</string>
     <string name="local_folder_list_empty">Não existem mais pastas.</string>
+    <string name="locate_folder">Localizar pasta</string>
+    <string name="lock_expiration_info">Expira: %1$s</string>
     <string name="lock_file">Bloquear ficheiro </string>
+    <string name="locked_by">Bloqueado por %1$s</string>
+    <string name="locked_by_app">Bloqueado por aplicação %1$s</string>
     <string name="log_send_mail_subject">%1$s registos de aplicação Android</string>
     <string name="log_send_no_mail_app">Não foi encontrada nenhuma aplicação para o envio de registos. Por favor, Instale um cliente de correio eletrónico.</string>
+    <string name="logged_in_as">Autenticado como %1$s</string>
     <string name="login">Iniciar Sessão</string>
     <string name="login_url_helper_text">A hiperligação para a sua interface da Web %1$s quando a abre no seu navegador.</string>
     <string name="logs_menu_delete">Eliminar registos</string>
@@ -474,10 +493,14 @@
     <string name="new_media_folder_videos">vídeo</string>
     <string name="new_notification">Nova notificação</string>
     <string name="new_version_was_created">Uma nova versão foi criada</string>
+    <string name="no_actions">Sem ações para este utilizador</string>
     <string name="no_browser_available">Nenhuma aplicação disponível para lidar com links</string>
     <string name="no_calendar_exists">O calendário não existe</string>
+    <string name="no_items">Sem itens</string>
     <string name="no_mutliple_accounts_allowed">Só é permitida uma conta.</string>
     <string name="no_pdf_app_available">Nenhuma aplicação disponível para lidar com PDF</string>
+    <string name="no_send_app">Nenhuma aplicação disponível para enviar os ficheiros selecionados</string>
+    <string name="no_share_permission_selected">Por favor, selecione pelo menos uma permissão para partilhar.</string>
     <string name="note_confirm">Enviar</string>
     <string name="note_could_not_sent">Não foi possível enviar a nota</string>
     <string name="note_icon_hint">Ícone de nota</string>
@@ -516,6 +539,8 @@
     <string name="permission_deny">Negar</string>
     <string name="permission_storage_access">Permissões adicionais são necessárias para enviar e transferir ficheiros.</string>
     <string name="picture_set_as_no_app">Nenhuma aplicação encontrada para definir a imagem</string>
+    <string name="pin_home">Afixar no ecrã Início</string>
+    <string name="pin_shortcut_label">Abrir %1$s</string>
     <string name="placeholder_fileSize">389 KB</string>
     <string name="placeholder_filename">placeholder.txt</string>
     <string name="placeholder_media_time">12:23:45</string>
@@ -555,7 +580,7 @@
     <string name="prefs_imprint">Informação</string>
     <string name="prefs_instant_behaviour_dialogTitle">O ficheiro original será…</string>
     <string name="prefs_instant_behaviour_title">O ficheiro original será…</string>
-    <string name="prefs_instant_upload_path_use_date_subfolders_summary">Armazenar em subpastas com base na data</string>
+    <string name="prefs_instant_upload_path_use_date_subfolders_summary">Guardar nas subpastas com base na data</string>
     <string name="prefs_instant_upload_path_use_subfolders_title">Usar Subpastas</string>
     <string name="prefs_instant_upload_subfolder_rule_title">Opções de subpasta</string>
     <string name="prefs_license">Licença</string>
@@ -568,6 +593,7 @@
     <string name="prefs_lock_using_passcode">Código</string>
     <string name="prefs_manage_accounts">Gerir contas</string>
     <string name="prefs_recommend">Recomendar a um amigo</string>
+    <string name="prefs_remove_e2e">Remover encriptação localmente</string>
     <string name="prefs_setup_e2e">Configurar a encriptação ponta-a-ponta</string>
     <string name="prefs_show_ecosystem_apps">Mostrar alternador de aplicações</string>
     <string name="prefs_show_ecosystem_apps_summary">Sugestões de aplicações Nextcloud no cabeçalho da navegação</string>
@@ -646,6 +672,7 @@
     <string name="set_status_message">Defina a mensagem de estado</string>
     <string name="setup_e2e">Durante a configuração da encriptação ponta-a-ponta, receberá uma mnemónica aleatória de 12 palavras, de que necessitará para abrir os seus ficheiros noutros dispositivos. Ela só será guardada neste dispositivo e pode ser mostrada novamente neste ecrã. Por favor, anote-a num local seguro!</string>
     <string name="share">Partilhar</string>
+    <string name="share_copy_link">Hiperligação de Partilhar e Copiar</string>
     <string name="share_dialog_title">Partilha</string>
     <string name="share_expiration_date_format">%1$s</string>
     <string name="share_expiration_date_label">Expira %1$s</string>
@@ -686,6 +713,8 @@
     <string name="shared_icon_shared_via_link">Partilhado via hiperligação</string>
     <string name="shared_with_you_by">Partilhado consigo por %1$s</string>
     <string name="sharee_add_failed">Adição de destinatário da partilha falhou</string>
+    <string name="show_images">Mostrar fotografias</string>
+    <string name="show_video">Mostrar vídeos</string>
     <string name="signup_with_provider">Registar com fornecedor</string>
     <string name="single_sign_on_request_token" formatted="true">Permitir que %1$s aceda à sua conta Nextcloud %2$s?</string>
     <string name="sort_by">Ordenar por</string>
@@ -738,9 +767,13 @@
     <string name="stream">Transmita com…</string>
     <string name="stream_not_possible_headline">Transmissão interna não é possível</string>
     <string name="stream_not_possible_message">Em vez disso, por favor, transfira mediateca ou utilize uma aplicação externa.</string>
+    <string name="sub_folder_rule_day">Ano/Mês/Dia</string>
+    <string name="sub_folder_rule_month">Ano/Mês</string>
+    <string name="sub_folder_rule_year">Ano</string>
     <string name="subject_shared_with_you">\"%1$s\" foi partilhado consigo</string>
     <string name="subject_user_shared_with_you">%1$s partilhou \"%2$s\" consigo</string>
-    <string name="subtitle_photos_videos">Fotos &amp; videos</string>
+    <string name="subtitle_photos_only">Apenas fotografias</string>
+    <string name="subtitle_photos_videos">Fotografias e vídeos</string>
     <string name="subtitle_videos_only">Apenas vídeos</string>
     <string name="suggest">Sugerir </string>
     <string name="sync_conflicts_in_favourites_ticker">Encontrados conflitos</string>
@@ -791,12 +824,12 @@ Aproveite o novo e melhorado envio automático.</string>
     <string name="unset_encrypted">Encriptação não definida</string>
     <string name="unset_favorite">Remover dos favoritos</string>
     <string name="unshare_link_file_error">Ocorreu um erro enquanto tentava remover a partilha deste ficheiro ou pasta. </string>
-    <string name="unshare_link_file_no_exist">Impossível eliminar a partilha. Verifique se o ficheiro existe.</string>
+    <string name="unshare_link_file_no_exist">Não é possível remover a partilha. Por favor, verifique se o ficheiro existe.</string>
     <string name="unshare_link_forbidden_permissions">para cancelar a partilha deste ficheiro</string>
     <string name="unsharing_failed">Cancelamento da partilha falhou</string>
     <string name="untrusted_domain">Acesso através de domínio não confiável. Por favor, verifique a documentação para mais informações.</string>
-    <string name="update_link_file_error">Erro ao tentar modificar a partilha.</string>
-    <string name="update_link_file_no_exist">Impossível modificar. Verifique se o ficheiro existe.</string>
+    <string name="update_link_file_error">Ocorreu um erro enquanto tentava atualizar a partilha.</string>
+    <string name="update_link_file_no_exist">Não é possível atualizar. Por favor, verifique se o ficheiro existe.</string>
     <string name="update_link_forbidden_permissions">para atualizar esta partilha</string>
     <string name="updating_share_failed">Actualização da partilha falhou</string>
     <string name="upload_cannot_create_file">Não é possível criar ficheiro local</string>
@@ -835,7 +868,7 @@ Aproveite o novo e melhorado envio automático.</string>
     <string name="uploader_top_message">Escolha uma pasta para envio</string>
     <string name="uploader_upload_failed_content_single">Não foi possível enviar %1$s</string>
     <string name="uploader_upload_failed_credentials_error">O envio falhou, inicie novamente a sessão</string>
-    <string name="uploader_upload_failed_sync_conflict_error">Exite um conflito com o ficheiro enviado</string>
+    <string name="uploader_upload_failed_sync_conflict_error">Conflito de envio do ficheiro</string>
     <string name="uploader_upload_failed_sync_conflict_error_content">Escolha qual das versões manter %1$s</string>
     <string name="uploader_upload_failed_ticker">Envio falhou</string>
     <string name="uploader_upload_files_behaviour">Opção de envio:</string>
@@ -907,6 +940,26 @@ Aproveite o novo e melhorado envio automático.</string>
         <item quantity="many">Falha ao copiar %1$d ficheiros da pasta %2$s para</item>
         <item quantity="other">Falha ao copiar %1$d ficheiros da pasta %2$s para</item>
     </plurals>
+    <plurals name="processed_n_entries">
+        <item quantity="one">Processada %d entrada.</item>
+        <item quantity="many">Processadas %dentradas.</item>
+        <item quantity="other">Processadas %d entradas.</item>
+    </plurals>
+    <plurals name="found_n_duplicates">
+        <item quantity="one">Encontrada %d entrada duplicada.</item>
+        <item quantity="many">Encontradas %d entradas duplicadas.</item>
+        <item quantity="other">Encontradas %d entradas duplicadas.</item>
+    </plurals>
+    <plurals name="export_successful">
+        <item quantity="one">Exportado %d ficheiro</item>
+        <item quantity="many">Exportados %d ficheiros</item>
+        <item quantity="other">Exportados %d ficheiros</item>
+    </plurals>
+    <plurals name="export_failed">
+        <item quantity="one">Falhou exportação de %d ficheiro</item>
+        <item quantity="many">Falhou exportação de %d ficheiros</item>
+        <item quantity="other">Falhou exportação de %d ficheiros</item>
+    </plurals>
     <plurals name="file_list__footer__folder">
         <item quantity="one">%1$d pasta</item>
         <item quantity="many">%1$d pastas</item>