浏览代码

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 年之前
父节点
当前提交
fc6e3fc458
共有 74 个文件被更改,包括 957 次插入1252 次删除
  1. 12 13
      androidTest/java/com/owncloud/android/uiautomator/InitialTest.java
  2. 4 2
      build.gradle
  3. 二进制
      res/drawable-hdpi/ic_account_circle_white_18dp.png
  4. 二进制
      res/drawable-mdpi/ic_account_circle_white_18dp.png
  5. 二进制
      res/drawable-xhdpi/ic_account_circle_white_18dp.png
  6. 二进制
      res/drawable-xxhdpi/ic_account_circle_white_18dp.png
  7. 二进制
      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;
 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.Context;
 import android.content.Intent;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 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.UiSelector;
 import android.support.test.uiautomator.Until;
 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.hamcrest.CoreMatchers.notNullValue;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertThat;
@@ -59,7 +58,6 @@ public class InitialTest {
     public void initializeDevice() {
     public void initializeDevice() {
         // Initialize UiDevice instance
         // Initialize UiDevice instance
         mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
         mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
-
     }
     }
 
 
     @Test
     @Test
@@ -114,7 +112,6 @@ public class InitialTest {
         context.startActivity(intent);
         context.startActivity(intent);
 
 
         clickByText(SETTINGS_DATA_USAGE_OPTION);
         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
      * @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();
         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
      * @throws UiObjectNotFoundException
      */
      */
     private void clickByText(String 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();
         obj.clickAndWaitForNewWindow();
     }
     }
 }
 }

+ 4 - 2
build.gradle

@@ -41,7 +41,6 @@ dependencies {
     compile "com.android.support:design:${supportLibraryVersion}"
     compile "com.android.support:design:${supportLibraryVersion}"
     compile 'com.jakewharton:disklrucache:2.0.2'
     compile 'com.jakewharton:disklrucache:2.0.2'
     compile "com.android.support:appcompat-v7:${supportLibraryVersion}"
     compile "com.android.support:appcompat-v7:${supportLibraryVersion}"
-    compile "com.android.support:cardview-v7:${supportLibraryVersion}"
     compile 'com.getbase:floatingactionbutton:1.10.1'
     compile 'com.getbase:floatingactionbutton:1.10.1'
 
 
     /// dependencies for local unit tests
     /// dependencies for local unit tests
@@ -62,7 +61,10 @@ dependencies {
     androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
     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
     // 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}"
 
 
 }
 }
 
 

二进制
res/drawable-hdpi/ic_account_circle_white_18dp.png


二进制
res/drawable-mdpi/ic_account_circle_white_18dp.png


二进制
res/drawable-xhdpi/ic_account_circle_white_18dp.png


二进制
res/drawable-xxhdpi/ic_account_circle_white_18dp.png


二进制
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"?>
 <?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 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,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   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 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
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     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"?>
 <?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,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   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 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"
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_width="fill_parent"
     android:layout_height="@dimen/account_item_layout_height"
     android:layout_height="@dimen/account_item_layout_height"
     android:orientation="horizontal"
     android:orientation="horizontal"
     android:weightSum="1">
     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:id="@+id/passwordButton"
         android:layout_width="wrap_content"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
         android:layout_gravity="center_vertical"
         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:paddingBottom="@dimen/standard_padding"
+        android:paddingLeft="@dimen/standard_half_padding"
         android:paddingRight="@dimen/standard_half_padding"
         android:paddingRight="@dimen/standard_half_padding"
-        android:background="?android:selectableItemBackground"
+        android:paddingTop="@dimen/standard_padding"
         android:src="@drawable/ic_key"/>
         android:src="@drawable/ic_key"/>
 
 
-    <ImageButton
+    <ImageView
         android:id="@+id/removeButton"
         android:id="@+id/removeButton"
         android:layout_width="wrap_content"
         android:layout_width="wrap_content"
         android:layout_height="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:layout_gravity="center_vertical"
-        android:paddingLeft="@dimen/standard_half_padding"
-        android:paddingTop="@dimen/standard_padding"
         android:paddingBottom="@dimen/standard_padding"
         android:paddingBottom="@dimen/standard_padding"
+        android:paddingLeft="@dimen/standard_half_padding"
         android:paddingRight="@dimen/standard_padding"
         android:paddingRight="@dimen/standard_padding"
-        android:background="?android:selectableItemBackground"
+        android:paddingTop="@dimen/standard_padding"
         android:src="@drawable/ic_action_delete_grey"/>
         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"?>
 <?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 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,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   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 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
 <LinearLayout
 	android:id="@+id/upload_files_layout"
 	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,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   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.
   GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
 
   You should have received a copy of the GNU Affero General Public
   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"
 <merge xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        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,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   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.
   GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
 
   You should have received a copy of the GNU Affero General Public
   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"
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="match_parent"
               android:layout_width="match_parent"
               android:layout_height="@dimen/nav_drawer_header_height"
               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
             <ImageView
                 android:id="@+id/thumbnail"
                 android:id="@+id/thumbnail"
-                android:layout_width="@dimen/file_icon_size"
+                android:layout_width="32dp"
                 android:layout_height="@dimen/file_icon_size"
                 android:layout_height="@dimen/file_icon_size"
                 android:layout_gravity="left|center_vertical"
                 android:layout_gravity="left|center_vertical"
                 android:src="@drawable/ic_menu_archive" />
                 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,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   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.
   GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
 
   You should have received a copy of the GNU Affero General Public
   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"
 <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout"
                                         xmlns:android="http://schemas.android.com/apk/res/android"
                                         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"?>
 <?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,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   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 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.support.design.widget.AppBarLayout
     android:id="@+id/appbar"
     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_wrn_no_account_quit_btn_text">Изход</string>
     <string name="uploader_error_title_no_file_to_upload">Няма файл за качване</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_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_title_file_cannot_be_uploaded">Файлът не може да бъде качен</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s нямате право да четете получения фаил</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s нямате право да четете получения фаил</string>
     <string name="uploader_error_message_source_file_not_found">Файл за качване не е намерен. Моля, проверете дали файлът съществува.</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="downloader_download_failed_credentials_error">Свалянето провалено, трябва да влезете отново</string>
     <string name="common_choose_account">Изберете профил</string>
     <string name="common_choose_account">Изберете профил</string>
     <string name="sync_fail_ticker">Синхронизацията се провали</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">Синхронизацията на %1$s не може да бъде завършена</string>
     <string name="sync_fail_content_unauthorized">Неправилна парола за %1$s.</string>
     <string name="sync_fail_content_unauthorized">Неправилна парола за %1$s.</string>
     <string name="sync_conflicts_in_favourites_ticker">Открити са конфликти</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_local_text">Локален: %1$s</string>
     <string name="foreign_files_remote_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="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">Въведете кода за достъп</string>
     <string name="pass_code_configure_your_pass_code_explanation">Кода ще бъде изискван при всяко стартиране на приложението</string>
     <string name="pass_code_configure_your_pass_code_explanation">Кода ще бъде изискван при всяко стартиране на приложението</string>
     <string name="pass_code_reenter_your_pass_code">Моля, въведи отново кода за достъп</string>
     <string name="pass_code_reenter_your_pass_code">Моля, въведи отново кода за достъп</string>
@@ -249,6 +253,7 @@
     <string name="filename_empty">Името на файла не може да бъде празно</string>
     <string name="filename_empty">Името на файла не може да бъде празно</string>
     <string name="wait_a_moment">Моля, изчакайте</string>
     <string name="wait_a_moment">Моля, изчакайте</string>
     <string name="wait_checking_credentials">Проверка на съхранените пълномощия</string>
     <string name="wait_checking_credentials">Проверка на съхранените пълномощия</string>
+    <string name="filedisplay_unexpected_bad_get_content">Неочакван проблем. Моля, изберете файла от друго приложение.</string>
     <string name="filedisplay_no_file_selected">Не сте избрали файл</string>
     <string name="filedisplay_no_file_selected">Не сте избрали файл</string>
     <string name="activity_chooser_title">Изпращане на връзката чрез...</string>
     <string name="activity_chooser_title">Изпращане на връзката чрез...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Копиране на файла от личното хранилище</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="error_cant_bind_to_operations_service">Критична грешка: операциите не могат да бъдат изпълнени</string>
 
 
     <string name="network_error_socket_exception">Възникна грешка при свързването със сървъра.</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="empty" />
 
 
     <string name="forbidden_permissions">Нямате разрешение за достъп до %s</string>
     <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_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_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_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_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_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>
     <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="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="common_choose_account">Vybrat účet</string>
     <string name="sync_fail_ticker">Synchronizace selhala</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">Synchronizace %1$s nemohla být dokončena</string>
     <string name="sync_fail_content_unauthorized">Chybné heslo pro %1$s</string>
     <string name="sync_fail_content_unauthorized">Chybné heslo pro %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Nalezeny konflikty</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_local_text">Místní: %1$s</string>
     <string name="foreign_files_remote_text">Vzdálené: %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="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">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_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>
     <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="filename_empty">Název nemůže být prázdný</string>
     <string name="wait_a_moment">Počkejte chvíli</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="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="filedisplay_no_file_selected">Žádný soubor nebyl vybrán</string>
     <string name="activity_chooser_title">Odeslat odkaz ...</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Nemáte oprávnění %s</string>
     <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_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_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_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_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_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>
     <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="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="common_choose_account">Konto auswählen</string>
     <string name="sync_fail_ticker">Synchronisation fehlgeschlagen</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">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_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_ticker">Konflikte gefunden</string>
