Browse Source

Merge pull request #326 from nextcloud/accountSwitcherOptimizations

Account switcher optimizations
Andy Scherzinger 8 years ago
parent
commit
4e3d51799d
31 changed files with 609 additions and 1070 deletions
  1. 12 13
      androidTest/java/com/owncloud/android/uiautomator/InitialTest.java
  2. 5 3
      build.gradle
  3. BIN
      res/drawable-hdpi/ic_account_circle_white_18dp.png
  4. BIN
      res/drawable-mdpi/ic_account_circle_white_18dp.png
  5. BIN
      res/drawable-xhdpi/ic_account_circle_white_18dp.png
  6. BIN
      res/drawable-xxhdpi/ic_account_circle_white_18dp.png
  7. BIN
      res/drawable-xxxhdpi/ic_account_circle_white_18dp.png
  8. 5 0
      res/drawable/round_bgnd.xml
  9. 10 8
      res/layout/account_action.xml
  10. 93 36
      res/layout/account_item.xml
  11. 11 9
      res/layout/accounts_layout.xml
  12. 11 8
      res/layout/drawer.xml
  13. 11 8
      res/layout/drawer_header.xml
  14. 0 33
      res/layout/file_actions.xml
  15. 1 1
      res/layout/list_item.xml
  16. 2 2
      res/layout/participate_layout.xml
  17. 11 8
      res/layout/toolbar_standard.xml
  18. 0 204
      res/values-de-rCH/strings.xml
  19. 0 8
      res/values-eu-rES/strings.xml
  20. 0 271
      res/values-eu/strings.xml
  21. 0 42
      res/values-fi/strings.xml
  22. 0 148
      res/values-ru-rRU/strings.xml
  23. 1 1
      res/values/dims.xml
  24. 19 5
      src/com/owncloud/android/ui/activity/BaseActivity.java
  25. 15 2
      src/com/owncloud/android/ui/activity/DrawerActivity.java
  26. 40 6
      src/com/owncloud/android/ui/activity/ManageAccountsActivity.java
  27. 96 51
      src/com/owncloud/android/ui/adapter/AccountListAdapter.java
  28. 0 147
      src/com/owncloud/android/ui/dialog/AccountActionsDialogFragment.java
  29. 1 2
      src/com/owncloud/android/ui/dialog/RemoveFileDialogFragment.java
  30. 174 54
      src/com/owncloud/android/ui/fragment/OCFileListFragment.java
  31. 91 0
      src/com/owncloud/android/ui/helpers/SparseBooleanArrayParcelable.java

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

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

+ 5 - 3
build.gradle

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

BIN
res/drawable-hdpi/ic_account_circle_white_18dp.png


BIN
res/drawable-mdpi/ic_account_circle_white_18dp.png


BIN
res/drawable-xhdpi/ic_account_circle_white_18dp.png


BIN
res/drawable-xxhdpi/ic_account_circle_white_18dp.png


BIN
res/drawable-xxxhdpi/ic_account_circle_white_18dp.png


+ 5 - 0
res/drawable/round_bgnd.xml

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

+ 10 - 8
res/layout/account_action.xml

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

+ 93 - 36
res/layout/account_item.xml

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

+ 11 - 9
res/layout/accounts_layout.xml

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

+ 11 - 8
res/layout/drawer.xml

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

+ 11 - 8
res/layout/drawer_header.xml

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

+ 0 - 33
res/layout/file_actions.xml

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

+ 1 - 1
res/layout/list_item.xml

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

+ 2 - 2
res/layout/participate_layout.xml

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

+ 11 - 8
res/layout/toolbar_standard.xml

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

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

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

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

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

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

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

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

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

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

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

+ 1 - 1
res/values/dims.xml

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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