Browse Source

Merge branch 'master' of https://github.com/owncloud/android into material_buttons

Conflicts:
	res/layout/uploader_layout.xml
Andy Scherzinger 9 years ago
parent
commit
32145d57db
100 changed files with 1479 additions and 1029 deletions
  1. 0 1
      .gitmodules
  2. 26 38
      AndroidManifest.xml
  3. 0 6
      build.gradle
  4. BIN
      doc/oCC2015_Android_workshop.odp
  5. 4 0
      res/drawable/backrepeat.xml
  6. BIN
      res/drawable/checker_16_16.png
  7. 2 2
      res/layout/preview_image_fragment.xml
  8. 6 1
      res/layout/uploader_layout.xml
  9. 78 18
      res/menu/file_actions_menu.xml
  10. 2 3
      res/values-ar/strings.xml
  11. 2 3
      res/values-az/strings.xml
  12. 10 0
      res/values-bal/strings.xml
  13. 2 3
      res/values-bg-rBG/strings.xml
  14. 2 3
      res/values-bn-rBD/strings.xml
  15. 1 0
      res/values-bn-rIN/strings.xml
  16. 1 0
      res/values-bs/strings.xml
  17. 4 3
      res/values-ca/strings.xml
  18. 6 5
      res/values-cs-rCZ/strings.xml
  19. 2 3
      res/values-cy-rGB/strings.xml
  20. 6 5
      res/values-da/strings.xml
  21. 3 6
      res/values-de-rDE/strings.xml
  22. 1 4
      res/values-de/strings.xml
  23. 6 5
      res/values-el/strings.xml
  24. 2 3
      res/values-en-rGB/strings.xml
  25. 2 3
      res/values-eo/strings.xml
  26. 2 3
      res/values-es-rAR/strings.xml
  27. 1 3
      res/values-es-rCL/strings.xml
  28. 2 3
      res/values-es-rMX/strings.xml
  29. 7 6
      res/values-es/strings.xml
  30. 5 3
      res/values-et-rEE/strings.xml
  31. 2 3
      res/values-eu/strings.xml
  32. 2 3
      res/values-fa/strings.xml
  33. 6 5
      res/values-fi-rFI/strings.xml
  34. 6 5
      res/values-fr/strings.xml
  35. 4 4
      res/values-gl/strings.xml
  36. 2 3
      res/values-he/strings.xml
  37. 1 0
      res/values-hi/strings.xml
  38. 1 0
      res/values-hr/strings.xml
  39. 2 3
      res/values-hu-rHU/strings.xml
  40. 1 0
      res/values-ia/strings.xml
  41. 6 5
      res/values-id/strings.xml
  42. 3 0
      res/values-is/strings.xml
  43. 6 5
      res/values-it/strings.xml
  44. 2 5
      res/values-ja-rJP/strings.xml
  45. 2 3
      res/values-ka-rGE/strings.xml
  46. 2 2
      res/values-km/strings.xml
  47. 1 0
      res/values-kn/strings.xml
  48. 2 3
      res/values-ko/strings.xml
  49. 1 0
      res/values-ku-rIQ/strings.xml
  50. 10 0
      res/values-la/strings.xml
  51. 2 3
      res/values-lb/strings.xml
  52. 2 3
      res/values-lt-rLT/strings.xml
  53. 2 3
      res/values-lv/strings.xml
  54. 2 3
      res/values-mk/strings.xml
  55. 2 0
      res/values-ms-rMY/strings.xml
  56. 2 3
      res/values-nb-rNO/strings.xml
  57. 6 5
      res/values-nl/strings.xml
  58. 2 2
      res/values-nn-rNO/strings.xml
  59. 1 0
      res/values-oc/strings.xml
  60. 1 2
      res/values-pa/strings.xml
  61. 18 3
      res/values-pl/strings.xml
  62. 6 5
      res/values-pt-rBR/strings.xml
  63. 2 5
      res/values-pt-rPT/strings.xml
  64. 10 3
      res/values-ro/strings.xml
  65. 2 5
      res/values-ru/strings.xml
  66. 2 2
      res/values-si-rLK/strings.xml
  67. 2 3
      res/values-sk-rSK/strings.xml
  68. 9 3
      res/values-sl/strings.xml
  69. 1 0
      res/values-sq/strings.xml
  70. 1 0
      res/values-sr-rSP/strings.xml
  71. 2 3
      res/values-sr/strings.xml
  72. 2 3
      res/values-sv/strings.xml
  73. 2 3
      res/values-ta-rLK/strings.xml
  74. 6 5
      res/values-th-rTH/strings.xml
  75. 8 2
      res/values-tr/strings.xml
  76. 1 0
      res/values-ug/strings.xml
  77. 2 3
      res/values-uk/strings.xml
  78. 1 0
      res/values-ur-rPK/strings.xml
  79. 2 3
      res/values-vi/strings.xml
  80. 6 5
      res/values-zh-rCN/strings.xml
  81. 1 0
      res/values-zh-rHK/strings.xml
  82. 32 2
      res/values-zh-rTW/strings.xml
  83. 54 55
      res/values/strings.xml
  84. 207 177
      src/com/owncloud/android/datamodel/FileDataStorageManager.java
  85. 7 0
      src/com/owncloud/android/datamodel/OCFile.java
  86. 27 4
      src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
  87. 33 32
      src/com/owncloud/android/files/FileMenuFilter.java
  88. 56 39
      src/com/owncloud/android/files/FileOperationsHelper.java
  89. 103 0
      src/com/owncloud/android/operations/CopyFileOperation.java
  90. 8 2
      src/com/owncloud/android/operations/RefreshFolderOperation.java
  91. 95 88
      src/com/owncloud/android/services/OperationsService.java
  92. 4 3
      src/com/owncloud/android/ui/activity/FileActivity.java
  93. 196 140
      src/com/owncloud/android/ui/activity/FileDisplayActivity.java
  94. 20 4
      src/com/owncloud/android/ui/activity/Uploader.java
  95. 9 0
      src/com/owncloud/android/ui/adapter/FileListListAdapter.java
  96. 3 3
      src/com/owncloud/android/ui/fragment/ExtendedListFragment.java
  97. 75 63
      src/com/owncloud/android/ui/fragment/FileDetailFragment.java
  98. 65 54
      src/com/owncloud/android/ui/fragment/OCFileListFragment.java
  99. 40 38
      src/com/owncloud/android/ui/preview/FileDownloadFragment.java
  100. 90 63
      src/com/owncloud/android/ui/preview/PreviewImageFragment.java

+ 0 - 1
.gitmodules

@@ -1,4 +1,3 @@
-
 [submodule "owncloud-android-library"]
 	path = owncloud-android-library
 	url = git://github.com/owncloud/android-library.git

+ 26 - 38
AndroidManifest.xml

@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 
+<?xml version="1.0" encoding="utf-8"?><!--
   ownCloud Android client application
 
   Copyright (C) 2012  Bartek Przybylski
@@ -39,47 +38,38 @@
         android:minSdkVersion="14"
         android:targetSdkVersion="22" />
 
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
-    </uses-permission>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
 
     <application
         android:name=".MainApp"
         android:icon="@drawable/icon"
         android:label="@string/app_name"
-        android:theme="@style/Theme.ownCloud"> 
+        android:theme="@style/Theme.ownCloud">
         <activity
             android:name=".ui.activity.FileDisplayActivity"
-            android:label="@string/app_name"
-            >
+            android:label="@string/app_name">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".ui.activity.UploadFilesActivity">
-        </activity>
-        <activity android:name=".ui.activity.Uploader" >
+        <activity android:name=".ui.activity.UploadFilesActivity"></activity>
+        <activity android:name=".ui.activity.Uploader">
             <intent-filter>
-                <action android:name="android.intent.action.SEND" >
-                </action>
+                <action android:name="android.intent.action.SEND"></action>
 
-                <category android:name="android.intent.category.DEFAULT" >
-                </category>
+                <category android:name="android.intent.category.DEFAULT"></category>
 
-                <data android:mimeType="*/*" >
-                </data>
+                <data android:mimeType="*/*"></data>
             </intent-filter>
             <intent-filter>
-                <action android:name="android.intent.action.SEND_MULTIPLE" >
-                </action>
+                <action android:name="android.intent.action.SEND_MULTIPLE"></action>
 
-                <category android:name="android.intent.category.DEFAULT" >
-                </category>
+                <category android:name="android.intent.category.DEFAULT"></category>
 
-                <data android:mimeType="*/*" >
-                </data>
+                <data android:mimeType="*/*"></data>
 
-			</intent-filter>
+            </intent-filter>
         </activity>
         <activity
             android:name=".ui.activity.Preferences"
@@ -92,15 +82,13 @@
 		        
         <activity	
             android:name=".ui.preview.PreviewVideoActivity"
-			android:label="@string/app_name"
-			android:theme="@style/Theme.ownCloud.Fullscreen" 
-			>
-		</activity>        
+            android:label="@string/app_name"
+            android:theme="@style/Theme.ownCloud.Fullscreen"></activity>
 
         <service
             android:name=".authentication.AccountAuthenticatorService"
             android:exported="true">
-            <intent-filter  android:priority="100">
+            <intent-filter android:priority="100">
                 <action android:name="android.accounts.AccountAuthenticator" />
             </intent-filter>
 
@@ -110,8 +98,7 @@
         </service>
         <service
             android:name=".syncadapter.FileSyncService"
-            android:exported="true" 
-            >
+            android:exported="true">
             <intent-filter>
                 <action android:name="android.content.SyncAdapter" />
             </intent-filter>
@@ -127,8 +114,7 @@
             android:enabled="true"
             android:exported="false"
             android:label="@string/sync_string_files"
-            android:syncable="true" >
-        </provider>
+            android:syncable="true"></provider>
 
         <activity
             android:name=".authentication.AuthenticatorActivity"
@@ -137,8 +123,10 @@
             android:launchMode="singleTask">
             <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
+
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.BROWSABLE" />
+
                 <data android:scheme="@string/oauth2_redirect_scheme" />
             </intent-filter>
             <intent-filter>
@@ -151,7 +139,7 @@
         <service android:name=".files.services.FileDownloader" />
         <service android:name=".files.services.FileUploader" />
         <service android:name=".media.MediaService" />
-        
+
         <activity android:name=".ui.activity.PassCodeActivity" />
         <activity android:name=".ui.activity.ConflictsResolveActivity"/>
         <activity android:name=".ui.activity.GenericExplanationActivity"/>
@@ -163,7 +151,7 @@
             <intent-filter>
                 <!-- unofficially supported by many Android phones but not by HTC devices: -->
                 <action android:name="com.android.camera.NEW_PICTURE" />
-                <!-- officially supported since Android 4.0 (SDK 14, works even for HTC devices): --> 
+                <!-- officially supported since Android 4.0 (SDK 14, works even for HTC devices): -->
                 <action android:name="android.hardware.action.NEW_PICTURE" />
                 <data android:mimeType="image/*" />
             </intent-filter>
@@ -172,12 +160,12 @@
                 <data android:mimeType="video/*" />
             </intent-filter>
             <intent-filter>
-                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
+                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
             </intent-filter>
         </receiver>
         <receiver android:name=".files.BootupBroadcastReceiver">
             <intent-filter>
-                <action android:name="android.intent.action.BOOT_COMPLETED"/>
+                <action android:name="android.intent.action.BOOT_COMPLETED" />
             </intent-filter>
         </receiver>
         <service android:name=".services.observer.FileObserverService"/>
@@ -187,11 +175,11 @@
 			android:label="@string/copy_link"
 			android:icon="@drawable/copy_link"/>
 
-        <activity 
+        <activity
 			android:name=".ui.activity.FolderPickerActivity"
 			android:label="@string/app_name"/>
 
-        <activity 
+        <activity
 			android:name=".ui.activity.UploadPathActivity"
 			android:label="@string/app_name"/>
         

+ 0 - 6
build.gradle

@@ -58,12 +58,6 @@ android {
             abortOnError false
         }
     }
-
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
     
     productFlavors {
     }

BIN
doc/oCC2015_Android_workshop.odp


+ 4 - 0
res/drawable/backrepeat.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/checker_16_16"
+    android:tileMode="repeat" />

BIN
res/drawable/checker_16_16.png


+ 2 - 2
res/layout/preview_image_fragment.xml

@@ -42,7 +42,7 @@
         android:indeterminateOnly="true"
         android:layout_centerInParent="true"
         />
-    
+
     <third_parties.michaelOrtiz.TouchImageViewCustom
         android:id="@+id/image"
         android:layout_width="match_parent"
@@ -62,5 +62,5 @@
         android:text="@string/placeholder_sentence"
         android:textColor="@color/owncloud_blue_bright"
         />
-    
+
 </RelativeLayout>

+ 6 - 1
res/layout/uploader_layout.xml

@@ -53,13 +53,18 @@
 	    android:orientation="horizontal" >
 
 		<android.support.v7.widget.AppCompatButton
+<<<<<<< HEAD
 		    android:id="@+id/uploader_new_folder"
 			android:theme="@style/Button"
+=======
+		    android:id="@+id/uploader_cancel"
+			style="@style/ownCloud.Button"
+>>>>>>> f787213cd1cae854c169d263d3636e1de4dffa94
 		    android:layout_width="fill_parent"
 		    android:layout_height="wrap_content"
 		    android:layout_gravity="bottom"
 		    android:layout_weight="1"
-		    android:text="@string/uploader_btn_new_folder_text" />
+		    android:text="@string/common_cancel" />
 
 		<android.support.v7.widget.AppCompatButton
 		    android:id="@+id/uploader_choose_folder"

+ 78 - 18
res/menu/file_actions_menu.xml

@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
   ownCloud Android client application
 
   Copyright (C) 2012  Bartek Przybylski
@@ -17,21 +16,82 @@
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -->
-<menu 	xmlns:android="http://schemas.android.com/apk/res/android">
-    
-	<item 	android:id="@+id/action_share_file"				android:title="@string/action_share_file"			android:icon="@android:drawable/ic_menu_share"					android:orderInCategory="1" />
-   	<item 	android:id="@+id/action_unshare_file"		    android:title="@string/action_unshare_file"			android:icon="@android:drawable/ic_menu_share"					android:orderInCategory="1" />
-    <item 	android:id="@+id/action_open_file_with"			android:title="@string/actionbar_open_with"			android:icon="@android:drawable/ic_menu_set_as"					android:orderInCategory="1" /> 
-	<item 	android:id="@+id/action_download_file" 			android:title="@string/filedetails_download"		android:icon="@drawable/ic_action_download"						android:orderInCategory="1" />
-    <item 	android:id="@+id/action_sync_file"				android:title="@string/filedetails_sync_file"		android:icon="@drawable/ic_action_refresh"						android:orderInCategory="1" />
-	<item 	android:id="@+id/action_cancel_download"		android:title="@string/common_cancel_download"	 	android:icon="@android:drawable/ic_menu_close_clear_cancel"		android:orderInCategory="1" />
-	<item 	android:id="@+id/action_cancel_upload" 			android:title="@string/common_cancel_upload"		android:icon="@android:drawable/ic_menu_close_clear_cancel"		android:orderInCategory="1" />
-	<item 	android:id="@+id/action_rename_file"			android:title="@string/common_rename"				android:icon="@android:drawable/ic_menu_edit"					android:orderInCategory="1" />
-    <item 	android:id="@+id/action_move"					android:title="@string/actionbar_move"				android:icon="@android:drawable/ic_menu_set_as"					android:orderInCategory="1" />
-    <item 	android:id="@+id/action_remove_file"			android:title="@string/common_remove"				android:icon="@android:drawable/ic_menu_delete"					android:orderInCategory="1" />
-    <item 	android:id="@+id/action_send_file"				android:title="@string/actionbar_send_file"			android:icon="@android:drawable/ic_menu_set_as"					android:orderInCategory="1" />
-    <item 	android:id="@+id/action_favorite_file"			android:title="@string/favorite"		    	android:icon="@android:drawable/ic_menu_set_as"					android:orderInCategory="1" />
-    <item 	android:id="@+id/action_unfavorite_file"		android:title="@string/unfavorite"		    	    android:icon="@android:drawable/ic_menu_set_as"					android:orderInCategory="1" />
-    <item 	android:id="@+id/action_see_details"			android:title="@string/actionbar_see_details"		android:icon="@android:drawable/ic_menu_info_details"			android:orderInCategory="1" />
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item
+        android:id="@+id/action_share_file"
+        android:title="@string/action_share_file"
+        android:icon="@android:drawable/ic_menu_share"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_unshare_file"
+        android:title="@string/action_unshare_file"
+        android:icon="@android:drawable/ic_menu_share"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_open_file_with"
+        android:title="@string/actionbar_open_with"
+        android:icon="@android:drawable/ic_menu_set_as"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_download_file"
+        android:title="@string/filedetails_download"
+        android:icon="@drawable/ic_action_download"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_sync_file"
+        android:title="@string/filedetails_sync_file"
+        android:icon="@drawable/ic_action_refresh"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_cancel_download"
+        android:title="@string/common_cancel_download"
+        android:icon="@android:drawable/ic_menu_close_clear_cancel"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_cancel_upload"
+        android:title="@string/common_cancel_upload"
+        android:icon="@android:drawable/ic_menu_close_clear_cancel"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_rename_file"
+        android:title="@string/common_rename"
+        android:icon="@android:drawable/ic_menu_edit"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_move"
+        android:title="@string/actionbar_move"
+        android:icon="@android:drawable/ic_menu_set_as"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_copy"
+        android:title="@android:string/copy"
+        android:icon="@android:drawable/ic_menu_set_as"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_remove_file"
+        android:title="@string/common_remove"
+        android:icon="@android:drawable/ic_menu_delete"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_send_file"
+        android:title="@string/actionbar_send_file"
+        android:icon="@android:drawable/ic_menu_set_as"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_favorite_file"
+        android:title="@string/favorite"
+        android:icon="@android:drawable/ic_menu_set_as"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_unfavorite_file"
+        android:title="@string/unfavorite"
+        android:icon="@android:drawable/ic_menu_set_as"
+        android:orderInCategory="1" />
+    <item
+        android:id="@+id/action_see_details"
+        android:title="@string/actionbar_see_details"
+        android:icon="@android:drawable/ic_menu_info_details"
+        android:orderInCategory="1" />
 
 </menu>

+ 2 - 3
res/values-ar/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">الإعدادات</string>
   <string name="drawer_item_logs">سجلّ</string>
   <string name="drawer_close">إغلاق</string>
+  <string name="drawer_open">افتح</string>
   <string name="prefs_category_general">عام</string>
   <string name="prefs_category_more">المزيد</string>
   <string name="prefs_accounts">حسابات</string>
@@ -184,9 +185,7 @@
   <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="confirmation_remove_folder_local">محليا فقط</string>
   <string name="remove_success_msg">تم الحذف بنجاح</string>
   <string name="remove_fail_msg">فشل الحذف</string>
   <string name="rename_dialog_title">أدخل اسما جديدا</string>

+ 2 - 3
res/values-az/strings.xml

@@ -23,6 +23,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Aç</string>
   <string name="prefs_category_general">Ümumi</string>
   <string name="prefs_category_more">Daha da</string>
   <string name="prefs_accounts">Hesablar</string>
@@ -186,9 +187,7 @@ Aşağıda göstərilən %5$s-də olan daxili və xarici fayl(lar) link edilmiş
   <string name="confirmation_remove_alert">Siz həqiqətən %1$s silmək istəyirsiniz?</string>
   <string name="confirmation_remove_folder_alert">Siz həqiqətəndə %1$s və onun kontentini silmək istəyirsiniz?</string>
   <string name="confirmation_remove_local">Yalnız daxili</string>
-  <string name="confirmation_remove_folder_local">Yalnız daxili kontent</string>
-  <string name="confirmation_remove_remote">Serverdən sil</string>
-  <string name="confirmation_remove_remote_and_local">Uzaq və lokal</string>
+  <string name="confirmation_remove_folder_local">Yalnız daxili</string>
   <string name="remove_success_msg">Silmə uğurlu oldu</string>
   <string name="remove_fail_msg">Silmək mümkün olmadı</string>
   <string name="rename_dialog_title">Yeni adı daxil edin</string>

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

@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <!--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>-->
+  <!--TODO re-enable when "On Device" is available
+    <string name="drawer_item_on_device">On device</string>-->
+  <string name="empty"></string>
+</resources>

+ 2 - 3
res/values-bg-rBG/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Настройки</string>
   <string name="drawer_item_logs">Логове</string>
   <string name="drawer_close">Затвори</string>
+  <string name="drawer_open">Отвори</string>
   <string name="prefs_category_general">Общи</string>
   <string name="prefs_category_more">Още</string>
   <string name="prefs_accounts">Профили</string>
@@ -199,9 +200,7 @@
   <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="confirmation_remove_folder_local">Само локално</string>
   <string name="remove_success_msg">Премахването успешно.</string>
   <string name="remove_fail_msg">Неуспешно прехамхване.</string>
   <string name="rename_dialog_title">Въведете ново име</string>

+ 2 - 3
res/values-bn-rBD/strings.xml

@@ -17,6 +17,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">খোল</string>
   <string name="prefs_category_general">সাধারণ</string>
   <string name="prefs_category_more">বেশী</string>
   <string name="prefs_accounts">একাউন্ট</string>
@@ -171,9 +172,7 @@
   <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="confirmation_remove_folder_local">শুধুমাত্র লোকাল</string>
   <string name="remove_success_msg">অপসারণ সফল</string>
   <string name="remove_fail_msg">অপসারণ ব্যার্থ</string>
   <string name="rename_dialog_title">একটি নতুন নাম লিখুন</string>

+ 1 - 0
res/values-bn-rIN/strings.xml

@@ -11,6 +11,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">খোলা</string>
   <string name="prefs_imprint">অঙ্কিত করা</string>
   <string name="auth_username">ইউজারনেম</string>
   <string name="sync_string_files">ফাইলস</string>

+ 1 - 0
res/values-bs/strings.xml

@@ -11,6 +11,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Otvori</string>
   <string name="prefs_category_more">Više</string>
   <string name="prefs_help">Pomoć</string>
   <string name="auth_username">Korisničko ime</string>

+ 4 - 3
res/values-ca/strings.xml

@@ -23,6 +23,9 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_item_settings">configuració</string>
+  <string name="drawer_close">tanca</string>
+  <string name="drawer_open">Obre</string>
   <string name="prefs_category_general">General</string>
   <string name="prefs_category_more">Més</string>
   <string name="prefs_accounts">Comptes</string>
@@ -177,9 +180,7 @@
   <string name="confirmation_remove_alert">Esteu segur que voleu eliminar %1$s?</string>
   <string name="confirmation_remove_folder_alert">Estàs segur que vols esborrar %1$s i els seus continguts?</string>
   <string name="confirmation_remove_local">Només local</string>
-  <string name="confirmation_remove_folder_local">Només contiguts locals</string>
-  <string name="confirmation_remove_remote">Elimina del servidor</string>
-  <string name="confirmation_remove_remote_and_local">Remot i local</string>
+  <string name="confirmation_remove_folder_local">Només local</string>
   <string name="remove_success_msg">L\'eliminació ha tingut èxit</string>
   <string name="remove_fail_msg">No s\'ha pogut completar l\'eliminació</string>
   <string name="rename_dialog_title">Introdueix un nom nou</string>

+ 6 - 5
res/values-cs-rCZ/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Nastavení</string>
   <string name="drawer_item_logs">Logy</string>
   <string name="drawer_close">Zavřít</string>
+  <string name="drawer_open">Otevřít</string>
   <string name="prefs_category_general">Obecné</string>
   <string name="prefs_category_more">Více</string>
   <string name="prefs_accounts">Účty</string>
@@ -199,9 +200,9 @@
   <string name="confirmation_remove_alert">Opravdu chcete odstranit %1$s ?</string>
   <string name="confirmation_remove_folder_alert">Opravdu chcete odstranit %1$s a jeho obsah?</string>
   <string name="confirmation_remove_local">Pouze místní</string>
-  <string name="confirmation_remove_folder_local">Pouze místní obsah</string>
-  <string name="confirmation_remove_remote">Odstranit ze serveru</string>
-  <string name="confirmation_remove_remote_and_local">Oboje, místní i vzdálené</string>
+  <string name="confirmation_remove_folder_local">Pouze místní</string>
+  <string name="confirmation_remove_remote">Ze serveru</string>
+  <string name="confirmation_remove_remote_and_local">Vzdálený &amp; místní</string>
   <string name="remove_success_msg">Úspěšně odstraněno</string>
   <string name="remove_fail_msg">Odstranění nelze dokončit</string>
   <string name="rename_dialog_title">Zadejte nový název</string>
@@ -256,8 +257,8 @@
   <string name="conflict_title">Konflikt souboru</string>
   <string name="conflict_message">Které soubory chcete ponechat? Pokud zvolíte obě verze, zkopírovaný soubor bude mít název doplněný o číslo.</string>
   <string name="conflict_keep_both">Ponechat oba</string>
-  <string name="conflict_use_local_version">Použít lokální verzi</string>
-  <string name="conflict_use_server_version">Použít serverovou verzi</string>
+  <string name="conflict_use_local_version">místní verze</string>
+  <string name="conflict_use_server_version">serverová verze</string>
   <string name="preview_image_description">Náhled obrázku</string>
   <string name="preview_image_error_unknown_format">Obrázek nelze zobrazit</string>
   <string name="error__upload__local_file_not_copied">%1$s nelze zkopírovat do místního adresáře %2$s</string>

+ 2 - 3
res/values-cy-rGB/strings.xml

@@ -11,6 +11,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Agor</string>
   <string name="prefs_category_general">Cyffredinol</string>
   <string name="prefs_accounts">Cyfrifon</string>
   <string name="prefs_manage_accounts">Rheoli Cyfrifon</string>
@@ -91,9 +92,7 @@
   <string name="common_rename">Ailenwi</string>
   <string name="common_remove">Gwaredu</string>
   <string name="confirmation_remove_local">Lleol yn unig</string>
-  <string name="confirmation_remove_folder_local">Cynnwys lleol yn unig</string>
-  <string name="confirmation_remove_remote">Gwaredu o\'r gweinydd</string>
-  <string name="confirmation_remove_remote_and_local">Pell a lleol</string>
+  <string name="confirmation_remove_folder_local">Lleol yn unig</string>
   <string name="remove_success_msg">Gwaredwyd yn llwyddiannus</string>
   <string name="remove_fail_msg">Methwyd gwaredu</string>
   <string name="rename_dialog_title">Rhowch enw newydd</string>

+ 6 - 5
res/values-da/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Indstillinger</string>
   <string name="drawer_item_logs">Logregistreringer</string>
   <string name="drawer_close">Luk</string>
+  <string name="drawer_open">Åbn</string>
   <string name="prefs_category_general">Generel</string>
   <string name="prefs_category_more">Mere</string>
   <string name="prefs_accounts">Konti</string>
@@ -199,9 +200,9 @@
   <string name="confirmation_remove_alert">Er du sikker på at du vil fjerne %1$s ?</string>
   <string name="confirmation_remove_folder_alert">Ønsker du virkelig at slette %1$s og dets indhold?</string>
   <string name="confirmation_remove_local">Kun lokal</string>
-  <string name="confirmation_remove_folder_local">Lokalt indhold kun</string>
-  <string name="confirmation_remove_remote">Fjern fra server</string>
-  <string name="confirmation_remove_remote_and_local">Både fjernt og lokalt</string>
+  <string name="confirmation_remove_folder_local">Kun lokal</string>
+  <string name="confirmation_remove_remote">Fra server</string>
+  <string name="confirmation_remove_remote_and_local">Fjernbeliggende og lokalt</string>
   <string name="remove_success_msg">Vellykket fjernelse</string>
   <string name="remove_fail_msg">Fjernelse kunne ikke fuldføres</string>
   <string name="rename_dialog_title">Indtast et nyt navn</string>
@@ -256,8 +257,8 @@
   <string name="conflict_title">Filkonflikt</string>
   <string name="conflict_message">Hvilke filer ønsker du at beholde? Hvis du vælger begge versioner, så vil den lokale fil få et tal tilføjet til sit navn.</string>
   <string name="conflict_keep_both">Behold begge</string>
-  <string name="conflict_use_local_version">Benyt lokal version</string>
-  <string name="conflict_use_server_version">Benyt serverversionen</string>
+  <string name="conflict_use_local_version">lokal version</string>
+  <string name="conflict_use_server_version">serverversion</string>
   <string name="preview_image_description">Forhåndsvisning af billede</string>
   <string name="preview_image_error_unknown_format">Dette billede kan ikke vises</string>
   <string name="error__upload__local_file_not_copied">%1$s kunne ikke kopieres til %2$s lokale mappe</string>

+ 3 - 6
res/values-de-rDE/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Einstellungen</string>
   <string name="drawer_item_logs">Protokolle</string>
   <string name="drawer_close">Schließen</string>
+  <string name="drawer_open">Öffnen</string>
   <string name="prefs_category_general">Allgemein</string>
   <string name="prefs_category_more">Mehr</string>
   <string name="prefs_accounts">Konten</string>
@@ -201,8 +202,6 @@
   <string name="confirmation_remove_folder_alert">Möchten Sie wirklich %1$s und dessen Inhalte entfernen?</string>
   <string name="confirmation_remove_local">Nur lokal</string>
   <string name="confirmation_remove_folder_local">Nur lokal</string>
-  <string name="confirmation_remove_remote">Vom Server</string>
-  <string name="confirmation_remove_remote_and_local">Lokal &amp; 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>
@@ -229,7 +228,7 @@
   <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">Überblick</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>
@@ -256,9 +255,7 @@
   <string name="instant_upload_path">/SofortUpload</string>
   <string name="conflict_title">Dateikonflikt</string>
   <string name="conflict_message">Welche Datei möchtest du behalten? Wenn du beide Versionen auswählst, wird der lokalen Datei eine Zahl am Ende Ihres Dateiname angehangen.</string>
-  <string name="conflict_keep_both">Beide</string>
-  <string name="conflict_use_local_version">lokale Version</string>
-  <string name="conflict_use_server_version">Server Version</string>
+  <string name="conflict_keep_both">Beide behalten</string>
   <string name="preview_image_description">Bildvorschau</string>
   <string name="preview_image_error_unknown_format">Dieses Bild kann nicht angezeigt werden</string>
   <string name="error__upload__local_file_not_copied">%1$s konnte nicht in den lokalen %2$s Ordner kopiert werden</string>

+ 1 - 4
res/values-de/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Einstellungen</string>
   <string name="drawer_item_logs">Protokolle</string>
   <string name="drawer_close">Schließen</string>
+  <string name="drawer_open">Öffnen</string>
   <string name="prefs_category_general">Allgemein</string>
   <string name="prefs_category_more">Mehr</string>
   <string name="prefs_accounts">Konten</string>
@@ -201,8 +202,6 @@
   <string name="confirmation_remove_folder_alert">Möchtest Du wirklich %1$s und dessen Inhalte entfernen?</string>
   <string name="confirmation_remove_local">Nur lokal</string>
   <string name="confirmation_remove_folder_local">Nur lokal</string>
-  <string name="confirmation_remove_remote">Vom Server</string>
-  <string name="confirmation_remove_remote_and_local">Lokal &amp; 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">Gib einen neuen Namen ein</string>
@@ -257,8 +256,6 @@
   <string name="conflict_title">Dateikonfilikt</string>
   <string name="conflict_message">Welche Datei möchtest du behalten? Wenn du beide Versionen auswählst, wird der lokalen Datei eine Zahl am Ende Ihres Dateiname angehangen.</string>
   <string name="conflict_keep_both">Beide behalten</string>
-  <string name="conflict_use_local_version">Benutze lokale Version</string>
-  <string name="conflict_use_server_version">Benutze Version auf dem Server</string>
   <string name="preview_image_description">Bildvorschau</string>
   <string name="preview_image_error_unknown_format">Dieses Bild kann nicht angezeigt werden</string>
   <string name="error__upload__local_file_not_copied">%1$s konnte nicht in den lokalen %2$s Ordner kopiert werden</string>

+ 6 - 5
res/values-el/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Ρυθμίσεις</string>
   <string name="drawer_item_logs">Αρχεία καταγραφών</string>
   <string name="drawer_close">Κλείσιμο</string>