@@ -170,6 +172,8 @@
     <string name="foreign_files_local_text">Lokal: %1$s</string>
     <string name="foreign_files_local_text">Lokal: %1$s</string>
     <string name="foreign_files_remote_text">Remote: %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="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">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_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>
     <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="filename_empty">Dateiname darf nicht leer sein</string>
     <string name="wait_a_moment">Bitte warten Sie einen Moment.</string>
     <string name="wait_a_moment">Bitte warten Sie einen Moment.</string>
     <string name="wait_checking_credentials">Überprüfe gespeicherte Anmeldeinformationen</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="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string>
     <string name="activity_chooser_title">Link senden an …</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Sie haben keine Berechtigung %s</string>
     <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_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_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_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_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_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>
     <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="downloader_download_failed_credentials_error">Herunterladen fehlgeschlagen, erneute Anmeldung erforderlich</string>
     <string name="common_choose_account">Konto auswählen</string>
     <string name="common_choose_account">Konto auswählen</string>
     <string name="sync_fail_ticker">Synchronisation fehlgeschlagen</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">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_fail_content_unauthorized">Falsches Passwort für %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Konflikte gefunden</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_local_text">Lokal: %1$s</string>
     <string name="foreign_files_remote_text">Remote: %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="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">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_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>
     <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="filename_empty">Dateiname darf nicht leer sein</string>
     <string name="wait_a_moment">Bitte warte einen Moment.</string>
     <string name="wait_a_moment">Bitte warte einen Moment.</string>
     <string name="wait_checking_credentials">Überprüfe gespeicherte Anmeldeinformationen</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="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string>
     <string name="activity_chooser_title">Link senden an…</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Sie haben keine Berechtigung %s</string>
     <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_accounts">Accounts</string>
     <string name="prefs_manage_accounts">Manage accounts</string>
     <string name="prefs_manage_accounts">Manage accounts</string>
     <string name="prefs_passcode">Passcode lock</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">Instant picture uploads</string>
     <string name="prefs_instant_upload_summary">Instantly upload pictures taken by camera</string>
     <string name="prefs_instant_upload_summary">Instantly upload pictures taken by camera</string>
     <string name="prefs_instant_video_upload">Instant video uploads</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_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_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_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_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_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>
     <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="downloader_download_failed_credentials_error">Download failed, you need to log in again</string>
     <string name="common_choose_account">Choose account</string>
     <string name="common_choose_account">Choose account</string>
     <string name="sync_fail_ticker">Sync failed</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">Sync of %1$s could not be completed</string>
     <string name="sync_fail_content_unauthorized">Invalid password for %1$s</string>
     <string name="sync_fail_content_unauthorized">Invalid password for %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Conflicts found</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_local_text">Local: %1$s</string>
     <string name="foreign_files_remote_text">Remote: %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="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">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_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>
     <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="filename_empty">File name cannot be empty</string>
     <string name="wait_a_moment">Wait a moment</string>
     <string name="wait_a_moment">Wait a moment</string>
     <string name="wait_checking_credentials">Checking stored credentials</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="filedisplay_no_file_selected">No file was selected</string>
     <string name="activity_chooser_title">Send link to …</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">You do not have permission %s</string>
     <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_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_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_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_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_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>
     <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="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="common_choose_account">Elija una cuenta</string>
     <string name="sync_fail_ticker">Sincronización fallida</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">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_fail_content_unauthorized">Contraseña no válida para %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Se encontraron conflictos</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_local_text">Local: %1$s</string>
     <string name="foreign_files_remote_text">Remoto: %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="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">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_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>
     <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="filename_empty">El nombre de archivo no puede estar vacío</string>
     <string name="wait_a_moment">Espere un momento</string>
     <string name="wait_a_moment">Espere un momento</string>
     <string name="wait_checking_credentials">Comprobando las credenciales guardadas</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="filedisplay_no_file_selected">No hay ficheros seleccionados.</string>
     <string name="activity_chooser_title">Enviar enlace a...</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">No tiene permiso %s</string>
     <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_title_history">Historique de la journalisation</string>
     <string name="prefs_log_summary_history">Cela affiche les logs enregistrés</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_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_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_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>
     <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_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_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_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_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_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>
     <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="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="common_choose_account">Choisissez un compte</string>
     <string name="sync_fail_ticker">La synchronisation a échoué</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">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_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>
     <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_local_text">Local : %1$s</string>
     <string name="foreign_files_remote_text">Distant : %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="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">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_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>
     <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="filename_empty">Le nom du fichier ne peut pas être vide</string>
     <string name="wait_a_moment">Veuillez patienter</string>
     <string name="wait_a_moment">Veuillez patienter</string>
     <string name="wait_checking_credentials">Vérification des identifiants enregistrés</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="filedisplay_no_file_selected">Aucun fichier n\'était sélectionné</string>
     <string name="activity_chooser_title">Envoyer le lien vers…</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Vous n\'avez pas la permission %s</string>
     <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_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_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_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_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_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>
     <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="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="common_choose_account">Válasszon azonosítót</string>
     <string name="sync_fail_ticker">Sziknronizálás hiba</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">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_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>
     <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_local_text">Helyi: %1$s</string>
     <string name="foreign_files_remote_text">Távoli: %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="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">Í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_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>
     <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="filename_empty">A fájl név nem lehet üres</string>
     <string name="wait_a_moment">Egy pillanat...</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="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="filedisplay_no_file_selected">Egy fájl sincs kiválasztva</string>
     <string name="activity_chooser_title">Hivatkozás küldése ...</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Nincs jogosultságod ehhez: %s</string>
     <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_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_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_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_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_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>
     <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="downloader_download_failed_credentials_error">Pengunduhan gagal, mohon log masuk lagi</string>
     <string name="common_choose_account">Pilih akun</string>
     <string name="common_choose_account">Pilih akun</string>
     <string name="sync_fail_ticker">Sinkron gagal</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">Sinkronisasi %1$s tidak dapat diselesaikan</string>
     <string name="sync_fail_content_unauthorized">Sandi salah untuk %1$s</string>
     <string name="sync_fail_content_unauthorized">Sandi salah untuk %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Konflik ditemukan</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_local_text">Lokal: %1$s</string>
     <string name="foreign_files_remote_text">Remote: %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="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">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_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>
     <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="filename_empty">Nama berkas tidak boleh kosong</string>
     <string name="wait_a_moment">Tunggu sebentar</string>
     <string name="wait_a_moment">Tunggu sebentar</string>
     <string name="wait_checking_credentials">Mengecek kredensial yang tersimpan</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="filedisplay_no_file_selected">Tidak ada berkas yang terpilih</string>
     <string name="activity_chooser_title">Kirim taukan ke</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Anda tidak memiliki izin %s</string>
     <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_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_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_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_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_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>
     <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="downloader_download_failed_credentials_error">Scaricamento non riuscito, devi effettuare nuovamente l\'accesso</string>
     <string name="common_choose_account">Scegli account</string>
     <string name="common_choose_account">Scegli account</string>
     <string name="sync_fail_ticker">Sincronizzazione non riuscita</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">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_fail_content_unauthorized">Password non valida per %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Conflitti rilevati</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_local_text">Locale: %1$s</string>
     <string name="foreign_files_remote_text">Remoto %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="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">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_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>
     <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="filename_empty">Il nome del file non può essere vuoto</string>
     <string name="wait_a_moment">Attendi</string>
     <string name="wait_a_moment">Attendi</string>
     <string name="wait_checking_credentials">Controllo delle credenziali memorizzate</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="filedisplay_no_file_selected">Non è stato selezionato alcun file</string>
     <string name="activity_chooser_title">Invia collegamento a...</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Non hai i permessi %s</string>
     <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_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_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_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_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_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>
     <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="downloader_download_failed_credentials_error">Nedlasting feilet, du må logge inn på nytt</string>
     <string name="common_choose_account">Velg konto</string>
     <string name="common_choose_account">Velg konto</string>
     <string name="sync_fail_ticker">Synkronisering feilet</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">Synkronisering av %1$s kunne ikke fullføres</string>
     <string name="sync_fail_content_unauthorized">Ugyldig passord for %1$s</string>
     <string name="sync_fail_content_unauthorized">Ugyldig passord for %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Konflikter funnet</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_local_text">Lokal: %1$s</string>
     <string name="foreign_files_remote_text">Ekstern: %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="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">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_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>
     <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="filename_empty">Filnavn kan ikke være tomt</string>
     <string name="wait_a_moment">Vent et øyeblikk</string>
     <string name="wait_a_moment">Vent et øyeblikk</string>
     <string name="wait_checking_credentials">Sjekker lagrede påloggingsdetaljer</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="filedisplay_no_file_selected">Ingen fil ble valgt</string>
     <string name="activity_chooser_title">Send lenke til ...</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Du har ikke tillatelse til %s</string>
     <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_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_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_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_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_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>
     <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="downloader_download_failed_credentials_error">Download mislukt, u moet opnieuw inloggen</string>
     <string name="common_choose_account">Kies account</string>
     <string name="common_choose_account">Kies account</string>
     <string name="sync_fail_ticker">Sync mislukt</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">Synchronisatie van %1$s kon niet worden voltooid</string>
     <string name="sync_fail_content_unauthorized">Ongeldig wachtwoord voor %1$s</string>
     <string name="sync_fail_content_unauthorized">Ongeldig wachtwoord voor %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Conflicten gevonden</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_local_text">Lokaal: %1$s</string>
     <string name="foreign_files_remote_text">Extern: %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="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">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_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>
     <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="filename_empty">Bestandsnaam mag niet leeg zijn</string>
     <string name="wait_a_moment">Even geduld</string>
     <string name="wait_a_moment">Even geduld</string>
     <string name="wait_checking_credentials">Opgeslagen inloggegevens nakijken</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="filedisplay_no_file_selected">Er werd geen bestand geselecteerd</string>
     <string name="activity_chooser_title">Verstuur link naar ...</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Je mist autorisatie %s</string>
     <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_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_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_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_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_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>
     <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="downloader_download_failed_credentials_error">Błąd podczas pobierania, zaloguj się ponownie</string>
     <string name="common_choose_account">Wybierz konto</string>
     <string name="common_choose_account">Wybierz konto</string>
     <string name="sync_fail_ticker">Nieudana synchronizacja </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">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_fail_content_unauthorized">Niepoprawne hasło dla %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Znaleziono konflikty</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_local_text">Lokalnie: %1$s</string>
     <string name="foreign_files_remote_text">Zdalnie: %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="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">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_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>
     <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="filename_empty">Nazwa pliku nie może być pusta.</string>
     <string name="wait_a_moment">Poczekaj chwilę</string>
     <string name="wait_a_moment">Poczekaj chwilę</string>
     <string name="wait_checking_credentials">Sprawdzanie danych</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="filedisplay_no_file_selected">Nie wybrano żadnych plików</string>
     <string name="activity_chooser_title">Wyślij link do ...</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Nie masz uprawnień %s</string>
     <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_title_history">Histórico de logins</string>
     <string name="prefs_log_summary_history">Mostra os registros gravados</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_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_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_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>
     <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_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_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_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_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_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>
     <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="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="common_choose_account">Escolha a conta</string>
     <string name="sync_fail_ticker">Falha na sincronização</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">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_fail_content_unauthorized">Senha inválida para %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Conflitos encontrados</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_local_text">Local: %1$s</string>
     <string name="foreign_files_remote_text">Remoto: %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="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">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_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>
     <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="filename_empty">O nome do arquivo não pode estar vazio</string>
     <string name="wait_a_moment">Aguarde um momento</string>
     <string name="wait_a_moment">Aguarde um momento</string>
     <string name="wait_checking_credentials">Verificando credenciais salvas</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="filedisplay_no_file_selected">Nenhum arquivo foi selecionado</string>
     <string name="activity_chooser_title">Enviar o link para</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Você não tem premissão %s</string>
     <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_wrn_no_account_quit_btn_text">Выход</string>
     <string name="uploader_error_title_no_file_to_upload">Не выбран файл для загрузки</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_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_title_file_cannot_be_uploaded">Файл не может быть загружен</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s не позволено читать принятый файл</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s не позволено читать принятый файл</string>
     <string name="uploader_error_message_source_file_not_found">Файл для загрузки не был найден в положенном месте. Пожалуйста проверьте, существует ли файл.</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="downloader_download_failed_credentials_error">Скачивание не удалось, вам необходимо войти повторно</string>
     <string name="common_choose_account">Выберите учётную запись</string>
     <string name="common_choose_account">Выберите учётную запись</string>
     <string name="sync_fail_ticker">Синхронизация не удалась</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">Синхронизация %1$s не может быть завершена</string>
     <string name="sync_fail_content_unauthorized">Неверный пароль для %1$s</string>
     <string name="sync_fail_content_unauthorized">Неверный пароль для %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Обнаружены конфликты</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_local_text">Локальные: %1$s</string>
     <string name="foreign_files_remote_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="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">Укажите ваш код</string>
     <string name="pass_code_configure_your_pass_code_explanation">Код будет запрашиваться каждый раз при запуске приложения</string>
     <string name="pass_code_configure_your_pass_code_explanation">Код будет запрашиваться каждый раз при запуске приложения</string>
     <string name="pass_code_reenter_your_pass_code">Пожалуйста укажите ваш код ещё раз</string>
     <string name="pass_code_reenter_your_pass_code">Пожалуйста укажите ваш код ещё раз</string>
