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

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

# Conflicts:
#	res/layout/drawer.xml
#	res/layout/drawer_header.xml
#	src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
AndyScherzinger 8 жил өмнө
parent
commit
fc6e3fc458
74 өөрчлөгдсөн 957 нэмэгдсэн , 1252 устгасан
  1. 12 13
      androidTest/java/com/owncloud/android/uiautomator/InitialTest.java
  2. 4 2
      build.gradle
  3. BIN
      res/drawable-hdpi/ic_account_circle_white_18dp.png
  4. BIN
      res/drawable-mdpi/ic_account_circle_white_18dp.png
  5. BIN
      res/drawable-xhdpi/ic_account_circle_white_18dp.png
  6. BIN
      res/drawable-xxhdpi/ic_account_circle_white_18dp.png
  7. BIN
      res/drawable-xxxhdpi/ic_account_circle_white_18dp.png
  8. 5 0
      res/drawable/round_bgnd.xml
  9. 10 8
      res/layout/account_action.xml
  10. 93 36
      res/layout/account_item.xml
  11. 11 9
      res/layout/accounts_layout.xml
  12. 3 3
      res/layout/drawer.xml
  13. 3 3
      res/layout/drawer_header.xml
  14. 0 33
      res/layout/file_actions.xml
  15. 1 1
      res/layout/list_item.xml
  16. 2 2
      res/layout/participate_layout.xml
  17. 11 8
      res/layout/toolbar_standard.xml
  18. 8 0
      res/values-bg-rBG/strings.xml
  19. 8 0
      res/values-cs-rCZ/strings.xml
  20. 0 204
      res/values-de-rCH/strings.xml
  21. 8 0
      res/values-de-rDE/strings.xml
  22. 8 0
      res/values-de/strings.xml
  23. 9 0
      res/values-en-rGB/strings.xml
  24. 8 0
      res/values-es/strings.xml
  25. 0 8
      res/values-eu-rES/strings.xml
  26. 0 271
      res/values-eu/strings.xml
  27. 0 42
      res/values-fi/strings.xml
  28. 9 0
      res/values-fr/strings.xml
  29. 8 0
      res/values-hu-rHU/strings.xml
  30. 8 0
      res/values-id/strings.xml
  31. 8 0
      res/values-it/strings.xml
  32. 8 0
      res/values-nb-rNO/strings.xml
  33. 8 0
      res/values-nl/strings.xml
  34. 8 0
      res/values-pl/strings.xml
  35. 10 0
      res/values-pt-rBR/strings.xml
  36. 0 148
      res/values-ru-rRU/strings.xml
  37. 8 0
      res/values-ru/strings.xml
  38. 10 0
      res/values-sl/strings.xml
  39. 8 0
      res/values-sq/strings.xml
  40. 11 1
      res/values-sv/strings.xml
  41. 8 0
      res/values-tr/strings.xml
  42. 10 0
      res/values-zh-rTW/strings.xml
  43. 1 1
      res/values/dims.xml
  44. 8 8
      src/com/owncloud/android/datamodel/FileDataStorageManager.java
  45. 0 48
      src/com/owncloud/android/datamodel/OCFile.java
  46. 3 3
      src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
  47. 2 2
      src/com/owncloud/android/db/OCUpload.java
  48. 2 1
      src/com/owncloud/android/operations/RefreshFolderOperation.java
  49. 8 9
      src/com/owncloud/android/operations/SynchronizeFolderOperation.java
  50. 2 2
      src/com/owncloud/android/operations/UploadFileOperation.java
  51. 19 5
      src/com/owncloud/android/ui/activity/BaseActivity.java
  52. 15 2
      src/com/owncloud/android/ui/activity/DrawerActivity.java
  53. 40 6
      src/com/owncloud/android/ui/activity/ManageAccountsActivity.java
  54. 2 2
      src/com/owncloud/android/ui/activity/UploadListActivity.java
  55. 96 51
      src/com/owncloud/android/ui/adapter/AccountListAdapter.java
  56. 6 7
      src/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java
  57. 7 7
      src/com/owncloud/android/ui/adapter/FileListListAdapter.java
  58. 6 7
      src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java
  59. 4 4
      src/com/owncloud/android/ui/adapter/UploaderAdapter.java
  60. 0 147
      src/com/owncloud/android/ui/dialog/AccountActionsDialogFragment.java
  61. 1 2
      src/com/owncloud/android/ui/dialog/RemoveFileDialogFragment.java
  62. 3 3
      src/com/owncloud/android/ui/fragment/FileDetailFragment.java
  63. 174 54
      src/com/owncloud/android/ui/fragment/OCFileListFragment.java
  64. 3 3
      src/com/owncloud/android/ui/fragment/ShareFileFragment.java
  65. 91 0
      src/com/owncloud/android/ui/helpers/SparseBooleanArrayParcelable.java
  66. 2 1
      src/com/owncloud/android/ui/preview/PreviewImageActivity.java
  67. 4 3
      src/com/owncloud/android/ui/preview/PreviewImageFragment.java
  68. 9 9
      src/com/owncloud/android/ui/preview/PreviewMediaFragment.java
  69. 3 2
      src/com/owncloud/android/ui/preview/PreviewTextFragment.java
  70. 7 7
      src/com/owncloud/android/ui/preview/PreviewVideoActivity.java
  71. 4 33
      src/com/owncloud/android/utils/BitmapUtils.java
  72. 103 25
      src/com/owncloud/android/utils/MimeTypeUtil.java
  73. 3 3
      src/com/owncloud/android/utils/UriUtils.java
  74. 3 3
      src/org/nextcloud/providers/cursors/FileCursor.java

+ 12 - 13
androidTest/java/com/owncloud/android/uiautomator/InitialTest.java

@@ -18,10 +18,6 @@
 
 package com.owncloud.android.uiautomator;
 
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -36,6 +32,9 @@ import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.support.test.uiautomator.UiSelector;
 import android.support.test.uiautomator.Until;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.junit.Assert.assertThat;