+  <string name="drawer_open">Άνοιγμα</string>
   <string name="prefs_category_general">Γενικά</string>
   <string name="prefs_category_more">Περισσότερα</string>
   <string name="prefs_accounts">Λογαριασμοί</string>
@@ -200,9 +201,9 @@
   <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="confirmation_remove_folder_local">Μόνο τοπικά</string>
+  <string name="confirmation_remove_remote">Από το διακομιστή</string>
+  <string name="confirmation_remove_remote_and_local">Απομακρυσμένα &amp; τοπικά</string>
   <string name="remove_success_msg">Αφαίρεση επιτυχής</string>
   <string name="remove_fail_msg">Η αφαίρεση απέτυχε</string>
   <string name="rename_dialog_title">Εισάγετε νέο όνομα</string>
@@ -257,8 +258,8 @@
   <string name="conflict_title">Διένεξη αρχείων</string>
   <string name="conflict_message">Ποια αρχεία θέλετε να κρατήσετε; Αν επιλέξετε και τις δύο εκδοχές, στο τοπικό αρχείο θα προστεθεί ένας αριθμός στο όνομά του.</string>
   <string name="conflict_keep_both">Διατήρηση και των δύο</string>
-  <string name="conflict_use_local_version">Χρήση τοπικής εκδοχής</string>
-  <string name="conflict_use_server_version">Χρήση εκδοχής διακομιστή</string>
+  <string name="conflict_use_local_version">τοπική έκδοση</string>
+  <string name="conflict_use_server_version">έκδοση διακομιστή</string>
   <string name="preview_image_description">Προεπισκόπηση εικόνας</string>
   <string name="preview_image_error_unknown_format">Αυτή η εικόνα δεν μπορεί να προβληθεί</string>
   <string name="error__upload__local_file_not_copied">Το %1$s δεν μπόρεσε να αντιγραφεί στον τοπικό φάκελο %2$s</string>

+ 2 - 3
res/values-en-rGB/strings.xml

@@ -23,6 +23,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Open</string>
   <string name="prefs_category_general">General</string>
   <string name="prefs_category_more">More</string>
   <string name="prefs_accounts">Accounts</string>
@@ -194,9 +195,7 @@
   <string name="confirmation_remove_alert">Do you really want to remove %1$s?</string>
   <string name="confirmation_remove_folder_alert">Do you really want to remove %1$s and its contents?</string>
   <string name="confirmation_remove_local">Local only</string>
-  <string name="confirmation_remove_folder_local">Local contents only</string>
-  <string name="confirmation_remove_remote">Remove from server</string>
-  <string name="confirmation_remove_remote_and_local">Remote and local</string>
+  <string name="confirmation_remove_folder_local">Local only</string>
   <string name="remove_success_msg">Removal succeeded</string>
   <string name="remove_fail_msg">Removal failed</string>
   <string name="rename_dialog_title">Enter a new name</string>

+ 2 - 3
res/values-eo/strings.xml

@@ -16,6 +16,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Malfermi</string>
   <string name="prefs_category_general">Ĝeneralo</string>
   <string name="prefs_category_more">Pli</string>
   <string name="prefs_accounts">Kontoj</string>
@@ -124,9 +125,7 @@
   <string name="confirmation_remove_alert">Ĉu vi vere volas forigi %1$s?</string>
   <string name="confirmation_remove_folder_alert">Ĉu vi vere volas forigi %1$s kaj ĝia enhavo?</string>
   <string name="confirmation_remove_local">Nur loka</string>
-  <string name="confirmation_remove_folder_local">Nur lokaj enhavoj</string>
-  <string name="confirmation_remove_remote">Forigi el la servilo</string>
-  <string name="confirmation_remove_remote_and_local">Kaj malloka kaj loka</string>
+  <string name="confirmation_remove_folder_local">Nur loka</string>
   <string name="remove_success_msg">Forigo sukcesis</string>
   <string name="remove_fail_msg">Forigo ne eblis plenumiĝi</string>
   <string name="rename_dialog_title">Enigu novan nomon</string>

+ 2 - 3
res/values-es-rAR/strings.xml

@@ -23,6 +23,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Abrir</string>
   <string name="prefs_category_general">General</string>
   <string name="prefs_category_more">Más</string>
   <string name="prefs_accounts">Cuentas</string>
@@ -179,9 +180,7 @@
   <string name="confirmation_remove_alert">¿Realmente quieres eliminar %1$s?</string>
   <string name="confirmation_remove_folder_alert">¿Realmente deseas eliminar %1$s y todo su contenido?</string>
   <string name="confirmation_remove_local">Sólo local</string>
-  <string name="confirmation_remove_folder_local">Solo archivos locales</string>
-  <string name="confirmation_remove_remote">Borrar del servidor</string>
-  <string name="confirmation_remove_remote_and_local">Ambos: remoto y local</string>
+  <string name="confirmation_remove_folder_local">Sólo local</string>
   <string name="remove_success_msg">Borrado correctamente</string>
   <string name="remove_fail_msg">El borrado no pudo ser completado</string>
   <string name="rename_dialog_title">Ingrese un nombre</string>

+ 1 - 3
res/values-es-rCL/strings.xml

@@ -116,9 +116,7 @@
   <string name="confirmation_remove_alert">¿Realmente desea eliminar %1$s?</string>
   <string name="confirmation_remove_folder_alert">¿Realmente desea eliminar el archivo %1$s y su contenido?</string>
   <string name="confirmation_remove_local">Solo local</string>
-  <string name="confirmation_remove_folder_local">solo contenidos locales </string>
-  <string name="confirmation_remove_remote">Eliminar desde el servidor</string>
-  <string name="confirmation_remove_remote_and_local">Remoto y local</string>
+  <string name="confirmation_remove_folder_local">Solo local</string>
   <string name="remove_success_msg">Removido correctamente</string>
   <string name="remove_fail_msg">Fallo al remover</string>
   <string name="rename_dialog_title">ingresar un nuevo nombre</string>

+ 2 - 3
res/values-es-rMX/strings.xml

@@ -17,6 +17,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Abrir</string>
   <string name="prefs_category_general">General</string>
   <string name="prefs_category_more">Más</string>
   <string name="prefs_accounts">Cuentas</string>
@@ -153,9 +154,7 @@
   <string name="common_rename">Renombrar</string>
   <string name="common_remove">Borrar</string>
   <string name="confirmation_remove_local">Sólo local</string>
-  <string name="confirmation_remove_folder_local">Sólo archivos locales</string>
-  <string name="confirmation_remove_remote">Eliminar del servidor</string>
-  <string name="confirmation_remove_remote_and_local">Tanto remoto como local</string>
+  <string name="confirmation_remove_folder_local">Sólo local</string>
   <string name="remove_success_msg">Borrado correctamente</string>
   <string name="remove_fail_msg">El borrado no pudo ser completado</string>
   <string name="rename_dialog_title">Introduzca un nombre nuevo</string>

+ 7 - 6
res/values-es/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Ajustes</string>
   <string name="drawer_item_logs">Registros</string>
   <string name="drawer_close">Cerrar</string>
+  <string name="drawer_open">Abrir</string>
   <string name="prefs_category_general">General</string>
   <string name="prefs_category_more">Más</string>
   <string name="prefs_accounts">Cuentas</string>
@@ -200,9 +201,9 @@
   <string name="confirmation_remove_alert">¿Realmente desea eliminar %1$s?</string>
   <string name="confirmation_remove_folder_alert">¿Realmente desea eliminar %1$s y todo su contenido?</string>
   <string name="confirmation_remove_local">Sólo local</string>
-  <string name="confirmation_remove_folder_local">Sólo ficheros locales</string>
-  <string name="confirmation_remove_remote">Eliminar del servidor</string>
-  <string name="confirmation_remove_remote_and_local">Tanto remoto como local</string>
+  <string name="confirmation_remove_folder_local">Sólo local</string>
+  <string name="confirmation_remove_remote">Desde el servidor</string>
+  <string name="confirmation_remove_remote_and_local">Remoto &amp; local</string>
   <string name="remove_success_msg">Borrado correctamente</string>
   <string name="remove_fail_msg">El borrado no pudo ser completado</string>
   <string name="rename_dialog_title">Introduzca un nombre nuevo</string>
@@ -255,10 +256,10 @@
   <string name="instant_video_upload_on_wifi">Subir vídeos sólo por WiFi</string>
   <string name="instant_upload_path">/SubidasInstantáneas</string>
   <string name="conflict_title">Conflicto con archivo</string>
-  <string name="conflict_message">¿Qué archivos desea mantener? Si selecciona ambas versiones, el archivo local tendrá un número añadido a su nombre.</string>
+  <string name="conflict_message">¿Cuáles archivos desea mantener? Si selecciona ambas versiones, el archivo local tendrá un número añadido a su nombre.</string>
   <string name="conflict_keep_both">Mantener ambos</string>
-  <string name="conflict_use_local_version">Usar versión local</string>
-  <string name="conflict_use_server_version">Usar versión del servidor</string>
+  <string name="conflict_use_local_version">versión local</string>
+  <string name="conflict_use_server_version">versión del servidor</string>
   <string name="preview_image_description">Previsualización de imagen</string>
   <string name="preview_image_error_unknown_format">No se puede mostrar la imagen</string>
   <string name="error__upload__local_file_not_copied">%1$s se pudo copiar a la carpeta local %2$s</string>

+ 5 - 3
res/values-et-rEE/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Seaded</string>
   <string name="drawer_item_logs">Logid</string>
   <string name="drawer_close">Sulge</string>
+  <string name="drawer_open">Ava</string>
   <string name="prefs_category_general">Üldine</string>
   <string name="prefs_category_more">Rohkem</string>
   <string name="prefs_accounts">Kontod</string>
@@ -204,9 +205,7 @@ Allpool on loend kohalikest failidest ning serveris asuvatest failidest %5$s, mi
   <string name="confirmation_remove_alert">Oled sa kindel, et soovid %1$s eemaldada?</string>
   <string name="confirmation_remove_folder_alert">Kas sa tõesti soovid eemaldada %1$s ja selle sisu?</string>
   <string name="confirmation_remove_local">Ainult kohalik</string>
-  <string name="confirmation_remove_folder_local">Ainult kohalik sisu</string>
-  <string name="confirmation_remove_remote">Eemalda serverist</string>
-  <string name="confirmation_remove_remote_and_local">Eemalolev ja kohalik</string>
+  <string name="confirmation_remove_folder_local">Ainult kohalik</string>
   <string name="remove_success_msg">Eemaldamine oli edukas</string>
   <string name="remove_fail_msg">Eemaldamine ebaõnnestus</string>
   <string name="rename_dialog_title">Sisesta uus nimi</string>
@@ -258,6 +257,8 @@ Allpool on loend kohalikest failidest ning serveris asuvatest failidest %5$s, mi
   <string name="instant_upload_on_wifi">Lae pilte üles ainult läbi WiFi</string>
   <string name="instant_video_upload_on_wifi">Laadi videod üles ainult WiFi-t kasutades</string>
   <string name="instant_upload_path">/InstantUpload</string>
+  <string name="conflict_title">Failikonflikt</string>
+  <string name="conflict_message">Millist faili sa soovid säilitada? Kui valid mõlemad versioonid, siis lisatakse kohaliku faili nimele number.</string>
   <string name="conflict_keep_both">Säilita mõlemad</string>
   <string name="preview_image_description">Pildi eelvaade</string>
   <string name="preview_image_error_unknown_format">Seda pilti ei saa näidata</string>
@@ -313,6 +314,7 @@ Allpool on loend kohalikest failidest ning serveris asuvatest failidest %5$s, mi
   <string name="shared_subject_header">jagatud</string>
   <string name="with_you_subject_header">sinuga</string>
   <string name="subject_token">%1$s jagas sinuga \"%2$s\"</string>
+  <string name="saml_subject_token">\"%1$s\" on sinuga jagatud</string>
   <string name="auth_refresh_button">Värskenda ühendust</string>
   <string name="auth_host_address">Serveri aadress</string>
   <string name="common_error_out_memory">Mälu pole piisavalt</string>

+ 2 - 3
res/values-eu/strings.xml

@@ -23,6 +23,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</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>
@@ -179,9 +180,7 @@ Mesedez, baimendu berriz</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="confirmation_remove_folder_local">Eduki lokalak bakarrik</string>
-  <string name="confirmation_remove_remote">Zerbitzaritik ezabatu</string>
-  <string name="confirmation_remove_remote_and_local">Biak urrunekoa eta bertakoa</string>
+  <string name="confirmation_remove_folder_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>

+ 2 - 3
res/values-fa/strings.xml

@@ -17,6 +17,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">باز کردن</string>
   <string name="prefs_category_general">عمومی</string>
   <string name="prefs_category_more">بیش‌تر</string>
   <string name="prefs_accounts">حساب‌ها</string>
@@ -154,9 +155,7 @@
   <string name="common_rename">تغییرنام</string>
   <string name="common_remove">حذف</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="confirmation_remove_folder_local">فقط محلی</string>
   <string name="remove_success_msg">حذف با موفقیت انجام شد</string>
   <string name="remove_fail_msg">حذف نا موفق بود</string>
   <string name="rename_dialog_title">نام جدید وارد کنید</string>

+ 6 - 5
res/values-fi-rFI/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Asetukset</string>
   <string name="drawer_item_logs">Lokit</string>
   <string name="drawer_close">Sulje</string>
+  <string name="drawer_open">Avaa</string>
   <string name="prefs_category_general">Yleiset</string>
   <string name="prefs_category_more">Enemmän</string>
   <string name="prefs_accounts">Tilit</string>
@@ -191,9 +192,9 @@
   <string name="confirmation_remove_alert">Haluatko varmasti poistaa kohteen %1$s?</string>
   <string name="confirmation_remove_folder_alert">Haluatko varmasti poistaa kohteen %1$s ja sen sisällön?</string>
   <string name="confirmation_remove_local">Vain paikallinen</string>
-  <string name="confirmation_remove_folder_local">Vain paikallinen sisältö</string>
-  <string name="confirmation_remove_remote">Poista palvelimelta</string>
-  <string name="confirmation_remove_remote_and_local">Sekä etä- että paikallinen</string>
+  <string name="confirmation_remove_folder_local">Vain paikallinen</string>
+  <string name="confirmation_remove_remote">Palvelimelta</string>
+  <string name="confirmation_remove_remote_and_local">Etä ja paikallinen</string>
   <string name="remove_success_msg">Poistettu onnistuneesti</string>
   <string name="remove_fail_msg">Poistamista ei voitu suorittaa loppuun asti</string>
   <string name="rename_dialog_title">Anna uusi nimi</string>
@@ -245,8 +246,8 @@
   <string name="conflict_title">Tiedoston ristiriita</string>
   <string name="conflict_message">Mitkä tiedostot haluat säilyttää? Jos valitset kummatkin versiot, paikallisen version tiedoston nimeen lisätään numero.</string>
   <string name="conflict_keep_both">Säilytä molemmat</string>
-  <string name="conflict_use_local_version">Käytä paikallista versiota</string>
-  <string name="conflict_use_server_version">Käytä palvelimen versiota</string>
+  <string name="conflict_use_local_version">paikallinen versio</string>
+  <string name="conflict_use_server_version">palvelimen versio</string>
   <string name="preview_image_description">Kuvan esikatselu</string>
   <string name="preview_image_error_unknown_format">Tätä kuvaa ei voi näyttää</string>
   <string name="prefs_instant_upload_path_title">Lähetyspolku</string>

+ 6 - 5
res/values-fr/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Paramètres</string>
   <string name="drawer_item_logs">Logs</string>
   <string name="drawer_close">Fermer</string>
+  <string name="drawer_open">Ouvrir</string>
   <string name="prefs_category_general">Général</string>
   <string name="prefs_category_more">Plus</string>
   <string name="prefs_accounts">Comptes</string>
@@ -205,9 +206,9 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq
   <string name="confirmation_remove_alert">Voulez-vous vraiment supprimer %1$s ?</string>
   <string name="confirmation_remove_folder_alert">Voulez-vous vraiment supprimer %1$s et son contenu ?</string>
   <string name="confirmation_remove_local">Local seulement</string>
-  <string name="confirmation_remove_folder_local">Contenu local uniquement</string>
-  <string name="confirmation_remove_remote">Effacer du serveur</string>
-  <string name="confirmation_remove_remote_and_local">Distant et local</string>
+  <string name="confirmation_remove_folder_local">Local seulement</string>
+  <string name="confirmation_remove_remote">Depuis le serveur</string>
+  <string name="confirmation_remove_remote_and_local">Distant &amp; local</string>
   <string name="remove_success_msg">Suppression effectuée avec succès</string>
   <string name="remove_fail_msg">Suppression impossible</string>
   <string name="rename_dialog_title">Entrez un nouveau nom</string>
@@ -262,8 +263,8 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq
   <string name="conflict_title">Conflit de fichiers</string>
   <string name="conflict_message">Quel(s) fichier(s) voulez-vous garder ? Si vous sélectionnez les deux, un chiffre sera ajouté au nom du fichier local.</string>
   <string name="conflict_keep_both">Garder les deux versions</string>
-  <string name="conflict_use_local_version">Utiliser la version locale</string>
-  <string name="conflict_use_server_version">Utiliser la version du serveur</string>
+  <string name="conflict_use_local_version">version locale</string>
+  <string name="conflict_use_server_version">version serveur</string>
   <string name="preview_image_description">Prévisualisation de l\'image</string>
   <string name="preview_image_error_unknown_format">Cette image ne peut pas être affichée</string>
   <string name="error__upload__local_file_not_copied">%1$s n\'a pas pu être copié dans le dossier local %2$s</string>

+ 4 - 4
res/values-gl/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Axustes</string>
   <string name="drawer_item_logs">Rexistros</string>
   <string name="drawer_close">Pechar</string>
+  <string name="drawer_open">Abrir</string>
   <string name="prefs_category_general">Xeral</string>
   <string name="prefs_category_more">Máis</string>
   <string name="prefs_accounts">Contas</string>
@@ -201,8 +202,7 @@ Descárgueo de aquí: %2$s</string>
   <string name="confirmation_remove_alert">Confirma que quere retirar %1$s?</string>
   <string name="confirmation_remove_folder_alert">Confirma que quere retirar %1$s e o seu contido?</string>
   <string name="confirmation_remove_local">Só local</string>
-  <string name="confirmation_remove_folder_local">Só contidos locais</string>
-  <string name="confirmation_remove_remote">Retirar do servidor</string>
+  <string name="confirmation_remove_folder_local">Só local</string>
   <string name="confirmation_remove_remote_and_local">Remoto e local</string>
   <string name="remove_success_msg">Retirado correctamente</string>
   <string name="remove_fail_msg">Non foi posíbel retiralo</string>
@@ -258,8 +258,8 @@ Descárgueo de aquí: %2$s</string>
   <string name="conflict_title">Conflito de ficheiro</string>
   <string name="conflict_message">Que ficheiros quere conservar? Se selecciona ambas versións, o ficheiro copiado terá un número engadido ao nome.</string>
   <string name="conflict_keep_both">Manter ambos</string>
-  <string name="conflict_use_local_version">Usar a versión local</string>
-  <string name="conflict_use_server_version">Usar a versión do servidor</string>
+  <string name="conflict_use_local_version">versión local</string>
+  <string name="conflict_use_server_version">versión no servidor</string>
   <string name="preview_image_description">Vista previa da imaxe</string>
   <string name="preview_image_error_unknown_format">Esta imaxe non pode ser amosada</string>
   <string name="error__upload__local_file_not_copied">Non foi posíbel copiar %1$s no cartafol local %2$s</string>

+ 2 - 3
res/values-he/strings.xml

@@ -17,6 +17,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">פתיחה</string>
   <string name="prefs_category_general">כללי</string>
   <string name="prefs_category_more">יותר</string>
   <string name="prefs_accounts">חשבונות</string>
@@ -172,9 +173,7 @@
   <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="confirmation_remove_folder_local">מקומי בלבד</string>
   <string name="remove_success_msg">ההסרה הצליחה</string>
   <string name="remove_fail_msg">ההסרה נכשלה</string>
   <string name="rename_dialog_title">נא להזין שם חדש</string>

+ 1 - 0
res/values-hi/strings.xml

@@ -17,6 +17,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">खोलें</string>
   <string name="prefs_category_general">सामान्य </string>
   <string name="prefs_category_more">और अधिक</string>
   <string name="prefs_accounts">खाते </string>

+ 1 - 0
res/values-hr/strings.xml

@@ -23,6 +23,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Otvorite</string>
   <string name="prefs_category_general">Općenito</string>
   <string name="prefs_category_more">više</string>
   <string name="prefs_accounts">Korisnićki računi</string>

+ 2 - 3
res/values-hu-rHU/strings.xml

@@ -18,6 +18,7 @@
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
   <string name="drawer_item_settings">Beállítások</string>
+  <string name="drawer_open">Megnyitás</string>
   <string name="prefs_category_general">Általános</string>
   <string name="prefs_category_more">Több</string>
   <string name="prefs_accounts">Fiókok</string>
@@ -169,9 +170,7 @@
   <string name="confirmation_remove_alert">Tényleg el akarod távolítani %1$s?</string>
   <string name="confirmation_remove_folder_alert">Tényleg el akarod távolítani a %1$s és tartalmát?</string>
   <string name="confirmation_remove_local">Csak a helyi példány</string>
-  <string name="confirmation_remove_folder_local">Csak a helyi tartalmat</string>
-  <string name="confirmation_remove_remote">Törlés a szerverről</string>
-  <string name="confirmation_remove_remote_and_local">A szerveren levő és a helyi példány törlése</string>
+  <string name="confirmation_remove_folder_local">Csak a helyi példány</string>
   <string name="remove_success_msg">Az eltávolítás sikerült</string>
   <string name="remove_fail_msg">Az eltávolítás nem sikerült</string>
   <string name="rename_dialog_title">Adj meg egy új nevet</string>

+ 1 - 0
res/values-ia/strings.xml

@@ -11,6 +11,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Aperi</string>
   <string name="prefs_category_general">General</string>
   <string name="prefs_category_more">Plus</string>
   <string name="prefs_accounts">Contos</string>

+ 6 - 5
res/values-id/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Pengaturan</string>
   <string name="drawer_item_logs">Log</string>
   <string name="drawer_close">Tutup</string>
+  <string name="drawer_open">Buka</string>
   <string name="prefs_category_general">Umum</string>
   <string name="prefs_category_more">Lainnya</string>
   <string name="prefs_accounts">Akun</string>
@@ -200,9 +201,9 @@
   <string name="confirmation_remove_alert">Apakah Anda yakin ingin menghapus %1$s?</string>
   <string name="confirmation_remove_folder_alert">Apakah Anda yakin ingin menghapus %1$s dan isinya?</string>
   <string name="confirmation_remove_local">Lokal saja</string>
-  <string name="confirmation_remove_folder_local">Konten lokal saja</string>
-  <string name="confirmation_remove_remote">Hapus dari server</string>
-  <string name="confirmation_remove_remote_and_local">Jarak jauh dan lokal</string>
+  <string name="confirmation_remove_folder_local">Lokal saja</string>
+  <string name="confirmation_remove_remote">Dari server</string>
+  <string name="confirmation_remove_remote_and_local">Remot &amp; lokal</string>
   <string name="remove_success_msg">Penghapusan berhasil</string>
   <string name="remove_fail_msg">Penghapusan gagal</string>
   <string name="rename_dialog_title">Masukkan nama baru</string>
@@ -257,8 +258,8 @@
   <string name="conflict_title">Berkas konflik</string>
   <string name="conflict_message">Berkas mana yang ingin Anda simpan? Jika Anda memilih kedua versi, berkas lokal akan memiliki angka yang ditambahkan pada namanya.</string>
   <string name="conflict_keep_both">Biarkan keduannya</string>
-  <string name="conflict_use_local_version">Gunakan versi lokal</string>
-  <string name="conflict_use_server_version">Gunakan versi server</string>
+  <string name="conflict_use_local_version">versi lokal</string>
+  <string name="conflict_use_server_version">versi server</string>
   <string name="preview_image_description">Pratilik gambar</string>
   <string name="preview_image_error_unknown_format">Gambar ini tidak dapat ditampilkan</string>
   <string name="error__upload__local_file_not_copied">%1$s tidak dapat disalin ke folder lokal %2$s</string>

+ 3 - 0
res/values-is/strings.xml

@@ -10,6 +10,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Opna</string>
   <string name="prefs_category_more">Meira</string>
   <string name="prefs_help">Hjálp</string>
   <string name="auth_username">Notendanafn</string>
@@ -19,6 +20,7 @@
   <string name="file_list_seconds_ago">sek.</string>
   <string name="file_list_empty">Ekkert hér. Settu eitthvað inn!</string>
   <string name="filedetails_download">Niðurhal</string>
+  <string name="action_share_file">Deila hlekk</string>
   <string name="common_yes">Já</string>
   <string name="common_no">Nei</string>
   <string name="common_ok">Í lagi</string>
@@ -31,6 +33,7 @@
   <string name="common_remove">Fjarlægja</string>
   <string name="activity_chooser_send_file_title">Senda</string>
   <string name="empty"></string>
+  <string name="actionbar_move">Færa</string>
   <string name="folder_picker_choose_button_text">Veldu</string>
   <string name="auth_host_address">Host nafn netþjóns</string>
 </resources>

+ 6 - 5
res/values-it/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Impostazioni</string>
   <string name="drawer_item_logs">Registri</string>
   <string name="drawer_close">Chiudi</string>
+  <string name="drawer_open">Apri</string>
   <string name="prefs_category_general">Generale</string>
   <string name="prefs_category_more">Altro</string>
   <string name="prefs_accounts">Account</string>
@@ -200,9 +201,9 @@
   <string name="confirmation_remove_alert">Vuoi davvero rimuovere %1$s?</string>
   <string name="confirmation_remove_folder_alert">Vuoi davvero rimuovere %1$s e il suo contenuto?</string>
   <string name="confirmation_remove_local">Solo localmente</string>
-  <string name="confirmation_remove_folder_local">Solo contenuti locali</string>
-  <string name="confirmation_remove_remote">Rimuovi dal server</string>
-  <string name="confirmation_remove_remote_and_local">Sia remoto che locale</string>
+  <string name="confirmation_remove_folder_local">Solo locale</string>
+  <string name="confirmation_remove_remote">Dal server</string>
+  <string name="confirmation_remove_remote_and_local">Remota e locale</string>
   <string name="remove_success_msg">Rimozione effettuata con successo</string>
   <string name="remove_fail_msg">La rimozione non può essere completata</string>
   <string name="rename_dialog_title">Digita un nuovo nome</string>
@@ -257,8 +258,8 @@
   <string name="conflict_title">File in conflitto</string>
   <string name="conflict_message">Quali file vuoi tenere? Se selezioni entrambi le versioni, il file locale avrà un numero aggiunto al suo nome.</string>
   <string name="conflict_keep_both">Mantieni entrambi</string>
-  <string name="conflict_use_local_version">Usa la versione locale</string>
-  <string name="conflict_use_server_version">Usa la versione del server</string>
+  <string name="conflict_use_local_version">Versione locale</string>
+  <string name="conflict_use_server_version">versione del server</string>
   <string name="preview_image_description">Anteprima dell\'immagine</string>
   <string name="preview_image_error_unknown_format">Questa immagine non può essere mostrata</string>
   <string name="error__upload__local_file_not_copied">%1$s non può essere copiato nella cartella locale %2$s</string>

+ 2 - 5
res/values-ja-rJP/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">設定</string>
   <string name="drawer_item_logs">ログ</string>
   <string name="drawer_close">閉じる</string>
+  <string name="drawer_open">開く</string>
   <string name="prefs_category_general">一般</string>
   <string name="prefs_category_more">もっと見る</string>
   <string name="prefs_accounts">アカウント</string>
@@ -201,9 +202,7 @@
   <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="confirmation_remove_folder_local">ローカルのみ</string>
   <string name="remove_success_msg">削除に成功しました</string>
   <string name="remove_fail_msg">削除を完了できませんでした</string>
   <string name="rename_dialog_title">新しい名前を入力</string>
@@ -258,8 +257,6 @@
   <string name="conflict_title">ファイルが競合</string>
   <string name="conflict_message">どちらのファイルを保存したいですか?両方のバージョンを選択した場合は、ファイル名の後ろに数字を追加したファイルのコピーを作成します。</string>
   <string name="conflict_keep_both">両方を保持</string>
-  <string name="conflict_use_local_version">手元のファイルで上書き</string>
-  <string name="conflict_use_server_version">サーバーのファイルで上書き</string>
   <string name="preview_image_description">イメージプレビュー</string>
   <string name="preview_image_error_unknown_format">この画像は表示できません</string>
   <string name="error__upload__local_file_not_copied">%1$s は、ローカルフォルダー %2$s  にコピーできませんでした。</string>

+ 2 - 3
res/values-ka-rGE/strings.xml

@@ -12,6 +12,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">გახსნა</string>
   <string name="prefs_category_general">ზოგადი</string>
   <string name="prefs_category_more">უფრო მეტი</string>
   <string name="prefs_accounts">ანგარიში</string>
@@ -99,9 +100,7 @@
   <string name="common_rename">გადარქმევა</string>
   <string name="common_remove">წაშლა</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="confirmation_remove_folder_local">მხოლოდ ლოკალური</string>
   <string name="remove_success_msg">წაშლა შარმატებით დასრულდა</string>
   <string name="remove_fail_msg">წაშლა წარუმატებლად დამთავრდა</string>
   <string name="rename_dialog_title">შეიყვანეთ ახალი სახელი</string>

+ 2 - 2
res/values-km/strings.xml

@@ -23,6 +23,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">បើក</string>
   <string name="prefs_category_general">ទូទៅ</string>
   <string name="prefs_category_more">ច្រើន​ទៀត</string>
   <string name="prefs_accounts">គណនី</string>
@@ -84,8 +85,7 @@
   <string name="common_rename">ប្ដូរ​ឈ្មោះ</string>
   <string name="common_remove">ដកចេញ</string>
   <string name="confirmation_remove_local">ទីកន្លែងតែមួយ</string>
-  <string name="confirmation_remove_remote">ដកចេញពី​សឺវឺ</string>
-  <string name="confirmation_remove_remote_and_local">បញ្ជារ និងទីតាំង</string>
+  <string name="confirmation_remove_folder_local">ទីកន្លែងតែមួយ</string>
   <string name="remove_success_msg">ការដកយកចេញបានជោគជ័យ</string>
   <string name="remove_fail_msg">ការដកយកចេញបានបរាជ័យ</string>
   <string name="rename_dialog_title">បញ្ចូលឈ្មោះថ្មី</string>

+ 1 - 0
res/values-kn/strings.xml

@@ -11,6 +11,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">ತೆರೆ</string>
   <string name="prefs_category_more">ಇನ್ನಷ್ಟು</string>
   <string name="prefs_help">ಸಹಾಯ</string>
   <string name="prefs_imprint">ಮುದ್ರೆ</string>

+ 2 - 3
res/values-ko/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">설정</string>
   <string name="drawer_item_logs">로그</string>
   <string name="drawer_close">닫기</string>
+  <string name="drawer_open">열기</string>
   <string name="prefs_category_general">일반</string>
   <string name="prefs_category_more">더 보기</string>
   <string name="prefs_accounts">계정</string>
@@ -200,9 +201,7 @@
   <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="confirmation_remove_folder_local">로컬만</string>
   <string name="remove_success_msg">성공적으로 삭제함</string>
   <string name="remove_fail_msg">삭제할 수 없음</string>
   <string name="rename_dialog_title">새 이름 입력</string>

+ 1 - 0
res/values-ku-rIQ/strings.xml

@@ -9,6 +9,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">بیکەوە</string>
   <string name="prefs_category_general">گشتی</string>
   <string name="prefs_accounts">هەژمارەکان</string>
   <string name="prefs_help">یارمەتی</string>

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

@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <!--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>-->
+  <!--TODO re-enable when "On Device" is available
+    <string name="drawer_item_on_device">On device</string>-->
+  <string name="empty"></string>
+</resources>

+ 2 - 3
res/values-lb/strings.xml

@@ -23,6 +23,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Opmaachen</string>
   <string name="prefs_category_general">Allgemeng</string>
   <string name="prefs_category_more">Méi</string>
   <string name="prefs_accounts">Konten</string>