@@ -253,6 +257,7 @@
     <string name="filename_empty">Имя файла не может быть пустым</string>
     <string name="filename_empty">Имя файла не может быть пустым</string>
     <string name="wait_a_moment">Подождите немного</string>
     <string name="wait_a_moment">Подождите немного</string>
     <string name="wait_checking_credentials">Проверка сохранённых учётных данных</string>
     <string name="wait_checking_credentials">Проверка сохранённых учётных данных</string>
+    <string name="filedisplay_unexpected_bad_get_content">Неизвестная ошибка; выберите этот файл из другого приложения</string>
     <string name="filedisplay_no_file_selected">Файлы не выбраны</string>
     <string name="filedisplay_no_file_selected">Файлы не выбраны</string>
     <string name="activity_chooser_title">Отправить ссылку ...</string>
     <string name="activity_chooser_title">Отправить ссылку ...</string>
     <string name="wait_for_tmp_copy_from_private_storage">Копирование файла из частной хранилища</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="error_cant_bind_to_operations_service">Критическая ошибка: невозможно выполнить действия</string>
 
 
     <string name="network_error_socket_exception">При подключении к серверу возникла ошибка</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="empty" />
 
 
     <string name="forbidden_permissions">У вас нет прав %s</string>
     <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_title_history">Zgodovina beleženja</string>
     <string name="prefs_log_summary_history">Pokaže shranjene dnevnike</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_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_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_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>
     <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_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_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_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_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_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>
     <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="downloader_download_failed_credentials_error">Prejemanje je spodletelo. Zahtevana je ponovna prijava.</string>
     <string name="common_choose_account">Izbor računa</string>
     <string name="common_choose_account">Izbor računa</string>
     <string name="sync_fail_ticker">Usklajevanje je spodletelo</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">Usklajevanja %1$s ni mogoče končati</string>
     <string name="sync_fail_content_unauthorized">Neveljavno geslo za %1$s</string>
     <string name="sync_fail_content_unauthorized">Neveljavno geslo za %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Zaznani spori</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_local_text">Krajevno: %1$s</string>
     <string name="foreign_files_remote_text">Oddaljeno: %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="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">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_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>
     <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="filename_empty">Ime datoteke ne sme biti prazno</string>
     <string name="wait_a_moment">Počakajte trenutek ...</string>
     <string name="wait_a_moment">Počakajte trenutek ...</string>
     <string name="wait_checking_credentials">Poteka preverjanje shranjenih poveril</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="filedisplay_no_file_selected">Ni izbranih datotek</string>
     <string name="activity_chooser_title">Pošlji povezavo ...</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Ni ustreznega dovoljenja %s</string>
     <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_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_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_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_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_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>
     <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="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="common_choose_account">Zgjidhni llogari</string>
     <string name="sync_fail_ticker">Njëkohësimi dështoi</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">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_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>
     <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_local_text">Vendore: %1$s</string>
     <string name="foreign_files_remote_text">E largët: %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="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">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_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>
     <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="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_a_moment">Pritni një çast</string>
     <string name="wait_checking_credentials">Po kontrollohen kredenciale të depozituara</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="filedisplay_no_file_selected">S\’u përzgjodh kartelë</string>
     <string name="activity_chooser_title">Dërgoni lidhje te …</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Nuk keni leje %s</string>
     <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_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_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_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_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_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>
     <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="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="common_choose_account">Välj konto</string>
     <string name="sync_fail_ticker">Synkronisering misslyckades</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">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_fail_content_unauthorized">Felaktigt lösenord för %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">Konflikter uppstod</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_local_text">Lokal: %1$s</string>
     <string name="foreign_files_remote_text">Fjärr: %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="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">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_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>
     <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="filename_empty">Filnamnet får inte lämnas blankt</string>
     <string name="wait_a_moment">Var god vänta</string>
     <string name="wait_a_moment">Var god vänta</string>
     <string name="wait_checking_credentials">Kontrollerar lagrade inloggningsuppgifter</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="filedisplay_no_file_selected">Ingen fil vald</string>
     <string name="activity_chooser_title">Sänd länk till ...</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>
     <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="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="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_title">Använd undermappar</string>
     <string name="prefs_instant_upload_path_use_subfolders_summary">Spara i undermappar baserad på år och månad</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="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_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="empty" />
 
 
     <string name="forbidden_permissions">Du har inga rättigheter %s</string>
     <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_instant_uploading">Direktuppladdningar</string>
     <string name="prefs_category_details">Detaljer</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="shared_subject_header">delad</string>
 	<string name="with_you_subject_header">med dig</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_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_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_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_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_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>
     <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="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="common_choose_account">Hesap seçin</string>
     <string name="sync_fail_ticker">Eşitleme başarısız</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">%1$s eşitlemesi tamamlanamadı</string>
     <string name="sync_fail_content_unauthorized">%1$s için geçersiz parola</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>
     <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_local_text">Yerel: %1$s</string>
     <string name="foreign_files_remote_text">Uzak: %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="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">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_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>
     <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="filename_empty">Dosya adı boş olamaz</string>
     <string name="wait_a_moment">Bir süre bekleyin</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="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="filedisplay_no_file_selected">Hiçbir dosya seçilmedi</string>
     <string name="activity_chooser_title">Bağlantıyı gönder ...</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>
     <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="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_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="empty" />
 
 
     <string name="forbidden_permissions">%s izniniz yok</string>
     <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_title_history">記錄檔</string>
     <string name="prefs_log_summary_history">顯示之前的記錄檔</string>
     <string name="prefs_log_summary_history">顯示之前的記錄檔</string>
     <string name="prefs_log_delete_history_button">刪除記錄</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_address_resolve_error">帳號的伺服器位址無法被 DAVdroid 辨認</string>
     <string name="prefs_calendar_contacts_no_store_error">未安裝 Google Play 商店或是 F-Droid 應用程式</string>
     <string name="prefs_calendar_contacts_no_store_error">未安裝 Google Play 商店或是 F-Droid 應用程式</string>
     <string name="prefs_calendar_contacts_sync_setup_successful">成功設定日曆與聯絡人同步</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_wrn_no_account_quit_btn_text">離開</string>
     <string name="uploader_error_title_no_file_to_upload">沒有要上傳的檔案</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_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_title_file_cannot_be_uploaded">無法上傳檔案</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s 不允許讀取接收的檔案</string>
     <string name="uploader_error_message_read_permission_not_granted">%1$s 不允許讀取接收的檔案</string>
     <string name="uploader_error_message_source_file_not_found">在該位置無法找到要上傳的檔案,請檢查該檔案是否存在</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="downloader_download_failed_credentials_error">下載失敗,請重新登入</string>
     <string name="common_choose_account">選擇帳號</string>
     <string name="common_choose_account">選擇帳號</string>
     <string name="sync_fail_ticker">同步失敗</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">%1$s 同步無法完成</string>
     <string name="sync_fail_content_unauthorized">無效的密碼 %1$s</string>
     <string name="sync_fail_content_unauthorized">無效的密碼 %1$s</string>
     <string name="sync_conflicts_in_favourites_ticker">出現衝突</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_local_text">本地: %1$s</string>
     <string name="foreign_files_remote_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="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">輸入通行碼</string>
     <string name="pass_code_configure_your_pass_code_explanation">每次應用程式開啟時,都需要輸入通行碼</string>
     <string name="pass_code_configure_your_pass_code_explanation">每次應用程式開啟時,都需要輸入通行碼</string>
     <string name="pass_code_reenter_your_pass_code">再次輸入通行碼</string>
     <string name="pass_code_reenter_your_pass_code">再次輸入通行碼</string>