@@ -59,7 +58,6 @@ public class InitialTest {
     public void initializeDevice() {
         // Initialize UiDevice instance
         mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
-
     }
 
     @Test
@@ -114,7 +112,6 @@ public class InitialTest {
         context.startActivity(intent);
 
         clickByText(SETTINGS_DATA_USAGE_OPTION);
-
     }
 
     /**
@@ -134,24 +131,26 @@ public class InitialTest {
     }
 
     /**
-     * Helper to click on objects that match the content-description text
+     * Helper to click on objects that match the content-description text.
      *
-     * @param text
+     * @param description the description
      * @throws UiObjectNotFoundException
      */
-    private void clickByDescription(String text) throws UiObjectNotFoundException {
-        UiObject obj = new UiObject(new UiSelector().description(text));
+    private void clickByDescription(String description) throws UiObjectNotFoundException {
+        UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+        UiObject obj = device.findObject(new UiSelector().description(description));
         obj.clickAndWaitForNewWindow();
     }
 
     /**
-     * Helper to click on object that match the text value
+     * Helper to click on object that match the text value.
      *
-     * @param text
+     * @param text the text
      * @throws UiObjectNotFoundException
      */
     private void clickByText(String text) throws UiObjectNotFoundException {
-        UiObject obj = new UiObject(new UiSelector().text(text));
+        UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+        UiObject obj = device.findObject(new UiSelector().text(text));
         obj.clickAndWaitForNewWindow();
     }
 }

+ 4 - 2
build.gradle

@@ -41,7 +41,6 @@ dependencies {
     compile "com.android.support:design:${supportLibraryVersion}"
     compile 'com.jakewharton:disklrucache:2.0.2'
     compile "com.android.support:appcompat-v7:${supportLibraryVersion}"
-    compile "com.android.support:cardview-v7:${supportLibraryVersion}"
     compile 'com.getbase:floatingactionbutton:1.10.1'
 
     /// dependencies for local unit tests
@@ -62,7 +61,10 @@ dependencies {
     androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
 
     // UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests
-    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
+    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
+
+    // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details
+    androidTestCompile "com.android.support:support-annotations:${supportLibraryVersion}"
 
 }
 

BIN
res/drawable-hdpi/ic_account_circle_white_18dp.png


BIN
res/drawable-mdpi/ic_account_circle_white_18dp.png


BIN
res/drawable-xhdpi/ic_account_circle_white_18dp.png


BIN
res/drawable-xxhdpi/ic_account_circle_white_18dp.png


BIN
res/drawable-xxxhdpi/ic_account_circle_white_18dp.png


+ 5 - 0
res/drawable/round_bgnd.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="oval">
+    <solid android:color="#ffffff"/>
+</shape>

+ 10 - 8
res/layout/account_action.xml

@@ -1,21 +1,23 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ownCloud Android client application
+  Nextcloud Android client application
 
-  Copyright (C) 2016 ownCloud Inc.
+  Copyright (C) 2016 Andy Scherzinger
   Copyright (C) 2016 Nextcloud
+  Copyright (C) 2016 ownCloud
 
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License version 2,
-  as published by the Free Software Foundation.
+  This program is free software; you can redistribute it and/or
+  modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+  License as published by the Free Software Foundation; either
+  version 3 of the License, or any later version.
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
+  GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  You should have received a copy of the GNU Affero General Public
+  License along with this program. If not, see <http://www.gnu.org/licenses/>.
 -->
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"

+ 93 - 36
res/layout/account_item.xml

@@ -1,70 +1,127 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ownCloud Android client application
+  Nextcloud Android client application
 
-  Copyright (C) 2016 ownCloud Inc.
+  Copyright (C) 2016 Andy Scherzinger
+  Copyright (C) 2016 Nextcloud
+  Copyright (C) 2016 ownCloud
 
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License version 2,
-  as published by the Free Software Foundation.
+  This program is free software; you can redistribute it and/or
+  modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+  License as published by the Free Software Foundation; either
+  version 3 of the License, or any later version.
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
+  GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  You should have received a copy of the GNU Affero General Public
+  License along with this program. If not, see <http://www.gnu.org/licenses/>.
 -->
-<LinearLayout
+<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="@dimen/account_item_layout_height"
     android:orientation="horizontal"
     android:weightSum="1">
 
-    <ImageView
-        android:id="@+id/user_icon"
-        android:layout_width="@dimen/user_icon_size"
-        android:layout_height="@dimen/user_icon_size"
-        android:layout_gravity="center_vertical"
-        android:layout_marginLeft="@dimen/standard_margin"
-        android:src="@drawable/ic_menu_archive"/>
+    <FrameLayout
+        android:id="@+id/avatar_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true">
 
-    <TextView
-        android:id="@+id/user_name"
-        android:layout_width="@dimen/zero"
-        android:layout_height="fill_parent"
-        android:layout_marginLeft="@dimen/standard_margin"
-        android:layout_weight="1"
-        android:gravity="center_vertical"
-        android:paddingRight="@dimen/standard_padding"
-        android:text="@string/placeholder_filename"
-        android:textColor="@color/textColor"
-        android:textSize="@dimen/two_line_primary_text_size"/>
+        <ImageView
+            android:id="@+id/user_icon"
+            android:layout_width="@dimen/user_icon_size"
+            android:layout_height="@dimen/user_icon_size"
+            android:layout_gravity="top|left"
+            android:layout_marginBottom="1dp"
+            android:layout_marginLeft="12dp"
+            android:layout_marginRight="1dp"
+            android:layout_marginTop="1dp"
+            android:src="@drawable/ic_menu_archive"/>
+
+        <ImageView
+            android:id="@+id/ticker"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="bottom|right"
+            android:background="@drawable/round_bgnd"
+            android:src="@drawable/ic_account_circle_white_18dp"
+            android:tint="@color/actionbar_start_color"/>
+    </FrameLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
+        android:layout_toEndOf="@id/avatar_container"
+        android:layout_toLeftOf="@+id/passwordButton"
+        android:layout_toRightOf="@id/avatar_container"
+        android:layout_toStartOf="@id/passwordButton"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/user_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="@dimen/standard_half_margin"
+            android:layout_marginLeft="@dimen/standard_half_margin"
+            android:layout_marginRight="@dimen/standard_half_margin"
+            android:layout_marginStart="@dimen/standard_margin"
+            android:layout_marginTop="4dp"
+            android:ellipsize="end"
+            android:gravity="bottom"
+            android:maxLines="1"
+            android:text="@string/placeholder_filename"
+            android:textAppearance="?android:attr/textAppearanceListItem"/>
+
+        <TextView
+            android:id="@+id/account"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="4dp"
+            android:layout_marginEnd="@dimen/standard_half_margin"
+            android:layout_marginLeft="@dimen/standard_half_margin"
+            android:layout_marginRight="@dimen/standard_half_margin"
+            android:layout_marginStart="@dimen/standard_margin"
+            android:ellipsize="end"
+            android:gravity="top"
+            android:maxLines="2"
+            android:text="@string/placeholder_sentence"
+            android:textColor="?android:attr/textColorSecondary"/>
+    </LinearLayout>
 
-    <ImageButton
+    <ImageView
         android:id="@+id/passwordButton"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
         android:layout_gravity="center_vertical"
-        android:paddingLeft="@dimen/standard_half_padding"
-        android:paddingTop="@dimen/standard_padding"
+        android:layout_toLeftOf="@+id/removeButton"
+        android:layout_toStartOf="@id/removeButton"
         android:paddingBottom="@dimen/standard_padding"
+        android:paddingLeft="@dimen/standard_half_padding"
         android:paddingRight="@dimen/standard_half_padding"
-        android:background="?android:selectableItemBackground"
+        android:paddingTop="@dimen/standard_padding"
         android:src="@drawable/ic_key"/>
 
-    <ImageButton
+    <ImageView
         android:id="@+id/removeButton"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentRight="true"
+        android:layout_centerInParent="true"
         android:layout_gravity="center_vertical"
-        android:paddingLeft="@dimen/standard_half_padding"
-        android:paddingTop="@dimen/standard_padding"
         android:paddingBottom="@dimen/standard_padding"
+        android:paddingLeft="@dimen/standard_half_padding"
         android:paddingRight="@dimen/standard_padding"
-        android:background="?android:selectableItemBackground"
+        android:paddingTop="@dimen/standard_padding"
         android:src="@drawable/ic_action_delete_grey"/>
 
-</LinearLayout>         
+</RelativeLayout>

+ 11 - 9
res/layout/accounts_layout.xml

@@ -1,21 +1,23 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- 
-  ownCloud Android client application
+<!--
+  Nextcloud Android client application
 
-  Copyright (C) 2016 ownCloud Inc.
+  Copyright (C) 2016 Andy Scherzinger
   Copyright (C) 2016 Nextcloud
+  Copyright (C) 2016 ownCloud
 
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License version 2,
-  as published by the Free Software Foundation.
+  This program is free software; you can redistribute it and/or
+  modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+  License as published by the Free Software Foundation; either
+  version 3 of the License, or any later version.
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
+  GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  You should have received a copy of the GNU Affero General Public
+  License along with this program. If not, see <http://www.gnu.org/licenses/>.
  -->
 <LinearLayout
 	android:id="@+id/upload_files_layout"

+ 3 - 3
res/layout/drawer.xml

@@ -12,12 +12,12 @@
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
   GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
   You should have received a copy of the GNU Affero General Public
-  License along with this program.  If not, see <http://www.gnu.org/licenses/>.
--->
+  License along with this program. If not, see <http://www.gnu.org/licenses/>.
+  -->
 <merge xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
 

+ 3 - 3
res/layout/drawer_header.xml

@@ -12,12 +12,12 @@
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
   GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
   You should have received a copy of the GNU Affero General Public
-  License along with this program.  If not, see <http://www.gnu.org/licenses/>.
--->
+  License along with this program. If not, see <http://www.gnu.org/licenses/>.
+  -->
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="match_parent"
               android:layout_height="@dimen/nav_drawer_header_height"

+ 0 - 33
res/layout/file_actions.xml

@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:layout_margin="@dimen/standard_margin"
-    android:orientation="vertical">
-
-    <TextView
-        android:id="@+id/file_actions_header"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:padding="@dimen/standard_padding"
-        android:textColor="@color/black"
-        android:visibility="gone"
-        />
-
-    <View
-        android:id="@+id/file_actions_header_divider"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/file_actions_view_height"
-        android:background="@color/owncloud_blue"
-        android:visibility="gone"
-        />
-
-    <ListView
-        android:id="@+id/file_actions_list"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/zero"
-        android:layout_weight="1"
-        />
-
-</LinearLayout >

+ 1 - 1
res/layout/list_item.xml

@@ -49,7 +49,7 @@
 
             <ImageView
                 android:id="@+id/thumbnail"
-                android:layout_width="@dimen/file_icon_size"
+                android:layout_width="32dp"
                 android:layout_height="@dimen/file_icon_size"
                 android:layout_gravity="left|center_vertical"
                 android:src="@drawable/ic_menu_archive" />

+ 2 - 2
res/layout/participate_layout.xml

@@ -12,11 +12,11 @@
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
   GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
   You should have received a copy of the GNU Affero General Public
-  License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  License along with this program. If not, see <http://www.gnu.org/licenses/>.
 -->
 <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout"
                                         xmlns:android="http://schemas.android.com/apk/res/android"

+ 11 - 8
res/layout/toolbar_standard.xml

@@ -1,20 +1,23 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ownCloud Android client application
+  Nextcloud Android client application
 
-  Copyright (C) 2016 ownCloud Inc.
+  Copyright (C) 2016 Andy Scherzinger
+  Copyright (C) 2016 Nextcloud
+  Copyright (C) 2016 ownCloud
 
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License version 2,
-  as published by the Free Software Foundation.
+  This program is free software; you can redistribute it and/or
+  modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+  License as published by the Free Software Foundation; either
+  version 3 of the License, or any later version.
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
+  GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  You should have received a copy of the GNU Affero General Public
+  License along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -->
 <android.support.design.widget.AppBarLayout
     android:id="@+id/appbar"

+ 8 - 0
res/values-bg-rBG/strings.xml

@@ -68,6 +68,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Изход</string>
     <string name="uploader_error_title_no_file_to_upload">Няма файл за качване</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s не може да качите част от текст като файл.</string>
+    <string name="uploader_error_message_no_file_to_upload">Получените данни не включват валиден файл.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Файлът не може да бъде качен</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s нямате право да четете получения фаил</string>
     <string name="uploader_error_message_source_file_not_found">Файл за качване не е намерен. Моля, проверете дали файлът съществува.</string>
@@ -152,6 +153,7 @@
     <string name="downloader_download_failed_credentials_error">Свалянето провалено, трябва да влезете отново</string>
     <string name="common_choose_account">Изберете профил</string>
     <string name="sync_fail_ticker">Синхронизацията се провали</string>
+    <string name="sync_fail_ticker_unauthorized">Синхронизацията се провали, нужно е се впишете отново</string>
     <string name="sync_fail_content">Синхронизацията на %1$s не може да бъде завършена</string>
     <string name="sync_fail_content_unauthorized">Неправилна парола за %1$s.</string>
     <string name="sync_conflicts_in_favourites_ticker">Открити са конфликти</string>
@@ -168,6 +170,8 @@
     <string name="foreign_files_local_text">Локален: %1$s</string>
     <string name="foreign_files_remote_text">Отдалечен: %1$s</string>
     <string name="upload_query_move_foreign_files">В папка %1$s няма достатъчно място за копиране на избраните файлове. Желаете ли да бъдат преместени?</string>
+    <string name="pass_code_enter_pass_code">Моля, въведете кода за достъп</string>
+    
     <string name="pass_code_configure_your_pass_code">Въведете кода за достъп</string>
     <string name="pass_code_configure_your_pass_code_explanation">Кода ще бъде изискван при всяко стартиране на приложението</string>
     <string name="pass_code_reenter_your_pass_code">Моля, въведи отново кода за достъп</string>
@@ -249,6 +253,7 @@
     <string name="filename_empty">Името на файла не може да бъде празно</string>
     <string name="wait_a_moment">Моля, изчакайте</string>
     <string name="wait_checking_credentials">Проверка на съхранените пълномощия</string>
+    <string name="filedisplay_unexpected_bad_get_content">Неочакван проблем. Моля, изберете файла от друго приложение.</string>
     <string name="filedisplay_no_file_selected">Не сте избрали файл</string>
     <string name="activity_chooser_title">Изпращане на връзката чрез...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Копиране на файла от личното хранилище</string>
@@ -332,6 +337,9 @@
     <string name="error_cant_bind_to_operations_service">Критична грешка: операциите не могат да бъдат изпълнени</string>
 
     <string name="network_error_socket_exception">Възникна грешка при свързването със сървъра.</string>
+    <string name="network_error_socket_timeout_exception">Възникна грешка при свързването със сървъра, операцията не е изпълнена.</string>
+    <string name="network_error_connect_timeout_exception">Възникна грешка при свързването със сървъра, операцията не е изпълнена.</string>
+    <string name="network_host_not_available">Неуспешно завършена операция, сървърът не е достъпен</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Нямате разрешение за достъп до %s</string>

+ 8 - 0
res/values-cs-rCZ/strings.xml

@@ -69,6 +69,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Ukončit</string>
     <string name="uploader_error_title_no_file_to_upload">Žádný soubor k nahrání</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s neumí nahrát text jako soubor.</string>
+    <string name="uploader_error_message_no_file_to_upload">Obdržená data neobsahují žádný platný soubor.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Soubor nelze nahrát</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s nemá oprávnění číst přijatý soubor</string>
     <string name="uploader_error_message_source_file_not_found">Soubor k nahrání nebyl v tomto umístění nalezen. Zkontrolujte prosím zda soubor existuje.</string>
@@ -154,6 +155,7 @@
     <string name="downloader_download_failed_credentials_error">Stažení selhalo, je třeba se znovu přihlásit</string>
     <string name="common_choose_account">Vybrat účet</string>
     <string name="sync_fail_ticker">Synchronizace selhala</string>
+    <string name="sync_fail_ticker_unauthorized">Synchronizace selhala, je třeba se znovu přihlásit</string>
     <string name="sync_fail_content">Synchronizace %1$s nemohla být dokončena</string>
     <string name="sync_fail_content_unauthorized">Chybné heslo pro %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Nalezeny konflikty</string>
@@ -170,6 +172,8 @@
     <string name="foreign_files_local_text">Místní: %1$s</string>
     <string name="foreign_files_remote_text">Vzdálené: %1$s</string>
     <string name="upload_query_move_foreign_files">Pro zkopírování vybraných souborů do %1$s adresáře není dostatek volného místa. Chcete je místo toho přesunout?</string>
+    <string name="pass_code_enter_pass_code">Zadejte prosím svůj bezpečnostní kód</string>
+    
     <string name="pass_code_configure_your_pass_code">Zadejte svůj bezpečnostní kód</string>
     <string name="pass_code_configure_your_pass_code_explanation">Bezpečnostní kód bude vyžadován při každém spuštění aplikace</string>
     <string name="pass_code_reenter_your_pass_code">Zopakujte prosím svůj bezpečnostní kód</string>
@@ -252,6 +256,7 @@
     <string name="filename_empty">Název nemůže být prázdný</string>
     <string name="wait_a_moment">Počkejte chvíli</string>
     <string name="wait_checking_credentials">Ověřování uložených přihlašovacích údajů</string>
+    <string name="filedisplay_unexpected_bad_get_content">Neočekávaný problém - zkuste zvolit soubor jinou aplikací</string>
     <string name="filedisplay_no_file_selected">Žádný soubor nebyl vybrán</string>
     <string name="activity_chooser_title">Odeslat odkaz ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopírování souboru z privátního úložiště</string>
@@ -335,6 +340,9 @@ správce systému.</string>
     <string name="error_cant_bind_to_operations_service">Kritická chyba: operace nelze provést</string>
 
     <string name="network_error_socket_exception">Při pokusu o připojení k serveru došlo k chybě.</string>
+    <string name="network_error_socket_timeout_exception">Při čekání na odpověď serveru se vyskytla chyba, operace nemohla být dokončena</string>
+    <string name="network_error_connect_timeout_exception">Při čekání na odpověď serveru se vyskytla chyba, operace nemohla být dokončena</string>
+    <string name="network_host_not_available">Operace nemohla být dokončena, server je nedostupný</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Nemáte oprávnění %s</string>

+ 0 - 204
res/values-de-rCH/strings.xml

@@ -1,204 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<resources>
-  <string name="about_android">%1$s Android App</string>
-  <string name="about_version">Version %1$s</string>
-  <string name="actionbar_sync">Konto aktualisieren</string>
-  <string name="actionbar_upload">Datei hochladen</string>
-  <string name="actionbar_upload_from_apps">Inhalt von anderen Apps</string>
-  <string name="actionbar_upload_files">Dateien</string>
-  <string name="actionbar_open_with">Öffnen mit</string>
-  <string name="actionbar_mkdir">Neues Verzeichnis</string>
-  <string name="actionbar_settings">Einstellungen</string>
-  <string name="actionbar_see_details">Details</string>
-  <string name="actionbar_send_file">Senden</string>
-  <!--TODO re-enable when server-side folder size calculation is available   
-    	<item>Biggest - Smallest</item>-->
-  <string name="prefs_category_general">Allgemein</string>
-  <string name="prefs_category_more">Mehr</string>
-  <string name="prefs_accounts">Konten</string>
-  <string name="prefs_manage_accounts">Konten verwalten</string>
-  <string name="prefs_pincode">App-PIN</string>
-  <string name="prefs_pincode_summary">Schützen Sie Ihren Client</string>
-  <string name="prefs_log_title">Protokollierung aktivieren</string>
-  <string name="prefs_log_summary">Dies wird zur Protokollierung von Problemen genutzt</string>
-  <string name="prefs_log_title_history">Protokollierungsverlauf</string>
-  <string name="prefs_log_summary_history">Dies zeigt die gespeicherten Protokollierungen</string>
-  <string name="prefs_log_delete_history_button">Verlauf löschen</string>
-  <string name="prefs_help">Hilfe</string>
-  <string name="prefs_feedback">Rückmeldungen</string>
-  <string name="prefs_imprint">Impressum</string>
-  <string name="auth_check_server">Server überprüfen</string>
-  <string name="auth_username">Benutzername</string>
-  <string name="auth_password">Passwort</string>
-  <string name="auth_register">Ist %1$s neu für Sie?</string>
-  <string name="sync_string_files">Dateien</string>
-  <string name="setup_btn_connect">Verbinden</string>
-  <string name="uploader_btn_upload_text">Hochladen</string>
-  <string name="uploader_wrn_no_account_title">Kein Konto gefunden</string>
-  <string name="uploader_wrn_no_account_text">Es sind keine %1$s-Konten auf Ihrem Gerät eingerichtet. Bitte richten Sie zuerst ein Konto ein.</string>
-  <string name="uploader_wrn_no_account_setup_btn_text">Einrichten</string>
-  <string name="uploader_wrn_no_account_quit_btn_text">Beenden</string>
-  <string name="uploader_wrn_no_content_title">Keine Inhalte zum Hochladen vorhanden</string>
-  <string name="uploader_wrn_no_content_text">Es wurden keine Inhalte empfangen. Es gibt nichts zum Hochladen.</string>
-  <string name="uploader_error_forbidden_content">%1$s darf den freigegebenen Inhalt nicht nutzen.</string>
-  <string name="uploader_info_uploading">Lade hoch</string>
-  <string name="file_list_empty">Alles leer. Laden Sie etwas hoch!</string>
-  <string name="filedetails_select_file">Klicken Sie auf eine Datei für weitere Informationen.</string>
-  <string name="filedetails_size">Grösse:</string>
-  <string name="filedetails_type">Art:</string>
-  <string name="filedetails_created">Erstellt:</string>
-  <string name="filedetails_modified">Geändert:</string>
-  <string name="filedetails_download">Herunterladen</string>
-  <string name="filedetails_sync_file">Datei aktualisieren</string>
-  <string name="filedetails_renamed_in_upload_msg">Datei wurde wärend des Uploads zu %1$s umbenannt</string>
-  <string name="common_yes">Ja</string>
-  <string name="common_no">Nein</string>
-  <string name="common_ok">OK</string>
-  <string name="common_cancel_download">Download abbrechen</string>
-  <string name="common_cancel_upload">Upload abbrechen</string>
-  <string name="common_cancel">Abbrechen</string>
-  <string name="common_save_exit">Speichern &amp; Schliessen</string>
-  <string name="common_error">Fehler</string>
-  <string name="common_loading">Lade...</string>
-  <string name="common_error_unknown">Unbekannter Fehler</string>
-  <string name="about_title">Über</string>
-  <string name="change_password">Passwort ändern</string>
-  <string name="delete_account">Account löschen</string>
-  <string name="create_account">Account erstellen</string>
-  <string name="upload_chooser_title">Dateien hochladen von...</string>
-  <string name="uploader_info_dirname">Ordnername</string>
-  <string name="uploader_upload_in_progress_ticker">Hochladen...</string>
-  <string name="uploader_upload_in_progress_content">%1$d%% Hochladen %2$s</string>
-  <string name="uploader_upload_succeeded_ticker">Hochladen erfolgreich</string>
-  <string name="uploader_upload_succeeded_content_single">%1$s wurde(n) erfolgreich hochgeladen</string>
-  <string name="uploader_upload_failed_ticker">Hochladen fehlgeschlagen</string>
-  <string name="uploader_upload_failed_content_single">Hochladen von  %1$s konnte nicht abgeschlossen werden</string>
-  <string name="downloader_download_in_progress_ticker">Herunterladen...</string>
-  <string name="downloader_download_in_progress_content">%1$d%% Herunterladen %2$s</string>
-  <string name="downloader_download_succeeded_ticker">Herunterladen erfolgreich</string>
-  <string name="downloader_download_succeeded_content">%1$s wurde erfolgreich heruntergeladen</string>
-  <string name="downloader_download_failed_ticker">Herunterladen fehlgeschlagen</string>
-  <string name="downloader_download_failed_content">Herunterladen von %1$s konnte nicht abgeschlossen werden</string>
-  <string name="downloader_not_downloaded_yet">Noch nicht heruntergeladen</string>
-  <string name="common_choose_account">Konto auswählen</string>
-  <string name="sync_fail_ticker">Synchronisation fehlgeschlagen</string>
-  <string name="sync_fail_content">Bei der Synchronisation konnte %1$s nicht übertragen werden</string>
-  <string name="sync_fail_content_unauthorized">Ungültiges Passwort für %1$s</string>
-  <string name="sync_conflicts_in_favourites_ticker">Konflikte gefunden</string>
-  <string name="sync_conflicts_in_favourites_content">%1$d Synchronisationsdateien konnten nicht synchronisiert werden.</string>
-  <string name="sync_fail_in_favourites_ticker">Synchronisationsdateien konnten nicht synchronisiert werden.</string>
-  <string name="sync_fail_in_favourites_content">Inhalte von %1$d konnte nicht synchronisiert werden (%2$d Konflikte)</string>
-  <string name="sync_foreign_files_forgotten_ticker">Einige lokale Dateien wurden vergessen</string>
-  <string name="foreign_files_move">Verschiebe alle</string>
-  <string name="foreign_files_success">Alle Dateien wurden verschoben</string>
-  <string name="foreign_files_fail">Einige Dateien konnten nicht verschoben werden</string>
-  <string name="foreign_files_local_text">Lokal: %1$s</string>
-  <string name="foreign_files_remote_text">Remote: %1$s</string>
-  <string name="pincode_enter_pin_code">Bitte geben Sie Ihre App-PIN ein</string>
-  <string name="pincode_configure_your_pin">Bitte geben Sie Ihre App-PIN ein</string>
-  <string name="pincode_configure_your_pin_explanation">PIN-Abfrage erfolgt nach Starten der App.</string>
-  <string name="pincode_reenter_your_pincode">Bitte geben Sie Ihre App-PIN erneut ein.</string>
-  <string name="pincode_remove_your_pincode">App-PIN entfernen</string>
-  <string name="pincode_mismatch">Die App-PINs stimmen nicht überein</string>
-  <string name="pincode_wrong">Falsche App-PIN</string>
-  <string name="pincode_removed">Die App-PIN wurde entfernt</string>
-  <string name="pincode_stored">Die App-PIN wurde gespeichert</string>
-  <string name="media_notif_ticker">%1$s Musikplayer</string>
-  <string name="media_state_playing">%1$s (abspielend)</string>
-  <string name="media_state_loading">%1$s (lädt)</string>
-  <string name="media_event_done">%1$s Wiedergabe beendet</string>
-  <string name="media_err_nothing_to_play">Keine Mediadatei gefunden</string>
-  <string name="media_err_no_account">Kein Account angegeben</string>
-  <string name="media_err_not_in_owncloud">Datei nicht in einem gültigen Account</string>
-  <string name="media_err_unsupported">Nicht unterstützter Media-codec</string>
-  <string name="media_err_io">Mediendatei konnte nicht gelesen werden</string>
-  <string name="media_err_malformed">Mediendatei nicht korrekt kodiert</string>
-  <string name="media_err_invalid_progressive_playback">Mediendatei kann nicht gestreamt werden</string>
-  <string name="media_err_unknown">Die Mediendatei kann nicht mit dem vorinstallierten Media Player abgespielt werden</string>
-  <string name="media_err_security_ex">Sicherheitsfehler beim abspielen von %1$s</string>
-  <string name="media_err_io_ex">Eingabefehler beim Versuch %1$s abzuspielen</string>
-  <string name="media_err_unexpected">Unerwarteter Fehler beim Versuch %1$s abzuspielen</string>
-  <string name="media_rewind_description">Zurückspulen Button</string>
-  <string name="media_play_pause_description">Abspielen oder Pausieren Button</string>
-  <string name="media_forward_description">Vorspulen Button</string>
-  <string name="auth_trying_to_login">Anmeldungsversuch...</string>
-  <string name="auth_no_net_conn_title">Keine Netzwerkverbindung</string>
-  <string name="auth_nossl_plain_ok_title">Sichere Verbindung nicht verfügbar.</string>
-  <string name="auth_connection_established">Verbindung hergestellt</string>
-  <string name="auth_testing_connection">Verbindung testen...</string>
-  <string name="auth_not_configured_title">Fehlerhafte Server Konfiguration</string>
-  <string name="auth_unknown_error_title">Ein unbekannter Fehler ist aufgetreten!</string>
-  <string name="auth_unknown_host_title">Konnte den Host nicht finden.</string>
-  <string name="auth_incorrect_path_title">Server-Installation nicht gefunden</string>
-  <string name="auth_timeout_title">Der Server braucht zu lange für eine Antwort.</string>
-  <string name="auth_incorrect_address_title">Fehlerhafte URL</string>
-  <string name="auth_ssl_general_error_title">SSL-Initialisierung fehlgeschlagen.</string>
-  <string name="auth_bad_oc_version_title">Unbekannte Server-Version</string>
-  <string name="auth_wrong_connection_title">Konnte keine Verbindung aufbauen.</string>
-  <string name="auth_secure_connection">Sichere Verbindung hergestellt</string>
-  <string name="auth_unauthorized">Falscher Benutzername oder Passwort</string>
-  <string name="auth_oauth_error">Autorisierung nicht erfolgreich</string>
-  <string name="auth_oauth_error_access_denied">Zugriff durch den Autorisierungsserver abgelehnt</string>
-  <string name="auth_wtf_reenter_URL">Unerwarteter Zustand; bitte geben Sie die URL des Servers nochmals ein</string>
-  <string name="auth_expired_basic_auth_toast">Bitte geben Sie Ihr aktuelles Passwort ein</string>
-  <string name="fd_keep_in_sync">Datei aktuell halten</string>
-  <string name="common_rename">Umbenennen</string>
-  <string name="common_remove">Löschen</string>
-  <string name="confirmation_remove_local">Nur lokal</string>
-  <string name="confirmation_remove_folder_local">Nur lokale Inhalte</string>
-  <string name="confirmation_remove_remote">Vom Server entfernen</string>
-  <string name="confirmation_remove_remote_and_local">Lokal und auf dem Server</string>
-  <string name="remove_success_msg">Erfolgreich gelöscht</string>
-  <string name="remove_fail_msg">Der Löschvorgang konnte nicht beendet werden</string>
-  <string name="rename_dialog_title">Geben Sie einen neuen Namen ein</string>
-  <string name="rename_local_fail_msg">Die lokale Kopie konnte nicht umbenannt werden. Versuchen Sie es mit einem anderen neuen Namen.</string>
-  <string name="rename_server_fail_msg">Die Umbenennung konnte nicht abgeschlossen werden.</string>
-  <string name="sync_file_fail_msg">Die entfernte Datei konnte nicht überprüft werden</string>
-  <string name="sync_file_nothing_to_do_msg">Dateiinhalte bereits synchronisiert</string>
-  <string name="wait_a_moment">Bitte warten Sie einen Moment.</string>
-  <string name="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuchen Sie, die Datei in einer anderen App zu öffnen.</string>
-  <string name="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string>
-  <string name="oauth_login_connection">Verbinde mit dem oAuth2-Server...</string>
-  <string name="ssl_validator_header">Die Identität der Website konnte nicht überprüft werden</string>
-  <string name="ssl_validator_reason_cert_not_trusted">- Das Zertifikat des Servers ist nicht vertrauenswürdig</string>
-  <string name="ssl_validator_reason_cert_expired">- Das Zertifikat des Servers ist abgelaufen</string>
-  <string name="ssl_validator_reason_cert_not_yet_valid">- Das Gültigkeitsdatum des Serverzertifikats liegt in der Zukunft</string>
-  <string name="ssl_validator_reason_hostname_not_verified">- Die Adresse stimmt nicht mit dem im Zertifikat angegebenen Hostnamen überein</string>
-  <string name="ssl_validator_question">Möchten Sie diesem Zertifikat trotzdem vertrauen?</string>
-  <string name="ssl_validator_not_saved">Das Zertifikat konnte nicht gespeichert werden</string>
-  <string name="ssl_validator_btn_details_see">Details</string>
-  <string name="ssl_validator_btn_details_hide">Ausblenden</string>
-  <string name="ssl_validator_label_subject">Ausgestellt für:</string>
-  <string name="ssl_validator_label_issuer">Ausgestellt von:</string>
-  <string name="ssl_validator_label_CN">Üblicher Name:</string>
-  <string name="ssl_validator_label_O">Organisation:</string>
-  <string name="ssl_validator_label_OU">Organisationseinheit:</string>
-  <string name="ssl_validator_label_C">Land:</string>
-  <string name="ssl_validator_label_ST">Bundesland:</string>
-  <string name="ssl_validator_label_L">Ort:</string>
-  <string name="ssl_validator_label_validity">Gültigkeit:</string>
-  <string name="ssl_validator_label_validity_from">Von:</string>
-  <string name="ssl_validator_label_validity_to">An:</string>
-  <string name="ssl_validator_label_signature">Signatur:</string>
-  <string name="ssl_validator_label_signature_algorithm">Algorithmus:</string>
-  <string name="placeholder_sentence">Dies ist ein Platzhalter</string>
-  <string name="placeholder_filename">platzhalter.txt</string>
-  <string name="placeholder_filetype">PNG Bild</string>
-  <string name="placeholder_filesize">389 KB</string>
-  <string name="placeholder_timestamp">18.05.2012 12:23</string>
-  <string name="placeholder_media_time">12:23:45</string>
-  <string name="instant_upload_on_wifi">Fotos nur über WiFi hochladen</string>
-  <string name="instant_upload_path">/SofortUpload</string>
-  <string name="conflict_title">Konflikt beim Update</string>
-  <string name="conflict_message">Serverdatei %s ist nicht synchronisiert mit der lokalen Datei. Weitermachen bedeutet, dass der Inhalt der Datei auf dem Server ersetzt wird.</string>
-  <string name="conflict_keep_both">Beide behalten</string>
-  <string name="conflict_overwrite">Überschreiben</string>
-  <string name="conflict_dont_upload">Nicht hochladen</string>
-  <string name="preview_image_description">Bildvorschau</string>
-  <string name="activity_chooser_send_file_title">Senden</string>
-  <string name="clipboard_text_copied">In die Zwischenablage kopiert</string>
-  <string name="empty"></string>
-  <string name="prefs_category_accounts">Konten</string>
-  <string name="move_choose_button_text">Auswählen</string>
-  <string name="prefs_category_security">Sicherheit</string>
-</resources>

+ 8 - 0
res/values-de-rDE/strings.xml

@@ -69,6 +69,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Beenden</string>
     <string name="uploader_error_title_no_file_to_upload">Keine Datei zum Hochladen</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s kann einen Textteil als Datei hochladen</string>
+    <string name="uploader_error_message_no_file_to_upload">Empfangene Daten enthalten keine gültige Datei.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Datei kann nicht hochgeladen werden</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s darf eine empfangene Datei nicht lesen</string>
     <string name="uploader_error_message_source_file_not_found">Hochzuladende Datei wurde an seinem Ort nicht gefunden. Prüfen Sie, dass die Datei existiert.</string>
@@ -154,6 +155,7 @@
     <string name="downloader_download_failed_credentials_error">Herunterladen fehlgeschlagen, Sie müssen sich erneut anmelden.</string>
     <string name="common_choose_account">Konto auswählen</string>
     <string name="sync_fail_ticker">Synchronisation fehlgeschlagen</string>
+    <string name="sync_fail_ticker_unauthorized">Synchronisation fehlgeschlagen, Sie müssen sich erneut anmelden.</string>
     <string name="sync_fail_content">Bei der Synchronisation konnte %1$s nicht übertragen werden</string>
     <string name="sync_fail_content_unauthorized">Ungültiges Passwort für %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Konflikte gefunden</string>
@@ -170,6 +172,8 @@
     <string name="foreign_files_local_text">Lokal: %1$s</string>
     <string name="foreign_files_remote_text">Remote: %1$s</string>
     <string name="upload_query_move_foreign_files">Es steht nicht genügend Speicherplatz zur Verfügung um die ausgewählten Dateien in den Ordner %1$s zu kopieren. Möchten Sie diese stattdessen verschieben?</string>
+    <string name="pass_code_enter_pass_code">Synchronisation fehlgeschlagen, Sie müssen sich erneut anmelden.</string>
+    
     <string name="pass_code_configure_your_pass_code">Bitte PIN eingeben</string>
     <string name="pass_code_configure_your_pass_code_explanation">Die PIN wird jedes mal wenn die App gestartet wird abgefragt</string>
     <string name="pass_code_reenter_your_pass_code">Bitte PIN erneut eingeben</string>
@@ -253,6 +257,7 @@
     <string name="filename_empty">Dateiname darf nicht leer sein</string>
     <string name="wait_a_moment">Bitte warten Sie einen Moment.</string>
     <string name="wait_checking_credentials">Überprüfe gespeicherte Anmeldeinformationen</string>
+    <string name="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuchen Sie, die Datei in einer anderen App zu öffnen.</string>
     <string name="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string>
     <string name="activity_chooser_title">Link senden an …</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopiere Datei vom privatem Speicher</string>
@@ -336,6 +341,9 @@
     <string name="error_cant_bind_to_operations_service">Kritischer Fehler: Operationen können nicht ausgeführt werden</string>
 
     <string name="network_error_socket_exception">Es ist ein Fehler bei der Verbindung mit dem Server aufgetreten.</string>
+    <string name="network_error_socket_timeout_exception">Es ist ein Fehler während des Wartens auf den Server aufgetreten, die Operation kann nicht ausgeführt werden</string>
+    <string name="network_error_connect_timeout_exception">Es ist ein Fehler während des Wartens auf den Server aufgetreten, die Operation kann nicht ausgeführt werden</string>
+    <string name="network_host_not_available">Die Operation kann nicht abgeschlossen werden, der Server ist nicht erreichbar</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Sie haben keine Berechtigung %s</string>

+ 8 - 0
res/values-de/strings.xml

@@ -69,6 +69,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Beenden</string>
     <string name="uploader_error_title_no_file_to_upload">Keine Datei zum Hochladen</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s kann einen Textteil als Datei hochladen</string>
+    <string name="uploader_error_message_no_file_to_upload">Empfangene Daten enthalten keine gültige Datei.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Datei kann nicht hochgeladen werden</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s darf eine empfangene Datei nicht lesen</string>
     <string name="uploader_error_message_source_file_not_found">Hochzuladende Datei wurde an seinem Ort nicht gefunden. Prüfe, ob die Datei existiert.</string>
@@ -154,6 +155,7 @@
     <string name="downloader_download_failed_credentials_error">Herunterladen fehlgeschlagen, erneute Anmeldung erforderlich</string>
     <string name="common_choose_account">Konto auswählen</string>
     <string name="sync_fail_ticker">Synchronisation fehlgeschlagen</string>
+    <string name="sync_fail_ticker_unauthorized">Synchronisation fehlgeschlagen, erneute Anmeldung erforderlich.</string>
     <string name="sync_fail_content">Synchronisation von %1$s konnte nicht abgeschlossen werden</string>
     <string name="sync_fail_content_unauthorized">Falsches Passwort für %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Konflikte gefunden</string>
@@ -170,6 +172,8 @@
     <string name="foreign_files_local_text">Lokal: %1$s</string>
     <string name="foreign_files_remote_text">Remote: %1$s</string>
     <string name="upload_query_move_foreign_files">Es steht nicht genügend Speicherplatz zur Verfügung, um die ausgewählten Dateien in das Verzeichnis %1$s zu kopieren. Sollen sie stattdessen verschoben werden?</string>
+    <string name="pass_code_enter_pass_code">Bitte gib deine PIN ein</string>
+    
     <string name="pass_code_configure_your_pass_code">Bitte PIN eingeben</string>
     <string name="pass_code_configure_your_pass_code_explanation">Die PIN wird jedes mal beim Start der App abgefragt</string>
     <string name="pass_code_reenter_your_pass_code">Bitte Deine PIN nochmals eingeben</string>
@@ -253,6 +257,7 @@
     <string name="filename_empty">Dateiname darf nicht leer sein</string>
     <string name="wait_a_moment">Bitte warte einen Moment.</string>
     <string name="wait_checking_credentials">Überprüfe gespeicherte Anmeldeinformationen</string>
+    <string name="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuche, die Datei in einer anderen App zu öffnen</string>
     <string name="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string>
     <string name="activity_chooser_title">Link senden an…</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopiere Datei vom privatem Speicher</string>
@@ -336,6 +341,9 @@
     <string name="error_cant_bind_to_operations_service">Kritischer Fehler: Operationen können nicht ausgeführt werden</string>
 
     <string name="network_error_socket_exception">Es ist ein Fehler beim Verbinden mit dem Server aufgetreten.</string>
+    <string name="network_error_socket_timeout_exception">Es ist ein Fehler beim Warten auf den Server aufgetreten, die Operation kann nicht ausgeführt werden</string>
+    <string name="network_error_connect_timeout_exception">Es ist ein Fehler beim Warten auf den Server aufgetreten, die Operation kann nicht ausgeführt werden</string>
+    <string name="network_host_not_available">Die Operation kann nicht abgeschlossen werden, der Server ist nicht erreichbar</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Sie haben keine Berechtigung %s</string>

+ 9 - 0
res/values-en-rGB/strings.xml

@@ -28,6 +28,7 @@
     <string name="prefs_accounts">Accounts</string>
     <string name="prefs_manage_accounts">Manage accounts</string>
     <string name="prefs_passcode">Passcode lock</string>
+    <string name="prefs_show_hidden_files">Show hidden files</string>
     <string name="prefs_instant_upload">Instant picture uploads</string>
     <string name="prefs_instant_upload_summary">Instantly upload pictures taken by camera</string>
     <string name="prefs_instant_video_upload">Instant video uploads</string>
@@ -68,6 +69,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Quit</string>
     <string name="uploader_error_title_no_file_to_upload">No file to upload</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s cannot upload a piece of text as a file.</string>
+    <string name="uploader_error_message_no_file_to_upload">Received data did not include a valid file.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">File cannot be uploaded</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s is not allowed to read a received file</string>
     <string name="uploader_error_message_source_file_not_found">File to upload was not found in its location. Please check whether the file exists.</string>
@@ -153,6 +155,7 @@
     <string name="downloader_download_failed_credentials_error">Download failed, you need to log in again</string>
     <string name="common_choose_account">Choose account</string>
     <string name="sync_fail_ticker">Sync failed</string>
+    <string name="sync_fail_ticker_unauthorized">Sync failed; you need to log in again</string>
     <string name="sync_fail_content">Sync of %1$s could not be completed</string>
     <string name="sync_fail_content_unauthorized">Invalid password for %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Conflicts found</string>
@@ -169,6 +172,8 @@
     <string name="foreign_files_local_text">Local: %1$s</string>
     <string name="foreign_files_remote_text">Remote: %1$s</string>
     <string name="upload_query_move_foreign_files">There is not enough space to copy the selected files into the %1$s folder. Would you like to move them instead? </string>
+    <string name="pass_code_enter_pass_code">Please enter your passcode</string>
+    
     <string name="pass_code_configure_your_pass_code">Enter your passcode</string>
     <string name="pass_code_configure_your_pass_code_explanation">The passcode will be requested every time the app is started</string>
     <string name="pass_code_reenter_your_pass_code">Please reenter your passcode</string>
@@ -252,6 +257,7 @@
     <string name="filename_empty">File name cannot be empty</string>
     <string name="wait_a_moment">Wait a moment</string>
     <string name="wait_checking_credentials">Checking stored credentials</string>
+    <string name="filedisplay_unexpected_bad_get_content">Unexpected problem; please select the file from a different app</string>
     <string name="filedisplay_no_file_selected">No file was selected</string>
     <string name="activity_chooser_title">Send link to …</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copying file from private storage</string>
@@ -335,6 +341,9 @@
     <string name="error_cant_bind_to_operations_service">Critical error: cannot perform operations</string>
 
     <string name="network_error_socket_exception">An error occurred whilst connecting to the server.</string>
+    <string name="network_error_socket_timeout_exception">An error occurred while waiting for the server; the operation couldn\'t be completed</string>
+    <string name="network_error_connect_timeout_exception">An error occurred while waiting for the server; the operation couldn\'t be completed</string>
+    <string name="network_host_not_available">The operation couldn\'t be completed; server is unavailable</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">You do not have permission %s</string>

+ 8 - 0
res/values-es/strings.xml

@@ -68,6 +68,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Salir</string>
     <string name="uploader_error_title_no_file_to_upload">Ningún archivo para subir</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s  No puedo subir un texto como si fuera un archivo.</string>
+    <string name="uploader_error_message_no_file_to_upload">No hay ningún archivo válido en los datos recibidos.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">No se puede subir el archivo</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s No está autorizado a leer el arcivo.</string>
     <string name="uploader_error_message_source_file_not_found">El archivo a subir no se localiza. Compruebe que el archivo existe.</string>
@@ -153,6 +154,7 @@
     <string name="downloader_download_failed_credentials_error">La descarga falló, necesita volver a iniciar sesión</string>
     <string name="common_choose_account">Elija una cuenta</string>
     <string name="sync_fail_ticker">Sincronización fallida</string>
+    <string name="sync_fail_ticker_unauthorized">Sincronización fallida, necesita volver a iniciar sesión</string>
     <string name="sync_fail_content">La sincronización de %1$s no pudo ser completada</string>
     <string name="sync_fail_content_unauthorized">Contraseña no válida para %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Se encontraron conflictos</string>
@@ -169,6 +171,8 @@
     <string name="foreign_files_local_text">Local: %1$s</string>
     <string name="foreign_files_remote_text">Remoto: %1$s</string>
     <string name="upload_query_move_foreign_files">No hay suficiente espacio para copiar los archivos seleccionados en la carpeta %1$s. ¿Te gustaría moverlos entonces?</string>
+    <string name="pass_code_enter_pass_code">Por favor introduzca su código</string>
+    
     <string name="pass_code_configure_your_pass_code">Introduzca su contraseña</string>
     <string name="pass_code_configure_your_pass_code_explanation">La contraseña será requerida cada vez que la aplicación sea iniciada</string>
     <string name="pass_code_reenter_your_pass_code">Por favor reintroduzca su código</string>
@@ -252,6 +256,7 @@
     <string name="filename_empty">El nombre de archivo no puede estar vacío</string>
     <string name="wait_a_moment">Espere un momento</string>
     <string name="wait_checking_credentials">Comprobando las credenciales guardadas</string>
+    <string name="filedisplay_unexpected_bad_get_content">Problema inesperado; por favor, pruebe otra app para seleccionar el archivo</string>
     <string name="filedisplay_no_file_selected">No hay ficheros seleccionados.</string>
     <string name="activity_chooser_title">Enviar enlace a...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copiando el archivo desde el almacenamiento privado.</string>
@@ -333,6 +338,9 @@
     <string name="error_cant_bind_to_operations_service">Error crítico: no es posible realizar operaciones</string>
 
     <string name="network_error_socket_exception">Ocurrió un error al conectarse con el servidor.</string>
+    <string name="network_error_socket_timeout_exception">Ocurrió un error al esperar la respuesta del servidor, la operación no se pudo realizar</string>
+    <string name="network_error_connect_timeout_exception">Ocurrió un error al esperar la respuesta del servidor, la operación no se pudo realizar</string>
+    <string name="network_host_not_available">La operación no se pudo completar; el servidor no está disponible</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">No tiene permiso %s</string>

+ 0 - 8
res/values-eu-rES/strings.xml

@@ -1,8 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<resources>
-  <!--TODO re-enable when server-side folder size calculation is available   
-    	<item>Biggest - Smallest</item>-->
-  <string name="filedetails_download">Deskargatu</string>
-  <string name="common_cancel">Ezeztatu</string>
-  <string name="empty"></string>
-</resources>

+ 0 - 271
res/values-eu/strings.xml

@@ -1,271 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<resources>
-  <string name="about_android">%1$s Android aplikazioa</string>
-  <string name="about_version">%1$s bertsioa</string>
-  <string name="actionbar_sync">Freskatu kontua</string>
-  <string name="actionbar_upload">Igo fitxategia</string>
-  <string name="actionbar_upload_from_apps">Beste app-en edukia</string>
-  <string name="actionbar_upload_files">Fitxategiak</string>
-  <string name="actionbar_open_with">Ireki honekin</string>
-  <string name="actionbar_mkdir">Karpeta berria</string>
-  <string name="actionbar_settings">Ezarpenak</string>
-  <string name="actionbar_see_details">Xehetasunak</string>
-  <string name="actionbar_send_file">Bidali</string>
-  <string name="actionbar_sort">Ordenatu</string>
-  <string name="actionbar_sort_title">Ordenatu honen arabera</string>
-  <string-array name="actionbar_sortby">
-    <item>A-Z</item>
-    <item>Berrienak - Zaharrenak</item>
-  </string-array>
-  <!--TODO re-enable when server-side folder size calculation is available   
-    	<item>Biggest - Smallest</item>-->
-  <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
-  <!--<string name="drawer_item_accounts">Accounts</string>-->
-  <string name="drawer_item_all_files">Fitxategi guztiak</string>
-  <!--TODO re-enable when "On Device" is available
-    <string name="drawer_item_on_device">On device</string>-->
-  <string name="drawer_item_settings">Ezarpenak</string>
-  <string name="drawer_close">Itxi</string>
-  <string name="drawer_open">Ireki</string>
-  <string name="prefs_category_general">Orokorra</string>
-  <string name="prefs_category_more">Gehiago</string>
-  <string name="prefs_accounts">Kontuak</string>
-  <string name="prefs_manage_accounts">Kontuak kudeatu</string>
-  <string name="prefs_instant_upload">Uneko irudi igoerak</string>
-  <string name="prefs_instant_upload_summary">Igo berehala kamerak ateratako argazkiak</string>
-  <string name="prefs_instant_video_upload">Uneko bideo igoerak</string>
-  <string name="prefs_instant_video_upload_summary">Igo berehala kamerak filmatutako bideoak</string>
-  <string name="prefs_log_summary">Arazoen erregistroa gordetzeko erabiltzen da</string>
-  <string name="prefs_log_title_history">Saio historia</string>
-  <string name="prefs_log_summary_history">Honek gordetako erregistroak bistaratzen ditu.</string>
-  <string name="prefs_log_delete_history_button">Ezabatu historiala</string>
-  <string name="prefs_help">Laguntza</string>
-  <string name="prefs_recommend">Lagun bati aholkatu</string>
-  <string name="prefs_feedback">Oharrak</string>
-  <string name="prefs_imprint">Imprint</string>
-  <string name="prefs_remember_last_share_location">Oroitu partekatutako kokalekua</string>
-  <string name="recommend_subject">Probatu %1$s zure telefono adimentsuan!</string>
-  <string name="recommend_text">Nik %1$s zure telefono adimentsuan erabitzera gonbidatu nahi zaitut!\nDeskargatu hemen: %2$s</string>
-  <string name="auth_host_url">Zerbitzariaren helbidea https://</string>
-  <string name="auth_username">Erabiltzaile izena</string>
-  <string name="auth_password">Pasahitza</string>
-  <string name="auth_register">Berria %1$s-n?</string>
-  <string name="sync_string_files">Fitxategiak</string>
-  <string name="setup_btn_connect">Konektatu</string>
-  <string name="uploader_btn_upload_text">Igo</string>
-  <string name="uploader_wrn_no_account_title">Ez da konturik aurkitu</string>
-  <string name="uploader_wrn_no_account_setup_btn_text">Konfiguratu</string>
-  <string name="uploader_wrn_no_account_quit_btn_text">Irten</string>
-  <string name="file_list_seconds_ago">segundu</string>
-  <string name="file_list_empty">Ez dago ezer. Igo zerbait!</string>
-  <string name="local_file_list_empty">Ez dago fitxategirik karpeta honetan.</string>
-  <string name="file_list_folder">karpeta</string>
-  <string name="file_list_folders">Karpetak</string>
-  <string name="file_list_file">fitxategia</string>
-  <string name="file_list_files">fitxategia</string>
-  <string name="filedetails_select_file">Sakatu fitxategi baten gainean informazio gehiago lortzeko</string>
-  <string name="filedetails_size">Tamaina:</string>
-  <string name="filedetails_type">Mota:</string>
-  <string name="filedetails_created">Sortuta:</string>
-  <string name="filedetails_modified">Aldatuta:</string>
-  <string name="filedetails_download">Deskargatu</string>
-  <string name="filedetails_renamed_in_upload_msg">Fitxategiaren izena %1$sra aldatu da igotzean</string>
-  <string name="action_share">Partekatu</string>
-  <string name="common_yes">Bai</string>
-  <string name="common_no">Ez</string>
-  <string name="common_ok">Ados</string>
-  <string name="common_cancel">Ezeztatu</string>
-  <string name="common_back">Atzera</string>
-  <string name="common_error">Errorea</string>
-  <string name="common_loading">Kargatzen ...</string>
-  <string name="common_unknown">ezezaguna</string>
-  <string name="common_error_unknown">Errore ezezaguna</string>
-  <string name="about_title">Honi buruz</string>
-  <string name="change_password">Aldatu pasahitza</string>
-  <string name="create_account">Sortu kontua</string>
-  <string name="upload_chooser_title">Igo fitxategia hemendik ...</string>
-  <string name="uploader_info_dirname">Karpetaren izena</string>
-  <string name="uploader_upload_in_progress_ticker">Igotzen ...</string>
-  <string name="uploader_upload_in_progress_content">%1$d%% Igotzen %2$s</string>
-  <string name="uploader_upload_succeeded_ticker">Igotzea ongi burutu da</string>
-  <string name="uploader_upload_failed_ticker">igotzeak huts egin du</string>
-  <string name="uploader_upload_failed_content_single">%1$s fitxategiaren igoera ezin izan da burutu</string>
-  <string name="uploads_view_group_current_uploads">Unekoa</string>
-  <string name="uploads_view_group_finished_uploads">Igoa</string>
-  <string name="uploads_view_upload_status_succeeded">Betea</string>
-  <string name="uploads_view_upload_status_failed_permission_error">Baimen errorea.</string>
-  <string name="uploads_view_upload_status_unknown_fail">Errore ezezaguna</string>
-  <string name="downloader_download_in_progress_ticker">Deskargatzen ...</string>
-  <string name="downloader_download_in_progress_content">%1$d%% Deskargatzen %2$s</string>
-  <string name="downloader_download_succeeded_ticker">Deskarga ongi burutu da</string>
-  <string name="downloader_download_failed_ticker">Deskargak huts egin du</string>
-  <string name="downloader_download_failed_content">%1$s fitxategiaren deskarga ezin izan da burutu</string>
-  <string name="downloader_not_downloaded_yet">Oraindik deskargatu gabe</string>
-  <string name="common_choose_account">Hautatu kontua</string>
-  <string name="sync_fail_content_unauthorized">Okerreko pasahitza %1$s-rako</string>
-  <string name="sync_conflicts_in_favourites_ticker">Gatazkak aurkituak </string>
-  <string name="sync_conflicts_in_favourites_content">sinkronizatu beharreko %1$d fitxategiak ezin dira sinkronizatu</string>
-  <string name="sync_fail_in_favourites_ticker">edukien sinkronizazioak huts egin du</string>
-  <string name="sync_fail_in_favourites_content">%1$d fitxategien edukiak ezin dira sinkronizatu (%2$d gatazka)</string>
-  <string name="sync_foreign_files_forgotten_ticker">Bertako fitxategi batzuk ahaztu dira</string>
-  <string name="sync_foreign_files_forgotten_content">%2$s karpetako %1$d fitxategi ezin dira dira kopiatu</string>
-  <string name="sync_foreign_files_forgotten_explanation">1.3.16 bertsioan, gailu honetatik igotzen diren fitxategiak bertako %1$s karpetara mugitzen dira datu galera ekiditeko fitxategi bat kontu ezberdinekin sinkronizatzen denean.\n\n Aldaketa hau dela eta, programa honen aurreko bertsioetan igotako fitxategi guztiak %2$s karpetara kopiatu dira. Hala ere, errore batek hau burutzea ekidin du kontuaren sinkronizazioa egiten ari zen bitartean. Orain fitxategiak dauden bezala utz ditzakezu eta %3$s rako lotura ezabatu, edo fitxategiak %1$s karpetara mugi ditzakezu eta %4$srako lotura mantendu.\n\nBehean bertako fitxategien zerrenda eta %5$s era lotuta zeuden urruneko fitxategiena.</string>
-  <string name="sync_current_folder_was_removed">%1$s karpeta dagoeneko ez da existitzen</string>
-  <string name="foreign_files_move">Mugitu denak</string>
-  <string name="foreign_files_success">Fitxategi guztiak mugitu dira</string>
-  <string name="foreign_files_fail">Fitxategi batzuk ezin dira mugitu</string>
-  <string name="foreign_files_local_text">Bertakoa: %1$s</string>
-  <string name="foreign_files_remote_text">Urrunekoa: %1$s</string>
-  <string name="media_notif_ticker">%1$s musika erreproduzigailua</string>
-  <string name="media_state_playing">%1$s (jotzen)</string>
-  <string name="media_state_loading">%1$s (kargatzen)</string>
-  <string name="media_event_done">%1$s erreprodukzioa amaitua</string>
-  <string name="media_err_nothing_to_play">Ez da euskarri fitxategia aurkitu</string>
-  <string name="media_err_no_account">Ez da konturik eman</string>
-  <string name="media_err_not_in_owncloud">Fitxategiak ez du baliozko kontu bat</string>
-  <string name="media_err_unsupported">Onartzen ez de euskarri kodeka</string>
-  <string name="media_err_io">Euskarri fitxategia ezin da bihurtu</string>
-  <string name="media_err_malformed">Euskarri fitxategia ezin da kodetu</string>
-  <string name="media_err_timeout">Erreproduzitzen saiatzean denbora iraungitu da</string>
-  <string name="media_err_invalid_progressive_playback">Euskarri fitxategia ezin da jariotu</string>
-  <string name="media_err_unknown">Euskarri fitxategia ezin erreproduzitu stock euskarri erreproduzigailuarekin</string>
-  <string name="media_err_security_ex">Segurtasun errorea %1$s erreproduzitzen saiatzean</string>
-  <string name="media_err_io_ex">Sarrera errorea %1$s erreproduzitzen saiatzean</string>
-  <string name="media_err_unexpected">Ezusteko errorea %1$s erreproduzitzen saiatzean</string>
-  <string name="media_rewind_description">Atzeratu botoia</string>
-  <string name="media_play_pause_description">Erreproduzitu edo pausatu botoia</string>
-  <string name="media_forward_description">Azkar aurreratu botoia</string>
-  <string name="auth_getting_authorization">Baimena eskuratzen</string>
-  <string name="auth_trying_to_login">Saio hasten saiatzen</string>
-  <string name="auth_no_net_conn_title">Ez dago sare konexiorik</string>
-  <string name="auth_nossl_plain_ok_title">Konexio segurua ez dago eskuragarri</string>
-  <string name="auth_connection_established">Konexioa ezarri da</string>
-  <string name="auth_not_configured_title">gaizki egindako server konfigurazioa</string>
-  <string name="auth_account_not_new">Erabiltzaile eta zerbitzari hauendako dagoeneko kontu bat  existitzen da gailu honetan</string>
-  <string name="auth_account_not_the_same">Sartutako erabiltzaileak ez du bat egiten kontu honetako erabiltzailearekin</string>
-  <string name="auth_unknown_error_title">Errore ezezagun bat gertatu da</string>
-  <string name="auth_unknown_host_title">Ezin izan da hostalaria aurkitu</string>
-  <string name="auth_incorrect_path_title">ez da serveren instalaziorik aurkitu</string>
-  <string name="auth_timeout_title">Zerbitzariak denbora asko hartu du erantzuteko</string>
-  <string name="auth_ssl_general_error_title">SSL abiaratzeak huts egin du</string>
-  <string name="auth_ssl_unverified_server_title">Ezin izan da SSL zerbitzariaren identitaea egiaztatu</string>
-  <string name="auth_bad_oc_version_title">server zerbitzari bertsio ezezaguna</string>
-  <string name="auth_wrong_connection_title">Ezin izan da konexioa egin</string>
-  <string name="auth_secure_connection">Konexio segurua ezarri da</string>
-  <string name="auth_unauthorized">Okerreko erabiltzaile izen edo pasahitza</string>
-  <string name="auth_oauth_error">Baimena ez da lortu</string>
-  <string name="auth_oauth_error_access_denied">Sarrera autorizazio zerbitzariak ukatua</string>
-  <string name="auth_expired_oauth_token_toast">Zure baimena iraungitu da.
-Mesedez, baimendu berriz</string>
-  <string name="auth_expired_saml_sso_token_toast">Zure saioa iraungitu da. Mesdez konektatu berriro</string>
-  <string name="auth_unsupported_auth_method">Zerbitzariak ez du autentikazio metodo hau onartzen</string>
-  <string name="auth_unsupported_multiaccount">%1$s ez du kontu anitzak onartzen</string>
-  <string name="auth_fail_get_user_name">Zure zerbitzariak ez du bueltatzen erabiltzailearen id egokia, mesedez jarri harremanetan administratzailearekin.</string>
-  <string name="common_rename">Berrizendatu</string>
-  <string name="common_remove">Ezabatu</string>
-  <string name="confirmation_remove_alert">Ziur zaude %1$s ezabatu nahi duzula?</string>
-  <string name="confirmation_remove_folder_alert">Ziru zaude %1$s eta bere edukiak ezabatu nahi dituzula?</string>
-  <string name="confirmation_remove_local">Bertakoa bakarrik</string>
-  <string name="remove_success_msg">Ongi ezabatu da</string>
-  <string name="remove_fail_msg">Ezin izan da ezabaketa burutu</string>
-  <string name="rename_dialog_title">Idatzi izen berri bat</string>
-  <string name="rename_local_fail_msg">Bertako kopia ezin da izenez aldatu, saiatu beste izen batekin</string>
-  <string name="rename_server_fail_msg">Izen aldaketa ezin izan da burutu</string>
-  <string name="sync_file_fail_msg">Urruneko fitxategia ezin izan da arakatu</string>
-  <string name="sync_file_nothing_to_do_msg">Fitxategi edukiak dagoeneko sinkronizaturik</string>
-  <string name="create_dir_fail_msg">Ezin izan da karpeta sortu</string>
-  <string name="filename_forbidden_characters">Debekatutako karaktereak: / \\ &lt; &gt; : \" | ? *</string>
-  <string name="filename_forbidden_charaters_from_server">Fitxategi izenak behintzat baliogabeko karaktere bat du</string>
-  <string name="filename_empty">Fitxategi izena ezin da hutsa izan</string>
-  <string name="wait_a_moment">Itxaron momentu bat</string>
-  <string name="filedisplay_unexpected_bad_get_content">Ezusteko arazoa; mesedez, saiatu beste app batekin fitxategia hautatzeko</string>
-  <string name="filedisplay_no_file_selected">Ez da fitxategirik hautatu</string>
-  <string name="activity_chooser_title">Bidali lotura honi...</string>
-  <string name="oauth_check_onoff">Saioa hasi oAuth2-rekin</string>
-  <string name="oauth_login_connection">Konektatzen oAuth2 zerbitzarira...</string>
-  <string name="ssl_validator_header">Lekuaren identitatea ezin da egiaztatu</string>
-  <string name="ssl_validator_reason_cert_not_trusted">- Zerbitzariaren ziurtagiria ez da fidagarria</string>
-  <string name="ssl_validator_reason_cert_expired">- Zerbitzariaren ziurtagiria iraungi da</string>
-  <string name="ssl_validator_reason_cert_not_yet_valid">- Zerbitzariaren ziurtagiria oso gaztea da</string>
-  <string name="ssl_validator_reason_hostname_not_verified">- URLa ez dator bat ziurtagiriaren hostalari izenarekin</string>
-  <string name="ssl_validator_question">Nahi duzu, hala ere, ziurtagiriaz fidatu?</string>
-  <string name="ssl_validator_not_saved">Ziurtagiria ezin da gorde</string>
-  <string name="ssl_validator_btn_details_see">Xehetasunak</string>
-  <string name="ssl_validator_btn_details_hide">Ezkutatu</string>
-  <string name="ssl_validator_label_subject">Honi bidalita:</string>
-  <string name="ssl_validator_label_issuer">Honek bidalita:</string>
-  <string name="ssl_validator_label_CN">Izen arrunta:</string>
-  <string name="ssl_validator_label_O">Erakundea:</string>
-  <string name="ssl_validator_label_OU">Erakunde atala:</string>
-  <string name="ssl_validator_label_C">Herrialdea:</string>
-  <string name="ssl_validator_label_ST">Estatua:</string>
-  <string name="ssl_validator_label_L">Kokapena:</string>
-  <string name="ssl_validator_label_validity">Baliozkotasuna:</string>
-  <string name="ssl_validator_label_validity_from">Noiztik:</string>
-  <string name="ssl_validator_label_validity_to">Noiz arte:</string>
-  <string name="ssl_validator_label_signature">Sinadura:</string>
-  <string name="ssl_validator_label_signature_algorithm">Algoritmoa:</string>
-  <string name="ssl_validator_null_cert">Ezin da ziurtagiria erakutsi.</string>
-  <string name="ssl_validator_no_info_about_error">- Ez dago errorearen gaineko informaziorik.</string>
-  <string name="placeholder_sentence">Hau leku-marka da</string>
-  <string name="placeholder_filename">kokalekua.txt</string>
-  <string name="placeholder_filetype">PNG Irudia</string>
-  <string name="placeholder_filesize">389 KB</string>
-  <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
-  <string name="placeholder_media_time">12:23:45</string>
-  <string name="instant_upload_path">/BerehalakoIgoerak</string>
-  <string name="conflict_keep_both">Mantendu biak</string>
-  <string name="preview_image_description">Irudi aurreikuspena</string>
-  <string name="preview_image_error_unknown_format">Ezin da irudi hau erakutsi</string>
-  <string name="error__upload__local_file_not_copied">%1$s ezin da %2$s karpeta lokalera kopiatu</string>
-  <string name="share_link_no_support_share_api">Sentitzen dut, partekatzea ez dago zure zerbitzarian gaituta. Mesedez jarri harremanetan zure administratzailearekin.</string>
-  <string name="share_link_file_no_exist">Ezin izan da partekatu. Mesedez egiaztatu fitxategia existitzen dela</string>
-  <string name="share_link_file_error">Errore bat egon da fitxategaia edo karpeta partekatzerakoan</string>
-  <string name="unshare_link_file_no_exist">Ezin izan da partekatzea desegin. Mesedez egiaztatu fitxategia existitzen dela</string>
-  <string name="unshare_link_file_error">Errore bat egon da fitxategaia edo karpeta partekatzeari uzterakoan</string>
-  <string name="activity_chooser_send_file_title">Bidali</string>
-  <string name="copy_link">Lotura kopiatu</string>
-  <string name="clipboard_text_copied">Arbelera kopiatua</string>
-  <string name="error_cant_bind_to_operations_service">Errore larria: ezin dira egin eragiketak</string>
-  <string name="network_error_socket_exception">Errore bat gertatu da zerbitzariarekin konektatzean.</string>
-  <string name="network_error_socket_timeout_exception">Errore bat gertatu da zerbitzariaren zain egon bitartean, ezin izan da eragiketa burutu</string>
-  <string name="network_error_connect_timeout_exception">Errore bat gertatu da zerbitzariaren zain egon bitartean, ezin izan da eragiketa burutu</string>
-  <string name="network_host_not_available">Eragiketa ezin izan da burutu, zerbitzaria ez dago erabilgarri</string>
-  <string name="empty"></string>
-  <string name="forbidden_permissions">Ez daukazu baimenik %s</string>
-  <string name="forbidden_permissions_rename">fitxategia berrizendatzeko</string>
-  <string name="forbidden_permissions_delete">fitxategia ezabatzeko</string>
-  <string name="share_link_forbidden_permissions">fitxategia konpartitzeko</string>
-  <string name="unshare_link_forbidden_permissions">fitxategiaren konpartitzea kentzeko</string>
-  <string name="forbidden_permissions_create">fitxategia sortzeko</string>
-  <string name="uploader_upload_forbidden_permissions">karpeta honetara igotzeko</string>
-  <string name="downloader_download_file_not_found">Fitxategia jadanik ez dago eskuragarri zerbitzarian</string>
-  <string name="prefs_category_accounts">Kontuak</string>
-  <string name="prefs_add_account">Gehitu kontua</string>
-  <string name="auth_redirect_non_secure_connection_title">Konexio segurua birbideratu da segurua ez den bide batetik.</string>
-  <string name="actionbar_logger">Egunkariak</string>
-  <string name="log_send_mail_subject">%1$s Android aplikazioaren egunerokoak</string>
-  <string name="saml_authentication_required_text">Autentikazioa beharrezkoa</string>
-  <string name="saml_authentication_wrong_pass">Pasahitz okerra</string>
-  <string name="actionbar_move">Mugitu</string>
-  <string name="file_list_empty_moving">Hemen ez dago ezer. Karpeta bat gehi dezakezu!</string>
-  <string name="folder_picker_choose_button_text">Aukeratu</string>
-  <string name="move_file_not_found">Ezin izan da mugitu. Mesedez egiaztatu fitxategia existitzen dela</string>
-  <string name="move_file_invalid_overwrite">Fitxategia dagoeneko existitzen da helburuko karpetan</string>
-  <string name="move_file_error">Errore bat gertatu da fitxategi edo karpeta hau mugitzen saiatzerakoan</string>
-  <string name="forbidden_permissions_move">fitxategi hau mugitzeko</string>
-  <string name="copy_file_invalid_overwrite">Fitxategia dagoeneko existitzen da helburuko karpetan</string>
-  <string name="prefs_category_details">Xehetasunak</string>
-  <string name="auth_host_address">Zerbitzariaren helbidea</string>
-  <string name="share_dialog_title">Partekatzea</string>
-  <string name="share_via_link_section_title">Elkarbanatu lotura</string>
-  <string name="share_via_link_expiration_date_label">Ezarri muga data</string>
-  <string name="share_via_link_password_label">Babestu pasahitzarekin</string>
-  <string name="share_via_link_edit_permission_label">Baimendu editatzea</string>
-  <string name="share_search">Bilatu</string>
-  <string name="share_privilege_can_share">elkarbana dezake</string>
-  <string name="share_privilege_can_edit">editatu dezake</string>
-  <string name="share_privilege_can_edit_create">sortu</string>
-  <string name="share_privilege_can_edit_change">aldatu</string>
-  <string name="share_privilege_can_edit_delete">ezabatu</string>
-</resources>

+ 0 - 42
res/values-fi/strings.xml

@@ -1,42 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<resources>
-  <string name="actionbar_upload">Lähetä</string>
-  <string name="actionbar_open_with">Avaa sovelluksessa</string>
-  <string name="actionbar_mkdir">Luo kansio</string>
-  <string name="actionbar_settings">Asetukset</string>
-  <!--TODO re-enable when server-side folder size calculation is available   
-    	<item>Biggest - Smallest</item>-->
-  <string name="prefs_category_more">Lisää</string>
-  <string name="prefs_manage_accounts">Hallitse tilejä</string>
-  <string name="prefs_pincode">Sovelluksen PIN</string>
-  <string name="prefs_help">Apua</string>
-  <string name="auth_host_url">http://esimerkki.fi/palvelu/</string>
-  <string name="auth_username">Käyttäjätunnus</string>
-  <string name="auth_password">Salasana</string>
-  <string name="uploader_btn_upload_text">Lähetä</string>
-  <string name="file_list_empty">Ei sisältöä. Siirrä tänne jotakin!</string>
-  <string name="file_list_loading">Ladataan...</string>
-  <string name="file_list_folder">kansio</string>
-  <string name="file_list_folders">kansiot</string>
-  <string name="file_list_file">tiedosto</string>
-  <string name="file_list_files">Tiedostot</string>
-  <string name="action_unshare_file">Poista linkin jako</string>
-  <string name="common_yes">KYLLÄ</string>
-  <string name="common_no">EI</string>
-  <string name="common_ok">Ok</string>
-  <string name="common_cancel">Peruuta</string>
-  <string name="common_error">Virhe</string>
-  <string name="pincode_wrong">Virheellinen PIN</string>
-  <string name="pincode_removed">Sovelluksen PIN poistettu</string>
-  <string name="pincode_stored">Sovelluksen PIN tallennettu</string>
-  <string name="auth_account_not_the_same">Syötetty käyttäjä ei täsmää tämän tilin käyttäjän kanssa</string>
-  <string name="auth_unsupported_auth_method">Palvelin ei tue tätä autentikointitapaa</string>
-  <string name="common_rename">Nimeä uudelleen</string>
-  <string name="ssl_validator_label_L">Sijainti:</string>
-  <string name="conflict_overwrite">Ylikirjoita</string>
-  <string name="copy_link">Kopioi linkki</string>
-  <string name="empty"></string>
-  <string name="actionbar_move">Siirrä</string>
-  <string name="folder_picker_choose_button_text">Valitse</string>
-  <string name="move_file_invalid_overwrite">Tiedosto on jo kohdekansiossa.</string>
-</resources>

+ 9 - 0
res/values-fr/strings.xml

@@ -37,6 +37,7 @@
     <string name="prefs_log_title_history">Historique de la journalisation</string>
     <string name="prefs_log_summary_history">Cela affiche les logs enregistrés</string>
     <string name="prefs_log_delete_history_button">Supprimer l\'historique</string>
+    <string name="prefs_calendar_contacts">Configurer la synchronisation de l\'agenda &amp; des contacts</string>
     <string name="prefs_calendar_contacts_summary">Configurer DAVdroid (v1.3.0+) pour le compte actuel</string>
     <string name="prefs_calendar_contacts_address_resolve_error">Une  adresse de serveur pour le compte pourrait ne pas être résolue par DAVdroid</string>
     <string name="prefs_calendar_contacts_no_store_error">Aucune application Google Play store ou F-Droid installée</string>
@@ -67,6 +68,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Quitter</string>
     <string name="uploader_error_title_no_file_to_upload">Aucun fichier à téléverser</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s ne peut téléverser un morceau de texte comme un fichier.</string>
+    <string name="uploader_error_message_no_file_to_upload">Les données reçues n\'incluent aucun fichier valide</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Le fichier ne peut pas être téléversé</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s n\'est pas autorisé à lire un fichier reçu</string>
     <string name="uploader_error_message_source_file_not_found">Le fichier à téléverser n\'a pas été trouvé dans son emplacement. Merci de vérifier si ce fichier existe.</string>
@@ -154,6 +156,7 @@ La suppression est irréversible. </string>
     <string name="downloader_download_failed_credentials_error">Le téléchargement a échoué, vous devez vous reconnecter</string>
     <string name="common_choose_account">Choisissez un compte</string>
     <string name="sync_fail_ticker">La synchronisation a échoué</string>
+    <string name="sync_fail_ticker_unauthorized">La synchronisation a échoué, vous devez vous reconnecter</string>
     <string name="sync_fail_content">La synchronisation de %1$s a échoué</string>
     <string name="sync_fail_content_unauthorized">Mot de passe invalide pour %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Des conflits ont été trouvés</string>
@@ -170,6 +173,8 @@ La suppression est irréversible. </string>
     <string name="foreign_files_local_text">Local : %1$s</string>
     <string name="foreign_files_remote_text">Distant : %1$s</string>
     <string name="upload_query_move_foreign_files">Il n\'y a pas assez d\'espace disque pour copier les fichiers sélectionnés dans le dossier %1$s. Souhaitez-vous plutôt les déplacer ?</string>
+    <string name="pass_code_enter_pass_code">Veuillez saisir votre code de sécurité</string>
+    
     <string name="pass_code_configure_your_pass_code">Saisissez votre code de sécurité</string>
     <string name="pass_code_configure_your_pass_code_explanation">Le code de sécurité sera demandé à chaque ouverture de l\'application</string>
     <string name="pass_code_reenter_your_pass_code">Veuillez saisir de nouveau votre code de sécurité</string>
@@ -253,6 +258,7 @@ La suppression est irréversible. </string>
     <string name="filename_empty">Le nom du fichier ne peut pas être vide</string>
     <string name="wait_a_moment">Veuillez patienter</string>
     <string name="wait_checking_credentials">Vérification des identifiants enregistrés</string>
+    <string name="filedisplay_unexpected_bad_get_content">Problème inattendu ; veuillez sélectionner le fichier depuis une autre application</string>
     <string name="filedisplay_no_file_selected">Aucun fichier n\'était sélectionné</string>
     <string name="activity_chooser_title">Envoyer le lien vers…</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copie du fichier depuis le stockage privé</string>
@@ -335,6 +341,9 @@ La suppression est irréversible. </string>
     <string name="error_cant_bind_to_operations_service">Erreur critique : impossible de réaliser les opérations</string>
 
     <string name="network_error_socket_exception">Une erreur est survenue pendant la connexion au serveur.</string>
+    <string name="network_error_socket_timeout_exception">Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée</string>
+    <string name="network_error_connect_timeout_exception">Une erreur est survenue pendant l\'attente du serveur. L\'opération n\'a pas pu être effectuée</string>
+    <string name="network_host_not_available">L\'opération n\'a pas pu être terminée, le serveur n\'est pas disponible</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Vous n\'avez pas la permission %s</string>

+ 8 - 0
res/values-hu-rHU/strings.xml

@@ -70,6 +70,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Kilépés</string>
     <string name="uploader_error_title_no_file_to_upload">Nincs feltölthető fájl</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s nem tudja feltölteni a szövegrészt fájlként.</string>
+    <string name="uploader_error_message_no_file_to_upload">A letöltött adat nem tartalmazott érvényes fájlt.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Fájlt nem lehet feltölteni</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s nem olvashatja a fogadott fáljt</string>
     <string name="uploader_error_message_source_file_not_found">A feltöltendő fálj nem található a helyén. Kérem ellenőrizze, hogy a fájl létezik-e?</string>
@@ -155,6 +156,7 @@
     <string name="downloader_download_failed_credentials_error">Letöltés hiba, újra be kell jelentkeznie</string>
     <string name="common_choose_account">Válasszon azonosítót</string>
     <string name="sync_fail_ticker">Sziknronizálás hiba</string>
+    <string name="sync_fail_ticker_unauthorized">Szinkronizálás sikertelen; újra be kell jelentkezned</string>
     <string name="sync_fail_content">A %1$s szinkronizálása nem fejezhető be</string>
     <string name="sync_fail_content_unauthorized">Érvénytelen jelszó a következőhöz %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Ütközések vannak</string>
@@ -171,6 +173,8 @@
     <string name="foreign_files_local_text">Helyi: %1$s</string>
     <string name="foreign_files_remote_text">Távoli: %1$s</string>
     <string name="upload_query_move_foreign_files">Nincs elég hely ahhoz, hogy a kiválasztott fájlokat átmásoljuk a %1$s mappába. Ezért ehelyett áthelyezzük inkább ide a fájlokat? </string>
+    <string name="pass_code_enter_pass_code">Kérlek add meg a számkódot</string>
+    
     <string name="pass_code_configure_your_pass_code">Írd be a számkódodat</string>
     <string name="pass_code_configure_your_pass_code_explanation">A számkódra minden alkalommal szükség lesz az alkalmazás indításakor</string>
     <string name="pass_code_reenter_your_pass_code">Kérlek add meg újra a számkódot</string>
@@ -253,6 +257,7 @@
     <string name="filename_empty">A fájl név nem lehet üres</string>
     <string name="wait_a_moment">Egy pillanat...</string>
     <string name="wait_checking_credentials">Tárolt azonosítók ellenőrzése</string>
+    <string name="filedisplay_unexpected_bad_get_content">Váratlan probléma; kérlek válassz fájlt egy másik alkalmazásból</string>
     <string name="filedisplay_no_file_selected">Egy fájl sincs kiválasztva</string>
     <string name="activity_chooser_title">Hivatkozás küldése ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Fájl átmásolása a privát tárolóról</string>
@@ -335,6 +340,9 @@
     <string name="error_cant_bind_to_operations_service">Végzetes hiba: nem lehet végrehajtani a műveleteket</string>
 
     <string name="network_error_socket_exception">Hiba történt a szerverhez való csatlakozás közben.</string>
+    <string name="network_error_socket_timeout_exception">Hiba történt a szerverre várás közben; a művelet nem lesz befejezve</string>
+    <string name="network_error_connect_timeout_exception">Hiba történt a szerverre várás közben; a művelet nem lesz befejezve</string>
+    <string name="network_host_not_available">A művelet nem lesz befejezve; a szerver nem érhető el</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Nincs jogosultságod ehhez: %s</string>

+ 8 - 0
res/values-id/strings.xml

@@ -58,6 +58,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Keluar</string>
     <string name="uploader_error_title_no_file_to_upload">Tidak ada berkas untuk diunggah</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s tidak dapat mengunggah teks sebagai berkas.</string>
+    <string name="uploader_error_message_no_file_to_upload">Data yang diterima tidak mengandung berkas yang valid.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Berkas tidak dapat diunggah</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s tidak diizinkan untuk membaca berkas yang diterima</string>
     <string name="uploader_error_message_source_file_not_found">Berkas untuk diunggah tidak ditemukan. Silakan cek apabila berkasnya ada.</string>
@@ -138,6 +139,7 @@
     <string name="downloader_download_failed_credentials_error">Pengunduhan gagal, mohon log masuk lagi</string>
     <string name="common_choose_account">Pilih akun</string>
     <string name="sync_fail_ticker">Sinkron gagal</string>
+    <string name="sync_fail_ticker_unauthorized">Sinkronisasi gagal, mohon log masuk lagi</string>
     <string name="sync_fail_content">Sinkronisasi %1$s tidak dapat diselesaikan</string>
     <string name="sync_fail_content_unauthorized">Sandi salah untuk %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Konflik ditemukan</string>
@@ -154,6 +156,8 @@
     <string name="foreign_files_local_text">Lokal: %1$s</string>
     <string name="foreign_files_remote_text">Remote: %1$s</string>
     <string name="upload_query_move_foreign_files">Ruang tidak cukup untuk menyalin berkas terpilih ke folder %1$s. Apakah Anda ingin memindahkannya saja?</string>
+    <string name="pass_code_enter_pass_code">Masukkan kode kunci Anda</string>
+    
     <string name="pass_code_configure_your_pass_code">Masukkan kode sandi Anda</string>
     <string name="pass_code_configure_your_pass_code_explanation">Kode sandi akan diminta setiap kali apl dijalankan.</string>
     <string name="pass_code_reenter_your_pass_code">Masukkan lagi kode kunci Anda</string>
@@ -237,6 +241,7 @@
     <string name="filename_empty">Nama berkas tidak boleh kosong</string>
     <string name="wait_a_moment">Tunggu sebentar</string>
     <string name="wait_checking_credentials">Mengecek kredensial yang tersimpan</string>
+    <string name="filedisplay_unexpected_bad_get_content">Masalah tidak terduga, silahkan pilih berkas dari apl yang berbeda</string>
     <string name="filedisplay_no_file_selected">Tidak ada berkas yang terpilih</string>
     <string name="activity_chooser_title">Kirim taukan ke</string>
     <string name="wait_for_tmp_copy_from_private_storage">Menyalin berkas dari penyimpanan pribadi</string>
@@ -318,6 +323,9 @@
     <string name="error_cant_bind_to_operations_service">Kesalahan fatal: tidak dapat melakukan operasi</string>
 
     <string name="network_error_socket_exception">Terjadi kesalahan saat menghubungkan dengan server.</string>
+    <string name="network_error_socket_timeout_exception">Terjadi kesalahan saat menunggu balasan server, operasi tidak dapat diselesaikan</string>
+    <string name="network_error_connect_timeout_exception">Terjadi kesalahan saat menunggu balasan server, operasi tidak dapat diselesaikan</string>
+    <string name="network_host_not_available">Operasi tidak dapat diselesaikan, server tidak tersedia</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Anda tidak memiliki izin %s</string>

+ 8 - 0
res/values-it/strings.xml

@@ -69,6 +69,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Esci</string>
     <string name="uploader_error_title_no_file_to_upload">Nessun file da caricare</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s non può  caricare un pezzo di testo come un file.</string>
+    <string name="uploader_error_message_no_file_to_upload">I dati ricevuti non includono alcun file valido.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Il file non può essere caricato</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s non ha il permesso di leggere un file ricevuto</string>
     <string name="uploader_error_message_source_file_not_found">Il file da caricare non è stato trovato nella sua posizione. Controlla che il file esista.</string>
@@ -154,6 +155,7 @@
     <string name="downloader_download_failed_credentials_error">Scaricamento non riuscito, devi effettuare nuovamente l\'accesso</string>
     <string name="common_choose_account">Scegli account</string>
     <string name="sync_fail_ticker">Sincronizzazione non riuscita</string>
+    <string name="sync_fail_ticker_unauthorized">Sincronizzazione non riuscita, devi ripetere l\'accesso</string>
     <string name="sync_fail_content">La sincronizzazione di %1$s non può essere completata</string>
     <string name="sync_fail_content_unauthorized">Password non valida per %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Conflitti rilevati</string>
@@ -170,6 +172,8 @@
     <string name="foreign_files_local_text">Locale: %1$s</string>
     <string name="foreign_files_remote_text">Remoto %1$s</string>
     <string name="upload_query_move_foreign_files">Non c\'è spazio sufficiente per copiare i file selezionati nella cartella %1$s. Vuoi invece spostarli?</string>
+    <string name="pass_code_enter_pass_code">Digita il tuo codice segreto</string>
+    
     <string name="pass_code_configure_your_pass_code">Digita il tuo codice segreto</string>
     <string name="pass_code_configure_your_pass_code_explanation">Il codice segreto sarà richiesto ogni volta che l\'applicazione è avviata</string>
     <string name="pass_code_reenter_your_pass_code">Digita nuovamente il codice segreto</string>
@@ -253,6 +257,7 @@
     <string name="filename_empty">Il nome del file non può essere vuoto</string>
     <string name="wait_a_moment">Attendi</string>
     <string name="wait_checking_credentials">Controllo delle credenziali memorizzate</string>
+    <string name="filedisplay_unexpected_bad_get_content">Problema inatteso; prova un\'altra applicazione per selezionare il file</string>
     <string name="filedisplay_no_file_selected">Non è stato selezionato alcun file</string>
     <string name="activity_chooser_title">Invia collegamento a...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copia file dall\'archiviazione privata</string>
@@ -336,6 +341,9 @@
     <string name="error_cant_bind_to_operations_service">Errore grave: impossibile eseguire le operazioni</string>
 
     <string name="network_error_socket_exception">Si è verificato un errore durante la connessione al server.</string>
+    <string name="network_error_socket_timeout_exception">Si è verificato un errore in attesa della risposta del server, l\'operazione non è stata completata</string>
+    <string name="network_error_connect_timeout_exception">Si è verificato un errore in attesa della risposta del server, l\'operazione non è stata completata</string>
+    <string name="network_host_not_available">L\'operazione non è stata completata, il server non è disponibile</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Non hai i permessi %s</string>

+ 8 - 0
res/values-nb-rNO/strings.xml

@@ -68,6 +68,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Avslutt</string>
     <string name="uploader_error_title_no_file_to_upload">Ingen fil å laste opp</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s kan ikke laste opp tekst som en fil.</string>
+    <string name="uploader_error_message_no_file_to_upload">Mottatte data inneholder ingen gyldig fil.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Filen kan ikke lastes opp</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s er har ikke tilgang til å se mottatt fil</string>
     <string name="uploader_error_message_source_file_not_found">Filen som skulle lastes opp ble ikke funnet der den skulle være. Vennligst sjekk at filen finnes.</string>
@@ -153,6 +154,7 @@
     <string name="downloader_download_failed_credentials_error">Nedlasting feilet, du må logge inn på nytt</string>
     <string name="common_choose_account">Velg konto</string>
     <string name="sync_fail_ticker">Synkronisering feilet</string>
+    <string name="sync_fail_ticker_unauthorized">Synkronisering feilet, du må logge inn på nytt</string>
     <string name="sync_fail_content">Synkronisering av %1$s kunne ikke fullføres</string>
     <string name="sync_fail_content_unauthorized">Ugyldig passord for %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Konflikter funnet</string>
@@ -169,6 +171,8 @@
     <string name="foreign_files_local_text">Lokal: %1$s</string>
     <string name="foreign_files_remote_text">Ekstern: %1$s</string>
     <string name="upload_query_move_foreign_files">Det er ikke nok plass til å kopiere de valgte filene inn i mappen %1$s. Vil du flytte dem i stedet? </string>
+    <string name="pass_code_enter_pass_code">Sett inn passordet ditt</string>
+    
     <string name="pass_code_configure_your_pass_code">Skriv inn passordet ditt</string>
     <string name="pass_code_configure_your_pass_code_explanation">Passordet vil bli krevd hver gang appen startes</string>
     <string name="pass_code_reenter_your_pass_code">Skriv inn passordet på nytt</string>
@@ -252,6 +256,7 @@
     <string name="filename_empty">Filnavn kan ikke være tomt</string>
     <string name="wait_a_moment">Vent et øyeblikk</string>
     <string name="wait_checking_credentials">Sjekker lagrede påloggingsdetaljer</string>
+    <string name="filedisplay_unexpected_bad_get_content">Uventet problem; vennligst velg filen fra en annen applikasjon</string>
     <string name="filedisplay_no_file_selected">Ingen fil ble valgt</string>
     <string name="activity_chooser_title">Send lenke til ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopierer fil fra privat lager</string>
@@ -335,6 +340,9 @@
     <string name="error_cant_bind_to_operations_service">Kritisk feil: kan ikke utføre operasjonene</string>
 
     <string name="network_error_socket_exception">En feil oppstod ved oppretting av forbindelse til tjeneren.</string>
+    <string name="network_error_socket_timeout_exception">En feil oppstod ved venting på svar fra tjeneren. Operasjonen kunne ikke utføres</string>
+    <string name="network_error_connect_timeout_exception">En feil oppstod ved venting på svar fra tjeneren. Operasjonen kunne ikke utføres</string>
+    <string name="network_host_not_available">Operasjonen kunne ikke fullføres. Tjeneren er utilgjengelig</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Du har ikke tillatelse til %s</string>

+ 8 - 0
res/values-nl/strings.xml

@@ -70,6 +70,7 @@ Download hier: %2$s</string>
     <string name="uploader_wrn_no_account_quit_btn_text">Afsluiten</string>
     <string name="uploader_error_title_no_file_to_upload">Niets te uploaden</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s kan niet een stuk tekst als bestand uploaden.</string>
+    <string name="uploader_error_message_no_file_to_upload">Ontvangen data bevat geen geldig bestand.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Bestand kan niet worden geüpload</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s is niet toegestaan om een ontvangen bestand te lezen</string>
     <string name="uploader_error_message_source_file_not_found">Het te uploaden bestand is hier niet. Controleer of het bestand wel bestaat.</string>
@@ -155,6 +156,7 @@ Download hier: %2$s</string>
     <string name="downloader_download_failed_credentials_error">Download mislukt, u moet opnieuw inloggen</string>
     <string name="common_choose_account">Kies account</string>
     <string name="sync_fail_ticker">Sync mislukt</string>
+    <string name="sync_fail_ticker_unauthorized">Synchronisatie mislukt, je moet opnieuw inloggen</string>
     <string name="sync_fail_content">Synchronisatie van %1$s kon niet worden voltooid</string>
     <string name="sync_fail_content_unauthorized">Ongeldig wachtwoord voor %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Conflicten gevonden</string>
@@ -173,6 +175,8 @@ Hieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar
     <string name="foreign_files_local_text">Lokaal: %1$s</string>
     <string name="foreign_files_remote_text">Extern: %1$s</string>
     <string name="upload_query_move_foreign_files">Er is niet genoeg ruimte om de geselecteerde bestanden te kopieren naar %1$s. Wilt u ze in plaats daarvan verplaatsen? </string>
+    <string name="pass_code_enter_pass_code">Voer je toegangscode in</string>
+    
     <string name="pass_code_configure_your_pass_code">Invoeren toegangscode</string>
     <string name="pass_code_configure_your_pass_code_explanation">De toegangscode wordt elke keer gevraagd bij opstarten van de app</string>
     <string name="pass_code_reenter_your_pass_code">Voer nogmaals je toegangscodein</string>
@@ -256,6 +260,7 @@ Hieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar
     <string name="filename_empty">Bestandsnaam mag niet leeg zijn</string>
     <string name="wait_a_moment">Even geduld</string>
     <string name="wait_checking_credentials">Opgeslagen inloggegevens nakijken</string>
+    <string name="filedisplay_unexpected_bad_get_content">Onverwacht probleem; probeer een andere app om het bestand te selecteren</string>
     <string name="filedisplay_no_file_selected">Er werd geen bestand geselecteerd</string>
     <string name="activity_chooser_title">Verstuur link naar ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopiëren bestand vanaf privéopslag</string>
@@ -339,6 +344,9 @@ Hieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar
     <string name="error_cant_bind_to_operations_service">Kritieke fout: kan de acties niet uitvoeren</string>
 
     <string name="network_error_socket_exception">Er trad een fout op bij het verbinden met de server.</string>
+    <string name="network_error_socket_timeout_exception">Er trad een fout op bij het wachten op de server, de verwerking kon niet plaatsvinden</string>
+    <string name="network_error_connect_timeout_exception">Er trad een fout op bij het wachten op de server, de verwerking kon niet plaatsvinden</string>
+    <string name="network_host_not_available">De verwerking kon niet plaatsvinden, de server is niet beschikbaar</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Je mist autorisatie %s</string>

+ 8 - 0
res/values-pl/strings.xml

@@ -69,6 +69,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Wyjdź</string>
     <string name="uploader_error_title_no_file_to_upload">Brak plików do przesłania</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s: Nie można przesłać części tekstu jako pliku.</string>
+    <string name="uploader_error_message_no_file_to_upload">Odebrane dane nie zawierają jakiegokolwiek prawidłowego pliku.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Plik nie może być przesłany</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s jest nieautoryzowany do odczytu odebranego pliku</string>
     <string name="uploader_error_message_source_file_not_found">Plik do wysłania nie został znaleziony w swojej własnej lokalizacji. Proszę sprawdzić, czy w ogóle istnieje.</string>
@@ -154,6 +155,7 @@
     <string name="downloader_download_failed_credentials_error">Błąd podczas pobierania, zaloguj się ponownie</string>
     <string name="common_choose_account">Wybierz konto</string>
     <string name="sync_fail_ticker">Nieudana synchronizacja </string>
+    <string name="sync_fail_ticker_unauthorized">Nieudana synchronizacja, zaloguj się ponownie</string>
     <string name="sync_fail_content">Nie udało się zakończyć synchronizacji %1$s</string>
     <string name="sync_fail_content_unauthorized">Niepoprawne hasło dla %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Znaleziono konflikty</string>
@@ -170,6 +172,8 @@
     <string name="foreign_files_local_text">Lokalnie: %1$s</string>
     <string name="foreign_files_remote_text">Zdalnie: %1$s</string>
     <string name="upload_query_move_foreign_files">Nie ma wystarczającej ilości wolnej przestrzeni by skopiować zaznaczone pliki do folderu %1$s. Chcesz je przenieść?</string>
+    <string name="pass_code_enter_pass_code">Wymyśl kod PIN.</string>
+    
     <string name="pass_code_configure_your_pass_code">Wpisz kod PIN.</string>
     <string name="pass_code_configure_your_pass_code_explanation">Kod PIN będzie wymagany przy każdym uruchomieniu aplikacji.</string>
     <string name="pass_code_reenter_your_pass_code">Wpisz kod PIN ponownie.</string>
@@ -253,6 +257,7 @@
     <string name="filename_empty">Nazwa pliku nie może być pusta.</string>
     <string name="wait_a_moment">Poczekaj chwilę</string>
     <string name="wait_checking_credentials">Sprawdzanie danych</string>
+    <string name="filedisplay_unexpected_bad_get_content">Nieoczekiwany problem; spróbuj wybrać plik z innej aplikacji</string>
     <string name="filedisplay_no_file_selected">Nie wybrano żadnych plików</string>
     <string name="activity_chooser_title">Wyślij link do ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopiowanie pliku z prywatnego zasobu</string>
@@ -336,6 +341,9 @@
     <string name="error_cant_bind_to_operations_service">Błąd krytyczny: nie można wykonać operacji</string>
 
     <string name="network_error_socket_exception">Pojawił się błąd podczas łączenia z serwerem.</string>
+    <string name="network_error_socket_timeout_exception">Pojawił się błąd podczas oczekiwania na serwer, operacja nie mogła zostać wykonana</string>
+    <string name="network_error_connect_timeout_exception">Pojawił się błąd podczas oczekiwania na serwer, operacja nie mogła zostać wykonana</string>
+    <string name="network_host_not_available">Nie można dokończyć operacji, serwer jest niedostępny</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Nie masz uprawnień %s</string>

+ 10 - 0
res/values-pt-rBR/strings.xml

@@ -37,6 +37,8 @@
     <string name="prefs_log_title_history">Histórico de logins</string>
     <string name="prefs_log_summary_history">Mostra os registros gravados</string>
     <string name="prefs_log_delete_history_button">Excluir histórico</string>
+    <string name="prefs_calendar_contacts">Configurar a sincronização do calendário e dos contatos</string>
+    <string name="prefs_calendar_contacts_summary">Configurar o DAVdroid (v1.3.0+) para a conta em uso</string>
     <string name="prefs_calendar_contacts_address_resolve_error">O endereço do servidor da conta não pôde ser reconhecido pelo DAVdroid</string>
     <string name="prefs_calendar_contacts_no_store_error">Não há um aplicativo F-Droid ou Google Play instalado</string>
     <string name="prefs_calendar_contacts_sync_setup_successful">A sincronização do calendário e dos contatos foi configurada com sucesso</string>
@@ -66,6 +68,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Sair</string>
     <string name="uploader_error_title_no_file_to_upload">Nenhum arquivo para envio</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s não pode enviar um pedaço de texto como um arquivo.</string>
+    <string name="uploader_error_message_no_file_to_upload">Os dados recebidos não incluem qualquer arquivo válido.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">O arquivo não pode ser enviado</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s não tem permissão para ler um arquivo recebido</string>
     <string name="uploader_error_message_source_file_not_found">Arquivo para envio não foi encontrado em sua localização. Verifique se o arquivo existe.</string>
@@ -151,6 +154,7 @@
     <string name="downloader_download_failed_credentials_error">Falha em baixar o arquivo, você precisa se conectar novamente</string>
     <string name="common_choose_account">Escolha a conta</string>
     <string name="sync_fail_ticker">Falha na sincronização</string>
+    <string name="sync_fail_ticker_unauthorized">Falha na sincronização, você precisa se conectar novamente</string>
     <string name="sync_fail_content">A sincronização de %1$s não pode ser finalizada</string>
     <string name="sync_fail_content_unauthorized">Senha inválida para %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Conflitos encontrados</string>
@@ -167,6 +171,8 @@
     <string name="foreign_files_local_text">Local: %1$s</string>
     <string name="foreign_files_remote_text">Remoto: %1$s</string>
     <string name="upload_query_move_foreign_files">Não há espaço suficiente para copiar os arquivos selecionados para a pasta %1$s. Você gostaria de movê-los em vez disso?</string>
+    <string name="pass_code_enter_pass_code">Digite sua senha</string>
+    
     <string name="pass_code_configure_your_pass_code">Digite o código de acesso</string>
     <string name="pass_code_configure_your_pass_code_explanation">O código de acesso será solicitado toda vez que o aplicativo for iniciado</string>
     <string name="pass_code_reenter_your_pass_code">Por favor, digite sua senha novamente</string>
@@ -250,6 +256,7 @@
     <string name="filename_empty">O nome do arquivo não pode estar vazio</string>
     <string name="wait_a_moment">Aguarde um momento</string>
     <string name="wait_checking_credentials">Verificando credenciais salvas</string>
+    <string name="filedisplay_unexpected_bad_get_content">Problema inesperado; por favor, tente selecionar o arquivo com outro app</string>
     <string name="filedisplay_no_file_selected">Nenhum arquivo foi selecionado</string>
     <string name="activity_chooser_title">Enviar o link para</string>
     <string name="wait_for_tmp_copy_from_private_storage">Copiando o arquivo de armazenagem privada</string>
@@ -333,6 +340,9 @@
     <string name="error_cant_bind_to_operations_service">Erro crítico: não pode executar operações</string>
 
     <string name="network_error_socket_exception">Ocorreu um erro durante a conexão com o servidor.</string>
+    <string name="network_error_socket_timeout_exception">Ocorreu um erro enquanto se espera pelo servidor, a operação não poderia ter sido executada</string>
+    <string name="network_error_connect_timeout_exception">Ocorreu um erro enquanto se espera pelo servidor, a operação não poderia ter sido executada</string>
+    <string name="network_host_not_available">A operação não pôde ser concluída, o servidor está indisponível</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Você não tem premissão %s</string>

+ 0 - 148
res/values-ru-rRU/strings.xml

@@ -1,148 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<resources>
-  <string name="actionbar_sync">Обновить</string>
-  <string name="actionbar_upload">Загрузка</string>
-  <string name="actionbar_upload_from_apps">Содержимое из других приложений</string>
-  <string name="actionbar_upload_files">Файлы</string>
-  <string name="actionbar_mkdir">Создать директорию</string>
-  <string name="actionbar_settings">Настройки</string>
-  <string name="actionbar_see_details">Сведения</string>
-  <string name="prefs_category_general">Общие</string>
-  <string name="prefs_category_more">Подробнее</string>
-  <string name="prefs_accounts">Учетные записи</string>
-  <string name="prefs_manage_accounts">Управление учетными записями</string>
-  <string name="prefs_pincode">App PIN</string>
-  <string name="prefs_pincode_summary">Защитить Ваш клиент</string>
-  <string name="prefs_instant_upload">Включить немедленную загрузку</string>
-  <string name="prefs_instant_upload_summary">Мгновенно загрузить фотографии, сделанные камерой</string>
-  <string name="prefs_help">Помощь</string>
-  <string name="auth_username">Имя пользователя</string>
-  <string name="auth_password">Пароль</string>
-  <string name="auth_register">Я новичок в %1$s</string>
-  <string name="sync_string_files">Файлы</string>
-  <string name="setup_btn_connect">Подключить</string>
-  <string name="uploader_btn_upload_text">Загрузка</string>
-  <string name="uploader_wrn_no_account_title">Не найден аккаунт</string>
-  <string name="uploader_wrn_no_account_text">На Вашем устройстве нет %1$s-аккаунтов. Пожалуйста, настройте учетную запись.</string>
-  <string name="uploader_wrn_no_account_setup_btn_text">Установка</string>
-  <string name="uploader_wrn_no_account_quit_btn_text">Выход</string>
-  <string name="uploader_wrn_no_content_title">Нет содержимого для загрузки</string>
-  <string name="uploader_wrn_no_content_text">Содержимое не было получено. Нечего загружать.</string>
-  <string name="uploader_error_forbidden_content">%1$s не разрешен доступ к общему содержимому</string>
-  <string name="uploader_info_uploading">Загрузка</string>
-  <string name="file_list_empty">В этой папке нет файлов.\nНовые файлы могут быть добавлены с помощью опции \"Загрузка\" в меню.</string>
-  <string name="filedetails_select_file">Нажмите на файл, чтобы увидеть дополнительную информацию.</string>
-  <string name="filedetails_size">Размер:</string>
-  <string name="filedetails_type">Тип:</string>
-  <string name="filedetails_created">Создано:</string>
-  <string name="filedetails_modified">Модифицировано:</string>
-  <string name="filedetails_download">Загрузка</string>
-  <string name="filedetails_sync_file">Обновить</string>
-  <string name="filedetails_renamed_in_upload_msg">Файл был переименован в %1$s во время загрузки</string>
-  <string name="common_yes">Да</string>
-  <string name="common_no">Нет</string>
-  <string name="common_ok">OK</string>
-  <string name="common_cancel_download">Отменить загрузку</string>
-  <string name="common_cancel_upload">Отмена загрузки</string>
-  <string name="common_cancel">Отмена</string>
-  <string name="common_save_exit">Сохранить &amp; Выход</string>
-  <string name="common_error">Ошибка</string>
-  <string name="about_title">О программе</string>
-  <string name="delete_account">Удалить аккаунт</string>
-  <string name="create_account">Создать аккаунт</string>
-  <string name="upload_chooser_title">Загрузить из...</string>
-  <string name="uploader_info_dirname">Имя каталога</string>
-  <string name="uploader_upload_in_progress_ticker">Загрузка …</string>
-  <string name="uploader_upload_in_progress_content">%1$d%% Загрузка %2$s</string>
-  <string name="uploader_upload_succeeded_ticker">Загрузка выполнена успешно</string>
-  <string name="uploader_upload_succeeded_content_single">%1$s был успешно загружен</string>
-  <string name="uploader_upload_failed_ticker">Загрузка не удалась</string>
-  <string name="uploader_upload_failed_content_single">Загрузка %1$s не может быть завершена</string>
-  <string name="downloader_download_in_progress_ticker">Загрузка …</string>
-  <string name="downloader_download_in_progress_content">%1$d%% Загрузка %2$s</string>
-  <string name="downloader_download_succeeded_ticker">Загрузка выполнена успешно</string>
-  <string name="downloader_download_succeeded_content">%1$s был успешно загружен</string>
-  <string name="downloader_download_failed_ticker">Загрузка не удалась</string>
-  <string name="downloader_download_failed_content">Загрузка %1$s не может быть завершена</string>
-  <string name="common_choose_account">Выбрать аккаунт</string>
-  <string name="sync_fail_ticker">Ошибка синхронизации</string>
-  <string name="sync_fail_content">Синхронизация %1$s не может быть завершена</string>
-  <string name="sync_conflicts_in_favourites_ticker">Найдены конфликты</string>
-  <string name="sync_conflicts_in_favourites_content">%1$d файлы, подлежащие синхронизации, не могут быть синхронизированы</string>
-  <string name="sync_fail_in_favourites_ticker">Синхронизация файлов не удалась</string>
-  <string name="sync_fail_in_favourites_content">Содержимое %1$d файлов не может быть синхронизировано (%2$d конфликты)</string>
-  <string name="pincode_enter_pin_code">Пожалуйста, введите Ваш PIN-код приложения</string>
-  <string name="pincode_configure_your_pin">Введите PIN-код приложения</string>
-  <string name="pincode_configure_your_pin_explanation">PIN будет запрашиваться каждый раз при запуске приложения</string>
-  <string name="pincode_reenter_your_pincode">Повторно введите PIN-код приложения, пожалуйста</string>
-  <string name="pincode_remove_your_pincode">Удалите PIN-код приложения</string>
-  <string name="pincode_mismatch">PIN-коды приложения не идентичны</string>
-  <string name="pincode_wrong">Неверный PIN-код приложения</string>
-  <string name="pincode_removed">PIN-код приложения удален</string>
-  <string name="pincode_stored">PIN-код приложения сохранен</string>
-  <string name="auth_trying_to_login">Попытка входа ...</string>
-  <string name="auth_no_net_conn_title">Нет подключения к сети</string>
-  <string name="auth_nossl_plain_ok_title">Защищенное соединение недоступно.</string>
-  <string name="auth_connection_established">Соединение установлено</string>
-  <string name="auth_testing_connection">Тестирование соединения…</string>
-  <string name="auth_not_configured_title">Некорректная сервер-конфигурация</string>
-  <string name="auth_unknown_error_title">Произошла неизвестная ошибка!</string>
-  <string name="auth_unknown_host_title">Не удалось найти хост</string>
-  <string name="auth_incorrect_path_title">сервер не найден</string>
-  <string name="auth_timeout_title">Ответ сервера занимает слишком много времени</string>
-  <string name="auth_incorrect_address_title">Адрес URL неверен</string>
-  <string name="auth_ssl_general_error_title">SSL-инициализация не удалась</string>
-  <string name="auth_bad_oc_version_title">Неизвестная версия сервера сервер </string>
-  <string name="auth_wrong_connection_title">Не удалось установить соединение</string>
-  <string name="auth_secure_connection">Защищенное соединение установлено</string>
-  <string name="auth_unauthorized">Неверный логин / пароль</string>
-  <string name="fd_keep_in_sync">Обновлять файл</string>
-  <string name="common_rename">Переименовать</string>
-  <string name="common_remove">Удалить</string>
-  <string name="confirmation_remove_alert">Вы действительно хотите удалить %1$s?</string>
-  <string name="confirmation_remove_folder_alert">Вы действительно хотите удалить %1$s и все содержимое ?</string>
-  <string name="confirmation_remove_local">Только локально</string>
-  <string name="confirmation_remove_folder_local">Только локальное содержимое</string>
-  <string name="confirmation_remove_remote">Удалить с сервера</string>
-  <string name="confirmation_remove_remote_and_local">Оба, удаленный и локальный</string>
-  <string name="remove_success_msg">Успешное удаление</string>
-  <string name="remove_fail_msg">Удаление не может быть завершено</string>
-  <string name="rename_dialog_title">Введите новое имя</string>
-  <string name="rename_local_fail_msg">Локальная копия не может быть переименована; попробуйте другое новое имя</string>
-  <string name="rename_server_fail_msg">Переименование не может быть завершено</string>
-  <string name="sync_file_fail_msg">Удаленный файл не может быть проверен</string>
-  <string name="sync_file_nothing_to_do_msg">Содержимое файла уже синхронизировано</string>
-  <string name="create_dir_fail_msg">Каталог не может быть создан</string>
-  <string name="wait_a_moment">Подождите</string>
-  <string name="filedisplay_unexpected_bad_get_content">Неожиданная проблема; пожалуйста, попробуйте другое приложение для выбора файла</string>
-  <string name="filedisplay_no_file_selected">Файл не был выбран</string>
-  <string name="ssl_validator_header">Идентификация сайта не может быть проверена</string>
-  <string name="ssl_validator_reason_cert_not_trusted">- Сертификат сервера недостоверен</string>
-  <string name="ssl_validator_reason_cert_expired">- Сертификат сервера истек</string>
-  <string name="ssl_validator_reason_cert_not_yet_valid">- Сертификат сервера еще не действителен</string>
-  <string name="ssl_validator_reason_hostname_not_verified">- URL не соответствует имени хоста в сертификате</string>
-  <string name="ssl_validator_question">Хотите объявить этот сертификат надежным в любом случае?</string>
-  <string name="ssl_validator_not_saved">Этот сертификат не может быть сохранен</string>
-  <string name="ssl_validator_btn_details_see">Сведения</string>
-  <string name="ssl_validator_btn_details_hide">Скрыть</string>
-  <string name="ssl_validator_label_subject">Выдано для:</string>
-  <string name="ssl_validator_label_issuer">Выдал:</string>
-  <string name="ssl_validator_label_CN">Общее имя:</string>
-  <string name="ssl_validator_label_O">Организация:</string>
-  <string name="ssl_validator_label_OU">Организационное подразделение:</string>
-  <string name="ssl_validator_label_C">Страна:</string>
-  <string name="ssl_validator_label_ST">Состояние:</string>
-  <string name="ssl_validator_label_L">Расположение:</string>
-  <string name="ssl_validator_label_validity">Срок действия:</string>
-  <string name="ssl_validator_label_validity_from">От:</string>
-  <string name="ssl_validator_label_validity_to">Для:</string>
-  <string name="ssl_validator_label_signature">Подпись:</string>
-  <string name="ssl_validator_label_signature_algorithm">Алгоритм:</string>
-  <string name="instant_upload_on_wifi">Загрузать изображения только посредством WiFi </string>
-  <string name="instant_upload_path">/НемедленнаяЗагрузка</string>
-  <string name="conflict_title">Конфликт обновления</string>
-  <string name="conflict_message">Удаленный файл %s не синхронизирован с локальным файлом. Продолжение повлечет замену содержимого файла на сервере.</string>
-  <string name="conflict_keep_both">Сохранить оба</string>
-  <string name="conflict_overwrite">Перезаписать</string>
-  <string name="conflict_dont_upload">Не загружать</string>
-</resources>

+ 8 - 0
res/values-ru/strings.xml

@@ -69,6 +69,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Выход</string>
     <string name="uploader_error_title_no_file_to_upload">Не выбран файл для загрузки</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s не может загрузить часть текста как файл.</string>
+    <string name="uploader_error_message_no_file_to_upload">Принятые данные не включают в себя никакой исправный файл.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Файл не может быть загружен</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s не позволено читать принятый файл</string>
     <string name="uploader_error_message_source_file_not_found">Файл для загрузки не был найден в положенном месте. Пожалуйста проверьте, существует ли файл.</string>
@@ -154,6 +155,7 @@
     <string name="downloader_download_failed_credentials_error">Скачивание не удалось, вам необходимо войти повторно</string>
     <string name="common_choose_account">Выберите учётную запись</string>
     <string name="sync_fail_ticker">Синхронизация не удалась</string>
+    <string name="sync_fail_ticker_unauthorized">Синхронизация не удалась, вам нужно войти повторно</string>
     <string name="sync_fail_content">Синхронизация %1$s не может быть завершена</string>
     <string name="sync_fail_content_unauthorized">Неверный пароль для %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Обнаружены конфликты</string>
@@ -170,6 +172,8 @@
     <string name="foreign_files_local_text">Локальные: %1$s</string>
     <string name="foreign_files_remote_text">Удаленные: %1$s</string>
     <string name="upload_query_move_foreign_files">Недостаточно места для копирования выбранных файлов в папку %1$s. Вы хотите их переместить?</string>
+    <string name="pass_code_enter_pass_code">Пожалуйста укажите ваш код</string>
+    
     <string name="pass_code_configure_your_pass_code">Укажите ваш код</string>
     <string name="pass_code_configure_your_pass_code_explanation">Код будет запрашиваться каждый раз при запуске приложения</string>
     <string name="pass_code_reenter_your_pass_code">Пожалуйста укажите ваш код ещё раз</string>
@@ -253,6 +257,7 @@
     <string name="filename_empty">Имя файла не может быть пустым</string>
     <string name="wait_a_moment">Подождите немного</string>
     <string name="wait_checking_credentials">Проверка сохранённых учётных данных</string>
+    <string name="filedisplay_unexpected_bad_get_content">Неизвестная ошибка; выберите этот файл из другого приложения</string>
     <string name="filedisplay_no_file_selected">Файлы не выбраны</string>
     <string name="activity_chooser_title">Отправить ссылку ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Копирование файла из частной хранилища</string>
@@ -336,6 +341,9 @@
     <string name="error_cant_bind_to_operations_service">Критическая ошибка: невозможно выполнить действия</string>
 
     <string name="network_error_socket_exception">При подключении к серверу возникла ошибка</string>
+    <string name="network_error_socket_timeout_exception">Во время ожидания сервера произошла ошибка, действие не может быть выполнено</string>
+    <string name="network_error_connect_timeout_exception">Во время ожидания сервера произошла ошибка, действие не может быть выполнено</string>
+    <string name="network_host_not_available">Действие не может быть выполнено, сервер недоступен</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">У вас нет прав %s</string>

+ 10 - 0
res/values-sl/strings.xml

@@ -37,6 +37,8 @@
     <string name="prefs_log_title_history">Zgodovina beleženja</string>
     <string name="prefs_log_summary_history">Pokaže shranjene dnevnike</string>
     <string name="prefs_log_delete_history_button">Izbriši zgodovino</string>
+    <string name="prefs_calendar_contacts">Nastavi sinhronizacijo koledarja in kontaktov</string>
+    <string name="prefs_calendar_contacts_summary">Nastavi DAVdroid (v1.3.0+) za trenutno uporabljen račun</string>
     <string name="prefs_calendar_contacts_address_resolve_error">Naslov strežnika za račun ne more biti razrešena za DAVdroid</string>
     <string name="prefs_calendar_contacts_no_store_error">Ne Google Play, ne F-Droid nista nameščena</string>
     <string name="prefs_calendar_contacts_sync_setup_successful">Sinhronizacija koledarja in kontaktov uspešno nastavljena</string>
@@ -66,6 +68,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Končaj</string>
     <string name="uploader_error_title_no_file_to_upload">Ni izbrane datoteke za pošiljanje</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s nima ustreznih dovoljenj za pošiljanje dela besedila kot datoteko.</string>
+    <string name="uploader_error_message_no_file_to_upload">Prejeti podatki ne vključujejo nobene veljavne datoteke.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Datoteke ni mogoče poslati</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s nima ustreznih dovoljen za prejemanje datoteke</string>
     <string name="uploader_error_message_source_file_not_found">Datoteke za pošiljanje ni mogoče najti na določenem mestu. Preverite, ali datoteka obstaja.</string>
@@ -151,6 +154,7 @@
     <string name="downloader_download_failed_credentials_error">Prejemanje je spodletelo. Zahtevana je ponovna prijava.</string>
     <string name="common_choose_account">Izbor računa</string>
     <string name="sync_fail_ticker">Usklajevanje je spodletelo</string>
+    <string name="sync_fail_ticker_unauthorized">Usklajevanje je spodletelo. Zahtevana je ponovna prijava.</string>
     <string name="sync_fail_content">Usklajevanja %1$s ni mogoče končati</string>
     <string name="sync_fail_content_unauthorized">Neveljavno geslo za %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Zaznani spori</string>
@@ -167,6 +171,8 @@
     <string name="foreign_files_local_text">Krajevno: %1$s</string>
     <string name="foreign_files_remote_text">Oddaljeno: %1$s</string>
     <string name="upload_query_move_foreign_files">Ni dovolj prostora za kopiranje izbranih datotek v mapo %1$s. Ali želite datoteke premakniti na novo mesto?</string>
+    <string name="pass_code_enter_pass_code">Vnesite kodo PIN</string>
+    
     <string name="pass_code_configure_your_pass_code">Vnesite kodo PIN programa</string>
     <string name="pass_code_configure_your_pass_code_explanation">Koda bo zahtevana vsakič pred zagonom programa.</string>
     <string name="pass_code_reenter_your_pass_code">Ponovno vnesite kodo PIN</string>
@@ -250,6 +256,7 @@
     <string name="filename_empty">Ime datoteke ne sme biti prazno</string>
     <string name="wait_a_moment">Počakajte trenutek ...</string>
     <string name="wait_checking_credentials">Poteka preverjanje shranjenih poveril</string>
+    <string name="filedisplay_unexpected_bad_get_content">Prišlo je do nepričakovane napake. Poskusite datoteko izbrati z drugim programom.</string>
     <string name="filedisplay_no_file_selected">Ni izbranih datotek</string>
     <string name="activity_chooser_title">Pošlji povezavo ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopiranje datoteke iz zasebne shrambe</string>
@@ -333,6 +340,9 @@
     <string name="error_cant_bind_to_operations_service">Kritična napaka: opravil ni možno izvesti</string>
 
     <string name="network_error_socket_exception">Med povezovanjem s strežnikom je prišlo do napake.</string>
+    <string name="network_error_socket_timeout_exception">Med čakanjem na vzpostavitev povezave s strežnikom je prišlo do napake. Zahtevanega dejanja ni mogoče izvesti.</string>
+    <string name="network_error_connect_timeout_exception">Med čakanjem na vzpostavitev povezave s strežnikom je prišlo do napake. Zahtevanega dejanja ni bilo mogoče končati.</string>
+    <string name="network_host_not_available">Zahtevanega dejanja ni bilo mogoče končati. Strežnik ni dosegljiv.</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Ni ustreznega dovoljenja %s</string>

+ 8 - 0
res/values-sq/strings.xml

@@ -66,6 +66,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Dilni</string>
     <string name="uploader_error_title_no_file_to_upload">Pa kartelë për ngarkim</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s s’mund të ngarkojë një copë teksti si të ish një kartelë.</string>
+    <string name="uploader_error_message_no_file_to_upload">Të dhënat e marra nuk përfshijnë ndonjë kartelë të vlefshme.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Kartela s’mund të ngarkohet</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s s’është lejuar të lexojë një kartelë të marrë</string>
     <string name="uploader_error_message_source_file_not_found">Kartela për ngarkim s’u gjet te vendi i saj. Ju lutemi, shihni nëse ekziston apo jo kartela.</string>
@@ -151,6 +152,7 @@
     <string name="downloader_download_failed_credentials_error">Shkarkimi dështoi, lypset të bëni hyrjen sërish</string>
     <string name="common_choose_account">Zgjidhni llogari</string>
     <string name="sync_fail_ticker">Njëkohësimi dështoi</string>
+    <string name="sync_fail_ticker_unauthorized">Njëkohësimi dështoi, lypset të ribëni hyrjen</string>
     <string name="sync_fail_content">Njëkohësimi i %1$s s’u plotësua dot</string>
     <string name="sync_fail_content_unauthorized">Fjalëkalim i pavlefshëm për %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">U hasën përplasje</string>
@@ -167,6 +169,8 @@
     <string name="foreign_files_local_text">Vendore: %1$s</string>
     <string name="foreign_files_remote_text">E largët: %1$s</string>
     <string name="upload_query_move_foreign_files">S’ka hapësirë të mjaftueshme për kopjim të kartelave të përzgjedhura te dosja %1$s. Do të donit t’i lëviznit më mirë? </string>
+    <string name="pass_code_enter_pass_code">Ju lutemi, futni kodkalimin tuaj</string>
+    
     <string name="pass_code_configure_your_pass_code">Jepni kodkalimin tuaj</string>
     <string name="pass_code_configure_your_pass_code_explanation">Kodkalimi do të kërkohet sa herë që niset aplikacioni</string>
     <string name="pass_code_reenter_your_pass_code">Ju lutemi, rifutni kodkalimin tuaj</string>
@@ -249,6 +253,7 @@
     <string name="filename_empty">Emri i kartelës s\’mund të jetë i zbrazët</string>
     <string name="wait_a_moment">Pritni një çast</string>
     <string name="wait_checking_credentials">Po kontrollohen kredenciale të depozituara</string>
+    <string name="filedisplay_unexpected_bad_get_content">Problem i papritur; ju lutemi, përzgjidhni një kartelë nga një aplikacion tjetër</string>
     <string name="filedisplay_no_file_selected">S\’u përzgjodh kartelë</string>
     <string name="activity_chooser_title">Dërgoni lidhje te …</string>
     <string name="wait_for_tmp_copy_from_private_storage">Po kopjohet kartelë nga depo private</string>
@@ -331,6 +336,9 @@
     <string name="error_cant_bind_to_operations_service">Gabim kritik: nuk mund të kryhen veprime</string>
 
     <string name="network_error_socket_exception">Ndodhi një gabim teksa po lidhej me shërbyesin.</string>
+    <string name="network_error_socket_timeout_exception">Ndodhi një gabim teksa po pritej për shërbyesin, veprimi s\’u krye dot</string>
+    <string name="network_error_connect_timeout_exception">Ndodhi një gabim teksa po pritej për shërbyesin, veprimi s\'u krye dot</string>
+    <string name="network_host_not_available">Veprimi s\'u plotësua dot, shërbyesi është i pakapshëm</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Nuk keni leje %s</string>

+ 11 - 1
res/values-sv/strings.xml

@@ -68,6 +68,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Avsluta</string>
     <string name="uploader_error_title_no_file_to_upload">Ingen fil att ladda upp</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s kan inte ladda upp text som en fil.</string>
+    <string name="uploader_error_message_no_file_to_upload">Mottagen data innehåller ingen giltig fil.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Fil kan inte laddas upp</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s har inte tillåtelse att läsa en mottagen fil</string>
     <string name="uploader_error_message_source_file_not_found">Filen som skulle laddas upp hittades inte på sin plats. Vänligen kontrollera att filen existerar.</string>
@@ -150,6 +151,7 @@
     <string name="downloader_download_failed_credentials_error">Nedladdningen misslyckades, du måste logga in igen</string>
     <string name="common_choose_account">Välj konto</string>
     <string name="sync_fail_ticker">Synkronisering misslyckades</string>
+    <string name="sync_fail_ticker_unauthorized">Synkronisering misslyckades, du måste logga in igen</string>
     <string name="sync_fail_content">Synkronisering av %1$s kunde inte slutföras</string>
     <string name="sync_fail_content_unauthorized">Felaktigt lösenord för %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Konflikter uppstod</string>
@@ -166,6 +168,8 @@
     <string name="foreign_files_local_text">Lokal: %1$s</string>
     <string name="foreign_files_remote_text">Fjärr: %1$s</string>
     <string name="upload_query_move_foreign_files">Det finns inte tillräckligt med utrymme för att kopiera filerna till målmappen %1$s. Vill du flytta filerna istället?</string>
+    <string name="pass_code_enter_pass_code">Var god ange ditt lösenord</string>
+    
     <string name="pass_code_configure_your_pass_code">Skriv in ditt lösenord</string>
     <string name="pass_code_configure_your_pass_code_explanation">Lösenordet kommer efterfrågas varje gång du startar appen</string>
     <string name="pass_code_reenter_your_pass_code">Var god ange ditt lösenord igen</string>
@@ -249,6 +253,7 @@
     <string name="filename_empty">Filnamnet får inte lämnas blankt</string>
     <string name="wait_a_moment">Var god vänta</string>
     <string name="wait_checking_credentials">Kontrollerar lagrade inloggningsuppgifter</string>
+    <string name="filedisplay_unexpected_bad_get_content">Oväntat problem; prova annat program för aktuell fil</string>
     <string name="filedisplay_no_file_selected">Ingen fil vald</string>
     <string name="activity_chooser_title">Sänd länk till ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Kopierar fil från privat lagring</string>
@@ -306,6 +311,7 @@
     <string name="preview_image_error_unknown_format">Denna bild kan inte visas</string>
 
     <string name="error__upload__local_file_not_copied">%1$s kunde inte kopieras till %2$s lokal mapp</string>
+    <string name="prefs_instant_upload_path_title">Uppladdningssökväg</string>
     <string name="prefs_instant_upload_path_use_subfolders_title">Använd undermappar</string>
     <string name="prefs_instant_upload_path_use_subfolders_summary">Spara i undermappar baserad på år och månad</string>
 
@@ -331,6 +337,9 @@
     <string name="error_cant_bind_to_operations_service">Kritiskt fel: kan inte utföra åtgärden</string>
 
     <string name="network_error_socket_exception">Ett fel uppstod vid anslutning till servern.</string>
+    <string name="network_error_socket_timeout_exception">Ett fel uppstod i väntan på servern, operationen kunde inte ha gjorts</string>
+    <string name="network_error_connect_timeout_exception">Ett fel uppstod i väntan på servern, operationen kunde inte ha gjorts</string>
+    <string name="network_host_not_available">Åtgärden kunte inte slutföras, servern är ej tillgänglig</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">Du har inga rättigheter %s</string>
@@ -377,7 +386,8 @@
     <string name="prefs_category_instant_uploading">Direktuppladdningar</string>
     <string name="prefs_category_details">Detaljer</string>
 
-	<string name="sync_folder_failed_content">Synkronisering av %1$s mapp kunde inte slutföras</string>
+	<string name="prefs_instant_video_upload_path_title">Sökväg för uppladdning av video</string>
+    <string name="sync_folder_failed_content">Synkronisering av %1$s mapp kunde inte slutföras</string>
 
 	<string name="shared_subject_header">delad</string>
 	<string name="with_you_subject_header">med dig</string>

+ 8 - 0
res/values-tr/strings.xml

@@ -68,6 +68,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">Çıkış</string>
     <string name="uploader_error_title_no_file_to_upload">Yüklenecek bir dosya yok</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s bir metin parçasını dosya olarak yükleyemez.</string>
+    <string name="uploader_error_message_no_file_to_upload">Alınan veride geçerli bir dosya yok.</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">Dosya yüklenemedi</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s alınan bir dosyayı okumaya yetkili değil</string>
     <string name="uploader_error_message_source_file_not_found">Karşıya yüklenecek dosya konumunda bulunamadı. Lütfen dosyanın var olduğundan emin olun.</string>
@@ -152,6 +153,7 @@
     <string name="downloader_download_failed_credentials_error">İndirme başarısız, yeniden oturum açmalısınız</string>
     <string name="common_choose_account">Hesap seçin</string>
     <string name="sync_fail_ticker">Eşitleme başarısız</string>
+    <string name="sync_fail_ticker_unauthorized">Eşitleme başarısız, tekrar oturum açmanız gerekli</string>
     <string name="sync_fail_content">%1$s eşitlemesi tamamlanamadı</string>
     <string name="sync_fail_content_unauthorized">%1$s için geçersiz parola</string>
     <string name="sync_conflicts_in_favourites_ticker">Çakışma bulundu</string>
@@ -168,6 +170,8 @@
     <string name="foreign_files_local_text">Yerel: %1$s</string>
     <string name="foreign_files_remote_text">Uzak: %1$s</string>
     <string name="upload_query_move_foreign_files">Seçili dosyaları %1$s klasörüne kopyalamak için yeterince alan yok. Bunun yerine taşımak ister misiniz?</string>
+    <string name="pass_code_enter_pass_code">Lütfen parola kodunuzu girin</string>
+    
     <string name="pass_code_configure_your_pass_code">Parola kodunuzu girin</string>
     <string name="pass_code_configure_your_pass_code_explanation">Parola kodu uygulama her başlatıldığında sorulacaktır</string>
     <string name="pass_code_reenter_your_pass_code">Lütfen parola kodunu yeniden girin</string>
@@ -251,6 +255,7 @@
     <string name="filename_empty">Dosya adı boş olamaz</string>
     <string name="wait_a_moment">Bir süre bekleyin</string>
     <string name="wait_checking_credentials">Kayıtlı kimlik bilgileri kontrol ediliyor</string>
+    <string name="filedisplay_unexpected_bad_get_content">Beklenmedik sorun; lütfen dosya seçmek için farklı bir uygulama kullanın</string>
     <string name="filedisplay_no_file_selected">Hiçbir dosya seçilmedi</string>
     <string name="activity_chooser_title">Bağlantıyı gönder ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Dosya özel depolamadan kopyalanıyor</string>
@@ -332,6 +337,9 @@
     <string name="error_cant_bind_to_operations_service">Ciddi hata: işlem gerçekleştirilemiyor</string>
 
     <string name="network_error_socket_exception">Sunucuya bağlanılırken bir hata oluştu.</string>
+    <string name="network_error_socket_timeout_exception">Sunucu beklenirken bir hata oluştu, işlem yapılamadı</string>
+    <string name="network_error_connect_timeout_exception">Sunucu beklenirken bir hata oluştu, işlem yapılamadı</string>
+    <string name="network_host_not_available">İşlem tamamlanamadı, sunucu kullanılamıyor</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">%s izniniz yok</string>

+ 10 - 0
res/values-zh-rTW/strings.xml

@@ -37,6 +37,8 @@
     <string name="prefs_log_title_history">記錄檔</string>
     <string name="prefs_log_summary_history">顯示之前的記錄檔</string>
     <string name="prefs_log_delete_history_button">刪除記錄</string>
+    <string name="prefs_calendar_contacts">設定日曆與聯絡人同步</string>
+    <string name="prefs_calendar_contacts_summary">設定目前帳號所使用的 DAVdroid (V1.3.0+)</string>
     <string name="prefs_calendar_contacts_address_resolve_error">帳號的伺服器位址無法被 DAVdroid 辨認</string>
     <string name="prefs_calendar_contacts_no_store_error">未安裝 Google Play 商店或是 F-Droid 應用程式</string>
     <string name="prefs_calendar_contacts_sync_setup_successful">成功設定日曆與聯絡人同步</string>
@@ -66,6 +68,7 @@
     <string name="uploader_wrn_no_account_quit_btn_text">離開</string>
     <string name="uploader_error_title_no_file_to_upload">沒有要上傳的檔案</string>
     <string name="uploader_error_message_received_piece_of_text">%1$s 上傳一段文字儲存為檔案</string>
+    <string name="uploader_error_message_no_file_to_upload">接收的資料不包含任何有效的檔案</string>
     <string name="uploader_error_title_file_cannot_be_uploaded">無法上傳檔案</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s 不允許讀取接收的檔案</string>
     <string name="uploader_error_message_source_file_not_found">在該位置無法找到要上傳的檔案,請檢查該檔案是否存在</string>
@@ -151,6 +154,7 @@
     <string name="downloader_download_failed_credentials_error">下載失敗,請重新登入</string>
     <string name="common_choose_account">選擇帳號</string>
     <string name="sync_fail_ticker">同步失敗</string>
+    <string name="sync_fail_ticker_unauthorized">同步失敗,請重新登入</string>
     <string name="sync_fail_content">%1$s 同步無法完成</string>
     <string name="sync_fail_content_unauthorized">無效的密碼 %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">出現衝突</string>
@@ -167,6 +171,8 @@
     <string name="foreign_files_local_text">本地: %1$s</string>
     <string name="foreign_files_remote_text">遠端: %1$s</string>
     <string name="upload_query_move_foreign_files">沒有足夠的空間來複製檔案到資料夾 %1$s ,是否改用搬移的方式來處理?</string>
+    <string name="pass_code_enter_pass_code">請輸入通行碼</string>
+    
     <string name="pass_code_configure_your_pass_code">輸入通行碼</string>
     <string name="pass_code_configure_your_pass_code_explanation">每次應用程式開啟時,都需要輸入通行碼</string>
     <string name="pass_code_reenter_your_pass_code">再次輸入通行碼</string>
@@ -250,6 +256,7 @@
     <string name="filename_empty">檔名不能為空</string>
     <string name="wait_a_moment">請稍候</string>
     <string name="wait_checking_credentials">檢查儲存的帳號密碼</string>
+    <string name="filedisplay_unexpected_bad_get_content">未知的問題,請選擇其他程式開啟檔案</string>
     <string name="filedisplay_no_file_selected">沒有選擇檔案</string>
     <string name="activity_chooser_title">傳送連結至…</string>
     <string name="wait_for_tmp_copy_from_private_storage">由私有儲存空間複製檔案中</string>
@@ -333,6 +340,9 @@
     <string name="error_cant_bind_to_operations_service">嚴重錯誤:無法執行操作</string>
 
     <string name="network_error_socket_exception">在與伺服器連線時發生了錯誤</string>
+    <string name="network_error_socket_timeout_exception">在等待伺服器回應時發生了錯誤,這個操作將無法被完成</string>
+    <string name="network_error_connect_timeout_exception">在等待伺服器回應時發生了錯誤,這個操作將無法被完成</string>
+    <string name="network_host_not_available">這個操作無法完成,伺服器無法存取</string>
     <string name="empty" />
 
     <string name="forbidden_permissions">您沒有權限%s</string>

+ 1 - 1
res/values/dims.xml

@@ -47,7 +47,7 @@
     <dimen name="two_line_primary_text_size">16sp</dimen>
     <dimen name="two_line_secondary_text_size">14sp</dimen>
     <dimen name="list_item_avatar_icon_margin">20dp</dimen>
-    <dimen name="list_item_avatar_text_margin">28dp</dimen>
+    <dimen name="list_item_avatar_text_margin">20dp</dimen>
     <dimen name="account_action_layout_height">72dp</dimen>
     <dimen name="zero">0dp</dimen>
     <dimen name="account_item_layout_height">72dp</dimen>

+ 8 - 8
src/com/owncloud/android/datamodel/FileDataStorageManager.java

@@ -43,6 +43,7 @@ import com.owncloud.android.lib.resources.status.CapabilityBooleanType;
 import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeType;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -161,7 +162,7 @@ public class FileDataStorageManager {
             OCFile current = null;
             for (int i=0; i<tmp.size(); i++) {
                 current = tmp.get(i);
-                if (current.isImage()) {
+                if (MimeTypeUtil.isImage(current)) {
                     ret.add(current);
                 }
             }
@@ -1689,15 +1690,15 @@ public class FileDataStorageManager {
         ContentResolver contentResolver = getContentResolver();
 
         if (contentResolver != null) {
-            if (mimetypeString.startsWith("image/")) {
+            if (MimeTypeUtil.isImage(mimetypeString)) {
                 // Images
                 contentResolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                         MediaStore.Images.Media.DATA + "=?", new String[]{path});
-            } else if (mimetypeString.startsWith("audio/")) {
+            } else if (MimeTypeUtil.isAudio(mimetypeString)) {
                 // Audio
                 contentResolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                         MediaStore.Audio.Media.DATA + "=?", new String[]{path});
-            } else if (mimetypeString.startsWith("video/")) {
+            } else if (MimeTypeUtil.isVideo(mimetypeString)) {
                 // Video
                 contentResolver.delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                         MediaStore.Video.Media.DATA + "=?", new String[]{path});
@@ -1705,15 +1706,15 @@ public class FileDataStorageManager {
         } else {
             ContentProviderClient contentProviderClient = getContentProviderClient();
             try {
-                if (mimetypeString.startsWith("image/")) {
+                if (MimeTypeUtil.isImage(mimetypeString)) {
                     // Images
                     contentProviderClient.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                             MediaStore.Images.Media.DATA + "=?", new String[]{path});
-                } else if (mimetypeString.startsWith("audio/")) {
+                } else if (MimeTypeUtil.isAudio(mimetypeString)) {
                     // Audio
                     contentProviderClient.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                             MediaStore.Audio.Media.DATA + "=?", new String[]{path});
-                } else if (mimetypeString.startsWith("video/")) {
+                } else if (MimeTypeUtil.isVideo(mimetypeString)) {
                     // Video
                     contentProviderClient.delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                             MediaStore.Video.Media.DATA + "=?", new String[]{path});
@@ -1722,7 +1723,6 @@ public class FileDataStorageManager {
                 Log_OC.e(TAG, "Exception deleting media file in MediaStore " + e.getMessage());
             }
         }
-
     }
 
     public void saveConflict(OCFile file, String etagInConflict) {

+ 0 - 48
src/com/owncloud/android/datamodel/OCFile.java

@@ -27,7 +27,6 @@ import android.content.ContentResolver;
 import android.net.Uri;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.webkit.MimeTypeMap;
 
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.utils.MimeType;
@@ -562,53 +561,6 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
         return 0;
     }
 
-    /**
-     * @return 'True' if the file contains audio
-     */
-    public boolean isAudio() {
-        return (mMimeType != null && mMimeType.startsWith("audio/"));
-    }
-
-    /**
-     * @return 'True' if the file contains video
-     */
-    public boolean isVideo() {
-        return (mMimeType != null && mMimeType.startsWith("video/"));
-    }
-
-    /**
-     * @return 'True' if the file contains an image
-     */
-    public boolean isImage() {
-        String mimeType;
-        if (mMimeType != null) {
-            mimeType = mMimeType;
-        } else {
-            mimeType = getMimeTypeFromName();
-        }
-
-        return (mimeType.startsWith("image/") && !mimeType.contains("djvu"));
-    }
-
-    /**
-     * @return 'True' if the file is simple text (e.g. not application-dependent, like .doc or .docx)
-     */
-    public boolean isText() {
-        return ((mMimeType != null && mMimeType.startsWith("text/")) ||
-                getMimeTypeFromName().startsWith("text/"));
-    }
-
-    public String getMimeTypeFromName() {
-        String extension = "";
-        int pos = mRemotePath.lastIndexOf('.');
-        if (pos >= 0) {
-            extension = mRemotePath.substring(pos + 1);
-        }
-        String result = MimeTypeMap.getSingleton().
-                getMimeTypeFromExtension(extension.toLowerCase());
-        return (result != null) ? result : "";
-    }
-
     /**
      * @return 'True' if the file is hidden
      */

+ 3 - 3
src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java

@@ -48,7 +48,7 @@ import com.owncloud.android.ui.adapter.DiskLruImageCache;
 import com.owncloud.android.utils.BitmapUtils;
 import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener;
 import com.owncloud.android.utils.FileStorageUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import org.apache.commons.httpclient.HttpStatus;
 import org.apache.commons.httpclient.methods.GetMethod;
@@ -231,7 +231,7 @@ public class ThumbnailsCacheManager {
                 if (mFile instanceof OCFile) {
                     thumbnail = doOCFileInBackground();
 
-                    if (((OCFile) mFile).isVideo() && thumbnail != null){
+                    if (MimeTypeUtil.isVideo((OCFile) mFile) && thumbnail != null) {
                         thumbnail = addVideoOverlay(thumbnail);
                     }
                 }  else if (mFile instanceof File) {
@@ -240,7 +240,7 @@ public class ThumbnailsCacheManager {
                     String url = ((File) mFile).getAbsolutePath();
                     String mMimeType = FileStorageUtils.getMimeTypeFromName(url);
 
-                    if (mMimeType != null && mMimeType.startsWith("video/") && thumbnail != null){
+                    if (MimeTypeUtil.isVideo(mMimeType) && thumbnail != null) {
                         thumbnail = addVideoOverlay(thumbnail);
                     }
                 //} else {  do nothing

+ 2 - 2
src/com/owncloud/android/db/OCUpload.java

@@ -34,7 +34,7 @@ import com.owncloud.android.datamodel.UploadsStorageManager.UploadStatus;
 import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.operations.UploadFileOperation;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.io.File;
 
@@ -235,7 +235,7 @@ public class OCUpload implements Parcelable {
      * @return the mimeType
      */
     public String getMimeType() {
-        return MimetypeIconUtil.getBestMimeTypeByFilename(mLocalPath);
+        return MimeTypeUtil.getBestMimeTypeByFilename(mLocalPath);
     }
 
     /**

+ 2 - 1
src/com/owncloud/android/operations/RefreshFolderOperation.java

@@ -39,6 +39,7 @@ import com.owncloud.android.lib.resources.shares.GetRemoteSharesForFileOperation
 import com.owncloud.android.lib.resources.shares.OCShare;
 import com.owncloud.android.syncadapter.FileSyncAdapter;
 import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -404,7 +405,7 @@ public class RefreshFolderOperation extends RemoteOperation {
                 updatedFile.setEtag(localFile.getEtag());
                 if (updatedFile.isFolder()) {
                     updatedFile.setFileLength(remoteFile.getFileLength());
-                } else if (mRemoteFolderChanged && remoteFile.isImage() &&
+                } else if (mRemoteFolderChanged && MimeTypeUtil.isImage(remoteFile) &&
                         remoteFile.getModificationTimestamp() !=
                                 localFile.getModificationTimestamp()) {
                     updatedFile.setNeedsUpdateThumbnail(true);

+ 8 - 9
src/com/owncloud/android/operations/SynchronizeFolderOperation.java

@@ -20,19 +20,11 @@
 
 package com.owncloud.android.operations;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
 import android.accounts.Account;
 import android.content.Context;
 import android.content.Intent;
 import android.util.Log;
 
-
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.services.FileDownloader;
@@ -47,7 +39,14 @@ import com.owncloud.android.lib.resources.files.RemoteFile;
 import com.owncloud.android.operations.common.SyncOperation;
 import com.owncloud.android.services.OperationsService;
 import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.MimeTypeUtil;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 
@@ -329,7 +328,7 @@ public class SynchronizeFolderOperation extends SyncOperation {
                 if (updatedFile.isFolder()) {
                     updatedFile.setFileLength(localFile.getFileLength());
                         // TODO move operations about size of folders to FileContentProvider
-                } else if (mRemoteFolderChanged && remoteFile.isImage() &&
+                } else if (mRemoteFolderChanged && MimeTypeUtil.isImage(remoteFile) &&
                         remoteFile.getModificationTimestamp() !=
                                 localFile.getModificationTimestamp()) {
                     updatedFile.setNeedsUpdateThumbnail(true);

+ 2 - 2
src/com/owncloud/android/operations/UploadFileOperation.java

@@ -47,7 +47,7 @@ import com.owncloud.android.operations.common.SyncOperation;
 import com.owncloud.android.utils.ConnectivityUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeType;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.UriUtils;
 
 import org.apache.commons.httpclient.HttpStatus;
@@ -80,7 +80,7 @@ public class UploadFileOperation extends SyncOperation {
 
         // MIME type
         if (mimeType == null || mimeType.length() <= 0) {
-            mimeType = MimetypeIconUtil.getBestMimeTypeByFilename(localPath);
+            mimeType = MimeTypeUtil.getBestMimeTypeByFilename(localPath);
         }
 
         OCFile newFile = new OCFile(remotePath);

+ 19 - 5
src/com/owncloud/android/ui/activity/BaseActivity.java

@@ -116,7 +116,7 @@ public abstract class BaseActivity extends AppCompatActivity {
         Account newAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
         if (newAccount == null) {
             /// no account available: force account creation
-            createAccount();
+            createAccount(true);
             mRedirectingToSetupAccount = true;
             mAccountWasSet = false;
             mAccountWasRestored = false;
@@ -129,16 +129,19 @@ public abstract class BaseActivity extends AppCompatActivity {
     }
 
     /**
-     * Launches the account creation activity. To use when no ownCloud account is available.
+     * Launches the account creation activity.
+     *
+     * @param mandatoryCreation     When 'true', if an account is not created by the user, the app will be closed.
+     *                              To use when no ownCloud account is available.
      */
-    protected void createAccount() {
+    protected void createAccount(boolean mandatoryCreation) {
         AccountManager am = AccountManager.get(getApplicationContext());
         am.addAccount(MainApp.getAccountType(),
                 null,
                 null,
                 null,
                 this,
-                new AccountCreationCallback(),
+                new AccountCreationCallback(mandatoryCreation),
                 new Handler());
     }
 
@@ -216,6 +219,17 @@ public abstract class BaseActivity extends AppCompatActivity {
      */
     public class AccountCreationCallback implements AccountManagerCallback<Bundle> {
 
+        boolean mMandatoryCreation;
+
+        /**
+         * Constuctor
+         *
+         * @param mandatoryCreation     When 'true', if an account was not created, the app is closed.
+         */
+        public AccountCreationCallback(boolean mandatoryCreation) {
+            mMandatoryCreation = mandatoryCreation;
+        }
+
         @Override
         public void run(AccountManagerFuture<Bundle> future) {
             BaseActivity.this.mRedirectingToSetupAccount = false;
@@ -242,7 +256,7 @@ public abstract class BaseActivity extends AppCompatActivity {
             } else {
                 Log_OC.e(TAG, "Account creation callback with null bundle");
             }
-            if (!accountWasSet) {
+            if (mMandatoryCreation && !accountWasSet) {
                 moveTaskToBack(true);
             }
         }

+ 15 - 2
src/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -203,7 +203,7 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
         };
 
         // Set the drawer toggle as the DrawerListener
-        mDrawerLayout.setDrawerListener(mDrawerToggle);
+        mDrawerLayout.addDrawerListener(mDrawerToggle);
         mDrawerToggle.setDrawerIndicatorEnabled(true);
     }
 
@@ -286,7 +286,7 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
                                 startActivity(participateIntent);
                                 break;
                             case R.id.drawer_menu_account_add:
-                                createAccount();
+                                createAccount(false);
                                 break;
                             case R.id.drawer_menu_account_manage:
                                 Intent manageAccountsIntent = new Intent(getApplicationContext(),
@@ -805,4 +805,17 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
         }
         return false;
     }
+
+    /**
+     * Adds other listeners to react on changes of the drawer layout.
+     *
+     * @param listener      Object interested in changes of the drawer layout.
+     */
+    public void addDrawerListener(DrawerLayout.DrawerListener listener) {
+        if (mDrawerLayout != null) {
+            mDrawerLayout.addDrawerListener(listener);
+        } else {
+            Log_OC.e(TAG, "Drawer layout not ready to add drawer listener");
+        }
+    }
 }

+ 40 - 6
src/com/owncloud/android/ui/activity/ManageAccountsActivity.java

@@ -32,12 +32,17 @@ import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.graphics.drawable.DrawableCompat;
 import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
 import android.widget.ListView;
 
 import com.owncloud.android.MainApp;
@@ -75,11 +80,16 @@ public class ManageAccountsActivity extends FileActivity
     private ServiceConnection mDownloadServiceConnection, mUploadServiceConnection = null;
     Set<String> mOriginalAccounts;
     String mOriginalCurrentAccount;
+    private Drawable mTintedCheck;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        mTintedCheck = DrawableCompat.wrap(ContextCompat.getDrawable(this, R.drawable.ic_account_circle_white_18dp));
+        int tint = ContextCompat.getColor(this, R.color.primary);
+        DrawableCompat.setTint(mTintedCheck, tint);
+
         setContentView(R.layout.accounts_layout);
 
         mListView = (ListView) findViewById(R.id.account_list);
@@ -94,10 +104,17 @@ public class ManageAccountsActivity extends FileActivity
         setAccount(AccountUtils.getCurrentOwnCloudAccount(this));
         onAccountSet(false);
 
-        mAccountListAdapter = new AccountListAdapter(this, getAccountListItems());
+        mAccountListAdapter = new AccountListAdapter(this, getAccountListItems(), mTintedCheck);
 
         mListView.setAdapter(mAccountListAdapter);
 
+        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                switchAccount(mAccountListAdapter.getItem(position).getAccount());
+            }
+        });
+
         initializeComponentGetters();
     }
 
@@ -108,7 +125,7 @@ public class ManageAccountsActivity extends FileActivity
      * @return set of account names
      */
     private Set<String> toAccountNameSet(Account[] accountList) {
-        Set<String> actualAccounts = new HashSet<String>(accountList.length);
+        Set<String> actualAccounts = new HashSet<>(accountList.length);
         for (Account account : accountList) {
             actualAccounts.add(account.name);
         }
@@ -143,7 +160,7 @@ public class ManageAccountsActivity extends FileActivity
      */
     private boolean hasCurrentAccountChanged() {
         Account account = AccountUtils.getCurrentOwnCloudAccount(this);
-        if (account == null){
+        if (account == null) {
             return true;
         } else {
             return !mOriginalCurrentAccount.equals(account.name);
@@ -231,8 +248,11 @@ public class ManageAccountsActivity extends FileActivity
                                 Bundle result = future.getResult();
                                 String name = result.getString(AccountManager.KEY_ACCOUNT_NAME);
                                 AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), name);
-                                mAccountListAdapter = new AccountListAdapter(ManageAccountsActivity
-                                        .this, getAccountListItems());
+                                mAccountListAdapter = new AccountListAdapter(
+                                    ManageAccountsActivity.this,
+                                    getAccountListItems(),
+                                    mTintedCheck
+                                );
                                 mListView.setAdapter(mAccountListAdapter);
                                 runOnUiThread(new Runnable() {
                                     @Override
@@ -250,6 +270,20 @@ public class ManageAccountsActivity extends FileActivity
                 }, mHandler);
     }
 
+    public void switchAccount(Account account) {
+        if (getAccount().name.equals(account.name)) {
+            // current account selected, just go back
+            finish();
+        } else {
+            // restart list of files with new account
+            AccountUtils.setCurrentOwnCloudAccount(ManageAccountsActivity.this, account.name);
+            Intent i = new Intent(ManageAccountsActivity.this, FileDisplayActivity.class);
+            i.putExtra(FileActivity.EXTRA_ACCOUNT, account);
+            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+            startActivity(i);
+        }
+    }
+
     @Override
     public void run(AccountManagerFuture<Boolean> future) {
         if (future.isDone()) {
@@ -274,7 +308,7 @@ public class ManageAccountsActivity extends FileActivity
                 AccountUtils.setCurrentOwnCloudAccount(this, accountName);
             }
 
-            mAccountListAdapter = new AccountListAdapter(this, getAccountListItems());
+            mAccountListAdapter = new AccountListAdapter(this, getAccountListItems(), mTintedCheck);
             mListView.setAdapter(mAccountListAdapter);
         }
     }

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

@@ -52,7 +52,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.operations.CheckCurrentCredentialsOperation;
 import com.owncloud.android.ui.fragment.UploadListFragment;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.io.File;
 
@@ -161,7 +161,7 @@ public class UploadListActivity extends FileActivity implements UploadListFragme
     private void openFileWithDefault(String localPath) {
         Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);
         File file = new File(localPath);
-        String mimetype = MimetypeIconUtil.getBestMimeTypeByFilename(localPath);
+        String mimetype = MimeTypeUtil.getBestMimeTypeByFilename(localPath);
         if ("application/octet-stream".equals(mimetype)) {
             mimetype = "*/*";
         }

+ 96 - 51
src/com/owncloud/android/ui/adapter/AccountListAdapter.java

@@ -21,18 +21,19 @@ package com.owncloud.android.ui.adapter;
 
 import android.accounts.Account;
 import android.graphics.drawable.Drawable;
+import android.support.annotation.NonNull;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
-import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.activity.BaseActivity;
-import com.owncloud.android.ui.activity.ManageAccountsActivity;
 import com.owncloud.android.utils.DisplayUtils;
 
 import java.util.List;
@@ -46,13 +47,15 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements
     private final BaseActivity mContext;
     private List<AccountListItem> mValues;
     private AccountListAdapterListener mListener;
+    private Drawable mTintedCheck;
 
-    public AccountListAdapter(BaseActivity context, List<AccountListItem> values) {
+    public AccountListAdapter(BaseActivity context, List<AccountListItem> values, Drawable tintedCheck) {
         super(context, -1, values);
         this.mContext = context;
         this.mValues = values;
         this.mListener = (AccountListAdapterListener) context;
         this.mAccountAvatarRadiusDimension = context.getResources().getDimension(R.dimen.list_item_avatar_icon_radius);
+        this.mTintedCheck = tintedCheck;
     }
 
     @Override
@@ -64,10 +67,13 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements
             convertView = inflater.inflate(R.layout.account_item, parent, false);
 
             viewHolder = new AccountViewHolderItem();
-            viewHolder.textViewItem = (TextView) convertView.findViewById(R.id.user_name);
             viewHolder.imageViewItem = (ImageView) convertView.findViewById(R.id.user_icon);
-            viewHolder.passwordButtonItem = (ImageButton) convertView.findViewById(R.id.passwordButton);
-            viewHolder.removeButtonItem = (ImageButton) convertView.findViewById(R.id.removeButton);
+            viewHolder.checkViewItem = (ImageView) convertView.findViewById(R.id.ticker);
+            viewHolder.checkViewItem.setImageDrawable(mTintedCheck);
+            viewHolder.usernameViewItem = (TextView) convertView.findViewById(R.id.user_name);
+            viewHolder.accountViewItem = (TextView) convertView.findViewById(R.id.account);
+            viewHolder.passwordButtonItem = (ImageView) convertView.findViewById(R.id.passwordButton);
+            viewHolder.removeButtonItem = (ImageView) convertView.findViewById(R.id.removeButton);
 
             convertView.setTag(viewHolder);
         } else {
@@ -81,55 +87,91 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements
             // create account item
             if (AccountListItem.TYPE_ACCOUNT == accountListItem.getType()) {
                 Account account = accountListItem.getAccount();
-                viewHolder.textViewItem.setText(account.name);
-                viewHolder.textViewItem.setTag(account.name);
-
-                try {
-                    DisplayUtils.setAvatar(account, this, mAccountAvatarRadiusDimension,
-                            mContext.getResources(), mContext.getStorageManager(), viewHolder.imageViewItem);
-                } catch (Exception e) {
-                    Log_OC.e(TAG, "Error calculating RGB value for account list item.", e);
-                    // use user icon as a fallback
-                    viewHolder.imageViewItem.setImageResource(R.drawable.ic_user);
-                }
-
-                /// bind listener to change password
-                viewHolder.passwordButtonItem.setOnClickListener(new View.OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        mListener.changePasswordOfAccount(mValues.get(position).getAccount());
-                    }
-                });
-
-                /// bind listener to remove account
-                viewHolder.removeButtonItem.setOnClickListener(new View.OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        mListener.performAccountRemoval(mValues.get(position).getAccount());
-                    }
-                });
+                setAccount(viewHolder, account);
+                setUsername(viewHolder, account);
+                setAvatar(viewHolder, account);
+                setCurrentlyActiveState(viewHolder, account);
+                setupListeners(position, viewHolder);
+
             } // create add account action item
             else if (AccountListItem.TYPE_ACTION_ADD == accountListItem.getType()) {
-                LayoutInflater inflater = ((ManageAccountsActivity) mContext).getLayoutInflater();
-                View actionView = inflater.inflate(R.layout.account_action, parent, false);
-                ((TextView) actionView.findViewById(R.id.user_name)).setText(R.string.prefs_add_account);
-                ((ImageView) actionView.findViewById(R.id.user_icon)).setImageResource(R.drawable.ic_account_plus);
-
-                // bind action listener
-                actionView.setOnClickListener(new View.OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        mListener.createAccount();
-                    }
-                });
-
-                return actionView;
+                return setupAddAccountListItem(parent);
             }
         }
 
         return convertView;
     }
 