@@ -145,9 +146,7 @@
   <string name="confirmation_remove_alert">Wëlls du %1$s wierklech läschen?</string>
   <string name="confirmation_remove_folder_alert">Wëlls du %1$s an de ganzen Inhalt wierklech läschen?</string>
   <string name="confirmation_remove_local">Nemme lokal</string>
-  <string name="confirmation_remove_folder_local">Nëmme lokal Inhalter</string>
-  <string name="confirmation_remove_remote">Vum Server läschen</string>
-  <string name="confirmation_remove_remote_and_local">Um Server a lokal</string>
+  <string name="confirmation_remove_folder_local">Nemme lokal</string>
   <string name="remove_success_msg">Erfollegräich geläscht</string>
   <string name="remove_fail_msg">Läsche feelgeschloen</string>
   <string name="rename_dialog_title">Gëff en neien Numm an</string>

+ 2 - 3
res/values-lt-rLT/strings.xml

@@ -24,6 +24,7 @@
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
   <string name="drawer_item_settings">Parinktys</string>
+  <string name="drawer_open">Atverti</string>
   <string name="prefs_category_general">Bendras</string>
   <string name="prefs_category_more">Daugiau</string>
   <string name="prefs_accounts">Paskyros</string>
@@ -173,9 +174,7 @@
   <string name="confirmation_remove_alert">Ar tikrai norite pašalinti %1$s?</string>
   <string name="confirmation_remove_folder_alert">Ar tikrai norite pašalinti %1$s ir ten esantį turinį?</string>
   <string name="confirmation_remove_local">Tik vietiniai</string>
-  <string name="confirmation_remove_folder_local">Tik vietinis turinys</string>
-  <string name="confirmation_remove_remote">Pašalinti iš serverio</string>
-  <string name="confirmation_remove_remote_and_local">Nutolę ir vietiniai</string>
+  <string name="confirmation_remove_folder_local">Tik vietiniai</string>
   <string name="remove_success_msg">Pašalinta sėkmingai</string>
   <string name="remove_fail_msg">Pašalinti nepavyko</string>
   <string name="rename_dialog_title">Įveskite naują pavadinimą</string>

+ 2 - 3
res/values-lv/strings.xml

@@ -23,6 +23,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Atvērt</string>
   <string name="prefs_category_general">Vispārīgi</string>
   <string name="prefs_category_more">Vairāk</string>
   <string name="prefs_accounts">Konti</string>
@@ -117,9 +118,7 @@
   <string name="common_rename">Pārsaukt</string>
   <string name="common_remove">Izņemt</string>
   <string name="confirmation_remove_local">Tikai lokālos</string>
-  <string name="confirmation_remove_folder_local">Tikai lokālo saturu</string>
-  <string name="confirmation_remove_remote">Izņemt no servera</string>
-  <string name="confirmation_remove_remote_and_local">Attālinātās un lokālās</string>
+  <string name="confirmation_remove_folder_local">Tikai lokālos</string>
   <string name="remove_success_msg">Veiksmīgi izņemts</string>
   <string name="remove_fail_msg">Neizdevās izņemt</string>
   <string name="rename_dialog_title">Ievadīt jaunu nosaukumu</string>

+ 2 - 3
res/values-mk/strings.xml

@@ -23,6 +23,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Отвори</string>
   <string name="prefs_category_general">Општо</string>
   <string name="prefs_category_more">Повеќе</string>
   <string name="prefs_accounts">Сметки</string>
@@ -192,9 +193,7 @@
   <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="confirmation_remove_folder_local">Само локално</string>
   <string name="remove_success_msg">Одстранувањето е успешно</string>
   <string name="remove_fail_msg">Одстранувањето е неуспешно</string>
   <string name="rename_dialog_title">Внеси ново име</string>

+ 2 - 0
res/values-ms-rMY/strings.xml

@@ -18,6 +18,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Buka</string>
   <string name="prefs_category_general">Umum</string>
   <string name="prefs_category_more">Lanjutan</string>
   <string name="prefs_accounts">Akaun</string>
@@ -55,6 +56,7 @@
   <string name="common_rename">Namakan</string>
   <string name="common_remove">Buang</string>
   <string name="confirmation_remove_local">Lokal sahaja</string>
+  <string name="confirmation_remove_folder_local">Lokal sahaja</string>
   <string name="activity_chooser_send_file_title">Hantar</string>
   <string name="empty"></string>
   <string name="prefs_category_accounts">Akaun</string>

+ 2 - 3
res/values-nb-rNO/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Innstillinger</string>
   <string name="drawer_item_logs">Logger</string>
   <string name="drawer_close">Lukk</string>
+  <string name="drawer_open">Åpne</string>
   <string name="prefs_category_general">Generelt</string>
   <string name="prefs_category_more">Mer</string>
   <string name="prefs_accounts">Kontoer</string>
@@ -200,9 +201,7 @@
   <string name="confirmation_remove_alert">Vil du virkelig fjerne %1$s?</string>
   <string name="confirmation_remove_folder_alert">Vil du virkelig fjerne %1$s inkludert innholdet?</string>
   <string name="confirmation_remove_local">Kun lokalt</string>
-  <string name="confirmation_remove_folder_local">Kun lokalt innhold</string>
-  <string name="confirmation_remove_remote">Fjern fra server</string>
-  <string name="confirmation_remove_remote_and_local">Ekstern og lokal</string>
+  <string name="confirmation_remove_folder_local">Kun lokalt</string>
   <string name="remove_success_msg">Fjerning var vellykket</string>
   <string name="remove_fail_msg">Fjerning mislyktes</string>
   <string name="rename_dialog_title">Skriv inn et nytt navn</string>

+ 6 - 5
res/values-nl/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Instellingen</string>
   <string name="drawer_item_logs">Logs</string>
   <string name="drawer_close">Sluiten</string>
+  <string name="drawer_open">Open</string>
   <string name="prefs_category_general">Algemeen</string>
   <string name="prefs_category_more">Meer</string>
   <string name="prefs_accounts">Accounts</string>
@@ -203,9 +204,9 @@ Hieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar
   <string name="confirmation_remove_alert">Wilt u %1$s werkelijk verwijderen?</string>
   <string name="confirmation_remove_folder_alert">Wilt u %1$s en de inhoud ervan werkelijk verwijderen?</string>
   <string name="confirmation_remove_local">Alleen lokaal</string>
-  <string name="confirmation_remove_folder_local">Alleen lokale inhoud </string>
-  <string name="confirmation_remove_remote">Verwijder van server</string>
-  <string name="confirmation_remove_remote_and_local">Lokaal en op de server</string>
+  <string name="confirmation_remove_folder_local">Alleen lokaal</string>
+  <string name="confirmation_remove_remote">Van server</string>
+  <string name="confirmation_remove_remote_and_local">Extern &amp; lokaal</string>
   <string name="remove_success_msg">Succesvol verwijderd</string>
   <string name="remove_fail_msg">Verwijdering kon niet voltooid worden</string>
   <string name="rename_dialog_title">Voer een nieuwe naam in</string>
@@ -260,8 +261,8 @@ Hieronder staan de lokale bestanden en de externe bestanden in %5$s waar ze naar
   <string name="conflict_title">Bestandsconflict</string>
   <string name="conflict_message">Welke bestanden wilt u bewaren? Als u beide versies selecteert zal het lokale bestand een nummer aan de naam toegevoegd krijgen.</string>
   <string name="conflict_keep_both">Beide bewaren</string>
-  <string name="conflict_use_local_version">Gebruik de lokale versie</string>
-  <string name="conflict_use_server_version">Gebruik de server-versie</string>
+  <string name="conflict_use_local_version">lokale versie</string>
+  <string name="conflict_use_server_version">serverversie</string>
   <string name="preview_image_description">Afbeelding voorbeeld</string>
   <string name="preview_image_error_unknown_format">Deze afbeelding kan niet worden getoond</string>
   <string name="error__upload__local_file_not_copied">%1$s kon niet worden gekopieerd naar de %2$s lokale map</string>

+ 2 - 2
res/values-nn-rNO/strings.xml

@@ -17,6 +17,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Opna</string>
   <string name="prefs_category_general">Generelt</string>
   <string name="prefs_category_more">Meir</string>
   <string name="prefs_accounts">Kontoar</string>
@@ -105,8 +106,7 @@
   <string name="common_rename">Endra namn</string>
   <string name="common_remove">Fjern</string>
   <string name="confirmation_remove_local">Berre lokalt</string>
-  <string name="confirmation_remove_remote">Fjern frå tenaren</string>
-  <string name="confirmation_remove_remote_and_local">Ekstern og lokal</string>
+  <string name="confirmation_remove_folder_local">Berre lokalt</string>
   <string name="remove_success_msg">Fjerning vellukka</string>
   <string name="remove_fail_msg">Fjerning mislukka</string>
   <string name="rename_server_fail_msg">Klarte ikkje å fullføra omdøyping</string>

+ 1 - 0
res/values-oc/strings.xml

@@ -13,6 +13,7 @@
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
   <string name="drawer_item_settings">Paramètres</string>
+  <string name="drawer_open">Dubrís</string>
   <string name="prefs_category_general">General</string>
   <string name="prefs_category_more">Mai d\'aquò</string>
   <string name="prefs_accounts">Comptes</string>

+ 1 - 2
res/values-pa/strings.xml

@@ -89,8 +89,7 @@
   <string name="common_rename">ਨਾਂ ਬਦਲੋ</string>
   <string name="common_remove">ਹਟਾਓ</string>
   <string name="confirmation_remove_local">ਕੇਵਲ ਲੋਕਲ</string>
-  <string name="confirmation_remove_remote">ਸਰਵਰ ਤੋਂ ਹਟਾਓ</string>
-  <string name="confirmation_remove_remote_and_local">ਰਿਮੋਟ ਤੇ ਲੋਕਲ</string>
+  <string name="confirmation_remove_folder_local">ਕੇਵਲ ਲੋਕਲ</string>
   <string name="wait_a_moment">ਪਲ਼ ਭਰ ਲਈ ਉਡੀਕੋ</string>
   <string name="filedisplay_no_file_selected">ਕੋਈ ਫਾਇਲ ਨਹੀਂ ਚੁਣੀ ਗਈ</string>
   <string name="ssl_validator_header">ਇਹ ਸਾਈਟ ਦੀ ਪਛਾਣ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ ਹੈ</string>

+ 18 - 3
res/values-pl/strings.xml

@@ -21,8 +21,13 @@
     	<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">Wszystkie pliki</string>
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_item_settings">Ustawienia</string>
+  <string name="drawer_item_logs">Logi</string>
+  <string name="drawer_close">Zamknij</string>
+  <string name="drawer_open">Otwórz</string>
   <string name="prefs_category_general">Ogólne</string>
   <string name="prefs_category_more">Więcej</string>
   <string name="prefs_accounts">Konta</string>
@@ -65,6 +70,7 @@
   <string name="uploader_info_uploading">Wysyłanie</string>
   <string name="file_list_seconds_ago">sekund temu</string>
   <string name="file_list_empty">Pusto. Wyślij coś!</string>
+  <string name="file_list_loading">Wczytywanie...</string>
   <string name="local_file_list_empty">Nie ma plików w tym folderze.</string>
   <string name="filedetails_select_file">Dotknij plik aby wyświetlić dodatkowe informacje</string>
   <string name="filedetails_size">Rozmiar:</string>
@@ -195,9 +201,8 @@
   <string name="confirmation_remove_alert">Czy naprawdę chcesz usunąć %1$s?</string>
   <string name="confirmation_remove_folder_alert">Czy naprawdę chcesz usunąć %1$s i jego zawartość?</string>
   <string name="confirmation_remove_local">Tylko lokalnie</string>
-  <string name="confirmation_remove_folder_local">Tylko zasoby lokalne</string>
-  <string name="confirmation_remove_remote">Usuń z serwera</string>
-  <string name="confirmation_remove_remote_and_local">Z serwera i telefonu</string>
+  <string name="confirmation_remove_folder_local">Tylko lokalnie</string>
+  <string name="confirmation_remove_remote">Z serwera</string>
   <string name="remove_success_msg">Usunięto</string>
   <string name="remove_fail_msg">Nie można usunąć</string>
   <string name="rename_dialog_title">Wprowadź nową nazwę</string>
@@ -248,7 +253,10 @@
   <string name="instant_upload_on_wifi">Wysyłaj zdjęcia tylko przez WiFi</string>
   <string name="instant_video_upload_on_wifi">Aktualizuj filmy tylko przez WiFi</string>
   <string name="instant_upload_path">/InstantUpload</string>
+  <string name="conflict_title">Konflikt pliku</string>
   <string name="conflict_keep_both">Zatrzymaj oba</string>
+  <string name="conflict_use_local_version">lokalna wersja</string>
+  <string name="conflict_use_server_version">wersja zdalna</string>
   <string name="preview_image_description">Podgląd</string>
   <string name="preview_image_error_unknown_format">Ten obrazek nie może zostać wyświetlony</string>
   <string name="error__upload__local_file_not_copied">%1$s nie może zostać skopiowany do lokalnego folderu %2$s</string>
@@ -300,7 +308,14 @@
   <string name="prefs_category_security">Bezpieczeństwo</string>
   <string name="prefs_instant_video_upload_path_title">Katalog wysyłania dla wideo</string>
   <string name="download_folder_failed_content">Pobieranie %1$s katalogu nie może zostać ukończone</string>
+  <string name="shared_subject_header">udostępniony</string>
+  <string name="with_you_subject_header">z tobą</string>
   <string name="auth_refresh_button">Odśwież połączenie</string>
   <string name="auth_host_address">Adres Serwera</string>
   <string name="common_error_out_memory">Brak wystarczającej pamięci</string>
+  <string name="username">Użytkownik</string>
+  <string name="file_list__footer__folder">1 folder</string>
+  <string name="file_list__footer__folders">%1$d folderów</string>
+  <string name="file_list__footer__file">1 plik</string>
+  <string name="file_list__footer__file_and_folder">1 plik , 1 folder</string>
 </resources>

+ 6 - 5
res/values-pt-rBR/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Configurações</string>
   <string name="drawer_item_logs">Logs</string>
   <string name="drawer_close">Fechar</string>
+  <string name="drawer_open">Abrir</string>
   <string name="prefs_category_general">Geral</string>
   <string name="prefs_category_more">Mais</string>
   <string name="prefs_accounts">Contas</string>
@@ -200,9 +201,9 @@
   <string name="confirmation_remove_alert">Você realmente deseja remover %1$s?</string>
   <string name="confirmation_remove_folder_alert">Você realmente deseja remover %1$s e seus conteúdos?</string>
   <string name="confirmation_remove_local">Somente local</string>
-  <string name="confirmation_remove_folder_local">Somente conteúdo local</string>
-  <string name="confirmation_remove_remote">Remover do servidor</string>
-  <string name="confirmation_remove_remote_and_local">Ambos remoto e local</string>
+  <string name="confirmation_remove_folder_local">Somente local</string>
+  <string name="confirmation_remove_remote">Do servidor</string>
+  <string name="confirmation_remove_remote_and_local">Remoto &amp; local</string>
   <string name="remove_success_msg">Removido com sucesso</string>
   <string name="remove_fail_msg">Erro ao remover</string>
   <string name="rename_dialog_title">Digite um novo nome</string>
@@ -257,8 +258,8 @@
   <string name="conflict_title">Conflito de arquivo</string>
   <string name="conflict_message">Quais arquivos você deseja manter? Se você selecionar ambas as versões, o arquivo local terá um número adicionado ao seu nome.</string>
   <string name="conflict_keep_both">Manter ambos</string>
-  <string name="conflict_use_local_version">Usar a versão local</string>
-  <string name="conflict_use_server_version">Usar a versão servidor</string>
+  <string name="conflict_use_local_version">versão local</string>
+  <string name="conflict_use_server_version">versão do servidor</string>
   <string name="preview_image_description">Pré-visualização da imagem</string>
   <string name="preview_image_error_unknown_format">Esta imagem não pode ser mostrada</string>
   <string name="error__upload__local_file_not_copied">%1$s não pôde ser copiado para pasta local %2$s</string>

+ 2 - 5
res/values-pt-rPT/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Definições</string>
   <string name="drawer_item_logs">Registos de Alterações</string>
   <string name="drawer_close">Fechar</string>
+  <string name="drawer_open">Abrir</string>
   <string name="prefs_category_general">Geral</string>
   <string name="prefs_category_more">Mais</string>
   <string name="prefs_accounts">Contas</string>
@@ -199,9 +200,7 @@
   <string name="confirmation_remove_alert">Tem a certeza que deseja remover %1$s ?</string>
   <string name="confirmation_remove_folder_alert">Deseja realmente remover %1$s e o seu conteúdo?</string>
   <string name="confirmation_remove_local">Apenas localmente</string>
-  <string name="confirmation_remove_folder_local">So conteúdos locais</string>
-  <string name="confirmation_remove_remote">Apagar do servidor</string>
-  <string name="confirmation_remove_remote_and_local">ambos os remoto e local</string>
+  <string name="confirmation_remove_folder_local">Apenas localmente</string>
   <string name="remove_success_msg">Removido com sucesso</string>
   <string name="remove_fail_msg">Não foi possível remover</string>
   <string name="rename_dialog_title">Introduza um novo nome</string>
@@ -256,8 +255,6 @@
   <string name="conflict_title">Conflito de ficheiro</string>
   <string name="conflict_message">Quais os ficheiros que pretende manter? Se selecionar ambas as versões, o ficheiro local irá ter um número adicionado ao seu nome.</string>
   <string name="conflict_keep_both">Manter ambos</string>
-  <string name="conflict_use_local_version">Usar versão local</string>
-  <string name="conflict_use_server_version">Usar versão do servidor</string>
   <string name="preview_image_description">Pré-Visualizar imagem</string>
   <string name="preview_image_error_unknown_format">Esta imagem não pode ser mostrada</string>
   <string name="error__upload__local_file_not_copied">Não foi possível copiar %1$s para a pasta local %2$s</string>

+ 10 - 3
res/values-ro/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Setări</string>
   <string name="drawer_item_logs">Înregistrări</string>
   <string name="drawer_close">Închide</string>
+  <string name="drawer_open">Deschide</string>
   <string name="prefs_category_general">General</string>
   <string name="prefs_category_more">Mai mult</string>
   <string name="prefs_accounts">Conturi</string>
@@ -194,14 +195,15 @@
   <string name="auth_can_not_auth_against_server">Nu se poate autentifica cu acest server</string>
   <string name="auth_account_does_not_exist">Contul nu există încă în dispozitiv</string>
   <string name="favorite">Favorit</string>
+  <string name="unfavorite">Defavoritați</string>
   <string name="common_rename">Redenumește</string>
   <string name="common_remove">Elimină</string>
   <string name="confirmation_remove_alert">Doriti sigur sa stergeti %1$s?</string>
   <string name="confirmation_remove_folder_alert">Sigur vrei să elimini %1$s și conținutul său?</string>
   <string name="confirmation_remove_local">Doar local</string>
-  <string name="confirmation_remove_folder_local">Doar continut local</string>
-  <string name="confirmation_remove_remote">Elimină de pe server</string>
-  <string name="confirmation_remove_remote_and_local">De la distanță și local</string>
+  <string name="confirmation_remove_folder_local">Doar local</string>
+  <string name="confirmation_remove_remote">De pe server</string>
+  <string name="confirmation_remove_remote_and_local">Ambele</string>
   <string name="remove_success_msg">Eliminat cu succes</string>
   <string name="remove_fail_msg">Eliminarea nu a reușit</string>
   <string name="rename_dialog_title">Introduceţi un nou nume</string>
@@ -253,7 +255,11 @@
   <string name="instant_upload_on_wifi">Încarcă poze doar prin WiFi</string>
   <string name="instant_video_upload_on_wifi">Încarcă videoclipuri doar via WiFi</string>
   <string name="instant_upload_path">/Încărcare instantă</string>
+  <string name="conflict_title">Conflict de fișiere</string>
+  <string name="conflict_message">Care fișiere doriți să păstrați? Dacă selectați „ambele”, fișierului local i se va adăuga un număr numelui său.</string>
   <string name="conflict_keep_both">Pastreaza amandoua</string>
+  <string name="conflict_use_local_version">versiunea locală</string>
+  <string name="conflict_use_server_version">versiunea de pe server</string>
   <string name="preview_image_description">Previzualizare imagine</string>
   <string name="preview_image_error_unknown_format">Aceasta imagine nu poate fi arătată</string>
   <string name="error__upload__local_file_not_copied">%1$s nu a putut fi copiat in dosarul local %2$s </string>
@@ -307,6 +313,7 @@
   <string name="shared_subject_header">partajat</string>
   <string name="with_you_subject_header">cu tine</string>
   <string name="subject_token">%1$s a partajat fișierul \"%2$s\" cu tine</string>
+  <string name="saml_subject_token">„%1$s” a fost partajat cu dumneavoastră</string>
   <string name="auth_refresh_button">Reîmprospătează conexiunea</string>
   <string name="auth_host_address">Adresa server-ului</string>
   <string name="common_error_out_memory">Memorie insuficientă </string>

+ 2 - 5
res/values-ru/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Настройки</string>
   <string name="drawer_item_logs">Журналы</string>
   <string name="drawer_close">Закрыть</string>
+  <string name="drawer_open">Открыть</string>
   <string name="prefs_category_general">Основные</string>
   <string name="prefs_category_more">Больше</string>
   <string name="prefs_accounts">Учётные записи</string>
@@ -201,9 +202,7 @@
   <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="confirmation_remove_folder_local">Только локально</string>
   <string name="remove_success_msg">Удаление завершено</string>
   <string name="remove_fail_msg">Ошибка удаления</string>
   <string name="rename_dialog_title">Введите новое имя</string>
@@ -258,8 +257,6 @@
   <string name="conflict_title">Конфликт файлов</string>
   <string name="conflict_message">Какие файлы Вы хотите сохранить? При выборе обеих версий, к названию локального файла будет добавлена цифра</string>
   <string name="conflict_keep_both">Сохранить оба</string>
-  <string name="conflict_use_local_version">Использовать локальную версию</string>
-  <string name="conflict_use_server_version">Использовать версию сервера</string>
   <string name="preview_image_description">Предпросмотр</string>
   <string name="preview_image_error_unknown_format">Это изображение не может быть отображено</string>
   <string name="error__upload__local_file_not_copied">%1$s невозможно скопировать в локальный каталог %2$s </string>

+ 2 - 2
res/values-si-rLK/strings.xml

@@ -9,6 +9,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">විවෘත කරන්න</string>
   <string name="prefs_category_general">සාමාන්‍යයෙන්</string>
   <string name="prefs_category_more">වැඩි</string>
   <string name="prefs_accounts">ගිණුම්</string>
@@ -66,8 +67,7 @@
   <string name="common_rename">නැවත නම් කරන්න</string>
   <string name="common_remove">ඉවත් කරන්න </string>
   <string name="confirmation_remove_local">පෙදෙසි පමණක්</string>
-  <string name="confirmation_remove_remote">සේවාදායකයාගෙන් ඉවත් කරන්න</string>
-  <string name="confirmation_remove_remote_and_local">දුරස්ථ හා පෙදෙසි </string>
+  <string name="confirmation_remove_folder_local">පෙදෙසි පමණක්</string>
   <string name="remove_success_msg">සාර්ථක ඉවත්කිරීමක්</string>
   <string name="remove_fail_msg">ඉවත් කිරීම සම්පූර්ණ කළ නොහැක</string>
   <string name="rename_server_fail_msg">නැවත නම් කිරීම සම්පුර්ණ කළ නොහැකි විය</string>

+ 2 - 3
res/values-sk-rSK/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Nastavenia</string>
   <string name="drawer_item_logs">Logy</string>
   <string name="drawer_close">Zavrieť</string>
+  <string name="drawer_open">Otvoriť</string>
   <string name="prefs_category_general">Všeobecné</string>
   <string name="prefs_category_more">Viac</string>
   <string name="prefs_accounts">Účty</string>
@@ -194,9 +195,7 @@
   <string name="confirmation_remove_alert">Naozaj chcete odstrániť %1$s?</string>
   <string name="confirmation_remove_folder_alert">Naozaj chcete odstrániť %1$s a jeho obsah?</string>
   <string name="confirmation_remove_local">Iba lokálne</string>
-  <string name="confirmation_remove_folder_local">Len lokálny obsah</string>
-  <string name="confirmation_remove_remote">Zmazať zo servera</string>
-  <string name="confirmation_remove_remote_and_local">Vzdialené a lokálne</string>
+  <string name="confirmation_remove_folder_local">Iba lokálne</string>
   <string name="remove_success_msg">Úspešne odstránené</string>
   <string name="remove_fail_msg">Odstránenie zlyhalo</string>
   <string name="rename_dialog_title">Zadajte nové meno</string>

+ 9 - 3
res/values-sl/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Nastavitve</string>
   <string name="drawer_item_logs">Dnevnik</string>
   <string name="drawer_close">Zapri</string>
+  <string name="drawer_open">Odpri</string>
   <string name="prefs_category_general">Splošno</string>
   <string name="prefs_category_more">Več</string>
   <string name="prefs_accounts">Računi</string>
@@ -200,9 +201,9 @@
   <string name="confirmation_remove_alert">Ali res želite odstraniti %1$s?</string>
   <string name="confirmation_remove_folder_alert">Ali res želite odstraniti %1$s skupaj s celotno vsebino?</string>
   <string name="confirmation_remove_local">Le krajevno</string>
-  <string name="confirmation_remove_folder_local">Le krajevno vsebino</string>
-  <string name="confirmation_remove_remote">Odstrani s strežnika</string>
-  <string name="confirmation_remove_remote_and_local">Oddaljeno in krajevno</string>
+  <string name="confirmation_remove_folder_local">Le krajevno</string>
+  <string name="confirmation_remove_remote">S strežnika</string>
+  <string name="confirmation_remove_remote_and_local">Oddaljeno &amp; krajevno</string>
   <string name="remove_success_msg">Odstranitev je uspešno končana</string>
   <string name="remove_fail_msg">Odstranjevanje je spodletelo</string>
   <string name="rename_dialog_title">Vnesite novo ime</string>
@@ -254,7 +255,11 @@
   <string name="instant_upload_on_wifi">Pošiljaj slike le preko povezav Wi-Fi</string>
   <string name="instant_video_upload_on_wifi">Pošlji posnetke le preko povezave Wi-Fi</string>
   <string name="instant_upload_path">/Poslano</string>
+  <string name="conflict_title">Neskladje datotek</string>
+  <string name="conflict_message">Katere datoteke želite ohraniti? Če izberete obe različici, bo krajevni datoteki dodatna k imenu še številka.</string>
   <string name="conflict_keep_both">Ohrani obe</string>
+  <string name="conflict_use_local_version">krajevna različica</string>
+  <string name="conflict_use_server_version">različica strežnika</string>
   <string name="preview_image_description">Predogled slike</string>
   <string name="preview_image_error_unknown_format">Te slike ni mogoče prikazati</string>
   <string name="error__upload__local_file_not_copied">Datoteke %1$s ni mogoče kopirati v krajevno mapo %2$s</string>
@@ -309,6 +314,7 @@
   <string name="shared_subject_header">v souporabi</string>
   <string name="with_you_subject_header">z vami</string>
   <string name="subject_token">Uporabnik %1$s je omogočil souporabo \"%2$s\" z vami</string>
+  <string name="saml_subject_token">\"%1$s\" je oddan v souporabo z vami</string>
   <string name="auth_refresh_button">Osveži povezavo</string>
   <string name="auth_host_address">Naslov strežnika</string>
   <string name="common_error_out_memory">Ni dovolj pomnilnika</string>

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

@@ -11,6 +11,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Hap</string>
   <string name="prefs_category_general">Përgjithshme</string>
   <string name="prefs_category_more">Më tepër</string>
   <string name="prefs_accounts">Llogarit</string>

+ 1 - 0
res/values-sr-rSP/strings.xml

@@ -12,6 +12,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Otvori</string>
   <string name="prefs_category_general">Opšte</string>
   <string name="prefs_accounts">Nalozi</string>
   <string name="prefs_manage_accounts">Upravljaj nalozima</string>

+ 2 - 3
res/values-sr/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Поставке</string>
   <string name="drawer_item_logs">Записници</string>
   <string name="drawer_close">Затвори</string>
+  <string name="drawer_open">Отвори</string>
   <string name="prefs_category_general">Опште</string>
   <string name="prefs_category_more">Остало</string>
   <string name="prefs_accounts">Налози</string>
@@ -200,9 +201,7 @@
   <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="confirmation_remove_folder_local">Само локално</string>
   <string name="remove_success_msg">Уклањање успешно</string>
   <string name="remove_fail_msg">Уклањање неуспешно</string>
   <string name="rename_dialog_title">Унесите нов назив</string>

+ 2 - 3
res/values-sv/strings.xml

@@ -23,6 +23,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Öppna</string>
   <string name="prefs_category_general">Allmänt</string>
   <string name="prefs_category_more">Mer</string>
   <string name="prefs_accounts">Konton</string>
@@ -182,9 +183,7 @@
   <string name="confirmation_remove_alert">Vill du verkligen ta bort %1$s?</string>
   <string name="confirmation_remove_folder_alert">Vill du verkligen ta bort %1$s och dess innehåll?</string>
   <string name="confirmation_remove_local">Endast lokalt</string>
-  <string name="confirmation_remove_folder_local">Endast lokalt innehåll</string>
-  <string name="confirmation_remove_remote">Radera från server</string>
-  <string name="confirmation_remove_remote_and_local">Både server och lokalt</string>
+  <string name="confirmation_remove_folder_local">Endast lokalt</string>
   <string name="remove_success_msg">Lyckad radering</string>
   <string name="remove_fail_msg">Radering kunde inte slutföras</string>
   <string name="rename_dialog_title">Ange ett nytt namn</string>

+ 2 - 3
res/values-ta-rLK/strings.xml

@@ -11,6 +11,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">திறக்க</string>
   <string name="prefs_category_general">பொதுவான</string>
   <string name="prefs_category_more">மேலதிக</string>
   <string name="prefs_accounts">கணக்குகள்</string>
@@ -87,9 +88,7 @@
   <string name="common_rename">பெயர்மாற்றம்</string>
   <string name="common_remove">அகற்றுக</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="confirmation_remove_folder_local">உள்ளூர் மட்டும்</string>
   <string name="remove_success_msg">வெற்றிகரமாக அகற்றப்பட்டது</string>
   <string name="remove_fail_msg">நீக்கலை நிறைவு செய்ய முடியவில்லை</string>
   <string name="rename_dialog_title">புதிய பெயரொன்றை நுழைக்க</string>

+ 6 - 5
res/values-th-rTH/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">ตั้งค่า</string>
   <string name="drawer_item_logs">บันทึก</string>
   <string name="drawer_close">ปิด</string>
+  <string name="drawer_open">เปิด</string>
   <string name="prefs_category_general">ทั่วไป</string>
   <string name="prefs_category_more">เพิ่มเติม</string>
   <string name="prefs_accounts">บัญชี</string>
@@ -199,9 +200,9 @@
   <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="confirmation_remove_folder_local">เฉพาะต้นทางเท่านั้น</string>
+  <string name="confirmation_remove_remote">จากเซิฟเวอร์</string>
+  <string name="confirmation_remove_remote_and_local">รีโมท &amp; ต้นทาง</string>
   <string name="remove_success_msg">ลบเรียบร้อยแล้ว</string>
   <string name="remove_fail_msg">ไม่สามารถลบได้</string>
   <string name="rename_dialog_title">กรอกชื่อใหม่</string>
@@ -256,8 +257,8 @@
   <string name="conflict_title">ไฟล์ที่ขัดแย้ง</string>
   <string name="conflict_message">ไฟล์ใดที่คุณต้องการที่จะเก็บ? หากคุณเลือกทั้งสองรุ่น ไฟล์ต้นทางจะมีจำนวนชื่อเพิ่ม</string>
   <string name="conflict_keep_both">เก็บไว้ทั้งสองอย่าง</string>