@@ -250,6 +256,7 @@
     <string name="filename_empty">檔名不能為空</string>
     <string name="filename_empty">檔名不能為空</string>
     <string name="wait_a_moment">請稍候</string>
     <string name="wait_a_moment">請稍候</string>
     <string name="wait_checking_credentials">檢查儲存的帳號密碼</string>
     <string name="wait_checking_credentials">檢查儲存的帳號密碼</string>
+    <string name="filedisplay_unexpected_bad_get_content">未知的問題,請選擇其他程式開啟檔案</string>
     <string name="filedisplay_no_file_selected">沒有選擇檔案</string>
     <string name="filedisplay_no_file_selected">沒有選擇檔案</string>
     <string name="activity_chooser_title">傳送連結至…</string>
     <string name="activity_chooser_title">傳送連結至…</string>
     <string name="wait_for_tmp_copy_from_private_storage">由私有儲存空間複製檔案中</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="error_cant_bind_to_operations_service">嚴重錯誤:無法執行操作</string>
 
 
     <string name="network_error_socket_exception">在與伺服器連線時發生了錯誤</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="empty" />
 
 
     <string name="forbidden_permissions">您沒有權限%s</string>
     <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_primary_text_size">16sp</dimen>
     <dimen name="two_line_secondary_text_size">14sp</dimen>
     <dimen name="two_line_secondary_text_size">14sp</dimen>
     <dimen name="list_item_avatar_icon_margin">20dp</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="account_action_layout_height">72dp</dimen>
     <dimen name="zero">0dp</dimen>
     <dimen name="zero">0dp</dimen>
     <dimen name="account_item_layout_height">72dp</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.lib.resources.status.OCCapability;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeType;
 import com.owncloud.android.utils.MimeType;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 import java.io.File;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileInputStream;
@@ -161,7 +162,7 @@ public class FileDataStorageManager {
             OCFile current = null;
             OCFile current = null;
             for (int i=0; i<tmp.size(); i++) {
             for (int i=0; i<tmp.size(); i++) {
                 current = tmp.get(i);
                 current = tmp.get(i);
-                if (current.isImage()) {
+                if (MimeTypeUtil.isImage(current)) {
                     ret.add(current);
                     ret.add(current);
                 }
                 }
             }
             }
@@ -1689,15 +1690,15 @@ public class FileDataStorageManager {
         ContentResolver contentResolver = getContentResolver();
         ContentResolver contentResolver = getContentResolver();
 
 
         if (contentResolver != null) {
         if (contentResolver != null) {
-            if (mimetypeString.startsWith("image/")) {
+            if (MimeTypeUtil.isImage(mimetypeString)) {
                 // Images
                 // Images
                 contentResolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                 contentResolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                         MediaStore.Images.Media.DATA + "=?", new String[]{path});
                         MediaStore.Images.Media.DATA + "=?", new String[]{path});
-            } else if (mimetypeString.startsWith("audio/")) {
+            } else if (MimeTypeUtil.isAudio(mimetypeString)) {
                 // Audio
                 // Audio
                 contentResolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                 contentResolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                         MediaStore.Audio.Media.DATA + "=?", new String[]{path});
                         MediaStore.Audio.Media.DATA + "=?", new String[]{path});
-            } else if (mimetypeString.startsWith("video/")) {
+            } else if (MimeTypeUtil.isVideo(mimetypeString)) {
                 // Video
                 // Video
                 contentResolver.delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                 contentResolver.delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                         MediaStore.Video.Media.DATA + "=?", new String[]{path});
                         MediaStore.Video.Media.DATA + "=?", new String[]{path});
@@ -1705,15 +1706,15 @@ public class FileDataStorageManager {
         } else {
         } else {
             ContentProviderClient contentProviderClient = getContentProviderClient();
             ContentProviderClient contentProviderClient = getContentProviderClient();
             try {
             try {
-                if (mimetypeString.startsWith("image/")) {
+                if (MimeTypeUtil.isImage(mimetypeString)) {
                     // Images
                     // Images
                     contentProviderClient.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                     contentProviderClient.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                             MediaStore.Images.Media.DATA + "=?", new String[]{path});
                             MediaStore.Images.Media.DATA + "=?", new String[]{path});
-                } else if (mimetypeString.startsWith("audio/")) {
+                } else if (MimeTypeUtil.isAudio(mimetypeString)) {
                     // Audio
                     // Audio
                     contentProviderClient.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                     contentProviderClient.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                             MediaStore.Audio.Media.DATA + "=?", new String[]{path});
                             MediaStore.Audio.Media.DATA + "=?", new String[]{path});
-                } else if (mimetypeString.startsWith("video/")) {
+                } else if (MimeTypeUtil.isVideo(mimetypeString)) {
                     // Video
                     // Video
                     contentProviderClient.delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                     contentProviderClient.delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                             MediaStore.Video.Media.DATA + "=?", new String[]{path});
                             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());
                 Log_OC.e(TAG, "Exception deleting media file in MediaStore " + e.getMessage());
             }
             }
         }
         }