+    @NonNull
+    private View setupAddAccountListItem(ViewGroup parent) {
+        LayoutInflater inflater = mContext.getLayoutInflater();
+        View actionView = inflater.inflate(R.layout.account_action, parent, false);
+        ((TextView) actionView.findViewById(R.id.user_name)).setText(R.string.prefs_add_account);
+        ((ImageView) actionView.findViewById(R.id.user_icon)).setImageResource(R.drawable.ic_account_plus);
+
+        // bind action listener
+        actionView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mListener.createAccount();
+            }
+        });
+        return actionView;
+    }
+
+    private void setAccount(AccountViewHolderItem viewHolder, Account account) {
+        viewHolder.accountViewItem.setText(DisplayUtils.convertIdn(account.name, false));
+        viewHolder.accountViewItem.setTag(account.name);
+    }
+
+    private void setupListeners(final int position, AccountViewHolderItem viewHolder) {
+        /// bind listener to change password
+        viewHolder.passwordButtonItem.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mListener.changePasswordOfAccount(mValues.get(position).getAccount());
+            }
+        });
+
+        /// bind listener to remove account
+        viewHolder.removeButtonItem.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mListener.performAccountRemoval(mValues.get(position).getAccount());
+            }
+        });
+    }
+
+    private void setCurrentlyActiveState(AccountViewHolderItem viewHolder, Account account) {
+        if (AccountUtils.getCurrentOwnCloudAccount(getContext()).name.equals(account.name)) {
+            viewHolder.checkViewItem.setVisibility(View.VISIBLE);
+        } else {
+            viewHolder.checkViewItem.setVisibility(View.INVISIBLE);
+        }
+    }
+
+    private void setAvatar(AccountViewHolderItem viewHolder, Account account) {
+        try {
+            DisplayUtils.setAvatar(account, this, mAccountAvatarRadiusDimension,
+                    mContext.getResources(), mContext.getStorageManager(), viewHolder.imageViewItem);
+        } catch (Exception e) {
+            Log_OC.e(TAG, "Error calculating RGB value for account list item.", e);
+            // use user icon as a fallback
+            viewHolder.imageViewItem.setImageResource(R.drawable.ic_user);
+        }
+    }
+
+    private void setUsername(AccountViewHolderItem viewHolder, Account account) {
+        try {
+            OwnCloudAccount oca = new OwnCloudAccount(account, mContext);
+            viewHolder.usernameViewItem.setText(oca.getDisplayName());
+        } catch (Exception e) {
+            Log_OC.w(TAG, "Account not found right after being read; using account name instead");
+            viewHolder.usernameViewItem.setText(AccountUtils.getAccountUsername(account.name));
+        }
+        viewHolder.usernameViewItem.setTag(account.name);
+    }
+
     @Override
     public void avatarGenerated(Drawable avatarDrawable, Object callContext) {
         ((ImageView)callContext).setImageDrawable(avatarDrawable);
@@ -154,11 +196,14 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements
     /**
      * Account ViewHolderItem to get smooth scrolling.
      */
-    static class AccountViewHolderItem {
-        TextView textViewItem;
+    private static class AccountViewHolderItem {
         ImageView imageViewItem;
+        ImageView checkViewItem;
+
+        TextView usernameViewItem;
+        TextView accountViewItem;
 
-        ImageButton passwordButtonItem;
-        ImageButton removeButtonItem;
+        ImageView passwordButtonItem;
+        ImageView removeButtonItem;
     }
 }

+ 6 - 7
src/com/owncloud/android/ui/adapter/ExpandableUploadListAdapter.java

@@ -48,9 +48,8 @@ import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.activity.FileActivity;
-import com.owncloud.android.utils.BitmapUtils;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.io.File;
 import java.lang.ref.WeakReference;
@@ -408,7 +407,7 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
             );
 
             // TODO this code is duplicated; refactor to a common place