-  <string name="conflict_use_local_version">ใช้รุ่นทั่วไป</string>
-  <string name="conflict_use_server_version">ใช้รุ่นของเซิร์ฟเวอร์</string>
+  <string name="conflict_use_local_version">เวอร์ชันต้นทาง</string>
+  <string name="conflict_use_server_version">เวอร์ชันเซิฟเวอร์</string>
   <string name="preview_image_description">แสดงรูปภาพตัวอย่าง</string>
   <string name="preview_image_error_unknown_format">ไม่สามารถแสดงรูปภาพนี้ได้</string>
   <string name="error__upload__local_file_not_copied">%1$s ไม่สามารถคัดลอกไปยังโฟลเดอร์ %2$s ในเครื่อง</string>

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

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Ayarlar</string>
   <string name="drawer_item_logs">Günlükler</string>
   <string name="drawer_close">Kapat</string>
+  <string name="drawer_open">Aç</string>
   <string name="prefs_category_general">Genel</string>
   <string name="prefs_category_more">Daha fazla</string>
   <string name="prefs_accounts">Hesaplar</string>
@@ -200,8 +201,8 @@
   <string name="confirmation_remove_alert">Gerçekten %1$s dosyasını kaldırmak istiyor musunuz?</string>
   <string name="confirmation_remove_folder_alert">Gerçekten %1$s ve içeriğini kaldırmak istediğinizden emin misiniz?</string>
   <string name="confirmation_remove_local">Sadece yerel</string>
-  <string name="confirmation_remove_folder_local">Sadece yerel içerik</string>
-  <string name="confirmation_remove_remote">Sunucudan kaldır</string>
+  <string name="confirmation_remove_folder_local">Sadece yerel</string>
+  <string name="confirmation_remove_remote">Sunucudan</string>
   <string name="confirmation_remove_remote_and_local">Uzak ve yerel</string>
   <string name="remove_success_msg">Kaldırma başarılı</string>
   <string name="remove_fail_msg">Kaldırma başarısız</string>
@@ -254,7 +255,11 @@
   <string name="instant_upload_on_wifi">Fotoğrafları sadece kablosuzda (WiFi) yükle</string>
   <string name="instant_video_upload_on_wifi">Videoları sadece kablosuzda (WiFi) yükle</string>
   <string name="instant_upload_path">/AnındaYükle</string>
+  <string name="conflict_title">Dosya çakışması</string>
+  <string name="conflict_message">Hangi dosyaları saklamak istiyorsunuz? Her ikisini de saklamayı seçerseniz yerel dosyanın adına bir sayı eklenecek.</string>
   <string name="conflict_keep_both">İkisini de koru</string>
+  <string name="conflict_use_local_version">yerel sürüm</string>
+  <string name="conflict_use_server_version">sunucu sürümü</string>
   <string name="preview_image_description">Resim önizleme</string>
   <string name="preview_image_error_unknown_format">Bu resim gösterilemiyor</string>
   <string name="error__upload__local_file_not_copied">%1$s, %2$s yerel klasörüne kopyalanamadı</string>
@@ -309,6 +314,7 @@
   <string name="shared_subject_header">sizinle</string>
   <string name="with_you_subject_header">paylaştı</string>
   <string name="subject_token">%1$s, sizinle \"%2$s\" paylaşımını yaptı</string>
+  <string name="saml_subject_token">\"%1$s\" sizinle paylaşıldı</string>
   <string name="auth_refresh_button">Bağlantıyı yenile</string>
   <string name="auth_host_address">Sunucu adresi</string>
   <string name="common_error_out_memory">Yeterli hafıza yok</string>

+ 1 - 0
res/values-ug/strings.xml

@@ -11,6 +11,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">ئاچ</string>
   <string name="prefs_category_general">ئادەتتىكى</string>
   <string name="prefs_category_more">تېخىمۇ كۆپ</string>
   <string name="prefs_accounts">ھېساباتلار</string>

+ 2 - 3
res/values-uk/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">Налаштування</string>
   <string name="drawer_item_logs">Журнали</string>
   <string name="drawer_close">Закрити</string>
+  <string name="drawer_open">Відкрити</string>
   <string name="prefs_category_general">Основне</string>
   <string name="prefs_category_more">Більше</string>
   <string name="prefs_accounts">Облікові записи</string>
@@ -188,9 +189,7 @@
   <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="confirmation_remove_folder_local">Лише локально</string>
   <string name="remove_success_msg">Успішно видалено</string>
   <string name="remove_fail_msg">Видалення не вдалось</string>
   <string name="rename_dialog_title">Введіть нове ім\'я</string>

+ 1 - 0
res/values-ur-rPK/strings.xml

@@ -8,6 +8,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">کھولیں</string>
   <string name="prefs_category_more">مزید</string>
   <string name="prefs_help">مدد</string>
   <string name="auth_username">یوزر نیم</string>

+ 2 - 3
res/values-vi/strings.xml

@@ -17,6 +17,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">Mở</string>
   <string name="prefs_category_general">Tổng hợp</string>
   <string name="prefs_category_more">hơn</string>
   <string name="prefs_accounts">Tài khoản</string>
@@ -154,9 +155,7 @@
   <string name="common_rename">Sửa tên</string>
   <string name="common_remove">Xóa</string>
   <string name="confirmation_remove_local">Chỉ cục bộ</string>
-  <string name="confirmation_remove_folder_local">Chỉ nội dung trên máy</string>
-  <string name="confirmation_remove_remote">Xóa từ máy chủ</string>
-  <string name="confirmation_remove_remote_and_local">Remote và local</string>
+  <string name="confirmation_remove_folder_local">Chỉ cục bộ</string>
   <string name="remove_success_msg">Xóa thành công</string>
   <string name="remove_fail_msg">Xóa không thành công</string>
   <string name="rename_dialog_title">Nhập tên mới</string>

+ 6 - 5
res/values-zh-rCN/strings.xml

@@ -27,6 +27,7 @@
   <string name="drawer_item_settings">设置</string>
   <string name="drawer_item_logs">日志</string>
   <string name="drawer_close">关闭</string>
+  <string name="drawer_open">打开</string>
   <string name="prefs_category_general">常规</string>
   <string name="prefs_category_more">更多</string>
   <string name="prefs_accounts">账号</string>
@@ -200,9 +201,9 @@
   <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="confirmation_remove_folder_local">仅本地</string>
+  <string name="confirmation_remove_remote">来自服务器</string>
+  <string name="confirmation_remove_remote_and_local">远程 &amp; 本地</string>
   <string name="remove_success_msg">成功删除</string>
   <string name="remove_fail_msg">无法完成删除</string>
   <string name="rename_dialog_title">请输出新的名字</string>
@@ -257,8 +258,8 @@
   <string name="conflict_title">文件冲突</string>
   <string name="conflict_message">您想要保留哪个文件?如果您同时选中了两个版本,本地的文件的文件名将被加上一个数字</string>
   <string name="conflict_keep_both">保留两者</string>
-  <string name="conflict_use_local_version">使用本地版本</string>
-  <string name="conflict_use_server_version">使用服务器版本</string>
+  <string name="conflict_use_local_version">本地版本</string>
+  <string name="conflict_use_server_version">服务器版本</string>
   <string name="preview_image_description">图片预览</string>
   <string name="preview_image_error_unknown_format">无法显示图片</string>
   <string name="error__upload__local_file_not_copied">无法复制 %1$s 到本地目录 %2$s</string>

+ 1 - 0
res/values-zh-rHK/strings.xml

@@ -13,6 +13,7 @@
   <!--<string name="drawer_item_accounts">Accounts</string>-->
   <!--TODO re-enable when "On Device" is available
     <string name="drawer_item_on_device">On device</string>-->
+  <string name="drawer_open">開啟</string>
   <string name="prefs_category_general">一般</string>
   <string name="prefs_category_more">更多</string>
   <string name="prefs_accounts">帳號</string>

+ 32 - 2
res/values-zh-rTW/strings.xml

@@ -27,10 +27,12 @@
   <string name="drawer_item_settings">設定</string>
   <string name="drawer_item_logs">紀錄</string>
   <string name="drawer_close"> 關閉</string>
+  <string name="drawer_open">開啟</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_passcode">密碼鎖</string>
   <string name="prefs_instant_upload">即時圖片上傳</string>
   <string name="prefs_instant_upload_summary">即時上傳相機照片</string>
   <string name="prefs_instant_video_upload">即時影像上傳</string>
@@ -68,6 +70,7 @@
   <string name="uploader_info_uploading">上傳中</string>
   <string name="file_list_seconds_ago">幾秒前</string>
   <string name="file_list_empty">這裡還沒有東西,上傳一些吧!</string>
+  <string name="file_list_loading">載入中…</string>
   <string name="local_file_list_empty">這個目錄中沒有任何檔案.</string>
   <string name="filedetails_select_file">在檔案上輕觸來顯示更多資訊。</string>
   <string name="filedetails_size">容量:</string>
@@ -77,6 +80,7 @@
   <string name="filedetails_download">下載</string>
   <string name="filedetails_sync_file">更新檔案列表</string>
   <string name="filedetails_renamed_in_upload_msg">檔案名稱在上傳時已被更改為 %1$s</string>
+  <string name="list_layout">列表版型</string>
   <string name="action_share_file">分享連結</string>
   <string name="action_unshare_file">取消共享連結</string>
   <string name="common_yes">是</string>
@@ -129,6 +133,15 @@
   <string name="foreign_files_local_text">本地: %1$s</string>
   <string name="foreign_files_remote_text">遠端: %1$s</string>
   <string name="upload_query_move_foreign_files">無足夠的空間可以複製檔案到 %1$s 目錄. 是否使用移動的方式來處理? </string>
+  <string name="pass_code_enter_pass_code">請輸入您的密碼鎖密碼</string>
+  <string name="pass_code_configure_your_pass_code">輸入您的密碼鎖密碼</string>
+  <string name="pass_code_configure_your_pass_code_explanation">這個密碼在你每次啟動這程式時都會被要求輸入</string>
+  <string name="pass_code_reenter_your_pass_code">請重新輸入您的密碼鎖密碼</string>
+  <string name="pass_code_remove_your_pass_code">移除您的密碼鎖密碼</string>
+  <string name="pass_code_mismatch">密碼不相符</string>
+  <string name="pass_code_wrong">不正確的密碼</string>
+  <string name="pass_code_removed">密碼鎖已被移除</string>
+  <string name="pass_code_stored">密碼鎖已設定</string>
   <string name="media_notif_ticker">%1$s 音樂播放器</string>
   <string name="media_state_playing">%1$s (播放中)</string>
   <string name="media_state_loading">%1$s (載入中)</string>
@@ -182,14 +195,15 @@
   <string name="auth_can_not_auth_against_server">無法在這個伺服器上取得認證</string>
   <string name="auth_account_does_not_exist">帳號目前不存在於本裝置</string>
   <string name="favorite">我的最愛</string>
+  <string name="unfavorite">不喜愛的</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="confirmation_remove_remote">來自伺服器</string>
+  <string name="confirmation_remove_remote_and_local">遠端 &amp; 本地</string>
   <string name="remove_success_msg">成功地移除</string>
   <string name="remove_fail_msg">刪除失敗</string>
   <string name="rename_dialog_title">輸入新名稱</string>
@@ -199,11 +213,13 @@
   <string name="sync_file_nothing_to_do_msg">檔案與同步</string>
   <string name="create_dir_fail_msg">資料夾無法建立</string>
   <string name="filename_forbidden_characters">禁止使用字符: / \\ &lt; &gt; : \" | ? *</string>
+  <string name="filename_forbidden_charaters_from_server">檔案名稱含有不合法的字元</string>
   <string name="filename_empty">檔名不能為空的</string>
   <string name="wait_a_moment">請稍後</string>
   <string name="filedisplay_unexpected_bad_get_content">未知的問題; 請選擇其他程式開啟檔案</string>
   <string name="filedisplay_no_file_selected">沒有挑選檔案</string>
   <string name="activity_chooser_title">傳送連結至 ...</string>
+  <string name="wait_for_tmp_copy_from_private_storage">由私有的儲存空間複製檔案中</string>
   <string name="oauth_check_onoff">以 oAuth2 方式登入</string>
   <string name="oauth_login_connection">連線到 oAuth2 伺服器…</string>
   <string name="ssl_validator_header">這個網站的憑證無法被驗證</string>
@@ -239,7 +255,11 @@
   <string name="instant_upload_on_wifi">只使用 WiFi 來執行即時圖片上傳的功能</string>
   <string name="instant_video_upload_on_wifi">只使用 WiFi 來執行即時影像上傳的功能</string>
   <string name="instant_upload_path">/InstantUpload</string>
+  <string name="conflict_title">檔案衝突</string>
+  <string name="conflict_message">您要保留那個檔案? 如果您同時選擇兩個版本, 本地的檔案將在檔案名稱後面會加上編號</string>
   <string name="conflict_keep_both">都保留</string>
+  <string name="conflict_use_local_version">本地版本</string>
+  <string name="conflict_use_server_version">伺服器版本</string>
   <string name="preview_image_description">圖片預覽</string>
   <string name="preview_image_error_unknown_format">無法顯示圖片</string>
   <string name="error__upload__local_file_not_copied">%1$s 無法被複製到本地目錄 %2$s</string>
@@ -294,7 +314,17 @@
   <string name="shared_subject_header">以分享的</string>
   <string name="with_you_subject_header">與你</string>
   <string name="subject_token">%1$s 分享了 \"%2$s\" 給您</string>
+  <string name="saml_subject_token">\"%1$s\" 已經與您分享</string>
   <string name="auth_refresh_button">重新連線</string>
   <string name="auth_host_address">伺服器位址</string>
+  <string name="common_error_out_memory">記憶體不足</string>
   <string name="username">使用者名稱</string>
+  <string name="file_list__footer__folder">1 個資料夾</string>
+  <string name="file_list__footer__folders">%1$d 個資料夾</string>
+  <string name="file_list__footer__file">1 個檔案</string>
+  <string name="file_list__footer__file_and_folder">1 個檔案, 1 個資料夾</string>
+  <string name="file_list__footer__file_and_folders">1 個檔案, %1$d 個資料夾</string>
+  <string name="file_list__footer__files">%1$d 個檔案</string>
+  <string name="file_list__footer__files_and_folder">%1$d 個檔案, 1 個資料夾</string>
+  <string name="file_list__footer__files_and_folders">%1$d 個檔案, %2$d 個資料夾</string>
 </resources>

+ 54 - 55
res/values/strings.xml

@@ -122,14 +122,14 @@
     <string name="sync_fail_ticker_unauthorized">Synchronization failed, you need to relogin</string>
     <string name="sync_fail_content">Synchronization of %1$s could not be completed</string>
     <string name="sync_fail_content_unauthorized">Invalid password for %1$s</string>
-	<string name="sync_conflicts_in_favourites_ticker">Conflicts found</string>
-	<string name="sync_conflicts_in_favourites_content">%1$d kept-in-sync files could not be sync\'ed</string>
+    <string name="sync_conflicts_in_favourites_ticker">Conflicts found</string>
+    <string name="sync_conflicts_in_favourites_content">%1$d kept-in-sync files could not be sync\'ed</string>
     <string name="sync_fail_in_favourites_ticker">Kept-in-sync files failed</string>
     <string name="sync_fail_in_favourites_content">Contents of %1$d files could not be sync\'ed (%2$d conflicts)</string>
     <string name="sync_foreign_files_forgotten_ticker">Some local files were forgotten</string>
     <string name="sync_foreign_files_forgotten_content">%1$d files out of the %2$s folder could not be copied into</string>
     <string name="sync_foreign_files_forgotten_explanation">As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded in previous versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronization. You may either leave the file(s) as is and remove the link to %3$s, or move the file(s) into the %1$s folder and retain the link to %4$s.\n\nListed below are the local file(s), and the remote file(s) in %5$s they were linked to.</string>
-	<string name="sync_current_folder_was_removed">Folder %1$s does not exist anymore</string>    
+    <string name="sync_current_folder_was_removed">Folder %1$s does not exist anymore</string>
     <string name="foreign_files_move">"Move all"</string>
     <string name="foreign_files_success">"All files were moved"</string>
     <string name="foreign_files_fail">"Some files could not be moved"</string>
@@ -152,20 +152,20 @@
     <string name="media_state_loading">"%1$s (loading)"</string>
     <string name="media_event_done">"%1$s playback finished"</string>
     <string name="media_err_nothing_to_play">No media file found</string>
-	<string name="media_err_no_account">No account provided</string>
-	<string name="media_err_not_in_owncloud">File not in a valid account</string>
-	<string name="media_err_unsupported">Unsupported media codec</string>
-	<string name="media_err_io">Media file could not be read</string>
-	<string name="media_err_malformed">Media file not correctly encoded</string>
-	<string name="media_err_timeout">Timed out while trying to play</string>
-	<string name="media_err_invalid_progressive_playback">Media file cannot be streamed</string>
-	<string name="media_err_unknown">Media file cannot be played with the stock media player</string>
-	<string name="media_err_security_ex">Security error trying to play %1$s</string>
-	<string name="media_err_io_ex">Input error trying to play %1$s</string>
-	<string name="media_err_unexpected">Unexpected error trying to play %1$s</string>
-	<string name="media_rewind_description">Rewind button</string>
-	<string name="media_play_pause_description">Play or pause button</string>
-	<string name="media_forward_description">Fast forward button</string>
+    <string name="media_err_no_account">No account provided</string>
+    <string name="media_err_not_in_owncloud">File not in a valid account</string>
+    <string name="media_err_unsupported">Unsupported media codec</string>
+    <string name="media_err_io">Media file could not be read</string>
+    <string name="media_err_malformed">Media file not correctly encoded</string>
+    <string name="media_err_timeout">Timed out while trying to play</string>
+    <string name="media_err_invalid_progressive_playback">Media file cannot be streamed</string>
+    <string name="media_err_unknown">Media file cannot be played with the stock media player</string>
+    <string name="media_err_security_ex">Security error trying to play %1$s</string>
+    <string name="media_err_io_ex">Input error trying to play %1$s</string>
+    <string name="media_err_unexpected">Unexpected error trying to play %1$s</string>
+    <string name="media_rewind_description">Rewind button</string>
+    <string name="media_play_pause_description">Play or pause button</string>
+    <string name="media_forward_description">Fast forward button</string>
 
 	<string name="auth_getting_authorization">Getting authorization&#8230;</string>
 	<string name="auth_trying_to_login">Trying to login&#8230;</string>
@@ -250,19 +250,19 @@
     <string name="ssl_validator_label_L">Location:</string>
     <string name="ssl_validator_label_validity">Validity:</string>
     <string name="ssl_validator_label_validity_from">From:</string>
-	<string name="ssl_validator_label_validity_to">To:</string>
-	<string name="ssl_validator_label_signature">Signature:</string>
-	<string name="ssl_validator_label_signature_algorithm">Algorithm:</string>
-	<string name="ssl_validator_null_cert">The certificate could not be shown.</string>
-	<string name="ssl_validator_no_info_about_error">- No information about the error</string>
-			
+    <string name="ssl_validator_label_validity_to">To:</string>
+    <string name="ssl_validator_label_signature">Signature:</string>
+    <string name="ssl_validator_label_signature_algorithm">Algorithm:</string>
+    <string name="ssl_validator_null_cert">The certificate could not be shown.</string>
+    <string name="ssl_validator_no_info_about_error">- No information about the error</string>
+
     <string name="placeholder_sentence">This is a placeholder</string>
     <string name="placeholder_filename">placeholder.txt</string>
     <string name="placeholder_filetype">PNG Image</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_on_wifi">Upload pictures via WiFi only</string>
     <string name="instant_video_upload_on_wifi">Upload videos via WiFi only</string>
     <string name="instant_upload_path">/InstantUpload</string>
@@ -274,7 +274,7 @@
     
     <string name="preview_image_description">Image preview</string>
     <string name="preview_image_error_unknown_format">This image cannot be shown</string>
-    
+
     <string name="error__upload__local_file_not_copied">%1$s could not be copied to %2$s local folder</string>
     <string name="prefs_instant_upload_path_title">Upload Path</string>
 
@@ -287,32 +287,24 @@
     <string name="share_link_password_title">Enter a password</string>
     <string name="share_link_empty_password">You must enter a password</string>
 
-	<string name="activity_chooser_send_file_title">Send</string>
+    <string name="network_error_socket_exception">An error occurred while connecting with the server.</string>
+    <string name="network_error_socket_timeout_exception">An error occurred while waiting for the server, the operation couldn\'t have been done</string>
+    <string name="network_error_connect_timeout_exception">An error occurred while waiting for the server, the operation couldn\'t have been done</string>
+    <string name="network_host_not_available">The operation couldn\'t be completed, server is unavailable</string>
+    <string name="empty" />
 
-	<string name="copy_link">Copy link</string>
-	<string name="clipboard_text_copied">Copied to clipboard</string>
+    <string name="forbidden_permissions">You do not have permission %s</string>
+    <string name="forbidden_permissions_rename">to rename this file</string>
+    <string name="forbidden_permissions_delete">to delete this file</string>
+    <string name="share_link_forbidden_permissions">to share this file</string>
+    <string name="unshare_link_forbidden_permissions">to unshare this file</string>
+    <string name="forbidden_permissions_create">to create the file</string>
+    <string name="uploader_upload_forbidden_permissions">to upload in this folder</string>
+    <string name="downloader_download_file_not_found">The file is no longer available on the server</string>
 
-	<string name="error_cant_bind_to_operations_service">Critical error: cannot perform operations</string>
-	
-	<string name="network_error_socket_exception">An error occurred while connecting with the server.</string>
-	<string name="network_error_socket_timeout_exception">An error occurred while waiting for the server, the operation couldn\'t have been done</string>
-	<string name="network_error_connect_timeout_exception">An error occurred while waiting for the server, the operation couldn\'t have been done</string>
-	<string name="network_host_not_available">The operation couldn\'t be completed, server is unavailable</string>
-
-	<string name="empty" />
-	
-	<string name="forbidden_permissions">You do not have permission %s</string>
-	<string name="forbidden_permissions_rename">to rename this file</string>
-	<string name="forbidden_permissions_delete">to delete this file</string>
-	<string name="share_link_forbidden_permissions">to share this file</string>
-	<string name="unshare_link_forbidden_permissions">to unshare this file</string>
-	<string name="forbidden_permissions_create">to create the file</string>
-	<string name="uploader_upload_forbidden_permissions">to upload in this folder</string>
-	<string name="downloader_download_file_not_found">The file is no longer available on the server</string>
-
-	<string name="prefs_category_accounts">Accounts</string>
-	<string name="prefs_add_account">Add account</string>
-	<string name="auth_redirect_non_secure_connection_title">Secure connection is redirected to an unsecured route.</string>
+    <string name="prefs_category_accounts">Accounts</string>
+    <string name="prefs_add_account">Add account</string>
+    <string name="auth_redirect_non_secure_connection_title">Secure connection is redirected through an unsecured route.</string>
 
 	<string name="actionbar_logger">Logs</string>
 	<string name="log_send_history_button">Send History</string>
@@ -326,13 +318,20 @@
 	<string name="file_list_empty_moving">Nothing in here. You can add a folder!</string>
 	<string name="folder_picker_choose_button_text">Choose</string>
 
-	<string name="move_file_not_found">Unable to move. Please check whether the file exists</string>
-	<string name="move_file_invalid_into_descendent">It is not possible to move a folder into a descendant</string>
-	<string name="move_file_invalid_overwrite">The file exists already in the destination folder</string>
-	<string name="move_file_error">An error occurred while trying to move this file or folder</string>
-	<string name="forbidden_permissions_move">to move this file</string>
+    <string name="move_file_not_found">Unable to move. Please check whether the file exists</string>
+    <string name="move_file_invalid_into_descendent">It is not possible to move a folder into a descendant</string>
+    <string name="move_file_invalid_overwrite">The file exists already in the destination folder</string>
+    <string name="move_file_error">An error occurred while trying to move this file or folder</string>
+    <string name="forbidden_permissions_move">to move this file</string>
+
+
+    <string name="copy_file_not_found">Unable to copy. Please check whether the file exists</string>
+    <string name="copy_file_invalid_into_descendent">It is not possible to copy a folder into a descendant</string>
+    <string name="copy_file_invalid_overwrite">The file exists already in the destination folder</string>
+    <string name="copy_file_error">An error occurred while trying to copy this file or folder</string>
+    <string name="forbidden_permissions_copy">to copy this file</string>
 
-	<string name="prefs_category_instant_uploading">Instant Uploads</string>
+    <string name="prefs_category_instant_uploading">Instant Uploads</string>
 	<string name="prefs_category_security">Security</string>
 
 	<string name="prefs_instant_video_upload_path_title">Upload Video Path</string>

+ 207 - 177
src/com/owncloud/android/datamodel/FileDataStorageManager.java