-
     }
     }
 
 
     public void saveConflict(OCFile file, String etagInConflict) {
     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.net.Uri;
 import android.os.Parcel;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.Parcelable;
-import android.webkit.MimeTypeMap;
 
 
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.utils.MimeType;
 import com.owncloud.android.utils.MimeType;
@@ -562,53 +561,6 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
         return 0;
         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
      * @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.BitmapUtils;
 import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener;
 import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener;
 import com.owncloud.android.utils.FileStorageUtils;
 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.HttpStatus;
 import org.apache.commons.httpclient.methods.GetMethod;
 import org.apache.commons.httpclient.methods.GetMethod;
@@ -231,7 +231,7 @@ public class ThumbnailsCacheManager {
                 if (mFile instanceof OCFile) {
                 if (mFile instanceof OCFile) {
                     thumbnail = doOCFileInBackground();
                     thumbnail = doOCFileInBackground();
 
 
-                    if (((OCFile) mFile).isVideo() && thumbnail != null){
+                    if (MimeTypeUtil.isVideo((OCFile) mFile) && thumbnail != null) {
                         thumbnail = addVideoOverlay(thumbnail);
                         thumbnail = addVideoOverlay(thumbnail);
                     }
                     }
                 }  else if (mFile instanceof File) {
                 }  else if (mFile instanceof File) {
@@ -240,7 +240,7 @@ public class ThumbnailsCacheManager {
                     String url = ((File) mFile).getAbsolutePath();
                     String url = ((File) mFile).getAbsolutePath();
                     String mMimeType = FileStorageUtils.getMimeTypeFromName(url);
                     String mMimeType = FileStorageUtils.getMimeTypeFromName(url);
 
 
-                    if (mMimeType != null && mMimeType.startsWith("video/") && thumbnail != null){
+                    if (MimeTypeUtil.isVideo(mMimeType) && thumbnail != null) {
                         thumbnail = addVideoOverlay(thumbnail);
                         thumbnail = addVideoOverlay(thumbnail);
                     }
                     }
                 //} else {  do nothing
                 //} 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.files.services.FileUploader;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.operations.UploadFileOperation;
 import com.owncloud.android.operations.UploadFileOperation;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 import java.io.File;
 import java.io.File;
 
 
@@ -235,7 +235,7 @@ public class OCUpload implements Parcelable {
      * @return the mimeType
      * @return the mimeType
      */
      */
     public String getMimeType() {
     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.lib.resources.shares.OCShare;
 import com.owncloud.android.syncadapter.FileSyncAdapter;
 import com.owncloud.android.syncadapter.FileSyncAdapter;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashMap;
@@ -404,7 +405,7 @@ public class RefreshFolderOperation extends RemoteOperation {
                 updatedFile.setEtag(localFile.getEtag());
                 updatedFile.setEtag(localFile.getEtag());
                 if (updatedFile.isFolder()) {
                 if (updatedFile.isFolder()) {
                     updatedFile.setFileLength(remoteFile.getFileLength());
                     updatedFile.setFileLength(remoteFile.getFileLength());
-                } else if (mRemoteFolderChanged && remoteFile.isImage() &&
+                } else if (mRemoteFolderChanged && MimeTypeUtil.isImage(remoteFile) &&
                         remoteFile.getModificationTimestamp() !=
                         remoteFile.getModificationTimestamp() !=
                                 localFile.getModificationTimestamp()) {
                                 localFile.getModificationTimestamp()) {
                     updatedFile.setNeedsUpdateThumbnail(true);
                     updatedFile.setNeedsUpdateThumbnail(true);

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

@@ -20,19 +20,11 @@
 
 
 package com.owncloud.android.operations;
 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.accounts.Account;
 import android.content.Context;
 import android.content.Context;
 import android.content.Intent;
 import android.content.Intent;
 import android.util.Log;
 import android.util.Log;
 
 
-
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.services.FileDownloader;
 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.operations.common.SyncOperation;
 import com.owncloud.android.services.OperationsService;
 import com.owncloud.android.services.OperationsService;
 import com.owncloud.android.utils.FileStorageUtils;
 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;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 
 
 
@@ -329,7 +328,7 @@ public class SynchronizeFolderOperation extends SyncOperation {
                 if (updatedFile.isFolder()) {
                 if (updatedFile.isFolder()) {
                     updatedFile.setFileLength(localFile.getFileLength());
                     updatedFile.setFileLength(localFile.getFileLength());
                         // TODO move operations about size of folders to FileContentProvider
                         // TODO move operations about size of folders to FileContentProvider
-                } else if (mRemoteFolderChanged && remoteFile.isImage() &&
+                } else if (mRemoteFolderChanged && MimeTypeUtil.isImage(remoteFile) &&
                         remoteFile.getModificationTimestamp() !=
                         remoteFile.getModificationTimestamp() !=
                                 localFile.getModificationTimestamp()) {
                                 localFile.getModificationTimestamp()) {
                     updatedFile.setNeedsUpdateThumbnail(true);
                     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.ConnectivityUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeType;
 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 com.owncloud.android.utils.UriUtils;
 
 
 import org.apache.commons.httpclient.HttpStatus;
 import org.apache.commons.httpclient.HttpStatus;
@@ -80,7 +80,7 @@ public class UploadFileOperation extends SyncOperation {
 
 
         // MIME type
         // MIME type
         if (mimeType == null || mimeType.length() <= 0) {
         if (mimeType == null || mimeType.length() <= 0) {
-            mimeType = MimetypeIconUtil.getBestMimeTypeByFilename(localPath);
+            mimeType = MimeTypeUtil.getBestMimeTypeByFilename(localPath);
         }
         }
 
 
         OCFile newFile = new OCFile(remotePath);
         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());
         Account newAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
         if (newAccount == null) {
         if (newAccount == null) {
             /// no account available: force account creation
             /// no account available: force account creation
-            createAccount();
+            createAccount(true);
             mRedirectingToSetupAccount = true;
             mRedirectingToSetupAccount = true;
             mAccountWasSet = false;
             mAccountWasSet = false;
             mAccountWasRestored = 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());
         AccountManager am = AccountManager.get(getApplicationContext());
         am.addAccount(MainApp.getAccountType(),
         am.addAccount(MainApp.getAccountType(),
                 null,
                 null,
                 null,
                 null,
                 null,
                 null,
                 this,
                 this,
-                new AccountCreationCallback(),
+                new AccountCreationCallback(mandatoryCreation),
                 new Handler());
                 new Handler());
     }
     }
 
 
@@ -216,6 +219,17 @@ public abstract class BaseActivity extends AppCompatActivity {
      */
      */
     public class AccountCreationCallback implements AccountManagerCallback<Bundle> {
     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
         @Override
         public void run(AccountManagerFuture<Bundle> future) {
         public void run(AccountManagerFuture<Bundle> future) {
             BaseActivity.this.mRedirectingToSetupAccount = false;
             BaseActivity.this.mRedirectingToSetupAccount = false;
@@ -242,7 +256,7 @@ public abstract class BaseActivity extends AppCompatActivity {
             } else {
             } else {
                 Log_OC.e(TAG, "Account creation callback with null bundle");
                 Log_OC.e(TAG, "Account creation callback with null bundle");
             }
             }
-            if (!accountWasSet) {
+            if (mMandatoryCreation && !accountWasSet) {
                 moveTaskToBack(true);
                 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
         // Set the drawer toggle as the DrawerListener
-        mDrawerLayout.setDrawerListener(mDrawerToggle);
+        mDrawerLayout.addDrawerListener(mDrawerToggle);
         mDrawerToggle.setDrawerIndicatorEnabled(true);
         mDrawerToggle.setDrawerIndicatorEnabled(true);
     }
     }
 
 
@@ -286,7 +286,7 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
                                 startActivity(participateIntent);
                                 startActivity(participateIntent);
                                 break;
                                 break;
                             case R.id.drawer_menu_account_add:
                             case R.id.drawer_menu_account_add:
-                                createAccount();
+                                createAccount(false);
                                 break;
                                 break;
                             case R.id.drawer_menu_account_manage:
                             case R.id.drawer_menu_account_manage:
                                 Intent manageAccountsIntent = new Intent(getApplicationContext(),
                                 Intent manageAccountsIntent = new Intent(getApplicationContext(),
@@ -805,4 +805,17 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
         }
         }
         return false;
         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.DialogInterface;
 import android.content.Intent;
 import android.content.Intent;
 import android.content.ServiceConnection;
 import android.content.ServiceConnection;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.IBinder;
 import android.support.annotation.NonNull;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 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.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
 import android.widget.ListView;
 import android.widget.ListView;
 
 
 import com.owncloud.android.MainApp;
 import com.owncloud.android.MainApp;
@@ -75,11 +80,16 @@ public class ManageAccountsActivity extends FileActivity
     private ServiceConnection mDownloadServiceConnection, mUploadServiceConnection = null;
     private ServiceConnection mDownloadServiceConnection, mUploadServiceConnection = null;
     Set<String> mOriginalAccounts;
     Set<String> mOriginalAccounts;
     String mOriginalCurrentAccount;
     String mOriginalCurrentAccount;
+    private Drawable mTintedCheck;
 
 
     @Override
     @Override
     protected void onCreate(Bundle savedInstanceState) {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(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);
         setContentView(R.layout.accounts_layout);
 
 
         mListView = (ListView) findViewById(R.id.account_list);
         mListView = (ListView) findViewById(R.id.account_list);
@@ -94,10 +104,17 @@ public class ManageAccountsActivity extends FileActivity
         setAccount(AccountUtils.getCurrentOwnCloudAccount(this));
         setAccount(AccountUtils.getCurrentOwnCloudAccount(this));
         onAccountSet(false);
         onAccountSet(false);
 
 
-        mAccountListAdapter = new AccountListAdapter(this, getAccountListItems());
+        mAccountListAdapter = new AccountListAdapter(this, getAccountListItems(), mTintedCheck);
 
 
         mListView.setAdapter(mAccountListAdapter);
         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();
         initializeComponentGetters();
     }
     }
 
 
@@ -108,7 +125,7 @@ public class ManageAccountsActivity extends FileActivity
      * @return set of account names
      * @return set of account names
      */
      */
     private Set<String> toAccountNameSet(Account[] accountList) {
     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) {
         for (Account account : accountList) {
             actualAccounts.add(account.name);
             actualAccounts.add(account.name);
         }
         }
@@ -143,7 +160,7 @@ public class ManageAccountsActivity extends FileActivity
      */
      */
     private boolean hasCurrentAccountChanged() {
     private boolean hasCurrentAccountChanged() {
         Account account = AccountUtils.getCurrentOwnCloudAccount(this);
         Account account = AccountUtils.getCurrentOwnCloudAccount(this);
-        if (account == null){
+        if (account == null) {
             return true;
             return true;
         } else {
         } else {
             return !mOriginalCurrentAccount.equals(account.name);
             return !mOriginalCurrentAccount.equals(account.name);
@@ -231,8 +248,11 @@ public class ManageAccountsActivity extends FileActivity
                                 Bundle result = future.getResult();
                                 Bundle result = future.getResult();
                                 String name = result.getString(AccountManager.KEY_ACCOUNT_NAME);
                                 String name = result.getString(AccountManager.KEY_ACCOUNT_NAME);
                                 AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), name);
                                 AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), name);
-                                mAccountListAdapter = new AccountListAdapter(ManageAccountsActivity
-                                        .this, getAccountListItems());
+                                mAccountListAdapter = new AccountListAdapter(
+                                    ManageAccountsActivity.this,
+                                    getAccountListItems(),
+                                    mTintedCheck
+                                );
                                 mListView.setAdapter(mAccountListAdapter);
                                 mListView.setAdapter(mAccountListAdapter);
                                 runOnUiThread(new Runnable() {
                                 runOnUiThread(new Runnable() {
                                     @Override
                                     @Override
@@ -250,6 +270,20 @@ public class ManageAccountsActivity extends FileActivity
                 }, mHandler);
                 }, 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
     @Override
     public void run(AccountManagerFuture<Boolean> future) {
     public void run(AccountManagerFuture<Boolean> future) {
         if (future.isDone()) {
         if (future.isDone()) {
@@ -274,7 +308,7 @@ public class ManageAccountsActivity extends FileActivity
                 AccountUtils.setCurrentOwnCloudAccount(this, accountName);
                 AccountUtils.setCurrentOwnCloudAccount(this, accountName);
             }
             }
 
 
-            mAccountListAdapter = new AccountListAdapter(this, getAccountListItems());
+            mAccountListAdapter = new AccountListAdapter(this, getAccountListItems(), mTintedCheck);
             mListView.setAdapter(mAccountListAdapter);
             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.lib.common.utils.Log_OC;
 import com.owncloud.android.operations.CheckCurrentCredentialsOperation;
 import com.owncloud.android.operations.CheckCurrentCredentialsOperation;
 import com.owncloud.android.ui.fragment.UploadListFragment;
 import com.owncloud.android.ui.fragment.UploadListFragment;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 import java.io.File;
 import java.io.File;
 
 
@@ -161,7 +161,7 @@ public class UploadListActivity extends FileActivity implements UploadListFragme
     private void openFileWithDefault(String localPath) {
     private void openFileWithDefault(String localPath) {
         Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);
         Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);
         File file = new File(localPath);
         File file = new File(localPath);
-        String mimetype = MimetypeIconUtil.getBestMimeTypeByFilename(localPath);
+        String mimetype = MimeTypeUtil.getBestMimeTypeByFilename(localPath);
         if ("application/octet-stream".equals(mimetype)) {
         if ("application/octet-stream".equals(mimetype)) {
             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.accounts.Account;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Drawable;
+import android.support.annotation.NonNull;
 import android.view.LayoutInflater;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
 import android.widget.ArrayAdapter;
-import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.ImageView;
 import android.widget.TextView;
 import android.widget.TextView;
 
 
 import com.owncloud.android.R;
 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.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.activity.BaseActivity;
 import com.owncloud.android.ui.activity.BaseActivity;
-import com.owncloud.android.ui.activity.ManageAccountsActivity;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
 
 
 import java.util.List;
 import java.util.List;
@@ -46,13 +47,15 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements
     private final BaseActivity mContext;
     private final BaseActivity mContext;
     private List<AccountListItem> mValues;
     private List<AccountListItem> mValues;
     private AccountListAdapterListener mListener;
     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);
         super(context, -1, values);
         this.mContext = context;
         this.mContext = context;
         this.mValues = values;
         this.mValues = values;
         this.mListener = (AccountListAdapterListener) context;
         this.mListener = (AccountListAdapterListener) context;
         this.mAccountAvatarRadiusDimension = context.getResources().getDimension(R.dimen.list_item_avatar_icon_radius);
         this.mAccountAvatarRadiusDimension = context.getResources().getDimension(R.dimen.list_item_avatar_icon_radius);
+        this.mTintedCheck = tintedCheck;
     }
     }
 
 
     @Override
     @Override
@@ -64,10 +67,13 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements
             convertView = inflater.inflate(R.layout.account_item, parent, false);
             convertView = inflater.inflate(R.layout.account_item, parent, false);
 
 
             viewHolder = new AccountViewHolderItem();
             viewHolder = new AccountViewHolderItem();
-            viewHolder.textViewItem = (TextView) convertView.findViewById(R.id.user_name);
             viewHolder.imageViewItem = (ImageView) convertView.findViewById(R.id.user_icon);
             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);
             convertView.setTag(viewHolder);
         } else {
         } else {
@@ -81,55 +87,91 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements
             // create account item
             // create account item
             if (AccountListItem.TYPE_ACCOUNT == accountListItem.getType()) {
             if (AccountListItem.TYPE_ACCOUNT == accountListItem.getType()) {
                 Account account = accountListItem.getAccount();
                 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
             } // create add account action item
             else if (AccountListItem.TYPE_ACTION_ADD == accountListItem.getType()) {
             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;
         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
     @Override
     public void avatarGenerated(Drawable avatarDrawable, Object callContext) {
     public void avatarGenerated(Drawable avatarDrawable, Object callContext) {
         ((ImageView)callContext).setImageDrawable(avatarDrawable);
         ((ImageView)callContext).setImageDrawable(avatarDrawable);
@@ -154,11 +196,14 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements
     /**
     /**
      * Account ViewHolderItem to get smooth scrolling.
      * Account ViewHolderItem to get smooth scrolling.
      */
      */
-    static class AccountViewHolderItem {
-        TextView textViewItem;
+    private static class AccountViewHolderItem {
         ImageView imageViewItem;
         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.network.OnDatatransferProgressListener;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileActivity;
-import com.owncloud.android.utils.BitmapUtils;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 import java.io.File;
 import java.io.File;
 import java.lang.ref.WeakReference;
 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
             // TODO this code is duplicated; refactor to a common place
-            if ((fakeFileToCheatThumbnailsCacheManagerInterface.isImage()
+            if ((MimeTypeUtil.isImage(fakeFileToCheatThumbnailsCacheManagerInterface)
                     && fakeFileToCheatThumbnailsCacheManagerInterface.getRemoteId() != null &&
                     && fakeFileToCheatThumbnailsCacheManagerInterface.getRemoteId() != null &&
                     upload.getUploadStatus() == UploadStatus.UPLOAD_SUCCEEDED)) {
                     upload.getUploadStatus() == UploadStatus.UPLOAD_SUCCEEDED)) {
                 // Thumbnail in Cache?
                 // Thumbnail in Cache?
@@ -425,7 +424,7 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
                                         fileIcon, mParentActivity.getStorageManager(), mParentActivity.getAccount()
                                         fileIcon, mParentActivity.getStorageManager(), mParentActivity.getAccount()
                                 );
                                 );
                         if (thumbnail == null) {
                         if (thumbnail == null) {
-                            if (fakeFileToCheatThumbnailsCacheManagerInterface.isVideo()) {
+                            if (MimeTypeUtil.isVideo(fakeFileToCheatThumbnailsCacheManagerInterface)) {
                                 thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                                 thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                             } else {
                             } else {
                                 thumbnail = ThumbnailsCacheManager.mDefaultImg;
                                 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());
                 File file = new File(upload.getLocalPath());
                 // Thumbnail in Cache?
                 // Thumbnail in Cache?
                 Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
                 Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
@@ -461,7 +460,7 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
                         final ThumbnailsCacheManager.ThumbnailGenerationTask task =
                         final ThumbnailsCacheManager.ThumbnailGenerationTask task =
                                 new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon);
                                 new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon);
                         if (thumbnail == null) {
                         if (thumbnail == null) {
-                            if (BitmapUtils.isVideo(file)) {
+                            if (MimeTypeUtil.isVideo(file)) {
                                 thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                                 thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                             } else {
                             } else {
                                 thumbnail = ThumbnailsCacheManager.mDefaultImg;
                                 thumbnail = ThumbnailsCacheManager.mDefaultImg;
@@ -484,7 +483,7 @@ public class ExpandableUploadListAdapter extends BaseExpandableListAdapter imple
                             .getColor(R.color.background_color));
                             .getColor(R.color.background_color));
                 }
                 }
             } else {
             } else {
-                fileIcon.setImageResource(MimetypeIconUtil.getFileTypeIconId(
+                fileIcon.setImageResource(MimeTypeUtil.getFileTypeIconId(
                         upload.getMimeType(),
                         upload.getMimeType(),
                         fileName
                         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.ui.activity.ComponentsGetter;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 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.ArrayList;
 import java.util.Vector;
 import java.util.Vector;
@@ -144,7 +144,7 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
         // Find out which layout should be displayed
         // Find out which layout should be displayed
         ViewType viewType;
         ViewType viewType;
         if (parent instanceof GridView) {
         if (parent instanceof GridView) {
-            if (file != null && (file.isImage() || file.isVideo())) {
+            if (file != null && (MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file))) {
                 viewType = ViewType.GRID_IMAGE;
                 viewType = ViewType.GRID_IMAGE;
             } else {
             } else {
                 viewType = ViewType.GRID_ITEM;
                 viewType = ViewType.GRID_ITEM;
@@ -296,14 +296,14 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
 
 
             // No Folder
             // No Folder
             if (!file.isFolder()) {
             if (!file.isFolder()) {
-                if ((file.isImage() || file.isVideo()) && file.getRemoteId() != null) {
+                if ((MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file)) && file.getRemoteId() != null) {
                     // Thumbnail in Cache?
                     // Thumbnail in Cache?
                     Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
                     Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
                             String.valueOf(file.getRemoteId())
                             String.valueOf(file.getRemoteId())
                     );
                     );
                     if (thumbnail != null && !file.needsUpdateThumbnail()) {
                     if (thumbnail != null && !file.needsUpdateThumbnail()) {
 
 
-                        if (file.isVideo()) {
+                        if (MimeTypeUtil.isVideo(file)) {
                             Bitmap withOverlay = ThumbnailsCacheManager.addVideoOverlay(thumbnail);
                             Bitmap withOverlay = ThumbnailsCacheManager.addVideoOverlay(thumbnail);
                             fileIcon.setImageBitmap(withOverlay);
                             fileIcon.setImageBitmap(withOverlay);
                         } else {
                         } else {
@@ -317,7 +317,7 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
                                             fileIcon, mStorageManager, mAccount
                                             fileIcon, mStorageManager, mAccount
                                     );
                                     );
                             if (thumbnail == null) {
                             if (thumbnail == null) {
-                                if (file.isVideo()) {
+                                if (MimeTypeUtil.isVideo(file)) {
                                     thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                                     thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                                 } else {
                                 } else {
                                     thumbnail = ThumbnailsCacheManager.mDefaultImg;
                                     thumbnail = ThumbnailsCacheManager.mDefaultImg;
@@ -341,7 +341,7 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
 
 
 
 
                 } else {
                 } else {
-                    fileIcon.setImageResource(MimetypeIconUtil.getFileTypeIconId(file.getMimetype(),
+                    fileIcon.setImageResource(MimeTypeUtil.getFileTypeIconId(file.getMimetype(),
                             file.getFileName()));
                             file.getFileName()));
                 }
                 }
 
 
@@ -349,7 +349,7 @@ public class FileListListAdapter extends BaseAdapter implements FilterableListAd
             } else {
             } else {
                 // Folder
                 // Folder
                 fileIcon.setImageResource(
                 fileIcon.setImageResource(
-                        MimetypeIconUtil.getFolderTypeIconId(
+                        MimeTypeUtil.getFolderTypeIconId(
                                 file.isSharedWithMe() || file.isSharedWithSharee(),
                                 file.isSharedWithMe() || file.isSharedWithSharee(),
                                 file.isSharedViaLink()
                                 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.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.db.PreferenceManager;
 import com.owncloud.android.db.PreferenceManager;
 import com.owncloud.android.lib.common.utils.Log_OC;
 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.DisplayUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.FileStorageUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 import java.io.File;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.ArrayList;
@@ -119,8 +118,8 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
             // Find out which layout should be displayed
             // Find out which layout should be displayed
             ViewType viewType;
             ViewType viewType;
             if (parent instanceof GridView) {
             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;
                     viewType = ViewType.GRID_IMAGE;
                 } else {
                 } else {
                     viewType = ViewType.GRID_ITEM;
                     viewType = ViewType.GRID_ITEM;
@@ -197,7 +196,7 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
                 }
                 }
                 
                 
              // get Thumbnail if file is image
              // get Thumbnail if file is image
-                if (BitmapUtils.isImage(file)){
+                if (MimeTypeUtil.isImage(file)){
                 // Thumbnail in Cache?
                 // Thumbnail in Cache?
                     Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
                     Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
                             String.valueOf(file.hashCode())
                             String.valueOf(file.hashCode())
@@ -210,7 +209,7 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
                         if (allowedToCreateNewThumbnail) {
                         if (allowedToCreateNewThumbnail) {
                             final ThumbnailsCacheManager.ThumbnailGenerationTask task =
                             final ThumbnailsCacheManager.ThumbnailGenerationTask task =
                                     new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon);
                                     new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon);
-                            if (BitmapUtils.isVideo(file)) {
+                            if (MimeTypeUtil.isVideo(file)) {
                                 thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                                 thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                             } else {
                             } else {
                                 thumbnail = ThumbnailsCacheManager.mDefaultImg;
                                 thumbnail = ThumbnailsCacheManager.mDefaultImg;
@@ -228,7 +227,7 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
                         } // else, already being generated, don't restart it
                         } // else, already being generated, don't restart it
                     }
                     }
                 } else {
                 } else {
-                    fileIcon.setImageResource(MimetypeIconUtil.getFileTypeIconId(null, file.getName()));
+                    fileIcon.setImageResource(MimeTypeUtil.getFileTypeIconId(null, file.getName()));
                 }  
                 }  
 
 
             } else {
             } 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;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager.AsyncThumbnailDrawable;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager.AsyncThumbnailDrawable;
 import com.owncloud.android.utils.DisplayUtils;
 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.HashMap;
 import java.util.List;
 import java.util.List;
@@ -91,7 +91,7 @@ public class UploaderAdapter extends SimpleAdapter {
         }
         }
         
         
         // get Thumbnail if file is image
         // get Thumbnail if file is image
-        if (file.isImage() && file.getRemoteId() != null){
+        if (MimeTypeUtil.isImage(file) && file.getRemoteId() != null) {
              // Thumbnail in Cache?
              // Thumbnail in Cache?
             Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
             Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
                     String.valueOf(file.getRemoteId())
                     String.valueOf(file.getRemoteId())
@@ -105,7 +105,7 @@ public class UploaderAdapter extends SimpleAdapter {
                             new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon, mStorageManager, 
                             new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon, mStorageManager, 
                                     mAccount);
                                     mAccount);
                     if (thumbnail == null) {
                     if (thumbnail == null) {
-                        if (file.isVideo()) {
+                        if (MimeTypeUtil.isVideo(file)) {
                             thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                             thumbnail = ThumbnailsCacheManager.mDefaultVideo;
                         } else {
                         } else {
                             thumbnail = ThumbnailsCacheManager.mDefaultImg;
                             thumbnail = ThumbnailsCacheManager.mDefaultImg;
@@ -122,7 +122,7 @@ public class UploaderAdapter extends SimpleAdapter {
             }
             }
         } else {
         } else {
             fileIcon.setImageResource(
             fileIcon.setImageResource(
-                    MimetypeIconUtil.getFileTypeIconId(file.getMimetype(), file.getFileName())
+                    MimeTypeUtil.getFileTypeIconId(file.getMimetype(), file.getFileName())
             );
             );
         }
         }
         return vi;
         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 com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
-import java.util.List;
 import java.util.Vector;
 import java.util.Vector;
 
 
 public class RemoveFileDialogFragment extends ConfirmationDialogFragment 
 public class RemoveFileDialogFragment extends ConfirmationDialogFragment 
@@ -56,7 +55,7 @@ implements ConfirmationDialogFragmentListener {
         RemoveFileDialogFragment frag = new RemoveFileDialogFragment();
         RemoveFileDialogFragment frag = new RemoveFileDialogFragment();
         Bundle args = new Bundle();
         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())) ?
         int localRemoveButton = (!file.isFavorite() && (file.isFolder() || file.isDown())) ?
             R.string.confirmation_remove_local : -1;
             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.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
 import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 import java.lang.ref.WeakReference;
 import java.lang.ref.WeakReference;
 
 
@@ -426,7 +426,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             Bitmap thumbnail;
             Bitmap thumbnail;
             iv.setTag(file.getFileId());
             iv.setTag(file.getFileId());
 
 
-            if (file.isImage()) {
+            if (MimeTypeUtil.isImage(file)) {
                 String tagId = String.valueOf(file.getRemoteId());
                 String tagId = String.valueOf(file.getRemoteId());
                 thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(tagId);
                 thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(tagId);
 
 
@@ -455,7 +455,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             } else {
             } else {
 				// Name of the file, to deduce the icon to use in case the MIME type is not precise enough
 				// Name of the file, to deduce the icon to use in case the MIME type is not precise enough
 				String filename = file.getFileName();
 				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.Build;
 import android.os.Bundle;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.preference.PreferenceManager;
+import android.support.v4.widget.DrawerLayout;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v4.widget.SwipeRefreshLayout;
+import android.util.SparseBooleanArray;
 import android.view.ActionMode;
 import android.view.ActionMode;
 import android.view.LayoutInflater;
 import android.view.LayoutInflater;
 import android.view.Menu;
 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.CreateFolderDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
 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.PreviewImageFragment;
 import com.owncloud.android.ui.preview.PreviewMediaFragment;
 import com.owncloud.android.ui.preview.PreviewMediaFragment;
 import com.owncloud.android.ui.preview.PreviewTextFragment;
 import com.owncloud.android.ui.preview.PreviewTextFragment;
@@ -107,6 +110,7 @@ public class OCFileListFragment extends ExtendedListFragment {
     private boolean mHideFab = true;
     private boolean mHideFab = true;
     private boolean miniFabClicked = false;
     private boolean miniFabClicked = false;
     private ActionMode mActiveActionMode;
     private ActionMode mActiveActionMode;
+    private OCFileListFragment.MultiChoiceModeListener mMultiChoiceModeListener;
 
 
     @Override
     @Override
     public void onCreate(Bundle savedInstanceState) {
     public void onCreate(Bundle savedInstanceState) {
@@ -151,7 +155,7 @@ public class OCFileListFragment extends ExtendedListFragment {
         Bundle args = getArguments();
         Bundle args = getArguments();
         boolean allowContextualActions = (args != null) && args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, false);
         boolean allowContextualActions = (args != null) && args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, false);
         if (allowContextualActions) {
         if (allowContextualActions) {
-            setChoiceModeAsMultipleModal();
+            setChoiceModeAsMultipleModal(savedInstanceState);
         }
         }
         Log_OC.i(TAG, "onCreateView() end");
         Log_OC.i(TAG, "onCreateView() end");
         return v;
         return v;
@@ -346,76 +350,191 @@ public class OCFileListFragment extends ExtendedListFragment {
                 com.getbase.floatingactionbutton.R.id.fab_label)).setVisibility(View.GONE);
                 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) {
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         super.onSaveInstanceState(outState);
         outState.putParcelable(KEY_FILE, mFile);
         outState.putParcelable(KEY_FILE, mFile);
+        mMultiChoiceModeListener.storeStateIn(outState);
     }
     }
 
 
     @Override
     @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.ExpirationDatePickerDialogFragment;
 import com.owncloud.android.ui.dialog.SharePasswordDialogFragment;
 import com.owncloud.android.ui.dialog.SharePasswordDialogFragment;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.ArrayList;
@@ -193,9 +193,9 @@ public class ShareFileFragment extends Fragment
         // Setup layout
         // Setup layout
         // Image
         // Image
         ImageView icon = (ImageView) view.findViewById(R.id.shareFileIcon);
         ImageView icon = (ImageView) view.findViewById(R.id.shareFileIcon);
-        icon.setImageResource(MimetypeIconUtil.getFileTypeIconId(mFile.getMimetype(),
+        icon.setImageResource(MimeTypeUtil.getFileTypeIconId(mFile.getMimetype(),
                 mFile.getFileName()));
                 mFile.getFileName()));
-        if (mFile.isImage()) {
+        if (MimeTypeUtil.isImage(mFile)) {
             String remoteId = String.valueOf(mFile.getRemoteId());
             String remoteId = String.valueOf(mFile.getRemoteId());
             Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(remoteId);
             Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(remoteId);
             if (thumbnail != null) {
             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.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.fragment.FileFragment;
 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) {
             if (file == null) {
                 throw new IllegalStateException("Instanced with a NULL OCFile");
                 throw new IllegalStateException("Instanced with a NULL OCFile");
             }
             }
-            if (!file.isImage()) {
+            if (!MimeTypeUtil.isImage(file)) {
                 throw new IllegalArgumentException("Non-image file passed as argument");
                 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;
 package com.owncloud.android.ui.preview;
 
 
-import java.lang.ref.WeakReference;
-
 import android.accounts.Account;
 import android.accounts.Account;
 import android.annotation.SuppressLint;
 import android.annotation.SuppressLint;
 import android.app.Activity;
 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.ui.fragment.FileFragment;
 import com.owncloud.android.utils.BitmapUtils;
 import com.owncloud.android.utils.BitmapUtils;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.MimeTypeUtil;
+
+import java.lang.ref.WeakReference;
 
 
 import third_parties.michaelOrtiz.TouchImageViewCustom;
 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.
      * @return          'True' if the file can be handled by the fragment.
      */
      */
     public static boolean canBePreviewed(OCFile file) {
     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.ConfirmationDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.fragment.FileFragment;
 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;
         mAutoplay = autoplay;
     }
     }
 
 
-
     /**
     /**
      * Creates an empty fragment for previews.
      * Creates an empty fragment for previews.
      * <p/>
      * <p/>
@@ -197,7 +197,7 @@ public class PreviewMediaFragment extends FileFragment implements
 
 
         }
         }
         if (file != null && file.isDown()) {
         if (file != null && file.isDown()) {
-            if (file.isVideo()) {
+            if (MimeTypeUtil.isVideo(file)) {
                 mVideoPreview.setVisibility(View.VISIBLE);
                 mVideoPreview.setVisibility(View.VISIBLE);
                 mImagePreview.setVisibility(View.GONE);
                 mImagePreview.setVisibility(View.GONE);
                 prepareVideo();
                 prepareVideo();
@@ -218,7 +218,7 @@ public class PreviewMediaFragment extends FileFragment implements
      * @param file audio file with potential cover art
      * @param file audio file with potential cover art
      */
      */
     private void extractAndSetCoverArt(OCFile file) {
     private void extractAndSetCoverArt(OCFile file) {
-        if (file.isAudio()) {
+        if (MimeTypeUtil.isAudio(file)) {
             try {
             try {
                 MediaMetadataRetriever mmr = new MediaMetadataRetriever();
                 MediaMetadataRetriever mmr = new MediaMetadataRetriever();
                 mmr.setDataSource(file.getStoragePath());
                 mmr.setDataSource(file.getStoragePath());
@@ -247,7 +247,7 @@ public class PreviewMediaFragment extends FileFragment implements
         outState.putParcelable(PreviewMediaFragment.EXTRA_FILE, getFile());
         outState.putParcelable(PreviewMediaFragment.EXTRA_FILE, getFile());
         outState.putParcelable(PreviewMediaFragment.EXTRA_ACCOUNT, mAccount);
         outState.putParcelable(PreviewMediaFragment.EXTRA_ACCOUNT, mAccount);
 
 
-        if (getFile().isVideo()) {
+        if (MimeTypeUtil.isVideo(getFile())) {
             if (mVideoPreview != null) {
             if (mVideoPreview != null) {
                 mSavedPlaybackPosition = mVideoPreview.getCurrentPosition();
                 mSavedPlaybackPosition = mVideoPreview.getCurrentPosition();
                 mAutoplay = mVideoPreview.isPlaying();
                 mAutoplay = mVideoPreview.isPlaying();
@@ -274,12 +274,12 @@ public class PreviewMediaFragment extends FileFragment implements
 
 
         OCFile file = getFile();
         OCFile file = getFile();
         if (file != null && file.isDown()) {
         if (file != null && file.isDown()) {
-            if (file.isAudio()) {
+            if (MimeTypeUtil.isAudio(file)) {
                 bindMediaService();
                 bindMediaService();
 
 
             }
             }
             else {
             else {
-                if (file.isVideo()) {
+                if (MimeTypeUtil.isVideo(file)) {
                     stopAudio();
                     stopAudio();
                     playVideo();
                     playVideo();
                 }
                 }
@@ -679,18 +679,18 @@ public class PreviewMediaFragment extends FileFragment implements
      * @return 'True' if the file can be handled by the fragment.
      * @return 'True' if the file can be handled by the fragment.
      */
      */
     public static boolean canBePreviewed(OCFile file) {
     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) {
     public void stopPreview(boolean stopAudio) {
         OCFile file = getFile();
         OCFile file = getFile();
-        if (file.isAudio() && stopAudio) {
+        if (MimeTypeUtil.isAudio(file) && stopAudio) {
             mMediaServiceBinder.pause();
             mMediaServiceBinder.pause();
 
 
         }
         }
         else {
         else {
-            if (file.isVideo()) {
+            if (MimeTypeUtil.isVideo(file)) {
                 mVideoPreview.stopPlayback();
                 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.LoadingDialog;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.fragment.FileFragment;
 import com.owncloud.android.ui.fragment.FileFragment;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 import java.io.BufferedWriter;
 import java.io.BufferedWriter;
 import java.io.FileInputStream;
 import java.io.FileInputStream;
@@ -430,9 +431,9 @@ public class PreviewTextFragment extends FileFragment {
         unsupportedTypes.add("text/vnd.rn-realtext");
         unsupportedTypes.add("text/vnd.rn-realtext");
         unsupportedTypes.add("text/vnd.wap.wml");
         unsupportedTypes.add("text/vnd.wap.wml");
         unsupportedTypes.add("text/vnd.wap.wmlscript");
         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.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;
 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.accounts.Account;
-import android.support.v7.app.AlertDialog;
 import android.content.DialogInterface;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.Intent;
 import android.media.MediaPlayer;
 import android.media.MediaPlayer;
@@ -35,12 +29,18 @@ import android.media.MediaPlayer.OnErrorListener;
 import android.media.MediaPlayer.OnPreparedListener;
 import android.media.MediaPlayer.OnPreparedListener;
 import android.net.Uri;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Bundle;
+import android.support.v7.app.AlertDialog;
 import android.widget.MediaController;
 import android.widget.MediaController;
 import android.widget.VideoView;
 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;
 import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
 import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
 import com.owncloud.android.lib.common.utils.Log_OC;
 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.
  *  Activity implementing a basic video player.
@@ -197,7 +197,7 @@ public class PreviewVideoActivity extends FileActivity implements OnCompletionLi
             if (file == null) {
             if (file == null) {
                 throw new IllegalStateException("Instanced with a NULL OCFile");
                 throw new IllegalStateException("Instanced with a NULL OCFile");
             }
             }
-            if (!file.isVideo()) {
+            if (!MimeTypeUtil.isVideo(file)) {
                 throw new IllegalArgumentException("Non-video file passed as argument");
                 throw new IllegalArgumentException("Non-video file passed as argument");
             }
             }
             file = getStorageManager().getFileById(file.getFileId()); 
             file = getStorageManager().getFileById(file.getFileId()); 

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

@@ -19,21 +19,18 @@
  */
  */
 package com.owncloud.android.utils;
 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.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.BitmapFactory;
-import android.graphics.Matrix;
 import android.graphics.BitmapFactory.Options;
 import android.graphics.BitmapFactory.Options;
+import android.graphics.Matrix;
 import android.media.ExifInterface;
 import android.media.ExifInterface;
-import android.net.Uri;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
 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.io.UnsupportedEncodingException;
 import java.math.BigInteger;
 import java.math.BigInteger;
 import java.security.MessageDigest;
 import java.security.MessageDigest;
@@ -262,32 +259,6 @@ public class BitmapUtils {
    		return p;
    		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.
      * 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;
 package com.owncloud.android.utils;
 
 
+import android.net.Uri;
 import android.webkit.MimeTypeMap;
 import android.webkit.MimeTypeMap;
 
 
 import com.owncloud.android.R;
 import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
 
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Collections;
 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:
  * In order to add further mappings, there are up to three look up maps that need further values:
  * <ol>
  * <ol>
  *     <li>
  *     <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
  *         to add a new file extension to mime type mapping
  *     </li>
  *     </li>
  *     <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
  *         to add a new mapping of a mime type to an icon mapping
  *     </li>
  *     </li>
  *     <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.
  *         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
  *         This is a list of fallback mappings in case there is no mapping for the complete mime type
  *     </li>
  *     </li>
  * </ol>
  * </ol>
  */
  */
-public class MimetypeIconUtil {
+public class MimeTypeUtil {
     /** Mapping: icon for mime type */
     /** 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). */
     /** 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. */
     /** 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 {
     static {
         populateFileExtensionMimeTypeMapping();
         populateFileExtensionMimeTypeMapping();
@@ -121,28 +123,95 @@ public class MimetypeIconUtil {
      * @return 'True' if the mime type defines image
      * @return 'True' if the mime type defines image
      */
      */
     public static boolean isImage(String mimeType) {
     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
      * @return 'True' the mime type defines video
      */
      */
     public static boolean isVideo(String mimeType) {
     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
      * @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
      * @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) {
             for (String mimetype : mimetypes) {
                 String mainMimetypePart = mimetype.split("/")[0];
                 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) {
                 if (iconId != null) {
                     return iconId;
                     return iconId;
                 }
                 }
@@ -200,11 +269,21 @@ public class MimetypeIconUtil {
             if (mimeType != null) {
             if (mimeType != null) {
                 return Collections.singletonList(mimeType);
                 return Collections.singletonList(mimeType);
             } else {
             } 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.
      * provides the file extension of a given filename.
      *
      *
@@ -212,8 +291,7 @@ public class MimetypeIconUtil {
      * @return the file extension
      * @return the file extension
      */
      */
     private static String getExtension(String filename) {
     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.
      * populates the mapping list: main mime type --> icon.
      */
      */
     private static void populateMainMimeTypeMapping() {
     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);
         String mimeType = context.getContentResolver().getType(uri);
         if (mimeType != null) {
         if (mimeType != null) {
             String displayNameColumn;
             String displayNameColumn;
-            if (mimeType.toLowerCase().startsWith("image/")) {
+            if (MimeTypeUtil.isImage(mimeType)) {
                 displayNameColumn = MediaStore.Images.ImageColumns.DISPLAY_NAME;
                 displayNameColumn = MediaStore.Images.ImageColumns.DISPLAY_NAME;
 
 
-            } else if (mimeType.toLowerCase().startsWith("video/")) {
+            } else if (MimeTypeUtil.isVideo(mimeType)) {
                 displayNameColumn = MediaStore.Video.VideoColumns.DISPLAY_NAME;
                 displayNameColumn = MediaStore.Video.VideoColumns.DISPLAY_NAME;
 
 
-            } else if (mimeType.toLowerCase().startsWith("audio/")) {
+            } else if (MimeTypeUtil.isAudio(mimeType)) {
                 displayNameColumn = MediaStore.Audio.AudioColumns.DISPLAY_NAME;
                 displayNameColumn = MediaStore.Audio.AudioColumns.DISPLAY_NAME;
 
 
             } else {
             } else {

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

@@ -26,7 +26,7 @@ import android.os.Build;
 import android.provider.DocumentsContract.Document;
 import android.provider.DocumentsContract.Document;
 
 
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.utils.MimetypeIconUtil;
+import com.owncloud.android.utils.MimeTypeUtil;
 
 
 @TargetApi(Build.VERSION_CODES.KITKAT)
 @TargetApi(Build.VERSION_CODES.KITKAT)
 public class FileCursor extends MatrixCursor {
 public class FileCursor extends MatrixCursor {
@@ -44,9 +44,9 @@ public class FileCursor extends MatrixCursor {
     public void addFile(OCFile file) {
     public void addFile(OCFile file) {
         if (file == null) return;
         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 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;
         int flags = imagePath != null ? Document.FLAG_SUPPORTS_THUMBNAIL : 0;
 
 
         newRow().add(Document.COLUMN_DOCUMENT_ID, Long.toString(file.getFileId()))
         newRow().add(Document.COLUMN_DOCUMENT_ID, Long.toString(file.getFileId()))