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

Merge pull request #326 from nextcloud/accountSwitcherOptimizations

Account switcher optimizations
Andy Scherzinger 8 жил өмнө
parent
commit
4e3d51799d
31 өөрчлөгдсөн 609 нэмэгдсэн , 1070 устгасан
  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;
 package com.owncloud.android.uiautomator;
 
 
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
 import android.content.Context;
 import android.content.Context;
 import android.content.Intent;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager;
@@ -36,6 +32,9 @@ import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.support.test.uiautomator.UiSelector;
 import android.support.test.uiautomator.UiSelector;
 import android.support.test.uiautomator.Until;
 import android.support.test.uiautomator.Until;
 
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
 
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertThat;
@@ -59,7 +58,6 @@ public class InitialTest {
     public void initializeDevice() {
     public void initializeDevice() {
         // Initialize UiDevice instance
         // Initialize UiDevice instance
         mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
         mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
-
     }
     }
 
 
     @Test
     @Test
@@ -114,7 +112,6 @@ public class InitialTest {
         context.startActivity(intent);
         context.startActivity(intent);
 
 
         clickByText(SETTINGS_DATA_USAGE_OPTION);
         clickByText(SETTINGS_DATA_USAGE_OPTION);
-
     }
     }
 
 
     /**
     /**
@@ -134,24 +131,26 @@ public class InitialTest {
     }
     }
 
 
     /**
     /**
-     * Helper to click on objects that match the content-description text
+     * Helper to click on objects that match the content-description text.
      *
      *
-     * @param text
+     * @param description the description
      * @throws UiObjectNotFoundException
      * @throws UiObjectNotFoundException
      */
      */
-    private void clickByDescription(String text) throws UiObjectNotFoundException {
-        UiObject obj = new UiObject(new UiSelector().description(text));
+    private void clickByDescription(String description) throws UiObjectNotFoundException {
+        UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+        UiObject obj = device.findObject(new UiSelector().description(description));
         obj.clickAndWaitForNewWindow();
         obj.clickAndWaitForNewWindow();
     }
     }
 
 
     /**
     /**
-     * Helper to click on object that match the text value
+     * Helper to click on object that match the text value.
      *
      *
-     * @param text
+     * @param text the text
      * @throws UiObjectNotFoundException
      * @throws UiObjectNotFoundException
      */
      */
     private void clickByText(String text) throws UiObjectNotFoundException {
     private void clickByText(String text) throws UiObjectNotFoundException {
-        UiObject obj = new UiObject(new UiSelector().text(text));
+        UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+        UiObject obj = device.findObject(new UiSelector().text(text));
         obj.clickAndWaitForNewWindow();
         obj.clickAndWaitForNewWindow();
     }
     }
 }
 }

+ 5 - 3
build.gradle

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

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

+ 93 - 36
res/layout/account_item.xml

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

+ 11 - 9
res/layout/accounts_layout.xml

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

+ 11 - 8
res/layout/drawer.xml

@@ -1,20 +1,23 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <!--
 <!--
-  ownCloud Android client application
+  Nextcloud Android client application
 
 
-  Copyright (C) 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,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
+  GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
 
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  You should have received a copy of the GNU Affero General Public
+  License along with this program. If not, see <http://www.gnu.org/licenses/>.
   -->
   -->
 <merge xmlns:android="http://schemas.android.com/apk/res/android"
 <merge xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        xmlns:app="http://schemas.android.com/apk/res-auto">

+ 11 - 8
res/layout/drawer_header.xml

@@ -1,20 +1,23 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <!--
 <!--
-  ownCloud Android client application
+  Nextcloud Android client application
 
 
-  Copyright (C) 2016 ownCloud Inc.
+  Copyright (C) 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,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
+  GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 
 
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  You should have received a copy of the GNU Affero General Public
+  License along with this program. If not, see <http://www.gnu.org/licenses/>.
   -->
   -->
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="match_parent"
               android:layout_width="match_parent"

+ 0 - 33
res/layout/file_actions.xml

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

+ 1 - 1
res/layout/list_item.xml

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

+ 2 - 2
res/layout/participate_layout.xml

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

+ 11 - 8
res/layout/toolbar_standard.xml

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

+ 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_primary_text_size">16sp</dimen>
     <dimen name="two_line_secondary_text_size">14sp</dimen>
     <dimen name="two_line_secondary_text_size">14sp</dimen>
     <dimen name="list_item_avatar_icon_margin">20dp</dimen>
     <dimen name="list_item_avatar_icon_margin">20dp</dimen>
-    <dimen name="list_item_avatar_text_margin">28dp</dimen>
+    <dimen name="list_item_avatar_text_margin">20dp</dimen>
     <dimen name="account_action_layout_height">72dp</dimen>
     <dimen name="account_action_layout_height">72dp</dimen>
     <dimen name="zero">0dp</dimen>
     <dimen name="zero">0dp</dimen>
     <dimen name="account_item_layout_height">72dp</dimen>
     <dimen name="account_item_layout_height">72dp</dimen>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+ 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);
+        }
+
+    }
+}