@@ -50,6 +50,12 @@ import com.owncloud.android.lib.resources.shares.OCShare;
 import com.owncloud.android.lib.resources.shares.ShareType;
 import com.owncloud.android.utils.FileStorageUtils;
 
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
 public class FileDataStorageManager {
 
     public static final int ROOT_PARENT_ID = 0;
@@ -60,7 +66,7 @@ public class FileDataStorageManager {
 
     private static String TAG = FileDataStorageManager.class.getSimpleName();
 
-    
+
     public FileDataStorageManager(Account account, ContentResolver cr) {
         mContentProviderClient = null;
         mContentResolver = cr;
@@ -73,7 +79,7 @@ public class FileDataStorageManager {
         mAccount = account;
     }
 
-    
+
     public void setAccount(Account account) {
         mAccount = account;
     }
@@ -97,7 +103,7 @@ public class FileDataStorageManager {
     public ContentProviderClient getContentProviderClient() {
         return mContentProviderClient;
     }
-    
+
 
     public OCFile getFileByPath(String path) {
         Cursor c = getCursorForValue(ProviderTableMeta.FILE_PATH, path);
@@ -141,7 +147,7 @@ public class FileDataStorageManager {
         return fileExists(ProviderTableMeta.FILE_PATH, path);
     }
 
-    
+
     public Vector<OCFile> getFolderContent(OCFile f/*, boolean onlyOnDevice*/) {
         if (f != null && f.isFolder() && f.getFileId() != -1) {
             // TODO Enable when "On Device" is recovered ?
@@ -151,8 +157,8 @@ public class FileDataStorageManager {
             return new Vector<OCFile>();
         }
     }
-    
-    
+
+
     public Vector<OCFile> getFolderImages(OCFile folder/*, boolean onlyOnDevice*/) {
         Vector<OCFile> ret = new Vector<OCFile>(); 
         if (folder != null) {
@@ -183,7 +189,7 @@ public class FileDataStorageManager {
         cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, file.getMimetype());
         cv.put(ProviderTableMeta.FILE_NAME, file.getFileName());
         //if (file.getParentId() != DataStorageManager.ROOT_PARENT_ID)
-            cv.put(ProviderTableMeta.FILE_PARENT, file.getParentId());
+        cv.put(ProviderTableMeta.FILE_PARENT, file.getParentId());
         cv.put(ProviderTableMeta.FILE_PATH, file.getRemotePath());
         if (!file.isFolder())
             cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath());
@@ -200,8 +206,7 @@ public class FileDataStorageManager {
         cv.put(ProviderTableMeta.FILE_IS_DOWNLOADING, file.isDownloading());
         
         boolean sameRemotePath = fileExists(file.getRemotePath());
-        if (sameRemotePath ||
-                fileExists(file.getFileId())        ) {  // for renamed files
+        if (sameRemotePath ||                fileExists(file.getFileId())) {           // for renamed files; no more delete and create
 
             OCFile oldFile = null;
             if (sameRemotePath) {
@@ -215,12 +220,12 @@ public class FileDataStorageManager {
             if (getContentResolver() != null) {
                 getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv,
                         ProviderTableMeta._ID + "=?",
-                        new String[] { String.valueOf(file.getFileId()) });
+                        new String[]{String.valueOf(file.getFileId())});
             } else {
                 try {
                     getContentProviderClient().update(ProviderTableMeta.CONTENT_URI,
                             cv, ProviderTableMeta._ID + "=?",
-                            new String[] { String.valueOf(file.getFileId()) });
+                            new String[]{String.valueOf(file.getFileId())});
                 } catch (RemoteException e) {
                     Log_OC.e(TAG,
                             "Fail to insert insert file to database "
@@ -246,7 +251,7 @@ public class FileDataStorageManager {
                 long new_id = Long.parseLong(result_uri.getPathSegments()
                         .get(1));
                 file.setFileId(new_id);
-            }            
+            }
         }
 
 //        if (file.isFolder()) {
@@ -254,17 +259,17 @@ public class FileDataStorageManager {
 //        } else {
 //            updateFolderSize(file.getParentId());
 //        }
-        
+
         return overriden;
     }
 
 
     /**
      * Inserts or updates the list of files contained in a given folder.
-     * 
+     * <p/>
      * CALLER IS THE RESPONSIBLE FOR GRANTING RIGHT UPDATE OF INFORMATION, NOT THIS METHOD.
      * HERE ONLY DATA CONSISTENCY SHOULD BE GRANTED
-     *  
+     *
      * @param folder
      * @param updatedFiles
      * @param filesToRemove
@@ -314,9 +319,9 @@ public class FileDataStorageManager {
                 // updating an existing file
                 operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
                         withValues(cv).
-                        withSelection(  ProviderTableMeta._ID + "=?", 
-                                new String[] { String.valueOf(file.getFileId()) })
-                                .build());
+                        withSelection(ProviderTableMeta._ID + "=?",
+                                new String[]{String.valueOf(file.getFileId())})
+                        .build());
 
             } else {
                 // adding a new file
@@ -324,9 +329,9 @@ public class FileDataStorageManager {
                         withValues(cv).build());
             }
         }
-        
+
         // prepare operations to remove files in the given folder
-        String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + 
+        String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " +
                 ProviderTableMeta.FILE_PATH + "=?";
         String [] whereArgs = null;
         for (OCFile file : filesToRemove) {
@@ -351,7 +356,7 @@ public class FileDataStorageManager {
                                     ProviderTableMeta.CONTENT_URI_FILE, file.getFileId()
                             )
                     ).withSelection(where, whereArgs).build());
-                    
+
                     if (file.isDown()) {
                         String path = file.getStoragePath();
                         new File(path).delete();
@@ -360,7 +365,7 @@ public class FileDataStorageManager {
                 }
             }
         }
-        
+
         // update metadata of folder
         ContentValues cv = new ContentValues();
         cv.put(ProviderTableMeta.FILE_MODIFIED, folder.getModificationTimestamp());
@@ -383,12 +388,12 @@ public class FileDataStorageManager {
         cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, folder.getPublicLink());
         cv.put(ProviderTableMeta.FILE_PERMISSIONS, folder.getPermissions());
         cv.put(ProviderTableMeta.FILE_REMOTE_ID, folder.getRemoteId());
-        
+
         operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
                 withValues(cv).
-                withSelection(  ProviderTableMeta._ID + "=?", 
-                        new String[] { String.valueOf(folder.getFileId()) })
-                        .build());
+                withSelection(ProviderTableMeta._ID + "=?",
+                        new String[]{String.valueOf(folder.getFileId())})
+                .build());
 
         // apply operations in batch
         ContentProviderResult[] results = null;
@@ -413,7 +418,7 @@ public class FileDataStorageManager {
             long newId;
             Iterator<OCFile> filesIt = updatedFiles.iterator();
             OCFile file = null;
-            for (int i=0; i<results.length; i++) {
+            for (int i = 0; i < results.length; i++) {
                 if (filesIt.hasNext()) {
                     file = filesIt.next();
                 } else {
@@ -428,9 +433,9 @@ public class FileDataStorageManager {
                 }
             }
         }
-        
+
         //updateFolderSize(folder.getFileId());
-        
+
     }
 
 
@@ -464,23 +469,20 @@ public class FileDataStorageManager {
 //            Log_OC.e(TAG,  "not updating size for folder " + id);
 //        }
 //    }
-    
+
 
     public boolean removeFile(OCFile file, boolean removeDBData, boolean removeLocalCopy) {
         boolean success = true;
         if (file != null) {
             if (file.isFolder()) {
                 success = removeFolder(file, removeDBData, removeLocalCopy);
-                
+
             } else {
                 if (removeDBData) {
-                    Uri file_uri = ContentUris.withAppendedId(
-                        ProviderTableMeta.CONTENT_URI_FILE, 
-                        file.getFileId()
-                    );
-                    String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + 
-                            ProviderTableMeta.FILE_PATH + "=?";
-                    String [] whereArgs = new String[]{mAccount.name, file.getRemotePath()};
+                    //Uri file_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, ""+file.getFileId());
+                    Uri file_uri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, file.getFileId());
+                    String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + ProviderTableMeta.FILE_PATH + "=?";
+                    String[] whereArgs = new String[]{mAccount.name, file.getRemotePath()};
                     int deleted = 0;
                     if (getContentProviderClient() != null) {
                         try {
@@ -491,7 +493,7 @@ public class FileDataStorageManager {
                     } else {
                         deleted = getContentResolver().delete(file_uri, where, whereArgs);
                     }
-                    success &= (deleted > 0); 
+                    success &= (deleted > 0);
                 }
                 String localPath = file.getStoragePath();
                 if (removeLocalCopy && file.isDown() && localPath != null && success) {
@@ -509,12 +511,12 @@ public class FileDataStorageManager {
         }
         return success;
     }
-    
+
 
     public boolean removeFolder(OCFile folder, boolean removeDBData, boolean removeLocalContent) {
         boolean success = true;
         if (folder != null && folder.isFolder()) {
-            if (removeDBData &&  folder.getFileId() != -1) {
+            if (removeDBData && folder.getFileId() != -1) {
                 success = removeFolderInDb(folder);
             }
             if (removeLocalContent && success) {
@@ -525,7 +527,7 @@ public class FileDataStorageManager {
     }
 
     private boolean removeFolderInDb(OCFile folder) {
-        Uri folder_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, "" + 
+        Uri folder_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, "" +
                 folder.getFileId());   // URI for recursive deletion
         String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + 
                 ProviderTableMeta.FILE_PATH + "=?";
@@ -538,7 +540,7 @@ public class FileDataStorageManager {
                 e.printStackTrace();
             }
         } else {
-            deleted = getContentResolver().delete(folder_uri, where, whereArgs); 
+            deleted = getContentResolver().delete(folder_uri, where, whereArgs);
         }
         return deleted > 0;
     }
@@ -597,54 +599,54 @@ public class FileDataStorageManager {
     
     /**
      * Updates database and file system for a file or folder that was moved to a different location.
-     * 
+     *
      * TODO explore better (faster) implementations
      * TODO throw exceptions up !
      */
     public void moveLocalFile(OCFile file, String targetPath, String targetParentPath) {
 
         if (file != null && file.fileExists() && !OCFile.ROOT_PATH.equals(file.getFileName())) {
-            
+
             OCFile targetParent = getFileByPath(targetParentPath);
             if (targetParent == null) {
                 throw new IllegalStateException("Parent folder of the target path does not exist!!");
             }
-            
+
             /// 1. get all the descendants of the moved element in a single QUERY
             Cursor c = null;
             if (getContentProviderClient() != null) {
                 try {
                     c = getContentProviderClient().query(
-                        ProviderTableMeta.CONTENT_URI, 
-                        null,
-                        ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + 
-                                ProviderTableMeta.FILE_PATH + " LIKE ? ",
-                        new String[] { 
-                                mAccount.name, 
-                                file.getRemotePath() + "%"  
-                        }, 
-                        ProviderTableMeta.FILE_PATH + " ASC "
+                            ProviderTableMeta.CONTENT_URI,
+                            null,
+                            ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " +
+                                    ProviderTableMeta.FILE_PATH + " LIKE ? ",
+                            new String[]{
+                                    mAccount.name,
+                                    file.getRemotePath() + "%"
+                            },
+                            ProviderTableMeta.FILE_PATH + " ASC "
                     );
                 } catch (RemoteException e) {
                     Log_OC.e(TAG, e.getMessage());
                 }
-                
+
             } else {
                 c = getContentResolver().query(
-                    ProviderTableMeta.CONTENT_URI, 
-                    null,
-                    ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + 
-                            ProviderTableMeta.FILE_PATH + " LIKE ? ",
-                    new String[] { 
-                            mAccount.name, 
-                            file.getRemotePath() + "%"  
-                    }, 
-                    ProviderTableMeta.FILE_PATH + " ASC "
+                        ProviderTableMeta.CONTENT_URI,
+                        null,
+                        ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " +
+                                ProviderTableMeta.FILE_PATH + " LIKE ? ",
+                        new String[]{
+                                mAccount.name,
+                                file.getRemotePath() + "%"
+                        },
+                        ProviderTableMeta.FILE_PATH + " ASC "
                 );
             }
 
             /// 2. prepare a batch of update operations to change all the descendants
-            ArrayList<ContentProviderOperation> operations = 
+            ArrayList<ContentProviderOperation> operations =
                     new ArrayList<ContentProviderOperation>(c.getCount());
             String defaultSavePath = FileStorageUtils.getSavePath(mAccount.name);
             List<String> originalPathsToTriggerMediaScan = new ArrayList<String>();
@@ -656,13 +658,13 @@ public class FileDataStorageManager {
                     ContentValues cv = new ContentValues(); // keep construction in the loop
                     OCFile child = createFileInstance(c);
                     cv.put(
-                        ProviderTableMeta.FILE_PATH, 
-                        targetPath + child.getRemotePath().substring(lengthOfOldPath)
+                            ProviderTableMeta.FILE_PATH,
+                            targetPath + child.getRemotePath().substring(lengthOfOldPath)
                     );
-                    if (child.getStoragePath() != null && 
+                    if (child.getStoragePath() != null &&
                             child.getStoragePath().startsWith(defaultSavePath)) {
                         // update link to downloaded content - but local move is not done here!
-                        String targetLocalPath = defaultSavePath + targetPath + 
+                        String targetLocalPath = defaultSavePath + targetPath +
                                 child.getStoragePath().substring(lengthOfOldStoragePath);
                         
                         cv.put(ProviderTableMeta.FILE_STORAGE_PATH, targetLocalPath);
@@ -675,17 +677,17 @@ public class FileDataStorageManager {
                         cv.put(
                                 ProviderTableMeta.FILE_PARENT,
                                 targetParent.getFileId()
-                            );
+                        );
                     }
                     operations.add(
-                        ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
-                            withValues(cv).
-                            withSelection(  
-                                    ProviderTableMeta._ID + "=?", 
-                                    new String[] { String.valueOf(child.getFileId()) }
+                            ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
+                                    withValues(cv).
+                                    withSelection(
+                                            ProviderTableMeta._ID + "=?",
+                                            new String[]{String.valueOf(child.getFileId())}
                                     )
-                            .build());
-                    
+                                    .build());
+
                 } while (c.moveToNext());
             }
             c.close();
@@ -730,9 +732,60 @@ public class FileDataStorageManager {
                 }
             }
         }
-        
+
     }
-    
+
+    public void copyLocalFile(OCFile file, String targetPath) {
+
+        if (file != null && file.fileExists() && !OCFile.ROOT_PATH.equals(file.getFileName())) {
+            String localPath = FileStorageUtils.getDefaultSavePathFor(mAccount.name, file);
+            File localFile = new File(localPath);
+            boolean copied = false;
+            String defaultSavePath = FileStorageUtils.getSavePath(mAccount.name);
+            if (localFile.exists()) {
+                File targetFile = new File(defaultSavePath + targetPath);
+                File targetFolder = targetFile.getParentFile();
+                if (!targetFolder.exists()) {
+                    targetFolder.mkdirs();
+                }
+                copied = copyFile(localFile, targetFile);
+            }
+            Log_OC.d(TAG, "Local file COPIED : " + copied);
+        }
+    }
+
+    private boolean copyFile(File src, File target) {
+        boolean ret = true;
+
+        InputStream in = null;
+        OutputStream out = null;
+
+        try {
+            in = new FileInputStream(src);
+            out = new FileOutputStream(target);
+            byte[] buf = new byte[1024];
+            int len;
+            while ((len = in.read(buf)) > 0) {
+                out.write(buf, 0, len);
+            }
+        } catch (IOException ex) {
+            ret = false;
+        } finally {
+            if (in != null) try {
+                in.close();
+            } catch (IOException e) {
+                e.printStackTrace(System.err);
+            }
+            if (out != null) try {
+                out.close();
+            } catch (IOException e) {
+                e.printStackTrace(System.err);
+            }
+        }
+
+        return ret;
+    }
+
     
     private Vector<OCFile> getFolderContent(long parentId/*, boolean onlyOnDevice*/) {
 
@@ -745,17 +798,17 @@ public class FileDataStorageManager {
 
         if (getContentProviderClient() != null) {
             try {
-                c = getContentProviderClient().query(req_uri, null, 
-                        ProviderTableMeta.FILE_PARENT + "=?" ,
-                        new String[] { String.valueOf(parentId)}, null);
+                c = getContentProviderClient().query(req_uri, null,
+                        ProviderTableMeta.FILE_PARENT + "=?",
+                        new String[]{String.valueOf(parentId)}, null);
             } catch (RemoteException e) {
                 Log_OC.e(TAG, e.getMessage());
                 return ret;
             }
         } else {
-            c = getContentResolver().query(req_uri, null, 
-                    ProviderTableMeta.FILE_PARENT + "=?" ,
-                    new String[] { String.valueOf(parentId)}, null);
+            c = getContentResolver().query(req_uri, null,
+                    ProviderTableMeta.FILE_PARENT + "=?",
+                    new String[]{String.valueOf(parentId)}, null);
         }
 
         if (c.moveToFirst()) {
@@ -774,8 +827,8 @@ public class FileDataStorageManager {
 
         return ret;
     }
-    
-    
+
+
     private OCFile createRootDir() {
         OCFile file = new OCFile(OCFile.ROOT_PATH);
         file.setMimetype("DIR");
@@ -793,7 +846,7 @@ public class FileDataStorageManager {
                             cmp_key + "=? AND "
                                     + ProviderTableMeta.FILE_ACCOUNT_OWNER
                                     + "=?",
-                                    new String[] { value, mAccount.name }, null);
+                            new String[]{value, mAccount.name}, null);
         } else {
             try {
                 c = getContentProviderClient().query(
@@ -801,7 +854,7 @@ public class FileDataStorageManager {
                         null,
                         cmp_key + "=? AND "
                                 + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?",
-                                new String[] { value, mAccount.name }, null);
+                        new String[]{value, mAccount.name}, null);
             } catch (RemoteException e) {
                 Log_OC.e(TAG,
                         "Couldn't determine file existance, assuming non existance: "
@@ -823,14 +876,14 @@ public class FileDataStorageManager {
                             key + "=? AND "
                                     + ProviderTableMeta.FILE_ACCOUNT_OWNER
                                     + "=?",
-                                    new String[] { value, mAccount.name }, null);
+                            new String[]{value, mAccount.name}, null);
         } else {
             try {
                 c = getContentProviderClient().query(
                         ProviderTableMeta.CONTENT_URI,
                         null,
                         key + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER
-                        + "=?", new String[] { value, mAccount.name },
+                                + "=?", new String[]{value, mAccount.name},
                         null);
             } catch (RemoteException e) {
                 Log_OC.e(TAG, "Could not get file details: " + e.getMessage());
@@ -839,7 +892,7 @@ public class FileDataStorageManager {
         }
         return c;
     }
-    
+
 
     private OCFile createFileInstance(Cursor c) {
         OCFile file = null;
@@ -893,10 +946,11 @@ public class FileDataStorageManager {
         }
         return file;
     }
-    
+
     /**
      * Returns if the file/folder is shared by link or not
-     * @param path  Path of the file/folder
+     *
+     * @param path Path of the file/folder
      * @return
      */
     public boolean isShareByLink(String path) {
@@ -908,10 +962,11 @@ public class FileDataStorageManager {
         c.close();
         return file.isShareByLink();
     }
-    
+
     /**
      * Returns the public link of the file/folder
-     * @param path  Path of the file/folder
+     *
+     * @param path Path of the file/folder
      * @return
      */
     public String getPublicLink(String path) {
@@ -923,8 +978,8 @@ public class FileDataStorageManager {
         c.close();
         return file.getPublicLink();
     }
-    
-    
+
+
     // Methods for Shares
     public boolean saveShare(OCShare share) {
         boolean overriden = false;
@@ -946,19 +1001,18 @@ public class FileDataStorageManager {
         cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId());
         cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getIdRemoteShared());
         cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name);
-        
-        if (shareExists(share.getIdRemoteShared())) {   // for renamed files
 
+        if (shareExists(share.getIdRemoteShared())) {           // for renamed files; no more delete and create
             overriden = true;
             if (getContentResolver() != null) {
                 getContentResolver().update(ProviderTableMeta.CONTENT_URI_SHARE, cv,
                         ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
-                        new String[] { String.valueOf(share.getIdRemoteShared()) });
+                        new String[]{String.valueOf(share.getIdRemoteShared())});
             } else {
                 try {
                     getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_SHARE,
                             cv, ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
-                            new String[] { String.valueOf(share.getIdRemoteShared()) });
+                            new String[]{String.valueOf(share.getIdRemoteShared())});
                 } catch (RemoteException e) {
                     Log_OC.e(TAG,
                             "Fail to insert insert file to database "
@@ -984,7 +1038,7 @@ public class FileDataStorageManager {
                 long new_id = Long.parseLong(result_uri.getPathSegments()
                         .get(1));
                 share.setId(new_id);
-            }            
+            }
         }
 
         return overriden;
@@ -1000,7 +1054,7 @@ public class FileDataStorageManager {
                     ProviderTableMeta.OCSHARES_PATH + "=? AND "
                             + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND "
                             + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?",
-                    new String[] { path, Integer.toString(type.getValue()), mAccount.name },
+                    new String[]{path, Integer.toString(type.getValue()), mAccount.name},
                     null);
         } else {
             try {
@@ -1010,7 +1064,7 @@ public class FileDataStorageManager {
                         ProviderTableMeta.OCSHARES_PATH + "=? AND "
                                 + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND "
                                 + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?",
-                        new String[] { path, Integer.toString(type.getValue()), mAccount.name }, 
+                        new String[]{path, Integer.toString(type.getValue()), mAccount.name},
                         null);
 
             } catch (RemoteException e) {
@@ -1025,7 +1079,7 @@ public class FileDataStorageManager {
         c.close();
         return share;
     }
-    
+
     private OCShare createShareInstance(Cursor c) {
         OCShare share = null;
         if (c != null) {
@@ -1047,12 +1101,9 @@ public class FileDataStorageManager {
             share.setSharedWithDisplayName(c.getString(c
                     .getColumnIndex(ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME)));
             share.setIsFolder(c.getInt(
-                    c.getColumnIndex(ProviderTableMeta.OCSHARES_IS_DIRECTORY)) == 1 ? true : false);
+                    c.getColumnIndex(ProviderTableMeta.OCSHARES_IS_DIRECTORY)) == 1);
             share.setUserId(c.getLong(c.getColumnIndex(ProviderTableMeta.OCSHARES_USER_ID)));
-            share.setIdRemoteShared(
-                c.getLong(c.getColumnIndex(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED))
-            );
-                    
+            share.setIdRemoteShared(c.getLong(c.getColumnIndex(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED)));
         }
         return share;
     }
@@ -1066,7 +1117,7 @@ public class FileDataStorageManager {
                             cmp_key + "=? AND "
                                     + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER
                                     + "=?",
-                                    new String[] { value, mAccount.name }, null);
+                            new String[]{value, mAccount.name}, null);
         } else {
             try {
                 c = getContentProviderClient().query(
@@ -1074,7 +1125,7 @@ public class FileDataStorageManager {
                         null,
                         cmp_key + "=? AND "
                                 + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?",
-                                new String[] { value, mAccount.name }, null);
+                        new String[]{value, mAccount.name}, null);
             } catch (RemoteException e) {
                 Log_OC.e(TAG,
                         "Couldn't determine file existance, assuming non existance: "
@@ -1086,7 +1137,7 @@ public class FileDataStorageManager {
         c.close();
         return retval;
     }
-    
+
     private boolean shareExists(long remoteId) {
         return shareExists(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, String.valueOf(remoteId));
     }
@@ -1096,17 +1147,14 @@ public class FileDataStorageManager {
         cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, false);
         cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, "");
         String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?";
-        String [] whereArgs = new String[]{mAccount.name};
-        
+        String[] whereArgs = new String[]{mAccount.name};
+
         if (getContentResolver() != null) {
             getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs);
 
         } else {
             try {
-                getContentProviderClient().update(
-                        ProviderTableMeta.CONTENT_URI, cv, where, whereArgs
-                );
-                
+                getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs);
             } catch (RemoteException e) {
                 Log_OC.e(TAG, "Exception in cleanSharedFiles" + e.getMessage());
             }
@@ -1117,7 +1165,7 @@ public class FileDataStorageManager {
         ContentValues cv = new ContentValues();
         cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, false);
         cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, "");
-        String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + 
+        String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " +
                 ProviderTableMeta.FILE_PARENT + "=?";
         String [] whereArgs = new String[] { mAccount.name , String.valueOf(folder.getFileId()) };
         
@@ -1126,10 +1174,7 @@ public class FileDataStorageManager {
 
         } else {
             try {
-                getContentProviderClient().update(
-                        ProviderTableMeta.CONTENT_URI, cv, where, whereArgs
-                );
-                
+                getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs);
             } catch (RemoteException e) {
                 Log_OC.e(TAG, "Exception in cleanSharedFilesInFolder " + e.getMessage());
             }
@@ -1138,23 +1183,20 @@ public class FileDataStorageManager {
 
     private void cleanShares() {
         String where = ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?";
-        String [] whereArgs = new String[]{mAccount.name};
-        
+        String[] whereArgs = new String[]{mAccount.name};
+
         if (getContentResolver() != null) {
             getContentResolver().delete(ProviderTableMeta.CONTENT_URI_SHARE, where, whereArgs);
 
         } else {
             try {
-                getContentProviderClient().delete(
-                        ProviderTableMeta.CONTENT_URI_SHARE, where, whereArgs
-                );
-                
+                getContentProviderClient().delete(ProviderTableMeta.CONTENT_URI_SHARE, where, whereArgs);
             } catch (RemoteException e) {
                 Log_OC.e(TAG, "Exception in cleanShares" + e.getMessage());
             }
         }
     }
-    
+
     public void saveShares(Collection<OCShare> shares) {
         cleanShares();
         if (shares != null) {
@@ -1187,13 +1229,9 @@ public class FileDataStorageManager {
                     operations.add(
                             ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI_SHARE).
                             withValues(cv).
-                            withSelection(
-                                    ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?", 
-                                    new String[] { String.valueOf(share.getIdRemoteShared()) }
-                            ).
-                            build()
-                    );
-
+                            withSelection(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?",
+                                    new String[]{String.valueOf(share.getIdRemoteShared())})
+                            .build());
                 } else {
                     // adding a new file
                     operations.add(
@@ -1203,7 +1241,7 @@ public class FileDataStorageManager {
                     );
                 }
             }
-            
+
             // apply operations in batch
             if (operations.size() > 0) {
                 @SuppressWarnings("unused")
@@ -1212,28 +1250,25 @@ public class FileDataStorageManager {
                         " operations to FileContentProvider");
                 try {
                     if (getContentResolver() != null) {
-                        results = getContentResolver().applyBatch(
-                                MainApp.getAuthority(), operations
-                        );
-    
+                        results = getContentResolver().applyBatch(MainApp.getAuthority(), operations);
                     } else {
                         results = getContentProviderClient().applyBatch(operations);
                     }
-    
+
                 } catch (OperationApplicationException e) {
                     Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
-    
+
                 } catch (RemoteException e) {
                     Log_OC.e(TAG, "Exception in batch of operations  " + e.getMessage());
                 }
             }
         }
-        
+
     }
-    
+
     public void updateSharedFiles(Collection<OCFile> sharedFiles) {
         cleanSharedFiles();
-        
+
         if (sharedFiles != null) {
             ArrayList<ContentProviderOperation> operations = 
                     new ArrayList<ContentProviderOperation>(sharedFiles.size());
@@ -1282,11 +1317,9 @@ public class FileDataStorageManager {
                     operations.add(
                             ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
                             withValues(cv).
-                            withSelection(
-                                    ProviderTableMeta._ID + "=?", 
-                                    new String[] { String.valueOf(file.getFileId()) }
-                            ).build()
-                    );
+                            withSelection(ProviderTableMeta._ID + "=?",
+                                    new String[]{String.valueOf(file.getFileId())})
+                            .build());
 
                 } else {
                     // adding a new file
@@ -1297,7 +1330,7 @@ public class FileDataStorageManager {
                     );
                 }
             }
-            
+
             // apply operations in batch
             if (operations.size() > 0) {
                 @SuppressWarnings("unused")
@@ -1306,28 +1339,25 @@ public class FileDataStorageManager {
                         " operations to FileContentProvider");
                 try {
                     if (getContentResolver() != null) {
-                        results = getContentResolver().applyBatch(
-                                MainApp.getAuthority(), operations
-                        );
-    
+                        results = getContentResolver().applyBatch(MainApp.getAuthority(), operations);
                     } else {
                         results = getContentProviderClient().applyBatch(operations);
                     }
-    
+
                 } catch (OperationApplicationException e) {
                     Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage());
-    
+
                 } catch (RemoteException e) {
                     Log_OC.e(TAG, "Exception in batch of operations  " + e.getMessage());
                 }
             }
         }
-        
-    } 
-    
-    public void removeShare(OCShare share){
+
+    }
+
+    public void removeShare(OCShare share) {
         Uri share_uri = ProviderTableMeta.CONTENT_URI_SHARE;
-        String where = ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?" + " AND " + 
+        String where = ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?" + " AND " +
                 ProviderTableMeta.FILE_PATH + "=?";
         String [] whereArgs = new String[]{mAccount.name, share.getPath()};
         if (getContentProviderClient() != null) {
@@ -1337,10 +1367,10 @@ public class FileDataStorageManager {
                 e.printStackTrace();
             }
         } else {
-            getContentResolver().delete(share_uri, where, whereArgs); 
+            getContentResolver().delete(share_uri, where, whereArgs);
         }
     }
-    
+
     public void saveSharesDB(ArrayList<OCShare> shares) {
         saveShares(shares);
 
@@ -1351,7 +1381,7 @@ public class FileDataStorageManager {
             String path = share.getPath();
             if (share.isFolder()) {
                 path = path + FileUtils.PATH_SEPARATOR;
-            }           
+            }
 
             // Update OCFile with data from share: ShareByLink  and publicLink
             OCFile file = getFileByPath(path);
@@ -1360,18 +1390,18 @@ public class FileDataStorageManager {
                     file.setShareByLink(true);
                     sharedFiles.add(file);
                 }
-            } 
+            }
         }
-        
+
         updateSharedFiles(sharedFiles);
     }
 
-    
+
     public void saveSharesInFolder(ArrayList<OCShare> shares, OCFile folder) {
         cleanSharedFilesInFolder(folder);
         ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
         operations = prepareRemoveSharesInFolder(folder, operations);
-        
+
         if (shares != null) {
             // prepare operations to insert or update files to save in the given folder
             for (OCShare share : shares) {
@@ -1415,7 +1445,7 @@ public class FileDataStorageManager {
                 //}
             }
         }
-            
+
         // apply operations in batch
         if (operations.size() > 0) {
             @SuppressWarnings("unused")
@@ -1437,13 +1467,13 @@ public class FileDataStorageManager {
             }
         }
         //}
-        
+
     }
 
     private ArrayList<ContentProviderOperation> prepareRemoveSharesInFolder(
             OCFile folder, ArrayList<ContentProviderOperation> preparedOperations) {
         if (folder != null) {
-            String where = ProviderTableMeta.OCSHARES_PATH + "=?" + " AND " 
+            String where = ProviderTableMeta.OCSHARES_PATH + "=?" + " AND "
                     + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?";
             String [] whereArgs = new String[]{ "", mAccount.name };
 

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

@@ -543,6 +543,13 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
                 FileStorageUtils.getMimeTypeFromName(mRemotePath).startsWith("image/"));
     }
 
+    /**
+     * @return 'True' if the file is hidden
+     */
+    public boolean isHidden() {
+        return getFileName().startsWith(".");
+    }
+
     public String getPermissions() {
         return mPermissions;
     }

+ 27 - 4
src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java

@@ -33,7 +33,9 @@ import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.CompressFormat;
 import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
 import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.media.ThumbnailUtils;
 import android.net.Uri;
@@ -259,10 +261,16 @@ public class ThumbnailsCacheManager {
                 int px = getThumbnailDimension();
 
                 if (file.isDown()) {
-                    Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(
+                    Bitmap temp = BitmapUtils.decodeSampledBitmapFromFile(
                             file.getStoragePath(), px, px);
+                    Bitmap bitmap = ThumbnailUtils.extractThumbnail(temp, px, px);
 
                     if (bitmap != null) {
+                        // Handle PNG
+                        if (file.getMimetype().equalsIgnoreCase("image/png")) {
+                            bitmap = handlePNG(bitmap, px);
+                        }
+
                         thumbnail = addThumbnailToCache(imageKey, bitmap, file.getStoragePath(), px);
 
                         file.setNeedsUpdateThumbnail(false);
@@ -282,13 +290,15 @@ public class ThumbnailsCacheManager {
                                 GetMethod get = new GetMethod(uri);
                                 int status = mClient.executeMethod(get);
                                 if (status == HttpStatus.SC_OK) {
-//                                    byte[] bytes = get.getResponseBody();
-//                                    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0,
-//                                            bytes.length);
                                     InputStream inputStream = get.getResponseBodyAsStream();
                                     Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                                     thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
 
+                                    // Handle PNG
+                                    if (file.getMimetype().equalsIgnoreCase("image/png")) {
+                                        thumbnail = handlePNG(thumbnail, px);
+                                    }
+
                                     // Add thumbnail to cache
                                     if (thumbnail != null) {
                                         addBitmapToCache(imageKey, thumbnail);
@@ -308,6 +318,19 @@ public class ThumbnailsCacheManager {
 
         }
 
+        private Bitmap handlePNG(Bitmap bitmap, int px){
+            Bitmap resultBitmap = Bitmap.createBitmap(px,
+                    px,
+                    Bitmap.Config.ARGB_8888);
+            Canvas c = new Canvas(resultBitmap);
+
+            c.drawColor(MainApp.getAppContext().getResources().
+                    getColor(R.color.background_color));
+            c.drawBitmap(bitmap, 0, 0, null);
+
+            return resultBitmap;
+        }
+
         private Bitmap doFileInBackground() {
             File file = (File)mFile;
 

+ 33 - 32
src/com/owncloud/android/files/FileMenuFilter.java

@@ -39,7 +39,7 @@ import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
 import com.owncloud.android.ui.activity.ComponentsGetter;
 
 /**
- * Filters out the file actions available in a given {@link Menu} for a given {@link OCFile} 
+ * Filters out the file actions available in a given {@link Menu} for a given {@link OCFile}
  * according to the current state of the latest. 
  */
 public class FileMenuFilter {
@@ -48,10 +48,10 @@ public class FileMenuFilter {
     private ComponentsGetter mComponentsGetter;
     private Account mAccount;
     private Context mContext;
-    
+
     /**
      * Constructor
-     * 
+     *
      * @param targetFile        {@link OCFile} target of the action to filter in the {@link Menu}.
      * @param account           ownCloud {@link Account} holding targetFile.
      * @param cg                Accessor to app components, needed to access the
@@ -64,20 +64,20 @@ public class FileMenuFilter {
         mComponentsGetter = cg;
         mContext = context;
     }
-    
-    
+
+
     /**
      * Filters out the file actions available in the passed {@link Menu} taken into account
      * the state of the {@link OCFile} held by the filter.
-     *  
+     *
      * @param menu              Options or context menu to filter.
      */
     public void filter(Menu menu) {
-        List<Integer> toShow = new ArrayList<Integer>();  
-        List<Integer> toHide = new ArrayList<Integer>();    
-        
+        List<Integer> toShow = new ArrayList<Integer>();
+        List<Integer> toHide = new ArrayList<Integer>();
+
         filter(toShow, toHide);
-        
+
         MenuItem item = null;
         for (int i : toShow) {
             item = menu.findItem(i);
@@ -86,7 +86,7 @@ public class FileMenuFilter {
                 item.setEnabled(true);
             }
         }
-        
+
         for (int i : toHide) {
             item = menu.findItem(i);
             if (item != null) {
@@ -99,10 +99,10 @@ public class FileMenuFilter {
 
     /**
      * Performs the real filtering, to be applied in the {@link Menu} by the caller methods.
-     * 
+     *
      * Decides what actions must be shown and hidden.
-     *  
-     * @param toShow            List to save the options that must be shown in the menu. 
+     *
+     * @param toShow            List to save the options that must be shown in the menu.
      * @param toHide            List to save the options that must be shown in the menu.
      */
     private void filter(List<Integer> toShow, List <Integer> toHide) {
@@ -116,71 +116,72 @@ public class FileMenuFilter {
             FileUploaderBinder uploaderBinder = mComponentsGetter.getFileUploaderBinder();
             uploading = (uploaderBinder != null && uploaderBinder.isUploading(mAccount, mFile));
         }
-        
+
         /// decision is taken for each possible action on a file in the menu
-        
+
         // DOWNLOAD 
         if (mFile == null || mFile.isDown() || downloading || uploading) {
             toHide.add(R.id.action_download_file);
-            
+
         } else {
             toShow.add(R.id.action_download_file);
         }
-        
+
         // RENAME
         if (mFile == null || downloading || uploading) {
             toHide.add(R.id.action_rename_file);
-            
+
         } else {
             toShow.add(R.id.action_rename_file);
         }
 
-        // MOVE
+        // MOVE & COPY
         if (mFile == null || downloading || uploading) {
             toHide.add(R.id.action_move);
-
+            toHide.add(R.id.action_copy);
         } else {
             toShow.add(R.id.action_move);
+            toShow.add(R.id.action_copy);
         }
-        
+
         // REMOVE
         if (mFile == null || downloading || uploading) {
             toHide.add(R.id.action_remove_file);
-            
+
         } else {
             toShow.add(R.id.action_remove_file);
         }
-        
+
         // OPEN WITH (different to preview!)
         if (mFile == null || mFile.isFolder() || !mFile.isDown() || downloading || uploading) {
             toHide.add(R.id.action_open_file_with);
-            
+
         } else {
             toShow.add(R.id.action_open_file_with);
         }
-        
-        
+
+
         // CANCEL DOWNLOAD
         if (mFile == null || !downloading) {
             toHide.add(R.id.action_cancel_download);
         } else {
             toShow.add(R.id.action_cancel_download);
         }
-        
+
         // CANCEL UPLOAD
         if (mFile == null || !uploading || mFile.isFolder()) {
             toHide.add(R.id.action_cancel_upload);
         } else {
             toShow.add(R.id.action_cancel_upload);
         }
-        
+
         // SYNC FILE CONTENTS
         if (mFile == null || mFile.isFolder() || !mFile.isDown() || downloading || uploading) {
             toHide.add(R.id.action_sync_file);
         } else {
             toShow.add(R.id.action_sync_file);
         }
-        
+
         // SHARE FILE 
         // TODO add check on SHARE available on server side?
         boolean shareAllowed = (mContext != null  &&
@@ -190,7 +191,7 @@ public class FileMenuFilter {
         } else {
             toShow.add(R.id.action_share_file);
         }
-        
+
         // UNSHARE FILE  
         // TODO add check on SHARE available on server side?
         if ( !shareAllowed || (mFile == null || !mFile.isShareByLink())) {
@@ -205,7 +206,7 @@ public class FileMenuFilter {
         } else {
             toShow.add(R.id.action_see_details);
         }
-        
+
         // SEND
         boolean sendAllowed = (mContext != null &&
                 mContext.getString(R.string.send_files_to_other_apps).equalsIgnoreCase("on"));

+ 56 - 39
src/com/owncloud/android/files/FileOperationsHelper.java

@@ -21,8 +21,6 @@
 
 package com.owncloud.android.files;
 
-import org.apache.http.protocol.HTTP;
-
 import android.accounts.Account;
 import android.content.Intent;
 import android.net.Uri;
@@ -35,7 +33,6 @@ import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
-
 import com.owncloud.android.lib.common.network.WebdavUtils;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
@@ -44,20 +41,22 @@ import com.owncloud.android.services.observer.FileObserverService;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.dialog.ShareLinkToDialog;
 
+import org.apache.http.protocol.HTTP;
+
 /**
  *
  */
 public class FileOperationsHelper {
 
     private static final String TAG = FileOperationsHelper.class.getName();
-    
-    private static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG"; 
+
+    private static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG";
 
     protected FileActivity mFileActivity = null;
 
     /// Identifier of operation in progress which result shouldn't be lost 
     private long mWaitingForOpId = Long.MAX_VALUE;
-    
+
     public FileOperationsHelper(FileActivity fileActivity) {
         mFileActivity = fileActivity;
     }
@@ -67,7 +66,7 @@ public class FileOperationsHelper {
         if (file != null) {
             String storagePath = file.getStoragePath();
             String encodedStoragePath = WebdavUtils.encodePath(storagePath);
-            
+
             Intent intentForSavedMimeType = new Intent(Intent.ACTION_VIEW);
             intentForSavedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
             intentForSavedMimeType.setFlags(
@@ -94,29 +93,29 @@ public class FileOperationsHelper {
             } else {
                 chooserIntent = Intent.createChooser(intentForSavedMimeType, mFileActivity.getString(R.string.actionbar_open_with));
             }
-            
+
             mFileActivity.startActivity(chooserIntent);
-            
+
         } else {
             Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
         }
     }
-    
-    
+
+
     public void shareFileWithLink(OCFile file) {
-        
+
         if (isSharedSupported()) {
             if (file != null) {
                 String link = "https://fake.url";
                 Intent intent = createShareWithLinkIntent(link);
-                String[] packagesToExclude = new String[] { mFileActivity.getPackageName() };
+                String[] packagesToExclude = new String[]{mFileActivity.getPackageName()};
                 DialogFragment chooserDialog = ShareLinkToDialog.newInstance(intent, packagesToExclude, file);
                 chooserDialog.show(mFileActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
-                
+
             } else {
                 Log_OC.wtf(TAG, "Trying to share a NULL OCFile");
             }
-            
+
         } else {
             // Show a Message
             Toast t = Toast.makeText(
@@ -125,13 +124,13 @@ public class FileOperationsHelper {
             t.show();
         }
     }
-    
-    
+
+
     public void shareFileWithLinkToApp(OCFile file, String password, Intent sendIntent) {
         
         if (file != null) {
             mFileActivity.showLoadingDialog();
-            
+
             Intent service = new Intent(mFileActivity, OperationsService.class);
             service.setAction(OperationsService.ACTION_CREATE_SHARE);
             service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount());
@@ -144,18 +143,18 @@ public class FileOperationsHelper {
             Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
         }
     }
-    
-    
+
+
     private Intent createShareWithLinkIntent(String link) {
         Intent intentToShareLink = new Intent(Intent.ACTION_SEND);
         intentToShareLink.putExtra(Intent.EXTRA_TEXT, link);
         intentToShareLink.setType(HTTP.PLAIN_TEXT_TYPE);
-        return intentToShareLink; 
+        return intentToShareLink;
     }
-    
-    
+
+
     /**
-     *  @return 'True' if the server supports the Share API
+     * @return 'True' if the server supports the Share API
      */
     public boolean isSharedSupported() {
         if (mFileActivity.getAccount() != null) {
@@ -164,10 +163,10 @@ public class FileOperationsHelper {
         }
         return false;
     }
-    
-    
+
+
     public void unshareFileWithLink(OCFile file) {
-        
+
         if (isSharedSupported()) {
             // Unshare the file
             Intent service = new Intent(mFileActivity, OperationsService.class);
@@ -177,15 +176,15 @@ public class FileOperationsHelper {
             mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service);
             
             mFileActivity.showLoadingDialog();
-            
+
         } else {
             // Show a Message
             Toast t = Toast.makeText(mFileActivity, mFileActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG);
             t.show();
-            
+
         }
     }
-    
+
     public void sendDownloadedFile(OCFile file) {
         if (file != null) {
             String storagePath = file.getStoragePath();
@@ -197,7 +196,7 @@ public class FileOperationsHelper {
             sendIntent.putExtra(Intent.ACTION_SEND, true);      // Send Action
 
             // Show dialog, without the own app
-            String[] packagesToExclude = new String[] { mFileActivity.getPackageName() };
+            String[] packagesToExclude = new String[]{mFileActivity.getPackageName()};
             DialogFragment chooserDialog = ShareLinkToDialog.newInstance(sendIntent, packagesToExclude, file);
             chooserDialog.show(mFileActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
 
@@ -205,10 +204,10 @@ public class FileOperationsHelper {
             Log_OC.wtf(TAG, "Trying to send a NULL OCFile");
         }
     }
-    
-    
+
+
     public void syncFile(OCFile file) {
-        
+
         if (!file.isFolder()){
             Intent intent = new Intent(mFileActivity, OperationsService.class);
             intent.setAction(OperationsService.ACTION_SYNC_FILE);
@@ -269,8 +268,8 @@ public class FileOperationsHelper {
         
         mFileActivity.showLoadingDialog();
     }
-    
-    
+
+
     public void createFolder(String remotePath, boolean createFullPath) {
         // Create Folder
         Intent service = new Intent(mFileActivity, OperationsService.class);
@@ -317,8 +316,9 @@ public class FileOperationsHelper {
 
     /**
      * Start move file operation
-     * @param newfile           File where it is going to be moved
-     * @param currentFile       File with the previous info
+     *
+     * @param newfile     File where it is going to be moved
+     * @param currentFile File with the previous info
      */
     public void moveFile(OCFile newfile, OCFile currentFile) {
         // Move files
@@ -332,6 +332,23 @@ public class FileOperationsHelper {
         mFileActivity.showLoadingDialog();
     }
 
+    /**
+     * Start copy file operation
+     *
+     * @param newfile     File where it is going to be moved
+     * @param currentFile File with the previous info
+     */
+    public void copyFile(OCFile newfile, OCFile currentFile) {
+        // Copy files
+        Intent service = new Intent(mFileActivity, OperationsService.class);
+        service.setAction(OperationsService.ACTION_COPY_FILE);
+        service.putExtra(OperationsService.EXTRA_NEW_PARENT_PATH, newfile.getRemotePath());
+        service.putExtra(OperationsService.EXTRA_REMOTE_PATH, currentFile.getRemotePath());
+        service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount());
+        mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service);
+
+        mFileActivity.showLoadingDialog();
+    }
 
     public long getOpIdWaitingFor() {
         return mWaitingForOpId;
@@ -341,7 +358,7 @@ public class FileOperationsHelper {
     public void setOpIdWaitingFor(long waitingForOpId) {
         mWaitingForOpId = waitingForOpId;
     }
-    
+
     /**
      *  @return 'True' if the server doesn't need to check forbidden characters
      */

+ 103 - 0
src/com/owncloud/android/operations/CopyFileOperation.java

@@ -0,0 +1,103 @@
+/* ownCloud Android client application
+ *   Copyright (C) 2012-2014 ownCloud Inc.
+ *
+ *   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.operations;
+
+import android.accounts.Account;
+import android.content.Context;
+
+import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.lib.resources.files.CopyRemoteFileOperation;
+import com.owncloud.android.operations.common.SyncOperation;
+
+
+/**
+ * Operation copying an {@link OCFile} to a different folder.
+ *
+ * @author David A. Velasco
+ */
+public class CopyFileOperation extends SyncOperation {
+
+    //private static final String TAG = MoveFileOperation.class.getSimpleName();
+
+    private String mSrcPath;
+    private String mTargetParentPath;
+
+    private OCFile mFile;
+
+
+    /**
+     * Constructor
+     *
+     * @param srcPath          Remote path of the {@link OCFile} to move.
+     * @param targetParentPath Path to the folder where the file will be copied into.
+     * @param account          OwnCloud account containing both the file and the target folder
+     */
+    public CopyFileOperation(String srcPath, String targetParentPath, Account account) {
+        mSrcPath = srcPath;
+        mTargetParentPath = targetParentPath;
+        if (!mTargetParentPath.endsWith(OCFile.PATH_SEPARATOR)) {
+            mTargetParentPath += OCFile.PATH_SEPARATOR;
+        }
+
+        mFile = null;
+    }
+
+    /**
+     * Performs the operation.
+     *
+     * @param client Client object to communicate with the remote ownCloud server.
+     */
+    @Override
+    protected RemoteOperationResult run(OwnCloudClient client) {
+        RemoteOperationResult result;
+
+        /// 1. check copy validity
+        if (mTargetParentPath.startsWith(mSrcPath)) {
+            return new RemoteOperationResult(ResultCode.INVALID_COPY_INTO_DESCENDANT);
+        }
+        mFile = getStorageManager().getFileByPath(mSrcPath);
+        if (mFile == null) {
+            return new RemoteOperationResult(ResultCode.FILE_NOT_FOUND);
+        }
+
+        /// 2. remote copy
+        String targetPath = mTargetParentPath + mFile.getFileName();
+        if (mFile.isFolder()) {
+            targetPath += OCFile.PATH_SEPARATOR;
+        }
+        CopyRemoteFileOperation operation = new CopyRemoteFileOperation(
+                mSrcPath,
+                targetPath,
+                false
+        );
+        result = operation.execute(client);
+
+        /// 3. local copy
+        if (result.isSuccess()) {
+            getStorageManager().copyLocalFile(mFile, targetPath);
+        }
+        // TODO handle ResultCode.PARTIAL_COPY_DONE in client Activity, for the moment
+
+        return result;
+    }
+
+
+}

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

@@ -252,8 +252,14 @@ public class RefreshFolderOperation extends RemoteOperation {
 
             if (!mIgnoreETag) {
                 // check if remote and local folder are different
-                mRemoteFolderChanged = 
-                        !(remoteFolder.getEtag().equalsIgnoreCase(mLocalFolder.getEtag()));
+                String remoteFolderETag = remoteFolder.getEtag();
+                if (remoteFolderETag != null) {
+                    mRemoteFolderChanged =
+                            !(remoteFolderETag.equalsIgnoreCase(mLocalFolder.getEtag()));
+                } else {
+                    Log_OC.e(TAG, "Checked " + mAccount.name + remotePath + " : " +
+                            "No ETag received from server");
+                }
             }
 
             result = new RemoteOperationResult(ResultCode.OK);

+ 95 - 88
src/com/owncloud/android/services/OperationsService.java

@@ -19,11 +19,21 @@
 
 package com.owncloud.android.services;
 
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.ConcurrentMap;
+import android.accounts.Account;
+import android.accounts.AccountsException;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
+import android.app.Service;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Process;
+import android.util.Pair;
 
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
@@ -42,7 +52,7 @@ import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.shares.ShareType;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 import com.owncloud.android.lib.resources.users.GetRemoteUserNameOperation;
-import com.owncloud.android.operations.common.SyncOperation;
+import com.owncloud.android.operations.CopyFileOperation;
 import com.owncloud.android.operations.CreateFolderOperation;
 import com.owncloud.android.operations.CreateShareOperation;
 import com.owncloud.android.operations.GetServerInfoOperation;
@@ -53,28 +63,18 @@ import com.owncloud.android.operations.RenameFileOperation;
 import com.owncloud.android.operations.SynchronizeFileOperation;
 import com.owncloud.android.operations.SynchronizeFolderOperation;
 import com.owncloud.android.operations.UnshareLinkOperation;
+import com.owncloud.android.operations.common.SyncOperation;
 
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.AccountsException;
-import android.accounts.AuthenticatorException;
-import android.accounts.OperationCanceledException;
-import android.app.Service;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Process;
-import android.util.Pair;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ConcurrentMap;
 
 public class OperationsService extends Service {
-    
+
     private static final String TAG = OperationsService.class.getSimpleName();
-    
+
     public static final String EXTRA_ACCOUNT = "ACCOUNT";
     public static final String EXTRA_SERVER_URL = "SERVER_URL";
     public static final String EXTRA_OAUTH2_QUERY_PARAMETERS = "OAUTH2_QUERY_PARAMETERS";
@@ -90,7 +90,7 @@ public class OperationsService extends Service {
     public static final String EXTRA_PASSWORD_SHARE = "PASSWORD_SHARE";
 
     public static final String EXTRA_COOKIE = "COOKIE";
-    
+
     public static final String ACTION_CREATE_SHARE = "CREATE_SHARE";
     public static final String ACTION_UNSHARE = "UNSHARE";
     public static final String ACTION_GET_SERVER_INFO = "GET_SERVER_INFO";
@@ -102,22 +102,24 @@ public class OperationsService extends Service {
     public static final String ACTION_SYNC_FILE = "SYNC_FILE";
     public static final String ACTION_SYNC_FOLDER = "SYNC_FOLDER";//for the moment, just to download
     public static final String ACTION_MOVE_FILE = "MOVE_FILE";
-    
+    public static final String ACTION_COPY_FILE = "COPY_FILE";
+
     public static final String ACTION_OPERATION_ADDED = OperationsService.class.getName() +
             ".OPERATION_ADDED";
     public static final String ACTION_OPERATION_FINISHED = OperationsService.class.getName() +
             ".OPERATION_FINISHED";
 
 
-    private ConcurrentMap<Integer, Pair<RemoteOperation, RemoteOperationResult>> 
-        mUndispatchedFinishedOperations =
+
+    private ConcurrentMap<Integer, Pair<RemoteOperation, RemoteOperationResult>>
+            mUndispatchedFinishedOperations =
             new ConcurrentHashMap<Integer, Pair<RemoteOperation, RemoteOperationResult>>();
-    
+
     private static class Target {
         public Uri mServerUrl = null;
         public Account mAccount = null;
         public String mCookie = null;
-        
+
         public Target(Account account, Uri serverUrl, String cookie) {
             mAccount = account;
             mServerUrl = serverUrl;
@@ -151,11 +153,11 @@ public class OperationsService extends Service {
         mSyncFolderHandler = new SyncFolderHandler(thread.getLooper(), this);
     }
 
-    
+
     /**
      * Entry point to add a new operation to the queue of operations.
-     * 
-     * New operations are added calling to startService(), resulting in a call to this method. 
+     * <p/>
+     * New operations are added calling to startService(), resulting in a call to this method.
      * This ensures the service will keep on working although the caller activity goes away.
      */
     @Override
@@ -200,8 +202,8 @@ public class OperationsService extends Service {
         // Saving cookies
         try {
             OwnCloudClientManagerFactory.getDefaultSingleton().
-                saveAllClients(this, MainApp.getAccountType());
-            
+                    saveAllClients(this, MainApp.getAccountType());
+
             // TODO - get rid of these exceptions
         } catch (AccountNotFoundException e) {
             e.printStackTrace();
@@ -212,7 +214,7 @@ public class OperationsService extends Service {
         } catch (IOException e) {
             e.printStackTrace();
         }
-        
+
         mUndispatchedFinishedOperations.clear();
 
         mOperationsBinder = null;
@@ -227,8 +229,8 @@ public class OperationsService extends Service {
     }
 
     /**
-     * Provides a binder object that clients can use to perform actions on the queue of operations, 
-     * except the addition of new operations. 
+     * Provides a binder object that clients can use to perform actions on the queue of operations,
+     * except the addition of new operations.
      */
     @Override
     public IBinder onBind(Intent intent) {
@@ -236,7 +238,7 @@ public class OperationsService extends Service {
         return mOperationsBinder;
     }
 
-    
+
     /**
      * Called when ALL the bound clients were unbound.
      */
@@ -248,20 +250,20 @@ public class OperationsService extends Service {
 
 
     /**
-     *  Binder to let client components to perform actions on the queue of operations.
-     * 
-     *  It provides by itself the available operations.
+     * Binder to let client components to perform actions on the queue of operations.
+     * <p/>
+     * It provides by itself the available operations.
      */
     public class OperationsServiceBinder extends Binder /* implements OnRemoteOperationListener */ {
-        
-        /** 
+
+        /**
          * Map of listeners that will be reported about the end of operations from a
          * {@link OperationsServiceBinder} instance
          */
-        private ConcurrentMap<OnRemoteOperationListener, Handler> mBoundListeners = 
+        private final ConcurrentMap<OnRemoteOperationListener, Handler> mBoundListeners =
                 new ConcurrentHashMap<OnRemoteOperationListener, Handler>();
-        
-        private ServiceHandler mServiceHandler = null;   
+
+        private ServiceHandler mServiceHandler = null;
 
         public OperationsServiceBinder(ServiceHandler serviceHandler) {
             mServiceHandler = serviceHandler;
@@ -280,15 +282,15 @@ public class OperationsService extends Service {
 
 
         public void clearListeners() {
-            
+
             mBoundListeners.clear();
         }
 
-        
+
         /**
          * Adds a listener interested in being reported about the end of operations.
-         * 
-         * @param listener          Object to notify about the end of operations.    
+         *
+         * @param listener          Object to notify about the end of operations.
          * @param callbackHandler   {@link Handler} to access the listener without
          *                                         breaking Android threading protection.
          */
@@ -298,15 +300,15 @@ public class OperationsService extends Service {
                 mBoundListeners.put(listener, callbackHandler);
             }
         }
-        
-        
+
+
         /**
          * Removes a listener from the list of objects interested in the being reported about
          * the end of operations.
          * 
          * @param listener      Object to notify about progress of transfer.    
          */
-        public void removeOperationListener (OnRemoteOperationListener listener) {
+        public void removeOperationListener(OnRemoteOperationListener listener) {
             synchronized (mBoundListeners) {
                 mBoundListeners.remove(listener);
             }
@@ -314,8 +316,8 @@ public class OperationsService extends Service {
 
 
         /**
-         * TODO - IMPORTANT: update implementation when more operations are moved into the service 
-         * 
+         * TODO - IMPORTANT: update implementation when more operations are moved into the service
+         *
          * @return  'True' when an operation that enforces the user to wait for completion is
          *          in process.
          */
@@ -343,8 +345,8 @@ public class OperationsService extends Service {
                 return Long.MAX_VALUE;
             }
         }
-        
-        
+
+
         public boolean dispatchResultIfFinished(int operationId,
                                                 OnRemoteOperationListener listener) {
             Pair<RemoteOperation, RemoteOperationResult> undispatched = 
@@ -378,8 +380,8 @@ public class OperationsService extends Service {
 
 
     /**
-     * Operations worker. Performs the pending operations in the order they were requested. 
-     * 
+     * Operations worker. Performs the pending operations in the order they were requested.
+     *
      * Created with the Looper of a new thread, started in {@link OperationsService#onCreate()}. 
      */
     private static class ServiceHandler extends Handler {
@@ -388,8 +390,8 @@ public class OperationsService extends Service {
         
         
         OperationsService mService;
-        
-        
+
+
         private ConcurrentLinkedQueue<Pair<Target, RemoteOperation>> mPendingOperations =
                 new ConcurrentLinkedQueue<Pair<Target, RemoteOperation>>();
         private RemoteOperation mCurrentOperation = null;
@@ -412,7 +414,7 @@ public class OperationsService extends Service {
             Log_OC.d(TAG, "Stopping after command with id " + msg.arg1);
             mService.stopSelf(msg.arg1);
         }
-        
+
         
         /**
          * Performs the next operation in the queue
@@ -475,7 +477,7 @@ public class OperationsService extends Service {
                     } else {
                         result = mCurrentOperation.execute(mOwnCloudClient);
                     }
-                    
+
                 } catch (AccountsException e) {
                     if (mLastTarget.mAccount == null) {
                         Log_OC.e(TAG, "Error while trying to get authorization for a NULL account",
@@ -515,9 +517,9 @@ public class OperationsService extends Service {
         }
 
 
-        
+
     }
-    
+
 
     /**
      * Creates a new operation, as described by operationIntent.
@@ -535,7 +537,7 @@ public class OperationsService extends Service {
             if (!operationIntent.hasExtra(EXTRA_ACCOUNT) && 
                     !operationIntent.hasExtra(EXTRA_SERVER_URL)) {
                 Log_OC.e(TAG, "Not enough information provided in intent");
-                
+
             } else {
                 Account account = operationIntent.getParcelableExtra(EXTRA_ACCOUNT);
                 String serverUrl = operationIntent.getStringExtra(EXTRA_SERVER_URL);
@@ -556,7 +558,7 @@ public class OperationsService extends Service {
                                 ShareType.PUBLIC_LINK,
                                 "", false, password, 1, sendIntent);
                     }
-                    
+
                 } else if (action.equals(ACTION_UNSHARE)) {  // Unshare file
                     String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                     if (remotePath.length() > 0) {
@@ -568,7 +570,7 @@ public class OperationsService extends Service {
                 } else if (action.equals(ACTION_GET_SERVER_INFO)) { 
                     // check OC server and get basic information from it
                     operation = new GetServerInfoOperation(serverUrl, OperationsService.this);
-                    
+
                 } else if (action.equals(ACTION_OAUTH2_GET_ACCESS_TOKEN)) {
                     /// GET ACCESS TOKEN to the OAuth server
                     String oauth2QueryParameters =
@@ -578,7 +580,7 @@ public class OperationsService extends Service {
                             getString(R.string.oauth2_redirect_uri),       
                             getString(R.string.oauth2_grant_type),
                             oauth2QueryParameters);
-                    
+
                 } else if (action.equals(ACTION_GET_USER_NAME)) {
                     // Get User Name
                     operation = new GetRemoteUserNameOperation();
@@ -602,7 +604,7 @@ public class OperationsService extends Service {
                     boolean createFullPath = operationIntent.getBooleanExtra(EXTRA_CREATE_FULL_PATH,
                             true);
                     operation = new CreateFolderOperation(remotePath, createFullPath);
-                    
+
                 } else if (action.equals(ACTION_SYNC_FILE)) {
                     // Sync file
                     String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
@@ -626,9 +628,14 @@ public class OperationsService extends Service {
                     // Move file/folder
                     String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                     String newParentPath = operationIntent.getStringExtra(EXTRA_NEW_PARENT_PATH);
-                    operation = new MoveFileOperation(remotePath,newParentPath,account);
+                    operation = new MoveFileOperation(remotePath, newParentPath, account);
+
+                } else if (action.equals(ACTION_COPY_FILE)) {
+                    // Copy file/folder
+                    String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
+                    String newParentPath = operationIntent.getStringExtra(EXTRA_NEW_PARENT_PATH);
+                    operation = new CopyFileOperation(remotePath, newParentPath, account);
                 }
-                
             }
                 
         } catch (IllegalArgumentException e) {
@@ -642,11 +649,11 @@ public class OperationsService extends Service {
             return null;
         }
     }
-    
+
 
     /**
      * Sends a broadcast when a new operation is added to the queue.
-     * 
+     *
      * Local broadcasts are only delivered to activities in the same process, but can't be
      * done sticky :\
      * 
@@ -656,43 +663,43 @@ public class OperationsService extends Service {
     private void sendBroadcastNewOperation(Target target, RemoteOperation operation) {
         Intent intent = new Intent(ACTION_OPERATION_ADDED);
         if (target.mAccount != null) {
-            intent.putExtra(EXTRA_ACCOUNT, target.mAccount);    
+            intent.putExtra(EXTRA_ACCOUNT, target.mAccount);
         } else {
-            intent.putExtra(EXTRA_SERVER_URL, target.mServerUrl);    
+            intent.putExtra(EXTRA_SERVER_URL, target.mServerUrl);
         }
         //LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
         //lbm.sendBroadcast(intent);
         sendStickyBroadcast(intent);
     }
 
-    
+
     // TODO - maybe add a notification for real start of operations
-    
+
     /**
      * Sends a LOCAL broadcast when an operations finishes in order to the interested activities c
      * an update their view
      * 
      * Local broadcasts are only delivered to activities in the same process.
-     * 
-     * @param target            Account or URL pointing to an OC server.
-     * @param operation         Finished operation.
-     * @param result            Result of the operation.
+     *
+     * @param target    Account or URL pointing to an OC server.
+     * @param operation Finished operation.
+     * @param result    Result of the operation.
      */
     private void sendBroadcastOperationFinished(Target target, RemoteOperation operation,
                                                 RemoteOperationResult result) {
         Intent intent = new Intent(ACTION_OPERATION_FINISHED);
         intent.putExtra(EXTRA_RESULT, result);
         if (target.mAccount != null) {
-            intent.putExtra(EXTRA_ACCOUNT, target.mAccount);    
+            intent.putExtra(EXTRA_ACCOUNT, target.mAccount);
         } else {
-            intent.putExtra(EXTRA_SERVER_URL, target.mServerUrl);    
+            intent.putExtra(EXTRA_SERVER_URL, target.mServerUrl);
         }
         //LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
         //lbm.sendBroadcast(intent);
         sendStickyBroadcast(intent);
     }
 
-    
+
     /**
      * Notifies the currently subscribed listeners about the end of an operation.
      *
@@ -720,9 +727,9 @@ public class OperationsService extends Service {
         }
         if (count == 0) {
             //mOperationResults.put(operation.hashCode(), result);
-            Pair<RemoteOperation, RemoteOperationResult> undispatched = 
+            Pair<RemoteOperation, RemoteOperationResult> undispatched =
                     new Pair<RemoteOperation, RemoteOperationResult>(operation, result);
-            mUndispatchedFinishedOperations.put(operation.hashCode(), undispatched);
+            mUndispatchedFinishedOperations.put(((Runnable) operation).hashCode(), undispatched);
         }
         Log_OC.d(TAG, "Called " + count + " listeners");
     }

+ 4 - 3
src/com/owncloud/android/ui/activity/FileActivity.java

@@ -520,7 +520,7 @@ public class FileActivity extends AppCompatActivity
      */
     private void swapToDefaultAccount() {
         // default to the most recently used account
-        Account newAccount  = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
+        Account newAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
         if (newAccount == null) {
             /// no account available: force account creation
             createFirstAccount();
@@ -612,7 +612,7 @@ public class FileActivity extends AppCompatActivity
     }
 
     /**
-     * @return  'True' when the Activity is finishing to enforce the setup of a new account.
+     * @return 'True' when the Activity is finishing to enforce the setup of a new account.
      */
     protected boolean isRedirectingToSetupAccount() {
         return mRedirectingToSetupAccount;
@@ -762,6 +762,7 @@ public class FileActivity extends AppCompatActivity
     }
 
 
+
     private void onCreateShareOperationFinish(CreateShareOperation operation,
                                               RemoteOperationResult result) {
         dismissLoadingDialog();
@@ -867,7 +868,7 @@ public class FileActivity extends AppCompatActivity
     /**
      * Dismiss loading dialog
      */
-    public void dismissLoadingDialog(){
+    public void dismissLoadingDialog() {
         Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG);
         if (frag != null) {
             LoadingDialog loading = (LoadingDialog) frag;

+ 196 - 140
src/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -77,6 +77,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
 import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.operations.CopyFileOperation;
 import com.owncloud.android.operations.CreateFolderOperation;
 import com.owncloud.android.operations.CreateShareOperation;
 import com.owncloud.android.operations.MoveFileOperation;
@@ -134,6 +135,7 @@ public class FileDisplayActivity extends HookActivity
     public static final int ACTION_SELECT_CONTENT_FROM_APPS = 1;
     public static final int ACTION_SELECT_MULTIPLE_FILES = 2;
     public static final int ACTION_MOVE_FILES = 3;
+    public static final int ACTION_COPY_FILES = 4;
 
     private static final String TAG = FileDisplayActivity.class.getSimpleName();
 
@@ -141,7 +143,7 @@ public class FileDisplayActivity extends HookActivity
     private static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT";
 
     private OCFile mWaitingToPreview;
-    
+
     private boolean mSyncInProgress = false;
 
     private static String DIALOG_UNTRUSTED_CERT = "DIALOG_UNTRUSTED_CERT";
@@ -164,7 +166,7 @@ public class FileDisplayActivity extends HookActivity
             Intent initObserversIntent = FileObserverService.makeInitIntent(this);
             startService(initObserversIntent);
         }
-        
+
         /// Load of saved instance state
         if(savedInstanceState != null) {
             mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(
@@ -177,13 +179,13 @@ public class FileDisplayActivity extends HookActivity
             mWaitingToPreview = null;
             mSyncInProgress = false;
             mWaitingToSend = null;
-        }        
+        }
 
         /// USER INTERFACE
 
         // Inflate and set the layout view
         setContentView(R.layout.files);
-        
+
         // Navigation Drawer
         initDrawer();
 
@@ -231,8 +233,8 @@ public class FileDisplayActivity extends HookActivity
     }
 
     /**
-     *  Called when the ownCloud {@link Account} associated to the Activity was just updated.
-     */ 
+     * Called when the ownCloud {@link Account} associated to the Activity was just updated.
+     */
     @Override
     protected void onAccountSet(boolean stateWasRecovered) {
         super.onAccountSet(stateWasRecovered);
@@ -271,7 +273,7 @@ public class FileDisplayActivity extends HookActivity
                 if (file.isFolder()) {
                     startSyncFolderOperation(file, false);
                 }
-                
+
             } else {
                 updateFragmentsVisibility(!file.isFolder());
                 updateActionBarTitleAndHomeButton(file.isFolder() ? null : file);
@@ -285,11 +287,11 @@ public class FileDisplayActivity extends HookActivity
         transaction.add(R.id.left_fragment_container, listOfFiles, TAG_LIST_OF_FILES);
         transaction.commit();
     }
-    
+
     private void initFragmentsWithFile() {
         if (getAccount() != null && getFile() != null) {
             /// First fragment
-            OCFileListFragment listOfFiles = getListOfFilesFragment(); 
+            OCFileListFragment listOfFiles = getListOfFilesFragment();
             if (listOfFiles != null) {
                 listOfFiles.listDirectory(getCurrentDir());
                 // TODO Enable when "On Device" is recovered
@@ -297,9 +299,9 @@ public class FileDisplayActivity extends HookActivity
             } else {
                 Log_OC.e(TAG, "Still have a chance to lose the initializacion of list fragment >(");
             }
-            
+
             /// Second fragment
-            OCFile file = getFile(); 
+            OCFile file = getFile();
             Fragment secondFragment = chooseInitialSecondFragment(file);
             if (secondFragment != null) {
                 setSecondFragment(secondFragment);
@@ -324,7 +326,7 @@ public class FileDisplayActivity extends HookActivity
     private Fragment chooseInitialSecondFragment(OCFile file) {
         Fragment secondFragment = null;
         if (file != null && !file.isFolder()) {
-            if (file.isDown() && PreviewMediaFragment.canBePreviewed(file) 
+            if (file.isDown() && PreviewMediaFragment.canBePreviewed(file)
                     && file.getLastSyncDateForProperties() > 0  // temporal fix
                     ) {
                 int startPlaybackPosition =
@@ -345,10 +347,10 @@ public class FileDisplayActivity extends HookActivity
     /**
      * Replaces the second fragment managed by the activity with the received as
      * a parameter.
-     * 
-     * Assumes never will be more than two fragments managed at the same time. 
-     * 
-     * @param fragment      New second Fragment to set.
+     * <p/>
+     * Assumes never will be more than two fragments managed at the same time.
+     *
+     * @param fragment New second Fragment to set.
      */
     private void setSecondFragment(Fragment fragment) {
         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
@@ -389,7 +391,7 @@ public class FileDisplayActivity extends HookActivity
         Fragment listOfFiles = getSupportFragmentManager().findFragmentByTag(
                 FileDisplayActivity.TAG_LIST_OF_FILES);
         if (listOfFiles != null) {
-            return (OCFileListFragment)listOfFiles;
+            return (OCFileListFragment) listOfFiles;
         }
         Log_OC.wtf(TAG, "Access to unexisting list of files fragment!!");
         return null;
@@ -399,7 +401,7 @@ public class FileDisplayActivity extends HookActivity
         Fragment second = getSupportFragmentManager().findFragmentByTag(
                 FileDisplayActivity.TAG_SECOND_FRAGMENT);
         if (second != null) {
-            return (FileFragment)second;
+            return (FileFragment) second;
         }
         return null;
     }
@@ -611,17 +613,30 @@ public class FileDisplayActivity extends HookActivity
             requestMultipleUpload(data, resultCode);
 
         } else if (requestCode == ACTION_MOVE_FILES && resultCode == RESULT_OK){
+            final Intent fData = data;
+            final int fResultCode = resultCode;
+            getHandler().postDelayed(
+                    new Runnable() {
+                        @Override
+                        public void run() {
+                            requestMoveOperation(fData, fResultCode);
+                        }
+                    },
+                    DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS
+            );
+
+        } else if (requestCode == ACTION_COPY_FILES && resultCode == RESULT_OK) {
 
             final Intent fData = data;
-            final int fResultCode = resultCode; 
+            final int fResultCode = resultCode;
             getHandler().postDelayed(
-                new Runnable() {
-                    @Override
-                    public void run() {
-                        requestMoveOperation(fData, fResultCode);
-                    }
-                }, 
-                DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS
+                    new Runnable() {
+                        @Override
+                        public void run() {
+                            requestCopyOperation(fData, fResultCode);
+                        }
+                    },
+                    DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS
             );
 
         } else {
@@ -729,9 +744,9 @@ public class FileDisplayActivity extends HookActivity
 
     /**
      * Request the operation for moving the file/folder from one path to another
-     * 
-     * @param data              Intent received
-     * @param resultCode        Result code received
+     *
+     * @param data       Intent received
+     * @param resultCode Result code received
      */
     private void requestMoveOperation(Intent data, int resultCode) {
         OCFile folderToMoveAt = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER);
@@ -739,6 +754,18 @@ public class FileDisplayActivity extends HookActivity
         getFileOperationsHelper().moveFile(folderToMoveAt, targetFile);
     }
 
+    /**
+     * Request the operation for copying the file/folder from one path to another
+     *
+     * @param data       Intent received
+     * @param resultCode Result code received
+     */
+    private void requestCopyOperation(Intent data, int resultCode) {
+        OCFile folderToMoveAt = data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER);
+        OCFile targetFile = data.getParcelableExtra(FolderPickerActivity.EXTRA_FILE);
+        getFileOperationsHelper().copyFile(folderToMoveAt, targetFile);
+    }
+
     @Override
     public void onBackPressed() {
         if (!isDrawerOpen()){
@@ -776,7 +803,6 @@ public class FileDisplayActivity extends HookActivity
 
         Log_OC.v(TAG, "onSaveInstanceState() end");
     }
-    
 
 
     @Override
@@ -813,7 +839,7 @@ public class FileDisplayActivity extends HookActivity
         downloadIntentFilter.addAction(FileDownloader.getDownloadFinishMessage());
         mDownloadFinishReceiver = new DownloadFinishReceiver();
         registerReceiver(mDownloadFinishReceiver, downloadIntentFilter);
-        
+
         Log_OC.v(TAG, "onResume() end");
     }
 
@@ -834,7 +860,7 @@ public class FileDisplayActivity extends HookActivity
             unregisterReceiver(mDownloadFinishReceiver);
             mDownloadFinishReceiver = null;
         }
-        
+
         super.onPause();
         Log_OC.v(TAG, "onPause() end");
     }
@@ -860,10 +886,10 @@ public class FileDisplayActivity extends HookActivity
                         accountName.equals(getAccount().name) && getStorageManager() != null);
     
                 if (sameAccount) {
-                    
+
                     if (FileSyncAdapter.EVENT_FULL_SYNC_START.equals(event)) {
                         mSyncInProgress = true;
-                        
+
                     } else {
                         OCFile currentFile = (getFile() == null) ? null :
                                 getStorageManager().getFileByPath(getFile().getRemotePath());
@@ -880,7 +906,7 @@ public class FileDisplayActivity extends HookActivity
                                             Toast.LENGTH_LONG)
                                 .show();
                             browseToRoot();
-                            
+
                         } else {
                             if (currentFile == null && !getFile().isFolder()) {
                                 // currently selected file was removed in the server, and now we
@@ -901,7 +927,7 @@ public class FileDisplayActivity extends HookActivity
                             }
                             setFile(currentFile);
                         }
-                        
+
                         mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) &&
                                 !RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED
                                         .equals(event));
@@ -909,11 +935,11 @@ public class FileDisplayActivity extends HookActivity
                         if (RefreshFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED.
                                     equals(event) &&
                                 /// TODO refactor and make common
-                                synchResult != null && !synchResult.isSuccess() &&  
-                                (synchResult.getCode() == ResultCode.UNAUTHORIZED   || 
-                                    synchResult.isIdPRedirection()                  ||
-                                    (synchResult.isException() && synchResult.getException() 
-                                            instanceof AuthenticatorException))) {
+                                synchResult != null && !synchResult.isSuccess() &&
+                                (synchResult.getCode() == ResultCode.UNAUTHORIZED ||
+                                        synchResult.isIdPRedirection() ||
+                                        (synchResult.isException() && synchResult.getException()
+                                                instanceof AuthenticatorException))) {
 
 
                             try {
@@ -953,9 +979,9 @@ public class FileDisplayActivity extends HookActivity
                     /*|| mRefreshSharesInProgress*/ //);
 
                     setBackgroundText();
-                        
+
                 }
-                
+
                 if (synchResult != null) {
                     if (synchResult.getCode().equals(
                             RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED)) {
@@ -969,7 +995,7 @@ public class FileDisplayActivity extends HookActivity
             }
         }
     }
-    
+
     /**
      * Show a text message on screen view for notifying user if content is
      * loading or folder is empty
@@ -994,7 +1020,8 @@ public class FileDisplayActivity extends HookActivity
     private class UploadFinishReceiver extends BroadcastReceiver {
         /**
          * Once the file upload has finished -> update view
-         *  @author David A. Velasco
+         *
+         * @author David A. Velasco
          * {@link BroadcastReceiver} to enable upload feedback in UI
          */
         @Override
@@ -1004,23 +1031,23 @@ public class FileDisplayActivity extends HookActivity
                 String accountName = intent.getStringExtra(FileUploader.ACCOUNT_NAME);
                 boolean sameAccount = getAccount() != null && accountName.equals(getAccount().name);
                 OCFile currentDir = getCurrentDir();
-                boolean isDescendant = (currentDir != null) && (uploadedRemotePath != null) && 
+                boolean isDescendant = (currentDir != null) && (uploadedRemotePath != null) &&
                         (uploadedRemotePath.startsWith(currentDir.getRemotePath()));
-                
+
                 if (sameAccount && isDescendant) {
                     refreshListOfFilesFragment();
                 }
-                
+
                 boolean uploadWasFine = intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT,
                         false);
                 boolean renamedInUpload = getFile().getRemotePath().
                         equals(intent.getStringExtra(FileUploader.EXTRA_OLD_REMOTE_PATH));
-                boolean sameFile = getFile().getRemotePath().equals(uploadedRemotePath) || 
+                boolean sameFile = getFile().getRemotePath().equals(uploadedRemotePath) ||
                         renamedInUpload;
                 FileFragment details = getSecondFragment();
-                boolean detailFragmentIsShown = (details != null && 
+                boolean detailFragmentIsShown = (details != null &&
                         details instanceof FileDetailFragment);
-                
+
                 if (sameAccount && sameFile && detailFragmentIsShown) {
                     if (uploadWasFine) {
                         setFile(getStorageManager().getFileByPath(uploadedRemotePath));
@@ -1028,19 +1055,19 @@ public class FileDisplayActivity extends HookActivity
                     if (renamedInUpload) {
                         String newName = (new File(uploadedRemotePath)).getName();
                         Toast msg = Toast.makeText(
-                                context, 
+                                context,
                                 String.format(
-                                        getString(R.string.filedetails_renamed_in_upload_msg), 
-                                        newName), 
+                                        getString(R.string.filedetails_renamed_in_upload_msg),
+                                        newName),
                                 Toast.LENGTH_LONG);
                         msg.show();
                     }
                     if (uploadWasFine || getFile().fileExists()) {
-                        ((FileDetailFragment)details).updateFileDetails(false, true);
+                        ((FileDetailFragment) details).updateFileDetails(false, true);
                     } else {
                         cleanSecondFragment();
                     }
-                    
+
                     // Force the preview if the file is an image
                     if (uploadWasFine && PreviewImageFragment.canBePreviewed(getFile())) {
                         startImagePreview(getFile());
@@ -1053,15 +1080,15 @@ public class FileDisplayActivity extends HookActivity
                     removeStickyBroadcast(intent);
                 }
             }
-            
+
         }
-        
+
     }
 
 
     /**
      * Class waiting for broadcast events from the {@link FileDownloader} service.
-     * 
+     *
      * Updates the UI when a download is started or finished, provided that it is relevant for the
      * current folder.
      */
@@ -1089,7 +1116,7 @@ public class FileDisplayActivity extends HookActivity
                             intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false)
                     );
                 }
-    
+
                 if (mWaitingToSend != null) {
                     mWaitingToSend =
                             getStorageManager().getFileByPath(mWaitingToSend.getRemotePath());
@@ -1097,7 +1124,7 @@ public class FileDisplayActivity extends HookActivity
                         sendDownloadedFile();
                     }
                 }
-            
+
             } finally {
                 if (intent != null) {
                     removeStickyBroadcast(intent);
@@ -1128,10 +1155,10 @@ public class FileDisplayActivity extends HookActivity
                     accountName.equals(getAccount().name));
         }
     }
-    
-    
+
+
     public void browseToRoot() {
-        OCFileListFragment listOfFiles = getListOfFilesFragment(); 
+        OCFileListFragment listOfFiles = getListOfFilesFragment();
         if (listOfFiles != null) {  // should never be null, indeed
             OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
             listOfFiles.listDirectory(root);
@@ -1147,7 +1174,7 @@ public class FileDisplayActivity extends HookActivity
 
     /**
      * {@inheritDoc}
-     * 
+     * <p/>
      * Updates action bar and second fragment, if in dual pane mode.
      */
     @Override
@@ -1159,10 +1186,10 @@ public class FileDisplayActivity extends HookActivity
     }
 
     /**
-     * Shows the information of the {@link OCFile} received as a 
+     * Shows the information of the {@link OCFile} received as a
      * parameter in the second fragment.
-     * 
-     * @param file          {@link OCFile} whose details will be shown
+     *
+     * @param file {@link OCFile} whose details will be shown
      */
     @Override
     public void showDetails(OCFile file) {
@@ -1190,7 +1217,9 @@ public class FileDisplayActivity extends HookActivity
         return new ListServiceConnection();
     }
 
-    /** Defines callbacks for service binding, passed to bindService() */
+    /**
+     * Defines callbacks for service binding, passed to bindService()
+     */
     private class ListServiceConnection implements ServiceConnection {
 
         @Override
@@ -1207,7 +1236,7 @@ public class FileDisplayActivity extends HookActivity
                         if (!mWaitingToPreview.isDown()) {
                             requestForDownload();
                         }
-                }
+                    }
 
             } else if (component.equals(new ComponentName(FileDisplayActivity.this,
                     FileUploader.class))) {
@@ -1226,7 +1255,7 @@ public class FileDisplayActivity extends HookActivity
             }
             FileFragment secondFragment = getSecondFragment();
             if (secondFragment != null && secondFragment instanceof FileDetailFragment) {
-                FileDetailFragment detailFragment = (FileDetailFragment)secondFragment;
+                FileDetailFragment detailFragment = (FileDetailFragment) secondFragment;
                 detailFragment.listenForTransferProgress();
                 detailFragment.updateFileDetails(false, false);
             }
@@ -1244,7 +1273,7 @@ public class FileDisplayActivity extends HookActivity
                 mUploaderBinder = null;
             }
         }
-    };    
+    }
 
     @Override
     public void onSavedCertificate() {
@@ -1268,39 +1297,42 @@ public class FileDisplayActivity extends HookActivity
     /**
      * Updates the view associated to the activity after the finish of some operation over files
      * in the current account.
-     * 
-     * @param operation     Removal operation performed.
-     * @param result        Result of the removal.
+     *
+     * @param operation Removal operation performed.
+     * @param result    Result of the removal.
      */
     @Override
     public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
         super.onRemoteOperationFinish(operation, result);
-        
+
         if (operation instanceof RemoveFileOperation) {
             onRemoveFileOperationFinish((RemoveFileOperation) operation, result);
 
         } else if (operation instanceof RenameFileOperation) {
-            onRenameFileOperationFinish((RenameFileOperation)operation, result);
+            onRenameFileOperationFinish((RenameFileOperation) operation, result);
 
         } else if (operation instanceof SynchronizeFileOperation) {
-            onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result);
+            onSynchronizeFileOperationFinish((SynchronizeFileOperation) operation, result);
 
         } else if (operation instanceof CreateFolderOperation) {
-            onCreateFolderOperationFinish((CreateFolderOperation)operation, result);
-            
+            onCreateFolderOperationFinish((CreateFolderOperation) operation, result);
+
         } else if (operation instanceof CreateShareOperation) {
             onCreateShareOperationFinish((CreateShareOperation) operation, result);
-            
+
         } else if (operation instanceof UnshareLinkOperation) {
-            onUnshareLinkOperationFinish((UnshareLinkOperation)operation, result);
-        
+            onUnshareLinkOperationFinish((UnshareLinkOperation) operation, result);
+
         } else if (operation instanceof MoveFileOperation) {
-            onMoveFileOperationFinish((MoveFileOperation)operation, result);
+            onMoveFileOperationFinish((MoveFileOperation) operation, result);
+
+        } else if (operation instanceof CopyFileOperation) {
+            onCopyFileOperationFinish((CopyFileOperation) operation, result);
         }
-        
+
     }
 
-    
+
     private void onCreateShareOperationFinish(CreateShareOperation operation,
                                               RemoteOperationResult result) {
         if (result.isSuccess()) {
@@ -1309,36 +1341,36 @@ public class FileDisplayActivity extends HookActivity
         }
     }
 
-    
+
     private void onUnshareLinkOperationFinish(UnshareLinkOperation operation,
                                               RemoteOperationResult result) {
         if (result.isSuccess()) {
             refreshShowDetails();
             refreshListOfFilesFragment();
-            
+
         } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) {
             cleanSecondFragment();
             refreshListOfFilesFragment();
         }
     }
-    
+
     private void refreshShowDetails() {
         FileFragment details = getSecondFragment();
         if (details != null) {
             OCFile file = details.getFile();
             if (file != null) {
-                file = getStorageManager().getFileByPath(file.getRemotePath()); 
+                file = getStorageManager().getFileByPath(file.getRemotePath());
                 if (details instanceof PreviewMediaFragment) {
                     // Refresh  OCFile of the fragment
                     ((PreviewMediaFragment) details).updateFile(file);
                 } else {
                     showDetails(file);
-                } 
+                }
             }
             invalidateOptionsMenu();
-        } 
+        }
     }
-    
+
     /**
      * Updates the view associated to the activity after the finish of an operation trying to
      * remove a file.
@@ -1349,18 +1381,18 @@ public class FileDisplayActivity extends HookActivity
     private void onRemoveFileOperationFinish(RemoveFileOperation operation,
                                              RemoteOperationResult result) {
         dismissLoadingDialog();
-        
+
         Toast msg = Toast.makeText(this,
                 ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
                 Toast.LENGTH_LONG); 
         msg.show();
-        
+
         if (result.isSuccess()) {
             OCFile removedFile = operation.getFile();
             FileFragment second = getSecondFragment();
             if (second != null && removedFile.equals(second.getFile())) {
                 if (second instanceof PreviewMediaFragment) {
-                    ((PreviewMediaFragment)second).stopPreview(true);
+                    ((PreviewMediaFragment) second).stopPreview(true);
                 }
                 setFile(getStorageManager().getFileById(removedFile.getParentId()));
                 cleanSecondFragment();
@@ -1376,14 +1408,14 @@ public class FileDisplayActivity extends HookActivity
             }
         }
     }
-    
-    
+
+
     /**
-     * Updates the view associated to the activity after the finish of an operation trying to move a 
+     * Updates the view associated to the activity after the finish of an operation trying to move a
      * file.
-     * 
-     * @param operation     Move operation performed.
-     * @param result        Result of the move operation.
+     *
+     * @param operation Move operation performed.
+     * @param result    Result of the move operation.
      */
     private void onMoveFileOperationFinish(MoveFileOperation operation,
                                            RemoteOperationResult result) {
@@ -1393,17 +1425,41 @@ public class FileDisplayActivity extends HookActivity
         } else {
             dismissLoadingDialog();
             try {
-                Toast msg = Toast.makeText(FileDisplayActivity.this, 
-                        ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), 
-                        Toast.LENGTH_LONG); 
+                Toast msg = Toast.makeText(FileDisplayActivity.this,
+                        ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
+                        Toast.LENGTH_LONG);
                 msg.show();
 
             } catch (NotFoundException e) {
-                Log_OC.e(TAG, "Error while trying to show fail message " , e);
+                Log_OC.e(TAG, "Error while trying to show fail message ", e);
             }
         }
     }
 
+    /**
+     * Updates the view associated to the activity after the finish of an operation trying to copy a
+     * file.
+     *
+     * @param operation Copy operation performed.
+     * @param result    Result of the copy operation.
+     */
+    private void onCopyFileOperationFinish(CopyFileOperation operation, RemoteOperationResult result) {
+        if (result.isSuccess()) {
+            dismissLoadingDialog();
+            refreshListOfFilesFragment();
+        } else {
+            dismissLoadingDialog();
+            try {
+                Toast msg = Toast.makeText(FileDisplayActivity.this,
+                        ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
+                        Toast.LENGTH_LONG);
+                msg.show();
+
+            } catch (NotFoundException e) {
+                Log_OC.e(TAG, "Error while trying to show fail message ", e);
+            }
+        }
+    }
 
     /**
      * Updates the view associated to the activity after the finish of an operation trying to rename
@@ -1428,14 +1484,14 @@ public class FileDisplayActivity extends HookActivity
                         renamedFile.equals(details.getFile())) {
                     ((PreviewMediaFragment) details).updateFile(renamedFile);
                     if (PreviewMediaFragment.canBePreviewed(renamedFile)) {
-                        int position = ((PreviewMediaFragment)details).getPosition();
+                        int position = ((PreviewMediaFragment) details).getPosition();
                         startMediaPreview(renamedFile, position, true);
                     } else {
                         getFileOperationsHelper().openFile(renamedFile);
                     }
                 }
             }
-            
+
             if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())){
                 refreshListOfFilesFragment();
             }
@@ -1445,7 +1501,7 @@ public class FileDisplayActivity extends HookActivity
                     ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
                     Toast.LENGTH_LONG); 
             msg.show();
-            
+
             if (result.isSslRecoverableException()) {
                 mLastSslUntrustedServerResult = result;
                 showUntrustedCertDialog(mLastSslUntrustedServerResult);
@@ -1479,18 +1535,18 @@ public class FileDisplayActivity extends HookActivity
         } else {
             dismissLoadingDialog();
             try {
-                Toast msg = Toast.makeText(FileDisplayActivity.this, 
-                        ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), 
-                        Toast.LENGTH_LONG); 
+                Toast msg = Toast.makeText(FileDisplayActivity.this,
+                        ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
+                        Toast.LENGTH_LONG);
                 msg.show();
 
             } catch (NotFoundException e) {
-                Log_OC.e(TAG, "Error while trying to show fail message " , e);
+                Log_OC.e(TAG, "Error while trying to show fail message ", e);
             }
         }
     }
 
-    
+
     /**
      * {@inheritDoc}
      */
@@ -1501,16 +1557,16 @@ public class FileDisplayActivity extends HookActivity
         if (details != null && details instanceof FileDetailFragment &&
                 file.equals(details.getFile()) ) {
             if (downloading || uploading) {
-                ((FileDetailFragment)details).updateFileDetails(file, getAccount());
+                ((FileDetailFragment) details).updateFileDetails(file, getAccount());
             } else {
                 if (!file.fileExists()) {
                     cleanSecondFragment();
                 } else {
-                    ((FileDetailFragment)details).updateFileDetails(false, true);
+                    ((FileDetailFragment) details).updateFileDetails(false, true);
                 }
             }
         }
-            
+
     }
 
 
@@ -1539,12 +1595,12 @@ public class FileDisplayActivity extends HookActivity
         }
         return null;
     }
-    
+
     public void startSyncFolderOperation(OCFile folder, boolean ignoreETag) {
-        long currentSyncTime = System.currentTimeMillis(); 
-        
+        long currentSyncTime = System.currentTimeMillis();
+
         mSyncInProgress = true;
-                
+
         // perform folder synchronization
         RemoteOperation synchFolderOp = new RefreshFolderOperation( folder,
                 currentSyncTime,
@@ -1562,7 +1618,7 @@ public class FileDisplayActivity extends HookActivity
     }
 
     /**
-     * Show untrusted cert dialog 
+     * Show untrusted cert dialog
      */
     public void showUntrustedCertDialog(RemoteOperationResult result) {
         // Show a dialog with the certificate info
@@ -1572,7 +1628,7 @@ public class FileDisplayActivity extends HookActivity
         FragmentTransaction ft = fm.beginTransaction();
         dialog.show(ft, DIALOG_UNTRUSTED_CERT);
     }
-    
+
     private void requestForDownload(OCFile file) {
         Account account = getAccount();
         if (!mDownloaderBinder.isDownloading(account, mWaitingToPreview)) {
@@ -1582,43 +1638,43 @@ public class FileDisplayActivity extends HookActivity
             startService(i);
         }
     }
-    
-    private void sendDownloadedFile(){
+
+    private void sendDownloadedFile() {
         getFileOperationsHelper().sendDownloadedFile(mWaitingToSend);
         mWaitingToSend = null;
     }
 
-    
+
     /**
      * Requests the download of the received {@link OCFile} , updates the UI
      * to monitor the download progress and prepares the activity to send the file
      * when the download finishes.
-     * 
-     * @param file          {@link OCFile} to download and preview.
+     *
+     * @param file {@link OCFile} to download and preview.
      */
     public void startDownloadForSending(OCFile file) {
         mWaitingToSend = file;
         requestForDownload(mWaitingToSend);
-        boolean hasSecondFragment = (getSecondFragment()!= null);
+        boolean hasSecondFragment = (getSecondFragment() != null);
         updateFragmentsVisibility(hasSecondFragment);
     }
-    
+
     /**
      * Opens the image gallery showing the image {@link OCFile} received as parameter.
-     * 
-     * @param file                      Image {@link OCFile} to show.
+     *
+     * @param file Image {@link OCFile} to show.
      */
     public void startImagePreview(OCFile file) {
         Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class);
         showDetailsIntent.putExtra(EXTRA_FILE, file);
         showDetailsIntent.putExtra(EXTRA_ACCOUNT, getAccount());
         startActivity(showDetailsIntent);
-        
+
     }
 
     /**
      * Stars the preview of an already down media {@link OCFile}.
-     * 
+     *
      * @param file                      Media {@link OCFile} to preview.
      * @param startPlaybackPosition     Media position where the playback will be started,
      *                                  in milliseconds.
@@ -1638,8 +1694,8 @@ public class FileDisplayActivity extends HookActivity
      * Requests the download of the received {@link OCFile} , updates the UI
      * to monitor the download progress and prepares the activity to preview
      * or open the file when the download finishes.
-     * 
-     * @param file          {@link OCFile} to download and preview.
+     *
+     * @param file {@link OCFile} to download and preview.
      */
     public void startDownloadForPreview(OCFile file) {
         Fragment detailFragment = FileDetailFragment.newInstance(file, getAccount());
@@ -1654,7 +1710,7 @@ public class FileDisplayActivity extends HookActivity
 
     public void cancelTransference(OCFile file) {
         getFileOperationsHelper().cancelTransference(file);
-        if (mWaitingToPreview != null && 
+        if (mWaitingToPreview != null &&
                 mWaitingToPreview.getRemotePath().equals(file.getRemotePath())) {
             mWaitingToPreview = null;
         }
@@ -1687,15 +1743,15 @@ public class FileDisplayActivity extends HookActivity
         }
     }
 
-    private void sortByDate(boolean ascending){
+    private void sortByDate(boolean ascending) {
         getListOfFilesFragment().sortByDate(ascending);
     }
 
-    private void sortBySize(boolean ascending){
+    private void sortBySize(boolean ascending) {
         getListOfFilesFragment().sortBySize(ascending);
     }
 
-    private void sortByName(boolean ascending){
+    private void sortByName(boolean ascending) {
         getListOfFilesFragment().sortByName(ascending);
     }
 

+ 20 - 4
src/com/owncloud/android/ui/activity/Uploader.java

@@ -57,6 +57,8 @@ import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
 import android.support.v7.app.ActionBar;
+import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.widget.AdapterView;
@@ -361,9 +363,8 @@ public class Uploader extends FileActivity
 
             break;
             
-        case R.id.uploader_new_folder:
-            CreateFolderDialogFragment dialog = CreateFolderDialogFragment.newInstance(mFile);
-            dialog.show(getSupportFragmentManager(), "createdirdialog");
+        case R.id.uploader_cancel:
+            finish();
             break;
             
             
@@ -437,7 +438,7 @@ public class Uploader extends FileActivity
             Button btnChooseFolder = (Button) findViewById(R.id.uploader_choose_folder);
             btnChooseFolder.setOnClickListener(this);
             
-            Button btnNewFolder = (Button) findViewById(R.id.uploader_new_folder);
+            Button btnNewFolder = (Button) findViewById(R.id.uploader_cancel);
             btnNewFolder.setOnClickListener(this);
             
             mListView.setOnItemClickListener(this);
@@ -653,11 +654,26 @@ public class Uploader extends FileActivity
         }
     }
 
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.main_menu, menu);
+        menu.findItem(R.id.action_upload).setVisible(false);
+        menu.findItem(R.id.action_sort).setVisible(false);
+        menu.findItem(R.id.action_sync_account).setVisible(false);
+        return true;
+    }
     
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         boolean retval = true;
         switch (item.getItemId()) {
+            case R.id.action_create_dir:
+                CreateFolderDialogFragment dialog = CreateFolderDialogFragment.newInstance(mFile);
+                dialog.show(
+                        getSupportFragmentManager(),
+                        CreateFolderDialogFragment.CREATE_FOLDER_FRAGMENT);
+                break;
             case android.R.id.home:
                 if((mParents.size() > 1)) {
                     onBackPressed();

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

@@ -4,6 +4,7 @@
  *   @author Bartek Przybylski
  *   @author Tobias Kaminsky
  *   @author David A. Velasco
+ *   @author masensio
  *   Copyright (C) 2011  Bartek Przybylski
  *   Copyright (C) 2015 ownCloud Inc.
  *
@@ -323,6 +324,13 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
                             task.execute(file);
                         }
                     }
+
+                    if (file.getMimetype().equalsIgnoreCase("image/png")) {
+                        fileIcon.setBackgroundColor(mContext.getResources()
+                                .getColor(R.color.background_color));
+                    }
+
+
                 } else {
                     fileIcon.setImageResource(DisplayUtils.getFileTypeIconId(file.getMimetype(),
                             file.getFileName()));
@@ -330,6 +338,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
 
             } else {
                 // Folder
+
                 if (checkIfFileIsSharedWithMe(file)) {
                     fileIcon.setImageResource(R.drawable.shared_with_me_folder);
                 } else if (file.isShareByLink()) {

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

@@ -71,8 +71,8 @@ public class ExtendedListFragment extends Fragment
     private ArrayList<Integer> mTops;
     private int mHeightCell = 0;
 
-    private OnEnforceableRefreshListener mOnRefreshListener = null;
-    
+    private SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = null;
+
     protected AbsListView mCurrentListView;
     private ExtendedListView mListView;
     private View mListFooterView;
@@ -352,7 +352,7 @@ public class ExtendedListFragment extends Fragment
         mRefreshEmptyLayout.setRefreshing(false);
 
         if (mOnRefreshListener != null) {
-            mOnRefreshListener.onRefresh(ignoreETag);
+            mOnRefreshListener.onRefresh();
         }
     }
 

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

@@ -21,10 +21,7 @@
  */
 package com.owncloud.android.ui.fragment;
 
-import java.lang.ref.WeakReference;
-
 import android.accounts.Account;
-import android.content.Intent;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -46,13 +43,14 @@ import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
 import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
 import com.owncloud.android.lib.common.utils.Log_OC;
-import com.owncloud.android.services.observer.FileObserverService;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.dialog.RemoveFileDialogFragment;
 import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
 import com.owncloud.android.utils.DisplayUtils;
 
+import java.lang.ref.WeakReference;
+
 
 /**
  * This Fragment is used to display the details about a file.
@@ -62,9 +60,9 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
     private int mLayout;
     private View mView;
     private Account mAccount;
-    
+
     public ProgressListener mProgressListener;
-    
+
     private static final String TAG = FileDetailFragment.class.getSimpleName();
     public static final String FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT";
     public static final String FTAG_RENAME_FILE = "RENAME_FILE_FRAGMENT";
@@ -103,14 +101,14 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
         mLayout = R.layout.file_details_empty;
         mProgressListener = null;
     }
-    
+
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setHasOptionsMenu(true);
     }
-    
+
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -120,14 +118,14 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
         mAccount = getArguments().getParcelable(ARG_ACCOUNT);
 
         if (savedInstanceState != null) {
-            setFile((OCFile)savedInstanceState.getParcelable(FileActivity.EXTRA_FILE));
+            setFile((OCFile) savedInstanceState.getParcelable(FileActivity.EXTRA_FILE));
             mAccount = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
         }
-        
-        if(getFile() != null && mAccount != null) {
+
+        if (getFile() != null && mAccount != null) {
             mLayout = R.layout.file_details_fragment;
         }
-        
+
         mView = inflater.inflate(mLayout, null);
         
         if (mLayout == R.layout.file_details_fragment) {
@@ -154,20 +152,20 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
         super.onStart();
         listenForTransferProgress();
     }
-    
+
     @Override
     public void onStop() {
         leaveTransferProgress();
         super.onStop();
     }
 
-    
+
     @Override
     public View getView() {
         return super.getView() == null ? mView : super.getView();
     }
 
-    
+
     /**
      * {@inheritDoc}
      */
@@ -175,16 +173,16 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         super.onCreateOptionsMenu(menu, inflater);
         inflater.inflate(R.menu.file_actions_menu, menu);
-   }
+    }
+
 
-    
     /**
      * {@inheritDoc}
      */
     @Override
-    public void onPrepareOptionsMenu (Menu menu) {
+    public void onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
-        
+
         if (mContainerActivity.getStorageManager() != null) {
             FileMenuFilter mf = new FileMenuFilter(
                 getFile(),
@@ -194,7 +192,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             );
             mf.filter(menu);
         }
-        
+
         // additional restriction for this fragment 
         MenuItem item = menu.findItem(R.id.action_see_details);
         if (item != null) {
@@ -208,9 +206,16 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             item.setVisible(false);
             item.setEnabled(false);
         }
+
+        // additional restriction for this fragment
+        item = menu.findItem(R.id.action_copy);
+        if (item != null) {
+            item.setVisible(false);
+            item.setEnabled(false);
+        }
     }
 
-    
+
     /**
      * {@inheritDoc}
      */
@@ -241,10 +246,10 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             }
             case R.id.action_cancel_download:
             case R.id.action_cancel_upload: {
-                ((FileDisplayActivity)mContainerActivity).cancelTransference(getFile());
+                ((FileDisplayActivity) mContainerActivity).cancelTransference(getFile());
                 return true;
             }
-            case R.id.action_download_file: 
+            case R.id.action_download_file:
             case R.id.action_sync_file: {
                 mContainerActivity.getFileOperationsHelper().syncFile(getFile());
                 return true;
@@ -253,9 +258,10 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
                 // Obtain the file
                 if (!getFile().isDown()) {  // Download the file                    
                     Log_OC.d(TAG, getFile().getRemotePath() + " : File must be downloaded");
-                    ((FileDisplayActivity)mContainerActivity).startDownloadForSending(getFile());
-                    
-                } else {
+                    ((FileDisplayActivity) mContainerActivity).startDownloadForSending(getFile());
+
+                }
+                else {
                     mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile());
                 }
                 return true;
@@ -282,7 +288,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
                 break;
             }
             case R.id.fdCancelBtn: {
-                ((FileDisplayActivity)mContainerActivity).cancelTransference(getFile());
+                ((FileDisplayActivity) mContainerActivity).cancelTransference(getFile());
                 break;
             }
             default:
@@ -293,17 +299,17 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
 
     /**
      * Check if the fragment was created with an empty layout. An empty fragment can't show file details, must be replaced.
-     * 
-     * @return  True when the fragment was created with the empty layout.
+     *
+     * @return True when the fragment was created with the empty layout.
      */
     public boolean isEmpty() {
         return (mLayout == R.layout.file_details_empty || getFile() == null || mAccount == null);
     }
 
-    
+
     /**
      * Use this method to signal this Activity that it shall update its view.
-     * 
+     *
      * @param file : An {@link OCFile}
      */
     public void updateFileDetails(OCFile file, Account ocAccount) {
@@ -314,14 +320,13 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
 
     /**
      * Updates the view with all relevant details about that file.
+     * <p/>
+     * TODO Remove parameter when the transferring state of files is kept in database.
      *
-     * TODO Remove parameter when the transferring state of files is kept in database. 
-     * 
-     * @param transferring      Flag signaling if the file should be considered as downloading or uploading, 
-     *                          although {@link FileDownloaderBinder#isDownloading(Account, OCFile)}  and 
-     *                          {@link FileUploaderBinder#isUploading(Account, OCFile)} return false.
-     *                          
-     * @param refresh           If 'true', try to refresh the whole file from the database
+     * @param transferring Flag signaling if the file should be considered as downloading or uploading,
+     *                     although {@link FileDownloaderBinder#isDownloading(Account, OCFile)}  and
+     *                     {@link FileUploaderBinder#isUploading(Account, OCFile)} return false.
+     * @param refresh      If 'true', try to refresh the whole file from the database
      */
     public void updateFileDetails(boolean transferring, boolean refresh) {
         if (readyToShow()) {
@@ -330,7 +335,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
                 setFile(storageManager.getFileByPath(getFile().getRemotePath()));
             }
             OCFile file = getFile();
-            
+
             // set file details
             setFilename(file.getFileName());
             setFiletype(file.getMimetype(), file.getFileName());
@@ -349,7 +354,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
                     (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file))
                     ) {
                 setButtonsForTransferring();
-                
+
             } else if (file.isDown()) {
                 
                 setButtonsForDown();
@@ -362,25 +367,27 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
         }
         getView().invalidate();
     }
-    
+
     /**
      * Checks if the fragment is ready to show details of a OCFile
-     *  
-     * @return  'True' when the fragment is ready to show details of a file
+     *
+     * @return 'True' when the fragment is ready to show details of a file
      */
     private boolean readyToShow() {
-        return (getFile() != null && mAccount != null && mLayout == R.layout.file_details_fragment);        
+        return (getFile() != null && mAccount != null && mLayout == R.layout.file_details_fragment);
     }
 
 
     /**
      * Updates the filename in view
+     *
      * @param filename to set
      */
     private void setFilename(String filename) {
         TextView tv = (TextView) getView().findViewById(R.id.fdFilename);
-        if (tv != null)
+        if (tv != null) {
             tv.setText(filename);
+        }
     }
 
     /**
@@ -402,25 +409,28 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
 
     /**
      * Updates the file size in view
+     *
      * @param filesize in bytes to set
      */
     private void setFilesize(long filesize) {
         TextView tv = (TextView) getView().findViewById(R.id.fdSize);
-        if (tv != null)
+        if (tv != null) {
             tv.setText(DisplayUtils.bytesToHumanReadable(filesize));
+        }
     }
-    
+
     /**
      * Updates the time that the file was last modified
+     *
      * @param milliseconds Unix time to set
      */
-    private void setTimeModified(long milliseconds){
+    private void setTimeModified(long milliseconds) {
         TextView tv = (TextView) getView().findViewById(R.id.fdModified);
-        if(tv != null){
+        if (tv != null) {
             tv.setText(DisplayUtils.unixTimeToHumanReadable(milliseconds));
         }
     }
-    
+
     /**
      * Enables or disables buttons for a file being downloaded
      */
@@ -431,21 +441,24 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             
             // show the progress bar for the transfer
             getView().findViewById(R.id.fdProgressBlock).setVisibility(View.VISIBLE);
-            TextView progressText = (TextView)getView().findViewById(R.id.fdProgressText);
+            TextView progressText = (TextView) getView().findViewById(R.id.fdProgressText);
             progressText.setVisibility(View.VISIBLE);
             FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
             FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
             //if (getFile().isDownloading()) {
             if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, getFile())) {
                 progressText.setText(R.string.downloader_download_in_progress_ticker);
-            } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, getFile())) {
-                progressText.setText(R.string.uploader_upload_in_progress_ticker);
+            }
+            else {
+                if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, getFile())) {
+                    progressText.setText(R.string.uploader_upload_in_progress_ticker);
+                }
             }
         }
     }
 
     /**
-     * Enables or disables buttons for a file locally available 
+     * Enables or disables buttons for a file locally available
      */
     private void setButtonsForDown() {
         if (!isEmpty()) {
@@ -453,13 +466,13 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             
             // hides the progress bar
             getView().findViewById(R.id.fdProgressBlock).setVisibility(View.GONE);
-            TextView progressText = (TextView)getView().findViewById(R.id.fdProgressText);
+            TextView progressText = (TextView) getView().findViewById(R.id.fdProgressText);
             progressText.setVisibility(View.GONE);
         }
     }
 
     /**
-     * Enables or disables buttons for a file not locally available 
+     * Enables or disables buttons for a file not locally available
      */
     private void setButtonsForRemote() {
         if (!isEmpty()) {
@@ -467,11 +480,11 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             
             // hides the progress bar
             getView().findViewById(R.id.fdProgressBlock).setVisibility(View.GONE);
-            TextView progressText = (TextView)getView().findViewById(R.id.fdProgressText);
+            TextView progressText = (TextView) getView().findViewById(R.id.fdProgressText);
             progressText.setVisibility(View.GONE);
         }
     }
-    
+
 
     public void listenForTransferProgress() {
         if (mProgressListener != null) {
@@ -485,8 +498,8 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
             }
         }
     }
-    
-    
+
+
     public void leaveTransferProgress() {
         if (mProgressListener != null) {
             if (mContainerActivity.getFileDownloaderBinder() != null) {
@@ -501,7 +514,6 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
     }
 
 
-    
     /**
      * Helper class responsible for updating the progress bar shown for file uploading or
      * downloading
@@ -509,11 +521,11 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
     private class ProgressListener implements OnDatatransferProgressListener {
         int mLastPercent = 0;
         WeakReference<ProgressBar> mProgressBar = null;
-        
+
         ProgressListener(ProgressBar progressBar) {
             mProgressBar = new WeakReference<ProgressBar>(progressBar);
         }
-        
+
         @Override
         public void onTransferProgress(long progressRate, long totalTransferredSoFar,
                                        long totalToTransfer, String filename) {

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

@@ -22,8 +22,6 @@
  */
 package com.owncloud.android.ui.fragment;
 
-import java.io.File;
-
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
@@ -55,12 +53,14 @@ import com.owncloud.android.ui.dialog.RemoveFileDialogFragment;
 import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
 import com.owncloud.android.ui.preview.PreviewImageFragment;
 import com.owncloud.android.ui.preview.PreviewMediaFragment;
-import com.owncloud.android.utils.DialogMenuItem;
 import com.owncloud.android.utils.FileStorageUtils;
 
+import java.io.File;
+import java.util.Vector;
+
 /**
  * A Fragment that lists all files and folders in a given path.
- * 
+ *
  * TODO refactor to get rid of direct dependency on FileDisplayActivity
  */
 public class OCFileListFragment extends ExtendedListFragment implements FileActionsDialogFragment.FileActionsDialogFragmentListener {
@@ -69,14 +69,14 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
 
     private static final String MY_PACKAGE = OCFileListFragment.class.getPackage() != null ?
             OCFileListFragment.class.getPackage().getName() : "com.owncloud.android.ui.fragment";
-            
+
     public final static String ARG_JUST_FOLDERS = MY_PACKAGE + ".JUST_FOLDERS";
     public final static String ARG_ALLOW_CONTEXTUAL_ACTIONS = MY_PACKAGE + ".ALLOW_CONTEXTUAL";
-            
+
     private static final String KEY_FILE = MY_PACKAGE + ".extra.FILE";
 
     private FileFragment.ContainerActivity mContainerActivity;
-   
+
     private OCFile mFile = null;
     private FileListListAdapter mAdapter;
     private boolean mJustFolders;
@@ -94,21 +94,21 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
         Log_OC.e(TAG, "onAttach");
         try {
             mContainerActivity = (FileFragment.ContainerActivity) activity;
-            
+
         } catch (ClassCastException e) {
-            throw new ClassCastException(activity.toString() + " must implement " + 
+            throw new ClassCastException(activity.toString() + " must implement " +
                     FileFragment.ContainerActivity.class.getSimpleName());
         }
         try {
             setOnRefreshListener((OnEnforceableRefreshListener) activity);
             
         } catch (ClassCastException e) {
-            throw new ClassCastException(activity.toString() + " must implement " + 
+            throw new ClassCastException(activity.toString() + " must implement " +
                     SwipeRefreshLayout.OnRefreshListener.class.getSimpleName());
         }
     }
 
-    
+
     @Override
     public void onDetach() {
         setOnRefreshListener(null);
@@ -140,7 +140,7 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
                 mJustFolders,
                 getActivity(),
                 mContainerActivity
-                );
+        );
         setListAdapter(mAdapter);
 
         registerLongClickListener();
@@ -203,31 +203,31 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
      * Saves the current listed folder.
      */
     @Override
-    public void onSaveInstanceState (Bundle outState) {
+    public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putParcelable(KEY_FILE, mFile);
     }
-    
+
     /**
      * Call this, when the user presses the up button.
-     * 
+     *
      * Tries to move up the current folder one level. If the parent folder was removed from the
      * database, it continues browsing up until finding an existing folders.
-     * 
+     * <p/>
      * return       Count of folder levels browsed up.
      */
     public int onBrowseUp() {
         OCFile parentDir = null;
         int moveCount = 0;
-        
-        if(mFile != null){
+
+        if (mFile != null) {
             FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
-            
+
             String parentPath = null;
             if (mFile.getParentId() != FileDataStorageManager.ROOT_PARENT_ID) {
                 parentPath = new File(mFile.getRemotePath()).getParent();
-                parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : 
-                	parentPath + OCFile.PATH_SEPARATOR;
+                parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath :
+                        parentPath + OCFile.PATH_SEPARATOR;
                 parentDir = storageManager.getFileByPath(parentPath);
                 moveCount++;
             } else {
@@ -235,8 +235,8 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
             }
             while (parentDir == null) {
                 parentPath = new File(parentPath).getParent();
-                parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : 
-                	parentPath + OCFile.PATH_SEPARATOR;
+                parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath :
+                        parentPath + OCFile.PATH_SEPARATOR;
                 parentDir = storageManager.getFileByPath(parentPath);
                 moveCount++;
             }   // exit is granted because storageManager.getFileByPath("/") never returns null
@@ -246,20 +246,20 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
             listDirectory(mFile /*, MainApp.getOnlyOnDevice()*/);
 
             onRefresh(false);
-            
+
             // restore index and top position
             restoreIndexAndTopPosition();
-            
+
         }   // else - should never happen now
-   
+
         return moveCount;
     }
-    
+
     @Override
     public void onItemClick(AdapterView<?> l, View v, int position, long id) {
         OCFile file = (OCFile) mAdapter.getItem(position);
         if (file != null) {
-            if (file.isFolder()) { 
+            if (file.isFolder()) {
                 // update state and view of this fragment
                 // TODO Enable when "On Device" is recovered ?
                 listDirectory(file/*, MainApp.getOnlyOnDevice()*/);
@@ -267,48 +267,48 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
                 mContainerActivity.onBrowsedDownTo(file);
                 // save index and top position
                 saveIndexAndTopPosition(position);
-                
+
             } else { /// Click on a file
                 if (PreviewImageFragment.canBePreviewed(file)) {
                     // preview image - it handles the download, if needed
-                    ((FileDisplayActivity)mContainerActivity).startImagePreview(file);
-                    
+                    ((FileDisplayActivity) mContainerActivity).startImagePreview(file);
+
                 } else if (file.isDown()) {
                     if (PreviewMediaFragment.canBePreviewed(file)) {
                         // media preview
-                        ((FileDisplayActivity)mContainerActivity).startMediaPreview(file, 0, true);
+                        ((FileDisplayActivity) mContainerActivity).startMediaPreview(file, 0, true);
                     } else {
                         mContainerActivity.getFileOperationsHelper().openFile(file);
                     }
-                    
+
                 } else {
                     // automatic download, preview on finish
-                    ((FileDisplayActivity)mContainerActivity).startDownloadForPreview(file);
+                    ((FileDisplayActivity) mContainerActivity).startDownloadForPreview(file);
                 }
-                    
+
             }
-            
+
         } else {
             Log_OC.d(TAG, "Null object in ListAdapter!!");
         }
-        
+
     }
-    
+
     /**
      * {@inheritDoc}
      */
     @Override
-    public void onCreateContextMenu (
+    public void onCreateContextMenu(
             ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
         Bundle args = getArguments();
-        boolean allowContextualActions = 
-                (args == null) ? true : args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, true); 
+        boolean allowContextualActions =
+                (args == null) ? true : args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, true);
         if (allowContextualActions) {
             MenuInflater inflater = getActivity().getMenuInflater();
             inflater.inflate(R.menu.file_actions_menu, menu);
             AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
             OCFile targetFile = (OCFile) mAdapter.getItem(info.position);
-            
+
             if (mContainerActivity.getStorageManager() != null) {
                 FileMenuFilter mf = new FileMenuFilter(
                     targetFile,
@@ -403,6 +403,13 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
                 mContainerActivity.getFileOperationsHelper().toggleFavorite(mTargetFile, false);
                 return true;
             }
+            case R.id.action_copy:
+                Intent action = new Intent(getActivity(), FolderPickerActivity.class);
+
+                // Pass mTargetFile that contains info of selected file/folder
+                action.putExtra(FolderPickerActivity.EXTRA_FILE, mTargetFile);
+                getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_COPY_FILES);
+                return true;
             default:
                 return false;
         }
@@ -426,12 +433,13 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
     /**
      * Use this to query the {@link OCFile} that is currently
      * being displayed by this fragment
+     *
      * @return The currently viewed OCFile
      */
-    public OCFile getCurrentFile(){
+    public OCFile getCurrentFile() {
         return mFile;
     }
-    
+
     /**
      * Calls {@link OCFileListFragment#listDirectory(OCFile)} with a null parameter
      */
@@ -445,12 +453,12 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
         // TODO Enable when "On Device" is recovered ?
         listDirectory(getCurrentFile()/*, MainApp.getOnlyOnDevice()*/);
     }
-    
+
     /**
      * Lists the given directory on the view. When the input parameter is null,
      * it will either refresh the last known directory. list the root
      * if there never was a directory.
-     * 
+     *
      * @param directory File to be listed
      */
     public void listDirectory(OCFile directory/*, boolean onlyOnDevice*/) {
@@ -458,18 +466,18 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
         if (storageManager != null) {
 
             // Check input parameters for null
-            if(directory == null){
-                if(mFile != null){
+            if (directory == null) {
+                if (mFile != null) {
                     directory = mFile;
                 } else {
                     directory = storageManager.getFileByPath("/");
                     if (directory == null) return; // no files, wait for sync
                 }
             }
-        
-        
+
+
             // If that's not a directory -> List its parent
-            if(!directory.isFolder()){
+            if (!directory.isFolder()) {
                 Log_OC.w(TAG, "You see, that is not a directory -> " + directory.toString());
                 directory = storageManager.getFileById(directory.getParentId());
             }
@@ -496,9 +504,12 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi
                 if (file.isFolder()) {
                     foldersCount++;
                 } else {
-                    filesCount++;
-                    if (file.isImage()){
-                        imagesCount++;
+                    if (!file.isHidden()) {
+                        filesCount++;
+
+                        if (file.isImage()) {
+                            imagesCount++;
+                        }
                     }
                 }
             }

+ 40 - 38
src/com/owncloud/android/ui/preview/FileDownloadFragment.java

@@ -59,9 +59,9 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
 
     public ProgressListener mProgressListener;
     private boolean mListening;
-    
+
     private static final String TAG = FileDownloadFragment.class.getSimpleName();
-    
+
     private boolean mIgnoreFirstSavedState;
     private boolean mError;
 
@@ -118,19 +118,20 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
         mIgnoreFirstSavedState = args.getBoolean(ARG_IGNORE_FIRST);
         mAccount = args.getParcelable(ARG_ACCOUNT);
     }
-    
+
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
+                             Bundle savedInstanceState) {
         super.onCreateView(inflater, container, savedInstanceState);
-        
+
         if (savedInstanceState != null) {
             if (!mIgnoreFirstSavedState) {
-                setFile((OCFile)savedInstanceState.getParcelable(FileDownloadFragment.EXTRA_FILE));
+                setFile((OCFile) savedInstanceState.getParcelable(FileDownloadFragment.EXTRA_FILE));
                 mAccount = savedInstanceState.getParcelable(FileDownloadFragment.EXTRA_ACCOUNT);
                 mError = savedInstanceState.getBoolean(FileDownloadFragment.EXTRA_ERROR);
-            } else {
+            }
+            else {
                 mIgnoreFirstSavedState = false;
             }
         }
@@ -140,7 +141,7 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
         ProgressBar progressBar = (ProgressBar)mView.findViewById(R.id.progressBar);
         DisplayUtils.colorPreLollipopHorizontalProgressBar(progressBar);
         mProgressListener = new ProgressListener(progressBar);
-        
+
         (mView.findViewById(R.id.cancelBtn)).setOnClickListener(this);
         
         (mView.findViewById(R.id.fileDownloadLL)).setOnClickListener(new OnClickListener() {
@@ -152,13 +153,14 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
 
         if (mError) {
             setButtonsForRemote();
-        } else {
+        }
+        else {
             setButtonsForTransferring();
         }
-        
+
         return mView;
     }
-    
+
 
     @Override
     public void onSaveInstanceState(Bundle outState) {
@@ -173,7 +175,7 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
         super.onStart();
         listenForTransferProgress();
     }
-    
+
     @Override
     public void onResume() {
         super.onResume();
@@ -185,19 +187,19 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
         super.onPause();
     }
 
-    
+
     @Override
     public void onStop() {
         leaveTransferProgress();
         super.onStop();
     }
-    
+
     @Override
     public void onDestroy() {
         super.onDestroy();
     }
-    
-    
+
+
     @Override
     public View getView() {
         if (!mListening) {
@@ -206,7 +208,7 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
         return super.getView() == null ? mView : super.getView();
     }
 
-    
+
     @Override
     public void onClick(View v) {
         switch (v.getId()) {
@@ -220,53 +222,52 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
         }
     }
 
-    
+
     /**
      * Enables or disables buttons for a file being downloaded
      */
     private void setButtonsForTransferring() {
         getView().findViewById(R.id.cancelBtn).setVisibility(View.VISIBLE);
-    
+
         // show the progress bar for the transfer
         getView().findViewById(R.id.progressBar).setVisibility(View.VISIBLE);
-        TextView progressText = (TextView)getView().findViewById(R.id.progressText);
+        TextView progressText = (TextView) getView().findViewById(R.id.progressText);
         progressText.setText(R.string.downloader_download_in_progress_ticker);
         progressText.setVisibility(View.VISIBLE);
-                
+
         // hides the error icon
         getView().findViewById(R.id.errorText).setVisibility(View.GONE);
         getView().findViewById(R.id.error_image).setVisibility(View.GONE);
     }
-    
 
     /**
-     * Enables or disables buttons for a file locally available 
+     * Enables or disables buttons for a file locally available
      */
     private void setButtonsForDown() {
         getView().findViewById(R.id.cancelBtn).setVisibility(View.GONE);
-    
+
         // hides the progress bar
         getView().findViewById(R.id.progressBar).setVisibility(View.GONE);
-        
+
         // updates the text message
-        TextView progressText = (TextView)getView().findViewById(R.id.progressText);
+        TextView progressText = (TextView) getView().findViewById(R.id.progressText);
         progressText.setText(R.string.common_loading);
         progressText.setVisibility(View.VISIBLE);
-        
+
         // hides the error icon
         getView().findViewById(R.id.errorText).setVisibility(View.GONE);
         getView().findViewById(R.id.error_image).setVisibility(View.GONE);
     }
 
-    
+
     /**
-     * Enables or disables buttons for a file not locally available 
-     * 
+     * Enables or disables buttons for a file not locally available
+     * <p/>
      * Currently, this is only used when a download was failed
      */
     private void setButtonsForRemote() {
         getView().findViewById(R.id.cancelBtn).setVisibility(View.GONE);
-        
+
         // hides the progress bar and message
         getView().findViewById(R.id.progressBar).setVisibility(View.GONE);
         getView().findViewById(R.id.progressText).setVisibility(View.GONE);
@@ -275,7 +276,7 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
         getView().findViewById(R.id.errorText).setVisibility(View.VISIBLE);
         getView().findViewById(R.id.error_image).setVisibility(View.VISIBLE);
     }
-    
+
 
     public void listenForTransferProgress() {
         if (mProgressListener != null && !mListening) {
@@ -288,8 +289,8 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
             }
         }
     }
-    
-    
+
+
     public void leaveTransferProgress() {
         if (mProgressListener != null) {
             if (mContainerActivity.getFileDownloaderBinder() != null) {
@@ -308,11 +309,11 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
     private class ProgressListener implements OnDatatransferProgressListener {
         int mLastPercent = 0;
         WeakReference<ProgressBar> mProgressBar = null;
-        
+
         ProgressListener(ProgressBar progressBar) {
             mProgressBar = new WeakReference<ProgressBar>(progressBar);
         }
-        
+
         @Override
         public void onTransferProgress(
                 long progressRate, long totalTransferredSoFar, long totalToTransfer, String filename
@@ -333,8 +334,9 @@ public class FileDownloadFragment extends FileFragment implements OnClickListene
 
     public void setError(boolean error) {
         mError = error;
-    };
-    
+    }
+
+    ;
 
 
 }

+ 90 - 63
src/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@ -26,6 +26,7 @@ import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.graphics.Bitmap;
 import android.graphics.Point;
+import android.graphics.drawable.Drawable;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.support.v4.app.FragmentStatePagerAdapter;
@@ -74,11 +75,11 @@ public class PreviewImageFragment extends FileFragment {
     private ProgressBar mProgressWheel;
 
     public Bitmap mBitmap = null;
-    
+
     private static final String TAG = PreviewImageFragment.class.getSimpleName();
 
     private boolean mIgnoreFirstSavedState;
-    
+
     private LoadBitmapTask mLoadBitmapTask = null;
 
 
@@ -105,7 +106,7 @@ public class PreviewImageFragment extends FileFragment {
         return frag;
     }
 
-    
+
     
     /**
      *  Creates an empty fragment for image previews.
@@ -119,8 +120,8 @@ public class PreviewImageFragment extends FileFragment {
     public PreviewImageFragment() {
         mIgnoreFirstSavedState = false;
     }
-    
-    
+
+
     /**
      * {@inheritDoc}
      */
@@ -135,14 +136,14 @@ public class PreviewImageFragment extends FileFragment {
         mIgnoreFirstSavedState = args.getBoolean(ARG_IGNORE_FIRST);
         setHasOptionsMenu(true);
     }
-    
+
 
     /**
      * {@inheritDoc}
      */
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
+                             Bundle savedInstanceState) {
         super.onCreateView(inflater, container, savedInstanceState);
         View view = inflater.inflate(R.layout.preview_image_fragment, container, false);
         mImageView = (TouchImageViewCustom) view.findViewById(R.id.image);
@@ -182,7 +183,7 @@ public class PreviewImageFragment extends FileFragment {
             throw new IllegalStateException("There is no local file to preview");
         }
     }
-        
+
 
     /**
      * {@inheritDoc}
@@ -192,7 +193,7 @@ public class PreviewImageFragment extends FileFragment {
         super.onSaveInstanceState(outState);
         outState.putParcelable(PreviewImageFragment.EXTRA_FILE, getFile());
     }
-    
+
 
     @Override
     public void onStart() {
@@ -200,11 +201,12 @@ public class PreviewImageFragment extends FileFragment {
         if (getFile() != null) {
             mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel);
             //mLoadBitmapTask.execute(new String[]{getFile().getStoragePath()});
-            mLoadBitmapTask.execute(getFile().getStoragePath());
+//            mLoadBitmapTask.execute(getFile().getStoragePath());
+            mLoadBitmapTask.execute(getFile());
         }
     }
-    
-    
+
+
     @Override
     public void onStop() {
         Log_OC.d(TAG, "onStop starts");
@@ -214,7 +216,7 @@ public class PreviewImageFragment extends FileFragment {
         }
         super.onStop();
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -230,11 +232,11 @@ public class PreviewImageFragment extends FileFragment {
     @Override
     public void onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
-        
+
         if (mContainerActivity.getStorageManager() != null) {
             // Update the file
             setFile(mContainerActivity.getStorageManager().getFileById(getFile().getFileId()));
-            
+
             FileMenuFilter mf = new FileMenuFilter(
                 getFile(),
                 mContainerActivity.getStorageManager().getAccount(),
@@ -243,7 +245,7 @@ public class PreviewImageFragment extends FileFragment {
             );
             mf.filter(menu);
         }
-        
+
         // additional restriction for this fragment 
         // TODO allow renaming in PreviewImageFragment
         MenuItem item = menu.findItem(R.id.action_rename_file);
@@ -251,7 +253,7 @@ public class PreviewImageFragment extends FileFragment {
             item.setVisible(false);
             item.setEnabled(false);
         }
-        
+
         // additional restriction for this fragment 
         // TODO allow refresh file in PreviewImageFragment
         item = menu.findItem(R.id.action_sync_file);
@@ -266,11 +268,17 @@ public class PreviewImageFragment extends FileFragment {
             item.setVisible(false);
             item.setEnabled(false);
         }
-        
+
+        // additional restriction for this fragment
+        item = menu.findItem(R.id.action_copy);
+        if (item != null) {
+            item.setVisible(false);
+            item.setEnabled(false);
+        }
+
     }
 
-    
-    
+
     /**
      * {@inheritDoc}
      */
@@ -318,10 +326,10 @@ public class PreviewImageFragment extends FileFragment {
                 return false;
         }
     }
-    
+
 
     private void seeDetails() {
-        mContainerActivity.showDetails(getFile());        
+        mContainerActivity.showDetails(getFile());
     }
 
 
@@ -348,7 +356,7 @@ public class PreviewImageFragment extends FileFragment {
         super.onDestroy();
     }
 
-    
+
     /**
      * Opens the previewed image with an external application.
      */
@@ -356,9 +364,9 @@ public class PreviewImageFragment extends FileFragment {
         mContainerActivity.getFileOperationsHelper().openFile(getFile());
         finish();
     }
+
     
-    
-    private class LoadBitmapTask extends AsyncTask<String, Void, Bitmap> {
+    private class LoadBitmapTask extends AsyncTask<OCFile, Void, LoadImage> {
 
         /**
          * Weak reference to the target {@link ImageView} where the bitmap will be loaded into.
@@ -376,7 +384,7 @@ public class PreviewImageFragment extends FileFragment {
          */
         private final WeakReference<TextView> mMessageViewRef;
 
-        
+
         /**
          * Weak reference to the target {@link ProgressBar} shown while the load is in progress.
          * 
@@ -385,17 +393,17 @@ public class PreviewImageFragment extends FileFragment {
          */
         private final WeakReference<ProgressBar> mProgressWheelRef;
 
-        
+
         /**
-         * Error message to show when a load fails 
+         * Error message to show when a load fails
          */
         private int mErrorMessageId;
-        
-        
+
+
         /**
          * Constructor.
-         * 
-         * @param imageView     Target {@link ImageView} where the bitmap will be loaded into.
+         *
+         * @param imageView Target {@link ImageView} where the bitmap will be loaded into.
          */
         public LoadBitmapTask(ImageViewCustom imageView, TextView messageView,
                               ProgressBar progressWheel) {
@@ -403,13 +411,13 @@ public class PreviewImageFragment extends FileFragment {
             mMessageViewRef = new WeakReference<TextView>(messageView);
             mProgressWheelRef = new WeakReference<ProgressBar>(progressWheel);
         }
-        
-        
+
         @Override
-        protected Bitmap doInBackground(String... params) {
+        protected LoadImage doInBackground(OCFile... params) {
             Bitmap result = null;
             if (params.length != 1) return null;
-            String storagePath = params[0];
+            OCFile ocFile = params[0];
+            String storagePath = ocFile.getStoragePath();
             try {
 
                 int maxDownScale = 3;   // could be a parameter passed to doInBackground(...)
@@ -422,7 +430,7 @@ public class PreviewImageFragment extends FileFragment {
                         result = BitmapUtils.decodeSampledBitmapFromFile(storagePath, minWidth,
                                 minHeight);
 
-                        if (isCancelled()) return result;
+                        if (isCancelled()) return new LoadImage(result, ocFile);
 
                         if (result == null) {
                             mErrorMessageId = R.string.preview_image_error_unknown_format;
@@ -454,48 +462,56 @@ public class PreviewImageFragment extends FileFragment {
 
             } catch (NoSuchFieldError e) {
                 mErrorMessageId = R.string.common_error_unknown;
-                Log_OC.e(TAG, "Error from access to unexisting field despite protection; file " 
-                                + storagePath, e);
-                    
+                Log_OC.e(TAG, "Error from access to unexisting field despite protection; file "
+                        + storagePath, e);
+
             } catch (Throwable t) {
                 mErrorMessageId = R.string.common_error_unknown;
                 Log_OC.e(TAG, "Unexpected error loading " + getFile().getStoragePath(), t);
-                
+
             }
-            
-            return result;
+
+            return new LoadImage(result, ocFile);
         }
-        
+
         @Override
-        protected void onCancelled(Bitmap result) {
-            if (result != null) {
-                result.recycle();
+        protected void onCancelled(LoadImage result) {
+            if (result.bitmap != null) {
+                result.bitmap.recycle();
             }
         }
 
         @Override
-        protected void onPostExecute(Bitmap result) {
+        protected void onPostExecute(LoadImage result) {
             hideProgressWheel();
-            if (result != null) {
+            if (result.bitmap != null) {
                 showLoadedImage(result);
-            } else {
+            }
+            else {
                 showErrorMessage();
             }
-            if (result != null && mBitmap != result)  {
+            if (result.bitmap != null && mBitmap != result.bitmap)  {
                 // unused bitmap, release it! (just in case)
-                result.recycle();
+                result.bitmap.recycle();
             }
         }
-        
+
         @SuppressLint("InlinedApi")
-        private void showLoadedImage(Bitmap result) {
+        private void showLoadedImage(LoadImage result) {
             final ImageViewCustom imageView = mImageViewRef.get();
+            Bitmap bitmap = result.bitmap;
             if (imageView != null) {
-                Log_OC.d(TAG, "Showing image with resolution " + result.getWidth() + "x" +
-                        result.getHeight());
-                imageView.setImageBitmap(result);
+                Log_OC.d(TAG, "Showing image with resolution " + bitmap.getWidth() + "x" +
+                        bitmap.getHeight());
+
+                if (result.ocFile.getMimetype().equalsIgnoreCase("image/png")){
+                    Drawable backrepeat = getResources().getDrawable(R.drawable.backrepeat);
+                    imageView.setBackground(backrepeat);
+                }
+
+                imageView.setImageBitmap(bitmap);
                 imageView.setVisibility(View.VISIBLE);
-                mBitmap  = result;  // needs to be kept for recycling when not useful
+                mBitmap  = bitmap;  // needs to be kept for recycling when not useful
             }
 
             final TextView messageView = mMessageViewRef.get();
@@ -503,7 +519,7 @@ public class PreviewImageFragment extends FileFragment {
                 messageView.setVisibility(View.GONE);
             } // else , silently finish, the fragment was destroyed
         }
-        
+
         private void showErrorMessage() {
             final ImageView imageView = mImageViewRef.get();
             if (imageView != null) {
@@ -517,14 +533,14 @@ public class PreviewImageFragment extends FileFragment {
                 messageView.setVisibility(View.VISIBLE);
             } // else , silently finish, the fragment was destroyed
         }
-        
+
         private void hideProgressWheel() {
             final ProgressBar progressWheel = mProgressWheelRef.get();
             if (progressWheel != null) {
                 progressWheel.setVisibility(View.GONE);
             }
         }
-        
+
     }
 
     /**
@@ -538,7 +554,7 @@ public class PreviewImageFragment extends FileFragment {
         return (file != null && file.isImage());
     }
 
-    
+
     /**
      * Finishes the preview
      */
@@ -546,9 +562,20 @@ public class PreviewImageFragment extends FileFragment {
         Activity container = getActivity();
         container.finish();
     }
-    
+
     public TouchImageViewCustom getImageView() {
         return mImageView;
     }
 
+    private class LoadImage {
+        private Bitmap bitmap;
+        private OCFile ocFile;
+
+        public LoadImage(Bitmap bitmap, OCFile ocFile){
+            this.bitmap = bitmap;
+            this.ocFile = ocFile;
+        }
+
+    }
+
 }

Some files were not shown because too many files changed in this diff