Эх сурвалжийг харах

Merge branch 'master' of https://github.com/nextcloud/android into searchViewWrongFiles

AndyScherzinger 8 жил өмнө
parent
commit
1b90c742bf
56 өөрчлөгдсөн 592 нэмэгдсэн , 238 устгасан
  1. 12 1
      .drone.yml
  2. 0 0
      .drone.yml.sig
  3. 1 1
      build.gradle
  4. 5 0
      scripts/lint/getBranchName.sh
  5. 2 0
      scripts/lint/lint-results.txt
  6. 180 0
      scripts/lint/lint-up.rb
  7. 8 4
      src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
  8. 1 1
      src/main/java/com/owncloud/android/authentication/PassCodeManager.java
  9. 0 3
      src/main/java/com/owncloud/android/db/OCUpload.java
  10. 6 1
      src/main/java/com/owncloud/android/db/UploadResult.java
  11. 2 2
      src/main/java/com/owncloud/android/files/services/IndexedForest.java
  12. 1 0
      src/main/java/com/owncloud/android/media/MediaControlView.java
  13. 0 3
      src/main/java/com/owncloud/android/media/MediaService.java
  14. 2 2
      src/main/java/com/owncloud/android/operations/UnshareOperation.java
  15. 8 3
      src/main/java/com/owncloud/android/operations/UploadFileOperation.java
  16. 1 0
      src/main/java/com/owncloud/android/providers/UsersAndGroupsSearchProvider.java
  17. 2 0
      src/main/java/com/owncloud/android/ui/CustomPopup.java
  18. 3 5
      src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java
  19. 32 3
      src/main/java/com/owncloud/android/ui/activity/Preferences.java
  20. 6 2
      src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java
  21. 28 9
      src/main/java/com/owncloud/android/ui/activity/ShareActivity.java
  22. 1 1
      src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
  23. 4 0
      src/main/java/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java
  24. 0 1
      src/main/java/com/owncloud/android/ui/dialog/SslValidatorDialog.java
  25. 22 12
      src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java
  26. 1 2
      src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java
  27. 4 4
      src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java
  28. 11 5
      src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java
  29. 0 2
      src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java
  30. 0 6
      src/main/java/com/owncloud/android/ui/preview/FileDownloadFragment.java
  31. 2 2
      src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java
  32. 1 0
      src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java
  33. 1 0
      src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java
  34. 1 1
      src/main/java/com/owncloud/android/utils/DialogMenuItem.java
  35. 14 6
      src/main/java/com/owncloud/android/utils/ErrorMessageAdapter.java
  36. 1 1
      src/main/java/third_parties/michaelOrtiz/TouchImageViewCustom.java
  37. 179 92
      src/main/res/values-ast/strings.xml
  38. 1 3
      src/main/res/values-cs-rCZ/strings.xml
  39. 1 3
      src/main/res/values-de-rDE/strings.xml
  40. 1 3
      src/main/res/values-de/strings.xml
  41. 1 3
      src/main/res/values-el/strings.xml
  42. 1 3
      src/main/res/values-en-rGB/strings.xml
  43. 1 3
      src/main/res/values-es-rMX/strings.xml
  44. 1 3
      src/main/res/values-es/strings.xml
  45. 1 3
      src/main/res/values-fr/strings.xml
  46. 1 3
      src/main/res/values-nb-rNO/strings.xml
  47. 1 3
      src/main/res/values-nl/strings.xml
  48. 1 3
      src/main/res/values-pl/strings.xml
  49. 1 3
      src/main/res/values-pt-rBR/strings.xml
  50. 1 3
      src/main/res/values-ru/strings.xml
  51. 1 3
      src/main/res/values-sq/strings.xml
  52. 1 3
      src/main/res/values-tr/strings.xml
  53. 11 8
      src/main/res/values/setup.xml
  54. 5 1
      src/main/res/values/strings.xml
  55. 4 0
      src/main/res/xml/preferences.xml
  56. 15 9
      src/modified/res/values/setup.xml

+ 12 - 1
.drone.yml

@@ -1,6 +1,6 @@
 pipeline:
   test:
-    image: nextcloudci/android:android-17
+    image: nextcloudci/android:android-18
     commands:
       # uncomment gplay for Gplay, Modified only
       - sh -c "if [ '$FLAVOUR' != 'Generic' ]; then sed -i '/com.google.*.gms/s/^.*\/\///g' build.gradle; fi"
@@ -28,6 +28,17 @@ pipeline:
       - ANDROID_ABI=armeabi-v7a
       - LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:/opt/android-sdk-linux/tools/lib64/gles_mesa/
 
+  lint:
+      image: nextcloudci/android:android-18
+      commands:
+        # needs gplay
+        - sed -i '/com.google.*.gms/s/^.*\/\///g' build.gradle
+        - export BRANCH=$(scripts/lint/getBranchName.sh ${GIT_USERNAME} ${GIT_TOKEN} ${DRONE_PULL_REQUEST})
+        - ruby scripts/lint/lint-up.rb ${GIT_USERNAME} ${GIT_TOKEN} $BRANCH
+      when:
+        matrix:
+          FLAVOUR: Modified
+
 matrix:
   FLAVOUR:
     - Generic

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
.drone.yml.sig


+ 1 - 1
build.gradle

@@ -182,7 +182,7 @@ dependencies {
     compile name: 'touch-image-view'
     compile 'com.android.support:multidex:1.0.1'
 
-    compile 'com.github.nextcloud:android-library:1.0.15'
+    compile 'com.github.nextcloud:android-library:1.0.17'
     compile "com.android.support:support-v4:${supportLibraryVersion}"
     compile "com.android.support:design:${supportLibraryVersion}"
     compile 'com.jakewharton:disklrucache:2.0.2'

+ 5 - 0
scripts/lint/getBranchName.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+# $1: username, $2: password/token, $3: pull request number
+
+curl 2>/dev/null -u $1:$2 https://api.github.com/repos/nextcloud/android/pulls/$3 | grep \"ref\": | grep -v master | cut -d"\"" -f4

+ 2 - 0
scripts/lint/lint-results.txt

@@ -0,0 +1,2 @@
+DO NOT TOUCH; GENERATED BY DRONE
+      <span class="mdl-layout-title">Lint Report: 698 errors and 860 warnings</span>

+ 180 - 0
scripts/lint/lint-up.rb

@@ -0,0 +1,180 @@
+## Script from https://github.com/tir38/android-lint-entropy-reducer at 07.05.2017
+# adapts to drone, use git username / token as parameter
+
+puts "=================== starting Android Lint Entropy Reducer ===================="
+
+# get args
+git_user, git_token, git_branch = ARGV
+
+# ========================  SETUP ============================
+
+# User name for git commits made by this script.
+TRAVIS_GIT_USERNAME = String.new("Drone CI server")
+
+# File name and relative path of generated Lint report. Must match build.gradle file:
+#   lintOptions {
+#       htmlOutput file("[FILE_NAME].html")
+#   }
+LINT_REPORT_FILE = String.new("build/reports/lint/lint.html")
+
+# File name and relative path of previous results of this script.
+PREVIOUS_LINT_RESULTS_FILE=String.new("scripts/lint/lint-results.txt")
+
+# Flag to evaluate warnings. true = check warnings; false = ignore warnings
+CHECK_WARNINGS = true
+
+# File name and relative path to custom lint rules; Can be null or "".
+CUSTOM_LINT_FILE = String.new("")
+
+# ================ SETUP DONE; DON'T TOUCH ANYTHING BELOW  ================
+
+require 'fileutils'
+require 'pathname'
+require 'open3'
+
+# since we need the xml-simple gem, and we want this script self-contained, let's grab it just when we need it
+begin
+    gem "xml-simple"
+    rescue LoadError
+    system("gem install xml-simple")
+    Gem.clear_paths
+end
+
+require 'xmlsimple'
+
+# add custom Lint jar
+if !CUSTOM_LINT_FILE.nil? &&
+    CUSTOM_LINT_FILE.length > 0
+
+    ENV["ANDROID_LINT_JARS"] = Dir.pwd + "/" + CUSTOM_LINT_FILE
+    puts "adding custom lint rules to default set: "
+    puts ENV["ANDROID_LINT_JARS"]
+end
+
+# run Lint
+puts "running Lint..."
+system './gradlew clean lint'
+
+# confirm that Lint ran w/out error
+result = $?.to_i
+if result != 0
+    puts "FAIL: failed to run ./gradlew clean lint"
+    exit 1
+end
+
+# find Lint report file
+lint_reports = Dir.glob(LINT_REPORT_FILE)
+if lint_reports.length == 0
+    puts "Lint HTML report not found."
+    exit 1
+end
+lint_report = String.new(lint_reports[0])
+
+# find error/warning count string in HTML report
+error_warning_string = ""
+File.open lint_report do |file|
+  error_warning_string = file.find { |line| line =~ /[0-9]* errors and [0-9]* warnings/ }
+end
+
+# find number of errors
+error_string = error_warning_string.match(/[0-9]* errors/)[0]
+current_error_count = error_string.match(/[0-9]*/)[0].to_i
+puts "found errors: " + current_error_count.to_s
+
+# find number of warnings
+if CHECK_WARNINGS == true
+    warning_string = error_warning_string.match(/[0-9]* warnings/)[0]
+    current_warning_count = warning_string.match(/[0-9]*/)[0].to_i
+    puts "found warnings: " + current_warning_count.to_s
+end
+
+# get previous error and warning counts from last successful build
+
+previous_results = false
+
+previous_lint_reports = Dir.glob(PREVIOUS_LINT_RESULTS_FILE)
+if previous_lint_reports.nil? ||
+    previous_lint_reports.length == 0
+
+    previous_lint_report = File.new(PREVIOUS_LINT_RESULTS_FILE, "w") # create for writing to later
+else
+    previous_lint_report = String.new(previous_lint_reports[0])
+
+    previous_error_warning_string = ""
+    File.open previous_lint_report do |file|
+      previous_error_warning_string = file.find { |line| line =~ /[0-9]* errors and [0-9]* warnings/ }
+    end
+
+    unless previous_error_warning_string.nil?
+        previous_results = true
+
+        previous_error_string = previous_error_warning_string.match(/[0-9]* errors/)[0]
+        previous_error_count = previous_error_string.match(/[0-9]*/)[0].to_i
+        puts "previous errors: " + previous_error_count.to_s
+
+        if CHECK_WARNINGS == true
+            previous_warning_string = previous_error_warning_string.match(/[0-9]* warnings/)[0]
+            previous_warning_count = previous_warning_string.match(/[0-9]*/)[0].to_i
+            puts "previous warnings: " + previous_warning_count.to_s
+        end
+    end
+end
+
+# compare previous error count with current error count
+if previous_results == true  &&
+    current_error_count > previous_error_count
+    puts "FAIL: error count increased"
+    exit 1
+end
+
+# compare previous warning count with current warning count
+if CHECK_WARNINGS  == true &&
+    previous_results == true &&
+    current_warning_count > previous_warning_count
+
+    puts "FAIL: warning count increased"
+    exit 1
+end
+
+# check if warning and error count stayed the same
+if  previous_results == true &&
+    current_error_count == previous_error_count &&
+    current_warning_count == previous_warning_count
+
+    puts "SUCCESS: count stayed the same"
+    exit 0
+end
+
+# either error count or warning count DECREASED
+
+# write new results to file (will overwrite existing, or create new)
+File.write(previous_lint_report, "DO NOT TOUCH; GENERATED BY DRONE\n" + error_warning_string)
+
+# push changes to github (if this script is run locally, we don't want to overwrite git username and email, so save temporarily)
+previous_git_username, _ = Open3.capture2('git config user.name')
+previous_git_username = previous_git_username.strip
+
+previous_git_email, _ = Open3.capture3('git config user.email')
+previous_git_email = previous_git_email.strip
+
+# update git user name and email for this script
+system ("git config --local user.name '"  + git_user + "'")
+system ("git config --local user.email '.'") # set email blank
+system ("git remote rm origin")
+system ("git remote add origin https://" + git_user + ":" + git_token + "@github.com/nextcloud/android")
+
+# add previous Lint result file to git
+system ('git add ' + PREVIOUS_LINT_RESULTS_FILE)
+
+# commit changes; Add "skip ci" so that we don't accidentally trigger another Drone build
+system ('git commit -m "Drone: update Lint results to reflect reduced error/warning count [skip ci]" ')
+
+# push to origin
+system ('git push origin HEAD:' + git_branch)
+
+# restore previous git user name and email
+system("git config --local user.name '#{previous_git_username}'")
+system("git config --local user.email '#{previous_git_email}'")
+
+puts "SUCCESS: count was reduced"
+exit 0 # success

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

@@ -563,6 +563,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
 
                 @Override
                 public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+                    // not used at the moment
                 }
 
                 @Override