-            if ((fakeFileToCheatThumbnailsCacheManagerInterface.isImage()
+            if ((MimeTypeUtil.isImage(fakeFileToCheatThumbnailsCacheManagerInterface)
                     && fakeFileToCheatThumbnailsCacheManagerInterface.getRemoteId() != null &&
                     upload.getUploadStatus() == UploadStatus.UPLOAD_SUCCEEDED)) {
                 // Thumbnail in Cache?
@@ -425,7 +424,7 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
                                         fileIcon, mParentActivity.getStorageManager(), mParentActivity.getAccount()
                                 );
                         if (thumbnail == null) {
-                            if (fakeFileToCheatThumbnailsCacheManagerInterface.isVideo()) {
+                            if (MimeTypeUtil.isVideo(fakeFileToCheatThumbnailsCacheManagerInterface)) {
                                 thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                             } else {
                                 thumbnail = ThumbnailsCacheManager.mDefaultImg;
@@ -448,7 +447,7 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
                 }
 
 
-            } else if (fakeFileToCheatThumbnailsCacheManagerInterface.isImage()) {
+            } else if (MimeTypeUtil.isImage(fakeFileToCheatThumbnailsCacheManagerInterface)) {
                 File file = new File(upload.getLocalPath());
                 // Thumbnail in Cache?
                 Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
@@ -461,7 +460,7 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
                         final ThumbnailsCacheManager.ThumbnailGenerationTask task =
                                 new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon);
                         if (thumbnail == null) {
-                            if (BitmapUtils.isVideo(file)) {
+                            if (MimeTypeUtil.isVideo(file)) {
                                 thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                             } else {
                                 thumbnail = ThumbnailsCacheManager.mDefaultImg;
@@ -484,7 +483,7 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
                             .getColor(R.color.background_color));
                 }
             } else {
-                fileIcon.setImageResource(MimetypeIconUtil.getFileTypeIconId(
+                fileIcon.setImageResource(MimeTypeUtil.getFileTypeIconId(
                         upload.getMimeType(),
                         fileName
                 ));

+ 7 - 7
src/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -50,7 +50,7 @@ import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
 import com.owncloud.android.ui.activity.ComponentsGetter;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileStorageUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.util.ArrayList;
 import java.util.Vector;
@@ -144,7 +144,7 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
         // Find out which layout should be displayed
         ViewType viewType;
         if (parent instanceof GridView) {
-            if (file != null && (file.isImage() || file.isVideo())) {
+            if (file != null && (MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file))) {
                 viewType = ViewType.GRID_IMAGE;
             } else {
                 viewType = ViewType.GRID_ITEM;
@@ -296,14 +296,14 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
 
             // No Folder
             if (!file.isFolder()) {
-                if ((file.isImage() || file.isVideo()) && file.getRemoteId() != null) {
+                if ((MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file)) && file.getRemoteId() != null) {
                     // Thumbnail in Cache?
                     Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
                             String.valueOf(file.getRemoteId())
                     );
                     if (thumbnail != null && !file.needsUpdateThumbnail()) {
 
-                        if (file.isVideo()) {
+                        if (MimeTypeUtil.isVideo(file)) {
                             Bitmap withOverlay = ThumbnailsCacheManager.addVideoOverlay(thumbnail);
                             fileIcon.setImageBitmap(withOverlay);
                         } else {
@@ -317,7 +317,7 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
                                             fileIcon, mStorageManager, mAccount
                                     );
                             if (thumbnail == null) {
-                                if (file.isVideo()) {
+                                if (MimeTypeUtil.isVideo(file)) {
                                     thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                                 } else {
                                     thumbnail = ThumbnailsCacheManager.mDefaultImg;
@@ -341,7 +341,7 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
 
 
                 } else {
-                    fileIcon.setImageResource(MimetypeIconUtil.getFileTypeIconId(file.getMimetype(),
+                    fileIcon.setImageResource(MimeTypeUtil.getFileTypeIconId(file.getMimetype(),
                             file.getFileName()));
                 }
 
@@ -349,7 +349,7 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
             } else {
                 // Folder
                 fileIcon.setImageResource(
-                        MimetypeIconUtil.getFolderTypeIconId(
+                        MimeTypeUtil.getFolderTypeIconId(
                                 file.isSharedWithMe() || file.isSharedWithSharee(),
                                 file.isSharedViaLink()
                         )

+ 6 - 7
src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java

@@ -36,10 +36,9 @@ import com.owncloud.android.R;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.db.PreferenceManager;
 import com.owncloud.android.lib.common.utils.Log_OC;
-import com.owncloud.android.utils.BitmapUtils;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileStorageUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -119,8 +118,8 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
             // Find out which layout should be displayed
             ViewType viewType;
             if (parent instanceof GridView) {
-                String mimeType = MimetypeIconUtil.getBestMimeTypeByFilename(file.getName());
-                if (MimetypeIconUtil.isImage(mimeType) || MimetypeIconUtil.isVideo(mimeType)) {
+                String mimeType = MimeTypeUtil.getBestMimeTypeByFilename(file.getName());
+                if (MimeTypeUtil.isImage(mimeType) || MimeTypeUtil.isVideo(mimeType)) {
                     viewType = ViewType.GRID_IMAGE;
                 } else {
                     viewType = ViewType.GRID_ITEM;
@@ -197,7 +196,7 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
                 }
                 
              // get Thumbnail if file is image
-                if (BitmapUtils.isImage(file)){
+                if (MimeTypeUtil.isImage(file)){
                 // Thumbnail in Cache?
                     Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
                             String.valueOf(file.hashCode())
@@ -210,7 +209,7 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
                         if (allowedToCreateNewThumbnail) {
                             final ThumbnailsCacheManager.ThumbnailGenerationTask task =
                                     new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon);
-                            if (BitmapUtils.isVideo(file)) {
+                            if (MimeTypeUtil.isVideo(file)) {
                                 thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                             } else {
                                 thumbnail = ThumbnailsCacheManager.mDefaultImg;
@@ -228,7 +227,7 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
                         } // else, already being generated, don't restart it
                     }
                 } else {
-                    fileIcon.setImageResource(MimetypeIconUtil.getFileTypeIconId(null, file.getName()));
+                    fileIcon.setImageResource(MimeTypeUtil.getFileTypeIconId(null, file.getName()));
                 }  
 
             } else {

+ 4 - 4
src/com/owncloud/android/ui/adapter/UploaderAdapter.java

@@ -36,7 +36,7 @@ import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager.AsyncThumbnailDrawable;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.util.HashMap;
 import java.util.List;
@@ -91,7 +91,7 @@ public class UploaderAdapter extends SimpleAdapter {
         }
         
         // get Thumbnail if file is image
-        if (file.isImage() && file.getRemoteId() != null){
+        if (MimeTypeUtil.isImage(file) && file.getRemoteId() != null) {
              // Thumbnail in Cache?
             Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
                     String.valueOf(file.getRemoteId())
@@ -105,7 +105,7 @@ public class UploaderAdapter extends SimpleAdapter {
                             new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon, mStorageManager, 
                                     mAccount);
                     if (thumbnail == null) {
-                        if (file.isVideo()) {
+                        if (MimeTypeUtil.isVideo(file)) {
                             thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                         } else {
                             thumbnail = ThumbnailsCacheManager.mDefaultImg;
@@ -122,7 +122,7 @@ public class UploaderAdapter extends SimpleAdapter {
             }
         } else {
             fileIcon.setImageResource(
-                    MimetypeIconUtil.getFileTypeIconId(file.getMimetype(), file.getFileName())
+                    MimeTypeUtil.getFileTypeIconId(file.getMimetype(), file.getFileName())
             );
         }
         return vi;

+ 0 - 147
src/com/owncloud/android/ui/dialog/AccountActionsDialogFragment.java

@@ -1,147 +0,0 @@
-package com.owncloud.android.ui.dialog;
-
-import android.os.Bundle;
-import android.support.v4.app.DialogFragment;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-
-import com.owncloud.android.R;
-import com.owncloud.android.ui.dialog.parcel.MenuItemParcelable;
-import com.owncloud.android.ui.dialog.parcel.MenuParcelable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Dialog for choosing a file action.
- */
-public class AccountActionsDialogFragment extends DialogFragment implements
-        OnItemClickListener {
-    private static final String ARG_ITEM_LIST = "ITEM_LIST";
-    private static final String ARG_FILE_POSITION = "FILE_POSITION";
-    public static final String FTAG_FILE_ACTIONS = "FILE_ACTIONS_FRAGMENT";
-
-    private List<MenuItemParcelable> mMenuItems;
-
-    private int mFilePosition;
-
-    private ListView mListView;
-
-    /**
-     * Listener interface for the file action fragment.
-     */
-    public interface FileActionsDialogFragmentListener {
-        // TODO Tobi change to int array?
-        public boolean onFileActionChosen(int menuId, int filePosition);
-    }
-
-    /**
-     * Public factory method to create new FileActionsDialogFragment instances.
-     *
-     * @param menu menu to be display.
-     * @return Dialog ready to show.
-     */
-    public static AccountActionsDialogFragment newInstance(Menu menu, int filePosition) {
-        AccountActionsDialogFragment fragment = new AccountActionsDialogFragment();
-        Bundle args = new Bundle();
-
-        MenuParcelable menuParcelable = new MenuParcelable();
-        menuParcelable.setMenuItems(calculateMenuParcel(menu));
-
-        args.putParcelable(ARG_ITEM_LIST, menuParcelable);
-        args.putInt(ARG_FILE_POSITION, filePosition);
-
-        fragment.setArguments(args);
-        return fragment;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setStyle(DialogFragment.STYLE_NORMAL, R.style.ownCloud_Dialog);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                             Bundle savedInstanceState) {
-        View view = inflater.inflate(R.layout.file_actions, null, false);
-        mListView = (ListView) view.findViewById(R.id.file_actions_list);
-
-        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
-        return view;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        mFilePosition = getArguments().getInt(ARG_FILE_POSITION);
-
-        MenuParcelable menu = getArguments().getParcelable(ARG_ITEM_LIST);
-        mMenuItems = menu.getMenuItems();
-        List<String> stringList = new ArrayList<String>();
-        for (int i = 0; i < mMenuItems.size(); i++) {
-            stringList.add(mMenuItems.get(i).getMenuText());
-        }
-
-        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
-                R.layout.simple_dialog_list_item, stringList);
-
-        mListView.setAdapter(adapter);
-
-        mListView.setOnItemClickListener(this);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        dismiss();
-        ((FileActionsDialogFragmentListener) getTargetFragment()).onFileActionChosen(mMenuItems.get(position).getMenuItemId(), mFilePosition);
-    }
-
-    /**
-     * calculates a parcelable list of MenuItemParcelable based on the given menu and the visibility of the menu items.
-     *
-     * @param menu the menu to be displayed
-     * @return a filtered List of parcelables based on the menu
-     */
-    private static List<MenuItemParcelable> calculateMenuParcel(Menu menu) {
-        int index = 0;
-        boolean hasNext = true;
-        List<MenuItemParcelable> itemList = new ArrayList<MenuItemParcelable>();
-        MenuParcelable menuParcelable = new MenuParcelable();
-        try {
-            while (hasNext) {
-                MenuItem item = menu.getItem(index);
-                if (item.isVisible()) {
-                    itemList.add(new MenuItemParcelable(item));
-                }
-                index++;
-            }
-        } catch (IndexOutOfBoundsException iobe) {
-            // reach the end of the item list
-        }
-
-        return itemList;
-    }
-}

+ 1 - 2
src/com/owncloud/android/ui/dialog/RemoveFileDialogFragment.java

@@ -36,7 +36,6 @@ import com.owncloud.android.ui.activity.ComponentsGetter;
 import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener;
 
 import java.util.ArrayList;
-import java.util.List;
 import java.util.Vector;
 
 public class RemoveFileDialogFragment extends ConfirmationDialogFragment 
@@ -56,7 +55,7 @@ implements ConfirmationDialogFragmentListener {
         RemoveFileDialogFragment frag = new RemoveFileDialogFragment();
         Bundle args = new Bundle();
         
-        int messageStringId = R.string.confirmation_remove_alert;
+        int messageStringId = R.string.confirmation_remove_file_alert;
         
         int localRemoveButton = (!file.isFavorite() && (file.isFolder() || file.isDown())) ?
             R.string.confirmation_remove_local : -1;

+ 3 - 3
src/com/owncloud/android/ui/fragment/FileDetailFragment.java

@@ -51,7 +51,7 @@ import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.lang.ref.WeakReference;
 
@@ -426,7 +426,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             Bitmap thumbnail;
             iv.setTag(file.getFileId());
 
-            if (file.isImage()) {
+            if (MimeTypeUtil.isImage(file)) {
                 String tagId = String.valueOf(file.getRemoteId());
                 thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(tagId);
 
@@ -455,7 +455,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             } else {
 				// Name of the file, to deduce the icon to use in case the MIME type is not precise enough
 				String filename = file.getFileName();
-                iv.setImageResource(MimetypeIconUtil.getFileTypeIconId(mimetype, filename));
+                iv.setImageResource(MimeTypeUtil.getFileTypeIconId(mimetype, filename));
 			}
         }
     }

+ 174 - 54
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -28,7 +28,9 @@ import android.content.SharedPreferences;
 import android.os.Build;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
+import android.support.v4.widget.DrawerLayout;
 import android.support.v4.widget.SwipeRefreshLayout;
+import android.util.SparseBooleanArray;
 import android.view.ActionMode;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -60,6 +62,7 @@ import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
 import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
+import com.owncloud.android.ui.helpers.SparseBooleanArrayParcelable;
 import com.owncloud.android.ui.preview.PreviewImageFragment;
 import com.owncloud.android.ui.preview.PreviewMediaFragment;
 import com.owncloud.android.ui.preview.PreviewTextFragment;
@@ -107,6 +110,7 @@ public class OCFileListFragment extends ExtendedListFragment {
     private boolean mHideFab = true;
     private boolean miniFabClicked = false;
     private ActionMode mActiveActionMode;
+    private OCFileListFragment.MultiChoiceModeListener mMultiChoiceModeListener;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -151,7 +155,7 @@ public class OCFileListFragment extends ExtendedListFragment {
         Bundle args = getArguments();
         boolean allowContextualActions = (args != null) && args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, false);
         if (allowContextualActions) {
-            setChoiceModeAsMultipleModal();
+            setChoiceModeAsMultipleModal(savedInstanceState);
         }
         Log_OC.i(TAG, "onCreateView() end");
         return v;
@@ -346,76 +350,191 @@ public class OCFileListFragment extends ExtendedListFragment {
                 com.getbase.floatingactionbutton.R.id.fab_label)).setVisibility(View.GONE);
     }
 
-    private void setChoiceModeAsMultipleModal() {
+    /**
+     * Handler for multiple selection mode.
+     *
+     * Manages input from the user when one or more files or folders are selected in the list.
+     *
+     * Also listens to changes in navigation drawer to hide and recover multiple selection when it's opened
+     * and closed.
+     */
+    private class MultiChoiceModeListener
+        implements AbsListView.MultiChoiceModeListener, DrawerLayout.DrawerListener {
 
-        setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
+        private static final String KEY_ACTION_MODE_CLOSED_BY_DRAWER = "KILLED_ACTION_MODE";
+        private static final String KEY_SELECTION_WHEN_CLOSED_BY_DRAWER = "CHECKED_ITEMS";
 
-        setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
+        /**
+         * True when action mode is finished because the drawer was opened
+         */
+        private boolean mActionModeClosedByDrawer = false;
 
-            @Override
-            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
-                getListView().invalidateViews();
-                mode.invalidate();
+        /**
+         * Selected items in list when action mode is closed by drawer
+         */
+        private SparseBooleanArray mSelectionWhenActionModeClosedByDrawer = null;
+
+        @Override
+        public void onDrawerSlide(View drawerView, float slideOffset) {
+            // nothing to do
+        }
+
+        @Override
+        public void onDrawerOpened(View drawerView) {
+            // nothing to do
+        }
+
+        /**
+         * When the navigation drawer is closed, action mode is recovered in the same state as was
+         * when the drawer was (started to be) opened.
+         *
+         * @param drawerView        Navigation drawer just closed.
+         */
+        @Override
+        public void onDrawerClosed(View drawerView) {
+            if (mSelectionWhenActionModeClosedByDrawer !=null && mActionModeClosedByDrawer) {
+                for (int i = 0; i< mSelectionWhenActionModeClosedByDrawer.size(); i++) {
+                    if (mSelectionWhenActionModeClosedByDrawer.valueAt(i)) {
+                        getListView().setItemChecked(
+                            mSelectionWhenActionModeClosedByDrawer.keyAt(i),
+                            true
+                        );
+                    }
+                }
             }
+            mSelectionWhenActionModeClosedByDrawer = null;
+        }
 
-            @Override
-            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-                mActiveActionMode = mode;
+        /**
+         * If the action mode is active when the navigation drawer starts to move, the action
+         * mode is closed and the selection stored to be recovered when the drawer is closed.
+         *
+         * @param newState     One of STATE_IDLE, STATE_DRAGGING or STATE_SETTLING.
+         */
+        @Override
+        public void onDrawerStateChanged(int newState) {
+            if (DrawerLayout.STATE_DRAGGING == newState && mActiveActionMode != null) {
+                mSelectionWhenActionModeClosedByDrawer = getListView().getCheckedItemPositions().clone();
+                mActiveActionMode.finish();
+                mActionModeClosedByDrawer = true;
+            }
+        }
 
-                MenuInflater inflater = getActivity().getMenuInflater();
-                inflater.inflate(R.menu.file_actions_menu, menu);
-                mode.invalidate();
 
-                //set gray color
-                DisplayUtils.colorStatusBar(getActivity(), mSystemBarActionModeColor);
-                DisplayUtils.colorToolbarProgressBar(getActivity(), mProgressBarActionModeColor);
+        /**
+         * Update action mode bar when an item is selected / unselected in the list
+         */
+        @Override
+        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
+            getListView().invalidateViews();
+            mode.invalidate();
+        }
 
-                // hide FAB in multi selection mode
-                setFabEnabled(false);
+        /**
+         * Load menu and customize UI when action mode is started.
+         */
+        @Override
+        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+            mActiveActionMode = mode;
 
-                return true;
-            }
+            MenuInflater inflater = getActivity().getMenuInflater();
+            inflater.inflate(R.menu.file_actions_menu, menu);
+            mode.invalidate();
 
-            @Override
-            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-                List<OCFile> checkedFiles = mAdapter.getCheckedItems(getListView());
-                final int checkedCount = checkedFiles.size();
-                String title = getResources().getQuantityString(
-                    R.plurals.items_selected_count,
-                    checkedCount,
-                    checkedCount
-                );
-                mode.setTitle(title);
-                FileMenuFilter mf = new FileMenuFilter(
-                    checkedFiles,
-                    ((FileActivity) getActivity()).getAccount(),
-                    mContainerActivity,
-                    getActivity()
-                );
-                mf.filter(menu);
+            //set gray color
+            DisplayUtils.colorStatusBar(getActivity(), mSystemBarActionModeColor);
+            DisplayUtils.colorToolbarProgressBar(getActivity(), mProgressBarActionModeColor);
 
-                return true;
-            }
+            // hide FAB in multi selection mode
+            setFabEnabled(false);
 
-            @Override
-            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-                return onFileActionChosen(item.getItemId());
+            return true;
+        }
+
+        /**
+         * Updates available action in menu depending on current selection.
+         */
+        @Override
+        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+            List<OCFile> checkedFiles = mAdapter.getCheckedItems(getListView());
+            final int checkedCount = checkedFiles.size();
+            String title = getResources().getQuantityString(
+                R.plurals.items_selected_count,
+                checkedCount,
+                checkedCount
+            );
+            mode.setTitle(title);
+            FileMenuFilter mf = new FileMenuFilter(
+                checkedFiles,
+                ((FileActivity) getActivity()).getAccount(),
+                mContainerActivity,
+                getActivity()
+            );
+            mf.filter(menu);
+            return true;
+        }
+
+        /**
+         * Starts the corresponding action when a menu item is tapped by the user.
+         */
+        @Override
+        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+            return onFileActionChosen(item.getItemId());
+        }
+
+        /**
+         * Restores UI.
+         */
+        @Override
+        public void onDestroyActionMode(ActionMode mode) {
+            mActiveActionMode = null;
+
+            // reset to previous color
+            DisplayUtils.colorStatusBar(getActivity(), mSystemBarColor);
+            DisplayUtils.colorToolbarProgressBar(getActivity(), mProgressBarColor);
+
+            // show FAB on multi selection mode exit
+            if(!mHideFab) {
+                setFabEnabled(true);
             }
+        }
 
-            @Override
-            public void onDestroyActionMode(ActionMode mode) {
-                mActiveActionMode = null;
 
-                // reset to previous color
-                DisplayUtils.colorStatusBar(getActivity(), mSystemBarColor);
-                DisplayUtils.colorToolbarProgressBar(getActivity(), mProgressBarColor);
+        public void storeStateIn(Bundle outState) {
+            outState.putBoolean(KEY_ACTION_MODE_CLOSED_BY_DRAWER, mActionModeClosedByDrawer);
+            if (mSelectionWhenActionModeClosedByDrawer != null) {
+                SparseBooleanArrayParcelable sbap = new SparseBooleanArrayParcelable(
+                    mSelectionWhenActionModeClosedByDrawer
+                );
+                outState.putParcelable(KEY_SELECTION_WHEN_CLOSED_BY_DRAWER, sbap);
+            }
+        }
 
-                // show FAB on multi selection mode exit
-                if(!mHideFab) {
-                    setFabEnabled(true);
-                }
+        public void loadStateFrom(Bundle savedInstanceState) {
+            mActionModeClosedByDrawer = savedInstanceState.getBoolean(
+                KEY_ACTION_MODE_CLOSED_BY_DRAWER,
+                mActionModeClosedByDrawer
+            );
+            SparseBooleanArrayParcelable sbap = savedInstanceState.getParcelable(
+                KEY_SELECTION_WHEN_CLOSED_BY_DRAWER
+            );
+            if (sbap != null) {
+                mSelectionWhenActionModeClosedByDrawer = sbap.getSparseBooleanArray();
             }
-        });
+        }
+    }
+
+    /**
+     * Init listener that will handle interactions in multiple selection mode.
+     */
+    private void setChoiceModeAsMultipleModal(Bundle savedInstanceState) {
+        setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
+        mMultiChoiceModeListener = new MultiChoiceModeListener();
+        if (savedInstanceState != null) {
+            mMultiChoiceModeListener.loadStateFrom(savedInstanceState);
+        }
+        setMultiChoiceModeListener(mMultiChoiceModeListener);
+        ((FileActivity)getActivity()).addDrawerListener(mMultiChoiceModeListener);
     }
 
     /**
@@ -425,6 +544,7 @@ public class OCFileListFragment extends ExtendedListFragment {
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putParcelable(KEY_FILE, mFile);
+        mMultiChoiceModeListener.storeStateIn(outState);
     }
 
     @Override

+ 3 - 3
src/com/owncloud/android/ui/fragment/ShareFileFragment.java

@@ -57,7 +57,7 @@ import com.owncloud.android.ui.adapter.ShareUserListAdapter;
 import com.owncloud.android.ui.dialog.ExpirationDatePickerDialogFragment;
 import com.owncloud.android.ui.dialog.SharePasswordDialogFragment;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -193,9 +193,9 @@ public class ShareFileFragment extends Fragment
         // Setup layout
         // Image
         ImageView icon = (ImageView) view.findViewById(R.id.shareFileIcon);
-        icon.setImageResource(MimetypeIconUtil.getFileTypeIconId(mFile.getMimetype(),
+        icon.setImageResource(MimeTypeUtil.getFileTypeIconId(mFile.getMimetype(),
                 mFile.getFileName()));
-        if (mFile.isImage()) {
+        if (MimeTypeUtil.isImage(mFile)) {
             String remoteId = String.valueOf(mFile.getRemoteId());
             Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(remoteId);
             if (thumbnail != null) {

+ 91 - 0
src/com/owncloud/android/ui/helpers/SparseBooleanArrayParcelable.java

@@ -0,0 +1,91 @@
+/**
+ *   ownCloud Android client application
+ *
+ *   @author David A. Velasco
+ *   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,
+ *   as published by the Free Software Foundation.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui.helpers;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.SparseBooleanArray;
+
+/**
+ * Wraps a SparseBooleanArrayParcelable to allow its serialization and desearialization
+ * through {@link Parcelable} interface.
+ */
+public class SparseBooleanArrayParcelable implements Parcelable {
+
+    public static Parcelable.Creator<SparseBooleanArrayParcelable> CREATOR =
+        new Parcelable.Creator<SparseBooleanArrayParcelable>() {
+
+        @Override
+        public SparseBooleanArrayParcelable createFromParcel(Parcel source) {
+            // read size of array from source
+            int size = source.readInt();
+
+            // then pairs of (key, value)s, in the object to wrap
+            SparseBooleanArray sba = new SparseBooleanArray();
+            int key;
+            boolean value;
+            for (int i = 0; i < size; i++) {
+                key = source.readInt();
+                value = (source.readInt() != 0);
+                sba.put(key, value);
+            }
+
+            // wrap SparseBooleanArray
+            return new SparseBooleanArrayParcelable(sba);
+        }
+
+        @Override
+        public SparseBooleanArrayParcelable[] newArray(int size) {
+            return new SparseBooleanArrayParcelable[size];
+        }
+    };
+
+    private final SparseBooleanArray mSba;
+
+    public SparseBooleanArrayParcelable(SparseBooleanArray sba) {
+        if (sba == null) {
+            throw new IllegalArgumentException("Cannot wrap a null SparseBooleanArray");
+        }
+        mSba = sba;
+    }
+
+    public SparseBooleanArray getSparseBooleanArray() {
+        return mSba;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        // first, size of the array
+        dest.writeInt(mSba.size());
+
+        // then, pairs of (key, value)
+        for (int i = 0; i < mSba.size(); i++) {
+            dest.writeInt(mSba.keyAt(i));
+            dest.writeInt(mSba.valueAt(i) ? 1 : 0);
+        }
+
+    }
+}

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

@@ -57,6 +57,7 @@ import com.owncloud.android.operations.SynchronizeFileOperation;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.fragment.FileFragment;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 /**
@@ -514,7 +515,7 @@ public class PreviewImageActivity extends FileActivity implements
             if (file == null) {
                 throw new IllegalStateException("Instanced with a NULL OCFile");
             }
-            if (!file.isImage()) {
+            if (!MimeTypeUtil.isImage(file)) {
                 throw new IllegalArgumentException("Non-image file passed as argument");
             }
             

+ 4 - 3
src/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@ -19,8 +19,6 @@
  */
 package com.owncloud.android.ui.preview;
 
-import java.lang.ref.WeakReference;
-
 import android.accounts.Account;
 import android.annotation.SuppressLint;
 import android.app.Activity;
@@ -50,6 +48,9 @@ import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.fragment.FileFragment;
 import com.owncloud.android.utils.BitmapUtils;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.MimeTypeUtil;
+
+import java.lang.ref.WeakReference;
 
 import third_parties.michaelOrtiz.TouchImageViewCustom;
 
@@ -551,7 +552,7 @@ public class PreviewImageFragment extends FileFragment {
      * @return          'True' if the file can be handled by the fragment.
      */
     public static boolean canBePreviewed(OCFile file) {
-        return (file != null && file.isImage());
+        return (file != null && MimeTypeUtil.isImage(file));
     }
 
 

+ 9 - 9
src/com/owncloud/android/ui/preview/PreviewMediaFragment.java

@@ -61,6 +61,7 @@ import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.fragment.FileFragment;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 /**
@@ -116,7 +117,6 @@ public class PreviewMediaFragment extends FileFragment implements
         mAutoplay = autoplay;
     }
 
-
     /**
      * Creates an empty fragment for previews.
      * <p/>
@@ -197,7 +197,7 @@ public class PreviewMediaFragment extends FileFragment implements
 
         }
         if (file != null && file.isDown()) {
-            if (file.isVideo()) {
+            if (MimeTypeUtil.isVideo(file)) {
                 mVideoPreview.setVisibility(View.VISIBLE);
                 mImagePreview.setVisibility(View.GONE);
                 prepareVideo();
@@ -218,7 +218,7 @@ public class PreviewMediaFragment extends FileFragment implements
      * @param file audio file with potential cover art
      */
     private void extractAndSetCoverArt(OCFile file) {
-        if (file.isAudio()) {
+        if (MimeTypeUtil.isAudio(file)) {
             try {
                 MediaMetadataRetriever mmr = new MediaMetadataRetriever();
                 mmr.setDataSource(file.getStoragePath());
@@ -247,7 +247,7 @@ public class PreviewMediaFragment extends FileFragment implements
         outState.putParcelable(PreviewMediaFragment.EXTRA_FILE, getFile());
         outState.putParcelable(PreviewMediaFragment.EXTRA_ACCOUNT, mAccount);
 
-        if (getFile().isVideo()) {
+        if (MimeTypeUtil.isVideo(getFile())) {
             if (mVideoPreview != null) {
                 mSavedPlaybackPosition = mVideoPreview.getCurrentPosition();
                 mAutoplay = mVideoPreview.isPlaying();
@@ -274,12 +274,12 @@ public class PreviewMediaFragment extends FileFragment implements
 
         OCFile file = getFile();
         if (file != null && file.isDown()) {
-            if (file.isAudio()) {
+            if (MimeTypeUtil.isAudio(file)) {
                 bindMediaService();
 
             }
             else {
-                if (file.isVideo()) {
+                if (MimeTypeUtil.isVideo(file)) {
                     stopAudio();
                     playVideo();
                 }
@@ -679,18 +679,18 @@ public class PreviewMediaFragment extends FileFragment implements
      * @return 'True' if the file can be handled by the fragment.
      */
     public static boolean canBePreviewed(OCFile file) {
-        return (file != null && (file.isAudio() || file.isVideo()));
+        return (file != null && (MimeTypeUtil.isAudio(file) || MimeTypeUtil.isVideo(file)));
     }
 
 
     public void stopPreview(boolean stopAudio) {
         OCFile file = getFile();
-        if (file.isAudio() && stopAudio) {
+        if (MimeTypeUtil.isAudio(file) && stopAudio) {
             mMediaServiceBinder.pause();
 
         }
         else {
-            if (file.isVideo()) {
+            if (MimeTypeUtil.isVideo(file)) {
                 mVideoPreview.stopPlayback();
             }
         }

+ 3 - 2
src/com/owncloud/android/ui/preview/PreviewTextFragment.java

@@ -42,6 +42,7 @@ import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
 import com.owncloud.android.ui.dialog.LoadingDialog;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.fragment.FileFragment;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 import java.io.BufferedWriter;
 import java.io.FileInputStream;
@@ -430,9 +431,9 @@ public class PreviewTextFragment extends FileFragment {
         unsupportedTypes.add("text/vnd.rn-realtext");
         unsupportedTypes.add("text/vnd.wap.wml");
         unsupportedTypes.add("text/vnd.wap.wmlscript");
-        return (file != null && file.isDown() && file.isText() &&
+        return (file != null && file.isDown() && MimeTypeUtil.isText(file) &&
                 !unsupportedTypes.contains(file.getMimetype()) &&
-                !unsupportedTypes.contains(file.getMimeTypeFromName())
+                !unsupportedTypes.contains(MimeTypeUtil.getMimeTypeFromPath(file.getRemotePath()))
         );
     }
 

+ 7 - 7
src/com/owncloud/android/ui/preview/PreviewVideoActivity.java

@@ -20,13 +20,7 @@
 
 package com.owncloud.android.ui.preview;
 
-import com.owncloud.android.R;
-import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.media.MediaService;
-import com.owncloud.android.ui.activity.FileActivity;
-
 import android.accounts.Account;
-import android.support.v7.app.AlertDialog;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.media.MediaPlayer;
@@ -35,12 +29,18 @@ import android.media.MediaPlayer.OnErrorListener;
 import android.media.MediaPlayer.OnPreparedListener;
 import android.net.Uri;
 import android.os.Bundle;
+import android.support.v7.app.AlertDialog;
 import android.widget.MediaController;
 import android.widget.VideoView;
 
+import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.accounts.AccountUtils;
 import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
 import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.media.MediaService;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 /**
  *  Activity implementing a basic video player.
@@ -197,7 +197,7 @@ public class PreviewVideoActivity extends FileActivity implements OnCompletionLi
             if (file == null) {
                 throw new IllegalStateException("Instanced with a NULL OCFile");
             }
-            if (!file.isVideo()) {
+            if (!MimeTypeUtil.isVideo(file)) {
                 throw new IllegalArgumentException("Non-video file passed as argument");
             }
             file = getStorageManager().getFileById(file.getFileId()); 

+ 4 - 33
src/com/owncloud/android/utils/BitmapUtils.java

@@ -19,21 +19,18 @@
  */
 package com.owncloud.android.utils;
 
-import com.owncloud.android.authentication.AccountUtils;
-import com.owncloud.android.lib.common.utils.Log_OC;
-
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.graphics.Matrix;
 import android.graphics.BitmapFactory.Options;
+import android.graphics.Matrix;
 import android.media.ExifInterface;
-import android.net.Uri;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
-import android.webkit.MimeTypeMap;
 
-import java.io.File;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.lib.common.utils.Log_OC;
+
 import java.io.UnsupportedEncodingException;
 import java.math.BigInteger;
 import java.security.MessageDigest;
@@ -262,32 +259,6 @@ public class BitmapUtils {
    		return p;
 	}
 
-    /**
-     * Checks if file passed is an image
-     * @param file
-     * @return true/false
-     */
-    public static boolean isImage(File file) {
-        Uri selectedUri = Uri.fromFile(file);
-        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(selectedUri.toString().toLowerCase());
-        String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
-
-        return (mimeType != null && mimeType.startsWith("image/"));
-    }
-
-    /**
-     * Checks if file passed is a video
-     * @param file
-     * @return true/false
-     */
-    public static boolean isVideo(File file) {
-        Uri selectedUri = Uri.fromFile(file);
-        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(selectedUri.toString().toLowerCase());
-        String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
-
-        return (mimeType != null && mimeType.startsWith("video/"));
-    }
-
     /**
      * calculates the RGB value based on a given account name.
      *

+ 103 - 25
src/com/owncloud/android/utils/MimetypeIconUtil.java → src/com/owncloud/android/utils/MimeTypeUtil.java

@@ -19,10 +19,13 @@
 
 package com.owncloud.android.utils;
 
+import android.net.Uri;
 import android.webkit.MimeTypeMap;
 
 import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -38,28 +41,27 @@ import java.util.Map;
  * In order to add further mappings, there are up to three look up maps that need further values:
  * <ol>
  *     <li>
- *         {@link MimetypeIconUtil#FILE_EXTENSION_TO_MIMETYPE_MAPPING}<br/>
+ *         {@link MimeTypeUtil#FILE_EXTENSION_TO_MIMETYPE_MAPPING}<br/>
  *         to add a new file extension to mime type mapping
  *     </li>
  *     <li>
- *         {@link MimetypeIconUtil#MIMETYPE_TO_ICON_MAPPING}<br/>
+ *         {@link MimeTypeUtil#MIMETYPE_TO_ICON_MAPPING}<br/>
  *         to add a new mapping of a mime type to an icon mapping
  *     </li>
  *     <li>
- *         {@link MimetypeIconUtil#MAINMIMETYPE_TO_ICON_MAPPING}<br/>
+ *         {@link MimeTypeUtil#MAIN_MIMETYPE_TO_ICON_MAPPING}<br/>
  *         to add a new mapping for the main part of a mime type.
  *         This is a list of fallback mappings in case there is no mapping for the complete mime type
  *     </li>
  * </ol>
  */
-public class MimetypeIconUtil {
+public class MimeTypeUtil {
     /** Mapping: icon for mime type */
-    private static final Map<String, Integer> MIMETYPE_TO_ICON_MAPPING = new HashMap<String, Integer>();
+    private static final Map<String, Integer> MIMETYPE_TO_ICON_MAPPING = new HashMap<>();
     /** Mapping: icon for main mime type (first part of a mime type declaration). */
-    private static final Map<String, Integer> MAINMIMETYPE_TO_ICON_MAPPING = new HashMap<String, Integer>();
+    private static final Map<String, Integer> MAIN_MIMETYPE_TO_ICON_MAPPING = new HashMap<>();
     /** Mapping: mime type for file extension. */
-    private static final Map<String, List<String>> FILE_EXTENSION_TO_MIMETYPE_MAPPING =
-            new HashMap<String, List<String>>();
+    private static final Map<String, List<String>> FILE_EXTENSION_TO_MIMETYPE_MAPPING = new HashMap<>();
 
     static {
         populateFileExtensionMimeTypeMapping();
@@ -121,28 +123,95 @@ public class MimetypeIconUtil {
      * @return 'True' if the mime type defines image
      */
     public static boolean isImage(String mimeType) {
-        return (mimeType.startsWith("image/") && !mimeType.contains("djvu"));
+        return (mimeType != null && mimeType.toLowerCase().startsWith("image/") && !mimeType.toLowerCase().contains
+                ("djvu"));
     }
 
     /**
      * @return 'True' the mime type defines video
      */
     public static boolean isVideo(String mimeType) {
-        return (mimeType != null && mimeType.startsWith("video/"));
+        return (mimeType != null && mimeType.toLowerCase().startsWith("video/"));
     }
 
     /**
      * @return 'True' the mime type defines audio
      */
-    public boolean isAudio(String mimeType) {
-        return (mimeType != null && mimeType.startsWith("audio/"));
+    public static boolean isAudio(String mimeType) {
+        return (mimeType != null && mimeType.toLowerCase().startsWith("audio/"));
     }
 
     /**
      * @return 'True' if mime type defines text
      */
-    public boolean isText(String mimeType) {
-        return (mimeType != null && mimeType.startsWith("text/"));
+    public static boolean isText(String mimeType) {
+        return (mimeType != null && mimeType.toLowerCase().startsWith("text/"));
+    }
+
+    /**
+     * Checks if file passed is a video.
+     *
+     * @param file the file to be checked
+     * @return 'True' the mime type defines video
+     */
+    public static boolean isVideo(File file) {
+        return isVideo(extractMimeType(file));
+    }
+
+    /**
+     * Checks if file passed is an image.
+     *
+     * @param file the file to be checked
+     * @return 'True' the mime type defines video
+     */
+    public static boolean isImage(File file) {
+        return isImage(extractMimeType(file));
+    }
+
+    /**
+     * @param file the file to be analyzed
+     * @return 'True' if the file contains audio
+     */
+    public static boolean isAudio(OCFile file) {
+        return MimeTypeUtil.isAudio(file.getMimetype());
+    }
+
+    /**
+     * @param file the file to be analyzed
+     * @return 'True' if the file contains video
+     */
+    public static boolean isVideo(OCFile file) {
+        return MimeTypeUtil.isVideo(file.getMimetype());
+    }
+
+    /**
+     * @param file the file to be analyzed
+     * @return 'True' if the file contains an image
+     */
+    public static boolean isImage(OCFile file) {
+        return (MimeTypeUtil.isImage(file.getMimetype())
+                || MimeTypeUtil.isImage(getMimeTypeFromPath(file.getRemotePath())));
+    }
+
+    /**
+     * @param file the file to be analyzed
+     * @return 'True' if the file is simple text (e.g. not application-dependent, like .doc or .docx)
+     */
+    public static boolean isText(OCFile file) {
+        return (MimeTypeUtil.isText(file.getMimetype())
+                || MimeTypeUtil.isText(getMimeTypeFromPath(file.getRemotePath())));
+    }
+
+    /**
+     * Extracts the mime type for the given file.
+     *
+     * @param file the file to be analyzed
+     * @return the file's mime type
+     */
+    private static String extractMimeType(File file) {
+        Uri selectedUri = Uri.fromFile(file);
+        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(selectedUri.toString().toLowerCase());
+        return MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
     }
 
     /**
@@ -170,7 +239,7 @@ public class MimetypeIconUtil {
             for (String mimetype : mimetypes) {
                 String mainMimetypePart = mimetype.split("/")[0];
 
-                Integer iconId = MAINMIMETYPE_TO_ICON_MAPPING.get(mainMimetypePart);
+                Integer iconId = MAIN_MIMETYPE_TO_ICON_MAPPING.get(mainMimetypePart);
                 if (iconId != null) {
                     return iconId;
                 }
@@ -200,11 +269,21 @@ public class MimetypeIconUtil {
             if (mimeType != null) {
                 return Collections.singletonList(mimeType);
             } else {
-                return new ArrayList<String>();
+                return new ArrayList<>();
             }
         }
     }
 
+    public static String getMimeTypeFromPath(String path) {
+        String extension = "";
+        int pos = path.lastIndexOf('.');
+        if (pos >= 0) {
+            extension = path.substring(pos + 1);
+        }
+        String result = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase());
+        return (result != null) ? result : "";
+    }
+
     /**
      * provides the file extension of a given filename.
      *
@@ -212,8 +291,7 @@ public class MimetypeIconUtil {
      * @return the file extension
      */
     private static String getExtension(String filename) {
-        String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
-        return extension;
+        return filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
     }
 
     /**
@@ -311,13 +389,13 @@ public class MimetypeIconUtil {
      * populates the mapping list: main mime type --> icon.
      */
     private static void populateMainMimeTypeMapping() {
-        MAINMIMETYPE_TO_ICON_MAPPING.put("audio", R.drawable.file_sound);
-        MAINMIMETYPE_TO_ICON_MAPPING.put("database", R.drawable.file);
-        MAINMIMETYPE_TO_ICON_MAPPING.put("httpd", R.drawable.file_zip);
-        MAINMIMETYPE_TO_ICON_MAPPING.put("image", R.drawable.file_image);
-        MAINMIMETYPE_TO_ICON_MAPPING.put("text", R.drawable.file_text);
-        MAINMIMETYPE_TO_ICON_MAPPING.put("video", R.drawable.file_movie);
-        MAINMIMETYPE_TO_ICON_MAPPING.put("web", R.drawable.file_code);
+        MAIN_MIMETYPE_TO_ICON_MAPPING.put("audio", R.drawable.file_sound);
+        MAIN_MIMETYPE_TO_ICON_MAPPING.put("database", R.drawable.file);
+        MAIN_MIMETYPE_TO_ICON_MAPPING.put("httpd", R.drawable.file_zip);
+        MAIN_MIMETYPE_TO_ICON_MAPPING.put("image", R.drawable.file_image);
+        MAIN_MIMETYPE_TO_ICON_MAPPING.put("text", R.drawable.file_text);
+        MAIN_MIMETYPE_TO_ICON_MAPPING.put("video", R.drawable.file_movie);
+        MAIN_MIMETYPE_TO_ICON_MAPPING.put("web", R.drawable.file_code);
     }
 
     /**

+ 3 - 3
src/com/owncloud/android/utils/UriUtils.java

@@ -238,13 +238,13 @@ public class UriUtils {
         String mimeType = context.getContentResolver().getType(uri);
         if (mimeType != null) {
             String displayNameColumn;
-            if (mimeType.toLowerCase().startsWith("image/")) {
+            if (MimeTypeUtil.isImage(mimeType)) {
                 displayNameColumn = MediaStore.Images.ImageColumns.DISPLAY_NAME;
 
-            } else if (mimeType.toLowerCase().startsWith("video/")) {
+            } else if (MimeTypeUtil.isVideo(mimeType)) {
                 displayNameColumn = MediaStore.Video.VideoColumns.DISPLAY_NAME;
 
-            } else if (mimeType.toLowerCase().startsWith("audio/")) {
+            } else if (MimeTypeUtil.isAudio(mimeType)) {
                 displayNameColumn = MediaStore.Audio.AudioColumns.DISPLAY_NAME;
 
             } else {

+ 3 - 3
src/org/nextcloud/providers/cursors/FileCursor.java

@@ -26,7 +26,7 @@ import android.os.Build;
 import android.provider.DocumentsContract.Document;
 
 import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 @TargetApi(Build.VERSION_CODES.KITKAT)
 public class FileCursor extends MatrixCursor {
@@ -44,9 +44,9 @@ public class FileCursor extends MatrixCursor {
     public void addFile(OCFile file) {
         if (file == null) return;
 
-        final int iconRes = MimetypeIconUtil.getFileTypeIconId(file.getMimetype(), file.getFileName());
+        final int iconRes = MimeTypeUtil.getFileTypeIconId(file.getMimetype(), file.getFileName());
         final String mimeType = file.isFolder() ? Document.MIME_TYPE_DIR : file.getMimetype();
-        final String imagePath = file.isImage() && file.isDown() ? file.getStoragePath() : null;
+        final String imagePath = MimeTypeUtil.isImage(file) && file.isDown() ? file.getStoragePath() : null;
         int flags = imagePath != null ? Document.FLAG_SUPPORTS_THUMBNAIL : 0;
 
         newRow().add(Document.COLUMN_DOCUMENT_ID, Long.toString(file.getFileId()))