@@ -1252,7 +1253,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
             }
         } else {
             if (!webViewLoginMethod) {
-                updateStatusIconFailUserName();
+                int statusText = result.getCode() == ResultCode.MAINTENANCE_MODE ? R.string.maintenance_mode : R.string.auth_fail_get_user_name;
+                updateStatusIconFailUserName(statusText);
                 showAuthStatus();
             }
             Log_OC.e(TAG, "Access to user name failed: " + result.getLogMessage());
@@ -1452,6 +1454,9 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
                 mServerStatusIcon = R.drawable.ic_lock_open_white;
                 mServerStatusText = R.string.auth_redirect_non_secure_connection_title;
                 break;
+            case MAINTENANCE_MODE:
+                mServerStatusText = R.string.maintenance_mode;
+                break;
             default:
                 mServerStatusText = 0;
                 mServerStatusIcon = 0;
@@ -1541,10 +1546,9 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
         }
     }
 
-
-    private void updateStatusIconFailUserName() {
+    private void updateStatusIconFailUserName(int failedStatusText){
         mAuthStatusIcon = R.drawable.ic_alert;
-        mAuthStatusText = R.string.auth_fail_get_user_name;
+        mAuthStatusText = failedStatusText;
     }
 
     private void updateServerStatusIconNoRegularAuth() {

+ 1 - 1
src/main/java/com/owncloud/android/authentication/PassCodeManager.java

@@ -60,7 +60,7 @@ public class PassCodeManager {
         return mPassCodeManagerInstance;
     }
 
-    protected PassCodeManager() {};
+    protected PassCodeManager() {}
 
     public void onActivityCreated(Activity activity) {
         if (passCodeIsEnabled() || fingerprintIsEnabled()) {

+ 0 - 3
src/main/java/com/owncloud/android/db/OCUpload.java

@@ -393,7 +393,4 @@ public class OCUpload implements Parcelable {
     }
 
     enum CanUploadFileNowStatus {NOW, LATER, FILE_GONE, ERROR}
-
-    ;
-
 }

+ 6 - 1
src/main/java/com/owncloud/android/db/UploadResult.java

@@ -34,7 +34,8 @@ public enum UploadResult {
     FILE_NOT_FOUND(8),
     DELAYED_FOR_WIFI(9),
     SERVICE_INTERRUPTED(10),
-    DELAYED_FOR_CHARGING(11);
+    DELAYED_FOR_CHARGING(11),
+    MAINTENANCE_MODE(12);
 
     private final int value;
 
@@ -74,6 +75,8 @@ public enum UploadResult {
                 return SERVICE_INTERRUPTED;
             case 11:
                 return DELAYED_FOR_CHARGING;
+            case 12:
+                return MAINTENANCE_MODE;
         }
         return null;
     }
@@ -115,6 +118,8 @@ public enum UploadResult {
                     return FILE_ERROR;
                 }
                 return UNKNOWN;
+            case MAINTENANCE_MODE:
+                return MAINTENANCE_MODE;
             default:
                 return UNKNOWN;
         }

+ 2 - 2
src/main/java/com/owncloud/android/files/services/IndexedForest.java

@@ -61,7 +61,7 @@ public class IndexedForest<V> {
 
         public Node<V> getParent() {
             return mParent;
-        };
+        }
 
         public Set<Node<V>> getChildren() {
             return mChildren;
@@ -143,7 +143,7 @@ public class IndexedForest<V> {
 
             return new Pair<String, String>(targetKey, linkedTo);
         }
-    };
+    }
 
 
     public Pair<V, String> removePayload(String accountName, String remotePath) {

+ 1 - 0
src/main/java/com/owncloud/android/media/MediaControlView.java

@@ -89,6 +89,7 @@ public class MediaControlView extends FrameLayout /* implements OnLayoutChangeLi
 
     @Override
     public void onFinishInflate() {
+        super.onFinishInflate();
         /*
         if (mRoot != null)
             initControllerView(mRoot);

+ 0 - 3
src/main/java/com/owncloud/android/media/MediaService.java

@@ -98,9 +98,6 @@ public class MediaService extends Service implements OnCompletionListener, OnPre
         PAUSED
     }
 
-    ;
-
-
     /** Current state */
     private State mState = State.STOPPED;
 

+ 2 - 2
src/main/java/com/owncloud/android/operations/UnshareOperation.java

@@ -89,8 +89,8 @@ public class UnshareOperation extends SyncOperation {
 
                 getStorageManager().saveFile(file);
                 getStorageManager().removeShare(share);
-                
-            } else if (!existsFile(client, file.getRemotePath())) {
+
+            } else if (result.getCode() != ResultCode.MAINTENANCE_MODE && !existsFile(client, file.getRemotePath())) {
                 // unshare failed because file was deleted before
                 getStorageManager().removeFile(file, true, true);
             }

+ 8 - 3
src/main/java/com/owncloud/android/operations/UploadFileOperation.java

@@ -2,7 +2,7 @@
  *   ownCloud Android client application
  *
  *   @author David A. Velasco
- *   Copyright (C) 2016 ownCloud Inc.
+ *   Copyright (C) 2016 ownCloud GmbH.
  *
  *   This program is free software: you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License version 2,
@@ -323,6 +323,7 @@ public class UploadFileOperation extends SyncOperation {
             remoteParentPath = remoteParentPath.endsWith(OCFile.PATH_SEPARATOR) ?
                     remoteParentPath : remoteParentPath + OCFile.PATH_SEPARATOR;
             result = grantFolderExistence(remoteParentPath, client);
+
             if (!result.isSuccess()) {
 
                 return result;
@@ -370,15 +371,19 @@ public class UploadFileOperation extends SyncOperation {
                 throw new OperationCancelledException();
             }
 
+            // Get the last modification date of the file from the file system
+            Long timeStampLong = originalFile.lastModified()/1000;
+            String timeStamp = timeStampLong.toString();
+
             /// perform the upload
             if ( mChunked &&
                     (new File(mFile.getStoragePath())).length() >
                             ChunkedUploadRemoteFileOperation.CHUNK_SIZE ) {
                 mUploadOperation = new ChunkedUploadRemoteFileOperation(mContext, mFile.getStoragePath(),
-                        mFile.getRemotePath(), mFile.getMimetype(), mFile.getEtagInConflict());
+                        mFile.getRemotePath(), mFile.getMimetype(), mFile.getEtagInConflict(), timeStamp);
             } else {
                 mUploadOperation = new UploadRemoteFileOperation(mFile.getStoragePath(),
-                        mFile.getRemotePath(), mFile.getMimetype(), mFile.getEtagInConflict());
+                        mFile.getRemotePath(), mFile.getMimetype(), mFile.getEtagInConflict(), timeStamp);
             }
             Iterator <OnDatatransferProgressListener> listener = mDataTransferListeners.iterator();
             while (listener.hasNext()) {

+ 1 - 0
src/main/java/com/owncloud/android/providers/UsersAndGroupsSearchProvider.java

@@ -265,6 +265,7 @@ public class UsersAndGroupsSearchProvider extends ContentProvider {
                 // The Toast must be shown in the main thread to grant that will be hidden correctly; otherwise
                 // the thread may die before, an exception will occur, and the message will be left on the screen
                 // until the app dies
+
                 Toast.makeText(
                         getContext().getApplicationContext(),
                         ErrorMessageAdapter.getErrorCauseMessage(

+ 2 - 0
src/main/java/com/owncloud/android/ui/CustomPopup.java

@@ -63,9 +63,11 @@ public class CustomPopup {
     }
 
     public void onCreate() {
+        // not used at the moment
     }
 
     public void onShow() {
+        // not used at the moment
     }
 
     public void preShow() {

+ 3 - 5
src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java

@@ -104,7 +104,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
             caption = getIntent().getStringExtra(EXTRA_ACTION);
         } else {
             caption = getString(R.string.default_display_name_for_root_folder);
-        };
+        }
         getSupportActionBar().setTitle(caption);
 
         setIndeterminate(mSyncInProgress);
@@ -518,8 +518,6 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
         }
     }
 
-    
-
     /**
      * Shows the information of the {@link OCFile} received as a
      * parameter in the second fragment.
@@ -528,7 +526,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
      */
     @Override
     public void showDetails(OCFile file) {
-
+        // not used at the moment
     }
 
     /**
@@ -536,7 +534,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
      */
     @Override
     public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) {
-            
+        // not used at the moment
     }
 
     @Override

+ 32 - 3
src/main/java/com/owncloud/android/ui/activity/Preferences.java

@@ -514,6 +514,9 @@ public class Preferences extends PreferenceActivity
             getPreferenceScreen().removePreference(mPrefInstantUploadCategory);
         }
 
+        // About category
+        PreferenceCategory preferenceCategoryAbout = (PreferenceCategory) findPreference("about");
+
         /* About App */
         pAboutApp = findPreference("about_app");
         if (pAboutApp != null) {
@@ -521,6 +524,32 @@ public class Preferences extends PreferenceActivity
             pAboutApp.setSummary(String.format(getString(R.string.about_version), appVersion));
         }
 
+        // privacy
+        boolean privacyEnabled = getResources().getBoolean(R.bool.privacy_enabled);
+        Preference privacyPreference = findPreference("privacy");
+        if (privacyPreference != null) {
+            if (privacyEnabled) {
+                privacyPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+                    @Override
+                    public boolean onPreferenceClick(Preference preference) {
+                        String privacyUrl = getString(R.string.privacy_url);
+                        if (privacyUrl.length() > 0) {
+                            Intent externalWebViewIntent = new Intent(getApplicationContext(), ExternalSiteWebView.class);
+                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE,
+                                    getResources().getString(R.string.privacy));
+                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_URL, privacyUrl);
+                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_SHOW_SIDEBAR, false);
+                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_MENU_ITEM_ID, -1);
+                            startActivity(externalWebViewIntent);
+                        }
+                        return true;
+                    }
+                });
+            } else {
+                preferenceCategoryAbout.removePreference(privacyPreference);
+            }
+        }
+
         loadExternalSettingLinks(preferenceCategoryMore);
 
         loadStoragePath();
@@ -840,7 +869,7 @@ public class Preferences extends PreferenceActivity
         MainApp.setStoragePath(mStoragePath);
         SharedPreferences.Editor editor = appPrefs.edit();
         editor.putString(PreferenceKeys.STORAGE_PATH, mStoragePath);
-        editor.commit();
+        editor.apply();
         String storageDescription = DataStorageProvider.getInstance().getStorageDescriptionByPath(mStoragePath);
         mPrefStoragePath.setSummary(storageDescription);
         mPrefStoragePath.setValue(newStoragePath);
@@ -866,7 +895,7 @@ public class Preferences extends PreferenceActivity
                 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
         SharedPreferences.Editor editor = appPrefs.edit();
         editor.putString(PreferenceKeys.INSTANT_UPLOAD_PATH, mUploadPath);
-        editor.commit();
+        editor.apply();
     }
 
     /**
@@ -887,7 +916,7 @@ public class Preferences extends PreferenceActivity
                 PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
         SharedPreferences.Editor editor = appPrefs.edit();
         editor.putString(PreferenceKeys.INSTANT_VIDEO_UPLOAD_PATH, mUploadVideoPath);
-        editor.commit();
+        editor.apply();
     }
 
     @Override

+ 6 - 2
src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java

@@ -1137,10 +1137,14 @@ public class ReceiveExternalFilesActivity extends FileActivity
                 }
 
                 @Override
-                public void onNeutral(String callerTag) {}
+                public void onNeutral(String callerTag) {
+                    // not used at the moment
+                }
 
                 @Override
-                public void onCancel(String callerTag) {}
+                public void onCancel(String callerTag) {
+                    // not used at the moment
+                }
             }
         );
         errorDialog.show(getSupportFragmentManager(), FTAG_ERROR_FRAGMENT);

+ 28 - 9
src/main/java/com/owncloud/android/ui/activity/ShareActivity.java

@@ -38,6 +38,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.shares.OCShare;
 import com.owncloud.android.lib.resources.shares.ShareType;
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 import com.owncloud.android.operations.CreateShareViaLinkOperation;
 import com.owncloud.android.operations.GetSharesForFileOperation;
 import com.owncloud.android.operations.UnshareOperation;
@@ -51,6 +52,7 @@ import com.owncloud.android.ui.fragment.ShareFragmentListener;
 import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.GetShareWithUsersAsyncTask;
 
+import java.util.ArrayList;
 
 /**
  * Activity for sharing files
@@ -111,10 +113,19 @@ public class ShareActivity extends FileActivity
             Uri data = intent.getData();
             String dataString = intent.getDataString();
             String shareWith = dataString.substring(dataString.lastIndexOf('/') + 1);
-            doShareWith(
-                    shareWith,
-                    data.getAuthority()
-            );
+
+            ArrayList<String> shareeNames = new ArrayList<>();
+            for (OCShare share : getStorageManager().getSharesWithForAFile(getFile().getRemotePath(), getAccount().name)) {
+                shareeNames.add(share.getShareWith());
+            }
+
+            if (!shareeNames.contains(shareWith)) {
+
+                doShareWith(
+                        shareWith,
+                        data.getAuthority()
+                );
+            }
 
         } else {
             Log_OC.e(TAG, "Unexpected intent " + intent.toString());
@@ -142,11 +153,19 @@ public class ShareActivity extends FileActivity
         if (getFile().isSharedWithMe()) {
             return OCShare.READ_PERMISSION_FLAG;    // minimum permissions
 
-        } else if (getFile().isFolder()) {
-            return (isFederated) ? OCShare.FEDERATED_PERMISSIONS_FOR_FOLDER : OCShare.MAXIMUM_PERMISSIONS_FOR_FOLDER;
-
-        } else {    // isFile
-            return (isFederated) ? OCShare.FEDERATED_PERMISSIONS_FOR_FILE : OCShare.MAXIMUM_PERMISSIONS_FOR_FILE;
+        } else if (isFederated) {
+            OwnCloudVersion serverVersion = com.owncloud.android.authentication.AccountUtils.
+                    getServerVersion(getAccount());
+            if (serverVersion != null && serverVersion.isNotReshareableFederatedSupported()) {
+                return (getFile().isFolder() ? OCShare.FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 :
+                        OCShare.FEDERATED_PERMISSIONS_FOR_FILE_AFTER_OC9);
+            } else {
+                return (getFile().isFolder() ? OCShare.FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 :
+                        OCShare.FEDERATED_PERMISSIONS_FOR_FILE_UP_TO_OC9);
+            }
+        } else {
+            return (getFile().isFolder() ? OCShare.MAXIMUM_PERMISSIONS_FOR_FOLDER :
+                    OCShare.MAXIMUM_PERMISSIONS_FOR_FILE);
         }
     }
 

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

@@ -334,7 +334,7 @@ public class UploadListActivity extends FileActivity implements UploadListFragme
                 mUploaderBinder = null;
             }
         }
-    };
+    }
 
     /**
      * Once the file upload has changed its status -> update uploads list view

+ 4 - 0
src/main/java/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java

@@ -514,6 +514,7 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
      * @return              Text describing the status of the given upload.
      */
     private String getStatusText(OCUpload upload) {
+
         String status;
         switch (upload.getUploadStatus()) {
 
@@ -596,6 +597,9 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
                         // should not get here ; status should be UPLOAD_SUCCESS
                         status =  mParentActivity.getString(R.string.uploads_view_upload_status_succeeded);
                         break;
+                    case MAINTENANCE_MODE:
+                        status = mParentActivity.getString(R.string.maintenance_mode);
+                        break;
                     default:
                         status = "Naughty devs added a new fail result but no description for the user";
                         break;

+ 0 - 1
src/main/java/com/owncloud/android/ui/dialog/SslValidatorDialog.java

@@ -82,7 +82,6 @@ public class SslValidatorDialog extends Dialog {
      * Instances have to be created through static {@link SslValidatorDialog#newInstance}.
      * 
      * @param context       Android context where the dialog will live
-     * @param e             Exception causing the need of prompt the user about the server certificate.
      * @param listener      Object to notice when the server certificate was added to the local certificates store.
      */
     private SslValidatorDialog(Context context, OnSslValidatorListener listener) {

+ 22 - 12
src/main/java/com/owncloud/android/ui/fragment/EditShareFragment.java

@@ -33,6 +33,7 @@ import android.widget.CompoundButton;
 import android.widget.TextView;
 
 import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -40,6 +41,7 @@ import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.shares.OCShare;
 import com.owncloud.android.lib.resources.shares.SharePermissionsBuilder;
 import com.owncloud.android.lib.resources.shares.ShareType;
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.utils.AnalyticsUtils;
 
@@ -67,6 +69,9 @@ public class EditShareFragment extends Fragment {
     /** File bound to mShare, received as a parameter in construction time */
     private OCFile mFile;
 
+    /** Account of the shared file, received as a parameter in construction time */
+    private Account mAccount;
+
     /** Listener for changes on privilege checkboxes */
     private CompoundButton.OnCheckedChangeListener mOnPrivilegeChangeListener;
     
@@ -99,7 +104,7 @@ public class EditShareFragment extends Fragment {
             mShare = getArguments().getParcelable(ARG_SHARE);
             mFile = getArguments().getParcelable(ARG_FILE);
             /* OC account holding the shared file, received as a parameter in construction time */
-            //Account mAccount = getArguments().getParcelable(ARG_ACCOUNT);
+            mAccount = getArguments().getParcelable(ARG_ACCOUNT);
         }
     }
 
@@ -145,34 +150,39 @@ public class EditShareFragment extends Fragment {
 
             int sharePermissions = mShare.getPermissions();
             boolean isFederated = ShareType.FEDERATED.equals(mShare.getShareType());
-            CompoundButton compound;
+            OwnCloudVersion serverVersion = AccountUtils.getServerVersion(mAccount);
+            boolean isNotReshareableFederatedSupported = (serverVersion != null &&
+                    serverVersion.isNotReshareableFederatedSupported());
+
+            CompoundButton compound = (CompoundButton) editShareView.findViewById(R.id.canShareSwitch);
 
-            compound = (CompoundButton) editShareView.findViewById(R.id.canShareSwitch);
-            if(isFederated) {
+            if (isFederated) {
                 compound.setVisibility(View.INVISIBLE);
             }
             compound.setChecked((sharePermissions & OCShare.SHARE_PERMISSION_FLAG) > 0);
 
             compound = (CompoundButton) editShareView.findViewById(R.id.canEditSwitch);
-            int anyUpdatePermission =
-                    OCShare.CREATE_PERMISSION_FLAG |
-                            OCShare.UPDATE_PERMISSION_FLAG |
-                            OCShare.DELETE_PERMISSION_FLAG;
+            int anyUpdatePermission = OCShare.CREATE_PERMISSION_FLAG | OCShare.UPDATE_PERMISSION_FLAG |
+                    OCShare.DELETE_PERMISSION_FLAG;
             boolean canEdit = (sharePermissions & anyUpdatePermission) > 0;
             compound.setChecked(canEdit);
 
-            if (mFile.isFolder() && !isFederated) {
+            boolean areEditOptionsAvailable = !isFederated || isNotReshareableFederatedSupported;
+
+            if (mFile.isFolder() && areEditOptionsAvailable) {
+                /// TODO change areEditOptionsAvailable in order to delete !isFederated
+                // from checking when iOS is ready
                 compound = (CompoundButton) editShareView.findViewById(R.id.canEditCreateCheckBox);
                 compound.setChecked((sharePermissions & OCShare.CREATE_PERMISSION_FLAG) > 0);
-                compound.setVisibility(canEdit ? View.VISIBLE : View.GONE);
+                compound.setVisibility((canEdit) ? View.VISIBLE : View.GONE);
 
                 compound = (CompoundButton) editShareView.findViewById(R.id.canEditChangeCheckBox);
                 compound.setChecked((sharePermissions & OCShare.UPDATE_PERMISSION_FLAG) > 0);
-                compound.setVisibility(canEdit ? View.VISIBLE : View.GONE);
+                compound.setVisibility((canEdit) ? View.VISIBLE : View.GONE);
 
                 compound = (CompoundButton) editShareView.findViewById(R.id.canEditDeleteCheckBox);
                 compound.setChecked((sharePermissions & OCShare.DELETE_PERMISSION_FLAG) > 0);
-                compound.setVisibility(canEdit ? View.VISIBLE : View.GONE);
+                compound.setVisibility((canEdit) ? View.VISIBLE : View.GONE);
             }
 
             setPermissionsListening(editShareView, true);

+ 1 - 2
src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java

@@ -118,11 +118,10 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
+        super.onActivityCreated(savedInstanceState);
         setHasOptionsMenu(true);
     }
 
-
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {

+ 4 - 4
src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java

@@ -141,7 +141,7 @@ public class LocalFileListFragment extends ExtendedListFragment {
             } else {    /// Click on a file
                 ImageView checkBoxV = (ImageView) v.findViewById(R.id.custom_checkbox);
                 if (checkBoxV != null) {
-                    if (((AbsListView)getListView()).isItemChecked(position)) {
+                    if (getListView().isItemChecked(position)) {
                         checkBoxV.setImageResource(R.drawable.ic_checkbox_marked);
                     } else {
                         checkBoxV.setImageResource(R.drawable.ic_checkbox_blank_outline);
@@ -222,7 +222,7 @@ public class LocalFileListFragment extends ExtendedListFragment {
         }
 
         // by now, only files in the same directory will be kept as selected
-        ((AbsListView)mCurrentListView).clearChoices();
+        mCurrentListView.clearChoices();
         mAdapter.swapDirectory(directory);
         if (mDirectory == null || !mDirectory.equals(directory)) {
             mCurrentListView.setSelection(0);
@@ -238,7 +238,7 @@ public class LocalFileListFragment extends ExtendedListFragment {
      */
     public String[] getCheckedFilePaths() {
         ArrayList<String> result = new ArrayList<String>();
-        SparseBooleanArray positions = ((AbsListView)mCurrentListView).getCheckedItemPositions();
+        SparseBooleanArray positions = mCurrentListView.getCheckedItemPositions();
         if (positions.size() > 0) {
             for (int i = 0; i < positions.size(); i++) {
                 if (positions.get(positions.keyAt(i)) == true) {
@@ -270,7 +270,7 @@ public class LocalFileListFragment extends ExtendedListFragment {
      * @param select <code>true</code> to select all, <code>false</code> to deselect all
      */
     public void selectAllFiles(boolean select) {
-        AbsListView listView = (AbsListView) getListView();
+        AbsListView listView = getListView();
         for (int position = 0; position < listView.getCount(); position++) {
             File file = (File) mAdapter.getItem(position);
             if (file.isFile()) {

+ 11 - 5
src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java

@@ -29,7 +29,6 @@ import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
-import android.os.Parcelable;
 import android.support.annotation.Nullable;
 import android.support.v4.app.DialogFragment;
 import android.webkit.MimeTypeMap;
@@ -373,8 +372,8 @@ public class FileOperationsHelper {
      */
     public void showShareFile(OCFile file){
         Intent intent = new Intent(mFileActivity, ShareActivity.class);
-        intent.putExtra(mFileActivity.EXTRA_FILE, (Parcelable) file);
-        intent.putExtra(mFileActivity.EXTRA_ACCOUNT, mFileActivity.getAccount());
+        intent.putExtra(FileActivity.EXTRA_FILE, file);
+        intent.putExtra(FileActivity.EXTRA_ACCOUNT, mFileActivity.getAccount());
         mFileActivity.startActivity(intent);
 
     }
@@ -478,8 +477,15 @@ public class FileOperationsHelper {
         if (hideFileListing) {
             updateShareIntent.putExtra(OperationsService.EXTRA_SHARE_PERMISSIONS, OCShare.CREATE_PERMISSION_FLAG);
         } else {
-            updateShareIntent.
-                    putExtra(OperationsService.EXTRA_SHARE_PERMISSIONS, OCShare.FEDERATED_PERMISSIONS_FOR_FOLDER);
+            OwnCloudVersion serverVersion = AccountUtils.getServerVersion(mFileActivity.getAccount());
+
+            if (serverVersion != null && serverVersion.isNotReshareableFederatedSupported()) {
+                updateShareIntent.putExtra(OperationsService.EXTRA_SHARE_PERMISSIONS,
+                        OCShare.FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9);
+            } else {
+                updateShareIntent.putExtra(OperationsService.EXTRA_SHARE_PERMISSIONS,
+                        OCShare.FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9);
+            }
         }
 
         queueShareIntent(updateShareIntent);

+ 0 - 2
src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java

@@ -74,6 +74,4 @@ public class NotificationUtils {
         }, delayInMillis); 
     
     }
-    
-
 }

+ 0 - 6
src/main/java/com/owncloud/android/ui/preview/FileDownloadFragment.java

@@ -323,15 +323,9 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
             }
             mLastPercent = percent;
         }
-
     }
 
-
     public void setError(boolean error) {
         mError = error;
     }
-
-    ;
-
-
 }

+ 2 - 2
src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java

@@ -372,6 +372,7 @@ public class PreviewImageActivity extends FileActivity implements
      */
     @Override
     public void onPageScrollStateChanged(int state) {
+        // not used at the moment
     }
 
     /**
@@ -381,15 +382,14 @@ public class PreviewImageActivity extends FileActivity implements
      * @param   position                Position index of the first page currently being displayed. 
      *                                  Page position+1 will be visible if positionOffset is
      *                                  nonzero.
-     *                                  
      * @param   positionOffset          Value from [0, 1) indicating the offset from the page
      *                                  at position.
      * @param   positionOffsetPixels    Value in pixels indicating the offset from position. 
      */
     @Override
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+        // not used at the moment
     }
-    
 
     /**
      * Class waiting for broadcast events from the {@link FileDownloader} service.

+ 1 - 0
src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java

@@ -620,6 +620,7 @@ public class PreviewMediaFragment extends FileFragment implements
 
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
         Log_OC.v(TAG, "onConfigurationChanged " + this);
     }
 

+ 1 - 0
src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java

@@ -202,6 +202,7 @@ public class PreviewTextFragment extends FileFragment {
 
         @Override
         protected void onPreExecute() {
+            // not used at the moment
         }
 
         @Override

+ 1 - 1
src/main/java/com/owncloud/android/utils/DialogMenuItem.java

@@ -191,7 +191,7 @@ public class DialogMenuItem implements MenuItem {
 
     @Override
     public void setShowAsAction(int actionEnum) {
-
+        // not used at the moment
     }
 
     @Override

+ 14 - 6
src/main/java/com/owncloud/android/utils/ErrorMessageAdapter.java

@@ -17,7 +17,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-
 package com.owncloud.android.utils;
 
 import android.content.res.Resources;
@@ -57,8 +56,8 @@ public class ErrorMessageAdapter {
 
         String message = null;
 
-        if (!result.isSuccess() && isNetworkError(result.getCode())) {
-            message = getErrorMessage(result, res);
+        if (!result.isSuccess() && isCommonError(result.getCode())) {
+            message = getCommonErrorMessage(result, res);
 
         } else if (operation instanceof UploadFileOperation) {
 
@@ -119,6 +118,7 @@ public class ErrorMessageAdapter {
                     // Error --> No permissions
                     message = String.format(res.getString(R.string.forbidden_permissions),
                             res.getString(R.string.forbidden_permissions_delete));
+
                 } else {
                     message = res.getString(R.string.remove_fail_msg);
                 }
@@ -158,9 +158,11 @@ public class ErrorMessageAdapter {
 
             } else if (result.getCode() == ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER) {
                 message = res.getString(R.string.filename_forbidden_charaters_from_server);
+
             } else {
                 message = res.getString(R.string.create_dir_fail_msg);
             }
+
         } else if (operation instanceof CreateShareViaLinkOperation ||
                 operation instanceof CreateShareWithShareeOperation) {
 
@@ -238,6 +240,7 @@ public class ErrorMessageAdapter {
                 // Show a Message, operation finished without success
                 message = res.getString(R.string.move_file_error);
             }
+
         } else if (operation instanceof SynchronizeFolderOperation) {
 
             if (!result.isSuccess()) {
@@ -253,9 +256,11 @@ public class ErrorMessageAdapter {
                             folderPathName);
                 }
             }
+
         } else if (operation instanceof CopyFileOperation) {
             if (result.getCode() == ResultCode.FILE_NOT_FOUND) {
                 message = res.getString(R.string.copy_file_not_found);
+
             } else if (result.getCode() == ResultCode.INVALID_COPY_INTO_DESCENDANT) {
                 message = res.getString(R.string.copy_file_invalid_into_descendent);
 
@@ -275,7 +280,7 @@ public class ErrorMessageAdapter {
         return message;
     }
 
-    private static String getErrorMessage(RemoteOperationResult result, Resources res) {
+    private static String getCommonErrorMessage(RemoteOperationResult result, Resources res) {
 
         String message = null;
 
@@ -295,15 +300,18 @@ public class ErrorMessageAdapter {
 
             } else if (result.getCode() == ResultCode.HOST_NOT_AVAILABLE) {
                 message = res.getString(R.string.network_host_not_available);
+            } else if (result.getCode() == ResultCode.MAINTENANCE_MODE) {
+                message = res.getString(R.string.maintenance_mode);
             }
         }
 
         return message;
     }
 
-    private static boolean isNetworkError(RemoteOperationResult.ResultCode code) {
+    private static boolean isCommonError(RemoteOperationResult.ResultCode code) {
         return code == ResultCode.WRONG_CONNECTION ||
                 code == ResultCode.TIMEOUT ||
-                code == ResultCode.HOST_NOT_AVAILABLE;
+                code == ResultCode.HOST_NOT_AVAILABLE ||
+                code == ResultCode.MAINTENANCE_MODE;
     }
 }

+ 1 - 1
src/main/java/third_parties/michaelOrtiz/TouchImageViewCustom.java

@@ -64,7 +64,7 @@ public class TouchImageViewCustom extends ImageViewCustom {
     //
 	private Matrix matrix, prevMatrix;
 
-    private static enum State { NONE, DRAG, ZOOM, FLING, ANIMATE_ZOOM };
+    private static enum State { NONE, DRAG, ZOOM, FLING, ANIMATE_ZOOM }
     private State state;
 
     private float minScale;

+ 179 - 92
src/main/res/values-ast/strings.xml

@@ -1,51 +1,70 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <string name="about_android">%1$s aplicación d\'Android</string>
+    <string name="about_android">Aplicación %1$s p\'Android</string>
     <string name="about_version">versión %1$s</string>
-    <string name="actionbar_sync">Anovar cuenta</string>
+    <string name="actionbar_sync">Refrescar cuenta</string>
     <string name="actionbar_upload">Xubir</string>
     <string name="actionbar_upload_from_apps">Conteníu dende otres aplicaciones</string>
     <string name="actionbar_upload_files">Ficheros</string>
     <string name="actionbar_open_with">Abrir con</string>
-    <string name="actionbar_mkdir">Nueva carpeta</string>
+    <string name="actionbar_mkdir">Carpeta nueva</string>
     <string name="actionbar_settings">Axustes</string>
     <string name="actionbar_see_details">Detalles</string>
     <string name="actionbar_send_file">Unviar</string>
     <string name="actionbar_sort">Ordenar</string>
-    <string name="actionbar_sort_title">Ordenar por</string>
+    <string name="actionbar_sort_title">Ordenar per</string>
+    <string name="sort_by">Ordenar per</string>
+    <string name="menu_item_sort_by_name_a_z">A - Z</string>
+    <string name="menu_item_sort_by_name_z_a">Z - A</string>
+    <string name="menu_item_sort_by_date_newest_first">Lo más nuevo</string>
+    <string name="menu_item_sort_by_date_oldest_first">Lo más vieyo</string>
+    <string name="menu_item_sort_by_size_biggest_first">Lo más grande</string>
+    <string name="menu_item_sort_by_size_smallest_first">Lo más pequeño</string>
+
     <string name="drawer_item_all_files">Tolos ficheros</string>
+    <string name="drawer_item_files">Ficheros</string>
+    <string name="drawer_item_home">Aniciu</string>
+    <string name="drawer_item_favorites">Favoritos</string>
+    <string name="drawer_item_photos">Semeyes</string>
+    <string name="drawer_item_on_device">Nel preséu</string>
+    <string name="drawer_item_recently_added">Amestao apocayá</string>
+    <string name="drawer_item_recently_modified">Modificao apocayá</string>
+    <string name="drawer_item_shared">Compartío</string>
+    <string name="drawer_item_videos">Vídeos</string>
     <string name="drawer_item_settings">Axustes</string>
     <string name="drawer_item_uploads_list">Xubes </string>
-    <string name="drawer_close">Zarrar</string>
+    <string name="drawer_item_activities">Actividaes</string>
+    <string name="drawer_item_notifications">Avisos</string>
+    <string name="drawer_quota">%1$s de %2$s usao</string>
+	<string name="drawer_close">Zarrar</string>
     <string name="drawer_open">Abrir</string>
     <string name="prefs_category_general">Xeneral</string>
     <string name="prefs_category_more">Más</string>
     <string name="prefs_accounts">Cuentes</string>
-    <string name="prefs_manage_accounts">Alministrar cuentes</string>
-    <string name="prefs_passcode">Contraseña</string>
-    <string name="prefs_instant_upload">Xubida de semeya instantánea</string>
+    <string name="prefs_manage_accounts">Xestionar cuentes</string>
+    <string name="prefs_fingerprint_notsetup">Nun se configuraron buelgues.</string>
+    <string name="prefs_show_hidden_files">Amosar ficheros anubríos</string>
+    <string name="prefs_instant_upload">Xuba nel intre de semeyes</string>
     <string name="prefs_instant_upload_summary">Xuba nel intre de semeyes feches cola cámara</string>
-    <string name="prefs_instant_video_upload">Xubida de videu nel intre</string>
-    <string name="prefs_instant_video_upload_summary">Xubida nel intre de vídeos grabaos pela cámara</string>
+    <string name="prefs_instant_video_upload">Xuba nel intre de vídeos</string>
+    <string name="prefs_instant_video_upload_summary">Xuba nel intre de vídeos fechos cola cámara</string>
     <string name="prefs_log_title">Habilitar rexistru</string>
     <string name="prefs_log_summary">Esto úsase pa rexistrar problemes</string>
     <string name="prefs_log_title_history">Historial del rexistru</string>
-    <string name="prefs_log_summary_history">Esto amuesa los rexistros atroxaos</string>
+    <string name="prefs_log_summary_history">Esto amuesa los rexistros grabaos</string>
     <string name="prefs_log_delete_history_button">Desaniciar historial</string>
+    <string name="prefs_calendar_contacts">Sincronizar calendariu &amp; contautos</string>
+    <string name="prefs_calendar_contacts_summary">Configura DAVdroid (v1.3.0+) pa la cuenta actual</string>
     <string name="prefs_help">Ayuda</string>
-    <string name="prefs_recommend">Recomendar a un collaciu</string>
     <string name="prefs_feedback">Mensaxes de retroalimentación</string>
-    <string name="prefs_imprint">Imprint</string>
-    <string name="prefs_remember_last_share_location">Recuerdala llocalización compartida</string>
-    <string name="prefs_remember_last_upload_location_summary">Recuerda la cabera llocalización compartida</string>
-
-	<string name="recommend_subject">¡Prueba %1$s nel to teléfonu intelixente!</string>
-	<string name="recommend_text">Prestaríame invitate a usar %1$s nel to smartphone Descárgalo equi: %2$s</string>
+    <string name="recommend_subject">¡Prueba %1$s nel to teléfonu intelixente!</string>
+	<string name="recommend_text">Quiero convidate a usar %1$s nel to teléfonu intelixente.\nBáxalu d\'equí: %2$s</string>
 
     <string name="auth_check_server">Comprobar servidor</string>
     <string name="auth_host_url">Direición del sirvidor https://...</string>
     <string name="auth_username">Nome d\'usuariu</string>
     <string name="auth_password">Contraseña</string>
+    <string name="auth_register">¿Entá nun tienes un sirvidor?\nPrimi equí pa consiguir ún d\'un fornidor</string>
     <string name="sync_string_files">Ficheros</string>
     <string name="setup_btn_connect">Coneutar</string>
     <string name="uploader_btn_upload_text">Xubir</string>
@@ -56,14 +75,24 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Colar</string>
     <string name="uploader_error_title_no_file_to_upload">Ensin ficheru pa xubir</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s nun puede xubir un cachu de testu como un ficheru.</string>
-    <string name="uploader_error_title_file_cannot_be_uploaded">Ficheru nun puede xubise</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s nun ta permitíu lleer un ficheru recibíu</string>
-    <string name="uploader_error_message_source_file_not_found">Ficheru pa xubir nun s\'atopó nel so allugamientu . Por favor, compruebe si esiste\'l ficheru.</string>
-    <string name="uploader_error_message_source_file_not_copied">Hebo un fallu mientres s\'intentaba copiar un ficheru a una carpeta temporal. Por favor, intente unviala de nuevu.</string>
+    <string name="uploader_error_message_source_file_not_copied">Nun pudo copiase\'l ficheru a una carpeta temporal. Prueba a reunvialu.</string>
+    <string name="uploader_upload_files_behaviour_only_upload">Caltener ficheru na carpeta fonte</string>
     <string name="file_list_seconds_ago">hai segundos</string>
+    <string name="file_list_empty_headline">Equí nun hai ficheros</string>
     <string name="file_list_loading">Cargando...</string>
-    <string name="file_list_no_app_for_file_type">¡Nun s\'alcontró aplicación pa la triba de ficheru!</string>
     <string name="local_file_list_empty">Nun hai ficheros nesta carpeta.</string>
+    <string name="file_list_empty_headline_search">Ensin resultaos nesta carpeta</string>
+    <string name="file_list_empty_headline_server_search">Ensin resultaos</string>
+    <string name="file_list_empty_shared_headline">Entá nun se compartió nada</string>
+    <string name="file_list_empty_shared">Equí amosaránse los ficheros y carpetes que compartas</string>
+    <string name="file_list_empty_headline_server_search_videos">Ensín vídeos</string>
+    <string name="file_list_empty_headline_server_search_photos">Ensin semeyes</string>
+    <string name="file_list_empty_search">¿Quiciabes tea nuna carpeta diferente?</string>
+    <string name="file_list_empty_recently_modified_filter">La to gueta nun devolvió ficheros
+        modificaos nos caberos 7 díes.</string>
+    <string name="file_list_empty_text_videos_filter">La to gueta nun devolvió vídeos.</string>
+    <string name="upload_list_empty_headline">Nun hai xubes disponibles</string>
     <string name="file_list_folder">Carpeta</string>
     <string name="file_list_folders">Carpetes</string>
     <string name="file_list_file">Ficheru</string>
@@ -75,14 +104,12 @@
     <string name="filedetails_modified">Modificáu:</string>
     <string name="filedetails_download">Descargar</string>
     <string name="filedetails_sync_file">Sincroniza</string>
-    <string name="filedetails_renamed_in_upload_msg">El ficheru renomóse a %1$s demientres la xuba</string>
-    <string name="list_layout">Llista de diseños</string>
+    <string name="filedetails_renamed_in_upload_msg">Renomóse\'l ficheru %1$s na xuba</string>
     <string name="action_share">Compartir</string>
     <string name="common_yes">Sí</string>
     <string name="common_no">Non</string>
     <string name="common_ok">Aceutar</string>
     <string name="common_remove_upload">Desaniciar xuba</string>
-    <string name="common_retry_upload">Reintentar xuba</string>
     <string name="common_cancel_sync">Encaboxar sincronización</string>
     <string name="common_cancel">Encaboxar</string>
     <string name="common_back">Atrás</string>
@@ -99,10 +126,9 @@
     <string name="uploader_info_dirname">Nome de la carpeta</string>
     <string name="uploader_upload_in_progress_ticker">Xubiendo ...</string>
     <string name="uploader_upload_in_progress_content">%1$d%% Xubiendo %2$s</string>
-    <string name="uploader_upload_succeeded_ticker">Xuba correuta</string>
     <string name="uploader_upload_succeeded_content_single">%1$s xubíu</string>
     <string name="uploader_upload_failed_ticker">Xuba fallida</string>
-    <string name="uploader_upload_failed_content_single">Nun pudo completase la xuba de %1$s</string>
+    <string name="uploader_upload_failed_content_single">Nun pudo xubise %1$s</string>
     <string name="uploader_upload_failed_credentials_error">Falló la xubida, necesites aniciar sesión de nueves</string>
     <string name="uploads_view_title">Xubes</string>
     <string name="uploads_view_group_current_uploads">Actual</string>
@@ -119,36 +145,34 @@
     <string name="uploads_view_upload_status_failed_localfile_error">Ficheru llocal nun s\'atopó</string>
     <string name="uploads_view_upload_status_failed_permission_error">Fallu de permisu</string>
     <string name="uploads_view_upload_status_conflict">Conflictu</string>
-    <string name="uploads_view_upload_status_service_interrupted">Aplicación terminóse</string>
+    <string name="uploads_view_upload_status_service_interrupted">Aplicación finada</string>
     <string name="uploads_view_upload_status_unknown_fail">Fallu desconocíu</string>
-    <string name="uploads_view_upload_status_waiting_for_wifi">Esperando conectividá wifi</string>
+    <string name="uploads_view_upload_status_waiting_for_wifi">Esperando pola coneutividá Wi-Fi</string>
     <string name="uploads_view_later_waiting_to_upload">Esperando pa xubir</string>
     <string name="downloader_download_in_progress_ticker">Baxando ...</string>
     <string name="downloader_download_in_progress_content">%1$d%% Descargando %2$s</string>
-    <string name="downloader_download_succeeded_ticker">Descarga correuta</string>
     <string name="downloader_download_succeeded_content">%1$s descargáu</string>
     <string name="downloader_download_failed_ticker">Descarga fallida</string>
-    <string name="downloader_download_failed_content">La descarga de %1$s nun pudo completase</string>
     <string name="downloader_not_downloaded_yet">Entá non baxáu</string>
     <string name="downloader_download_failed_credentials_error">Descarga fallida, necesites aniciar sesión de nueves</string>
     <string name="common_choose_account">Esbillar cuenta</string>
     <string name="sync_fail_ticker">Sincronización fallida</string>
-    <string name="sync_fail_content">La sincronización de %1$s nun pudo completase</string>
-    <string name="sync_fail_content_unauthorized">Contraseña inválida pa %1$s</string>
+    <string name="sync_fail_content">Nun pudo completase la sincronización de %1$s</string>
+    <string name="sync_fail_content_unauthorized">Contraseña incorreuta pa %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Conflictos alcontraos</string>
     <string name="sync_conflicts_in_favourites_content">Los ficheros %1$d kept-in-sync pueden nun tar sincronizaos</string>
     <string name="sync_fail_in_favourites_ticker">Fallu al caltener ficheros sincronizaos.</string>
     <string name="sync_fail_in_favourites_content">Los conteníos de los ficheros %1$d pueden nun tar sincronizaos (%2$d conflictos)</string>
     <string name="sync_foreign_files_forgotten_ticker">Dexáronse dalgunos ficheros llocales.</string>
     <string name="sync_foreign_files_forgotten_content">Los ficheros %1$d fuera de la carpeta %2$s nun puen copiase dientro</string>
-    <string name="sync_foreign_files_forgotten_explanation">Lo mesmo que na versión 1.3.16, los archivos xubíos dende esti preséu copiáronse dientro la carpeta llocal %1$s pa prevenir la perda de datos cuando un ficheru se sincroniza con múltiples cuentes Por mor d\'esti cambéu, tolos ficheros xubíos en versiones previes d\'esta aplicación tán copiaos na carpeta %2$s . Por embargu, un error torgó\'l pieslle de la operación demientres la sincronización de la cuenta. Pues dexar el/los ficheru/os como tán, desaniciar l\'enllaz a %3$s , o mover el/los ficheru/os a la carpeta %1$s y guardar l\'enllaz a %4$s . El llistáu d\'abaxo contién los ficheros llocales y remotos enllazaos en %5$s</string>
-    <string name="sync_current_folder_was_removed">La carpeta %1$s yá nun esiste</string>
     <string name="foreign_files_move">Mover too</string>
     <string name="foreign_files_success">Moviéronse tolos ficheros</string>
     <string name="foreign_files_fail">Nun pudieron movese dalgunos ficheros</string>
     <string name="foreign_files_local_text">Llocal: %1$s</string>
     <string name="foreign_files_remote_text">Remotu: %1$s</string>
-    <string name="pass_code_configure_your_pass_code">Introduz la contraseña</string>
+    <string name="pass_code_enter_pass_code">Introduz el to códigu de pasu, por favor</string>
+    
+    <string name="pass_code_configure_your_pass_code">Introduz el to códigu de pasu</string>
     <string name="pass_code_configure_your_pass_code_explanation">La contraseña va ser solicitada cada vegada que s\'anicie l\'aplicación</string>
     <string name="pass_code_reenter_your_pass_code">Por favor, vuelvi inxertar la contraseña</string>
     <string name="pass_code_remove_your_pass_code">Desanicia la to contraseña</string>
@@ -163,16 +187,13 @@
     <string name="media_event_done">%1$s reproducción finada</string>
     <string name="media_err_nothing_to_play">Nun s\'atopó nengún ficheru multimedia</string>
     <string name="media_err_no_account">Nun s\'especificó nenguna cuenta.</string>
-    <string name="media_err_not_in_owncloud">El ficheru nun ta nuna cuenta válida</string>
+    <string name="media_err_not_in_owncloud">El ficheru nun ye una cuenta válida</string>
     <string name="media_err_unsupported">Códec multimedia non soportáu</string>
-    <string name="media_err_io">El códec multimedia nun ye llexible.</string>
-    <string name="media_err_malformed">Ficheru multimedia codificáu incorreutamente</string>
-    <string name="media_err_timeout">Acabóse\'l tiempu intentando reproducir</string>
-    <string name="media_err_invalid_progressive_playback">El ficheru multimedia nun pue tresferise</string>
-    <string name="media_err_unknown">Ficheru multimedia nun pue reproducise</string>
-    <string name="media_err_security_ex">Fallu de seguridá intentando reproducir %1$s</string>
-    <string name="media_err_io_ex">Fallu d\'entrada intentando reproducir %1$s</string>
-    <string name="media_err_unexpected">Error inesperáu intentando reproducir %1$s</string>
+    <string name="media_err_io">Nun pudo lleese\'l ficheru de medios</string>
+    <string name="media_err_timeout">Escoso\'l tiempu pa reproducir el ficheru</string>
+    <string name="media_err_security_ex">Alcontróse un fallu de seguranza tentando de reproducir %1$s</string>
+    <string name="media_err_io_ex">Fallu d\'entrada entrín se tentaba de reproducir %1$s</string>
+    <string name="media_err_unexpected">Fallu inesperáu entrín se tentaba de reproducir %1$s</string>
     <string name="media_rewind_description">Botón de rebobináu</string>
     <string name="media_play_pause_description">Botón de reproducción o posa</string>
     <string name="media_forward_description">Botón d\'avance rápidu</string>
@@ -184,56 +205,54 @@
 	<string name="auth_connection_established">Conexón afitada</string>
 	<string name="auth_testing_connection">Probando conexón</string>
 	<string name="auth_not_configured_title">Configuración del sirvidor mal fecha</string>
-	<string name="auth_account_not_new">Yá esiste una cuenta col mesmu usuariu y sirvidor nel preséu</string>
+	<string name="auth_account_not_new">Yá esiste nel preséu una cuenta pal mesmu usuariu y sirvidor</string>
 	<string name="auth_account_not_the_same">L\'usuariu inxertáu nun concasa col usuariu d\'esta cuenta</string>
 	<string name="auth_unknown_error_title">¡Asocedió un fallu desconocíu!</string>
-	<string name="auth_unknown_host_title">Nun pue atopase\'l sirvidor</string>
-	<string name="auth_incorrect_path_title">Nun s\'atopa la instancia del sirvidor.</string>
+	<string name="auth_unknown_host_title">Nun pudo alcontrase l\'agospiu</string>
+	<string name="auth_incorrect_path_title">Nun s\'alcontró\'l sirvidor</string>
 	<string name="auth_timeout_title">El sirvidor tardó muncho en responder</string>
-	<string name="auth_incorrect_address_title">Formatu de direición de sirvidor incorrectu</string>
 	<string name="auth_ssl_general_error_title">Falló la inicialización SSL</string>
-	<string name="auth_ssl_unverified_server_title">Nun se pue certificar la identidá del sirvidor SSL</string>
+	<string name="auth_ssl_unverified_server_title">Nun pudo verificase la identidá del sirvidor SSL</string>
 	<string name="auth_bad_oc_version_title">Versión del sirvidor non reconocida</string>
-	<string name="auth_wrong_connection_title">Nun se pue afitar conexón</string>
+	<string name="auth_wrong_connection_title">Nun pudo afitase la conexón</string>
 	<string name="auth_secure_connection">Afitada conexón segura</string>
 	<string name="auth_unauthorized">Nome d\'usuariu o contraseña erroneos</string>
 	<string name="auth_oauth_error">Autorización ensin ésitu</string>
 	<string name="auth_oauth_error_access_denied">Accesu refugáu pol sirvidor d\'autenticación</string>
-	<string name="auth_wtf_reenter_URL">Estáu non esperáu; por favor, inxerta la direición del sirvidor otra vegada</string>
 	<string name="auth_expired_oauth_token_toast">La to autorización finó. Por favor, autorízala otra vegada</string>
 	<string name="auth_expired_basic_auth_toast">Por favor, introduzca la contraseña actual</string>
 	<string name="auth_expired_saml_sso_token_toast">La so sesión finó. Por favor conéutate otra vegada</string>
-	<string name="auth_connecting_auth_server">Coneutando al sirvidor d\'autentificación…</string>
+	<string name="auth_connecting_auth_server">Coneutando col sirvidor d\'autenticación...</string>
 	<string name="auth_unsupported_auth_method">El sirvidor nun sofita esti métodu/triba d\'autentificación</string>
 	<string name="auth_unsupported_multiaccount">%1$s nun permite cuentes múltiples</string>
 	<string name="auth_can_not_auth_against_server">Nun pues autentificate nesti sirvidor</string>
-    <string name="auth_account_does_not_exist">La cuenta nun esiste nel preséu aínda</string>
+    <string name="auth_account_does_not_exist">La cuenta entá nun esiste nel preséu</string>
     
     <string name="favorite">Afitar como disponible ensin conexón</string>
     <string name="unfavorite">Desaniciar como disponible ensin conexón</string>
+    <string name="favorite_real">Afitar como favoritu</string>
     <string name="common_rename">Renomar</string>
     <string name="common_remove">Desaniciáu</string>
-    <string name="confirmation_remove_folder_alert">¿De xuru quies desaniciar %1$s y los sos conteníos?</string>
+    <string name="confirmation_remove_file_alert">¿De xuru que quies desaniciar %1$s?</string>
     <string name="confirmation_remove_local">Namái llocal</string>
-    <string name="remove_success_msg">Desaniciu correutu</string>
     <string name="remove_fail_msg">Fallu nel desaniciu </string>
     <string name="rename_dialog_title">Introduz un nome nuevu</string>
-    <string name="rename_local_fail_msg">Nun se puede renomar la copia llocal; intenta un nome diferente</string>
-    <string name="rename_server_fail_msg">Nun se pudo completar el renomáu</string>
-    <string name="sync_file_fail_msg">El ficheru remotu nun pudo comprobase</string>
+    <string name="rename_server_fail_msg">Nun pudo dase\'l nome nuevu al sirvidor</string>
+    <string name="sync_file_fail_msg">Nun pudo comprobase\'l ficheru remotu</string>
     <string name="sync_file_nothing_to_do_msg">El conteníu del ficheru yá ta sincronizáu</string>
-    <string name="create_dir_fail_msg">Nun se puede crear la carpeta</string>
+    <string name="create_dir_fail_msg">Nun pudo crease la carpeta</string>
     <string name="filename_forbidden_characters">Caráuteres prohibíos: / \\ &lt; &gt; : \" | ? *</string>
     <string name="filename_forbidden_charaters_from_server">El nome del ficheru contién polo menos un carácter non válidu</string>
     <string name="filename_empty">El nome de ficheru nun pue tar baleru</string>
-    <string name="wait_a_moment">Espera un momentu</string>
+    <string name="wait_a_moment">Espera un momentu...</string>
     <string name="wait_checking_credentials">Comprobación de credenciales almacenaes</string>
-    <string name="filedisplay_no_file_selected">Nun s\'esbilló dengún ficheru</string>
+    <string name="filedisplay_unexpected_bad_get_content">Problema inesperáu, por favor esbilla\'l ficheru dende una aplicación diferente</string>
+    <string name="filedisplay_no_file_selected">Nun s\'esbillaron ficheros</string>
     <string name="activity_chooser_title">Unviar enllaz a ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copiando ficheru dende l\'almacenamientu priváu</string>
     
     <string name="oauth_check_onoff">Aniciar sesión con oAuth2</string> 
-    <string name="oauth_login_connection">Coneutando al sirvidor oAuth2…</string>    
+    <string name="oauth_login_connection">Coneutando col sirvidor d\'OAuth2</string>    
         
     <string name="ssl_validator_header">La identidá del sitiu nun pue certificase</string>
     <string name="ssl_validator_reason_cert_not_trusted">- El certificáu del sirvidor nun ye de confianza</string>
@@ -270,19 +289,27 @@
     <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
     <string name="placeholder_media_time">12:23:45</string>
 
-    <string name="instant_upload_on_wifi">Xubir semeyes namái per WiFi</string>
-    <string name="instant_video_upload_on_wifi">Xubir vídeos namái per WIFI</string>
+    <string name="auto_upload_on_wifi">Xubir namái na Wi-Fi</string>
+    <string name="instant_upload_on_wifi">Xubir namái semeyes na Wi-Fi</string>
+    <string name="instant_video_upload_on_wifi">Xubir namái vídeos na Wi-Fi</string>
+    <string name="instant_video_upload_on_charging">Namái xubir al cargar</string>
+    <string name="instant_upload_on_charging">Namái xubir al cargar</string>
     <string name="instant_upload_path">/XubidaNelIntre</string>
     <string name="conflict_title">Conflictu nel ficheru</string>
-    <string name="conflict_message">¿Qué ficheros quies caltener? Si seleiciones dambes versiones, el ficheru llocal va tener un númberu amestáu al so nome</string>
+    <string name="conflict_message">¿Qué ficheros quies caltener? Si esbilles dambes versiones, el ficheru llocal tendrá un númberu axuntáu al so nome.</string>
     <string name="conflict_keep_both">Caltener dambos</string>
     <string name="conflict_use_local_version">Versión llocal</string>
     <string name="conflict_use_server_version">Versión de sirvidor</string>
-    
+
+    <string name="preview_sorry">Perdón.</string>
     <string name="preview_image_description">Previsualización d\'imaxe</string>
-    <string name="preview_image_error_unknown_format">Nun pue amosase esta imaxe</string>
+    <string name="preview_image_error_unknown_format">Nun pue amosase la imaxe</string>
 
     <string name="error__upload__local_file_not_copied">Nun se pudo copiar %1$s al ficheru llocal %2$s</string>
+    <string name="prefs_instant_upload_path_title">Carpeta de xuba nel intre</string>
+    <string name="prefs_folder_sync_local_path_title">Carpeta llocal</string>
+    <string name="prefs_folder_sync_remote_path_title">Carpeta remota</string>
+    <string name="prefs_instant_upload_path_use_subfolders_title">Usar socarpetes</string>
     <string name="share_link_file_no_exist">Nun pue compartise. Por favor, comprueba si\'l ficheru esiste</string>
 	<string name="share_link_file_error">Hebo un fallu mientres s\'intentaba compartir esti ficheru o carpeta</string>
 	<string name="unshare_link_file_no_exist">Incapaz de dexar de compartir. Por favor, comprueba si\'l ficheru esiste</string>
@@ -295,49 +322,63 @@
 
     <string name="copy_link">Copiar enllaz</string>
     <string name="clipboard_text_copied">Copiáu al cartafueyu</string>
-    <string name="clipboard_no_text_to_copy">Nun se recibió dengún testu pa copiar al cartafueyu</string>
     <string name="clipboard_uxexpected_error">Error inesperáu intentando copiar al cartafueyu</string>
     <string name="clipboard_label">Testu copiáu dende %1$s</string>
 
-    <string name="error_cant_bind_to_operations_service">Fallu críticu: nun puen facese les operaciones</string>
+    <string name="error_cant_bind_to_operations_service">Fallu críticu: Nun puen facese les operaciones</string>
+
+    <string name="network_error_socket_exception">Asocedió un fallu na conexón col sirvidor.</string>
+    <string name="network_error_socket_timeout_exception">Asocedió un fallu entrín s\'esperaba pol sirvidor. Nun pudo completase la operación.</string>
+    <string name="network_error_connect_timeout_exception">Asocedió un fallu entrín s\'esperaba pol sirvidor. Nun pudo completase la operación.</string>
+    <string name="network_host_not_available">Nun pudo completase la operación. Sirvidor non disponible</string>
 
-    <string name="network_error_socket_exception">Asocedió un fallu cuando se coneutaba col sirvidor.</string>
     <string name="forbidden_permissions">Nun tienes permisu %s</string>
     <string name="forbidden_permissions_rename">pa renomar esti ficheru</string>
     <string name="forbidden_permissions_delete">pa desaniciar esti ficheru</string>
     <string name="share_link_forbidden_permissions">pa compartir esti ficheru</string>
-    <string name="unshare_link_forbidden_permissions">pa nun compartir esti ficheru</string>
-    <string name="update_link_forbidden_permissions">p\'actualizar esta cuota</string>
+    <string name="unshare_link_forbidden_permissions">pa dexar de compartir esti ficheru</string>
+    <string name="update_link_forbidden_permissions">p\'anovar esta compartición</string>
     <string name="forbidden_permissions_create">pa crear esti ficheru</string>
-    <string name="uploader_upload_forbidden_permissions">pa xubir ficheros a esta carpeta</string>
+    <string name="uploader_upload_forbidden_permissions">pa xubir esta carpeta</string>
     <string name="downloader_download_file_not_found">Esti ficheru yá nun ta nel sirvidor</string>
 
+    <string name="file_migration_preparing">Tresnando la migración &#8230;</string>
+    <string name="file_migration_checking_destination">Comprobando destín &#8230;</string>
+    <string name="file_migration_waiting_for_unfinished_sync">Esperando que finen toles sincronizaciones &#8230;</string>
+    <string name="file_migration_migrating">Moviendo datos &#8230;</string>
+    <string name="file_migration_updating_index">Anovando índiz &#8230;</string>
+    <string name="file_migration_cleaning">Llimpiando &#8230;</string>
+    <string name="file_migration_failed_not_enough_space">FALLU: Espaciu insuficiente</string>
+    <string name="file_migration_failed_not_writable">FALLU: El ficheru de destín nun ye escribible</string>
+    <string name="file_migration_failed_not_readable">FALLU: Nun pue lleese\'l códigu fonte</string>
+    <string name="file_migration_failed_dir_already_exists">FALLU: Yá esiste\'l to direutoriu de Nextcloud</string>
+    <string name="file_migration_failed_while_coping">FALLU: Fallu na migración</string>
+    <string name="file_migration_failed_while_updating_index">FALLU: Falló l\'anovamientu del índiz</string>
+
+    <string name="file_migration_override_data_folder">Trocar</string>
+    <string name="file_migration_use_data_folder">Usar</string>
+
     <string name="prefs_category_accounts">Cuentes</string>
     <string name="prefs_add_account">Amestar cuenta</string>
-    <string name="auth_redirect_non_secure_connection_title">La conexón segura rediríxese pente una ruta insegura.</string>
-
-	<string name="actionbar_logger">Rexistros</string>
+    <string name="drawer_manage_accounts">Xestionar cuentes</string>
+    <string name="actionbar_logger">Rexistros</string>
 	<string name="log_send_history_button">Unviar historial</string>
-	<string name="log_send_no_mail_app">Nun s\'atopó nenguna aplicación pa unviar rexistros.  Por favor instala una aplicación de corréu electrónicu</string>
 	<string name="log_send_mail_subject">Aplicación de rexistros d\'Android %1$s</string>
 	<string name="log_progress_dialog_text">Cargando datos ...</string>
 
 	<string name="saml_authentication_required_text">Necesítase autenticación</string>
 	<string name="saml_authentication_wrong_pass">Contraseña incorreuta</string>
 	<string name="actionbar_move">Mover</string>
-    <string name="file_list_empty_moving">Ensín nada dientro. ¡Pues amestar una carpeta!</string>
+    <string name="actionbar_copy">Copiar</string>
+	<string name="file_list_empty_moving">Equí nun hai nada. Pes amestar una carpeta</string>
 	<string name="folder_picker_choose_button_text">Esbillar</string>
 
-    <string name="move_file_not_found">Nun pue movese. Por favor, comprueba si\'l ficheru esiste</string>
-    <string name="move_file_invalid_into_descendent">Nun ye posible mover una carpeta dientro de so subcarpeta</string>
-    <string name="move_file_invalid_overwrite">El ficheru yá esiste na carpeta destín</string>
+    <string name="move_file_not_found">Nun pue movese\'l ficheru. Comprueba si esiste, por favor</string>
     <string name="move_file_error">Asocedió un fallu entrín s\'intentaba mover esta carpeta</string>
     <string name="forbidden_permissions_move">pa mover esti ficheru</string>
 
 
     <string name="copy_file_not_found">Nun pue copiáse. Por favor, comprueba si\'l ficheru esiste</string>
-    <string name="copy_file_invalid_into_descendent">Nun ye posible copiar una carpeta diento de so subcarpeta</string>
-    <string name="copy_file_invalid_overwrite">El ficheru yá esiste na carpeta destín</string>
     <string name="copy_file_error">Asocedió un fallú entrín s\'intentaba copiar esta carpeta o ficheru</string>
     <string name="forbidden_permissions_copy">pa copiar esti ficheru</string>
 
@@ -370,8 +411,13 @@
     <string name="prefs_instant_behaviour_title">Ficheru orixinal será&#8230;</string>
     <string name="upload_copy_files">Copiar ficheru</string>
     <string name="upload_move_files">Mover ficheru</string>
+    <string name="select_all">Esbillar too</string>
+
     <string name="pref_behaviour_entries_keep_file">guardáu en carpeta orixinal</string>
     <string name="pref_behaviour_entries_move">movíu a la carpeta d\'aplicaciones</string>
+    <string name="prefs_storage_path">Camín d\'almacenamientu</string>
+    <string name="prefs_common">Común</string>
+
     <string name="share_dialog_title">Compartiendo</string>
     <string name="share_file">Compartir %1$s</string>
     <string name="share_with_user_section_title">Compartir con usuarios y grupos</string>
@@ -379,7 +425,6 @@
     <string name="share_add_user_or_group">Amestar usuariu o grupu</string>
     <string name="share_via_link_section_title">Compartir enllaz</string>
     <string name="share_via_link_expiration_date_label">Afitar la data de caducidá</string>
-    <string name="share_via_link_password_label">Protexer con contraseña</string>
     <string name="share_via_link_password_title">Aseguráu</string>
     <string name="share_via_link_edit_permission_label">Permitir edición</string>
     <string name="share_get_public_link_button">Consiguir enllaz</string>
@@ -401,19 +446,61 @@
     <string name="edit_share_unshare">Dexar de compartir</string>
     <string name="edit_share_done">fechu</string>
 
-    <string name="action_retry_uploads">Reintentar falló</string>
     <string name="action_clear_failed_uploads">Llimpiar falló</string>
-    <string name="action_clear_successful_uploads">Llimpieza con ésitu</string>
-    <string name="action_clear_finished_uploads">Esborrar tolos finalizaos</string>
-
     <string name="action_switch_grid_view">Vista de rexella</string>
     <string name="action_switch_list_view">Vista de llista</string>
 
     <string name="manage_space_title">Alministrar espaciu</string>
-    <string name="manage_space_description">Axustes, bases de datos y sirvidor de certificaos de los datos %1$s esborraránse dafechu. \n\nLos archivos descargados caltendrase intactos.\n\nEsti procesu puede tardar dalgún tiempu.</string>
     <string name="manage_space_clear_data">Llimpiar datos</string>
     <string name="manage_space_error">Dalgunos ficheros nun pudieron esborrase.</string>
 
-    <string name="permission_storage_access">Ríquense permisos adicionales para xubir &amp; los ficheros descargaos.</string>
-    <string name="local_file_not_found_toast">El ficheru nun s\'atopó nel sistema de ficheros llocal</string>
+    <string name="learn_more">Deprendi más</string>
+    <string name="participate_release_candidate_headline">Llanzamientu candidatu</string>
+    <string name="folder_sync_settings">Axustes</string>
+    <string name="activity_list_loading_activity">Cargando actividaes &#8230;</string>
+    <string name="activity_list_no_results">Nun s\'alcontraron actividaes.</string>
+
+    <string name="notifications_loading_activity">Cargando avisos &#8230;</string>
+    <string name="notifications_no_results_headline">Ensin avisos</string>
+    <string name="upload_file_dialog_filename">Nome de ficheru</string>
+    <string name="upload_file_dialog_filetype">Triba de ficheru</string>
+    <string name="storage_description_sd_no">Tarxeta SD %1$d</string>
+    <string name="storage_description_unknown">Desconozse</string>
+
+    <!-- What's new feature and texts to show -->
+    <string name="whats_new_title">Qué hai nuevo en Nextcloud</string>
+
+    <!-- Welcome to Nc intro features -->
+    <string name="welcome_feature_1_title">Un llar seguru pa tolos tos datos</string>
+    <string name="welcome_feature_1_text">Accedu, comparti y protexi los tos ficheros en casa y nel trabayu</string>
+
+    <string name="welcome_feature_3_title">Xuba nel intre</string>
+    <string name="whats_new_skip">Saltar</string>
+
+    <string name="fingerprint_scan_finger">Escania\'l to deu, por favor</string>
+    <string name="fingerprint_unknown">Nun se reconoz el deu</string>
+
+    <!-- User information -->
+    <string name="user_info_full_name">Nome completu</string>
+    <string name="user_info_email">Corréu</string>
+    <string name="user_info_phone">Númberu telefónicu</string>
+    <string name="user_info_address">Direición</string>
+    <string name="user_info_website">Sitiu web</string>
+    <string name="user_info_twitter">Twitter</string>
+
+    <string name="user_information_description">Información d\'usuariu</string>
+
+    <!-- Activities -->
+    <string name="activities_no_results_headline"> Entá nun hai actividá</string>
+    <string name="webview_error">Asocedió un fallu</string>
+    <string name="prefs_category_about">Tocante a</string>
+
+    <string name="actionbar_contacts">Respaldar contautos</string>
+    <string name="actionbar_contacts_restore">Restaurar contautos</string>
+    <string name="contacts_backup_button">Respaldar agora</string>
+    <string name="contacts_header_restore">Respaldar</string>
+    <string name="contacts_preference_backup_never">enxamás</string>
+    <!-- Notifications -->
+    <string name="new_notification_received">Recibióse un avisu nuevu</string>
+    <string name="drawer_logout">Zarrar sesión</string>
     </resources>

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

@@ -632,6 +632,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Přijato nové upozornění</string>
     <string name="drawer_logout">Odhlásit se</string>
-
-
-</resources>
+    </resources>

+ 1 - 3
src/main/res/values-de-rDE/strings.xml

@@ -651,6 +651,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Neue Benachrichtigung erhalten</string>
     <string name="drawer_logout">Abmelden</string>
-
-
-</resources>
+    </resources>

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

@@ -651,6 +651,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Neue Benachrichtigung erhalten</string>
     <string name="drawer_logout">Abmelden</string>
-
-
-</resources>
+    </resources>

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

@@ -650,6 +650,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Νέα ενημέρωση ελήφθη </string>
     <string name="drawer_logout">Έξοδος</string>
-
-
-</resources>
+    </resources>

+ 1 - 3
src/main/res/values-en-rGB/strings.xml

@@ -649,6 +649,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">New notification received</string>
     <string name="drawer_logout">Logout</string>
-
-
-</resources>
+    </resources>

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

@@ -651,6 +651,4 @@ en los últimos 7 días. </string>
     <!-- Notifications -->
     <string name="new_notification_received">No se han recibido nuevas notificaciones </string>
     <string name="drawer_logout">Salir de la sesión</string>
-
-
-</resources>
+    </resources>

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

@@ -651,6 +651,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Nueva notificación recibida</string>
     <string name="drawer_logout">Desconectar</string>
-
-
-</resources>
+    </resources>

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

@@ -650,6 +650,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Nouvelle notification reçue</string>
     <string name="drawer_logout">Se déconnecter</string>
-
-
-</resources>
+    </resources>

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

@@ -650,6 +650,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Nytt varsel mottatt</string>
     <string name="drawer_logout">Utlogging</string>
-
-
-</resources>
+    </resources>

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

@@ -652,6 +652,4 @@ Kies er eentje van een provider.</string>
     <!-- Notifications -->
     <string name="new_notification_received">Nieuwe meldingen ontvangen</string>
     <string name="drawer_logout">Uitloggen</string>
-
-
-</resources>
+    </resources>

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

@@ -652,6 +652,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Otrzymano nowe powiadomienie</string>
     <string name="drawer_logout">Wyloguj</string>
-
-
-</resources>
+    </resources>

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

@@ -651,6 +651,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Nova notificação recebida</string>
     <string name="drawer_logout">Sair</string>
-
-
-</resources>
+    </resources>

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

@@ -655,6 +655,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Получено новое уведомление</string>
     <string name="drawer_logout">Выйти</string>
-
-
-</resources>
+    </resources>

+ 1 - 3
src/main/res/values-sq/strings.xml

@@ -651,6 +651,4 @@ në 7 ditët e fundit.</string>
     <!-- Notifications -->
     <string name="new_notification_received">Morët njoftime të reja</string>
     <string name="drawer_logout">Dilni</string>
-
-
-</resources>
+    </resources>

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

@@ -651,6 +651,4 @@
     <!-- Notifications -->
     <string name="new_notification_received">Yeni bir bildirim var</string>
     <string name="drawer_logout">Oturumu Kapat</string>
-
-
-</resources>
+    </resources>

+ 11 - 8
src/main/res/values/setup.xml

@@ -27,7 +27,7 @@
     <bool name="show_welcome_link">true</bool>
 	<string name="welcome_link_url">"https://nextcloud.com/providers"</string>
 	<string name="share_api_link"></string>
-    
+
     <!-- Flags to setup the authentication methods available in the app -->
     <string name="auth_method_oauth2">off</string>
     <string name="auth_method_saml_web_sso">off</string>
@@ -36,18 +36,18 @@
     <string name="send_files_to_other_apps">on</string>
     <bool name="share_via_link_feature">true</bool>
     <bool name="share_with_users_feature">true</bool>
-    <bool name="show_whats_new">true</bool>
     <bool name="show_external_links">true</bool>
-    <bool name="show_drawer_logout">false</bool>
-    
+
     <!-- Contacts backup -->
     <bool name="contacts_backup">true</bool>
     <string name="contacts_backup_folder">/.Contacts-Backup</string>
     <integer name="contacts_backup_expire">-1</integer>
-    
+
+    <!-- What's new -->
+    <bool name="show_whats_new">true</bool>
     <!-- To fill if you want to show webviews instead of regular welcome views -->
     <array name="whatsnew_urls"></array>
-    
+
     <!-- Colors -->
     <color name="primary">@color/nc_blue</color>
     <color name="primary_dark">#006AA3</color>
@@ -84,6 +84,7 @@
     <bool name="recently_modified_enabled">false</bool>
     <bool name="shared_enabled">true</bool>
     <bool name="videos_enabled">false</bool>
+    <bool name="show_drawer_logout">false</bool>
 
     <!-- Bottom toolbar -->
     <bool name="bottom_toolbar_enabled">false</bool>
@@ -92,11 +93,13 @@
     <bool name="fingerprint_enabled">true</bool>
     <bool name="davdroid_integration_enabled">true</bool>
     <bool name="help_enabled">true</bool>
-    <bool name="imprint_enabled">false</bool> 
+    <string name="url_help">https://help.nextcloud.com/c/feature</string>
+    <bool name="privacy_enabled">true</bool>
+    <string name="privacy_url">https://nextcloud.com/privacy</string>
+    <bool name="imprint_enabled">false</bool>
     <bool name="recommend_enabled">true</bool>
     <bool name="feedback_enabled">true</bool>
     <bool name="logger_enabled">false</bool>
-    <string name="url_help">https://help.nextcloud.com/c/feature</string>
     <string name="url_imprint"></string>
     <string name="mail_recommend">"mailto:"</string>
     <string name="mail_feedback">"mailto:android@nextcloud.com"</string>

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

@@ -276,7 +276,8 @@
 	<string name="auth_fail_get_user_name">Your server is not returning a correct user ID, please contact an administrator</string>
 	<string name="auth_can_not_auth_against_server">Cannot authenticate to this server</string>
     <string name="auth_account_does_not_exist">Account does not exist on the device yet</string>
-    
+
+
     <string name="favorite">Set as available offline</string>
     <string name="unfavorite">Unset as available offline</string>
     <string name="favorite_real">Set as favorite</string>
@@ -543,6 +544,8 @@
     <string name="local_file_not_found_toast">File not found in local file system</string>
     <string name="confirmation_remove_files_alert">Do you really want to remove the selected items?</string>
     <string name="confirmation_remove_folders_alert">Do you really want to remove the selected items and their contents?</string>
+    <string name="maintenance_mode">Server in maintenance mode</string>
+
     <string name="uploads_view_upload_status_waiting_for_charging">Awaiting charge</string>
     <string name="actionbar_search">Search</string>
     <string name="files_drop_not_supported">This is a Nextcloud feature, please update.</string>
@@ -659,6 +662,7 @@
     <!-- Notifications -->
     <string name="new_notification_received">New notification received</string>
     <string name="drawer_logout">Logout</string>
+    <string name="privacy">Privacy</string>
 
 
 </resources>

+ 4 - 0
src/main/res/xml/preferences.xml

@@ -95,6 +95,10 @@
 		<Preference android:title="@string/prefs_imprint" android:key="imprint" />
 	</PreferenceCategory>
 	<PreferenceCategory android:title="@string/prefs_category_about" android:key="about">
+		<Preference
+			android:title="@string/privacy"
+			android:id="@+id/privacy"
+			android:key="privacy"/>
 		<Preference android:title="@string/about_title" android:id="@+id/about_app" android:key="about_app" />
 	</PreferenceCategory>
 

+ 15 - 9
src/modified/res/values/setup.xml

@@ -21,7 +21,10 @@
     <!-- URLs and flags related -->
     <string name="server_url"></string>
     <bool name="show_server_url_input">true</bool>
-    <bool name="show_welcome_link">false</bool>
+    <!-- Can be regular (full input), prefix (subdomain input) and suffix (directory input) -->
+    <!-- Requires server url to be set -->
+    <string name="server_input_type">regular</string>
+    <bool name="show_welcome_link">true</bool>
 	<string name="welcome_link_url">"https://nextcloud.com/providers"</string>
 	<string name="share_api_link"></string>
 
@@ -34,17 +37,17 @@
     <bool name="share_via_link_feature">true</bool>
     <bool name="share_with_users_feature">true</bool>
     <bool name="show_external_links">true</bool>
-    <bool name="show_drawer_logout">true</bool>
-  
-    <bool name="show_whats_new">true</bool>
-    <!-- To fill if you want to show webviews instead of regular welcome views -->
-    <array name="whatsnew_urls"></array>
 
     <!-- Contacts backup -->
     <bool name="contacts_backup">true</bool>
     <string name="contacts_backup_folder">/.Contacts-Backup</string>
     <integer name="contacts_backup_expire">30</integer>
 
+    <!-- What's new -->
+    <bool name="show_whats_new">true</bool>
+    <!-- To fill if you want to show webviews instead of regular welcome views -->
+    <array name="whatsnew_urls"></array>
+
     <!-- Colors -->
     <color name="primary">@color/nc_blue</color>
     <color name="primary_dark">#006AA3</color>
@@ -81,19 +84,22 @@
     <bool name="recently_modified_enabled">true</bool>
     <bool name="shared_enabled">true</bool>
     <bool name="videos_enabled">true</bool>
+    <bool name="show_drawer_logout">true</bool>
 
     <!-- Bottom toolbar -->
     <bool name="bottom_toolbar_enabled">true</bool>
 
-    <!-- Help, imprint and feedback -->
+    <!-- Help, imprint and feedback, and other things -->
     <bool name="fingerprint_enabled">true</bool>
     <bool name="davdroid_integration_enabled">true</bool>
     <bool name="help_enabled">true</bool>
-    <bool name="imprint_enabled">false</bool> 
+    <string name="url_help">https://help.nextcloud.com/c/feature</string>
+    <bool name="privacy_enabled">true</bool>
+    <string name="privacy_url">https://nextcloud.com/privacy</string>
+    <bool name="imprint_enabled">false</bool>
     <bool name="recommend_enabled">true</bool>
     <bool name="feedback_enabled">true</bool>
     <bool name="logger_enabled">false</bool>
-    <string name="url_help">https://help.nextcloud.com/c/feature</string>
     <string name="url_imprint"></string>
     <string name="mail_recommend">"mailto:"</string>
     <string name="mail_feedback">"mailto:android@nextcloud.com"</string>

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно