language: android
android:
components:
- - platform-tools
- - tools
- - build-tools-20.0.0
+ - build-tools-22.0.1
- android-19
+ - android-16
before_install:
- rm pom.xml
script:
- ./setup_env.sh ant
- ant clean
- ant debug
-
+
<service android:name=".files.services.FileUploader" />
<service android:name=".media.MediaService" />
- <activity android:name=".ui.activity.PinCodeActivity" />
+ <activity android:name=".ui.activity.PassCodeActivity" />
<activity android:name=".ui.activity.ConflictsResolveActivity"/>
<activity android:name=".ui.activity.GenericExplanationActivity"/>
<activity android:name=".ui.activity.ErrorsWhileCopyingHandlerActivity"/>
-## 1.7.0 (19 February 2015)
+
+## 1.7.1 (April 2015)
+
+- Share link even with password enforced by server
+- Get the app ready for oc 8.1 servers
+- Added option to create new folder in uploads from external apps
+- Improved management of deleted users
+- Bugs fixed
+ + Fixed crash on Android 2.x devices
+ + Improvements on uploads
+
+## 1.7.0 (February 2015)
- Download full folders
- Grid view for images
- Settings view updated
- Improved subjects in e-mails
- Bugs fixed
-...
+
[agreement]: http://owncloud.org/about/contributor-agreement/
+### 1. Fork and download android/develop repository:
+
+NOTE: You must have the git installation folder in your environment variable PATH to perform the next operations.
+
+* In a web browser, go to https://github.com/owncloud/android, and click the 'Fork' button near the top right corner.
+* In a command line prompt, clone your new repo: ```git clone git@github.com:YOURGITHUBNAME/android.git```.
+* Move to the project folder with ```cd android```.
+* Checkout the remote branch 'develop' in your own local branch: ```git checkout -b develop remotes/origin/develop```.
+* Pull any changes from your remote branch 'develop': ```git pull origin develop```
+* Make official ownCloud repo known as upstream: ```git remote add upstream git@github.com:owncloud/android.git```
+* Make sure to get the latest changes from official android/develop branch: ```git pull upstream develop```
+
+
+### 7. Create pull request:
+
+NOTE: You must sign the [Contributor Agreement][1] before your changes can be accepted!
+
+* Commit your changes locally: "git commit -a"
+* Push your changes to your GitHub repo: "git push"
+* Browse to https://github.com/YOURGITHUBNAME/android/pulls and issue pull request
+* Click "Edit" and set "base:develop"
+* Again, click "Edit" and set "compare:develop"
+* Enter description and send pull request.
+
+### 8. Create another pull request:
+
+To make sure your new pull request does not contain commits which are already contained in previous PRs, create a new branch which is a clone of upstream/develop.
+
+* git fetch upstream
+* git checkout -b my_new_develop_branch upstream/develop
+* If you want to rename that branch later: "git checkout -b my_new_develop_branch_with_new_name"
+* Push branch to server: "git push -u origin name_of_local_develop_branch"
+* Use GitHub to issue PR
+
+
+
## Translations
Please submit translations via [Transifex][transifex].
[transifex]: https://www.transifex.com/projects/p/owncloud/
+
-If you want to start help developing ownCloud please follow the [contribution guidelines][0] and observe these instructions.
+These instructions will help you to set up your development environment, get the source code of the ownCloud for Android app and build it by yourself. If you want to help developing the app take a look to the [contribution guidelines][0].
-If you have any problems, start again with 1) and work your way down. If something still does not work as described here, please open a new issue describing exactly what you did, what happened, and what should have happened.
+Sections 1) and 2) are common for any environment. The rest of the sections describe how to set up a project in different tool environments. Choose the build tool or IDE you prefer and follow the instructions in its specific section. Nowadays we recommend to use Android Studio (section 2), but the decision is up to you.
-### 1. Fork and download android/develop repository:
+If you have any problem, remove the 'android' folder, start again from 1) and work your way down. If something still does not work as described here, please open a new issue describing exactly what you did, what happened, and what should have happened.
-NOTE: You must have git in your environment path variable to perform the next operations.
-* Navigate to https://github.com/owncloud/android, click fork.
-* Clone your new repo: "git clone git@github.com:YOURGITHUBNAME/android.git"
-* Move to the project folder with "cd android"
-* Checkout remote develop branch: "git checkout -b develop remotes/origin/develop"
-* Pull changes from your develop branch: "git pull origin develop"
-* Make official ownCloud repo known as upstream: "git remote add upstream git@github.com:owncloud/android.git"
-* Make sure to get the latest changes from official android/develop branch: "git pull upstream develop"
+### 0. Common software dependencies.
-At this point you can continue using different tools to build the project. Section 2, 3, 4, 5 and 6 describe some of the existing alternatives.
+There are some tools needed, no matter what is your specific IDE or build tool of preference.
-### 2. Building with Ant:
+[git][1] is used to access to the different versions of the ownCloud's source code. Download and install the version appropiate for your operating system from [here][2]. Add the full path to the 'bin/' directory from your git installation into the PATH variable of your environment so that it can be used from any location.
-NOTE: You must have the Android SDK 'tools/', and 'platforms-tools/' folders in your environment path variable.
+The [Android SDK][3] is necessary to build the app. There are different options to install it in your system, depending of the IDE you decide to use. Check Google documentation about [installation][4] for more details on these options. After installing it, add the full path to the directories 'tools/' and 'platform-tools/' from your Android SDK installation into the PATH variable of your environment.
-* Resolve necessary dependencies running:
- - Windows: "setup_env.bat ant"
- - Mac OS/Linux: "./setup_env.sh ant"
-* Run "ant clean".
-* Run "ant debug" to generate a debuggable version of the ownCloud app.
+Open a terminal and type 'android' to start the Android SDK Manager. To build the ownCloud for Android app you will need to install at least the next SDK packages:
-### 3. Building with console/maven:
+* Android SDK Tools and Android SDK Platform-tools (already installed); upgrade to their last versions is usually a good idea.
+* Android SDK Build-Tools; any version from 20 or later should work fine; avoid preview versions, if any available.
+* Android 4.4.2 (API 19), SDK Platform; needed to build the ownCloud app.
+* Android 4.1.2 (API 16), SDK Platform; needed to build the Android Support Library (not neeeded if working with Android Studio or gradle).
-NOTE: You must have mvn (version >= 3.1.1) in your environment path. Current Android 'platforms-tools' need to be installed.
+Install any other package you consider interesting, such as emulators.
-Download/install Android plugin for Maven, then build ownCloud with mvn:
+For other software dependencies check the details in the section corresponding to your preferred IDE or build system.
-* Resolve necessary dependencies running:
- - Windows: "setup_env.bat maven"
- - Mac OS/Linux: "./setup_env.sh maven"
-* cd ..
-* git clone https://github.com/mosabua/maven-android-sdk-deployer.git
-* cd maven-android-sdk-deployer
-* mvn -pl com.simpligility.android.sdk-deployer:android-19 -am install
-* cd ../android/owncloud-android-library
-* mvn install
-* cd ..
-Now you can create ownCloud APK using "mvn package" and find it as ownCloud.apk under the target
+### 1. Fork and download the owncloud/android repository.
+
+You will need [git][1] to access to the different versions of the ownCloud's source code. The source code is hosted in Github and may be read by anybody without needing a Github account. You will need a Github account if you want to contribute to the development of the app with your own code.
+
+Next steps will assume you have a Github account and that you will get the code from your own fork.
+
+* In a web browser, go to https://github.com/owncloud/android, and click the 'Fork' button near the top right corner.
+* Open a terminal and go on with the next steps in it.
+* Clone your forked repository: ```git clone git@github.com:YOURGITHUBNAME/android.git```.
+* Move to the project folder with ```cd android```.
+* Checkout the remote branch 'develop' in your own local branch 'develop': ```git checkout -b develop remotes/origin/develop```.
+* Pull any changes from your remote branch 'develop': ```git pull origin develop```
+* Make official ownCloud repo known as upstream: ```git remote add upstream git@github.com:owncloud/android.git```
+* Make sure to get the latest changes from official android/develop branch: ```git pull upstream develop```
+
+At this point you can continue using different tools to build the project. Section 2, 3, 4, 5 and 6 describe the existing alternatives.
+
+
+### 2. Working with Android Studio.
+
+[Android Studio][5] is currently the official Android IDE. Due to this, we recommend it as the IDE to use in your development environment. Follow the installation instructions [here][6].
+
+We recommend to use the last version available in the stable channel of Android Studio updates. See what update channel is your Android Studio checking for updates in the menu path 'Help'/'Check for Update...'/link 'Updates' in the dialog.
+
+To set up the project in Android Studio follow the next steps:
-### 4. Building with Gradle:
+* Complete the setup of project properties running:
+ - Windows: ```setup_env.bat gradle```
+ - Mac OS/Linux: ```./setup_env.sh gradle```
+* Open Android Studio and select 'Import Project (Eclipse ADT, Gradle, etc)'. Browse through your file system to the folder 'android' where the project is located. Android Studio will then create the '.iml' files it needs. If you ever close the project but the files are still there, you just select 'Open Project...'. The file chooser will show an Android face as the folder icon, which you can select to reopen the project.
+* Android Studio will try to build the project directly after importing it. To build it manually, follow the menu path 'Build'/'Make Project', or just click the 'Play' button in the tool bar to build and run it in a mobile device or an emulator. The resulting APK file will be saved in the 'build/outputs/apk/' subdirectory in the project folder.
+
+
+### 3. Working in a terminal with Gradle:
+[Gradle][7] is the build system used by Android Studio to manage the building operations on Android apps. You do not need to install Gradle in your system, and Google recommends not to do it, but instead trusting on the Graddle wrapper included in the project [8].
+
+* Open a terminal and go to the 'android' directory that contains the repository.
* Complete the setup of project properties running:
- - Windows: "setup_env.bat gradle"
- - Mac OS/Linux: "./setup_env.sh gradle"
-* Open a terminal and go to the "android" directory that contains the repository.
-* Run the 'clean' and 'build' tasks using the Gradle wrapper provided:
- - Windows: gradlew.bat clean build
- - Mac OS/Linux: ./gradlew clean build
-* You can find the generated apk file in android/build/outputs/apk
+ - Windows: ```setup_env.bat gradle```
+ - Mac OS/Linux: ```./setup_env.sh gradle```
+* Run the 'clean' and 'build' tasks using the Gradle wrapper provided
+ - Windows: ```gradlew.bat clean build```
+ - Mac OS/Linux: ```./gradlew clean build```
+
+The first time the Gradle wrapper is called, the correct Gradle version will be downloaded automatically. An Internet connection is needed for it works.
+
+The generated APK file is saved in android/build/outputs/apk as android-debug.apk
+
-### 5. Building with Eclipse:
+### 4. Building with Eclipse:
-NOTE: You must have the Android SDK 'tools/', and 'platforms-tools/' folders in your environment path variable.
+[Eclipse][9] is still an option to work with Android apps, although the [ADT Plugin][10] needed is not in active development anymore. Next steps have been tested in Eclipse Luna.
+* Open a terminal and go to the 'android' directory that contains the repository.
* Resolve necessary dependencies running:
- - Windows: "setup_env.bat ant"
- - Mac OS/Linux: "./setup_env.sh ant"
- * Open Eclipse and create new "Android Project from Existing Code". Choose android/actionbarsherlock/library as root.
-* Clean project and compile.
-* If any error appears, check the project properties; in the 'Android' section, API Level should be greater or equal than 14.
-* Make sure android/actionbarsherlock/library/bin/library.jar was created.
-* Create a new "Android Project from Existing Code". Choose android/owncloud-android-library as root.
-* Clean project and compile.
-* If any error appears, check the project properties; in the 'Android' section, API Level should be 19 or greater.
-* Make sure android/owncloud-android-library/bin/classes.jar was created.
-* Import ownCloud Android project.
-* Clean project and compile.
-* If any error appears, check the project properties of owncloud-android project; in the 'Android' section:
- - API Level should be 19 or greater.
- - Two library projects should appear referred in the bottom square: actionbarsherlock/library and owncloud-android-library. Add them if needed.
+ - Windows: ```setup_env.bat ant```
+ - Mac OS/Linux: ```./setup_env.sh ant```
+* Open Eclipse and follow the menu path 'File'/'New'/'Project'
+* Choose the option 'Android'/'Android Project from Existing Code' and click 'Next'
+* Choose 'android/' folder as root
+* Choose the projects with the next names under the 'New Project Name' column:
+** owncloud-android
+** android-support-appcompat-v7-exploded-aar
+** owncloud-android-workaround-accounts (optional)
+** ownCloud Android Library
+** ownCloud Sample Client (optional)
+** ownCloud Android library test project (optional)
+** ownCloud Android library test cases (optional)
+* Do not choose the project owncloud-android-tests; it's obsolete.
+* Do not enable 'Copy projects into workspace'.
+* Click the 'Finish' button.
+* Wait for a while; if 'Build automatically' is enabled in Eclipse, some errors could appear during the creation of the projects, but all of them should finally disappear.
+* If any error persists, clean and build manually the next projects in order:
+** ownCloud Android Library
+** android-support-appcompat-v7-exploded-aar
+** owncloud-android
+* If any error on those projects persists, check the project properties. In the 'Android' section, API Level should be
+** ownCloud Android Library -> API level 19
+** android-support-appcompat-v7-exploded-aa -> API level 16
+** owncloud-android -> API level 19 ; in this project, two library projects should appear referred in the bottom of the dialog: libs\android-support-appcompat-v7-exploded-aar and owncloud-android-library. Add them if needed.
* After those actions you should be good to go. HAVE FUN!
-NOTE: Even though API level is set to 19, APK also runs on older devices because in AndroidManifest.xml minSdkVersion is set to 8.
-### 6. Building with Android Studio:
+### 5. Building in command line with Ant:
-* Complete the setup of project properties running:
- - Windows: "setup_env.bat gradle"
- - Mac OS/Linux: "./setup_env.sh gradle"
-* The first time you want to open the project in Android Studio, select 'Import Project...' and choose the file "android/settings.gradle".
- Android Studio will then create the '.iml' files it needs. If you ever close the project but the files are still there, you just select
- 'Open Project...'. The file chooser will show an Android face as the folder icon, which you can select to reopen the project.
-* To build the project, follow the guidelines shown on [4. Building with Gradle][2].
+[Ant][10] can be used to build the ownCloud for Android app in a terminal. Be sure that the PATH variable in your environment contains the full path to the 'bin/' subdirectory in your Ant installation. Define also an ANDROID_HOME variable in your environment with the full path to your Android SDK (see section 1). Then follow the next steps:
+
+* Open a terminal and go to the 'android' directory that contains the repository.
+* Resolve necessary dependencies running:
+ - Windows: ```setup_env.bat ant```
+ - Mac OS/Linux: ```./setup_env.sh ant```
+* Run ```ant clean```.
+* Run ```ant debug``` to generate a debuggable version of the ownCloud app.
+
+The resulting APKs will be saved in the 'bin/' subdirectory of the project.
-### 7. Create pull request:
-NOTE: You must sign the [Contributor Agreement][1] before your changes can be accepted!
+### 6. Building in command line with maven:
-* Commit your changes locally: "git commit -a"
-* Push your changes to your GitHub repo: "git push"
-* Browse to https://github.com/YOURGITHUBNAME/android/pulls and issue pull request
-* Click "Edit" and set "base:develop"
-* Again, click "Edit" and set "compare:develop"
-* Enter description and send pull request.
+** Currently these build instructions DO NOT WORK. There is no estimation time to fix it. Unless some volunteer contributor fixes this build option, and given that Maven is a minority option in Android environments, we will probably remove this option.
-### 8. Create another pull request:
+NOTE: You must have mvn (version >= 3.1.1) in your environment path. Current Android 'platforms-tools' need to be installed.
-To make sure your new pull request does not contain commits which are already contained in previous PRs, create a new branch which is a clone of upstream/develop.
+Download/install Android plugin for Maven, then build ownCloud with mvn:
-* git fetch upstream
-* git checkout -b my_new_develop_branch upstream/develop
-* If you want to rename that branch later: "git checkout -b my_new_develop_branch_with_new_name"
-* Push branch to server: "git push -u origin name_of_local_develop_branch"
-* Use GitHub to issue PR
+* Resolve necessary dependencies running:
+ - Windows: "setup_env.bat maven"
+ - Mac OS/Linux: "./setup_env.sh maven"
+
+* cd ..
+* git clone https://github.com/mosabua/maven-android-sdk-deployer.git
+* cd maven-android-sdk-deployer
+* mvn -pl com.simpligility.android.sdk-deployer:android-19 -am install
+* cd ../android/owncloud-android-library
+* mvn install
+* cd ..
+
+Now you can create ownCloud APK using "mvn package" and find it as ownCloud.apk under the target
[0]: https://github.com/owncloud/android/blob/master/CONTRIBUTING.md
-[1]: http://owncloud.org/about/contributor-agreement/
-[2]: https://github.com/owncloud/android/blob/master/SETUP.md#4-building-with-gradle
+[1]: https://git-scm.com/
+[2]: https://git-scm.com/downloads
+[3]: https://developer.android.com/sdk/index.html
+[4]: https://developer.android.com/sdk/installing/index.html
+[5]: https://developer.android.com/tools/studio/index.html
+[6]: https://developer.android.com/sdk/installing/index.html?pkg=studio
+[7]: https://gradle.org/
+[8]: https://docs.gradle.org/current/userguide/gradle_wrapper.html
+[9]: https://eclipse.org/
+[10]: http://developer.android.com/sdk/installing/installing-adt.html
Used as a helper tool, not included in the ownCloud client APK.
Original license document included at third_party/transifex-client/LICENSE.
See http://help.transifex.com/features/client/
-
- * ActionBarSherlock, master branch.
- Copyright (C) 2012 Jake Wharton.
- Licensed under Apache License, Version 2.0.
- The official repository is linked as a submodule in the
- ownCloud/android repository.
- A binary JAR file must be generated from this linked project
- and included in the ownCloud client APK.
- See http://http://actionbarsherlock.com/
* TouchImageView, commit 6dbeac4f11936185ba374c73144ac431c23c9aab
Copyright (c) 2012 Michael Ortiz
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/classes" path="src/main/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="src" path="resources"/>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
--- /dev/null
+
+target/
+ScreenShots/
+.DS_Store
+Users/
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>androidtest</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.m2e.core.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.m2e.core.maven2Nature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.7
--- /dev/null
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
--- /dev/null
+** Work in progress
+
+This project contains a set of automatic tests operating in the UI level.
+
+Tests are to be run with the tool Appium. Check [here][0] to install it and all its dependencies (including Maven).
+
+You will need to modify the constants in automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/Config.java to assign appropiate values for your test server and accounts.
+You will need to include the ownCloud.apk to test in automationTest/src/test/resources/.
+
+To run the tests from command line, plug a device to your computer or start and emulator. Then type
+
+mvn clean tests
+
+To run only one category of the test
+
+mvn clean -Dtest=RunSmokeTests test
+
+The project may also be imported in Eclipse, with the appropiate plug-ins, and run from it.
+
+[0]: http://appium.io/slate/en/master/?java#about-appium
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<modelVersion>4.0.0</modelVersion>
+
+<groupId>com.owncloud</groupId>
+<artifactId>androidtest</artifactId>
+<version>1.0-SNAPSHOT</version>
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.18.1</version>
+ <configuration>
+ <includes>
+ <include>**/*Test**.java</include>
+ </includes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.3</version>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+<dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.11</version>
+ </dependency>
+ <dependency>
+ <groupId>org.seleniumhq.selenium</groupId>
+ <artifactId>selenium-java</artifactId>
+ <version>2.45.0</version>
+ </dependency>
+ <dependency>
+ <groupId>io.selendroid</groupId>
+ <version>0.9.0</version>
+ <artifactId>selendroid-standalone</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.selendroid</groupId>
+ <version>0.9.0</version>
+ <artifactId>selendroid-client</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.appium</groupId>
+ <artifactId>java-client</artifactId>
+ <version>2.2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>4.3.1</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.android</groupId>
+ <artifactId>android</artifactId>
+ <version>4.1.1.4</version>
+ <scope>provided</scope>
+ </dependency>
+</dependencies>
+</project>
\ No newline at end of file
--- /dev/null
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.actions;
+
+import java.util.HashMap;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.NoSuchElementException;
+import org.openqa.selenium.ScreenOrientation;
+import org.openqa.selenium.remote.RemoteWebElement;
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import com.owncloud.android.test.ui.models.CertificatePopUp;
+import com.owncloud.android.test.ui.models.ElementMenuOptions;
+import com.owncloud.android.test.ui.models.GmailSendMailView;
+import com.owncloud.android.test.ui.models.ShareView;
+import com.owncloud.android.test.ui.models.UploadFilesView;
+import com.owncloud.android.test.ui.models.LoginForm;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.MenuList;
+import com.owncloud.android.test.ui.models.NewFolderPopUp;
+import com.owncloud.android.test.ui.models.RemoveConfirmationView;
+import com.owncloud.android.test.ui.models.SettingsView;
+import com.owncloud.android.test.ui.models.WaitAMomentPopUp;
+import com.owncloud.android.test.ui.testSuites.Common;
+import com.owncloud.android.test.ui.testSuites.Config;
+
+public class Actions {
+
+ public static FileListView login(String url, String user, String password,
+ Boolean isTrusted, AndroidDriver driver)
+ throws InterruptedException {
+ LoginForm loginForm = new LoginForm(driver);
+ CertificatePopUp certificatePopUp = loginForm.typeHostUrl(url);
+ if(!isTrusted){
+ WebDriverWait wait = new WebDriverWait(driver, 30);
+ //sometimes the certificate has been already accept
+ //and it doesn't appear again
+ try {
+ wait.until(ExpectedConditions
+ .visibilityOf(certificatePopUp.getOkButtonElement()));
+ //we need to repaint the screen
+ //because of some element are misplaced
+ driver.rotate(ScreenOrientation.LANDSCAPE);
+ driver.rotate(ScreenOrientation.PORTRAIT);
+ certificatePopUp.clickOnOkButton();
+ }catch (NoSuchElementException e) {
+
+ }
+
+ }
+ loginForm.typeUserName(user);
+ loginForm.typePassword(password);
+ //TODO. Assert related to check the connection?
+ return loginForm.clickOnConnectButton();
+ }
+
+ public static WaitAMomentPopUp createFolder(String folderName,
+ FileListView fileListView){
+ NewFolderPopUp newFolderPopUp = fileListView.clickOnNewFolderButton();
+ newFolderPopUp.typeNewFolderName(folderName);
+ WaitAMomentPopUp waitAMomentPopUp = newFolderPopUp
+ .clickOnNewFolderOkButton();
+ //TODO. assert here
+ return waitAMomentPopUp;
+ }
+
+
+ public static AndroidElement scrollTillFindElement (String elementName,
+ AndroidElement element, AndroidDriver driver) {
+ AndroidElement fileElement;
+
+ if(element.getAttribute("scrollable").equals("true")){
+ HashMap<String, String> scrollObject = new HashMap<String,String>();
+ scrollObject.put("text", elementName);
+ scrollObject.put("element", ( (RemoteWebElement) element).getId());
+ driver.executeScript("mobile: scrollTo", scrollObject);
+ }
+ try {
+ fileElement = (AndroidElement) driver
+ .findElementByName(elementName);
+ } catch (NoSuchElementException e) {
+ fileElement = null;
+ }
+ return fileElement;
+ }
+
+
+ public static void deleteAccount (int accountPosition,FileListView fileListView) {
+ MenuList menulist = fileListView.clickOnMenuButton();
+ SettingsView settingView = menulist.clickOnSettingsButton();
+ deleteAccount(accountPosition,settingView);
+ }
+
+ public static void deleteAccount (int accountPosition, SettingsView settingsView) {
+ settingsView.tapOnAccountElement(accountPosition,1, 1000);
+ settingsView.clickOnDeleteAccountElement();
+ }
+
+ public static void clickOnMainLayout(AndroidDriver driver){
+ driver.tap(1, 0, 0, 1);
+ }
+
+
+ public static AndroidElement deleteElement(String elementName,
+ FileListView fileListView, AndroidDriver driver) throws Exception{
+ AndroidElement fileElement;
+ WaitAMomentPopUp waitAMomentPopUp;
+ try{
+ //To open directly the "file list view" and
+ //we don't need to know in which view we are
+ driver.startActivity("com.owncloud.android",
+ ".ui.activity.FileDisplayActivity");
+ fileElement = (AndroidElement) driver
+ .findElementByName(elementName);
+ ElementMenuOptions menuOptions = fileListView
+ .longPressOnElement(elementName);
+ RemoveConfirmationView removeConfirmationView = menuOptions
+ .clickOnRemove();;
+ waitAMomentPopUp = removeConfirmationView
+ .clickOnRemoteAndLocalButton();
+ Common.waitTillElementIsNotPresent(
+ waitAMomentPopUp.getWaitAMomentTextElement(), 100);
+ }catch(NoSuchElementException e){
+ fileElement=null;
+ }
+ return fileElement;
+ }
+
+ public static AndroidElement shareLinkElementByGmail(String elementName,
+ FileListView fileListView, AndroidDriver driver, Common common)
+ throws Exception{
+ try{
+ //To open directly the "file list view" and
+ //we don't need to know in which view we are
+ driver.startActivity("com.owncloud.android",
+ ".ui.activity.FileDisplayActivity");
+ ElementMenuOptions menuOptions = fileListView
+ .longPressOnElement(elementName);
+ ShareView shareView = menuOptions.clickOnShareLinkElement();
+ Actions.scrollTillFindElement("Gmail", shareView
+ .getListViewLayout(), driver).click();
+ GmailSendMailView gmailSendMailView = new GmailSendMailView(driver);
+ gmailSendMailView.typeToEmailAdress(Config.gmailAccount);
+ gmailSendMailView.clickOnSendButton();
+ Common.waitTillElementIsNotPresentWithoutTimeout(fileListView
+ .getProgressCircular(), 1000);
+ common.wait.until(ExpectedConditions.visibilityOf(
+ fileListView.getFileElementLayout()
+ .findElement(By.id(FileListView
+ .getSharedElementIndicator()))));
+
+ }catch(NoSuchElementException e){
+ return null;
+ }
+ return (AndroidElement) fileListView.getFileElementLayout()
+ .findElement(By.id(FileListView.getSharedElementIndicator()));
+ }
+
+ public static AndroidElement shareLinkElementByCopyLink(String elementName,
+ FileListView fileListView, AndroidDriver driver, Common common)
+ throws Exception{
+ try{
+ //To open directly the "file list view" and
+ //we don't need to know in which view we are
+ driver.startActivity("com.owncloud.android",
+ ".ui.activity.FileDisplayActivity");
+ ElementMenuOptions menuOptions = fileListView
+ .longPressOnElement(elementName);
+ ShareView shareView = menuOptions.clickOnShareLinkElement();
+ Actions.scrollTillFindElement("Copy link", shareView.getListViewLayout(),
+ driver).click();
+ WaitAMomentPopUp waitAMomentPopUp = new WaitAMomentPopUp(driver);
+ Common.waitTillElementIsNotPresentWithoutTimeout(waitAMomentPopUp
+ .getWaitAMomentTextElement(), 100);
+ common.wait.until(ExpectedConditions.visibilityOf(
+ fileListView.getFileElementLayout()
+ .findElement(By.id(FileListView.getSharedElementIndicator()))));
+ }catch(NoSuchElementException e){
+ return null;
+ }
+ return (AndroidElement) fileListView.getFileElementLayout()
+ .findElement(By.id(FileListView.getSharedElementIndicator()));
+ }
+
+
+ public static void unshareLinkElement(String elementName,
+ FileListView fileListView, AndroidDriver driver, Common common)
+ throws Exception{
+ try{
+ //To open directly the "file list view" and
+ //we don't need to know in which view we are
+ driver.startActivity("com.owncloud.android",
+ ".ui.activity.FileDisplayActivity");
+ ElementMenuOptions menuOptions = fileListView
+ .longPressOnElement(elementName);
+ WaitAMomentPopUp waitAMomentPopUp = menuOptions
+ .clickOnUnshareLinkElement();
+ Common.waitTillElementIsNotPresentWithoutTimeout(waitAMomentPopUp
+ .getWaitAMomentTextElement(), 100);
+ Common.waitTillElementIsNotPresent((AndroidElement) fileListView
+ .getFileElementLayout()
+ .findElement(By.id(FileListView.getSharedElementIndicator())
+ ),100);
+ }catch(NoSuchElementException e){
+
+ }
+ }
+
+
+ public static FileListView uploadFile(String elementName,
+ FileListView fileListView) throws InterruptedException{
+ fileListView.clickOnUploadButton();
+ UploadFilesView uploadFilesView = fileListView
+ .clickOnFilesElementUploadFile();
+ uploadFilesView.clickOnFileName(elementName);
+ FileListView fileListViewAfterUploadFile = uploadFilesView
+ .clickOnUploadButton();
+ //TO DO. detect when the file is successfully uploaded
+ Thread.sleep(15000);
+ return fileListViewAfterUploadFile;
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.test.ui.groups;
+
+public interface FailingTestCategory extends IgnoreTestCategory {}
--- /dev/null
+package com.owncloud.android.test.ui.groups;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import org.junit.Test;
+import org.junit.experimental.categories.Categories.CategoryFilter;
+import org.junit.experimental.categories.Categories.ExcludeCategory;
+import org.junit.experimental.categories.Categories.IncludeCategory;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.Description;
+import org.junit.runner.manipulation.NoTestsRemainException;
+import org.junit.runners.Suite;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.RunnerBuilder;
+
+/**
+ * This class is based on org.junit.experimental.categories.Categories from JUnit 4.10.
+ *
+ * All anotations and inner classes from the original class Categories are removed,
+ * since they will be re-used.
+ * Unfortunately sub-classing Categories did not work.
+ */
+public class FlexibleCategories extends Suite {
+
+ /**
+ * Specifies the package which should be scanned for test classes (e.g. @TestScanPackage("my.package")).
+ * This annotation is required.
+ */
+ @Retention(RetentionPolicy.RUNTIME)
+ public @interface TestScanPackage {
+ public String value();
+ }
+
+ /**
+ * Specifies the prefix of matching class names (e.g. @TestClassPrefix("Test")).
+ * This annotation is optional (default: "").
+ */
+ @Retention(RetentionPolicy.RUNTIME)
+ public @interface TestClassPrefix {
+ public String value();
+ }
+
+ /**
+ * Specifies the suffix of matching class names (e.g. @TestClassSuffix("Test")).
+ * This annotation is optional (default: "Test").
+ */
+ @Retention(RetentionPolicy.RUNTIME)
+ public @interface TestClassSuffix {
+ public String value();
+ }
+
+ /**
+ * Specifies an annotation for methods which must be present in a matching class (e.g. @TestMethodAnnotationFilter(Test.class)).
+ * This annotation is optional (default: org.junit.Test.class).
+ */
+ @Retention(RetentionPolicy.RUNTIME)
+ public @interface TestMethodAnnotation {
+ public Class<? extends Annotation> value();
+ }
+
+ public FlexibleCategories(Class<?> clazz, RunnerBuilder builder)
+ throws InitializationError {
+ this(builder, clazz, PatternClasspathClassesFinder.getSuiteClasses(
+ getTestScanPackage(clazz), getTestClassPrefix(clazz), getTestClassSuffix(clazz),
+ getTestMethodAnnotation(clazz)));
+ try {
+ filter(new CategoryFilter(getIncludedCategory(clazz),
+ getExcludedCategory(clazz)));
+ } catch (NoTestsRemainException e) {
+ // Ignore all classes with no matching tests.
+ }
+ assertNoCategorizedDescendentsOfUncategorizeableParents(getDescription());
+ }
+
+ public FlexibleCategories(RunnerBuilder builder, Class<?> clazz,
+ Class<?>[] suiteClasses) throws InitializationError {
+ super(builder, clazz, suiteClasses);
+ }
+
+ private static String getTestScanPackage(Class<?> clazz) throws InitializationError {
+ TestScanPackage annotation = clazz.getAnnotation(TestScanPackage.class);
+ if (annotation == null) {
+ throw new InitializationError("No package given to scan for tests!\nUse the annotation @TestScanPackage(\"my.package\") on the test suite " + clazz + ".");
+ }
+ return annotation.value();
+ }
+
+ private static String getTestClassPrefix(Class<?> clazz) {
+ TestClassPrefix annotation = clazz.getAnnotation(TestClassPrefix.class);
+ return annotation == null ? "" : annotation.value();
+ }
+
+ private static String getTestClassSuffix(Class<?> clazz) {
+ TestClassSuffix annotation = clazz.getAnnotation(TestClassSuffix.class);
+ return annotation == null ? "Test" : annotation.value();
+ }
+
+ private static Class<? extends Annotation> getTestMethodAnnotation(Class<?> clazz) {
+ TestMethodAnnotation annotation = clazz.getAnnotation(TestMethodAnnotation.class);
+ return annotation == null ? Test.class : annotation.value();
+ }
+
+ private Class<?> getIncludedCategory(Class<?> clazz) {
+ IncludeCategory annotation= clazz.getAnnotation(IncludeCategory.class);
+ return annotation == null ? null : annotation.value();
+ }
+
+ private Class<?> getExcludedCategory(Class<?> clazz) {
+ ExcludeCategory annotation= clazz.getAnnotation(ExcludeCategory.class);
+ return annotation == null ? null : annotation.value();
+ }
+
+ private void assertNoCategorizedDescendentsOfUncategorizeableParents(Description description) throws InitializationError {
+ if (!canHaveCategorizedChildren(description))
+ assertNoDescendantsHaveCategoryAnnotations(description);
+ for (Description each : description.getChildren())
+ assertNoCategorizedDescendentsOfUncategorizeableParents(each);
+ }
+
+ private void assertNoDescendantsHaveCategoryAnnotations(Description description) throws InitializationError {
+ for (Description each : description.getChildren()) {
+ if (each.getAnnotation(Category.class) != null)
+ throw new InitializationError("Category annotations on Parameterized classes are not supported on individual methods.");
+ assertNoDescendantsHaveCategoryAnnotations(each);
+ }
+ }
+
+ // If children have names like [0], our current magical category code can't determine their
+ // parentage.
+ private static boolean canHaveCategorizedChildren(Description description) {
+ for (Description each : description.getChildren())
+ if (each.getTestClass() == null)
+ return false;
+ return true;
+ }
+}
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.groups;
+
+public interface IgnoreTestCategory {}
+
--- /dev/null
+package com.owncloud.android.test.ui.groups;
+
+public interface InProgressCategory extends IgnoreTestCategory{
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.groups;
+
+public interface NoIgnoreTestCategory {
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.groups;
+
+public interface OtherTestCategory extends IgnoreTestCategory {}
--- /dev/null
+package com.owncloud.android.test.ui.groups;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+/**
+ *
+ * Modified version of ClasspathClassesFinder from:
+ * http://linsolas.free.fr/wordpress/index.php/2011/02/how-to-categorize-junit-tests-with-maven/
+ *
+ * The difference is, that it does not search for annotated classes but for classes with a certain
+ * class name prefix and suffix.
+ */
+public final class PatternClasspathClassesFinder {
+
+ /**
+ * Get the list of classes of a given package name, and that are annotated
+ * by a given annotation.
+ *
+ * @param packageName
+ * The package name of the classes.
+ * @param classPrefix
+ * The prefix of the class name.
+ * @param classSuffix
+ * The suffix of the class name.
+ * @param methodAnnotation
+ * Only return classes containing methods annotated with methodAnnotation.
+ * @return The List of classes that matches the requirements.
+ */
+ public static Class<?>[] getSuiteClasses(String packageName,
+ String classPrefix, String classSuffix,
+ Class<? extends Annotation> methodAnnotation) {
+ try {
+ return getClasses(packageName, classPrefix, classSuffix, methodAnnotation);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * Get the list of classes of a given package name, and that are annotated
+ * by a given annotation.
+ *
+ * @param packageName
+ * The package name of the classes.
+ * @param classPrefix
+ * The prefix of the class name.
+ * @param classSuffix
+ * The suffix of the class name.
+ * @param methodAnnotation
+ * Only return classes containing methods annotated with methodAnnotation.
+ * @return The List of classes that matches the requirements.
+ * @throws ClassNotFoundException
+ * If something goes wrong...
+ * @throws IOException
+ * If something goes wrong...
+ */
+ private static Class<?>[] getClasses(String packageName,
+ String classPrefix, String classSuffix,
+ Class<? extends Annotation> methodAnnotation)
+ throws ClassNotFoundException, IOException {
+ ClassLoader classLoader = Thread.currentThread()
+ .getContextClassLoader();
+ String path = packageName.replace('.', '/');
+ // Get classpath
+ Enumeration<URL> resources = classLoader.getResources(path);
+ List<File> dirs = new ArrayList<File>();
+ while (resources.hasMoreElements()) {
+ URL resource = resources.nextElement();
+ dirs.add(new File(resource.getFile()));
+ }
+ // For each classpath, get the classes.
+ ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
+ for (File directory : dirs) {
+ classes.addAll(findClasses(directory, packageName, classPrefix, classSuffix, methodAnnotation));
+ }
+ return classes.toArray(new Class[classes.size()]);
+ }
+
+ /**
+ * Find classes, in a given directory (recursively), for a given package
+ * name, that are annotated by a given annotation.
+ *
+ * @param directory
+ * The directory where to look for.
+ * @param packageName
+ * The package name of the classes.
+ * @param classPrefix
+ * The prefix of the class name.
+ * @param classSuffix
+ * The suffix of the class name.
+ * @param methodAnnotation
+ * Only return classes containing methods annotated with methodAnnotation.
+ * @return The List of classes that matches the requirements.
+ * @throws ClassNotFoundException
+ * If something goes wrong...
+ */
+ private static List<Class<?>> findClasses(File directory,
+ String packageName, String classPrefix, String classSuffix,
+ Class<? extends Annotation> methodAnnotation)
+ throws ClassNotFoundException {
+ List<Class<?>> classes = new ArrayList<Class<?>>();
+ if (!directory.exists()) {
+ return classes;
+ }
+ File[] files = directory.listFiles();
+ for (File file : files) {
+ if (file.isDirectory()) {
+ classes.addAll(findClasses(file,
+ packageName + "." + file.getName(), classPrefix, classSuffix, methodAnnotation));
+ } else if (file.getName().startsWith(classPrefix) && file.getName().endsWith(classSuffix + ".class")) {
+ // We remove the .class at the end of the filename to get the
+ // class name...
+ Class<?> clazz = Class.forName(packageName
+ + '.'
+ + file.getName().substring(0,
+ file.getName().length() - 6));
+
+ // Check, if class contains test methods (prevent "No runnable methods" exception):
+ boolean classHasTest = false;
+ for (Method method : clazz.getMethods()) {
+ if (method.getAnnotation(methodAnnotation) != null) {
+ classHasTest = true;
+ break;
+ }
+ }
+ if (classHasTest) {
+ classes.add(clazz);
+ }
+ }
+ }
+ return classes;
+ }
+}
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.groups;
+
+public interface SmokeTestCategory {
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.groups;
+
+public interface UnfinishedTestCategory extends IgnoreTestCategory{
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.PageFactory;
+
+public class CertificatePopUp {
+ final AndroidDriver driver;
+
+ @AndroidFindBy(name = "OK")
+ private AndroidElement okButton;
+
+ public CertificatePopUp (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public void clickOnOkButton () {
+ okButton.click();
+ }
+
+ public AndroidElement getOkButtonElement () {
+ return okButton;
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.PageFactory;
+
+public class ElementMenuOptions {
+
+ final AndroidDriver driver;
+
+ @AndroidFindBy(name = "Share link")
+ private AndroidElement shareLinkElement;
+
+ @AndroidFindBy(name = "Unshare link")
+ private AndroidElement unshareLinkElement;
+
+ @AndroidFindBy(name = "Details")
+ private AndroidElement detailsFileElement;
+
+ @AndroidFindBy(name = "Rename")
+ private AndroidElement renameFileElement;
+
+ @AndroidFindBy(name = "Remove")
+ private AndroidElement removeFileElement;
+
+ @AndroidFindBy(name = "Move")
+ private AndroidElement moveElement;
+
+ public ElementMenuOptions (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public FileDetailsView clickOnDetails () {
+ detailsFileElement.click();
+ FileDetailsView fileDetailsView = new FileDetailsView(driver);
+ return fileDetailsView;
+ }
+
+ public RemoveConfirmationView clickOnRemove () {
+ removeFileElement.click();
+ RemoveConfirmationView removeConfirmationView =
+ new RemoveConfirmationView(driver);
+ return removeConfirmationView;
+ }
+
+
+ public MoveView clickOnMove () {
+ moveElement.click();
+ MoveView moveView = new MoveView(driver);
+ return moveView;
+ }
+
+ public NewFolderPopUp clickOnRename () {
+ renameFileElement.click();
+ NewFolderPopUp newFolderPopUp = new NewFolderPopUp(driver);
+ return newFolderPopUp;
+ }
+
+ public ShareView clickOnShareLinkElement () {
+ shareLinkElement.click();
+ ShareView shareView = new ShareView(driver);
+ return shareView;
+ }
+
+ public WaitAMomentPopUp clickOnUnshareLinkElement () {
+ unshareLinkElement.click();
+ WaitAMomentPopUp waitAMomentPopUp = new WaitAMomentPopUp(driver);
+ return waitAMomentPopUp;
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.PageFactory;
+
+public class FileDetailsView {
+ final AndroidDriver driver;
+
+ @CacheLookup
+ @AndroidFindBy(name = "Keep file up to date")
+ private AndroidElement keepFileUpToDateCheckbox;
+
+ @AndroidFindBy(id = "com.owncloud.android:id/fdProgressBar")
+ private AndroidElement progressBar;
+
+ public FileDetailsView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public void checkKeepFileUpToDateCheckbox () {
+ if(keepFileUpToDateCheckbox.getAttribute("checked").equals("false")){
+ keepFileUpToDateCheckbox.click();
+ }
+ }
+
+ public void unCheckKeepFileUpToDateCheckbox () {
+ if(keepFileUpToDateCheckbox.getAttribute("checked").equals("true")){
+ keepFileUpToDateCheckbox.click();
+ }
+ }
+
+ public AndroidElement getProgressBar (){
+ return progressBar;
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import java.util.List;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.android.AndroidKeyCode;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.NoSuchElementException;
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.PageFactory;
+import org.openqa.selenium.Point;
+
+import com.owncloud.android.test.ui.actions.Actions;
+
+public class FileListView {
+ final AndroidDriver driver;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".description(\"More options\")")
+ private AndroidElement menuButton;
+
+ @CacheLookup
+ @AndroidFindBy(id = "com.owncloud.android:id/list_root")
+ private AndroidElement filesLayout;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".resourceId(\"android:id/action_bar_title\")")
+ private AndroidElement titleText;
+
+ @AndroidFindBy(id = "android:id/progress_circular")
+ private AndroidElement progressCircular;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".description(\"New folder\")")
+ private AndroidElement newFolderButton;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector().description(\"Upload\")")
+ private AndroidElement uploadButton;
+
+ private AndroidElement waitAMomentText;
+
+ @AndroidFindBy(id = "com.owncloud.android:id/ListItemLayout")
+ private List<AndroidElement> listItemLayout;
+
+ @AndroidFindBy(id = "com.owncloud.android:id/list_root")
+ private AndroidElement listRootLayout;
+
+ @AndroidFindBy(name = "Files")
+ private AndroidElement filesElementUploadFile;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".description(\"List Layout\")")
+ private AndroidElement listLayout;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.widget.FrameLayout\").index(0)")
+ private AndroidElement deviceScreen;
+
+ private AndroidElement fileElement;
+
+ private AndroidElement fileElementLayout;
+
+ private static String localFileIndicator =
+ "com.owncloud.android:id/localFileIndicator";
+ private static String favoriteFileIndicator =
+ "com.owncloud.android:id/favoriteIcon";
+ private static String sharedElementIndicator =
+ "com.owncloud.android:id/sharedIcon";
+
+
+ public FileListView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public MenuList clickOnMenuButton () {
+ //if the menu option is not in the actionBar, it is opening again
+ try {
+ menuButton.click();
+ } catch (NoSuchElementException e){
+ driver.sendKeyEvent(AndroidKeyCode.MENU);
+ }
+ MenuList menuList = new MenuList (driver);
+ return menuList;
+ }
+
+ public SettingsView getSettingsView () {
+ SettingsView settingsView = new SettingsView(driver);
+ return settingsView;
+ }
+
+ public NewFolderPopUp clickOnNewFolderButton () {
+ newFolderButton.click();
+ NewFolderPopUp newFolderPopUp = new NewFolderPopUp(driver);
+ return newFolderPopUp;
+ }
+
+ public void clickOnUploadButton () {
+ uploadButton.click();
+ }
+
+ public UploadFilesView clickOnFilesElementUploadFile () {
+ filesElementUploadFile.click();
+ UploadFilesView uploadFilesView = new UploadFilesView(driver);
+ return uploadFilesView;
+ }
+
+ public AndroidElement getTitleTextElement () {
+ return titleText;
+ }
+
+ public AndroidElement getUploadButton () {
+ return uploadButton;
+ }
+
+ public AndroidElement getWaitAMomentTextElement () {
+ return waitAMomentText;
+ }
+
+ public AndroidElement getListRootElement () {
+ return listRootLayout;
+ }
+
+ public List<AndroidElement> getListItemLayout () {
+ return listItemLayout;
+ }
+
+ public AndroidElement getFileElement () {
+ return fileElement;
+ }
+
+ public ElementMenuOptions longPressOnElement (String elementName) {
+ scrollTillFindElement(elementName).tap(1, 1000);
+ //fileElement.tap(1, 1000);
+ ElementMenuOptions menuOptions = new ElementMenuOptions(driver);
+ return menuOptions;
+ }
+
+ public AndroidElement scrollTillFindElement (String elementName) {
+ fileElement = Actions
+ .scrollTillFindElement (elementName,filesLayout,driver);
+ try {
+ fileElementLayout = (AndroidElement) driver
+ .findElementByAndroidUIAutomator("new UiSelector()"
+ + ".description(\"LinearLayout-"+ elementName +"\")");
+ } catch (NoSuchElementException e) {
+ fileElementLayout = null;
+ }
+ return fileElement;
+ }
+
+ public AndroidElement getFileElementLayout () {
+ return fileElementLayout;
+ }
+
+ public AndroidElement getProgressCircular () {
+ return progressCircular;
+ }
+
+ public static String getLocalFileIndicator() {
+ return localFileIndicator;
+ }
+
+ public static String getFavoriteFileIndicator() {
+ return favoriteFileIndicator;
+ }
+
+ public static String getSharedElementIndicator() {
+ return sharedElementIndicator;
+ }
+ public void pulldownToRefresh () throws InterruptedException {
+ Point listLocation = listLayout.getLocation();
+ driver.swipe(listLocation.getX(),listLocation.getY(),
+ listLocation.getX(),listLocation.getY()+1000, 5000);
+ }
+
+
+
+ public void pulldownToSeeNotification () throws InterruptedException {
+ Point listLocation = deviceScreen.getLocation();
+ driver.swipe(listLocation.getX(),listLocation.getY(),
+ listLocation.getX(),listLocation.getY()+1000, 5000);
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.NoSuchElementException;
+import org.openqa.selenium.support.PageFactory;
+
+public class GmailEmailListView {
+
+ final AndroidDriver driver;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector().description(\""
+ + "me about UploadFile, on May 11, conversation read\")")
+ private AndroidElement emailAmericanFormatDate;
+ @AndroidFindBy(uiAutomator = "new UiSelector().description(\""
+ + "me about UploadFile, on 11 May, conversation read\")")
+ private AndroidElement emailEuropeanFormatDate;
+
+
+ public GmailEmailListView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public GmailEmailView clickOnEmail (){
+ try{
+ emailAmericanFormatDate.click();
+ }catch (NoSuchElementException e) {
+ emailEuropeanFormatDate.click();
+ }
+ GmailEmailView gmailEmailView = new GmailEmailView(driver);
+ return gmailEmailView;
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.PageFactory;
+
+import com.owncloud.android.test.ui.testSuites.Config;
+
+public class GmailEmailView {
+ final AndroidDriver driver;
+
+ @CacheLookup
+ @AndroidFindBy(name = Config.fileToTestSendByEmailName)
+ private AndroidElement fileButton;
+
+ public GmailEmailView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public ImageView clickOnfileButton (){
+ fileButton.click();
+ ImageView imageView = new ImageView(driver);
+ return imageView;
+ }
+}
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.PageFactory;
+
+public class GmailSendMailView {
+ final AndroidDriver driver;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector().description(\"To\")")
+ private AndroidElement toTextField;
+
+ @CacheLookup
+ @AndroidFindBy(name = "Subject")
+ private AndroidElement subjectTextField;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector().description(\"Send\")")
+ private AndroidElement sendButton;
+
+ public GmailSendMailView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public void typeToEmailAdress (String email) {
+ toTextField.sendKeys(email + "\n");
+ }
+
+ public void clickOnSendButton () {
+ sendButton.click();
+ }
+
+ public void typeSubject (String subject) {
+ subjectTextField.clear();
+ subjectTextField.sendKeys(subject);
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.PageFactory;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.testSuites.Common;
+
+
+public class ImageView {
+ final AndroidDriver driver;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".description(\"More options\")")
+ private AndroidElement optionsButton;
+
+ @AndroidFindBy(name = "Share")
+ private AndroidElement shareButton;
+
+ @AndroidFindBy(name = "ownCloud")
+ private AndroidElement ownCloudButton;
+
+ @AndroidFindBy(name = "Share with ownCloud")
+ private AndroidElement shareWithOwnCloudButton;
+
+ @AndroidFindBy(name = "Just once")
+ private AndroidElement justOnceButton;
+
+ @AndroidFindBy(id = "android:id/resolver_list")
+ private AndroidElement sharingAppsLayout;
+
+ public ImageView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public void clickOnOptionsButton(){
+ optionsButton.click();
+ }
+
+ public void clickOnShareButton(){
+ shareButton.click();
+ }
+
+ public void clickOnOwnCloudButton(){
+ if(Common.isElementPresent(ownCloudButton)){
+ Actions.scrollTillFindElement("ownCloud",sharingAppsLayout,driver);
+ ownCloudButton.click();
+ }else if(Common.isElementPresent(shareWithOwnCloudButton)){}
+ }
+
+ public void clickOnJustOnceButton(){
+ justOnceButton.click();
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.PageFactory;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+public class LoginForm {
+ final AndroidDriver driver;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".description(\"Server address\")")
+ private AndroidElement hostUrlInput;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector().description(\"Username\")")
+ private AndroidElement userNameInput;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector().description(\"Password\")")
+ private AndroidElement passwordInput;
+
+ @CacheLookup
+ @AndroidFindBy(uiAutomator = "new UiSelector().description(\"Connect\")")
+ private AndroidElement connectButton;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".description(\"Testing connection\")")
+ private AndroidElement serverStatusText;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".description(\"Wrong username or password\")")
+ private AndroidElement authStatusText;
+
+ public LoginForm (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public CertificatePopUp typeHostUrl (String hostUrl) {
+ hostUrlInput.clear();
+ hostUrlInput.sendKeys(hostUrl + "\n");
+ CertificatePopUp certificatePopUp = new CertificatePopUp(driver);
+ return certificatePopUp;
+ }
+
+ public void clickOnUserName () {
+ userNameInput.click();
+ }
+
+ public void typeUserName (String userName) {
+ userNameInput.clear();
+ //using the \n , it not need to hide the keyboard
+ //which sometimes gives problems
+ userNameInput.sendKeys(userName + "\n");
+ //driver.hideKeyboard();
+ }
+
+ public void typePassword (String password) {
+ passwordInput.clear();
+ passwordInput.sendKeys(password + "\n");
+ //driver.hideKeyboard();
+ }
+
+ public FileListView clickOnConnectButton () {
+ connectButton.click();
+ FileListView fileListView = new FileListView(driver);
+ return fileListView;
+ }
+
+ public AndroidElement gethostUrlInput () {
+ return hostUrlInput;
+ }
+
+ public AndroidElement getUserNameInput () {
+ return userNameInput;
+ }
+
+ public AndroidElement getPasswordInput () {
+ return passwordInput;
+ }
+
+
+ public AndroidElement getServerStatusTextElement () {
+ return serverStatusText;
+ }
+
+ public AndroidElement getAuthStatusText () {
+ return authStatusText;
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import org.openqa.selenium.support.PageFactory;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+public class MenuList {
+
+ final AndroidDriver driver;
+
+ @AndroidFindBy(name = "Settings")
+ private AndroidElement settingsButton;
+
+ public MenuList (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public SettingsView clickOnSettingsButton () {
+ settingsButton.click();
+ SettingsView settingsView = new SettingsView(driver);
+ return settingsView;
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.PageFactory;
+
+import com.owncloud.android.test.ui.actions.Actions;
+
+public class MoveView {
+ final AndroidDriver driver;
+
+ @CacheLookup
+ @AndroidFindBy(id = "com.owncloud.android:id/list_root")
+ private AndroidElement filesLayout;
+
+ @AndroidFindBy(name = "Choose")
+ private AndroidElement chooseButton;
+
+ public MoveView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public WaitAMomentPopUp clickOnChoose () {
+ chooseButton.click();
+ WaitAMomentPopUp waitAMomentPopUp = new WaitAMomentPopUp(driver);
+ return waitAMomentPopUp;
+ }
+
+ public AndroidElement scrollTillFindElement (String elementName) {
+ return Actions.scrollTillFindElement (elementName,filesLayout,driver);
+ }
+}
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import org.openqa.selenium.support.PageFactory;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+public class NewFolderPopUp {
+
+ final AndroidDriver driver;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".resourceId(\"android:id/button1\")")
+ private AndroidElement newFolderOkButton;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".resourceId(\"com.owncloud.android:id/user_input\")")
+ private AndroidElement newFolderNameField;
+
+ public NewFolderPopUp (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public void typeNewFolderName (String newFolderName) {
+ newFolderNameField.clear();
+ newFolderNameField.sendKeys(newFolderName + "\n");
+ //driver.hideKeyboard();
+ }
+
+ public WaitAMomentPopUp clickOnNewFolderOkButton () {
+ newFolderOkButton.click();
+ WaitAMomentPopUp waitAMomentPopUp = new WaitAMomentPopUp(driver);
+ return waitAMomentPopUp;
+ }
+}
--- /dev/null
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.PageFactory;
+
+public class NotificationView {
+final AndroidDriver driver;
+
+ @AndroidFindBy(name = "Upload succeeded")
+ private static AndroidElement uploadSucceededNotification;
+
+ @AndroidFindBy(name = "Uploading ?")
+ private static AndroidElement uploadingNotification;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector().description(\"Clear all notifications.\")")
+ private AndroidElement clearAllNotificationButton;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.widget.FrameLayout\").index(0)")
+ private AndroidElement notificationArea;
+
+
+ public NotificationView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+
+ public AndroidElement getUploadSucceededNotification() {
+ return uploadSucceededNotification;
+ }
+
+ public AndroidElement getUploadingNotification() {
+ return uploadingNotification;
+ }
+
+ public AndroidElement getClearAllNotificationButton() {
+ return clearAllNotificationButton;
+ }
+
+ public void tapOnClearAllNotification () {
+ clearAllNotificationButton.tap(1, 1000);
+ }
+
+ public void tapOnBottomNotificationArea(){
+ //TODO. it is not working
+ notificationArea.getSize();
+ notificationArea.tap(1, 1000);
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import org.openqa.selenium.support.PageFactory;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+public class PassCodeRequestView {
+final AndroidDriver driver;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".className(\"android.widget.EditText\").index(0)")
+ private AndroidElement codeElement1;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".className(\"android.widget.EditText\").index(1)")
+ private AndroidElement codeElement2;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".className(\"android.widget.EditText\").index(2)")
+ private AndroidElement codeElement3;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".className(\"android.widget.EditText\").index(3)")
+ private AndroidElement codeElement4;
+
+ public PassCodeRequestView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public void enterPasscode(String codeNumber1, String codeNumber2,
+ String codeNumber3, String codeNumber4){
+ codeElement1
+ .sendKeys(codeNumber1 + codeNumber1 + codeNumber1 + codeNumber1);
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.PageFactory;
+
+public class PassCodeView {
+ final AndroidDriver driver;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".className(\"android.widget.EditText\").index(0)")
+ private AndroidElement codeElement1;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".className(\"android.widget.EditText\").index(1)")
+ private AndroidElement codeElement2;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".className(\"android.widget.EditText\").index(2)")
+ private AndroidElement codeElement3;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".className(\"android.widget.EditText\").index(3)")
+ private AndroidElement codeElement4;
+
+ @AndroidFindBy(name = "Cancel")
+ private AndroidElement cancelButton;
+
+ public PassCodeView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public PassCodeView enterPasscode(String codeNumber1, String codeNumber2,
+ String codeNumber3, String codeNumber4){
+ codeElement1
+ .sendKeys(codeNumber1 + codeNumber1 + codeNumber1 + codeNumber1);
+ return this;
+ }
+ public SettingsView reenterPasscode(String codeNumber1,
+ String codeNumber2, String codeNumber3, String codeNumber4){
+ codeElement1
+ .sendKeys(codeNumber1 + codeNumber1 + codeNumber1 + codeNumber1);
+ SettingsView settingsView = new SettingsView(driver);
+ return settingsView;
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.PageFactory;
+
+public class RemoveConfirmationView {
+ final AndroidDriver driver;
+
+ @AndroidFindBy(name = "Remote and local")
+ private AndroidElement remoteAndLocalButton;
+
+ public RemoveConfirmationView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public WaitAMomentPopUp clickOnRemoteAndLocalButton () {
+ remoteAndLocalButton.click();
+ WaitAMomentPopUp waitAMomentPopUp = new WaitAMomentPopUp(driver);
+ return waitAMomentPopUp;
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.PageFactory;
+
+import com.owncloud.android.test.ui.testSuites.Config;
+
+public class SettingsView {
+ final AndroidDriver driver;
+
+ @CacheLookup
+ @AndroidFindBy(name = Config.userAccount)
+ private AndroidElement accountElement;
+
+ @CacheLookup
+ @AndroidFindBy(name = Config.userAccount2)
+ private AndroidElement accountElement2;
+
+ @AndroidFindBy(name = "Delete account")
+ private AndroidElement deleteAccountElement;
+
+ @AndroidFindBy(name = "Change password")
+ private AndroidElement changePasswordElement;
+
+ @AndroidFindBy(name = "Add account")
+ private AndroidElement addAccountElement;
+
+ @AndroidFindBy(uiAutomator = "new UiSelector()"
+ + ".className(\"android.widget.CheckBox\").index(0)")
+ private AndroidElement passcodeCheckbox;
+
+ public SettingsView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public void tapOnAccountElement (int accountPosition, int fingers, int milliSeconds) {
+ if(accountPosition==1)
+ accountElement.tap(fingers, milliSeconds);
+ else
+ accountElement2.tap(fingers, milliSeconds);
+ }
+
+ public void tapOnAddAccount (int fingers, int milliSeconds) {
+ addAccountElement.tap(fingers, milliSeconds);
+ }
+
+ public LoginForm clickOnDeleteAccountElement () {
+ deleteAccountElement.click();
+ LoginForm loginForm = new LoginForm(driver);
+ return loginForm;
+ }
+
+ public LoginForm clickOnChangePasswordElement () {
+ changePasswordElement.click();
+ LoginForm loginForm = new LoginForm(driver);
+ return loginForm;
+ }
+
+ public PassCodeView EnablePassCode(){
+ if(!passcodeCheckbox.isSelected()){
+ passcodeCheckbox.click();
+ }
+ PassCodeView passcodeview = new PassCodeView(driver);
+ return passcodeview;
+ }
+
+ public PassCodeView DisablePassCode(){
+ if(passcodeCheckbox.isSelected()){
+ passcodeCheckbox.click();
+ }
+ PassCodeView passcodeview = new PassCodeView(driver);
+ return passcodeview;
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.FindBy;
+import org.openqa.selenium.support.PageFactory;
+
+public class ShareView {
+ final AndroidDriver driver;
+
+ @CacheLookup
+ @FindBy(id = "android:id/select_dialog_listview")
+ private AndroidElement listViewLayout;
+
+ public ShareView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public AndroidElement getListViewLayout () {
+ return listViewLayout;
+ }
+
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.PageFactory;
+
+import com.owncloud.android.test.ui.actions.Actions;
+
+public class UploadFilesView{
+ final AndroidDriver driver;
+
+ @CacheLookup
+ @AndroidFindBy(id = "com.owncloud.android:id/list_root")
+ private AndroidElement filesLayout;
+
+ @CacheLookup
+ @AndroidFindBy(id = "com.owncloud.android:id/upload_files_btn_upload")
+ private AndroidElement uploadButton;
+
+ private AndroidElement fileElement;
+
+ public UploadFilesView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public FileListView clickOnUploadButton () {
+ uploadButton.click();
+ FileListView fileListView = new FileListView (driver);
+ return fileListView;
+ }
+
+ //change to scrollTillFindElement
+ public void scrollTillFindFile (String fileName) {
+ fileElement = Actions
+ .scrollTillFindElement(fileName,filesLayout,driver);
+ }
+
+ public void clickOnFileName (String fileName) {
+ scrollTillFindFile(fileName);
+ fileElement.click();
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+import org.openqa.selenium.support.CacheLookup;
+import org.openqa.selenium.support.PageFactory;
+
+public class UploadView {
+ final AndroidDriver driver;
+
+ @CacheLookup
+ @AndroidFindBy(name = "Upload")
+ private AndroidElement uploadButton;
+
+ public UploadView (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public void clickOUploadButton () {
+ uploadButton.click();
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.models;
+
+import org.openqa.selenium.support.PageFactory;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+import io.appium.java_client.pagefactory.AndroidFindBy;
+import io.appium.java_client.pagefactory.AppiumFieldDecorator;
+
+public class WaitAMomentPopUp {
+ final AndroidDriver driver;
+
+ @AndroidFindBy(name = "Wait a moment")
+ private AndroidElement waitAMomentText;
+
+ public WaitAMomentPopUp (AndroidDriver driver) {
+ this.driver = driver;
+ PageFactory.initElements(new AppiumFieldDecorator(driver), this);
+ }
+
+ public AndroidElement getWaitAMomentTextElement () {
+ return waitAMomentText;
+ }
+}
--- /dev/null
+Config.java
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.io.FileUtils;
+import org.openqa.selenium.By;
+import org.openqa.selenium.NoSuchElementException;
+import org.openqa.selenium.OutputType;
+import org.openqa.selenium.TimeoutException;
+import org.openqa.selenium.remote.DesiredCapabilities;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+
+public class Common{
+ AndroidDriver driver;
+ static int waitingTime = 30;
+
+ public WebDriverWait wait;
+
+ protected AndroidDriver setUpCommonDriver () throws Exception {
+ File rootPath = new File(System.getProperty("user.dir"));
+ File appDir = new File(rootPath,"src/test/resources");
+ File app = new File(appDir,"ownCloud.apk");
+ DesiredCapabilities capabilities = new DesiredCapabilities();
+ capabilities.setCapability("platformName", "Android");
+ capabilities.setCapability("deviceName", "test");
+ capabilities.setCapability("app", app.getAbsolutePath());
+ capabilities.setCapability("appPackage", "com.owncloud.android");
+ capabilities.setCapability("appActivity",
+ ".ui.activity.FileDisplayActivity");
+ capabilities.setCapability("appWaitActivity",
+ ".authentication.AuthenticatorActivity");
+ driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),
+ capabilities);
+ driver.manage().timeouts().implicitlyWait(waitingTime,
+ TimeUnit.SECONDS);
+ wait = new WebDriverWait(driver, waitingTime, 50);
+ return driver;
+
+ }
+
+ protected boolean waitForTextPresent(String text, AndroidElement element)
+ throws InterruptedException{
+ for (int second = 0;;second++){
+ if (second >= waitingTime)
+ return false;
+ try{
+ if (text.equals(element.getText()))
+ break;
+ } catch (Exception e){
+
+ }
+ Thread.sleep(1000);
+ }
+ return true;
+ }
+
+ protected boolean isElementPresent(AndroidElement element, By by) {
+ try {
+ element.findElement(by);
+ return true;
+ } catch (NoSuchElementException e) {
+ return false;
+ }
+ }
+
+ public static boolean isElementPresent(AndroidElement element) {
+ try{
+ element.isDisplayed();
+ } catch (NoSuchElementException e){
+ return false;
+ }
+ return true;
+ }
+
+ //pollingTime in milliseconds
+ public static void waitTillElementIsNotPresent (AndroidElement element,
+ int pollingTime) throws Exception {
+ for (int time = 0;time <= waitingTime * 1000;time += pollingTime){
+ try{
+ element.isDisplayed();
+ } catch (NoSuchElementException e){
+ return;
+ }
+ Thread.sleep(pollingTime);
+ }
+ throw new TimeoutException();
+ }
+
+ public static void waitTillElementIsNotPresentWithoutTimeout (
+ AndroidElement element,int pollingTime)
+ throws InterruptedException {
+ for (int time = 0;time <= waitingTime * 1000;time += pollingTime){
+ try{
+ element.isDisplayed();
+ } catch (NoSuchElementException e){
+ return;
+ }
+ Thread.sleep(pollingTime);
+ }
+ }
+
+ public static void waitTillElementIsPresent (
+ AndroidElement element,int pollingTime)
+ throws InterruptedException {
+ for (int time = 0;time <= waitingTime * 1000;time += pollingTime){
+ try{
+ if(element.isDisplayed()){
+ return;
+ }
+ } catch (NoSuchElementException e){
+
+ }
+ Thread.sleep(pollingTime);
+ }
+ }
+
+ protected void takeScreenShotOnFailed (String testName)
+ throws IOException {
+ File file = ((RemoteWebDriver) driver)
+ .getScreenshotAs(OutputType.FILE);
+ SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd");
+ Date today = Calendar.getInstance().getTime();
+ String screenShotName = "ScreenShots/" + dt1.format(today) + "/"
+ + testName + ".png";
+ FileUtils.copyFile(file, new File(screenShotName));
+ }
+
+ protected void assertIsInFileListView() throws InterruptedException {
+ //waitForTextPresent("Wrong username or password",
+ // changePasswordForm.getAuthStatusText());
+ Thread.sleep(2000);
+ assertTrue(waitForTextPresent("ownCloud", (AndroidElement) driver
+ .findElementByAndroidUIAutomator("new UiSelector()"
+ + ".resourceId(\"android:id/action_bar_title\")")));
+ assertTrue(isElementPresent((AndroidElement) driver
+ .findElementByAndroidUIAutomator("new UiSelector()"
+ + ".description(\"Upload\")")));
+ }
+
+ protected void assertIsNotInFileListView() throws InterruptedException {
+ AndroidElement fileElement;
+ assertTrue(waitForTextPresent("ownCloud", (AndroidElement) driver
+ .findElementByAndroidUIAutomator("new UiSelector()"
+ + ".resourceId(\"android:id/action_bar_title\")")));
+ try {
+ fileElement = (AndroidElement) driver
+ .findElementByAndroidUIAutomator("new UiSelector()"
+ + ".description(\"Upload\")");
+ } catch (NoSuchElementException e) {
+ fileElement = null;
+ }
+ assertNull(fileElement);
+ }
+
+ protected void assertIsPasscodeRequestView() throws InterruptedException {
+ assertTrue(waitForTextPresent("ownCloud", (AndroidElement) driver
+ .findElementByAndroidUIAutomator("new UiSelector()"
+ + ".resourceId(\"android:id/action_bar_title\")")));
+ assertTrue(((AndroidElement) driver.findElementByAndroidUIAutomator(
+ "new UiSelector().text(\"Please, insert your pass code\")"))
+ .isDisplayed());
+
+ }
+
+ protected void assertIsInSettingsView() throws InterruptedException {
+ assertTrue(waitForTextPresent("Settings", (AndroidElement) driver
+ .findElementByAndroidUIAutomator("new UiSelector()"
+ + ".resourceId(\"android:id/action_bar_title\")")));
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+public final class Config {
+
+ //without http or https
+ public static final String URL = "owncloudServerVar";
+ public static boolean isTrusted = true;
+
+ //without http or https
+ public static final String URL2 = "owncloudServer2Var";
+ public static boolean isTrusted2 = true;
+
+ public static final String user = "owncloudUserVar";
+ public static final String password = "owncloudPasswordVar";
+ public static final String user2 = "owncloudUser2Var";
+ public static final String password2 = "owncloudPassword2Var";
+ public static final String userAccount = user + "@"+ URL;
+ public static final String userAccount2 = user2 + "@"+ URL2;
+
+ public static final String gmailAccount = "gmailAccountVar";
+
+ public static final String fileWhichIsInTheServer1 ="test";
+ public static final String fileWhichIsInTheServer2 ="test";
+
+ public static final String fileToTestName = "test";
+ public static final String fileToTestSendByEmailName = "test";
+ public static final String bigFileToTestName = "test";
+
+ public static final String passcode1 = "passcode1";
+ public static final String passcode2 = "passcode2";
+ public static final String passcode3 = "passcode3";
+ public static final String passcode4 = "passcode4";
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.WaitAMomentPopUp;
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class CreateFolderTestSuite{
+
+ AndroidDriver driver;
+ Common common;
+ private Boolean folderHasBeenCreated = false;
+ private final String FOLDER_NAME = "testCreateFolder";
+ private String CurrentCreatedFolder = "";
+
+ @Rule public TestName name = new TestName();
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testCreateNewFolder () throws Exception {
+ String NEW_FOLDER_NAME = "testCreateFolder";
+
+ FileListView fileListView = Actions.login(Config.URL,
+ Config.user,Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //check if the folder already exists and if true, delete them
+ Actions.deleteElement(NEW_FOLDER_NAME, fileListView, driver);
+
+ WaitAMomentPopUp waitAMomentPopUp = Actions
+ .createFolder(NEW_FOLDER_NAME, fileListView);
+ Common.waitTillElementIsNotPresentWithoutTimeout(waitAMomentPopUp
+ .getWaitAMomentTextElement(), 100);
+ fileListView.scrollTillFindElement(FOLDER_NAME);
+ assertNotNull(fileListView.getFileElement());
+ assertTrue(
+ folderHasBeenCreated=fileListView.getFileElement().isDisplayed());
+ CurrentCreatedFolder = FOLDER_NAME;
+ assertEquals(FOLDER_NAME , fileListView.getFileElement().getText());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ if (folderHasBeenCreated) {
+ FileListView fileListView = new FileListView(driver);
+ Actions.deleteElement(CurrentCreatedFolder, fileListView, driver);
+ }
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.models.FileListView;
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class DeleteFileTestSuite{
+
+ AndroidDriver driver;
+ Common common;
+ private final String FILE_NAME = Config.fileToTestName;
+
+ @Rule public TestName name = new TestName();
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testDeleteFile () throws Exception {
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //TODO. if the file already exists, do not upload
+ FileListView fileListViewAfterUploadFile = Actions
+ .uploadFile(FILE_NAME, fileListView);
+
+ fileListViewAfterUploadFile.scrollTillFindElement(FILE_NAME);
+ Common.waitTillElementIsNotPresentWithoutTimeout(
+ fileListViewAfterUploadFile.getProgressCircular(), 1000);
+ common.wait.until(ExpectedConditions.visibilityOf(
+ fileListViewAfterUploadFile.getFileElementLayout()
+ .findElement(By.id(FileListView.getLocalFileIndicator()))));
+
+ Actions.deleteElement(FILE_NAME,fileListViewAfterUploadFile, driver);
+ assertFalse(fileListViewAfterUploadFile.getFileElement().isDisplayed());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+}
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.WaitAMomentPopUp;
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class DeleteFolderTestSuite{
+ AndroidDriver driver;
+ Common common;
+ private Boolean folderHasBeenCreated = false;
+ private final String FOLDER_NAME = "testCreateFolder";
+
+ @Rule public TestName name = new TestName();
+
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testDeleteFolder () throws Exception {
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //TODO. if the folder already exists, do no created
+ //create the folder
+ WaitAMomentPopUp waitAMomentPopUp = Actions
+ .createFolder(FOLDER_NAME, fileListView);
+ Common.waitTillElementIsNotPresentWithoutTimeout(
+ waitAMomentPopUp.getWaitAMomentTextElement(), 100);
+ fileListView.scrollTillFindElement(FOLDER_NAME);
+ assertTrue(
+ folderHasBeenCreated = fileListView.getFileElement().isDisplayed());
+
+ //delete the folder
+ Actions.deleteElement(FOLDER_NAME, fileListView, driver);
+ assertFalse(
+ folderHasBeenCreated =fileListView.getFileElement().isDisplayed());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ if(folderHasBeenCreated){
+ FileListView fileListView = new FileListView(driver);
+ Actions.deleteElement(FOLDER_NAME, fileListView, driver);
+ }
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.openqa.selenium.ScreenOrientation;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.*;
+import com.owncloud.android.test.ui.models.LoginForm;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.MenuList;
+import com.owncloud.android.test.ui.models.SettingsView;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class LoginTestSuite{
+ AndroidDriver driver;
+ Common common;
+
+ @Rule public TestName name = new TestName();
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class})
+ public void test1LoginPortrait () throws Exception {
+ driver.rotate(ScreenOrientation.PORTRAIT);
+
+ Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class})
+ public void test2LoginLandscape () throws Exception {
+ driver.rotate(ScreenOrientation.LANDSCAPE);
+ Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testLoginAndShowFiles () throws Exception {
+ driver.rotate(ScreenOrientation.PORTRAIT);
+
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ fileListView.scrollTillFindElement(Config.fileWhichIsInTheServer1);
+ assertTrue(fileListView.getFileElement().isDisplayed());
+ }
+
+
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void test3MultiAccountRotate () throws Exception {
+ driver.rotate(ScreenOrientation.LANDSCAPE);
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ driver.rotate(ScreenOrientation.PORTRAIT);
+ MenuList menu = fileListView.clickOnMenuButton();
+ SettingsView settingsView = menu.clickOnSettingsButton();
+
+ settingsView.tapOnAddAccount(1, 1000);
+ fileListView = Actions.login(Config.URL2, Config.user2,
+ Config.password2, Config.isTrusted2, driver);
+ common.assertIsInSettingsView();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testMultiAccountAndShowFiles () throws Exception {
+ driver.rotate(ScreenOrientation.LANDSCAPE);
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+ fileListView.scrollTillFindElement(Config.fileWhichIsInTheServer1);
+ assertTrue(fileListView.getFileElement().isDisplayed());
+
+ driver.rotate(ScreenOrientation.PORTRAIT);
+ MenuList menu = fileListView.clickOnMenuButton();
+ SettingsView settingsView = menu.clickOnSettingsButton();
+
+ settingsView.tapOnAddAccount(1, 1000);
+ fileListView = Actions.login(Config.URL2, Config.user2,
+ Config.password2, Config.isTrusted2, driver);
+ common.assertIsInSettingsView();
+ settingsView.tapOnAccountElement(2,1, 100);
+ common.assertIsInFileListView();
+
+ fileListView.scrollTillFindElement(Config.fileWhichIsInTheServer2);
+ assertTrue(fileListView.getFileElement().isDisplayed());
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class})
+ public void test4ExistingAccountRotate () throws Exception {
+ driver.rotate(ScreenOrientation.PORTRAIT);
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ driver.rotate(ScreenOrientation.LANDSCAPE);
+ MenuList menu = fileListView.clickOnMenuButton();
+ SettingsView settingsView = menu.clickOnSettingsButton();
+ settingsView.tapOnAddAccount(1, 1000);
+
+ LoginForm loginForm = new LoginForm(driver);
+ fileListView = Actions.login(Config.URL, Config.user,Config.password,
+ Config.isTrusted, driver);
+ assertTrue(common.waitForTextPresent("An account for the same user and"
+ + " server already exists in the device",
+ loginForm.getAuthStatusText()));
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class})
+ public void test5ChangePasswordWrong () throws Exception {
+ driver.rotate(ScreenOrientation.PORTRAIT);
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+ MenuList menu = fileListView.clickOnMenuButton();
+ SettingsView settingsView = menu.clickOnSettingsButton();
+ settingsView.tapOnAccountElement(1,1, 1000);
+ LoginForm changePasswordForm = settingsView
+ .clickOnChangePasswordElement();
+ changePasswordForm.typePassword("WrongPassword");
+ changePasswordForm.clickOnConnectButton();
+ assertTrue(common.waitForTextPresent("Wrong username or password",
+ changePasswordForm.getAuthStatusText()));
+ }
+
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.models.LoginForm;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.MenuList;
+import com.owncloud.android.test.ui.models.SettingsView;
+
+public class LogoutTestSuite{
+
+ AndroidDriver driver;
+ Common common;
+
+ @Rule public TestName name = new TestName();
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testLogout () throws Exception {
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+ MenuList menulist = fileListView.clickOnMenuButton();
+ SettingsView settingsView = menulist.clickOnSettingsButton();
+ settingsView.tapOnAccountElement(1,1, 1000);
+ LoginForm loginForm = settingsView.clickOnDeleteAccountElement();
+ assertEquals("Server address https://…",
+ loginForm.gethostUrlInput().getText());
+ assertEquals("Username", loginForm.getUserNameInput().getText());
+ assertEquals("", loginForm.getPasswordInput().getText());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ //driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.FixMethodOrder;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.models.ElementMenuOptions;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.MoveView;
+import com.owncloud.android.test.ui.models.WaitAMomentPopUp;
+
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class MoveFileTestSuite{
+ AndroidDriver driver;
+ Common common;
+ private String FOLDER_WHERE_MOVE = "folderWhereMove";
+ private String FILE_NAME = Config.fileToTestName;
+ @Rule public TestName name = new TestName();
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testMoveFile () throws Exception {
+ WaitAMomentPopUp waitAMomentPopUp;
+
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //Common.waitTillElementIsNotPresentWithoutTimeout(
+ //fileListView.getProgressCircular(), 1000);
+
+ //check if the folder already exists and if true, delete them
+ Actions.deleteElement(FOLDER_WHERE_MOVE, fileListView, driver);
+ Actions.deleteElement(FILE_NAME, fileListView, driver);
+
+ //Create the folder where the other is gone to be moved
+ waitAMomentPopUp = Actions
+ .createFolder(FOLDER_WHERE_MOVE, fileListView);
+ Common.waitTillElementIsNotPresentWithoutTimeout(
+ waitAMomentPopUp.getWaitAMomentTextElement(), 100);
+ fileListView.scrollTillFindElement(FOLDER_WHERE_MOVE);
+ assertTrue(fileListView.getFileElement().isDisplayed());
+
+ FileListView fileListViewAfterUploadFile = Actions
+ .uploadFile(FILE_NAME, fileListView);
+ fileListViewAfterUploadFile.scrollTillFindElement(FILE_NAME);
+ assertTrue(fileListViewAfterUploadFile.getFileElement().isDisplayed());
+
+ //select to move the file
+ ElementMenuOptions menuOptions = fileListView
+ .longPressOnElement(FILE_NAME);
+ MoveView moveView = menuOptions.clickOnMove();
+
+ //to move to a folder
+ moveView.scrollTillFindElement(FOLDER_WHERE_MOVE).tap(1,1);
+ waitAMomentPopUp = moveView.clickOnChoose();
+ Common.waitTillElementIsNotPresentWithoutTimeout(
+ waitAMomentPopUp.getWaitAMomentTextElement(), 100);
+
+ //check that the folder moved is inside the other
+ fileListView.scrollTillFindElement(FOLDER_WHERE_MOVE).tap(1,1);
+ Common.waitTillElementIsNotPresentWithoutTimeout(fileListView.getProgressCircular(),
+ 1000);
+ Thread.sleep(1000);
+ fileListView.scrollTillFindElement(FILE_NAME);
+ assertEquals(FILE_NAME , fileListView.getFileElement().getText());
+
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ FileListView fileListView = new FileListView(driver);
+ driver.sendKeyEvent(android.view.KeyEvent.KEYCODE_BACK);
+ Actions.deleteElement(FOLDER_WHERE_MOVE, fileListView, driver);
+ Actions.deleteElement(FILE_NAME, fileListView, driver);
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.models.ElementMenuOptions;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.MoveView;
+import com.owncloud.android.test.ui.models.WaitAMomentPopUp;
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class MoveFolderTestSuite{
+ AndroidDriver driver;
+ Common common;
+ private String FOLDER_TO_MOVE = "folderToMove";
+ private String FOLDER_WHERE_MOVE = "folderWhereMove";
+
+ @Rule public TestName name = new TestName();
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testMoveFolder () throws Exception {
+ WaitAMomentPopUp waitAMomentPopUp;
+
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //Common.waitTillElementIsNotPresentWithoutTimeout(
+ //fileListView.getProgressCircular(), 1000);
+
+ //check if the folder already exists and if true, delete them
+ Actions.deleteElement(FOLDER_WHERE_MOVE, fileListView, driver);
+ Actions.deleteElement(FOLDER_TO_MOVE, fileListView, driver);
+
+ //Create the folder where the other is gone to be moved
+ waitAMomentPopUp = Actions
+ .createFolder(FOLDER_WHERE_MOVE, fileListView);
+ Common.waitTillElementIsNotPresentWithoutTimeout(
+ waitAMomentPopUp.getWaitAMomentTextElement(), 100);
+ fileListView.scrollTillFindElement(FOLDER_WHERE_MOVE);
+ assertTrue(fileListView.getFileElement().isDisplayed());
+
+ //Create the folder which is going to be moved
+ waitAMomentPopUp = Actions.createFolder(FOLDER_TO_MOVE, fileListView);
+ Common.waitTillElementIsNotPresent(
+ waitAMomentPopUp.getWaitAMomentTextElement(), 100);
+ fileListView.scrollTillFindElement(FOLDER_TO_MOVE);
+ assertTrue(fileListView.getFileElement().isDisplayed());
+
+ //select to move the folder
+ ElementMenuOptions menuOptions = fileListView
+ .longPressOnElement(FOLDER_TO_MOVE);
+ MoveView moveView = menuOptions.clickOnMove();
+
+ //to move to a folder
+ moveView.scrollTillFindElement(FOLDER_WHERE_MOVE).tap(1,1);
+ waitAMomentPopUp = moveView.clickOnChoose();
+ Common.waitTillElementIsNotPresentWithoutTimeout(waitAMomentPopUp
+ .getWaitAMomentTextElement(), 100);
+
+ //check that the folder moved is inside the other
+ fileListView.scrollTillFindElement(FOLDER_WHERE_MOVE).tap(1,1);
+ Common.waitTillElementIsNotPresentWithoutTimeout(fileListView.getProgressCircular(),
+ 1000);
+ Thread.sleep(1000);
+ fileListView.scrollTillFindElement(FOLDER_TO_MOVE);
+ assertEquals(FOLDER_TO_MOVE , fileListView.getFileElement().getText());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ FileListView fileListView = new FileListView(driver);
+ driver.sendKeyEvent(android.view.KeyEvent.KEYCODE_BACK);
+ Actions.deleteElement(FOLDER_WHERE_MOVE, fileListView, driver);
+ Actions.deleteElement(FOLDER_TO_MOVE, fileListView, driver);
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.FixMethodOrder;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+import org.openqa.selenium.ScreenOrientation;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.MenuList;
+import com.owncloud.android.test.ui.models.PassCodeRequestView;
+import com.owncloud.android.test.ui.models.PassCodeView;
+import com.owncloud.android.test.ui.models.SettingsView;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class PasscodeTestSuite {
+ AndroidDriver driver;
+ Common common;
+
+ @Rule public TestName name = new TestName();
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class})
+ public void testPincodeEnable () throws Exception {
+ driver.rotate(ScreenOrientation.PORTRAIT);
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ MenuList menu = fileListView.clickOnMenuButton();
+ SettingsView settingsView = menu.clickOnSettingsButton();
+
+ PassCodeView passCodeview = settingsView.EnablePassCode();
+ PassCodeView passCodeview2 = passCodeview.enterPasscode(
+ Config.passcode1, Config.passcode2, Config.passcode3,
+ Config.passcode4);
+ passCodeview2.reenterPasscode(Config.passcode1, Config.passcode2,
+ Config.passcode3, Config.passcode4);
+
+ driver.sendKeyEvent(android.view.KeyEvent.KEYCODE_HOME);
+ //TO DO. Open the app instead of start an activity
+ driver.startActivity("com.owncloud.android",
+ ".ui.activity.FileDisplayActivity");
+ //here we check that we are not in the fileDisplayActivity,
+ //because pincode is asked
+ common.assertIsNotInFileListView();
+ common.assertIsPasscodeRequestView();
+
+ PassCodeRequestView passCodeReequestView = new
+ PassCodeRequestView(driver);
+ passCodeReequestView.enterPasscode(Config.passcode1, Config.passcode2,
+ Config.passcode3, Config.passcode4);
+ common.assertIsInFileListView();
+ }
+
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.UnfinishedTestCategory;
+import com.owncloud.android.test.ui.models.FileListView;
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class RefreshFolderTestSuite{
+ AndroidDriver driver;
+ Common common;
+
+ @Rule public TestName name = new TestName();
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+
+ @Test
+ @Category({UnfinishedTestCategory.class})
+ public void testPulldownToRefreshFolder () throws Exception {
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+ //TODO. Remove the sleep and check why is not working the assert
+ //when using waitTillElementIsNotPresent
+ Thread.sleep(5000);
+ //waitTillElementIsNotPresentWithoutTimeout(fileListView.getProgressCircular(), 1000);
+ fileListView.pulldownToRefresh();
+ assertTrue(fileListView.getProgressCircular().isDisplayed());
+ //TODO insert a file in the web, and check that it's shown here
+ }
+
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.models.ElementMenuOptions;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.NewFolderPopUp;
+import com.owncloud.android.test.ui.models.WaitAMomentPopUp;
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class RenameFileTestSuite{
+
+ AndroidDriver driver;
+ Common common;
+ private Boolean fileHasBeenCreated = false;
+ private final String OLD_FILE_NAME = Config.fileToTestName;
+ private final String FILE_NAME = "newNameFile";
+ private String CurrentCreatedFile = "";
+
+ @Rule public TestName name = new TestName();
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testRenameFile () throws Exception {
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //TODO. if the file already exists, do not upload
+ FileListView fileListViewAfterUploadFile = Actions
+ .uploadFile(OLD_FILE_NAME, fileListView);
+
+ //check if the file with the new name already exists, if true delete it
+ Actions.deleteElement(FILE_NAME, fileListView, driver);
+
+ fileListViewAfterUploadFile.scrollTillFindElement(OLD_FILE_NAME);
+ assertTrue(fileHasBeenCreated = fileListViewAfterUploadFile
+ .getFileElement().isDisplayed());
+ CurrentCreatedFile = OLD_FILE_NAME;
+ Common.waitTillElementIsNotPresentWithoutTimeout(fileListViewAfterUploadFile
+ .getProgressCircular(), 1000);
+ common.wait.until(ExpectedConditions.visibilityOf(
+ fileListViewAfterUploadFile.getFileElementLayout()
+ .findElement(By.id(FileListView.getLocalFileIndicator()))));
+ ElementMenuOptions menuOptions = fileListViewAfterUploadFile
+ .longPressOnElement(OLD_FILE_NAME);
+ NewFolderPopUp newFolderPopUp = menuOptions.clickOnRename();
+ newFolderPopUp.typeNewFolderName(FILE_NAME);
+ WaitAMomentPopUp waitAMomentPopUp = newFolderPopUp
+ .clickOnNewFolderOkButton();
+ Common.waitTillElementIsNotPresentWithoutTimeout(waitAMomentPopUp
+ .getWaitAMomentTextElement(), 100);
+ fileListViewAfterUploadFile.scrollTillFindElement(FILE_NAME);
+ assertNotNull(fileListViewAfterUploadFile.getFileElement());
+ assertTrue(fileListViewAfterUploadFile.getFileElement().isDisplayed());
+ assertEquals(FILE_NAME , fileListViewAfterUploadFile.getFileElement()
+ .getText());
+ CurrentCreatedFile = FILE_NAME;
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ if (fileHasBeenCreated) {
+ FileListView fileListView = new FileListView(driver);
+ Actions.deleteElement(CurrentCreatedFile,fileListView, driver);
+ }
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.models.ElementMenuOptions;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.NewFolderPopUp;
+import com.owncloud.android.test.ui.models.WaitAMomentPopUp;
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class RenameFolderTestSuite{
+
+ AndroidDriver driver;
+ Common common;
+ private Boolean folderHasBeenCreated = false;
+ private final String OLD_FOLDER_NAME = "beforeRemoving";
+ private final String FOLDER_NAME = "testCreateFolder";
+ private String CurrentCreatedFolder = "";
+
+ @Rule public TestName name = new TestName();
+
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testRenameFolder () throws Exception {
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //TODO. if the folder already exists, do no created
+ //create the folder to rename
+ WaitAMomentPopUp waitAMomentPopUp = Actions
+ .createFolder(OLD_FOLDER_NAME, fileListView);
+ Common.waitTillElementIsNotPresentWithoutTimeout(
+ waitAMomentPopUp.getWaitAMomentTextElement(), 100);
+ fileListView.scrollTillFindElement(OLD_FOLDER_NAME);
+
+ assertTrue(
+ folderHasBeenCreated = fileListView.getFileElement().isDisplayed());
+
+ //check if the folder with the new name already exists
+ //and if true, delete them
+ Actions.deleteElement(FOLDER_NAME, fileListView, driver);
+
+ CurrentCreatedFolder = OLD_FOLDER_NAME;
+ ElementMenuOptions menuOptions = fileListView
+ .longPressOnElement(OLD_FOLDER_NAME);
+ NewFolderPopUp FolderPopUp = menuOptions.clickOnRename();
+ FolderPopUp.typeNewFolderName(FOLDER_NAME);
+ FolderPopUp.clickOnNewFolderOkButton();
+ CurrentCreatedFolder = FOLDER_NAME;
+ Common.waitTillElementIsNotPresentWithoutTimeout(waitAMomentPopUp
+ .getWaitAMomentTextElement(), 100);
+ fileListView.scrollTillFindElement(FOLDER_NAME);
+ assertNotNull(fileListView.getFileElement());
+ assertTrue(
+ folderHasBeenCreated = fileListView.getFileElement().isDisplayed());
+ assertEquals(FOLDER_NAME , fileListView.getFileElement().getText());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ if(folderHasBeenCreated){
+ FileListView fileListView = new FileListView(driver);
+ Actions.deleteElement(CurrentCreatedFolder, fileListView, driver);
+ }
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+
+import org.junit.experimental.categories.Categories.ExcludeCategory;
+import org.junit.experimental.categories.Categories.IncludeCategory;
+import org.junit.runner.RunWith;
+
+import com.owncloud.android.test.ui.groups.FailingTestCategory;
+import com.owncloud.android.test.ui.groups.FlexibleCategories;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestClassPrefix;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestClassSuffix;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestScanPackage;
+
+
+@RunWith(FlexibleCategories.class)
+@ExcludeCategory(NoIgnoreTestCategory.class)
+@IncludeCategory(FailingTestCategory.class)
+@TestScanPackage("com.owncloud.android.test.ui.testSuites")
+@TestClassPrefix("")
+@TestClassSuffix("TestSuite")
+public class RunFailingTests {
+
+}
--- /dev/null
+package com.owncloud.android.test.ui.testSuites;
+
+import org.junit.experimental.categories.Categories.IncludeCategory;
+import org.junit.runner.RunWith;
+import com.owncloud.android.test.ui.groups.FlexibleCategories;
+import com.owncloud.android.test.ui.groups.InProgressCategory;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestClassPrefix;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestClassSuffix;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestScanPackage;
+
+
+@RunWith(FlexibleCategories.class)
+@IncludeCategory(InProgressCategory.class)
+@TestScanPackage("com.owncloud.android.test.ui.testSuites")
+@TestClassPrefix("")
+@TestClassSuffix("TestSuite")
+public class RunInProgressTest {
+
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import org.junit.experimental.categories.Categories.ExcludeCategory;
+import org.junit.experimental.categories.Categories.IncludeCategory;
+import org.junit.runner.RunWith;
+
+import com.owncloud.android.test.ui.groups.FlexibleCategories;
+import com.owncloud.android.test.ui.groups.IgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestClassPrefix;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestClassSuffix;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestScanPackage;
+
+
+@RunWith(FlexibleCategories.class)
+@ExcludeCategory(IgnoreTestCategory.class)
+@IncludeCategory(NoIgnoreTestCategory.class)
+@TestScanPackage("com.owncloud.android.test.ui.testSuites")
+@TestClassPrefix("")
+@TestClassSuffix("TestSuite")
+public class RunNoIgnoreTests {
+}
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import org.junit.experimental.categories.Categories.ExcludeCategory;
+import org.junit.experimental.categories.Categories.IncludeCategory;
+import org.junit.runner.RunWith;
+
+import com.owncloud.android.test.ui.groups.FlexibleCategories;
+import com.owncloud.android.test.ui.groups.IgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestClassPrefix;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestClassSuffix;
+import com.owncloud.android.test.ui.groups.FlexibleCategories.TestScanPackage;
+
+
+@RunWith(FlexibleCategories.class)
+@ExcludeCategory(IgnoreTestCategory.class)
+@IncludeCategory(SmokeTestCategory.class)
+@TestScanPackage("com.owncloud.android.test.ui.testSuites")
+@TestClassPrefix("")
+@TestClassSuffix("TestSuite")
+public class RunSmokeTests {
+}
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+import static org.junit.Assert.*;
+import io.appium.java_client.android.AndroidDriver;
+import io.appium.java_client.android.AndroidElement;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.IgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.InProgressCategory;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.models.FileListView;;
+
+public class ShareLinkFileTestSuite{
+
+ AndroidDriver driver;
+ Common common;
+ private final String FILE_NAME = Config.fileToTestName;
+ private Boolean fileHasBeenCreated = false;
+
+ @Rule public TestName name = new TestName();
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class})
+ public void testShareLinkFileByGmail () throws Exception {
+ AndroidElement sharedElementIndicator;
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //TODO. if the file already exists, do not upload
+ FileListView fileListViewAfterUploadFile = Actions
+ .uploadFile(FILE_NAME, fileListView);
+
+ fileListViewAfterUploadFile.scrollTillFindElement(FILE_NAME);
+ assertTrue(fileHasBeenCreated = fileListViewAfterUploadFile
+ .getFileElement().isDisplayed());
+
+ sharedElementIndicator = Actions.shareLinkElementByGmail(FILE_NAME,
+ fileListViewAfterUploadFile,driver,common);
+ assertTrue(sharedElementIndicator.isDisplayed());
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testShareLinkFileByCopyLink () throws Exception {
+ AndroidElement sharedElementIndicator;
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //TODO. if the file already exists, do not upload
+ FileListView fileListViewAfterUploadFile = Actions
+ .uploadFile(FILE_NAME, fileListView);
+
+ fileListViewAfterUploadFile.scrollTillFindElement(FILE_NAME);
+ assertTrue(fileHasBeenCreated = fileListViewAfterUploadFile
+ .getFileElement().isDisplayed());
+
+ sharedElementIndicator = Actions.shareLinkElementByCopyLink(FILE_NAME,
+ fileListViewAfterUploadFile,driver,common);
+ assertTrue(sharedElementIndicator.isDisplayed());
+ }
+
+ @Test
+ @Category({IgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testUnshareLinkFile () throws Exception {
+ AndroidElement sharedElementIndicator;
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //TODO. if the file already exists, do not upload
+ FileListView fileListViewAfterUploadFile = Actions
+ .uploadFile(FILE_NAME, fileListView);
+
+ fileListViewAfterUploadFile.scrollTillFindElement(FILE_NAME);
+ assertTrue(fileHasBeenCreated = fileListViewAfterUploadFile
+ .getFileElement().isDisplayed());
+
+ sharedElementIndicator = Actions.shareLinkElementByCopyLink(FILE_NAME,
+ fileListViewAfterUploadFile,driver,common);
+ assertTrue(sharedElementIndicator.isDisplayed());
+ Actions.unshareLinkElement(FILE_NAME,
+ fileListViewAfterUploadFile,driver,common);
+ assertFalse(sharedElementIndicator.isDisplayed());
+
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ if (fileHasBeenCreated) {
+ FileListView fileListView = new FileListView(driver);
+ Actions.deleteElement(FILE_NAME,fileListView, driver);
+ }
+ driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author purigarcia
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.test.ui.testSuites;
+
+
+import static org.junit.Assert.*;
+import io.appium.java_client.MobileBy;
+import io.appium.java_client.android.AndroidDriver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runners.MethodSorters;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.NoSuchElementException;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import com.owncloud.android.test.ui.actions.Actions;
+import com.owncloud.android.test.ui.groups.FailingTestCategory;
+import com.owncloud.android.test.ui.groups.InProgressCategory;
+import com.owncloud.android.test.ui.groups.NoIgnoreTestCategory;
+import com.owncloud.android.test.ui.groups.SmokeTestCategory;
+import com.owncloud.android.test.ui.groups.UnfinishedTestCategory;
+import com.owncloud.android.test.ui.models.FileDetailsView;
+import com.owncloud.android.test.ui.models.ElementMenuOptions;
+import com.owncloud.android.test.ui.models.GmailEmailListView;
+import com.owncloud.android.test.ui.models.GmailEmailView;
+import com.owncloud.android.test.ui.models.ImageView;
+import com.owncloud.android.test.ui.models.FileListView;
+import com.owncloud.android.test.ui.models.NotificationView;
+import com.owncloud.android.test.ui.models.SettingsView;
+import com.owncloud.android.test.ui.models.UploadView;
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Category({NoIgnoreTestCategory.class})
+public class UploadTestSuite{
+
+ AndroidDriver driver;
+ Common common;
+ String FILE_NAME = Config.fileToTestName;
+ String BIG_FILE_NAME = Config.bigFileToTestName;
+ String FILE_GMAIL_NAME = Config.fileToTestSendByEmailName;
+ private Boolean fileHasBeenUploadedFromGmail = false;
+ private Boolean fileHasBeenUploaded = false;
+
+ @Rule public TestName name = new TestName();
+
+
+ @Before
+ public void setUp() throws Exception {
+ common=new Common();
+ driver=common.setUpCommonDriver();
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class, SmokeTestCategory.class})
+ public void testUploadFile () throws Exception {
+
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //check if the file already exists and if true, delete it
+ Actions.deleteElement(FILE_NAME, fileListView, driver);
+
+ FileListView fileListViewAfterUploadFile = Actions
+ .uploadFile(FILE_NAME, fileListView);
+
+ fileListViewAfterUploadFile.scrollTillFindElement(FILE_NAME);
+ assertTrue(fileListViewAfterUploadFile.getFileElement().isDisplayed());
+ Common.waitTillElementIsNotPresentWithoutTimeout(
+ fileListViewAfterUploadFile.getProgressCircular(), 1000);
+ common.wait.until(ExpectedConditions.visibilityOf(
+ fileListViewAfterUploadFile.getFileElementLayout()
+ .findElement(By.id(FileListView.getLocalFileIndicator()))));
+ assertTrue(fileListViewAfterUploadFile.getFileElementLayout()
+ .findElement(By.id(FileListView.getLocalFileIndicator()))
+ .isDisplayed());
+ fileListView = new FileListView(driver);
+ fileListView.scrollTillFindElement(FILE_NAME);
+ assertTrue(
+ fileHasBeenUploaded = fileListView.getFileElement().isDisplayed());
+ }
+
+
+
+ @Test
+ @Category({UnfinishedTestCategory.class})
+ public void testUploadBigFile () throws Exception {
+
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ //check if the file already exists and if true, delete it
+ Actions.deleteElement(BIG_FILE_NAME, fileListView, driver);
+
+ FileListView fileListViewAfterUploadFile = Actions
+ .uploadFile(BIG_FILE_NAME, fileListView);
+
+
+ driver.openNotifications();
+ NotificationView notificationView = new NotificationView(driver);
+
+ try{
+ if(notificationView.getUploadingNotification().isDisplayed()){
+ Common.waitTillElementIsPresent(
+ notificationView.getUploadSucceededNotification(),300000);
+ driver.sendKeyEvent(android.view.KeyEvent.KEYCODE_HOME);
+ driver.startActivity("com.owncloud.android",
+ ".ui.activity.FileDisplayActivity");
+
+ }
+ } catch (NoSuchElementException e) {
+ driver.sendKeyEvent(android.view.KeyEvent.KEYCODE_HOME);
+ driver.startActivity("com.owncloud.android",
+ ".ui.activity.FileDisplayActivity");
+ }
+
+ fileListViewAfterUploadFile.scrollTillFindElement(BIG_FILE_NAME);
+
+ assertTrue(fileListViewAfterUploadFile.getFileElement().isDisplayed());
+
+ Common.waitTillElementIsNotPresentWithoutTimeout(
+ fileListViewAfterUploadFile.getProgressCircular(), 1000);
+ common.wait.until(ExpectedConditions.visibilityOf(
+ fileListViewAfterUploadFile.getFileElementLayout()
+ .findElement(By.id(FileListView.getLocalFileIndicator()))));
+ assertTrue(fileListViewAfterUploadFile.getFileElementLayout()
+ .findElement(By.id(FileListView.getLocalFileIndicator()))
+ .isDisplayed());
+ fileListView = new FileListView(driver);
+ fileListView.scrollTillFindElement(BIG_FILE_NAME);
+ assertTrue(
+ fileHasBeenUploaded = fileListView.getFileElement().isDisplayed());
+ }
+
+
+ @Test
+ @Category(UnfinishedTestCategory.class)
+ public void testUploadFromGmail () throws Exception {
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ driver.startActivity("com.google.android.gm",
+ ".ConversationListActivityGmail");
+ GmailEmailListView gmailEmailListView = new GmailEmailListView(driver);
+ Thread.sleep(3000);
+ GmailEmailView gmailEmailView = gmailEmailListView.clickOnEmail();
+ ImageView imageView = gmailEmailView.clickOnfileButton();
+ imageView.clickOnOptionsButton();
+ imageView.clickOnShareButton();
+ imageView.clickOnOwnCloudButton();
+ //justonce button do not appear always
+ try{
+ imageView.clickOnJustOnceButton();
+ }catch (NoSuchElementException e) {
+ }
+ UploadView uploadView = new UploadView(driver);
+ uploadView.clickOUploadButton();
+ driver.sendKeyEvent(android.view.KeyEvent.KEYCODE_HOME);
+ driver.startActivity("com.owncloud.android",
+ ".ui.activity.FileDisplayActivity");
+ common.wait.until(ExpectedConditions
+ .visibilityOfAllElementsLocatedBy(By.name(FILE_GMAIL_NAME)));
+ assertEquals(Config.fileToTestSendByEmailName ,
+ driver.findElementByName(FILE_GMAIL_NAME).getText());
+ fileListView = new FileListView(driver);
+ fileListView.scrollTillFindElement(FILE_GMAIL_NAME);
+ assertTrue(fileHasBeenUploadedFromGmail = fileListView
+ .getFileElement().isDisplayed());
+ //TODO. correct assert if fileListView is shown in grid mode
+ }
+
+
+ @Test
+ @Category({FailingTestCategory.class})
+ public void testKeepFileUpToDate () throws Exception {
+
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ Common.waitTillElementIsNotPresentWithoutTimeout(fileListView.getProgressCircular(),
+ 1000);
+
+ FileListView fileListViewAfterUploadFile = Actions
+ .uploadFile(FILE_NAME, fileListView);
+ fileListViewAfterUploadFile.scrollTillFindElement(FILE_NAME);
+ assertTrue(fileHasBeenUploaded = fileListViewAfterUploadFile
+ .getFileElement().isDisplayed());
+
+ ElementMenuOptions menuOptions = fileListViewAfterUploadFile
+ .longPressOnElement(FILE_NAME);
+ FileDetailsView fileDetailsView = menuOptions.clickOnDetails();
+ fileDetailsView.checkKeepFileUpToDateCheckbox();
+ Thread.sleep(3000);
+ driver.sendKeyEvent(android.view.KeyEvent.KEYCODE_BACK);
+ assertTrue(common.isElementPresent(
+ fileListViewAfterUploadFile.getFileElementLayout(),
+ MobileBy.id(FileListView.getFavoriteFileIndicator())));
+ assertTrue(fileListViewAfterUploadFile.getFileElementLayout()
+ .findElement(By.id(FileListView.getFavoriteFileIndicator()))
+ .isDisplayed());
+ }
+
+ @Test
+ @Category({NoIgnoreTestCategory.class})
+ public void testKeepFileUpToDateAndRefresh () throws Exception {
+
+ FileListView fileListView = Actions.login(Config.URL, Config.user,
+ Config.password, Config.isTrusted, driver);
+ common.assertIsInFileListView();
+
+ Common.waitTillElementIsNotPresentWithoutTimeout(fileListView.getProgressCircular(),
+ 1000);
+
+ FileListView fileListViewAfterUploadFile = Actions
+ .uploadFile(FILE_NAME, fileListView);
+ fileListViewAfterUploadFile.scrollTillFindElement(FILE_NAME);
+ assertTrue(fileHasBeenUploaded = fileListViewAfterUploadFile
+ .getFileElement().isDisplayed());
+
+ ElementMenuOptions menuOptions = fileListViewAfterUploadFile
+ .longPressOnElement(FILE_NAME);
+ FileDetailsView fileDetailsView = menuOptions.clickOnDetails();
+ fileDetailsView.checkKeepFileUpToDateCheckbox();
+ Thread.sleep(3000);
+ driver.sendKeyEvent(android.view.KeyEvent.KEYCODE_BACK);
+
+ fileListViewAfterUploadFile.pulldownToRefresh();
+ //assertTrue(fileListView.getProgressCircular().isDisplayed());
+ Common.waitTillElementIsNotPresentWithoutTimeout(fileListView.getProgressCircular(),
+ 100);
+
+ assertTrue(common.isElementPresent(
+ fileListViewAfterUploadFile.getFileElementLayout(),
+ MobileBy.id(FileListView.getFavoriteFileIndicator())));
+ assertTrue(fileListViewAfterUploadFile.getFileElementLayout()
+ .findElement(By.id(FileListView.getFavoriteFileIndicator()))
+ .isDisplayed());
+ }
+
+
+ @After
+ public void tearDown() throws Exception {
+ common.takeScreenShotOnFailed(name.getMethodName());
+ FileListView fileListView = new FileListView(driver);
+ if (fileHasBeenUploadedFromGmail) {
+ Actions.deleteElement(FILE_GMAIL_NAME,fileListView, driver);
+ }
+ if(fileHasBeenUploaded){
+ Actions.deleteElement(FILE_NAME,fileListView, driver);
+ Actions.deleteElement(BIG_FILE_NAME,fileListView, driver);
+ }
+
+ //driver.removeApp("com.owncloud.android");
+ driver.quit();
+ }
+
+
+}
+
--- /dev/null
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
\ No newline at end of file
}
}
-artifacts.add("default", file('libs/actionbarsherlock.aar'))
-
dependencies {
compile name: 'touch-image-view'
compile 'com.android.support:support-v4:19.1.0'
- compile project('libs/actionbarsherlock_lib')
compile project(':owncloud-android-library')
compile 'com.jakewharton:disklrucache:2.0.2'
+ compile 'com.android.support:appcompat-v7:19.1.0'
}
android {
+++ /dev/null
-configurations.create("default")
-artifacts.add("default", file('library-4.1.0.aar'))
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="gen"/>
+ <classpathentry kind="output" path="bin/classes"/>
+</classpath>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>android-support-appcompat-v7-exploded-aar</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ApkBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.support.v7.appcompat">
+ <uses-sdk android:minSdkVersion="7"/>
+ <application />
+</manifest>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/AndroidManifest.xml -->
\ No newline at end of file
--- /dev/null
+int anim abc_fade_in 0x7f040000
+int anim abc_fade_out 0x7f040001
+int anim abc_slide_in_bottom 0x7f040002
+int anim abc_slide_in_top 0x7f040003
+int anim abc_slide_out_bottom 0x7f040004
+int anim abc_slide_out_top 0x7f040005
+int attr actionBarDivider 0x7f010000
+int attr actionBarItemBackground 0x7f010001
+int attr actionBarSize 0x7f010002
+int attr actionBarSplitStyle 0x7f010003
+int attr actionBarStyle 0x7f010004
+int attr actionBarTabBarStyle 0x7f010005
+int attr actionBarTabStyle 0x7f010006
+int attr actionBarTabTextStyle 0x7f010007
+int attr actionBarWidgetTheme 0x7f010008
+int attr actionButtonStyle 0x7f010009
+int attr actionDropDownStyle 0x7f010066
+int attr actionLayout 0x7f01005d
+int attr actionMenuTextAppearance 0x7f01000a
+int attr actionMenuTextColor 0x7f01000b
+int attr actionModeBackground 0x7f01000c
+int attr actionModeCloseButtonStyle 0x7f01000d
+int attr actionModeCloseDrawable 0x7f01000e
+int attr actionModeCopyDrawable 0x7f01000f
+int attr actionModeCutDrawable 0x7f010010
+int attr actionModeFindDrawable 0x7f010011
+int attr actionModePasteDrawable 0x7f010012
+int attr actionModePopupWindowStyle 0x7f010013
+int attr actionModeSelectAllDrawable 0x7f010014
+int attr actionModeShareDrawable 0x7f010015
+int attr actionModeSplitBackground 0x7f010016
+int attr actionModeStyle 0x7f010017
+int attr actionModeWebSearchDrawable 0x7f010018
+int attr actionOverflowButtonStyle 0x7f010019
+int attr actionProviderClass 0x7f01005f
+int attr actionViewClass 0x7f01005e
+int attr activityChooserViewStyle 0x7f01001a
+int attr background 0x7f010047
+int attr backgroundSplit 0x7f010049
+int attr backgroundStacked 0x7f010048
+int attr buttonBarButtonStyle 0x7f01001b
+int attr buttonBarStyle 0x7f01001c
+int attr customNavigationLayout 0x7f01004a
+int attr disableChildrenWhenDisabled 0x7f010065
+int attr displayOptions 0x7f010040
+int attr divider 0x7f010046
+int attr dividerHorizontal 0x7f01001d
+int attr dividerPadding 0x7f01005b
+int attr dividerVertical 0x7f01001e
+int attr dropDownListViewStyle 0x7f01001f
+int attr dropdownListPreferredItemHeight 0x7f010067
+int attr expandActivityOverflowButtonDrawable 0x7f010058
+int attr height 0x7f010020
+int attr homeAsUpIndicator 0x7f010021
+int attr homeLayout 0x7f01004b
+int attr icon 0x7f010044
+int attr iconifiedByDefault 0x7f010060
+int attr indeterminateProgressStyle 0x7f01004d
+int attr initialActivityCount 0x7f010057
+int attr isLightTheme 0x7f010022
+int attr itemPadding 0x7f01004f
+int attr listChoiceBackgroundIndicator 0x7f01006b
+int attr listPopupWindowStyle 0x7f010023
+int attr listPreferredItemHeight 0x7f010024
+int attr listPreferredItemHeightLarge 0x7f010025
+int attr listPreferredItemHeightSmall 0x7f010026
+int attr listPreferredItemPaddingLeft 0x7f010027
+int attr listPreferredItemPaddingRight 0x7f010028
+int attr logo 0x7f010045
+int attr navigationMode 0x7f01003f
+int attr paddingEnd 0x7f01006d
+int attr paddingStart 0x7f01006c
+int attr panelMenuListTheme 0x7f01006a
+int attr panelMenuListWidth 0x7f010069
+int attr popupMenuStyle 0x7f010068
+int attr popupPromptView 0x7f010064
+int attr progressBarPadding 0x7f01004e
+int attr progressBarStyle 0x7f01004c
+int attr prompt 0x7f010062
+int attr queryHint 0x7f010061
+int attr searchDropdownBackground 0x7f010029
+int attr searchResultListItemHeight 0x7f01002a
+int attr searchViewAutoCompleteTextView 0x7f01002b
+int attr searchViewCloseIcon 0x7f01002c
+int attr searchViewEditQuery 0x7f01002d
+int attr searchViewEditQueryBackground 0x7f01002e
+int attr searchViewGoIcon 0x7f01002f
+int attr searchViewSearchIcon 0x7f010030
+int attr searchViewTextField 0x7f010031
+int attr searchViewTextFieldRight 0x7f010032
+int attr searchViewVoiceIcon 0x7f010033
+int attr selectableItemBackground 0x7f010034
+int attr showAsAction 0x7f01005c
+int attr showDividers 0x7f01005a
+int attr spinnerDropDownItemStyle 0x7f010035
+int attr spinnerMode 0x7f010063
+int attr spinnerStyle 0x7f010036
+int attr subtitle 0x7f010041
+int attr subtitleTextStyle 0x7f010043
+int attr textAllCaps 0x7f010059
+int attr textAppearanceLargePopupMenu 0x7f010037
+int attr textAppearanceListItem 0x7f010038
+int attr textAppearanceListItemSmall 0x7f010039
+int attr textAppearanceSearchResultSubtitle 0x7f01003a
+int attr textAppearanceSearchResultTitle 0x7f01003b
+int attr textAppearanceSmallPopupMenu 0x7f01003c
+int attr textColorSearchUrl 0x7f01003d
+int attr title 0x7f01003e
+int attr titleTextStyle 0x7f010042
+int attr windowActionBar 0x7f010050
+int attr windowActionBarOverlay 0x7f010051
+int attr windowFixedHeightMajor 0x7f010056
+int attr windowFixedHeightMinor 0x7f010054
+int attr windowFixedWidthMajor 0x7f010053
+int attr windowFixedWidthMinor 0x7f010055
+int attr windowSplitActionBar 0x7f010052
+int bool abc_action_bar_embed_tabs_pre_jb 0x7f050000
+int bool abc_action_bar_expanded_action_views_exclusive 0x7f050001
+int bool abc_config_actionMenuItemAllCaps 0x7f050002
+int bool abc_config_allowActionMenuItemTextWithIcon 0x7f050003
+int bool abc_config_showMenuShortcutsWhenKeyboardPresent 0x7f050004
+int bool abc_split_action_bar_is_narrow 0x7f050005
+int color abc_search_url_text_holo 0x7f060003
+int color abc_search_url_text_normal 0x7f060000
+int color abc_search_url_text_pressed 0x7f060001
+int color abc_search_url_text_selected 0x7f060002
+int dimen abc_action_bar_default_height 0x7f080000
+int dimen abc_action_bar_icon_vertical_padding 0x7f080001
+int dimen abc_action_bar_progress_bar_size 0x7f080002
+int dimen abc_action_bar_stacked_max_height 0x7f080003
+int dimen abc_action_bar_stacked_tab_max_width 0x7f080004
+int dimen abc_action_bar_subtitle_bottom_margin 0x7f080005
+int dimen abc_action_bar_subtitle_text_size 0x7f080006
+int dimen abc_action_bar_subtitle_top_margin 0x7f080007
+int dimen abc_action_bar_title_text_size 0x7f080008
+int dimen abc_action_button_min_width 0x7f080009
+int dimen abc_config_prefDialogWidth 0x7f08000a
+int dimen abc_dropdownitem_icon_width 0x7f08000b
+int dimen abc_dropdownitem_text_padding_left 0x7f08000c
+int dimen abc_dropdownitem_text_padding_right 0x7f08000d
+int dimen abc_panel_menu_list_width 0x7f08000e
+int dimen abc_search_view_preferred_width 0x7f08000f
+int dimen abc_search_view_text_min_width 0x7f080010
+int dimen dialog_fixed_height_major 0x7f080011
+int dimen dialog_fixed_height_minor 0x7f080012
+int dimen dialog_fixed_width_major 0x7f080013
+int dimen dialog_fixed_width_minor 0x7f080014
+int drawable abc_ab_bottom_solid_dark_holo 0x7f020000
+int drawable abc_ab_bottom_solid_light_holo 0x7f020001
+int drawable abc_ab_bottom_transparent_dark_holo 0x7f020002
+int drawable abc_ab_bottom_transparent_light_holo 0x7f020003
+int drawable abc_ab_share_pack_holo_dark 0x7f020004
+int drawable abc_ab_share_pack_holo_light 0x7f020005
+int drawable abc_ab_solid_dark_holo 0x7f020006
+int drawable abc_ab_solid_light_holo 0x7f020007
+int drawable abc_ab_stacked_solid_dark_holo 0x7f020008
+int drawable abc_ab_stacked_solid_light_holo 0x7f020009
+int drawable abc_ab_stacked_transparent_dark_holo 0x7f02000a
+int drawable abc_ab_stacked_transparent_light_holo 0x7f02000b
+int drawable abc_ab_transparent_dark_holo 0x7f02000c
+int drawable abc_ab_transparent_light_holo 0x7f02000d
+int drawable abc_cab_background_bottom_holo_dark 0x7f02000e
+int drawable abc_cab_background_bottom_holo_light 0x7f02000f
+int drawable abc_cab_background_top_holo_dark 0x7f020010
+int drawable abc_cab_background_top_holo_light 0x7f020011
+int drawable abc_ic_ab_back_holo_dark 0x7f020012
+int drawable abc_ic_ab_back_holo_light 0x7f020013
+int drawable abc_ic_cab_done_holo_dark 0x7f020014
+int drawable abc_ic_cab_done_holo_light 0x7f020015
+int drawable abc_ic_clear 0x7f020016
+int drawable abc_ic_clear_disabled 0x7f020017
+int drawable abc_ic_clear_holo_light 0x7f020018
+int drawable abc_ic_clear_normal 0x7f020019
+int drawable abc_ic_clear_search_api_disabled_holo_light 0x7f02001a
+int drawable abc_ic_clear_search_api_holo_light 0x7f02001b
+int drawable abc_ic_commit_search_api_holo_dark 0x7f02001c
+int drawable abc_ic_commit_search_api_holo_light 0x7f02001d
+int drawable abc_ic_go 0x7f02001e
+int drawable abc_ic_go_search_api_holo_light 0x7f02001f
+int drawable abc_ic_menu_moreoverflow_normal_holo_dark 0x7f020020
+int drawable abc_ic_menu_moreoverflow_normal_holo_light 0x7f020021
+int drawable abc_ic_menu_share_holo_dark 0x7f020022
+int drawable abc_ic_menu_share_holo_light 0x7f020023
+int drawable abc_ic_search 0x7f020024
+int drawable abc_ic_search_api_holo_light 0x7f020025
+int drawable abc_ic_voice_search 0x7f020026
+int drawable abc_ic_voice_search_api_holo_light 0x7f020027
+int drawable abc_item_background_holo_dark 0x7f020028
+int drawable abc_item_background_holo_light 0x7f020029
+int drawable abc_list_divider_holo_dark 0x7f02002a
+int drawable abc_list_divider_holo_light 0x7f02002b
+int drawable abc_list_focused_holo 0x7f02002c
+int drawable abc_list_longpressed_holo 0x7f02002d
+int drawable abc_list_pressed_holo_dark 0x7f02002e
+int drawable abc_list_pressed_holo_light 0x7f02002f
+int drawable abc_list_selector_background_transition_holo_dark 0x7f020030
+int drawable abc_list_selector_background_transition_holo_light 0x7f020031
+int drawable abc_list_selector_disabled_holo_dark 0x7f020032
+int drawable abc_list_selector_disabled_holo_light 0x7f020033
+int drawable abc_list_selector_holo_dark 0x7f020034
+int drawable abc_list_selector_holo_light 0x7f020035
+int drawable abc_menu_dropdown_panel_holo_dark 0x7f020036
+int drawable abc_menu_dropdown_panel_holo_light 0x7f020037
+int drawable abc_menu_hardkey_panel_holo_dark 0x7f020038
+int drawable abc_menu_hardkey_panel_holo_light 0x7f020039
+int drawable abc_search_dropdown_dark 0x7f02003a
+int drawable abc_search_dropdown_light 0x7f02003b
+int drawable abc_spinner_ab_default_holo_dark 0x7f02003c
+int drawable abc_spinner_ab_default_holo_light 0x7f02003d
+int drawable abc_spinner_ab_disabled_holo_dark 0x7f02003e
+int drawable abc_spinner_ab_disabled_holo_light 0x7f02003f
+int drawable abc_spinner_ab_focused_holo_dark 0x7f020040
+int drawable abc_spinner_ab_focused_holo_light 0x7f020041
+int drawable abc_spinner_ab_holo_dark 0x7f020042
+int drawable abc_spinner_ab_holo_light 0x7f020043
+int drawable abc_spinner_ab_pressed_holo_dark 0x7f020044
+int drawable abc_spinner_ab_pressed_holo_light 0x7f020045
+int drawable abc_tab_indicator_ab_holo 0x7f020046
+int drawable abc_tab_selected_focused_holo 0x7f020047
+int drawable abc_tab_selected_holo 0x7f020048
+int drawable abc_tab_selected_pressed_holo 0x7f020049
+int drawable abc_tab_unselected_pressed_holo 0x7f02004a
+int drawable abc_textfield_search_default_holo_dark 0x7f02004b
+int drawable abc_textfield_search_default_holo_light 0x7f02004c
+int drawable abc_textfield_search_right_default_holo_dark 0x7f02004d
+int drawable abc_textfield_search_right_default_holo_light 0x7f02004e
+int drawable abc_textfield_search_right_selected_holo_dark 0x7f02004f
+int drawable abc_textfield_search_right_selected_holo_light 0x7f020050
+int drawable abc_textfield_search_selected_holo_dark 0x7f020051
+int drawable abc_textfield_search_selected_holo_light 0x7f020052
+int drawable abc_textfield_searchview_holo_dark 0x7f020053
+int drawable abc_textfield_searchview_holo_light 0x7f020054
+int drawable abc_textfield_searchview_right_holo_dark 0x7f020055
+int drawable abc_textfield_searchview_right_holo_light 0x7f020056
+int id action_bar 0x7f07001c
+int id action_bar_activity_content 0x7f070014
+int id action_bar_container 0x7f07001b
+int id action_bar_overlay_layout 0x7f07001f
+int id action_bar_root 0x7f07001a
+int id action_bar_subtitle 0x7f070023
+int id action_bar_title 0x7f070022
+int id action_context_bar 0x7f07001d
+int id action_menu_divider 0x7f070015
+int id action_menu_presenter 0x7f070016
+int id action_mode_close_button 0x7f070024
+int id activity_chooser_view_content 0x7f070025
+int id always 0x7f07000f
+int id beginning 0x7f07000a
+int id checkbox 0x7f07002d
+int id collapseActionView 0x7f070011
+int id default_activity_button 0x7f070028
+int id dialog 0x7f070012
+int id disableHome 0x7f070008
+int id dropdown 0x7f070013
+int id edit_query 0x7f070030
+int id end 0x7f07000c
+int id expand_activities_button 0x7f070026
+int id expanded_menu 0x7f07002c
+int id home 0x7f070017
+int id homeAsUp 0x7f070005
+int id icon 0x7f07002a
+int id ifRoom 0x7f07000e
+int id image 0x7f070027
+int id listMode 0x7f070001
+int id list_item 0x7f070029
+int id middle 0x7f07000b
+int id never 0x7f07000d
+int id none 0x7f070009
+int id normal 0x7f070000
+int id progress_circular 0x7f070018
+int id progress_horizontal 0x7f070019
+int id radio 0x7f07002f
+int id search_badge 0x7f070032
+int id search_bar 0x7f070031
+int id search_button 0x7f070033
+int id search_close_btn 0x7f070038
+int id search_edit_frame 0x7f070034
+int id search_go_btn 0x7f07003a
+int id search_mag_icon 0x7f070035
+int id search_plate 0x7f070036
+int id search_src_text 0x7f070037
+int id search_voice_btn 0x7f07003b
+int id shortcut 0x7f07002e
+int id showCustom 0x7f070007
+int id showHome 0x7f070004
+int id showTitle 0x7f070006
+int id split_action_bar 0x7f07001e
+int id submit_area 0x7f070039
+int id tabMode 0x7f070002
+int id title 0x7f07002b
+int id top_action_bar 0x7f070020
+int id up 0x7f070021
+int id useLogo 0x7f070003
+int id withText 0x7f070010
+int integer abc_max_action_buttons 0x7f090000
+int layout abc_action_bar_decor 0x7f030000
+int layout abc_action_bar_decor_include 0x7f030001
+int layout abc_action_bar_decor_overlay 0x7f030002
+int layout abc_action_bar_home 0x7f030003
+int layout abc_action_bar_tab 0x7f030004
+int layout abc_action_bar_tabbar 0x7f030005
+int layout abc_action_bar_title_item 0x7f030006
+int layout abc_action_bar_view_list_nav_layout 0x7f030007
+int layout abc_action_menu_item_layout 0x7f030008
+int layout abc_action_menu_layout 0x7f030009
+int layout abc_action_mode_bar 0x7f03000a
+int layout abc_action_mode_close_item 0x7f03000b
+int layout abc_activity_chooser_view 0x7f03000c
+int layout abc_activity_chooser_view_include 0x7f03000d
+int layout abc_activity_chooser_view_list_item 0x7f03000e
+int layout abc_expanded_menu_layout 0x7f03000f
+int layout abc_list_menu_item_checkbox 0x7f030010
+int layout abc_list_menu_item_icon 0x7f030011
+int layout abc_list_menu_item_layout 0x7f030012
+int layout abc_list_menu_item_radio 0x7f030013
+int layout abc_popup_menu_item_layout 0x7f030014
+int layout abc_search_dropdown_item_icons_2line 0x7f030015
+int layout abc_search_view 0x7f030016
+int layout abc_simple_decor 0x7f030017
+int layout support_simple_spinner_dropdown_item 0x7f030018
+int string abc_action_bar_home_description 0x7f0a0000
+int string abc_action_bar_up_description 0x7f0a0001
+int string abc_action_menu_overflow_description 0x7f0a0002
+int string abc_action_mode_done 0x7f0a0003
+int string abc_activity_chooser_view_see_all 0x7f0a0004
+int string abc_activitychooserview_choose_application 0x7f0a0005
+int string abc_searchview_description_clear 0x7f0a0006
+int string abc_searchview_description_query 0x7f0a0007
+int string abc_searchview_description_search 0x7f0a0008
+int string abc_searchview_description_submit 0x7f0a0009
+int string abc_searchview_description_voice 0x7f0a000a
+int string abc_shareactionprovider_share_with 0x7f0a000b
+int string abc_shareactionprovider_share_with_application 0x7f0a000c
+int style TextAppearance_AppCompat_Base_CompactMenu_Dialog 0x7f0b0000
+int style TextAppearance_AppCompat_Base_SearchResult 0x7f0b0001
+int style TextAppearance_AppCompat_Base_SearchResult_Subtitle 0x7f0b0002
+int style TextAppearance_AppCompat_Base_SearchResult_Title 0x7f0b0003
+int style TextAppearance_AppCompat_Base_Widget_PopupMenu_Large 0x7f0b0004
+int style TextAppearance_AppCompat_Base_Widget_PopupMenu_Small 0x7f0b0005
+int style TextAppearance_AppCompat_Light_Base_SearchResult 0x7f0b0006
+int style TextAppearance_AppCompat_Light_Base_SearchResult_Subtitle 0x7f0b0007
+int style TextAppearance_AppCompat_Light_Base_SearchResult_Title 0x7f0b0008
+int style TextAppearance_AppCompat_Light_Base_Widget_PopupMenu_Large 0x7f0b0009
+int style TextAppearance_AppCompat_Light_Base_Widget_PopupMenu_Small 0x7f0b000a
+int style TextAppearance_AppCompat_Light_SearchResult_Subtitle 0x7f0b000b
+int style TextAppearance_AppCompat_Light_SearchResult_Title 0x7f0b000c
+int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f0b000d
+int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f0b000e
+int style TextAppearance_AppCompat_SearchResult_Subtitle 0x7f0b000f
+int style TextAppearance_AppCompat_SearchResult_Title 0x7f0b0010
+int style TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f0b0011
+int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f0b0012
+int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f0b0013
+int style TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f0b0014
+int style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f0b0015
+int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f0b0016
+int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse 0x7f0b0017
+int style TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f0b0018
+int style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse 0x7f0b0019
+int style TextAppearance_AppCompat_Widget_Base_ActionBar_Menu 0x7f0b001a
+int style TextAppearance_AppCompat_Widget_Base_ActionBar_Subtitle 0x7f0b001b
+int style TextAppearance_AppCompat_Widget_Base_ActionBar_Subtitle_Inverse 0x7f0b001c
+int style TextAppearance_AppCompat_Widget_Base_ActionBar_Title 0x7f0b001d
+int style TextAppearance_AppCompat_Widget_Base_ActionBar_Title_Inverse 0x7f0b001e
+int style TextAppearance_AppCompat_Widget_Base_ActionMode_Subtitle 0x7f0b001f
+int style TextAppearance_AppCompat_Widget_Base_ActionMode_Subtitle_Inverse 0x7f0b0020
+int style TextAppearance_AppCompat_Widget_Base_ActionMode_Title 0x7f0b0021
+int style TextAppearance_AppCompat_Widget_Base_ActionMode_Title_Inverse 0x7f0b0022
+int style TextAppearance_AppCompat_Widget_Base_DropDownItem 0x7f0b0023
+int style TextAppearance_AppCompat_Widget_DropDownItem 0x7f0b0024
+int style TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f0b0025
+int style TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f0b0026
+int style TextAppearance_Widget_AppCompat_Base_ExpandedMenu_Item 0x7f0b0027
+int style TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f0b0028
+int style Theme_AppCompat 0x7f0b0029
+int style Theme_AppCompat_Base_CompactMenu 0x7f0b002a
+int style Theme_AppCompat_Base_CompactMenu_Dialog 0x7f0b002b
+int style Theme_AppCompat_CompactMenu 0x7f0b002c
+int style Theme_AppCompat_CompactMenu_Dialog 0x7f0b002d
+int style Theme_AppCompat_DialogWhenLarge 0x7f0b002e
+int style Theme_AppCompat_Light 0x7f0b002f
+int style Theme_AppCompat_Light_DarkActionBar 0x7f0b0030
+int style Theme_AppCompat_Light_DialogWhenLarge 0x7f0b0031
+int style Theme_Base 0x7f0b0032
+int style Theme_Base_AppCompat 0x7f0b0033
+int style Theme_Base_AppCompat_Dialog_FixedSize 0x7f0b0034
+int style Theme_Base_AppCompat_Dialog_Light_FixedSize 0x7f0b0035
+int style Theme_Base_AppCompat_DialogWhenLarge 0x7f0b0036
+int style Theme_Base_AppCompat_DialogWhenLarge_Base 0x7f0b0089
+int style Theme_Base_AppCompat_Light 0x7f0b0037
+int style Theme_Base_AppCompat_Light_DarkActionBar 0x7f0b0038
+int style Theme_Base_AppCompat_Light_DialogWhenLarge 0x7f0b0039
+int style Theme_Base_AppCompat_Light_DialogWhenLarge_Base 0x7f0b008a
+int style Theme_Base_Light 0x7f0b003a
+int style Widget_AppCompat_ActionBar 0x7f0b003b
+int style Widget_AppCompat_ActionBar_Solid 0x7f0b003c
+int style Widget_AppCompat_ActionBar_TabBar 0x7f0b003d
+int style Widget_AppCompat_ActionBar_TabText 0x7f0b003e
+int style Widget_AppCompat_ActionBar_TabView 0x7f0b003f
+int style Widget_AppCompat_ActionButton 0x7f0b0040
+int style Widget_AppCompat_ActionButton_CloseMode 0x7f0b0041
+int style Widget_AppCompat_ActionButton_Overflow 0x7f0b0042
+int style Widget_AppCompat_ActionMode 0x7f0b0043
+int style Widget_AppCompat_ActivityChooserView 0x7f0b0044
+int style Widget_AppCompat_AutoCompleteTextView 0x7f0b0045
+int style Widget_AppCompat_Base_ActionBar 0x7f0b0046
+int style Widget_AppCompat_Base_ActionBar_Solid 0x7f0b0047
+int style Widget_AppCompat_Base_ActionBar_TabBar 0x7f0b0048
+int style Widget_AppCompat_Base_ActionBar_TabText 0x7f0b0049
+int style Widget_AppCompat_Base_ActionBar_TabView 0x7f0b004a
+int style Widget_AppCompat_Base_ActionButton 0x7f0b004b
+int style Widget_AppCompat_Base_ActionButton_CloseMode 0x7f0b004c
+int style Widget_AppCompat_Base_ActionButton_Overflow 0x7f0b004d
+int style Widget_AppCompat_Base_ActionMode 0x7f0b004e
+int style Widget_AppCompat_Base_ActivityChooserView 0x7f0b004f
+int style Widget_AppCompat_Base_AutoCompleteTextView 0x7f0b0050
+int style Widget_AppCompat_Base_DropDownItem_Spinner 0x7f0b0051
+int style Widget_AppCompat_Base_ListPopupWindow 0x7f0b0052
+int style Widget_AppCompat_Base_ListView_DropDown 0x7f0b0053
+int style Widget_AppCompat_Base_ListView_Menu 0x7f0b0054
+int style Widget_AppCompat_Base_PopupMenu 0x7f0b0055
+int style Widget_AppCompat_Base_ProgressBar 0x7f0b0056
+int style Widget_AppCompat_Base_ProgressBar_Horizontal 0x7f0b0057
+int style Widget_AppCompat_Base_Spinner 0x7f0b0058
+int style Widget_AppCompat_DropDownItem_Spinner 0x7f0b0059
+int style Widget_AppCompat_Light_ActionBar 0x7f0b005a
+int style Widget_AppCompat_Light_ActionBar_Solid 0x7f0b005b
+int style Widget_AppCompat_Light_ActionBar_Solid_Inverse 0x7f0b005c
+int style Widget_AppCompat_Light_ActionBar_TabBar 0x7f0b005d
+int style Widget_AppCompat_Light_ActionBar_TabBar_Inverse 0x7f0b005e
+int style Widget_AppCompat_Light_ActionBar_TabText 0x7f0b005f
+int style Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f0b0060
+int style Widget_AppCompat_Light_ActionBar_TabView 0x7f0b0061
+int style Widget_AppCompat_Light_ActionBar_TabView_Inverse 0x7f0b0062
+int style Widget_AppCompat_Light_ActionButton 0x7f0b0063
+int style Widget_AppCompat_Light_ActionButton_CloseMode 0x7f0b0064
+int style Widget_AppCompat_Light_ActionButton_Overflow 0x7f0b0065
+int style Widget_AppCompat_Light_ActionMode_Inverse 0x7f0b0066
+int style Widget_AppCompat_Light_ActivityChooserView 0x7f0b0067
+int style Widget_AppCompat_Light_AutoCompleteTextView 0x7f0b0068
+int style Widget_AppCompat_Light_Base_ActionBar 0x7f0b0069
+int style Widget_AppCompat_Light_Base_ActionBar_Solid 0x7f0b006a
+int style Widget_AppCompat_Light_Base_ActionBar_Solid_Inverse 0x7f0b006b
+int style Widget_AppCompat_Light_Base_ActionBar_TabBar 0x7f0b006c
+int style Widget_AppCompat_Light_Base_ActionBar_TabBar_Inverse 0x7f0b006d
+int style Widget_AppCompat_Light_Base_ActionBar_TabText 0x7f0b006e
+int style Widget_AppCompat_Light_Base_ActionBar_TabText_Inverse 0x7f0b006f
+int style Widget_AppCompat_Light_Base_ActionBar_TabView 0x7f0b0070
+int style Widget_AppCompat_Light_Base_ActionBar_TabView_Inverse 0x7f0b0071
+int style Widget_AppCompat_Light_Base_ActionButton 0x7f0b0072
+int style Widget_AppCompat_Light_Base_ActionButton_CloseMode 0x7f0b0073
+int style Widget_AppCompat_Light_Base_ActionButton_Overflow 0x7f0b0074
+int style Widget_AppCompat_Light_Base_ActionMode_Inverse 0x7f0b0075
+int style Widget_AppCompat_Light_Base_ActivityChooserView 0x7f0b0076
+int style Widget_AppCompat_Light_Base_AutoCompleteTextView 0x7f0b0077
+int style Widget_AppCompat_Light_Base_DropDownItem_Spinner 0x7f0b0078
+int style Widget_AppCompat_Light_Base_ListPopupWindow 0x7f0b0079
+int style Widget_AppCompat_Light_Base_ListView_DropDown 0x7f0b007a
+int style Widget_AppCompat_Light_Base_PopupMenu 0x7f0b007b
+int style Widget_AppCompat_Light_Base_Spinner 0x7f0b007c
+int style Widget_AppCompat_Light_DropDownItem_Spinner 0x7f0b007d
+int style Widget_AppCompat_Light_ListPopupWindow 0x7f0b007e
+int style Widget_AppCompat_Light_ListView_DropDown 0x7f0b007f
+int style Widget_AppCompat_Light_PopupMenu 0x7f0b0080
+int style Widget_AppCompat_Light_Spinner_DropDown_ActionBar 0x7f0b0081
+int style Widget_AppCompat_ListPopupWindow 0x7f0b0082
+int style Widget_AppCompat_ListView_DropDown 0x7f0b0083
+int style Widget_AppCompat_ListView_Menu 0x7f0b0084
+int style Widget_AppCompat_PopupMenu 0x7f0b0085
+int style Widget_AppCompat_ProgressBar 0x7f0b0086
+int style Widget_AppCompat_ProgressBar_Horizontal 0x7f0b0087
+int style Widget_AppCompat_Spinner_DropDown_ActionBar 0x7f0b0088
+int[] styleable ActionBar { 0x7f010020, 0x7f01003e, 0x7f01003f, 0x7f010040, 0x7f010041, 0x7f010042, 0x7f010043, 0x7f010044, 0x7f010045, 0x7f010046, 0x7f010047, 0x7f010048, 0x7f010049, 0x7f01004a, 0x7f01004b, 0x7f01004c, 0x7f01004d, 0x7f01004e, 0x7f01004f }
+int styleable ActionBar_background 10
+int styleable ActionBar_backgroundSplit 12
+int styleable ActionBar_backgroundStacked 11
+int styleable ActionBar_customNavigationLayout 13
+int styleable ActionBar_displayOptions 3
+int styleable ActionBar_divider 9
+int styleable ActionBar_height 0
+int styleable ActionBar_homeLayout 14
+int styleable ActionBar_icon 7
+int styleable ActionBar_indeterminateProgressStyle 16
+int styleable ActionBar_itemPadding 18
+int styleable ActionBar_logo 8
+int styleable ActionBar_navigationMode 2
+int styleable ActionBar_progressBarPadding 17
+int styleable ActionBar_progressBarStyle 15
+int styleable ActionBar_subtitle 4
+int styleable ActionBar_subtitleTextStyle 6
+int styleable ActionBar_title 1
+int styleable ActionBar_titleTextStyle 5
+int[] styleable ActionBarLayout { 0x010100b3 }
+int styleable ActionBarLayout_android_layout_gravity 0
+int[] styleable ActionBarWindow { 0x7f010050, 0x7f010051, 0x7f010052, 0x7f010053, 0x7f010054, 0x7f010055, 0x7f010056 }
+int styleable ActionBarWindow_windowActionBar 0
+int styleable ActionBarWindow_windowActionBarOverlay 1
+int styleable ActionBarWindow_windowFixedHeightMajor 6
+int styleable ActionBarWindow_windowFixedHeightMinor 4
+int styleable ActionBarWindow_windowFixedWidthMajor 3
+int styleable ActionBarWindow_windowFixedWidthMinor 5
+int styleable ActionBarWindow_windowSplitActionBar 2
+int[] styleable ActionMenuItemView { 0x0101013f }
+int styleable ActionMenuItemView_android_minWidth 0
+int[] styleable ActionMenuView { }
+int[] styleable ActionMode { 0x7f010020, 0x7f010042, 0x7f010043, 0x7f010047, 0x7f010049 }
+int styleable ActionMode_background 3
+int styleable ActionMode_backgroundSplit 4
+int styleable ActionMode_height 0
+int styleable ActionMode_subtitleTextStyle 2
+int styleable ActionMode_titleTextStyle 1
+int[] styleable ActivityChooserView { 0x7f010057, 0x7f010058 }
+int styleable ActivityChooserView_expandActivityOverflowButtonDrawable 1
+int styleable ActivityChooserView_initialActivityCount 0
+int[] styleable CompatTextView { 0x7f010059 }
+int styleable CompatTextView_textAllCaps 0
+int[] styleable LinearLayoutICS { 0x7f010046, 0x7f01005a, 0x7f01005b }
+int styleable LinearLayoutICS_divider 0
+int styleable LinearLayoutICS_dividerPadding 2
+int styleable LinearLayoutICS_showDividers 1
+int[] styleable MenuGroup { 0x0101000e, 0x010100d0, 0x01010194, 0x010101de, 0x010101df, 0x010101e0 }
+int styleable MenuGroup_android_checkableBehavior 5
+int styleable MenuGroup_android_enabled 0
+int styleable MenuGroup_android_id 1
+int styleable MenuGroup_android_menuCategory 3
+int styleable MenuGroup_android_orderInCategory 4
+int styleable MenuGroup_android_visible 2
+int[] styleable MenuItem { 0x01010002, 0x0101000e, 0x010100d0, 0x01010106, 0x01010194, 0x010101de, 0x010101df, 0x010101e1, 0x010101e2, 0x010101e3, 0x010101e4, 0x010101e5, 0x0101026f, 0x7f01005c, 0x7f01005d, 0x7f01005e, 0x7f01005f }
+int styleable MenuItem_actionLayout 14
+int styleable MenuItem_actionProviderClass 16
+int styleable MenuItem_actionViewClass 15
+int styleable MenuItem_android_alphabeticShortcut 9
+int styleable MenuItem_android_checkable 11
+int styleable MenuItem_android_checked 3
+int styleable MenuItem_android_enabled 1
+int styleable MenuItem_android_icon 0
+int styleable MenuItem_android_id 2
+int styleable MenuItem_android_menuCategory 5
+int styleable MenuItem_android_numericShortcut 10
+int styleable MenuItem_android_onClick 12
+int styleable MenuItem_android_orderInCategory 6
+int styleable MenuItem_android_title 7
+int styleable MenuItem_android_titleCondensed 8
+int styleable MenuItem_android_visible 4
+int styleable MenuItem_showAsAction 13
+int[] styleable MenuView { 0x010100ae, 0x0101012c, 0x0101012d, 0x0101012e, 0x0101012f, 0x01010130, 0x01010131, 0x01010435 }
+int styleable MenuView_android_headerBackground 4
+int styleable MenuView_android_horizontalDivider 2
+int styleable MenuView_android_itemBackground 5
+int styleable MenuView_android_itemIconDisabledAlpha 6
+int styleable MenuView_android_itemTextAppearance 1
+int styleable MenuView_android_preserveIconSpacing 7
+int styleable MenuView_android_verticalDivider 3
+int styleable MenuView_android_windowAnimationStyle 0
+int[] styleable SearchView { 0x0101011f, 0x01010220, 0x01010264, 0x7f010060, 0x7f010061 }
+int styleable SearchView_android_imeOptions 2
+int styleable SearchView_android_inputType 1
+int styleable SearchView_android_maxWidth 0
+int styleable SearchView_iconifiedByDefault 3
+int styleable SearchView_queryHint 4
+int[] styleable Spinner { 0x010100af, 0x01010175, 0x01010176, 0x01010262, 0x010102ac, 0x010102ad, 0x7f010062, 0x7f010063, 0x7f010064, 0x7f010065 }
+int styleable Spinner_android_dropDownHorizontalOffset 4
+int styleable Spinner_android_dropDownSelector 1
+int styleable Spinner_android_dropDownVerticalOffset 5
+int styleable Spinner_android_dropDownWidth 3
+int styleable Spinner_android_gravity 0
+int styleable Spinner_android_popupBackground 2
+int styleable Spinner_disableChildrenWhenDisabled 9
+int styleable Spinner_popupPromptView 8
+int styleable Spinner_prompt 6
+int styleable Spinner_spinnerMode 7
+int[] styleable Theme { 0x7f010066, 0x7f010067, 0x7f010068, 0x7f010069, 0x7f01006a, 0x7f01006b }
+int styleable Theme_actionDropDownStyle 0
+int styleable Theme_dropdownListPreferredItemHeight 1
+int styleable Theme_listChoiceBackgroundIndicator 5
+int styleable Theme_panelMenuListTheme 4
+int styleable Theme_panelMenuListWidth 3
+int styleable Theme_popupMenuStyle 2
+int[] styleable View { 0x010100da, 0x7f01006c, 0x7f01006d }
+int styleable View_android_focusable 0
+int styleable View_paddingEnd 2
+int styleable View_paddingStart 1
--- /dev/null
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="android-support-appcompat-v7-exploded-aar" default="help">
+
+ <!-- The local.properties file is created and updated by the 'android' tool.
+ It contains the path to the SDK. It should *NOT* be checked into
+ Version Control Systems. -->
+ <property file="local.properties" />
+
+ <!-- The ant.properties file can be created by you. It is only edited by the
+ 'android' tool to add properties to it.
+ This is the place to change some Ant specific build properties.
+ Here are some properties you may want to change/update:
+
+ source.dir
+ The name of the source directory. Default is 'src'.
+ out.dir
+ The name of the output directory. Default is 'bin'.
+
+ For other overridable properties, look at the beginning of the rules
+ files in the SDK, at tools/ant/build.xml
+
+ Properties related to the SDK location or the project target should
+ be updated using the 'android' tool with the 'update' action.
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems.
+
+ -->
+ <property file="ant.properties" />
+
+ <!-- if sdk.dir was not set from one of the property file, then
+ get it from the ANDROID_HOME env var.
+ This must be done before we load project.properties since
+ the proguard config can use sdk.dir -->
+ <property environment="env" />
+ <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+ <isset property="env.ANDROID_HOME" />
+ </condition>
+
+ <!-- The project.properties file is created and updated by the 'android'
+ tool, as well as ADT.
+
+ This contains project specific properties such as project target, and library
+ dependencies. Lower level build properties are stored in ant.properties
+ (or in .classpath for Eclipse projects).
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems. -->
+ <loadproperties srcFile="project.properties" />
+
+ <!-- quick check on sdk.dir -->
+ <fail
+ message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+ unless="sdk.dir"
+ />
+
+ <!--
+ Import per project custom build rules if present at the root of the project.
+ This is the place to put custom intermediary targets such as:
+ -pre-build
+ -pre-compile
+ -post-compile (This is typically used for code obfuscation.
+ Compiled code location: ${out.classes.absolute.dir}
+ If this is not done in place, override ${out.dex.input.absolute.dir})
+ -post-package
+ -post-build
+ -pre-clean
+ -->
+ <import file="custom_rules.xml" optional="true" />
+
+ <!-- Import the actual build file.
+
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ <import> task.
+ - customize it to your needs.
+ - Customize the whole content of build.xml
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, replacing the <import> task.
+ - customize to your needs.
+
+ ***********************
+ ****** IMPORTANT ******
+ ***********************
+ In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+ in order to avoid having your file be overridden by tools such as "android update project"
+ -->
+ <!-- version-tag: 1 -->
+ <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
--- /dev/null
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-16
+android.library=true
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/decelerate_interpolator"
+ android:fromAlpha="0.0" android:toAlpha="1.0"
+ android:duration="@android:integer/config_mediumAnimTime" /><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/anim/abc_fade_in.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/decelerate_interpolator"
+ android:fromAlpha="1.0" android:toAlpha="0.0"
+ android:duration="@android:integer/config_mediumAnimTime" /><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/anim/abc_fade_out.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<translate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/decelerate_interpolator"
+ android:fromYDelta="50%p" android:toYDelta="0"
+ android:duration="@android:integer/config_mediumAnimTime"/>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/anim/abc_slide_in_bottom.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<translate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/decelerate_interpolator"
+ android:fromYDelta="-50%p" android:toYDelta="0"
+ android:duration="@android:integer/config_mediumAnimTime"/><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/anim/abc_slide_in_top.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<translate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/accelerate_interpolator"
+ android:fromYDelta="0" android:toYDelta="50%p"
+ android:duration="@android:integer/config_mediumAnimTime"/><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/anim/abc_slide_out_bottom.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<translate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@android:anim/accelerate_interpolator"
+ android:fromYDelta="0" android:toYDelta="-50%p"
+ android:duration="@android:integer/config_mediumAnimTime"/><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/anim/abc_slide_out_top.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:color="@color/abc_search_url_text_pressed"/>
+ <item android:state_selected="true" android:color="@color/abc_search_url_text_selected"/>
+ <item android:color="@color/abc_search_url_text_normal"/> <!-- not selected -->
+</selector><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/color/abc_search_url_text_holo.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="false"
+ android:drawable="@drawable/abc_ic_clear_disabled" />
+ <item
+ android:drawable="@drawable/abc_ic_clear_normal" />
+</selector>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_ic_clear.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="false"
+ android:drawable="@drawable/abc_ic_clear_search_api_disabled_holo_light" />
+ <item
+ android:drawable="@drawable/abc_ic_clear_search_api_holo_light" />
+</selector>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_ic_clear_holo_light.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
+ <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_disabled_holo_dark" />
+ <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/abc_list_selector_disabled_holo_dark" />
+ <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_dark" />
+ <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_dark" />
+ <item android:state_focused="true" android:drawable="@drawable/abc_list_focused_holo" />
+ <item android:drawable="@android:color/transparent" />
+</selector>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_item_background_holo_dark.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
+ <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_disabled_holo_light" />
+ <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/abc_list_selector_disabled_holo_light" />
+ <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_light" />
+ <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_light" />
+ <item android:state_focused="true" android:drawable="@drawable/abc_list_focused_holo" />
+ <item android:drawable="@android:color/transparent" />
+</selector>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_item_background_holo_light.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<transition xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/abc_list_pressed_holo_dark" />
+ <item android:drawable="@drawable/abc_list_longpressed_holo" />
+</transition>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_list_selector_background_transition_holo_dark.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<transition xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/abc_list_pressed_holo_light" />
+ <item android:drawable="@drawable/abc_list_longpressed_holo" />
+</transition>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_list_selector_background_transition_holo_light.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_window_focused="false" android:drawable="@android:color/transparent" />
+
+ <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
+ <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_disabled_holo_dark" />
+ <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/abc_list_selector_disabled_holo_dark" />
+ <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_dark" />
+ <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_dark" />
+ <item android:state_focused="true" android:drawable="@drawable/abc_list_focused_holo" />
+</selector>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_list_selector_holo_dark.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_window_focused="false" android:drawable="@android:color/transparent" />
+
+ <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
+ <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_disabled_holo_light" />
+ <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/abc_list_selector_disabled_holo_light" />
+ <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_light" />
+ <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_light" />
+ <item android:state_focused="true" android:drawable="@drawable/abc_list_focused_holo" />
+
+</selector>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_list_selector_holo_light.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#F0A0A0A0"/>
+ <stroke android:width="2dp" color="#A00080FF"/>
+ <padding android:left="5dp" android:top="0dp"
+ android:right="5dp" android:bottom="1dp" />
+</shape>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_search_dropdown_dark.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#F0FFFFFF"/>
+ <stroke android:width="1dp" color="#A00080FF"/>
+ <padding android:left="5dp" android:top="0dp"
+ android:right="5dp" android:bottom="1dp" />
+</shape>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_search_dropdown_light.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="false"
+ android:drawable="@drawable/abc_spinner_ab_disabled_holo_dark" />
+ <item android:state_pressed="true"
+ android:drawable="@drawable/abc_spinner_ab_pressed_holo_dark" />
+ <item android:state_pressed="false" android:state_focused="true"
+ android:drawable="@drawable/abc_spinner_ab_focused_holo_dark" />
+ <item android:drawable="@drawable/abc_spinner_ab_default_holo_dark" />
+</selector>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_spinner_ab_holo_dark.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="false"
+ android:drawable="@drawable/abc_spinner_ab_disabled_holo_light" />
+ <item android:state_pressed="true"
+ android:drawable="@drawable/abc_spinner_ab_pressed_holo_light" />
+ <item android:state_pressed="false" android:state_focused="true"
+ android:drawable="@drawable/abc_spinner_ab_focused_holo_light" />
+ <item android:drawable="@drawable/abc_spinner_ab_default_holo_light" />
+</selector>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_spinner_ab_holo_light.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- Non focused states -->
+ <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@android:color/transparent" />
+ <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/abc_tab_selected_holo" />
+
+ <!-- Focused states -->
+ <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/abc_list_focused_holo" />
+ <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/abc_tab_selected_focused_holo" />
+
+ <!-- Pressed -->
+ <!-- Non focused states -->
+ <item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/abc_list_pressed_holo_dark" />
+ <item android:state_focused="false" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/abc_tab_selected_pressed_holo" />
+
+ <!-- Focused states -->
+ <item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/abc_tab_unselected_pressed_holo" />
+ <item android:state_focused="true" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/abc_tab_selected_pressed_holo" />
+</selector>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_tab_indicator_ab_holo.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_focused="true"
+ android:drawable="@drawable/abc_textfield_search_selected_holo_dark" />
+ <item android:drawable="@drawable/abc_textfield_search_default_holo_dark" />
+</selector>
+
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_textfield_searchview_holo_dark.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_focused="true"
+ android:drawable="@drawable/abc_textfield_search_selected_holo_light" />
+ <item android:drawable="@drawable/abc_textfield_search_default_holo_light" />
+</selector>
+
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_textfield_searchview_holo_light.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_focused="true"
+ android:drawable="@drawable/abc_textfield_search_right_selected_holo_dark" />
+ <item android:drawable="@drawable/abc_textfield_search_right_default_holo_dark" />
+</selector>
+
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_textfield_searchview_right_holo_dark.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_focused="true"
+ android:drawable="@drawable/abc_textfield_search_right_selected_holo_light" />
+ <item android:drawable="@drawable/abc_textfield_search_right_default_holo_light" />
+</selector>
+
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/drawable/abc_textfield_searchview_right_holo_light.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<android.support.v7.internal.widget.NativeActionModeAwareLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/action_bar_root"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical"
+ android:fitsSystemWindows="true">
+
+ <include layout="@layout/abc_action_bar_decor_include" />
+
+</android.support.v7.internal.widget.NativeActionModeAwareLayout>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout-v11/abc_action_bar_decor.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<android.support.v7.internal.widget.NativeActionModeAwareLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/action_bar_root"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:fitsSystemWindows="true">
+
+ <FrameLayout
+ android:id="@id/action_bar_activity_content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:foreground="?android:attr/windowContentOverlay"/>
+
+</android.support.v7.internal.widget.NativeActionModeAwareLayout>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout-v11/abc_simple_decor.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/activity_chooser_view_content"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ style="?attr/activityChooserViewStyle">
+
+ <include layout="@layout/abc_activity_chooser_view_include" />
+
+</LinearLayout><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout-v14/abc_activity_chooser_view.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical"
+ android:fitsSystemWindows="true">
+
+ <include layout="@layout/abc_action_bar_decor_include" />
+
+</LinearLayout>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_bar_decor.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <android.support.v7.internal.widget.ActionBarContainer
+ android:id="@+id/action_bar_container"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ style="?attr/actionBarStyle">
+
+ <android.support.v7.internal.widget.ActionBarView
+ android:id="@+id/action_bar"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ style="?attr/actionBarStyle" />
+
+ <android.support.v7.internal.widget.ActionBarContextView
+ android:id="@+id/action_context_bar"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ style="?attr/actionModeStyle" />
+ </android.support.v7.internal.widget.ActionBarContainer>
+
+ <FrameLayout
+ android:id="@id/action_bar_activity_content"
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:foregroundGravity="fill_horizontal|top"
+ android:foreground="?android:attr/windowContentOverlay" />
+
+ <android.support.v7.internal.widget.ActionBarContainer
+ android:id="@+id/split_action_bar"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ style="?attr/actionBarSplitStyle"
+ android:visibility="gone"
+ android:gravity="center" />
+
+</merge>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_bar_decor_include.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<android.support.v7.internal.widget.ActionBarOverlayLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/action_bar_overlay_layout"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <FrameLayout android:id="@id/action_bar_activity_content"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"/>
+ <LinearLayout android:id="@+id/top_action_bar"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top">
+ <android.support.v7.internal.widget.ActionBarContainer android:id="@+id/action_bar_container"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ style="?attr/actionBarStyle"
+ android:gravity="top">
+ <android.support.v7.internal.widget.ActionBarView
+ android:id="@+id/action_bar"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ style="?attr/actionBarStyle"/>
+ <android.support.v7.internal.widget.ActionBarContextView
+ android:id="@+id/action_context_bar"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ style="?attr/actionModeStyle"/>
+ </android.support.v7.internal.widget.ActionBarContainer>
+ <ImageView android:src="?android:attr/windowContentOverlay"
+ android:scaleType="fitXY"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+ </LinearLayout>
+ <android.support.v7.internal.widget.ActionBarContainer android:id="@+id/split_action_bar"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ style="?attr/actionBarSplitStyle"
+ android:visibility="gone"
+ android:gravity="center"/>
+</android.support.v7.internal.widget.ActionBarOverlayLayout>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_bar_decor_overlay.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<view xmlns:android="http://schemas.android.com/apk/res/android"
+ class="android.support.v7.internal.widget.ActionBarView$HomeView"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:background="?attr/actionBarItemBackground">
+ <ImageView android:id="@+id/up"
+ android:src="?attr/homeAsUpIndicator"
+ android:layout_gravity="center_vertical|left"
+ android:visibility="gone"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="-8dip"/>
+ <ImageView android:id="@id/home"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="8dip"
+ android:layout_marginTop="@dimen/abc_action_bar_icon_vertical_padding"
+ android:layout_marginBottom="@dimen/abc_action_bar_icon_vertical_padding"
+ android:layout_gravity="center"
+ android:adjustViewBounds="true"
+ android:scaleType="fitCenter"/>
+</view>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_bar_home.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<view xmlns:android="http://schemas.android.com/apk/res/android"
+ class="android.support.v7.internal.widget.ScrollingTabContainerView$TabView"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"
+ style="?attr/actionBarTabStyle"/>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_bar_tab.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<android.support.v7.internal.widget.LinearLayoutICS
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ style="?attr/actionBarTabBarStyle"/>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_bar_tabbar.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingRight="8dip"
+ android:background="?attr/actionBarItemBackground"
+ android:enabled="false">
+
+ <ImageView android:id="@+id/up"
+ android:src="?attr/homeAsUpIndicator"
+ android:layout_gravity="center_vertical|left"
+ android:visibility="gone"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+ <LinearLayout android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical|left"
+ android:orientation="vertical">
+ <TextView android:id="@+id/action_bar_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="end"/>
+ <TextView android:id="@+id/action_bar_subtitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/abc_action_bar_subtitle_top_margin"
+ android:layout_marginBottom="@dimen/abc_action_bar_subtitle_bottom_margin"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:visibility="gone"/>
+ </LinearLayout>
+</LinearLayout>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_bar_title_item.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ dd
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Styled linear layout, compensating for the lack of a defStyle parameter
+ in pre-Honeycomb LinearLayout's constructor. -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ style="?attr/actionBarTabBarStyle">
+</LinearLayout><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_bar_view_list_nav_layout.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ dd
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<android.support.v7.internal.view.menu.ActionMenuItemView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:focusable="true"
+ android:paddingTop="4dip"
+ android:paddingBottom="4dip"
+ android:paddingLeft="8dip"
+ android:paddingRight="8dip"
+ android:textAppearance="?attr/actionMenuTextAppearance"
+ android:textColor="?attr/actionMenuTextColor"
+ style="?attr/actionButtonStyle"/>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_menu_item_layout.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<android.support.v7.internal.view.menu.ActionMenuView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:divider="?attr/actionBarDivider"
+ app:dividerPadding="12dip"
+ android:gravity="center_vertical"/>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_menu_layout.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<android.support.v7.internal.widget.ActionBarContextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ style="?attr/actionModeStyle"/>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_mode_bar.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/action_mode_close_button"
+ android:focusable="true"
+ android:clickable="true"
+ android:paddingLeft="8dip"
+ android:contentDescription="@string/abc_action_mode_done"
+ style="?attr/actionModeCloseButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginRight="16dip">
+ <ImageView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:scaleType="fitCenter"
+ android:src="?attr/actionModeCloseDrawable"/>
+</LinearLayout>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_action_mode_close_item.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<android.support.v7.internal.widget.LinearLayoutICS
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/activity_chooser_view_content"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ style="?attr/activityChooserViewStyle">
+
+ <include layout="@layout/abc_activity_chooser_view_include" />
+
+</android.support.v7.internal.widget.LinearLayoutICS><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_activity_chooser_view.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<merge
+ xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <FrameLayout
+ android:id="@+id/expand_activities_button"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:focusable="true"
+ android:addStatesFromChildren="true"
+ android:background="?attr/actionBarItemBackground">
+
+ <ImageView
+ android:id="@+id/image"
+ android:layout_width="56dip"
+ android:layout_height="36dip"
+ android:layout_gravity="center"
+ android:paddingTop="2dip"
+ android:paddingBottom="2dip"
+ android:paddingLeft="12dip"
+ android:paddingRight="12dip"
+ android:scaleType="fitCenter"
+ android:adjustViewBounds="true" />
+
+ </FrameLayout>
+
+ <FrameLayout
+ android:id="@+id/default_activity_button"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:focusable="true"
+ android:addStatesFromChildren="true"
+ android:background="?attr/actionBarItemBackground">
+
+ <ImageView
+ android:id="@+id/image"
+ android:layout_width="56dip"
+ android:layout_height="36dip"
+ android:layout_gravity="center"
+ android:paddingTop="2dip"
+ android:paddingBottom="2dip"
+ android:paddingLeft="12dip"
+ android:paddingRight="12dip"
+ android:scaleType="fitCenter"
+ android:adjustViewBounds="true" />
+
+ </FrameLayout>
+
+</merge><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_activity_chooser_view_include.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/list_item"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/dropdownListPreferredItemHeight"
+ android:paddingLeft="16dip"
+ android:paddingRight="16dip"
+ android:minWidth="196dip"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:duplicateParentState="true" >
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="32dip"
+ android:layout_height="32dip"
+ android:layout_gravity="center_vertical"
+ android:layout_marginRight="8dip"
+ android:duplicateParentState="true"/>
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:textAppearance="?attr/textAppearanceLargePopupMenu"
+ android:duplicateParentState="true"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"/>
+
+ </LinearLayout>
+
+</LinearLayout><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_activity_chooser_view_list_item.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<android.support.v7.internal.view.menu.ExpandedMenuView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/expanded_menu"
+ android:layout_width="?attr/panelMenuListWidth"
+ android:layout_height="wrap_content"/>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_expanded_menu_layout.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:focusable="false"
+ android:clickable="false"
+ android:duplicateParentState="true"/>
+
+
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_list_menu_item_checkbox.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="8dip"
+ android:layout_marginRight="-8dip"
+ android:layout_marginTop="8dip"
+ android:layout_marginBottom="8dip"
+ android:scaleType="centerInside"
+ android:duplicateParentState="true"/>
+
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_list_menu_item_icon.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<android.support.v7.internal.view.menu.ListMenuItemView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/listPreferredItemHeightSmall">
+
+ <!-- Icon will be inserted here. -->
+
+ <!-- The title and summary have some gap between them, and this 'group' should be centered vertically. -->
+ <RelativeLayout
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_marginLeft="?attr/listPreferredItemPaddingLeft"
+ android:layout_marginRight="?attr/listPreferredItemPaddingRight"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:duplicateParentState="true">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:textAppearance="?attr/textAppearanceListItemSmall"
+ android:singleLine="true"
+ android:duplicateParentState="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+
+ <TextView
+ android:id="@+id/shortcut"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/title"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:singleLine="true"
+ android:duplicateParentState="true" />
+
+ </RelativeLayout>
+
+ <!-- Checkbox, and/or radio button will be inserted here. -->
+
+</android.support.v7.internal.view.menu.ListMenuItemView>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_list_menu_item_layout.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/radio"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:focusable="false"
+ android:clickable="false"
+ android:duplicateParentState="true"/>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_list_menu_item_radio.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<android.support.v7.internal.view.menu.ListMenuItemView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="?attr/dropdownListPreferredItemHeight"
+ android:minWidth="196dip"
+ android:paddingRight="16dip">
+
+ <!-- Icon will be inserted here. -->
+
+ <!-- The title and summary have some gap between them, and this 'group' should be centered vertically. -->
+ <RelativeLayout
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="16dip"
+ android:duplicateParentState="true">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentLeft="true"
+ android:textAppearance="?attr/textAppearanceLargePopupMenu"
+ android:singleLine="true"
+ android:duplicateParentState="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"/>
+
+ <TextView
+ android:id="@+id/shortcut"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/title"
+ android:layout_alignParentLeft="true"
+ android:textAppearance="?attr/textAppearanceSmallPopupMenu"
+ android:singleLine="true"
+ android:duplicateParentState="true"/>
+
+ </RelativeLayout>
+
+ <!-- Checkbox, and/or radio button will be inserted here. -->
+
+</android.support.v7.internal.view.menu.ListMenuItemView>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_popup_menu_item_layout.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingLeft="@dimen/abc_dropdownitem_text_padding_left"
+ android:paddingRight="4dip"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/searchResultListItemHeight" >
+
+ <!-- Icons come first in the layout, since their placement doesn't depend on
+ the placement of the text views. -->
+ <ImageView android:id="@android:id/icon1"
+ android:layout_width="@dimen/abc_dropdownitem_icon_width"
+ android:layout_height="48dip"
+ android:scaleType="centerInside"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentBottom="true"
+ android:visibility="invisible" />
+
+ <ImageView android:id="@+id/edit_query"
+ android:layout_width="48dip"
+ android:layout_height="48dip"
+ android:scaleType="centerInside"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentBottom="true"
+ android:src="?attr/searchViewEditQuery"
+ android:background="?attr/searchViewEditQueryBackground"
+ android:visibility="gone" />
+
+ <ImageView android:id="@android:id/icon2"
+ android:layout_width="48dip"
+ android:layout_height="48dip"
+ android:scaleType="centerInside"
+ android:layout_alignWithParentIfMissing="true"
+ android:layout_toLeftOf="@id/edit_query"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentBottom="true"
+ android:visibility="gone" />
+
+
+ <!-- The subtitle comes before the title, since the height of the title depends on whether the
+ subtitle is visible or gone. -->
+ <TextView android:id="@android:id/text2"
+ style="?android:attr/dropDownItemStyle"
+ android:textAppearance="?attr/textAppearanceSearchResultSubtitle"
+ android:singleLine="true"
+ android:layout_width="match_parent"
+ android:layout_height="29dip"
+ android:paddingBottom="4dip"
+ android:gravity="top"
+ android:layout_toRightOf="@android:id/icon1"
+ android:layout_toLeftOf="@android:id/icon2"
+ android:layout_alignWithParentIfMissing="true"
+ android:layout_alignParentBottom="true"
+ android:visibility="gone" />
+
+ <!-- The title is placed above the subtitle, if there is one. If there is no
+ subtitle, it fills the parent. -->
+ <TextView android:id="@android:id/text1"
+ style="?android:attr/dropDownItemStyle"
+ android:textAppearance="?attr/textAppearanceSearchResultTitle"
+ android:singleLine="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_toRightOf="@android:id/icon1"
+ android:layout_toLeftOf="@android:id/icon2"
+ android:layout_above="@android:id/text2" />
+
+</RelativeLayout><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_search_dropdown_item_icons_2line.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/search_bar"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ >
+
+ <!-- This is actually used for the badge icon *or* the badge label (or neither) -->
+ <TextView
+ android:id="@+id/search_badge"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:layout_marginBottom="2dip"
+ android:drawablePadding="0dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="?android:attr/textColorPrimary"
+ android:visibility="gone"
+ />
+
+ <ImageView
+ android:id="@+id/search_button"
+ style="?attr/actionButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical"
+ android:src="?attr/searchViewSearchIcon"
+ android:focusable="true"
+ android:contentDescription="@string/abc_searchview_description_search"
+ />
+
+ <LinearLayout
+ android:id="@+id/search_edit_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_gravity="center_vertical"
+ android:layout_marginTop="4dip"
+ android:layout_marginBottom="4dip"
+ android:layout_marginLeft="8dip"
+ android:layout_marginRight="8dip"
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@+id/search_mag_icon"
+ android:layout_width="@dimen/abc_dropdownitem_icon_width"
+ android:layout_height="wrap_content"
+ android:scaleType="centerInside"
+ android:layout_marginLeft="@dimen/abc_dropdownitem_text_padding_left"
+ android:layout_gravity="center_vertical"
+ android:src="?attr/searchViewSearchIcon"
+ android:visibility="gone"
+ />
+
+ <!-- Inner layout contains the app icon, button(s) and EditText -->
+ <LinearLayout
+ android:id="@+id/search_plate"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_gravity="center_vertical"
+ android:orientation="horizontal"
+ android:background="?attr/searchViewTextField">
+
+ <view class="android.support.v7.widget.SearchView$SearchAutoComplete"
+ style="?attr/searchViewAutoCompleteTextView"
+ android:id="@+id/search_src_text"
+ android:layout_height="36dip"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:minWidth="@dimen/abc_search_view_text_min_width"
+ android:layout_gravity="bottom"
+ android:paddingLeft="@dimen/abc_dropdownitem_text_padding_left"
+ android:paddingRight="@dimen/abc_dropdownitem_text_padding_right"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:background="@null"
+ android:inputType="text|textAutoComplete|textNoSuggestions"
+ android:imeOptions="actionSearch"
+ android:dropDownHeight="wrap_content"
+ android:dropDownAnchor="@id/search_edit_frame"
+ android:dropDownVerticalOffset="0dip"
+ android:dropDownHorizontalOffset="0dip"
+ android:contentDescription="@string/abc_searchview_description_query"
+ />
+
+ <ImageView
+ android:id="@+id/search_close_btn"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingLeft="8dip"
+ android:paddingRight="8dip"
+ android:layout_gravity="center_vertical"
+ android:background="?attr/selectableItemBackground"
+ android:src="?attr/searchViewCloseIcon"
+ android:focusable="true"
+ android:contentDescription="@string/abc_searchview_description_clear"
+ />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/submit_area"
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:background="?attr/searchViewTextFieldRight">
+
+ <ImageView
+ android:id="@+id/search_go_btn"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical"
+ android:paddingLeft="16dip"
+ android:paddingRight="16dip"
+ android:background="?attr/selectableItemBackground"
+ android:src="?attr/searchViewGoIcon"
+ android:visibility="gone"
+ android:focusable="true"
+ android:contentDescription="@string/abc_searchview_description_submit"
+ />
+
+ <ImageView
+ android:id="@+id/search_voice_btn"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical"
+ android:paddingLeft="16dip"
+ android:paddingRight="16dip"
+ android:src="?attr/searchViewVoiceIcon"
+ android:background="?attr/selectableItemBackground"
+ android:visibility="gone"
+ android:focusable="true"
+ android:contentDescription="@string/abc_searchview_description_voice"
+ />
+ </LinearLayout>
+ </LinearLayout>
+
+</LinearLayout><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_search_view.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/action_bar_root"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:fitsSystemWindows="true">
+
+ <FrameLayout
+ android:id="@id/action_bar_activity_content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:foreground="?android:attr/windowContentOverlay"/>
+
+</LinearLayout>
+<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/abc_simple_decor.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@android:id/text1"
+ style="?attr/spinnerDropDownItemStyle"
+ android:singleLine="true"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/dropdownListPreferredItemHeight"
+ android:ellipsize="marquee"/><!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/layout/support_simple_spinner_dropdown_item.xml -->
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-af/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navigeer tuis"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigeer op"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Nog opsies"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Klaar"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Sien alles"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Kies \'n program"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Vee navraag uit"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Soeknavraag"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Soek"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Dien navraag in"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Stemsoektog"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deel met"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deel met %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-am/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"ወደ መነሻ ይዳስሱ"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"ወደ ላይ ይዳስሱ"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"ተጨማሪ አማራጮች"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"ተከናውኗል"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ሁሉንም ይመልከቱ"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"መተግበሪያ ይምረጡ"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"መጠይቅ አጽዳ"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"የፍለጋ ጥያቄ"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"ፍለጋ"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"መጠይቅ ያስረክቡ"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"የድምፅ ፍለጋ"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ከሚከተለው ጋር ያጋሩ"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ከ%s ጋር ያጋሩ"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-ar/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"التنقل إلى الشاشة الرئيسية"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"التنقل إلى أعلى"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"خيارات إضافية"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"تم"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"عرض الكل"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"اختيار تطبيق"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"محو طلب البحث"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"طلب البحث"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"بحث"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"إرسال طلب البحث"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"البحث الصوتي"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"مشاركة مع"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"مشاركة مع %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-bg/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Придвижване към „Начало“"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Придвижване нагоре"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Още опции"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Готово"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Вижте всички"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Изберете приложение"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Изчистване на заявката"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Заявка за търсене"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Търсене"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Изпращане на заявката"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Гласово търсене"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Споделяне със:"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Споделяне със: %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-ca/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navega a la pàgina d\'inici"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navega cap a dalt"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Més opcions"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Fet"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Mostra\'ls tots"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Selecciona una aplicació"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Esborra la consulta"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Consulta de cerca"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Cerca"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Envia la consulta"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Cerca per veu"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Comparteix amb"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Comparteix amb %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-cs/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Přejít na plochu"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Přejít nahoru"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Více možností"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Hotovo"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Zobrazit vše"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Vybrat aplikaci"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Smazat dotaz"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Vyhledávací dotaz"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Hledat"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Odeslat dotaz"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Hlasové vyhledávání"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Sdílet pomocí"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Sdílet pomocí %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-da/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Naviger hjem"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Naviger op"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Flere muligheder"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Luk"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Se alle"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Vælg en app"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Ryd forespørgslen"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Søgeforespørgsel"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Søg"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Indsend forespørgslen"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Stemmesøgning"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Del med"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Del med %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-de/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Zur Startseite"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Nach oben"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Weitere Optionen"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Fertig"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Alle ansehen"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"App auswählen"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Suchanfrage löschen"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Suchanfrage"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Suchen"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Suchanfrage senden"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Sprachsuche"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Freigeben für"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Freigeben für %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-el/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Πλοήγηση στην αρχική σελίδα"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Πλοήγηση προς τα επάνω"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Περισσότερες επιλογές"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Τέλος"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Προβολή όλων"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Επιλέξτε κάποια εφαρμογή"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Διαγραφή ερωτήματος"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Ερώτημα αναζήτησης"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Αναζήτηση"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Υποβολή ερωτήματος"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Φωνητική αναζήτηση"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Κοινή χρήση με"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Κοινή χρήση με %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-en-rGB/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navigate home"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigate up"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"More options"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Finished"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"See all"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Choose an app"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Clear query"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Search query"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Search"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Submit query"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Voice search"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-en-rIN/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navigate home"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigate up"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"More options"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Finished"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"See all"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Choose an app"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Clear query"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Search query"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Search"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Submit query"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Voice search"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-es-rUS/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navegar a la página principal"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navegar hacia arriba"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Más opciones"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Listo"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver todo"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Elige una aplicación."</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Eliminar la consulta"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Consulta de búsqueda"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Búsqueda"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Enviar consulta"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Búsqueda por voz"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-es/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Ir a la pantalla de inicio"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Desplazarse hacia arriba"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Más opciones"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Listo"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver todo"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Seleccionar una aplicación"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Borrar consulta"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Consulta"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Buscar"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Enviar consulta"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Búsqueda por voz"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-et-rEE/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navigeerimine avaekraanile"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigeerimine üles"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Rohkem valikuid"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Valmis"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Kuva kõik"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Valige rakendus"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Päringu tühistamine"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Otsingupäring"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Otsing"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Päringu esitamine"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Häälotsing"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Jagamine:"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Jagamine kasutajaga %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-fa/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"پیمایش به صفحه اصلی"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"پیمایش به بالا"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"گزینههای بیشتر"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"انجام شد"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"مشاهده همه"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"انتخاب برنامه"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"پاک کردن عبارت جستجو"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"عبارت جستجو"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"جستجو"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"ارسال عبارت جستجو"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"جستجوی شفاهی"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"اشتراکگذاری با"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"اشتراکگذاری با %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-fi/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Siirry etusivulle"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Siirry ylös"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Lisää"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Valmis"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Näytä kaikki"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Valitse sovellus"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Tyhjennä kysely"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Hakulauseke"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Haku"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Lähetä kysely"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Puhehaku"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Jakaminen:"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Jakaminen: %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-fr-rCA/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Revenir à l\'accueil"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Revenir en haut de la page"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Plus d\'options"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Terminé"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Voir toutes les chaînes"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Sélectionnez une application"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Effacer la requête"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Requête de recherche"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Rechercher"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Envoyer la requête"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Recherche vocale"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partager avec"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partager avec %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-fr/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Revenir à l\'accueil"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Revenir en haut de la page"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Plus d\'options"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"OK"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Tout afficher"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Sélectionner une application"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Effacer la requête"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Requête de recherche"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Rechercher"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Envoyer la requête"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Recherche vocale"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partager avec"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partager avec %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-hi/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"मुखपृष्ठ पर नेविगेट करें"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"ऊपर नेविगेट करें"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"अधिक विकल्प"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"पूर्ण"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"सभी देखें"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"कोई एप्लिकेशन चुनें"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"क्वेरी साफ़ करें"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"खोज क्वेरी"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"खोजें"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"क्वेरी सबमिट करें"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"ध्वनि खोज"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"इसके द्वारा साझा करें"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s के साथ साझा करें"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-hr/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Idi na početnu"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Idi gore"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Dodatne opcije"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Gotovo"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Prikaži sve"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Odabir aplikacije"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Izbriši upit"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Upit za pretraživanje"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Pretraživanje"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Pošalji upit"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovno pretraživanje"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dijeljenje sa"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Dijeljenje sa: %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-hu/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Ugrás a főoldalra"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Felfelé mozgatás"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"További lehetőségek"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Kész"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Összes megtekintése"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Válasszon ki egy alkalmazást"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Lekérdezés törlése"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Keresési lekérdezés"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Keresés"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Lekérdezés küldése"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Hangalapú keresés"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Megosztás a következővel:"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Megosztás a következővel: %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-hy-rAM/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Ուղղվել տուն"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Ուղղվել վերև"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Այլ ընտրանքներ"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Կատարված է"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Տեսնել բոլորը"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Ընտրել ծրագիր"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Մաքրել հարցումը"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Որոնման հարցում"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Որոնել"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Ուղարկել հարցումը"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ձայնային որոնում"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Տարածել"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Տարածել ըստ %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-in/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navigasi ke beranda"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigasi naik"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Opsi lain"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Selesai"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Lihat semua"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pilih aplikasi"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Hapus kueri"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Kueri penelusuran"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Telusuri"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Kirim kueri"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Penelusuran suara"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bagikan dengan"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Bagikan dengan %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-it/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Vai alla home page"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Vai in alto"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Altre opzioni"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Fine"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Visualizza tutte"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Scegli un\'applicazione"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Cancella query"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Query di ricerca"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Cerca"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Invia query"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ricerca vocale"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Condividi con"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Condividi con %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-iw/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"נווט לדף הבית"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"נווט למעלה"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"עוד אפשרויות"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"בוצע"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ראה הכול"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"בחר אפליקציה"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"מחק שאילתה"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"שאילתת חיפוש"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"חפש"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"שלח שאילתה"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"חיפוש קולי"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"שתף עם"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"שתף עם %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-ja/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"ホームへ移動"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"上へ移動"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"その他のオプション"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"完了"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"すべて表示"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"アプリの選択"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"検索キーワードを削除"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"検索キーワード"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"検索"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"検索キーワードを送信"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"音声検索"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"共有"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sと共有"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-ka-rGE/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"მთავარზე ნავიგაცია"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"ზემოთ ნავიგაცია"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"მეტი ვარიანტები"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"დასრულდა"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ყველას ნახვა"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"აპის არჩევა"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"მოთხოვნის გასუფთავება"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"ძიების მოთხოვნა"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"ძიება"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"მოთხოვნის გადაგზავნა"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"ხმოვანი ძიება"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"გაზიარება:"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s-თან გაზიარება"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-km-rKH/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"រកមើលទៅដើម"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"រកមើលឡើងលើ"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"ជម្រើសច្រើនទៀត"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"រួចរាល់"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"មើលទាំងអស់"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ជ្រើសកម្មវិធី"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"សម្អាតសំណួរ"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"ស្វែងរកសំណួរ"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"ស្វែងរក"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"ដាក់ស្នើសំណួរ"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"ការស្វែងរកសំឡេង"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ចែករំលែកជាមួយ"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ចែករំលែកជាមួយ %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-ko/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"홈 탐색"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"위로 탐색"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"옵션 더보기"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"완료"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"전체 보기"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"앱 선택"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"검색어 삭제"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"검색어"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"검색"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"검색어 보내기"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"음성 검색"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"공유 대상"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s와(과) 공유"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-land/bools.xml -->
+ <eat-comment />
+
+ <bool name="abc_action_bar_embed_tabs_pre_jb">true</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-land/config.xml -->
+ <eat-comment />
+
+ <bool name="abc_config_allowActionMenuItemTextWithIcon">true</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-land/bools.xml -->
+ <eat-comment />
+
+ <bool name="abc_split_action_bar_is_narrow">false</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-land/dimens.xml -->
+ <eat-comment />
+
+ <dimen name="abc_action_bar_default_height">40dip</dimen>
+ <dimen name="abc_action_bar_icon_vertical_padding">4dip</dimen>
+ <dimen name="abc_action_bar_progress_bar_size">32dp</dimen>
+ <dimen name="abc_action_bar_subtitle_bottom_margin">4dip</dimen>
+ <dimen name="abc_action_bar_subtitle_text_size">12dp</dimen>
+ <dimen name="abc_action_bar_subtitle_top_margin">-2dp</dimen>
+ <dimen name="abc_action_bar_title_text_size">16dp</dimen>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-large-v14/themes_base.xml -->
+ <eat-comment />
+
+ <style name="Theme.Base.AppCompat.DialogWhenLarge" parent="Theme.Base.AppCompat.DialogWhenLarge.Base" />
+
+ <style name="Theme.Base.AppCompat.Light.DialogWhenLarge" parent="Theme.Base.AppCompat.Light.DialogWhenLarge.Base" />
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-large/bools.xml -->
+ <eat-comment />
+
+ <bool name="abc_action_bar_embed_tabs_pre_jb">true</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-large/config.xml -->
+ <eat-comment />
+
+ <bool name="abc_config_allowActionMenuItemTextWithIcon">true</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-large/bools.xml -->
+ <eat-comment />
+
+ <bool name="abc_split_action_bar_is_narrow">false</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-large/config.xml -->
+ <eat-comment />
+
+ <dimen name="abc_config_prefDialogWidth">440dp</dimen>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-large/dimens.xml -->
+ <eat-comment />
+
+ <dimen name="abc_search_view_text_min_width">192dip</dimen>
+
+ <item name="dialog_fixed_height_major" type="dimen">60%</item>
+ <item name="dialog_fixed_height_minor" type="dimen">90%</item>
+ <item name="dialog_fixed_width_major" type="dimen">60%</item>
+ <item name="dialog_fixed_width_minor" type="dimen">90%</item>
+
+ <integer name="abc_max_action_buttons">4</integer>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-large/themes_base.xml -->
+ <eat-comment />
+
+ <style name="Theme.Base.AppCompat.DialogWhenLarge" parent="Theme.Base.AppCompat.Dialog.FixedSize" />
+
+ <style name="Theme.Base.AppCompat.Light.DialogWhenLarge" parent="Theme.Base.AppCompat.Dialog.Light.FixedSize" />
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-lo-rLA/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"ກັບໄປໜ້າຫຼັກ"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"ຂຶ້ນເທິງ"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"ໂຕເລືອກອື່ນ"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"ແລ້ວໆ"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ເບິ່ງທັງຫມົດ"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ເລືອກແອັບຯ"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"ລຶບຂໍ້ຄວາມຊອກຫາ"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"ຊອກຫາ"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"ຊອກຫາ"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"ສົ່ງການຊອກຫາ"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"ຊອກຫາດ້ວຍສຽງ"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ແບ່ງປັນກັບ"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ແບ່ງປັນກັບ %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-lt/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Eiti į pagrindinį puslapį"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Eiti į viršų"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Daugiau parinkčių"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Atlikta"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Peržiūrėti viską"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pasirinkti programą"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Išvalyti užklausą"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Paieškos užklausa"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Paieška"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Pateikti užklausą"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Paieška balsu"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bendrinti naudojant"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Bendrinti naudojant „%s“"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-lv/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Pārvietoties uz sākuma ekrānu"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Pārvietoties augšup"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Vairāk opciju"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Gatavs"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Skatīt visu"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Izvēlieties lietotni"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Notīrīt vaicājumu"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Meklēšanas vaicājums"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Meklēt"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Iesniegt vaicājumu"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Meklēšana ar balsi"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Kopīgot ar:"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Kopīgot ar %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-mn-rMN/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Нүүр хуудас руу шилжих"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Дээш шилжих"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Нэмэлт сонголтууд"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Дууссан"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Бүгдийг харах"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Апп сонгох"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Асуулгыг цэвэрлэх"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Хайх асуулга"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Хайх"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Асуулгыг илгээх"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Дуут хайлт"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Хуваалцах"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s-тай хуваалцах"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-ms-rMY/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navigasi skrin utama"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigasi ke atas"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Lagi pilihan"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Selesai"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Lihat semua"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pilih apl"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Kosongkan pertanyaan"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Pertanyaan carian"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Cari"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Serah pertanyaan"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Carian suara"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Kongsi dengan"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Kongsi dengan %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-nb/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Gå til startsiden"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Gå opp"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Flere alternativer"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Fullført"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Se alle"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Velg en app"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Slett søket"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Søkeord"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Søk"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Utfør søket"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Talesøk"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Del med"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Del med %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-nl/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navigeren naar startpositie"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Omhoog navigeren"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Meer opties"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Gereed"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Alles weergeven"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Een app selecteren"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Zoekopdracht wissen"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Zoekopdracht"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Zoeken"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Zoekopdracht verzenden"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Gesproken zoekopdracht"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Delen met"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Delen met %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-pl/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Przejdź do strony głównej"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Przejdź wyżej"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Więcej opcji"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Gotowe"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Zobacz wszystkie"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Wybierz aplikację"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Wyczyść zapytanie"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Wyszukiwane hasło"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Szukaj"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Wyślij zapytanie"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Wyszukiwanie głosowe"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Udostępnij dla"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Udostępnij dla %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-pt-rPT/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navegar para a página inicial"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navegar para cima"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Mais opções"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Concluído"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver tudo"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Escolher uma aplicação"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Limpar consulta"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Consulta de pesquisa"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Pesquisar"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Enviar consulta"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Pesquisa por voz"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partilhar com"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partilhar com %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-pt/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navegar para a página inicial"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navegar para cima"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Mais opções"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Concluído"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver tudo"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Selecione um aplicativo"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Limpar consulta"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Consulta de pesquisa"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Pesquisar"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Enviar consulta"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Pesquisa por voz"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartilhar com"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartilhar com %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-ro/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navigați la ecranul de pornire"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigați în sus"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Mai multe opțiuni"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Terminat"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Afișați-le pe toate"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Alegeți o aplicaţie"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Ștergeți interogarea"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Interogare de căutare"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Căutați"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Trimiteți interogarea"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Căutare vocală"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Trimiteți la"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Trimiteți la %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-ru/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Перейти на главный экран"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Перейти вверх"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Другие параметры"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Готово"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Показать все"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Выбрать приложение"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Удалить запрос"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Поисковый запрос"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Поиск"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Отправить запрос"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Голосовой поиск"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Открыть доступ"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Открыть доступ пользователю %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-sk/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Prejsť na plochu"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Prejsť hore"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Ďalšie možnosti"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Hotovo"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Zobraziť všetko"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Zvoľte aplikáciu"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Vymazať dopyt"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Vyhľadávací dopyt"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Hľadať"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Odoslať dopyt"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Hlasové vyhľadávanie"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Zdieľať pomocou"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Zdieľať pomocou %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-sl/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Krmarjenje domov"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Krmarjenje navzgor"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Več možnosti"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Končano"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Pokaži vse"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Izbira aplikacije"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Izbris poizvedbe"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Iskalna poizvedba"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Iskanje"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Pošiljanje poizvedbe"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovno iskanje"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deljenje z"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deljenje z:"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-sr/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Одлазак на Почетну"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Кретање нагоре"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Још опција"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Готово"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Прикажи све"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Избор апликације"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Брисање упита"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Упит за претрагу"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Претрага"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Слање упита"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Гласовна претрага"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Дели са"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Дели са апликацијом %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-sv/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Visa startsidan"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigera uppåt"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Fler alternativ"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Klart"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Visa alla"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Välj en app"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Ta bort frågan"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Sökfråga"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Sök"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Skicka fråga"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Röstsökning"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dela med"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Dela med %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-sw/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Nenda mwanzo"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Nenda juu"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Chaguo zaidi"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Nimemaliza"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Angalia zote"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Chagua programu"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Futa hoja"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Hoja ya utafutaji"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Tafuta"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Wasilisha hoja"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Tafuta kwa kutamka"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Shiriki na:"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Shiriki na %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-sw600dp/dimens.xml -->
+ <eat-comment />
+
+ <dimen name="abc_action_bar_default_height">56dip</dimen>
+ <dimen name="abc_action_bar_icon_vertical_padding">4dip</dimen>
+ <dimen name="abc_action_bar_subtitle_bottom_margin">9dip</dimen>
+ <dimen name="abc_action_bar_subtitle_text_size">14dp</dimen>
+ <dimen name="abc_action_bar_subtitle_top_margin">-3dp</dimen>
+ <dimen name="abc_action_bar_title_text_size">18dp</dimen>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-sw600dp/config.xml -->
+ <eat-comment />
+
+ <dimen name="abc_config_prefDialogWidth">580dp</dimen>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-sw600dp/dimens.xml -->
+ <eat-comment />
+
+ <integer name="abc_max_action_buttons">5</integer>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-th/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"นำทางไปหน้าแรก"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"นำทางขึ้น"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"ตัวเลือกอื่น"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"เสร็จสิ้น"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ดูทั้งหมด"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"เลือกแอป"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"ล้างข้อความค้นหา"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"ข้อความค้นหา"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"ค้นหา"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"ส่งข้อความค้นหา"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"ค้นหาด้วยเสียง"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"แชร์กับ"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"แชร์กับ %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-tl/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Mag-navigate patungo sa home"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Mag-navigate pataas"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Higit pang mga opsyon"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Tapos na"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Tingnan lahat"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pumili ng isang app"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"I-clear ang query"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Query sa paghahanap"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Maghanap"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Isumite ang query"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Paghahanap gamit ang boses"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Ibahagi sa/kay"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Ibahagi sa/kay %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-tr/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Ana ekrana git"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Yukarı git"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Diğer seçenekler"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Tamamlandı"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Tümünü göster"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Bir uygulama seçin"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Sorguyu temizle"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Arama sorgusu"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Ara"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Sorguyu gönder"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Sesli arama"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Şununla paylaş"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ile paylaş"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-uk/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Перейти на головний"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Перейти вгору"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Інші опції"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Готово"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Переглянути всі"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Вибрати програму"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Очистити запит"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Пошуковий запит"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Пошук"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Надіслати запит"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Голосовий пошук"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Надіслати через"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Надіслати через %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-v11/themes_base.xml -->
+ <eat-comment />
+
+ <style name="Theme.Base" parent="android:Theme.Holo">
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowActionBar">false</item>
+
+ <!--
+ A native Action Mode could be displayed (for text selection, etc) so we need to ensure
+ that it is positioned correctly, so we request windowActionModeOverlay so that it
+ displays over the compat Action Bar.
+ -->
+ <item name="android:windowActionModeOverlay">true</item>
+
+ <!-- Attributes populated from the framework to be read by apps -->
+ <item name="buttonBarStyle">?android:attr/buttonBarStyle</item>
+ <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
+ <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
+ </style>
+
+ <style name="Theme.Base.AppCompat.Dialog.FixedSize" parent="android:Theme.Holo.Dialog">
+ <item name="windowFixedWidthMajor">@dimen/dialog_fixed_width_major</item>
+ <item name="windowFixedWidthMinor">@dimen/dialog_fixed_width_minor</item>
+ <item name="windowFixedHeightMajor">@dimen/dialog_fixed_height_major</item>
+ <item name="windowFixedHeightMinor">@dimen/dialog_fixed_height_minor</item>
+ <item name="windowActionBar">false</item>
+
+ <!-- Attributes populated from the framework to be read by apps -->
+ <item name="buttonBarStyle">?android:attr/buttonBarStyle</item>
+ <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
+ <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
+ </style>
+
+ <style name="Theme.Base.AppCompat.Dialog.Light.FixedSize" parent="android:Theme.Holo.Light.Dialog">
+ <item name="windowFixedWidthMajor">@dimen/dialog_fixed_width_major</item>
+ <item name="windowFixedWidthMinor">@dimen/dialog_fixed_width_minor</item>
+ <item name="windowFixedHeightMajor">@dimen/dialog_fixed_height_major</item>
+ <item name="windowFixedHeightMinor">@dimen/dialog_fixed_height_minor</item>
+ <item name="windowActionBar">false</item>
+
+ <!-- Attributes populated from the framework to be read by apps -->
+ <item name="buttonBarStyle">?android:attr/buttonBarStyle</item>
+ <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
+ <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
+ </style>
+
+ <style name="Theme.Base.Light" parent="android:Theme.Holo.Light">
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowActionBar">false</item>
+
+ <!--
+ A native Action Mode could be displayed (for text selection, etc) so we need to ensure
+ that it is positioned correctly, so we request windowActionModeOverlay so that it
+ displays over the compat Action Bar.
+ -->
+ <item name="android:windowActionModeOverlay">true</item>
+
+ <!-- Attributes populated from the framework to be read by apps -->
+ <item name="buttonBarStyle">?android:attr/buttonBarStyle</item>
+ <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
+ <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
+ </style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-v11/styles_base.xml -->
+ <eat-comment />
+
+ <style name="Widget.AppCompat.Base.AutoCompleteTextView" parent="android:Widget.Holo.AutoCompleteTextView"></style>
+
+ <style name="Widget.AppCompat.Base.ProgressBar" parent="android:Widget.Holo.ProgressBar"></style>
+
+ <style name="Widget.AppCompat.Base.ProgressBar.Horizontal" parent="android:Widget.Holo.ProgressBar.Horizontal"></style>
+
+ <style name="Widget.AppCompat.Light.Base.AutoCompleteTextView" parent="android:Widget.Holo.Light.AutoCompleteTextView"></style>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-v14/styles_base.xml -->
+ <eat-comment />
+
+ <style name="TextAppearance.AppCompat.Base.SearchResult.Subtitle" parent="@android:TextAppearance.Holo.SearchResult.Subtitle"></style>
+
+ <style name="TextAppearance.AppCompat.Base.SearchResult.Title" parent="@android:TextAppearance.Holo.SearchResult.Title"></style>
+
+ <style name="TextAppearance.AppCompat.Base.Widget.PopupMenu.Large" parent="android:TextAppearance.Holo.Widget.PopupMenu.Large"></style>
+
+ <style name="TextAppearance.AppCompat.Base.Widget.PopupMenu.Small" parent="android:TextAppearance.Holo.Widget.PopupMenu.Small"></style>
+
+ <style name="TextAppearance.AppCompat.Light.Base.SearchResult.Subtitle" parent="@android:TextAppearance.Holo.SearchResult.Subtitle"></style>
+
+ <style name="TextAppearance.AppCompat.Light.Base.SearchResult.Title" parent="@android:TextAppearance.Holo.SearchResult.Title"></style>
+
+ <style name="TextAppearance.AppCompat.Light.Base.Widget.PopupMenu.Large" parent="android:TextAppearance.Holo.Widget.PopupMenu.Large"></style>
+
+ <style name="TextAppearance.AppCompat.Light.Base.Widget.PopupMenu.Small" parent="android:TextAppearance.Holo.Widget.PopupMenu.Small"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionBar.Menu" parent="android:TextAppearance.Holo.Widget.ActionBar.Menu"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionBar.Subtitle" parent="android:TextAppearance.Holo.Widget.ActionBar.Subtitle"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionBar.Subtitle.Inverse" parent="android:TextAppearance.Holo.Widget.ActionBar.Subtitle.Inverse"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionBar.Title" parent="android:TextAppearance.Holo.Widget.ActionBar.Title"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionBar.Title.Inverse" parent="android:TextAppearance.Holo.Widget.ActionBar.Title.Inverse"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionMode.Subtitle" parent="android:TextAppearance.Holo.Widget.ActionMode.Subtitle"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionMode.Subtitle.Inverse" parent="android:TextAppearance.Holo.Widget.ActionMode.Subtitle.Inverse"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionMode.Title" parent="android:TextAppearance.Holo.Widget.ActionMode.Title"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionMode.Title.Inverse" parent="android:TextAppearance.Holo.Widget.ActionMode.Title.Inverse"></style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-v14/themes_base.xml -->
+ <eat-comment />
+
+ <style name="Theme.Base.AppCompat" parent="android:Theme.Holo">
+
+ <!-- Copy system flag values for our use -->
+ <item name="windowActionBar">?android:attr/windowActionBar</item>
+ <item name="actionBarSize">?android:attr/actionBarSize</item>
+ <item name="actionBarItemBackground">?android:attr/actionBarItemBackground</item>
+ <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
+ <item name="actionButtonStyle">?android:attr/actionButtonStyle</item>
+ <item name="dividerVertical">?android:attr/dividerVertical</item>
+ <item name="dividerHorizontal">?android:attr/dividerHorizontal</item>
+ <item name="actionBarWidgetTheme">@null</item>
+ <item name="android:actionBarWidgetTheme">?attr/actionBarWidgetTheme</item>
+
+ <!-- Required for use of support_simple_spinner_dropdown_item.xml -->
+ <item name="listPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
+ <item name="listPreferredItemHeightSmall">?android:attr/listPreferredItemHeightSmall</item>
+ <item name="listPreferredItemHeightLarge">?android:attr/listPreferredItemHeightLarge</item>
+ <item name="listPreferredItemPaddingLeft">?android:attr/listPreferredItemPaddingLeft</item>
+ <item name="listPreferredItemPaddingRight">?android:attr/listPreferredItemPaddingRight</item>
+
+ <!-- Attributes populated from the framework to be read by apps -->
+ <item name="buttonBarStyle">?android:attr/buttonBarStyle</item>
+ <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
+ </style>
+
+ <style name="Theme.Base.AppCompat.DialogWhenLarge" parent="Theme.Base.AppCompat.DialogWhenLarge.Base" />
+
+ <style name="Theme.Base.AppCompat.DialogWhenLarge.Base" parent="android:Theme.Holo.DialogWhenLarge">
+
+ <!-- Copy system flag values for our use -->
+ <item name="windowActionBar">?android:attr/windowActionBar</item>
+ <item name="actionBarSize">?android:attr/actionBarSize</item>
+ <item name="actionBarItemBackground">?android:attr/actionBarItemBackground</item>
+ <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
+ <item name="actionButtonStyle">?android:attr/actionButtonStyle</item>
+ <item name="dividerVertical">?android:attr/dividerVertical</item>
+ <item name="dividerHorizontal">?android:attr/dividerHorizontal</item>
+ <item name="actionBarWidgetTheme">@null</item>
+ <item name="android:actionBarWidgetTheme">?attr/actionBarWidgetTheme</item>
+
+ <!-- Required for use of support_simple_spinner_dropdown_item.xml -->
+ <item name="listPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
+ <item name="listPreferredItemHeightSmall">?android:attr/listPreferredItemHeightSmall</item>
+ <item name="listPreferredItemHeightLarge">?android:attr/listPreferredItemHeightLarge</item>
+ <item name="listPreferredItemPaddingLeft">?android:attr/listPreferredItemPaddingLeft</item>
+ <item name="listPreferredItemPaddingRight">?android:attr/listPreferredItemPaddingRight</item>
+
+ <!-- Attributes populated from the framework to be read by apps -->
+ <item name="buttonBarStyle">?android:attr/buttonBarStyle</item>
+ <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
+ </style>
+
+ <style name="Theme.Base.AppCompat.Light" parent="android:Theme.Holo.Light">
+
+ <!-- Copy system flag values for our use -->
+ <item name="windowActionBar">?android:attr/windowActionBar</item>
+ <item name="actionBarSize">?android:attr/actionBarSize</item>
+ <item name="actionBarItemBackground">?android:attr/actionBarItemBackground</item>
+ <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
+ <item name="actionButtonStyle">?android:attr/actionButtonStyle</item>
+ <item name="dividerVertical">?android:attr/dividerVertical</item>
+ <item name="dividerHorizontal">?android:attr/dividerHorizontal</item>
+ <item name="actionBarWidgetTheme">@null</item>
+ <item name="android:actionBarWidgetTheme">?attr/actionBarWidgetTheme</item>
+
+ <!-- Required for use of support_simple_spinner_dropdown_item.xml -->
+ <item name="listPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
+ <item name="listPreferredItemHeightSmall">?android:attr/listPreferredItemHeightSmall</item>
+ <item name="listPreferredItemHeightLarge">?android:attr/listPreferredItemHeightLarge</item>
+ <item name="listPreferredItemPaddingLeft">?android:attr/listPreferredItemPaddingLeft</item>
+ <item name="listPreferredItemPaddingRight">?android:attr/listPreferredItemPaddingRight</item>
+
+ <!-- Attributes populated from the framework to be read by apps -->
+ <item name="buttonBarStyle">?android:attr/buttonBarStyle</item>
+ <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
+ </style>
+
+ <style name="Theme.Base.AppCompat.Light.DarkActionBar" parent="android:Theme.Holo.Light.DarkActionBar">
+
+ <!-- Copy system flag values for our use -->
+ <item name="windowActionBar">?android:attr/windowActionBar</item>
+ <item name="actionBarSize">?android:attr/actionBarSize</item>
+ <item name="actionBarItemBackground">?android:attr/actionBarItemBackground</item>
+ <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
+ <item name="actionButtonStyle">?android:attr/actionButtonStyle</item>
+ <item name="dividerVertical">?android:attr/dividerVertical</item>
+ <item name="dividerHorizontal">?android:attr/dividerHorizontal</item>
+ <item name="actionBarWidgetTheme">@style/Theme.AppCompat</item>
+ <item name="android:actionBarWidgetTheme">?attr/actionBarWidgetTheme</item>
+
+ <!-- Required for use of support_simple_spinner_dropdown_item.xml -->
+ <item name="listPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
+ <item name="listPreferredItemHeightSmall">?android:attr/listPreferredItemHeightSmall</item>
+ <item name="listPreferredItemHeightLarge">?android:attr/listPreferredItemHeightLarge</item>
+ <item name="listPreferredItemPaddingLeft">?android:attr/listPreferredItemPaddingLeft</item>
+ <item name="listPreferredItemPaddingRight">?android:attr/listPreferredItemPaddingRight</item>
+
+ <!-- Attributes populated from the framework to be read by apps -->
+ <item name="buttonBarStyle">?android:attr/buttonBarStyle</item>
+ <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
+ </style>
+
+ <style name="Theme.Base.AppCompat.Light.DialogWhenLarge" parent="Theme.Base.AppCompat.Light.DialogWhenLarge.Base" />
+
+ <style name="Theme.Base.AppCompat.Light.DialogWhenLarge.Base" parent="android:Theme.Holo.Light.DialogWhenLarge">
+
+ <!-- Copy system flag values for our use -->
+ <item name="windowActionBar">?android:attr/windowActionBar</item>
+ <item name="actionBarSize">?android:attr/actionBarSize</item>
+ <item name="actionBarItemBackground">?android:attr/actionBarItemBackground</item>
+ <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
+ <item name="actionButtonStyle">?android:attr/actionButtonStyle</item>
+ <item name="dividerVertical">?android:attr/dividerVertical</item>
+ <item name="dividerHorizontal">?android:attr/dividerHorizontal</item>
+ <item name="actionBarWidgetTheme">@null</item>
+ <item name="android:actionBarWidgetTheme">?attr/actionBarWidgetTheme</item>
+
+ <!-- Required for use of support_simple_spinner_dropdown_item.xml -->
+ <item name="listPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
+ <item name="listPreferredItemHeightSmall">?android:attr/listPreferredItemHeightSmall</item>
+ <item name="listPreferredItemHeightLarge">?android:attr/listPreferredItemHeightLarge</item>
+ <item name="listPreferredItemPaddingLeft">?android:attr/listPreferredItemPaddingLeft</item>
+ <item name="listPreferredItemPaddingRight">?android:attr/listPreferredItemPaddingRight</item>
+
+ <!-- Attributes populated from the framework to be read by apps -->
+ <item name="buttonBarStyle">?android:attr/buttonBarStyle</item>
+ <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
+ </style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-v14/styles_base.xml -->
+ <eat-comment />
+
+ <style name="Widget.AppCompat.Base.ActionBar" parent="android:Widget.Holo.ActionBar"></style>
+
+ <style name="Widget.AppCompat.Base.ActionBar.Solid" parent="android:Widget.Holo.ActionBar.Solid"></style>
+
+ <style name="Widget.AppCompat.Base.ActionBar.TabBar" parent="android:Widget.Holo.ActionBar.TabBar"></style>
+
+ <style name="Widget.AppCompat.Base.ActionBar.TabText" parent="android:Widget.Holo.ActionBar.TabText"></style>
+
+ <style name="Widget.AppCompat.Base.ActionBar.TabView" parent="android:Widget.Holo.ActionBar.TabView"></style>
+
+ <style name="Widget.AppCompat.Base.ActionButton" parent="android:Widget.Holo.ActionButton"></style>
+
+ <style name="Widget.AppCompat.Base.ActionButton.CloseMode" parent="android:Widget.Holo.ActionButton.CloseMode"></style>
+
+ <style name="Widget.AppCompat.Base.ActionButton.Overflow" parent="android:Widget.Holo.ActionButton.Overflow"></style>
+
+ <style name="Widget.AppCompat.Base.ActivityChooserView" parent="">
+ <item name="android:gravity">center</item>
+ <item name="android:background">@drawable/abc_ab_share_pack_holo_dark</item>
+ <item name="android:divider">?attr/dividerVertical</item>
+ <item name="android:showDividers">middle</item>
+ <item name="android:dividerPadding">6dip</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.DropDownItem.Spinner" parent="android:Widget.Holo.DropDownItem.Spinner" />
+
+ <style name="Widget.AppCompat.Base.ListPopupWindow" parent="android:Widget.Holo.ListPopupWindow"></style>
+
+ <style name="Widget.AppCompat.Base.ListView.DropDown" parent="android:Widget.Holo.ListView.DropDown" />
+
+ <style name="Widget.AppCompat.Base.ListView.Menu" parent="android:Widget.ListView.Menu" />
+
+ <style name="Widget.AppCompat.Base.PopupMenu" parent="android:Widget.Holo.PopupMenu"></style>
+
+ <style name="Widget.AppCompat.Base.Spinner" parent="android:Widget.Holo.Spinner" />
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar" parent="android:Widget.Holo.Light.ActionBar"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.Solid" parent="android:Widget.Holo.Light.ActionBar.Solid"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.Solid.Inverse" parent="android:Widget.Holo.Light.ActionBar.Solid.Inverse"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabBar" parent="android:Widget.Holo.Light.ActionBar.TabBar"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabBar.Inverse" parent="android:Widget.Holo.Light.ActionBar.TabBar.Inverse"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabText" parent="android:Widget.Holo.Light.ActionBar.TabText"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabText.Inverse" parent="android:Widget.Holo.Light.ActionBar.TabText.Inverse"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabView" parent="android:Widget.Holo.Light.ActionBar.TabView"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabView.Inverse" parent="android:Widget.Holo.Light.ActionBar.TabView.Inverse"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionButton" parent="android:Widget.Holo.Light.ActionButton"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionButton.CloseMode" parent="android:Widget.Holo.Light.ActionButton.CloseMode"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionButton.Overflow" parent="android:Widget.Holo.Light.ActionButton.Overflow"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionMode.Inverse" parent="android:Widget.Holo.Light.ActionMode.Inverse"></style>
+
+ <style name="Widget.AppCompat.Light.Base.DropDownItem.Spinner" parent="android:Widget.Holo.Light.DropDownItem.Spinner" />
+
+ <style name="Widget.AppCompat.Light.Base.ListPopupWindow" parent="android:Widget.Holo.Light.ListPopupWindow"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ListView.DropDown" parent="android:Widget.Holo.ListView.DropDown" />
+
+ <style name="Widget.AppCompat.Light.Base.PopupMenu" parent="android:Widget.Holo.Light.PopupMenu"></style>
+
+ <style name="Widget.AppCompat.Light.Base.Spinner" parent="android:Widget.Holo.Light.Spinner" />
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-vi/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Điều hướng về trang chủ"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Điều hướng lên trên"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Thêm tùy chọn"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Xong"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Xem tất cả"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Chọn một ứng dụng"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Xóa truy vấn"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Tìm kiếm truy vấn"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Tìm kiếm"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Gửi truy vấn"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Tìm kiếm bằng giọng nói"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Chia sẻ với"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Chia sẻ với %s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-w360dp/dimens.xml -->
+ <eat-comment />
+
+ <integer name="abc_max_action_buttons">3</integer>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-w480dp/bools.xml -->
+ <eat-comment />
+
+ <bool name="abc_action_bar_embed_tabs_pre_jb">true</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-w480dp/config.xml -->
+ <eat-comment />
+
+ <bool name="abc_config_allowActionMenuItemTextWithIcon">true</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-w480dp/bools.xml -->
+ <eat-comment />
+
+ <bool name="abc_split_action_bar_is_narrow">false</bool>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-w500dp/dimens.xml -->
+ <eat-comment />
+
+ <integer name="abc_max_action_buttons">4</integer>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-w600dp/dimens.xml -->
+ <eat-comment />
+
+ <dimen name="abc_action_bar_default_height">56dip</dimen>
+ <dimen name="abc_action_bar_icon_vertical_padding">4dip</dimen>
+ <dimen name="abc_action_bar_subtitle_bottom_margin">9dip</dimen>
+ <dimen name="abc_action_bar_subtitle_text_size">14dp</dimen>
+ <dimen name="abc_action_bar_subtitle_top_margin">-3dp</dimen>
+ <dimen name="abc_action_bar_title_text_size">18dp</dimen>
+ <dimen name="abc_action_button_min_width">64dip</dimen>
+ <dimen name="abc_search_view_text_min_width">192dip</dimen>
+
+ <integer name="abc_max_action_buttons">5</integer>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-w720dp/bools.xml -->
+ <eat-comment />
+
+ <bool name="abc_action_bar_expanded_action_views_exclusive">false</bool>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-xlarge/bools.xml -->
+ <eat-comment />
+
+ <bool name="abc_action_bar_expanded_action_views_exclusive">false</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-xlarge/dimens.xml -->
+ <eat-comment />
+
+ <dimen name="abc_action_bar_default_height">56dip</dimen>
+ <dimen name="abc_action_bar_icon_vertical_padding">4dip</dimen>
+ <dimen name="abc_action_bar_subtitle_bottom_margin">9dip</dimen>
+ <dimen name="abc_action_bar_subtitle_text_size">14dp</dimen>
+ <dimen name="abc_action_bar_subtitle_top_margin">-3dp</dimen>
+ <dimen name="abc_action_bar_title_text_size">18dp</dimen>
+ <dimen name="abc_action_button_min_width">64dip</dimen>
+ <dimen name="abc_search_view_text_min_width">192dip</dimen>
+
+ <item name="dialog_fixed_height_major" type="dimen">60%</item>
+ <item name="dialog_fixed_height_minor" type="dimen">90%</item>
+ <item name="dialog_fixed_width_major" type="dimen">50%</item>
+ <item name="dialog_fixed_width_minor" type="dimen">70%</item>
+
+ <integer name="abc_max_action_buttons">5</integer>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-zh-rCN/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"转到主屏幕"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"转到上一层级"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"更多选项"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"完成"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"查看全部"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"选择应用"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"清除查询"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"搜索查询"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"搜索"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"提交查询"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"语音搜索"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"分享方式"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"通过%s分享"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-zh-rHK/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"瀏覽主頁"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"向上瀏覽"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"更多選項"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"完成"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"顯示全部"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"選擇應用程式"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"清除查詢"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"搜尋查詢"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"搜尋"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"提交查詢"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"語音搜尋"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"分享對象"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"與「%s」分享"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-zh-rTW/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"瀏覽首頁"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"向上瀏覽"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"更多選項"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"完成"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"查看全部"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"選擇應用程式"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"清除查詢"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"搜尋查詢"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"搜尋"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"提交查詢"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"語音搜尋"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"選擇分享對象"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"與「%s」分享"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values-zu/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Zulazulela ekhaya"</string>
+ <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Zulazulela phezulu"</string>
+ <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Izinketho eziningi"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Kwenziwe"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Buka konke"</string>
+ <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Khetha uhlelo lokusebenza"</string>
+ <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Sula inkinga"</string>
+ <string name="abc_searchview_description_query" msgid="2550479030709304392">"Umbuzo wosesho"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Sesha"</string>
+ <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Hambisa umbuzo"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ukusesha ngezwi"</string>
+ <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Yabelana no-"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Yabelana no-%s"</string>
+
+</resources>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/attrs.xml -->
+ <eat-comment />
+
+ <attr name="actionBarDivider" format="reference" />
+ <attr name="actionBarItemBackground" format="reference" />
+ <attr name="actionBarSize" format="dimension" />
+ <attr name="actionBarSplitStyle" format="reference" />
+ <attr name="actionBarStyle" format="reference" />
+ <attr name="actionBarTabBarStyle" format="reference" />
+ <attr name="actionBarTabStyle" format="reference" />
+ <attr name="actionBarTabTextStyle" format="reference" />
+ <attr name="actionBarWidgetTheme" format="reference" />
+ <attr name="actionButtonStyle" format="reference" />
+ <attr name="actionMenuTextAppearance" format="reference" />
+ <attr name="actionMenuTextColor" format="color|reference" />
+ <attr name="actionModeBackground" format="reference" />
+ <attr name="actionModeCloseButtonStyle" format="reference" />
+ <attr name="actionModeCloseDrawable" format="reference" />
+ <attr name="actionModeCopyDrawable" format="reference" />
+ <attr name="actionModeCutDrawable" format="reference" />
+ <attr name="actionModeFindDrawable" format="reference" />
+ <attr name="actionModePasteDrawable" format="reference" />
+ <attr name="actionModePopupWindowStyle" format="reference" />
+ <attr name="actionModeSelectAllDrawable" format="reference" />
+ <attr name="actionModeShareDrawable" format="reference" />
+ <attr name="actionModeSplitBackground" format="reference" />
+ <attr name="actionModeStyle" format="reference" />
+ <attr name="actionModeWebSearchDrawable" format="reference" />
+ <attr name="actionOverflowButtonStyle" format="reference" />
+ <attr name="activityChooserViewStyle" format="reference" />
+ <attr name="buttonBarButtonStyle" format="reference" />
+ <attr name="buttonBarStyle" format="reference" />
+ <attr name="dividerHorizontal" format="reference" />
+ <attr name="dividerVertical" format="reference" />
+ <attr name="dropDownListViewStyle" format="reference" />
+ <attr name="height" format="dimension" />
+ <attr name="homeAsUpIndicator" format="reference" />
+ <attr name="isLightTheme" format="boolean" />
+ <attr name="listPopupWindowStyle" format="reference" />
+ <attr name="listPreferredItemHeight" format="dimension" />
+ <attr name="listPreferredItemHeightLarge" format="dimension" />
+ <attr name="listPreferredItemHeightSmall" format="dimension" />
+ <attr name="listPreferredItemPaddingLeft" format="dimension" />
+ <attr name="listPreferredItemPaddingRight" format="dimension" />
+ <attr name="searchDropdownBackground" format="reference" />
+ <attr name="searchResultListItemHeight" format="dimension" />
+ <attr name="searchViewAutoCompleteTextView" format="reference" />
+ <attr name="searchViewCloseIcon" format="reference" />
+ <attr name="searchViewEditQuery" format="reference" />
+ <attr name="searchViewEditQueryBackground" format="reference" />
+ <attr name="searchViewGoIcon" format="reference" />
+ <attr name="searchViewSearchIcon" format="reference" />
+ <attr name="searchViewTextField" format="reference" />
+ <attr name="searchViewTextFieldRight" format="reference" />
+ <attr name="searchViewVoiceIcon" format="reference" />
+ <attr name="selectableItemBackground" format="reference" />
+ <attr name="spinnerDropDownItemStyle" format="reference" />
+ <attr name="spinnerStyle" format="reference" />
+ <attr name="textAppearanceLargePopupMenu" format="reference" />
+ <attr name="textAppearanceListItem" format="reference" />
+ <attr name="textAppearanceListItemSmall" format="reference" />
+ <attr name="textAppearanceSearchResultSubtitle" format="reference" />
+ <attr name="textAppearanceSearchResultTitle" format="reference" />
+ <attr name="textAppearanceSmallPopupMenu" format="reference" />
+ <attr name="textColorSearchUrl" format="reference|color" />
+ <attr name="title" format="string" />
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/bools.xml -->
+ <eat-comment />
+
+ <bool name="abc_action_bar_embed_tabs_pre_jb">false</bool>
+ <bool name="abc_action_bar_expanded_action_views_exclusive">true</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/config.xml -->
+ <eat-comment />
+
+ <bool name="abc_config_actionMenuItemAllCaps">true</bool>
+ <bool name="abc_config_allowActionMenuItemTextWithIcon">false</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/bools.xml -->
+ <eat-comment />
+
+ <bool name="abc_config_showMenuShortcutsWhenKeyboardPresent">false</bool>
+ <bool name="abc_split_action_bar_is_narrow">true</bool>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/colors.xml -->
+ <eat-comment />
+
+ <color name="abc_search_url_text_normal">#7fa87f</color>
+ <color name="abc_search_url_text_pressed">@android:color/black</color>
+ <color name="abc_search_url_text_selected">@android:color/black</color>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/attrs.xml -->
+ <eat-comment />
+
+ <declare-styleable name="ActionBar">
+
+ <!-- The type of navigation to use. -->
+ <attr name="navigationMode">
+
+ <!-- Normal static title text -->
+ <enum name="normal" value="0" />
+ <!-- The action bar will use a selection list for navigation. -->
+ <enum name="listMode" value="1" />
+ <!-- The action bar will use a series of horizontal tabs for navigation. -->
+ <enum name="tabMode" value="2" />
+ </attr>
+ <!-- Options affecting how the action bar is displayed. -->
+ <attr name="displayOptions">
+ <flag name="useLogo" value="0x1" />
+ <flag name="showHome" value="0x2" />
+ <flag name="homeAsUp" value="0x4" />
+ <flag name="showTitle" value="0x8" />
+ <flag name="showCustom" value="0x10" />
+ <flag name="disableHome" value="0x20" />
+ </attr>
+ <!-- Specifies title text used for navigationMode="normal" -->
+ <attr name="title" />
+ <!-- Specifies subtitle text used for navigationMode="normal" -->
+ <attr name="subtitle" format="string" />
+ <!-- Specifies a style to use for title text. -->
+ <attr name="titleTextStyle" format="reference" />
+ <!-- Specifies a style to use for subtitle text. -->
+ <attr name="subtitleTextStyle" format="reference" />
+ <!-- Specifies the drawable used for the application icon. -->
+ <attr name="icon" format="reference" />
+ <!-- Specifies the drawable used for the application logo. -->
+ <attr name="logo" format="reference" />
+ <!-- Specifies the drawable used for item dividers. -->
+ <attr name="divider" format="reference" />
+ <!-- Specifies a background drawable for the action bar. -->
+ <attr name="background" format="reference" />
+ <!-- Specifies a background drawable for a second stacked row of the action bar. -->
+ <attr name="backgroundStacked" format="reference|color" />
+ <!-- Specifies a background drawable for the bottom component of a split action bar. -->
+ <attr name="backgroundSplit" format="reference|color" />
+ <!-- Specifies a layout for custom navigation. Overrides navigationMode. -->
+ <attr name="customNavigationLayout" format="reference" />
+ <!-- Specifies a fixed height. -->
+ <attr name="height" />
+ <!-- Specifies a layout to use for the "home" section of the action bar. -->
+ <attr name="homeLayout" format="reference" />
+ <!-- Specifies a style resource to use for an embedded progress bar. -->
+ <attr name="progressBarStyle" format="reference" />
+ <!-- Specifies a style resource to use for an indeterminate progress spinner. -->
+ <attr name="indeterminateProgressStyle" format="reference" />
+ <!-- Specifies the horizontal padding on either end for an embedded progress bar. -->
+ <attr name="progressBarPadding" format="dimension" />
+ <!--
+ Specifies padding that should be applied to the left and right sides of
+ system-provided items in the bar.
+ -->
+ <attr name="itemPadding" format="dimension" />
+ </declare-styleable>
+ <declare-styleable name="ActionBarLayout">
+ <attr name="android:layout_gravity" />
+ </declare-styleable>
+ <declare-styleable name="ActionBarWindow">
+ <attr name="windowActionBar" format="boolean" />
+ <attr name="windowActionBarOverlay" format="boolean" />
+ <attr name="windowSplitActionBar" format="boolean" />
+
+ <!--
+ A fixed width for the window along the major axis of the screen,
+ that is, when in landscape. Can be either an absolute dimension
+ or a fraction of the screen size in that dimension.
+ -->
+ <attr name="windowFixedWidthMajor" format="dimension|fraction" />
+ <!--
+ A fixed height for the window along the minor axis of the screen,
+ that is, when in landscape. Can be either an absolute dimension
+ or a fraction of the screen size in that dimension.
+ -->
+ <attr name="windowFixedHeightMinor" format="dimension|fraction" />
+
+ <!--
+ A fixed width for the window along the minor axis of the screen,
+ that is, when in portrait. Can be either an absolute dimension
+ or a fraction of the screen size in that dimension.
+ -->
+ <attr name="windowFixedWidthMinor" format="dimension|fraction" />
+ <!--
+ A fixed height for the window along the major axis of the screen,
+ that is, when in portrait. Can be either an absolute dimension
+ or a fraction of the screen size in that dimension.
+ -->
+ <attr name="windowFixedHeightMajor" format="dimension|fraction" />
+ </declare-styleable>
+ <declare-styleable name="ActionMenuItemView">
+ <attr name="android:minWidth" />
+ </declare-styleable>
+ <declare-styleable name="ActionMenuView">
+ <!-- Size of padding on either end of a divider. -->
+ </declare-styleable>
+ <declare-styleable name="ActionMode">
+
+ <!-- Specifies a style to use for title text. -->
+ <attr name="titleTextStyle" />
+ <!-- Specifies a style to use for subtitle text. -->
+ <attr name="subtitleTextStyle" />
+ <!-- Specifies a background for the action mode bar. -->
+ <attr name="background" />
+ <!-- Specifies a background for the split action mode bar. -->
+ <attr name="backgroundSplit" />
+ <!-- Specifies a fixed height for the action mode bar. -->
+ <attr name="height" />
+ </declare-styleable>
+ <declare-styleable name="ActivityChooserView">
+
+ <!-- The maximal number of items initially shown in the activity list. -->
+ <attr name="initialActivityCount" format="string" />
+ <!--
+ The drawable to show in the button for expanding the activities overflow popup.
+ <strong>Note:</strong> Clients would like to set this drawable
+ as a clue about the action the chosen activity will perform. For
+ example, if share activity is to be chosen the drawable should
+ give a clue that sharing is to be performed.
+ -->
+ <attr name="expandActivityOverflowButtonDrawable" format="reference" />
+ </declare-styleable>
+ <declare-styleable name="CompatTextView">
+
+ <!-- Present the text in ALL CAPS. This may use a small-caps form when available. -->
+ <attr name="textAllCaps" format="reference|boolean" />
+ </declare-styleable>
+ <declare-styleable name="LinearLayoutICS">
+
+ <!-- Drawable to use as a vertical divider between buttons. -->
+ <attr name="divider" />
+ <!-- Setting for which dividers to show. -->
+ <attr name="showDividers">
+ <flag name="none" value="0" />
+ <flag name="beginning" value="1" />
+ <flag name="middle" value="2" />
+ <flag name="end" value="4" />
+ </attr>
+ <!-- Size of padding on either end of a divider. -->
+ <attr name="dividerPadding" format="dimension" />
+ </declare-styleable>
+ <declare-styleable name="MenuGroup">
+
+ <!-- The ID of the group. -->
+ <attr name="android:id" />
+
+ <!--
+ The category applied to all items within this group.
+ (This will be or'ed with the orderInCategory attribute.)
+ -->
+ <attr name="android:menuCategory" />
+
+ <!--
+ The order within the category applied to all items within this group.
+ (This will be or'ed with the category attribute.)
+ -->
+ <attr name="android:orderInCategory" />
+
+ <!-- Whether the items are capable of displaying a check mark. -->
+ <attr name="android:checkableBehavior" />
+
+ <!-- Whether the items are shown/visible. -->
+ <attr name="android:visible" />
+
+ <!-- Whether the items are enabled. -->
+ <attr name="android:enabled" />
+ </declare-styleable>
+ <declare-styleable name="MenuItem">
+
+ <!-- The ID of the item. -->
+ <attr name="android:id" />
+
+ <!--
+ The category applied to the item.
+ (This will be or'ed with the orderInCategory attribute.)
+ -->
+ <attr name="android:menuCategory" />
+
+ <!--
+ The order within the category applied to the item.
+ (This will be or'ed with the category attribute.)
+ -->
+ <attr name="android:orderInCategory" />
+
+ <!-- The title associated with the item. -->
+ <attr name="android:title" />
+
+ <!--
+ The condensed title associated with the item. This is used in situations where the
+ normal title may be too long to be displayed.
+ -->
+ <attr name="android:titleCondensed" />
+
+ <!--
+ The icon associated with this item. This icon will not always be shown, so
+ the title should be sufficient in describing this item.
+ -->
+ <attr name="android:icon" />
+
+ <!--
+ The alphabetic shortcut key. This is the shortcut when using a keyboard
+ with alphabetic keys.
+ -->
+ <attr name="android:alphabeticShortcut" />
+
+ <!--
+ The numeric shortcut key. This is the shortcut when using a numeric (e.g., 12-key)
+ keyboard.
+ -->
+ <attr name="android:numericShortcut" />
+
+ <!-- Whether the item is capable of displaying a check mark. -->
+ <attr name="android:checkable" />
+
+ <!--
+ Whether the item is checked. Note that you must first have enabled checking with
+ the checkable attribute or else the check mark will not appear.
+ -->
+ <attr name="android:checked" />
+
+ <!-- Whether the item is shown/visible. -->
+ <attr name="android:visible" />
+
+ <!-- Whether the item is enabled. -->
+ <attr name="android:enabled" />
+
+ <!--
+ Name of a method on the Context used to inflate the menu that will be
+ called when the item is clicked.
+ -->
+ <attr name="android:onClick" />
+
+ <!-- How this item should display in the Action Bar, if present. -->
+ <attr name="showAsAction">
+
+ <!--
+ Never show this item in an action bar, show it in the overflow menu instead.
+ Mutually exclusive with "ifRoom" and "always".
+ -->
+ <flag name="never" value="0" />
+ <!--
+ Show this item in an action bar if there is room for it as determined
+ by the system. Favor this option over "always" where possible.
+ Mutually exclusive with "never" and "always".
+ -->
+ <flag name="ifRoom" value="1" />
+ <!--
+ Always show this item in an actionbar, even if it would override
+ the system's limits of how much stuff to put there. This may make
+ your action bar look bad on some screens. In most cases you should
+ use "ifRoom" instead. Mutually exclusive with "ifRoom" and "never".
+ -->
+ <flag name="always" value="2" />
+ <!--
+ When this item is shown as an action in the action bar, show a text
+ label with it even if it has an icon representation.
+ -->
+ <flag name="withText" value="4" />
+ <!--
+ This item's action view collapses to a normal menu
+ item. When expanded, the action view takes over a
+ larger segment of its container.
+ -->
+ <flag name="collapseActionView" value="8" />
+ </attr>
+
+ <!--
+ An optional layout to be used as an action view.
+ See {@link android.view.MenuItem#setActionView(android.view.View)}
+ for more info.
+ -->
+ <attr name="actionLayout" format="reference" />
+
+ <!--
+ The name of an optional View class to instantiate and use as an
+ action view. See {@link android.view.MenuItem#setActionView(android.view.View)}
+ for more info.
+ -->
+ <attr name="actionViewClass" format="string" />
+
+ <!--
+ The name of an optional ActionProvider class to instantiate an action view
+ and perform operations such as default action for that menu item.
+ See {@link android.view.MenuItem#setActionProvider(android.view.ActionProvider)}
+ for more info.
+ -->
+ <attr name="actionProviderClass" format="string" />
+ </declare-styleable>
+ <declare-styleable name="MenuView">
+
+ <!-- Default appearance of menu item text. -->
+ <attr name="android:itemTextAppearance" />
+ <!-- Default horizontal divider between rows of menu items. -->
+ <attr name="android:horizontalDivider" />
+ <!-- Default vertical divider between menu items. -->
+ <attr name="android:verticalDivider" />
+ <!-- Default background for the menu header. -->
+ <attr name="android:headerBackground" />
+ <!-- Default background for each menu item. -->
+ <attr name="android:itemBackground" />
+ <!-- Default animations for the menu. -->
+ <attr name="android:windowAnimationStyle" />
+ <!-- Default disabled icon alpha for each menu item that shows an icon. -->
+ <attr name="android:itemIconDisabledAlpha" />
+ <!-- Whether space should be reserved in layout when an icon is missing. -->
+ <attr name="android:preserveIconSpacing" />
+ </declare-styleable>
+ <declare-styleable name="SearchView">
+
+ <!--
+ The default state of the SearchView. If true, it will be iconified when not in
+ use and expanded when clicked.
+ -->
+ <attr name="iconifiedByDefault" format="boolean" />
+ <!-- An optional maximum width of the SearchView. -->
+ <attr name="android:maxWidth" />
+ <!-- An optional query hint string to be displayed in the empty query field. -->
+ <attr name="queryHint" format="string" />
+ <!-- The IME options to set on the query text field. -->
+ <attr name="android:imeOptions" />
+ <!-- The input type to set on the query text field. -->
+ <attr name="android:inputType" />
+ </declare-styleable>
+ <declare-styleable name="Spinner">
+
+ <!-- The prompt to display when the spinner's dialog is shown. -->
+ <attr name="prompt" format="reference" />
+ <!-- Display mode for spinner options. -->
+ <attr name="spinnerMode" format="enum">
+
+ <!-- Spinner options will be presented to the user as a dialog window. -->
+ <enum name="dialog" value="0" />
+ <!--
+ Spinner options will be presented to the user as an inline dropdown
+ anchored to the spinner widget itself.
+ -->
+ <enum name="dropdown" value="1" />
+ </attr>
+ <!-- List selector to use for spinnerMode="dropdown" display. -->
+ <attr name="android:dropDownSelector" />
+ <!-- Background drawable to use for the dropdown in spinnerMode="dropdown". -->
+ <attr name="android:popupBackground" />
+ <!--
+ Vertical offset from the spinner widget for positioning the dropdown in
+ spinnerMode="dropdown".
+ -->
+ <attr name="android:dropDownVerticalOffset" />
+ <!--
+ Horizontal offset from the spinner widget for positioning the dropdown
+ in spinnerMode="dropdown".
+ -->
+ <attr name="android:dropDownHorizontalOffset" />
+ <!-- Width of the dropdown in spinnerMode="dropdown". -->
+ <attr name="android:dropDownWidth" />
+ <!--
+ Reference to a layout to use for displaying a prompt in the dropdown for
+ spinnerMode="dropdown". This layout must contain a TextView with the id
+ {@code @android:id/text1} to be populated with the prompt text.
+ -->
+ <attr name="popupPromptView" format="reference" />
+ <!-- Gravity setting for positioning the currently selected item. -->
+ <attr name="android:gravity" />
+ <!--
+ Whether this spinner should mark child views as enabled/disabled when
+ the spinner itself is enabled/disabled.
+ -->
+ <attr name="disableChildrenWhenDisabled" format="boolean" />
+ </declare-styleable>
+ <declare-styleable name="Theme">
+
+ <!-- Default ActionBar dropdown style. -->
+ <attr name="actionDropDownStyle" format="reference" />
+ <!-- The preferred item height for dropdown lists. -->
+ <attr name="dropdownListPreferredItemHeight" format="dimension" />
+ <!-- Default PopupMenu style. -->
+ <attr name="popupMenuStyle" format="reference" />
+
+ <!-- ============ -->
+ <!-- Panel styles -->
+ <!-- ============ -->
+ <eat-comment />
+
+ <!-- Default Panel Menu width. -->
+ <attr name="panelMenuListWidth" format="dimension" />
+
+ <!-- Default Panel Menu style. -->
+ <attr name="panelMenuListTheme" format="reference" />
+
+ <!-- Drawable used as a background for selected list items. -->
+ <attr name="listChoiceBackgroundIndicator" format="reference" />
+ </declare-styleable>
+ <declare-styleable name="View">
+
+ <!-- Sets the padding, in pixels, of the start edge; see {@link android.R.attr#padding}. -->
+ <attr name="paddingStart" format="dimension" />
+ <!-- Sets the padding, in pixels, of the end edge; see {@link android.R.attr#padding}. -->
+ <attr name="paddingEnd" format="dimension" />
+
+ <!--
+ Boolean that controls whether a view can take focus. By default the user can not
+ move focus to a view; by setting this attribute to true the view is
+ allowed to take focus. This value does not impact the behavior of
+ directly calling {@link android.view.View#requestFocus}, which will
+ always request focus regardless of this view. It only impacts where
+ focus navigation will try to move focus.
+ -->
+ <attr name="android:focusable" />
+ </declare-styleable>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/dimens.xml -->
+ <eat-comment />
+
+ <dimen name="abc_action_bar_default_height">48dip</dimen>
+ <dimen name="abc_action_bar_icon_vertical_padding">8dip</dimen>
+ <dimen name="abc_action_bar_progress_bar_size">40dp</dimen>
+ <dimen name="abc_action_bar_stacked_max_height">48dp</dimen>
+ <dimen name="abc_action_bar_stacked_tab_max_width">180dp</dimen>
+ <dimen name="abc_action_bar_subtitle_bottom_margin">5dip</dimen>
+ <dimen name="abc_action_bar_subtitle_text_size">14dp</dimen>
+ <dimen name="abc_action_bar_subtitle_top_margin">-3dp</dimen>
+ <dimen name="abc_action_bar_title_text_size">18dp</dimen>
+ <dimen name="abc_action_button_min_width">56dip</dimen>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/config.xml -->
+ <eat-comment />
+
+ <dimen name="abc_config_prefDialogWidth">320dp</dimen>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/dimens.xml -->
+ <eat-comment />
+
+ <dimen name="abc_dropdownitem_icon_width">32dip</dimen>
+ <dimen name="abc_dropdownitem_text_padding_left">8dip</dimen>
+ <dimen name="abc_dropdownitem_text_padding_right">8dip</dimen>
+ <dimen name="abc_panel_menu_list_width">296dp</dimen>
+ <dimen name="abc_search_view_preferred_width">320dip</dimen>
+ <dimen name="abc_search_view_text_min_width">160dip</dimen>
+
+ <item name="dialog_fixed_height_major" type="dimen">80%</item>
+ <item name="dialog_fixed_height_minor" type="dimen">100%</item>
+ <item name="dialog_fixed_width_major" type="dimen">320dp</item>
+ <item name="dialog_fixed_width_minor" type="dimen">320dp</item>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/ids.xml -->
+ <eat-comment />
+
+ <item name="action_bar_activity_content" type="id"/>
+ <item name="action_menu_divider" type="id"/>
+ <item name="action_menu_presenter" type="id"/>
+ <item name="home" type="id"/>
+ <item name="progress_circular" type="id"/>
+ <item name="progress_horizontal" type="id"/>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/dimens.xml -->
+ <eat-comment />
+
+ <integer name="abc_max_action_buttons">2</integer>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/strings.xml -->
+ <eat-comment />
+
+ <string name="abc_action_bar_home_description">Navigate home</string>
+ <string name="abc_action_bar_up_description">Navigate up</string>
+ <string name="abc_action_menu_overflow_description">More options</string>
+ <string name="abc_action_mode_done">Done</string>
+ <string name="abc_activity_chooser_view_see_all">See all</string>
+ <string name="abc_activitychooserview_choose_application">Choose an app</string>
+ <string name="abc_searchview_description_clear">Clear query</string>
+ <string name="abc_searchview_description_query">Search query</string>
+ <string name="abc_searchview_description_search">Search</string>
+ <string name="abc_searchview_description_submit">Submit query</string>
+ <string name="abc_searchview_description_voice">Voice search</string>
+ <string name="abc_shareactionprovider_share_with">Share with</string>
+ <string name="abc_shareactionprovider_share_with_application">Share with %s</string>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles_base.xml -->
+ <eat-comment />
+
+ <style name="TextAppearance.AppCompat.Base.CompactMenu.Dialog" parent="android:TextAppearance.Medium">
+ <item name="android:textColor">@android:color/primary_text_light</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Base.SearchResult" parent="">
+ <item name="android:textStyle">normal</item>
+ <item name="android:textColor">?android:textColorPrimary</item>
+ <item name="android:textColorHint">?android:textColorHint</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Base.SearchResult.Subtitle">
+ <item name="android:textSize">14sp</item>
+ <item name="android:textColor">?android:textColorSecondary</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Base.SearchResult.Title">
+ <item name="android:textSize">18sp</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Base.Widget.PopupMenu.Large" parent="android:TextAppearance.Widget">
+ <item name="android:textColor">?android:attr/textColorPrimaryDisableOnly</item>
+ <item name="android:textSize">18sp</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Base.Widget.PopupMenu.Small" parent="android:TextAppearance.Widget">
+ <item name="android:textColor">?android:attr/textColorPrimaryDisableOnly</item>
+ <item name="android:textSize">14sp</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Light.Base.SearchResult" parent="TextAppearance.AppCompat.Base.SearchResult">
+ <item name="android:textColor">?android:textColorPrimary</item>
+ <item name="android:textColorHint">?android:textColorHint</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Light.Base.SearchResult.Subtitle">
+ <item name="android:textSize">14sp</item>
+ <item name="android:textColor">?android:textColorSecondary</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Light.Base.SearchResult.Title">
+ <item name="android:textSize">18sp</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Light.Base.Widget.PopupMenu.Large" parent="TextAppearance.AppCompat.Base.Widget.PopupMenu.Large"></style>
+
+ <style name="TextAppearance.AppCompat.Light.Base.Widget.PopupMenu.Small" parent="TextAppearance.AppCompat.Base.Widget.PopupMenu.Small"></style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles.xml -->
+ <eat-comment />
+
+ <style name="TextAppearance.AppCompat.Light.SearchResult.Subtitle" parent="TextAppearance.AppCompat.Light.Base.SearchResult.Subtitle"></style>
+
+ <style name="TextAppearance.AppCompat.Light.SearchResult.Title" parent="TextAppearance.AppCompat.Light.Base.SearchResult.Title"></style>
+
+ <style name="TextAppearance.AppCompat.Light.Widget.PopupMenu.Large" parent="TextAppearance.AppCompat.Light.Base.Widget.PopupMenu.Large"></style>
+
+ <style name="TextAppearance.AppCompat.Light.Widget.PopupMenu.Small" parent="TextAppearance.AppCompat.Light.Base.Widget.PopupMenu.Small"></style>
+
+ <style name="TextAppearance.AppCompat.SearchResult.Subtitle" parent="TextAppearance.AppCompat.Base.SearchResult.Subtitle"></style>
+
+ <style name="TextAppearance.AppCompat.SearchResult.Title" parent="TextAppearance.AppCompat.Base.SearchResult.Title"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.ActionBar.Menu" parent="TextAppearance.AppCompat.Widget.Base.ActionBar.Menu"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.ActionBar.Subtitle" parent="TextAppearance.AppCompat.Widget.Base.ActionBar.Subtitle"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.ActionBar.Subtitle.Inverse" parent="TextAppearance.AppCompat.Widget.Base.ActionBar.Subtitle.Inverse"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.ActionBar.Title" parent="TextAppearance.AppCompat.Widget.Base.ActionBar.Title"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse" parent="TextAppearance.AppCompat.Widget.Base.ActionBar.Title.Inverse"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.ActionMode.Subtitle" parent="TextAppearance.AppCompat.Widget.Base.ActionMode.Subtitle"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.ActionMode.Subtitle.Inverse" parent="TextAppearance.AppCompat.Widget.Base.ActionMode.Subtitle.Inverse"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.ActionMode.Title" parent="TextAppearance.AppCompat.Widget.Base.ActionMode.Title"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.ActionMode.Title.Inverse" parent="TextAppearance.AppCompat.Widget.Base.ActionMode.Title.Inverse"></style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles_base.xml -->
+ <eat-comment />
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionBar.Menu" parent="android:TextAppearance.Small">
+ <item name="android:textSize">12sp</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:textColor">?attr/actionMenuTextColor</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionBar.Subtitle" parent="android:TextAppearance.Small">
+ <item name="android:textSize">@dimen/abc_action_bar_subtitle_text_size</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionBar.Subtitle.Inverse" parent="android:TextAppearance.Small.Inverse">
+ <item name="android:textSize">@dimen/abc_action_bar_subtitle_text_size</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionBar.Title" parent="android:TextAppearance.Medium">
+ <item name="android:textSize">@dimen/abc_action_bar_title_text_size</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionBar.Title.Inverse" parent="android:TextAppearance.Medium.Inverse">
+ <item name="android:textSize">@dimen/abc_action_bar_title_text_size</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionMode.Subtitle" parent="android:TextAppearance.Small">
+ <item name="android:textColor">?android:attr/textColorSecondary</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionMode.Subtitle.Inverse" parent="android:TextAppearance.Small.Inverse">
+ <item name="android:textColor">?android:attr/textColorSecondaryInverse</item>
+ </style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionMode.Title" parent="android:TextAppearance.Medium"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.ActionMode.Title.Inverse" parent="android:TextAppearance.Medium.Inverse"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.Base.DropDownItem" parent="android:TextAppearance.Small">
+ <item name="android:textColor">?android:attr/textColorPrimaryDisableOnly</item>
+ </style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles.xml -->
+ <eat-comment />
+
+ <style name="TextAppearance.AppCompat.Widget.DropDownItem" parent="TextAppearance.AppCompat.Widget.Base.DropDownItem"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.PopupMenu.Large" parent="TextAppearance.AppCompat.Base.Widget.PopupMenu.Large"></style>
+
+ <style name="TextAppearance.AppCompat.Widget.PopupMenu.Small" parent="TextAppearance.AppCompat.Base.Widget.PopupMenu.Small"></style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles_base.xml -->
+ <eat-comment />
+
+ <style name="TextAppearance.Widget.AppCompat.Base.ExpandedMenu.Item" parent="android:TextAppearance.Medium">
+ <item name="android:textColor">?android:attr/textColorPrimaryDisableOnly</item>
+ </style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles.xml -->
+ <eat-comment />
+
+ <style name="TextAppearance.Widget.AppCompat.ExpandedMenu.Item" parent="TextAppearance.Widget.AppCompat.Base.ExpandedMenu.Item"></style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/themes.xml -->
+ <eat-comment />
+
+ <style name="Theme.AppCompat" parent="Theme.Base.AppCompat">
+ <item name="isLightTheme">false</item>
+
+ <!-- Required for use of support_simple_spinner_dropdown_item.xml -->
+ <item name="spinnerDropDownItemStyle"> @style/Widget.AppCompat.DropDownItem.Spinner</item>
+ <item name="dropdownListPreferredItemHeight">?attr/listPreferredItemHeightSmall</item>
+ <item name="searchResultListItemHeight">58dip</item>
+
+ <!-- Popup Menu styles -->
+ <item name="popupMenuStyle">@style/Widget.AppCompat.PopupMenu</item>
+ <item name="textAppearanceLargePopupMenu"> @style/TextAppearance.AppCompat.Widget.PopupMenu.Large</item>
+ <item name="textAppearanceSmallPopupMenu"> @style/TextAppearance.AppCompat.Widget.PopupMenu.Small</item>
+ <item name="listPopupWindowStyle">@style/Widget.AppCompat.ListPopupWindow</item>
+ <item name="dropDownListViewStyle">@style/Widget.AppCompat.ListView.DropDown</item>
+
+ <!-- SearchView attributes -->
+ <item name="searchDropdownBackground">@drawable/abc_search_dropdown_dark</item>
+ <item name="searchViewTextField">@drawable/abc_textfield_searchview_holo_dark</item>
+ <item name="searchViewTextFieldRight">@drawable/abc_textfield_searchview_right_holo_dark</item>
+ <item name="searchViewCloseIcon">@drawable/abc_ic_clear</item>
+ <item name="searchViewSearchIcon">@drawable/abc_ic_search</item>
+ <item name="searchViewGoIcon">@drawable/abc_ic_go</item>
+ <item name="searchViewVoiceIcon">@drawable/abc_ic_voice_search</item>
+ <item name="searchViewEditQuery">@drawable/abc_ic_commit_search_api_holo_dark</item>
+ <item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>
+ <item name="searchViewAutoCompleteTextView"> @style/Widget.AppCompat.AutoCompleteTextView</item>
+ <item name="textColorSearchUrl">@color/abc_search_url_text_holo</item>
+ <item name="textAppearanceSearchResultTitle"> @style/TextAppearance.AppCompat.SearchResult.Title</item>
+ <item name="textAppearanceSearchResultSubtitle"> @style/TextAppearance.AppCompat.SearchResult.Subtitle</item>
+ <item name="actionModeShareDrawable">@drawable/abc_ic_menu_share_holo_dark</item>
+
+ <!-- ShareActionProvider attributes -->
+ <item name="activityChooserViewStyle">@style/Widget.AppCompat.ActivityChooserView</item>
+ </style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/themes_base.xml -->
+ <eat-comment />
+
+ <style name="Theme.AppCompat.Base.CompactMenu" parent="">
+ <item name="android:itemTextAppearance"> @style/TextAppearance.Widget.AppCompat.ExpandedMenu.Item</item>
+ <item name="android:listViewStyle">@style/Widget.AppCompat.ListView.Menu</item>
+ </style>
+
+ <style name="Theme.AppCompat.Base.CompactMenu.Dialog" parent="">
+ <item name="android:itemTextAppearance"> @style/TextAppearance.AppCompat.Base.CompactMenu.Dialog</item>
+ <item name="android:listViewStyle">@android:style/Widget.ListView.Menu</item>
+ </style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/themes.xml -->
+ <eat-comment />
+
+ <style name="Theme.AppCompat.CompactMenu" parent="Theme.AppCompat.Base.CompactMenu"></style>
+
+ <style name="Theme.AppCompat.CompactMenu.Dialog" parent="Theme.AppCompat.Base.CompactMenu.Dialog"></style>
+
+ <style name="Theme.AppCompat.DialogWhenLarge" parent="Theme.Base.AppCompat.DialogWhenLarge"></style>
+
+ <style name="Theme.AppCompat.Light" parent="Theme.Base.AppCompat.Light">
+ <item name="isLightTheme">true</item>
+
+ <!-- Required for use of support_simple_spinner_dropdown_item.xml -->
+ <item name="spinnerDropDownItemStyle"> @style/Widget.AppCompat.Light.DropDownItem.Spinner</item>
+ <item name="dropdownListPreferredItemHeight">?attr/listPreferredItemHeightSmall</item>
+ <item name="searchResultListItemHeight">58dip</item>
+
+ <!-- Popup Menu styles -->
+ <item name="popupMenuStyle">@style/Widget.AppCompat.Light.PopupMenu</item>
+ <item name="textAppearanceLargePopupMenu"> @style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Large</item>
+ <item name="textAppearanceSmallPopupMenu"> @style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Small</item>
+ <item name="listPopupWindowStyle">@style/Widget.AppCompat.Light.ListPopupWindow</item>
+ <item name="dropDownListViewStyle">@style/Widget.AppCompat.Light.ListView.DropDown</item>
+
+ <!-- SearchView attributes -->
+ <item name="searchDropdownBackground">@drawable/abc_search_dropdown_light</item>
+ <item name="searchViewTextField">@drawable/abc_textfield_searchview_holo_light</item>
+ <item name="searchViewTextFieldRight">@drawable/abc_textfield_searchview_right_holo_light</item>
+ <item name="searchViewCloseIcon">@drawable/abc_ic_clear_holo_light</item>
+ <item name="searchViewSearchIcon">@drawable/abc_ic_search_api_holo_light</item>
+ <item name="searchViewGoIcon">@drawable/abc_ic_go_search_api_holo_light</item>
+ <item name="searchViewVoiceIcon">@drawable/abc_ic_voice_search_api_holo_light</item>
+ <item name="searchViewEditQuery">@drawable/abc_ic_commit_search_api_holo_light</item>
+ <item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>
+ <item name="searchViewAutoCompleteTextView"> @style/Widget.AppCompat.Light.AutoCompleteTextView</item>
+ <item name="textColorSearchUrl">@color/abc_search_url_text_holo</item>
+ <item name="textAppearanceSearchResultTitle"> @style/TextAppearance.AppCompat.Light.SearchResult.Title</item>
+ <item name="textAppearanceSearchResultSubtitle"> @style/TextAppearance.AppCompat.Light.SearchResult.Subtitle</item>
+ <item name="actionModeShareDrawable">@drawable/abc_ic_menu_share_holo_light</item>
+
+ <!-- ShareActionProvider attributes -->
+ <item name="activityChooserViewStyle">@style/Widget.AppCompat.Light.ActivityChooserView</item>
+ </style>
+
+ <style name="Theme.AppCompat.Light.DarkActionBar" parent="Theme.Base.AppCompat.Light.DarkActionBar">
+ <item name="isLightTheme">true</item>
+
+ <!-- Required for use of support_simple_spinner_dropdown_item.xml -->
+ <item name="spinnerDropDownItemStyle"> @style/Widget.AppCompat.Light.DropDownItem.Spinner</item>
+ <item name="dropdownListPreferredItemHeight">?attr/listPreferredItemHeightSmall</item>
+ <item name="searchResultListItemHeight">58dip</item>
+
+ <!-- Popup Menu styles -->
+ <item name="popupMenuStyle">@style/Widget.AppCompat.Light.PopupMenu</item>
+ <item name="textAppearanceLargePopupMenu"> @style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Large</item>
+ <item name="textAppearanceSmallPopupMenu"> @style/TextAppearance.AppCompat.Light.Widget.PopupMenu.Small</item>
+ <item name="listPopupWindowStyle">@style/Widget.AppCompat.ListPopupWindow</item>
+ <item name="dropDownListViewStyle">@style/Widget.AppCompat.ListView.DropDown</item>
+
+ <!-- SearchView attributes -->
+ <item name="searchDropdownBackground">@drawable/abc_search_dropdown_dark</item>
+ <item name="searchViewTextField">@drawable/abc_textfield_searchview_holo_dark</item>
+ <item name="searchViewTextFieldRight">@drawable/abc_textfield_searchview_right_holo_dark</item>
+ <item name="searchViewCloseIcon">@drawable/abc_ic_clear</item>
+ <item name="searchViewSearchIcon">@drawable/abc_ic_search</item>
+ <item name="searchViewGoIcon">@drawable/abc_ic_go</item>
+ <item name="searchViewVoiceIcon">@drawable/abc_ic_voice_search</item>
+ <item name="searchViewEditQuery">@drawable/abc_ic_commit_search_api_holo_dark</item>
+ <item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>
+ <item name="searchViewAutoCompleteTextView"> @style/Widget.AppCompat.AutoCompleteTextView</item>
+ <item name="textColorSearchUrl">@color/abc_search_url_text_holo</item>
+ <item name="textAppearanceSearchResultTitle"> @style/TextAppearance.AppCompat.SearchResult.Title</item>
+ <item name="textAppearanceSearchResultSubtitle"> @style/TextAppearance.AppCompat.SearchResult.Subtitle</item>
+ <item name="actionModeShareDrawable">@drawable/abc_ic_menu_share_holo_dark</item>
+
+ <!-- ShareActionProvider attributes -->
+ <item name="activityChooserViewStyle">@style/Widget.AppCompat.ActivityChooserView</item>
+ </style>
+
+ <style name="Theme.AppCompat.Light.DialogWhenLarge" parent="Theme.Base.AppCompat.Light.DialogWhenLarge"></style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/themes_base.xml -->
+ <eat-comment />
+
+ <style name="Theme.Base" parent="android:Theme"></style>
+
+ <style name="Theme.Base.AppCompat" parent="Theme.Base">
+ <item name="windowActionBar">true</item>
+ <!-- Remove system title bars; we will add the action bar ourselves. -->
+ <item name="android:windowNoTitle">true</item>
+ <item name="buttonBarStyle">@android:style/ButtonBar</item>
+ <item name="buttonBarButtonStyle">@android:style/Widget.Button</item>
+ <item name="selectableItemBackground">@drawable/abc_item_background_holo_dark</item>
+ <item name="homeAsUpIndicator">@drawable/abc_ic_ab_back_holo_dark</item>
+ <item name="dividerVertical">@drawable/abc_list_divider_holo_dark</item>
+ <item name="dividerHorizontal">@drawable/abc_list_divider_holo_dark</item>
+ <item name="listPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
+ <item name="listPreferredItemHeightSmall">48dp</item>
+ <item name="listPreferredItemHeightLarge">80dp</item>
+ <item name="listPreferredItemPaddingLeft">8dip</item>
+ <item name="listPreferredItemPaddingRight">8dip</item>
+ <item name="textAppearanceListItem">?android:attr/textAppearanceMedium</item>
+ <item name="textAppearanceListItemSmall">?android:attr/textAppearanceMedium</item>
+ <item name="actionBarTabStyle">@style/Widget.AppCompat.ActionBar.TabView</item>
+ <item name="actionBarTabBarStyle">@style/Widget.AppCompat.ActionBar.TabBar</item>
+ <item name="actionBarTabTextStyle">@style/Widget.AppCompat.ActionBar.TabText</item>
+ <item name="actionButtonStyle">@style/Widget.AppCompat.ActionButton</item>
+ <item name="actionOverflowButtonStyle">@style/Widget.AppCompat.ActionButton.Overflow</item>
+ <item name="actionBarStyle">@style/Widget.AppCompat.ActionBar</item>
+ <item name="actionBarSplitStyle">?attr/actionBarStyle</item>
+ <item name="actionBarWidgetTheme">@null</item>
+ <item name="actionBarSize">@dimen/abc_action_bar_default_height</item>
+ <item name="actionBarDivider">?attr/dividerVertical</item>
+ <item name="actionBarItemBackground">?attr/selectableItemBackground</item>
+ <item name="actionMenuTextAppearance"> @style/TextAppearance.AppCompat.Widget.ActionBar.Menu</item>
+ <item name="actionMenuTextColor">?android:attr/textColorPrimaryDisableOnly</item>
+
+ <!-- Dropdown Spinner Attributes -->
+ <item name="actionDropDownStyle">@style/Widget.AppCompat.Spinner.DropDown.ActionBar</item>
+
+ <!-- Action Mode -->
+ <item name="actionModeStyle">@style/Widget.AppCompat.ActionMode</item>
+ <item name="actionModeBackground">@drawable/abc_cab_background_top_holo_dark</item>
+ <item name="actionModeSplitBackground">@drawable/abc_cab_background_bottom_holo_dark</item>
+ <item name="actionModeCloseDrawable">@drawable/abc_ic_cab_done_holo_dark</item>
+ <item name="actionModeCloseButtonStyle">@style/Widget.AppCompat.ActionButton.CloseMode</item>
+
+ <!-- Panel attributes -->
+ <item name="panelMenuListWidth">@dimen/abc_panel_menu_list_width</item>
+ <item name="panelMenuListTheme">@style/Theme.AppCompat.CompactMenu</item>
+ <item name="android:panelBackground">@drawable/abc_menu_hardkey_panel_holo_dark</item>
+ <item name="listChoiceBackgroundIndicator">@drawable/abc_list_selector_holo_dark</item>
+ </style>
+
+ <style name="Theme.Base.AppCompat.Dialog.FixedSize" parent="android:Theme.Dialog">
+ <item name="windowFixedWidthMajor">@dimen/dialog_fixed_width_major</item>
+ <item name="windowFixedWidthMinor">@dimen/dialog_fixed_width_minor</item>
+ <item name="windowFixedHeightMajor">@dimen/dialog_fixed_height_major</item>
+ <item name="windowFixedHeightMinor">@dimen/dialog_fixed_height_minor</item>
+ <item name="windowActionBar">true</item>
+ <!-- Remove system title bars; we will add the action bar ourselves. -->
+ <item name="android:windowNoTitle">true</item>
+ <item name="buttonBarStyle">@android:style/ButtonBar</item>
+ <item name="buttonBarButtonStyle">@android:style/Widget.Button</item>
+ <item name="selectableItemBackground">@drawable/abc_item_background_holo_dark</item>
+ <item name="dividerVertical">@drawable/abc_list_divider_holo_dark</item>
+ <item name="dividerHorizontal">@drawable/abc_list_divider_holo_dark</item>
+ <item name="listPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
+ <item name="listPreferredItemHeightSmall">48dp</item>
+ <item name="listPreferredItemHeightLarge">80dp</item>
+ <item name="listPreferredItemPaddingLeft">8dip</item>
+ <item name="listPreferredItemPaddingRight">8dip</item>
+ <item name="textAppearanceListItem">?android:attr/textAppearanceMedium</item>
+ <item name="textAppearanceListItemSmall">?android:attr/textAppearanceMedium</item>
+
+ <!-- Action Mode -->
+ <item name="actionModeStyle">@style/Widget.AppCompat.ActionMode</item>
+ <item name="actionModeBackground">@drawable/abc_cab_background_top_holo_dark</item>
+ <item name="actionModeSplitBackground">@drawable/abc_cab_background_bottom_holo_dark</item>
+ <item name="actionModeCloseDrawable">@drawable/abc_ic_cab_done_holo_dark</item>
+ <item name="actionModeCloseButtonStyle">@style/Widget.AppCompat.ActionButton.CloseMode</item>
+
+ <!-- Panel attributes -->
+ <item name="panelMenuListWidth">@dimen/abc_panel_menu_list_width</item>
+ <item name="panelMenuListTheme">@style/Theme.AppCompat.CompactMenu</item>
+ <item name="android:panelBackground">@drawable/abc_menu_hardkey_panel_holo_dark</item>
+ <item name="listChoiceBackgroundIndicator">@drawable/abc_list_selector_holo_dark</item>
+ </style>
+
+ <style name="Theme.Base.AppCompat.Dialog.Light.FixedSize" parent="Theme.Base.AppCompat.Dialog.FixedSize" />
+
+ <style name="Theme.Base.AppCompat.DialogWhenLarge" parent="Theme.Base.AppCompat"></style>
+
+ <style name="Theme.Base.AppCompat.Light" parent="Theme.Base.Light">
+ <item name="windowActionBar">true</item>
+ <!-- Remove system title bars; we will add the action bar ourselves. -->
+ <item name="android:windowNoTitle">true</item>
+ <item name="buttonBarStyle">@android:style/ButtonBar</item>
+ <item name="buttonBarButtonStyle">@android:style/Widget.Button</item>
+ <item name="selectableItemBackground">@drawable/abc_item_background_holo_light</item>
+ <item name="homeAsUpIndicator">@drawable/abc_ic_ab_back_holo_light</item>
+ <item name="dividerVertical">@drawable/abc_list_divider_holo_light</item>
+ <item name="dividerHorizontal">@drawable/abc_list_divider_holo_light</item>
+ <item name="listPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
+ <item name="listPreferredItemHeightSmall">48dp</item>
+ <item name="listPreferredItemHeightLarge">80dp</item>
+ <item name="listPreferredItemPaddingLeft">8dip</item>
+ <item name="listPreferredItemPaddingRight">8dip</item>
+ <item name="textAppearanceListItem">?android:attr/textAppearanceMedium</item>
+ <item name="textAppearanceListItemSmall">?android:attr/textAppearanceMedium</item>
+
+ <!-- Action Bar Styles -->
+ <item name="actionBarTabStyle">@style/Widget.AppCompat.Light.ActionBar.TabView</item>
+ <item name="actionBarTabBarStyle">@style/Widget.AppCompat.Light.ActionBar.TabBar</item>
+ <item name="actionBarTabTextStyle">@style/Widget.AppCompat.Light.ActionBar.TabText</item>
+ <item name="actionButtonStyle">@style/Widget.AppCompat.Light.ActionButton</item>
+ <item name="actionOverflowButtonStyle"> @style/Widget.AppCompat.Light.ActionButton.Overflow</item>
+ <item name="actionBarStyle">@style/Widget.AppCompat.Light.ActionBar</item>
+ <item name="actionBarSplitStyle">?attr/actionBarStyle</item>
+ <item name="actionBarWidgetTheme">@null</item>
+ <item name="actionBarSize">@dimen/abc_action_bar_default_height</item>
+ <item name="actionBarDivider">?attr/dividerVertical</item>
+ <item name="actionBarItemBackground">?attr/selectableItemBackground</item>
+ <item name="actionMenuTextAppearance"> @style/TextAppearance.AppCompat.Widget.ActionBar.Menu</item>
+ <item name="actionMenuTextColor">?android:attr/textColorPrimaryDisableOnly</item>
+
+ <!-- Action Mode -->
+ <item name="actionModeStyle">@style/Widget.AppCompat.ActionMode</item>
+ <item name="actionModeBackground">@drawable/abc_cab_background_top_holo_light</item>
+ <item name="actionModeSplitBackground">@drawable/abc_cab_background_bottom_holo_light</item>
+ <item name="actionModeCloseDrawable">@drawable/abc_ic_cab_done_holo_light</item>
+ <item name="actionModeCloseButtonStyle">@style/Widget.AppCompat.Light.ActionButton.CloseMode</item>
+
+ <!-- Dropdown Spinner Attributes -->
+ <item name="actionDropDownStyle"> @style/Widget.AppCompat.Light.Spinner.DropDown.ActionBar</item>
+
+ <!-- Panel attributes -->
+ <item name="panelMenuListWidth">@dimen/abc_panel_menu_list_width</item>
+ <item name="panelMenuListTheme">@style/Theme.AppCompat.CompactMenu</item>
+ <item name="android:panelBackground">@drawable/abc_menu_hardkey_panel_holo_light</item>
+ <item name="listChoiceBackgroundIndicator">@drawable/abc_list_selector_holo_light</item>
+ </style>
+
+ <style name="Theme.Base.AppCompat.Light.DarkActionBar" parent="Theme.Base.AppCompat.Light">
+ <item name="homeAsUpIndicator">@drawable/abc_ic_ab_back_holo_dark</item>
+ <item name="actionOverflowButtonStyle">@style/Widget.AppCompat.ActionButton.Overflow</item>
+ <item name="actionBarStyle">@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse</item>
+ <item name="actionBarWidgetTheme">@style/Theme.AppCompat</item>
+ <item name="actionBarDivider">@drawable/abc_list_divider_holo_dark</item>
+ <item name="actionBarItemBackground">@drawable/abc_item_background_holo_dark</item>
+ <item name="actionBarTabStyle">@style/Widget.AppCompat.Light.ActionBar.TabView.Inverse</item>
+ <item name="actionBarTabBarStyle">@style/Widget.AppCompat.Light.ActionBar.TabBar.Inverse</item>
+ <item name="actionBarTabTextStyle">@style/Widget.AppCompat.Light.ActionBar.TabText.Inverse</item>
+ <item name="actionMenuTextColor">?android:attr/textColorPrimaryInverseDisableOnly</item>
+
+ <!-- Action Mode -->
+ <item name="actionModeStyle">@style/Widget.AppCompat.Light.ActionMode.Inverse</item>
+ <item name="actionModeBackground">@drawable/abc_cab_background_top_holo_dark</item>
+ <item name="actionModeSplitBackground">@drawable/abc_cab_background_bottom_holo_dark</item>
+ <item name="actionModeCloseDrawable">@drawable/abc_ic_cab_done_holo_dark</item>
+ <item name="actionModeCloseButtonStyle">@style/Widget.AppCompat.ActionButton.CloseMode</item>
+
+ <!-- Dropdown Spinner Attributes -->
+ <item name="actionDropDownStyle">@style/Widget.AppCompat.Spinner.DropDown.ActionBar</item>
+
+ <!-- Panel attributes -->
+ <item name="android:panelBackground">@drawable/abc_menu_hardkey_panel_holo_dark</item>
+ <item name="listChoiceBackgroundIndicator">@drawable/abc_list_selector_holo_dark</item>
+ </style>
+
+ <style name="Theme.Base.AppCompat.Light.DialogWhenLarge" parent="Theme.Base.AppCompat.Light"></style>
+
+ <style name="Theme.Base.Light" parent="android:Theme.Light"></style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles.xml -->
+ <eat-comment />
+
+ <style name="Widget.AppCompat.ActionBar" parent="Widget.AppCompat.Base.ActionBar"></style>
+
+ <style name="Widget.AppCompat.ActionBar.Solid" parent="Widget.AppCompat.Base.ActionBar.Solid"></style>
+
+ <style name="Widget.AppCompat.ActionBar.TabBar" parent="Widget.AppCompat.Base.ActionBar.TabBar"></style>
+
+ <style name="Widget.AppCompat.ActionBar.TabText" parent="Widget.AppCompat.Base.ActionBar.TabText"></style>
+
+ <style name="Widget.AppCompat.ActionBar.TabView" parent="Widget.AppCompat.Base.ActionBar.TabView"></style>
+
+ <style name="Widget.AppCompat.ActionButton" parent="Widget.AppCompat.Base.ActionButton"></style>
+
+ <style name="Widget.AppCompat.ActionButton.CloseMode" parent="Widget.AppCompat.Base.ActionButton.CloseMode"></style>
+
+ <style name="Widget.AppCompat.ActionButton.Overflow" parent="Widget.AppCompat.Base.ActionButton.Overflow"></style>
+
+ <style name="Widget.AppCompat.ActionMode" parent="Widget.AppCompat.Base.ActionMode"></style>
+
+ <style name="Widget.AppCompat.ActivityChooserView" parent="Widget.AppCompat.Base.ActivityChooserView"></style>
+
+ <style name="Widget.AppCompat.AutoCompleteTextView" parent="Widget.AppCompat.Base.AutoCompleteTextView"></style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles_base.xml -->
+ <eat-comment />
+
+ <style name="Widget.AppCompat.Base.ActionBar" parent="">
+ <item name="displayOptions">useLogo|showHome|showTitle</item>
+ <item name="divider">?attr/dividerVertical</item>
+ <item name="height">?attr/actionBarSize</item>
+ <item name="homeLayout">@layout/abc_action_bar_home</item>
+ <item name="titleTextStyle">@style/TextAppearance.AppCompat.Widget.ActionBar.Title</item>
+ <item name="subtitleTextStyle">@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle</item>
+ <item name="background">@drawable/abc_ab_transparent_dark_holo</item>
+ <item name="backgroundStacked">@drawable/abc_ab_stacked_transparent_dark_holo</item>
+ <item name="backgroundSplit">@drawable/abc_ab_bottom_transparent_dark_holo</item>
+ <item name="actionButtonStyle">@style/Widget.AppCompat.ActionButton</item>
+ <item name="actionOverflowButtonStyle">@style/Widget.AppCompat.ActionButton.Overflow</item>
+ <item name="progressBarStyle">@style/Widget.AppCompat.ProgressBar.Horizontal</item>
+ <item name="indeterminateProgressStyle">@style/Widget.AppCompat.ProgressBar</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ActionBar.Solid" parent="Widget.AppCompat.Base.ActionBar">
+ <item name="background">@drawable/abc_ab_solid_dark_holo</item>
+ <item name="backgroundStacked">@drawable/abc_ab_stacked_solid_dark_holo</item>
+ <item name="backgroundSplit">@drawable/abc_ab_bottom_solid_dark_holo</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ActionBar.TabBar" parent="">
+ <item name="divider">?attr/actionBarDivider</item>
+ <item name="showDividers">middle</item>
+ <item name="dividerPadding">12dip</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ActionBar.TabText" parent="">
+ <item name="android:textAppearance">@null</item>
+ <item name="android:textColor">?android:attr/textColorPrimaryDisableOnly</item>
+ <item name="android:textSize">12sp</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:ellipsize">marquee</item>
+ <item name="android:maxLines">2</item>
+ <item name="textAllCaps">true</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ActionBar.TabView" parent="">
+ <item name="android:background">@drawable/abc_tab_indicator_ab_holo</item>
+ <item name="android:gravity">center_horizontal</item>
+ <item name="android:paddingLeft">16dip</item>
+ <item name="android:paddingRight">16dip</item>
+ <item name="android:minWidth">80dip</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ActionButton" parent="">
+ <item name="android:background">?attr/actionBarItemBackground</item>
+ <item name="android:paddingLeft">12dip</item>
+ <item name="android:paddingRight">12dip</item>
+ <item name="android:minWidth">@dimen/abc_action_button_min_width</item>
+ <item name="android:minHeight">?attr/actionBarSize</item>
+ <item name="android:gravity">center</item>
+ <item name="android:maxLines">2</item>
+ <item name="textAllCaps">@bool/abc_config_actionMenuItemAllCaps</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ActionButton.CloseMode" parent="Widget.AppCompat.Base.ActionButton"></style>
+
+ <style name="Widget.AppCompat.Base.ActionButton.Overflow" parent="Widget.AppCompat.Base.ActionButton">
+ <item name="android:src">@drawable/abc_ic_menu_moreoverflow_normal_holo_dark</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ActionMode" parent="">
+ <item name="background">?attr/actionModeBackground</item>
+ <item name="backgroundSplit">?attr/actionModeSplitBackground</item>
+ <item name="height">?attr/actionBarSize</item>
+ <item name="titleTextStyle">@style/TextAppearance.AppCompat.Widget.ActionMode.Title</item>
+ <item name="subtitleTextStyle">@style/TextAppearance.AppCompat.Widget.ActionMode.Subtitle</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ActivityChooserView" parent="">
+ <item name="android:gravity">center</item>
+ <item name="android:background">@drawable/abc_ab_share_pack_holo_dark</item>
+ <item name="divider">?attr/dividerVertical</item>
+ <item name="showDividers">middle</item>
+ <item name="dividerPadding">6dip</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.AutoCompleteTextView" parent="android:Widget.AutoCompleteTextView">
+ <item name="android:textColor">?attr/actionMenuTextColor</item>
+ <item name="android:dropDownSelector">@drawable/abc_list_selector_holo_dark</item>
+ <item name="android:popupBackground">@drawable/abc_menu_dropdown_panel_holo_dark</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.DropDownItem.Spinner" parent="">
+ <item name="android:textAppearance">@style/TextAppearance.AppCompat.Widget.DropDownItem</item>
+ <item name="android:paddingLeft">8dp</item>
+ <item name="android:paddingRight">8dp</item>
+ <item name="android:gravity">center_vertical</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ListPopupWindow" parent="">
+ <item name="android:dropDownSelector">@drawable/abc_list_selector_holo_dark</item>
+ <item name="android:popupBackground">@drawable/abc_menu_dropdown_panel_holo_dark</item>
+ <item name="android:dropDownVerticalOffset">0dip</item>
+ <item name="android:dropDownHorizontalOffset">0dip</item>
+ <item name="android:dropDownWidth">wrap_content</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ListView.DropDown" parent="android:Widget.ListView">
+ <item name="android:listSelector">@drawable/abc_list_selector_holo_dark</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ListView.Menu" parent="android:Widget.ListView.Menu">
+ <item name="android:listSelector">?attr/listChoiceBackgroundIndicator</item>
+ <item name="android:divider">?attr/dividerHorizontal</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.PopupMenu" parent="@style/Widget.AppCompat.Base.ListPopupWindow"></style>
+
+ <style name="Widget.AppCompat.Base.ProgressBar" parent="android:Widget.ProgressBar">
+ <item name="android:minWidth">@dimen/abc_action_bar_progress_bar_size</item>
+ <item name="android:maxWidth">@dimen/abc_action_bar_progress_bar_size</item>
+ <item name="android:minHeight">@dimen/abc_action_bar_progress_bar_size</item>
+ <item name="android:maxHeight">@dimen/abc_action_bar_progress_bar_size</item>
+ </style>
+
+ <style name="Widget.AppCompat.Base.ProgressBar.Horizontal" parent="android:Widget.ProgressBar.Horizontal"></style>
+
+ <style name="Widget.AppCompat.Base.Spinner" parent="">
+ <item name="spinnerMode">dropdown</item>
+ <item name="android:popupBackground">@drawable/abc_menu_dropdown_panel_holo_dark</item>
+ <item name="android:dropDownSelector">@drawable/abc_list_selector_holo_dark</item>
+ <item name="android:dropDownVerticalOffset">0dip</item>
+ <item name="android:dropDownHorizontalOffset">0dip</item>
+ <item name="android:dropDownWidth">wrap_content</item>
+ <item name="android:gravity">left|center_vertical</item>
+ <item name="android:clickable">true</item>
+ <item name="android:background">@drawable/abc_spinner_ab_holo_dark</item>
+ </style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles.xml -->
+ <eat-comment />
+
+ <style name="Widget.AppCompat.DropDownItem.Spinner" parent="Widget.AppCompat.Base.DropDownItem.Spinner"></style>
+
+ <style name="Widget.AppCompat.Light.ActionBar" parent="Widget.AppCompat.Light.Base.ActionBar"></style>
+
+ <style name="Widget.AppCompat.Light.ActionBar.Solid" parent="Widget.AppCompat.Light.Base.ActionBar.Solid"></style>
+
+ <style name="Widget.AppCompat.Light.ActionBar.Solid.Inverse" parent="Widget.AppCompat.Light.Base.ActionBar.Solid.Inverse"></style>
+
+ <style name="Widget.AppCompat.Light.ActionBar.TabBar" parent="Widget.AppCompat.Light.Base.ActionBar.TabBar"></style>
+
+ <style name="Widget.AppCompat.Light.ActionBar.TabBar.Inverse" parent="Widget.AppCompat.Light.Base.ActionBar.TabBar.Inverse" />
+
+ <style name="Widget.AppCompat.Light.ActionBar.TabText" parent="Widget.AppCompat.Light.Base.ActionBar.TabText"></style>
+
+ <style name="Widget.AppCompat.Light.ActionBar.TabText.Inverse" parent="Widget.AppCompat.Light.Base.ActionBar.TabText.Inverse"></style>
+
+ <style name="Widget.AppCompat.Light.ActionBar.TabView" parent="Widget.AppCompat.Light.Base.ActionBar.TabView"></style>
+
+ <style name="Widget.AppCompat.Light.ActionBar.TabView.Inverse" parent="Widget.AppCompat.Light.Base.ActionBar.TabView.Inverse"></style>
+
+ <style name="Widget.AppCompat.Light.ActionButton" parent="Widget.AppCompat.Light.Base.ActionButton"></style>
+
+ <style name="Widget.AppCompat.Light.ActionButton.CloseMode" parent="Widget.AppCompat.Light.Base.ActionButton.CloseMode"></style>
+
+ <style name="Widget.AppCompat.Light.ActionButton.Overflow" parent="Widget.AppCompat.Light.Base.ActionButton.Overflow"></style>
+
+ <style name="Widget.AppCompat.Light.ActionMode.Inverse" parent="Widget.AppCompat.Light.Base.ActionMode.Inverse"></style>
+
+ <style name="Widget.AppCompat.Light.ActivityChooserView" parent="Widget.AppCompat.Light.Base.ActivityChooserView"></style>
+
+ <style name="Widget.AppCompat.Light.AutoCompleteTextView" parent="Widget.AppCompat.Light.Base.AutoCompleteTextView"></style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles_base.xml -->
+ <eat-comment />
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar" parent="Widget.AppCompat.Base.ActionBar">
+ <item name="background">@drawable/abc_ab_transparent_light_holo</item>
+ <item name="backgroundStacked">@drawable/abc_ab_stacked_transparent_light_holo</item>
+ <item name="backgroundSplit">@drawable/abc_ab_bottom_transparent_light_holo</item>
+ <item name="actionButtonStyle">@style/Widget.AppCompat.Light.ActionButton</item>
+ <item name="actionOverflowButtonStyle">@style/Widget.AppCompat.Light.ActionButton.Overflow</item>
+ <item name="progressBarStyle">@style/Widget.AppCompat.ProgressBar.Horizontal</item>
+ <item name="indeterminateProgressStyle">@style/Widget.AppCompat.ProgressBar</item>
+ </style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.Solid" parent="Widget.AppCompat.Light.Base.ActionBar">
+ <item name="background">@drawable/abc_ab_solid_light_holo</item>
+ <item name="backgroundStacked">@drawable/abc_ab_stacked_solid_light_holo</item>
+ <item name="backgroundSplit">@drawable/abc_ab_bottom_solid_light_holo</item>
+ </style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.Solid.Inverse" parent="Widget.AppCompat.Base.ActionBar.Solid">
+ <item name="titleTextStyle"> @style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse</item>
+ <item name="subtitleTextStyle"> @style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle.Inverse</item>
+ <item name="actionButtonStyle">@style/Widget.AppCompat.ActionButton</item>
+ <item name="actionOverflowButtonStyle">@style/Widget.AppCompat.ActionButton.Overflow</item>
+ </style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabBar" parent="Widget.AppCompat.Base.ActionBar.TabBar"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabBar.Inverse" parent="Widget.AppCompat.Light.Base.ActionBar.TabBar"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabText" parent="Widget.AppCompat.Base.ActionBar.TabText"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabText.Inverse" parent="Widget.AppCompat.Light.Base.ActionBar.TabText">
+ <item name="android:textColor">?android:attr/textColorPrimaryInverseDisableOnly</item>
+ </style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabView" parent="Widget.AppCompat.Base.ActionBar.TabView"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionBar.TabView.Inverse" parent="Widget.AppCompat.Light.Base.ActionBar.TabView"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionButton" parent="Widget.AppCompat.Base.ActionButton"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionButton.CloseMode" parent="Widget.AppCompat.Light.Base.ActionButton"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionButton.Overflow" parent="Widget.AppCompat.Light.Base.ActionButton">
+ <item name="android:src">@drawable/abc_ic_menu_moreoverflow_normal_holo_light</item>
+ </style>
+
+ <style name="Widget.AppCompat.Light.Base.ActionMode.Inverse" parent="Widget.AppCompat.Base.ActionMode">
+ <item name="titleTextStyle"> @style/TextAppearance.AppCompat.Widget.ActionMode.Title.Inverse</item>
+ <item name="subtitleTextStyle"> @style/TextAppearance.AppCompat.Widget.ActionMode.Subtitle.Inverse</item>
+ </style>
+
+ <style name="Widget.AppCompat.Light.Base.ActivityChooserView" parent="Widget.AppCompat.Base.ActivityChooserView">
+ <item name="android:background">@drawable/abc_ab_share_pack_holo_light</item>
+ </style>
+
+ <style name="Widget.AppCompat.Light.Base.AutoCompleteTextView" parent="android:Widget.AutoCompleteTextView">
+ <item name="android:textColor">?attr/actionMenuTextColor</item>
+ <item name="android:dropDownSelector">@drawable/abc_list_selector_holo_light</item>
+ <item name="android:popupBackground">@drawable/abc_menu_dropdown_panel_holo_light</item>
+ </style>
+
+ <style name="Widget.AppCompat.Light.Base.DropDownItem.Spinner" parent="Widget.AppCompat.Base.DropDownItem.Spinner"></style>
+
+ <style name="Widget.AppCompat.Light.Base.ListPopupWindow" parent="">
+ <item name="android:dropDownSelector">@drawable/abc_list_selector_holo_light</item>
+ <item name="android:popupBackground">@drawable/abc_menu_dropdown_panel_holo_light</item>
+ <item name="android:dropDownVerticalOffset">0dip</item>
+ <item name="android:dropDownHorizontalOffset">0dip</item>
+ <item name="android:dropDownWidth">wrap_content</item>
+ </style>
+
+ <style name="Widget.AppCompat.Light.Base.ListView.DropDown" parent="android:Widget.ListView">
+ <item name="android:listSelector">@drawable/abc_list_selector_holo_light</item>
+ </style>
+
+ <style name="Widget.AppCompat.Light.Base.PopupMenu" parent="@style/Widget.AppCompat.Light.Base.ListPopupWindow"></style>
+
+ <style name="Widget.AppCompat.Light.Base.Spinner" parent="Widget.AppCompat.Base.Spinner">
+ <item name="android:dropDownSelector">@drawable/abc_list_selector_holo_light</item>
+ <item name="android:popupBackground">@drawable/abc_menu_dropdown_panel_holo_light</item>
+ <item name="android:background">@drawable/abc_spinner_ab_holo_light</item>
+ </style>
+ <!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/klp-ub-dev/frameworks/support/v7/appcompat/res/values/styles.xml -->
+ <eat-comment />
+
+ <style name="Widget.AppCompat.Light.DropDownItem.Spinner" parent="Widget.AppCompat.Light.Base.DropDownItem.Spinner"></style>
+
+ <style name="Widget.AppCompat.Light.ListPopupWindow" parent="Widget.AppCompat.Light.Base.ListPopupWindow"></style>
+
+ <style name="Widget.AppCompat.Light.ListView.DropDown" parent="Widget.AppCompat.Light.Base.ListView.DropDown"></style>
+
+ <style name="Widget.AppCompat.Light.PopupMenu" parent="Widget.AppCompat.Light.Base.PopupMenu"></style>
+
+ <style name="Widget.AppCompat.Light.Spinner.DropDown.ActionBar" parent="Widget.AppCompat.Light.Base.Spinner"></style>
+
+ <style name="Widget.AppCompat.ListPopupWindow" parent="Widget.AppCompat.Base.ListPopupWindow"></style>
+
+ <style name="Widget.AppCompat.ListView.DropDown" parent="Widget.AppCompat.Base.ListView.DropDown"></style>
+
+ <style name="Widget.AppCompat.ListView.Menu" parent="Widget.AppCompat.Base.ListView.Menu"></style>
+
+ <style name="Widget.AppCompat.PopupMenu" parent="Widget.AppCompat.Base.PopupMenu"></style>
+
+ <style name="Widget.AppCompat.ProgressBar" parent="Widget.AppCompat.Base.ProgressBar"></style>
+
+ <style name="Widget.AppCompat.ProgressBar.Horizontal" parent="Widget.AppCompat.Base.ProgressBar.Horizontal"></style>
+
+ <style name="Widget.AppCompat.Spinner.DropDown.ActionBar" parent="Widget.AppCompat.Base.Spinner"></style>
+
+</resources>
--- /dev/null
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.owncloud.android.workaround.accounts"
- android:versionCode="0100022"
- android:versionName="1.0.22" >
+ android:versionCode="0100023"
+ android:versionName="1.0.23" >
<uses-sdk
android:minSdkVersion="16"
-Subproject commit 9e761387a0b406402684571f28c36c2d6d2b6301
+Subproject commit d5aa05bc0ca126626536e035459a33b13eeaf0fd
# Project target.
target=android-19
-android.library.reference.1=actionbarsherlock/library
-android.library.reference.2=owncloud-android-library
+android.library.reference.1=owncloud-android-library
+android.library.reference.2=libs/android-support-appcompat-v7-exploded-aar
android:ems="10"\r
android:hint="@string/auth_username"\r
android:inputType="textNoSuggestions"\r
- android:contentDescription="@string/auth_username"/>\r
+ android:contentDescription="@string/auth_username"\r
+ />\r
\r
<EditText\r
android:id="@+id/account_password"\r
android:drawablePadding="5dp"\r
android:paddingRight="55dp"\r
android:contentDescription="@string/auth_host_address"\r
- >\r
+ >\r
<requestFocus />\r
</EditText>\r
<ImageButton\r
android:hint="@string/auth_username"\r
android:inputType="textNoSuggestions"\r
android:contentDescription="@string/auth_username"\r
- />\r
+ />\r
\r
<EditText\r
android:id="@+id/account_password"\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2015 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/left_drawer"
+ android:layout_width="240dp"
+ android:layout_height="match_parent"
+ android:layout_gravity="start"
+ android:background="@color/background_color"
+ android:baselineAligned="false"
+ android:clickable="true"
+ android:orientation="vertical"
+ android:fitsSystemWindows="true">
+
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<LinearLayout-->
+ <!--android:layout_width="match_parent"-->
+ <!--android:layout_height="wrap_content"-->
+ <!--android:layout_margin="5dp">-->
+
+ <!--<ImageView-->
+ <!--android:id="@+id/drawer_userIcon"-->
+ <!--android:layout_width="40dp"-->
+ <!--android:layout_height="40dp"-->
+ <!--android:src="@drawable/abc_ab_bottom_solid_dark_holo" />-->
+
+ <!--<TextView-->
+ <!--android:id="@+id/drawer_username"-->
+ <!--android:layout_width="wrap_content"-->
+ <!--android:layout_height="wrap_content"-->
+ <!--android:layout_gravity="center_vertical"-->
+ <!--android:layout_marginLeft="5dp"-->
+ <!--android:layout_marginStart="5dp"-->
+ <!--android:textAppearance="?android:attr/textAppearanceLarge" />-->
+
+ <!--</LinearLayout>-->
+
+ <!--<TextView-->
+ <!--android:layout_width="fill_parent"-->
+ <!--android:layout_height="2dip"-->
+ <!--android:background="@color/list_item_lastmod_and_filesize_text" />-->
+
+ <ListView
+ android:id="@+id/drawer_list"
+ android:layout_width="fill_parent"
+ android:layout_height="match_parent"
+ android:background="@color/background_color"
+ android:choiceMode="singleChoice"
+ />
+</LinearLayout>
\ No newline at end of file
--- /dev/null
+<!--
+ Copyright 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+ <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/drawer_radio_group"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:orientation="vertical" >
+ </RadioGroup>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2015 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/itemLayout"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:orientation="horizontal"
+ android:background="@color/background_color"
+ android:layout_marginTop="10dp"
+ android:layout_marginBottom="10dp">
+
+ <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/itemTitle"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:textColor="@color/textColor"
+ android:text="@string/app_name"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"/>
+</LinearLayout>
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2015 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/drawer_radiobutton"
+ android:layout_width="fill_parent"
+ android:layout_height="56dp"
+ android:gravity="center_vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:textColor="#000"
+ android:textSize="18dp" />
\ No newline at end of file
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F7F7F7"
- android:orientation="vertical" >
+ android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
<?xml version="1.0" encoding="utf-8"?>\r
-<!-- \r
+<!--\r
ownCloud Android client application\r
\r
Copyright (C) 2012 Bartek Przybylski\r
\r
You should have received a copy of the GNU General Public License\r
along with this program. If not, see <http://www.gnu.org/licenses/>.\r
- -->\r
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
+ -->\r
+<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
+ android:id="@+id/drawer_layout"\r
android:layout_width="match_parent"\r
android:layout_height="match_parent"\r
- android:background="@color/background_color"\r
- android:orientation="horizontal"\r
- android:baselineAligned="false"\r
- >\r
-\r
- <FrameLayout \r
- android:layout_width="0dp"\r
- android:layout_height="match_parent"\r
- android:layout_weight="1"\r
- android:id="@+id/left_fragment_container"\r
- />\r
- \r
- <FrameLayout \r
- android:layout_width="0dp"\r
- android:layout_height="match_parent"\r
- android:layout_weight="2"\r
- android:id="@+id/right_fragment_container"\r
- />\r
- \r
- </LinearLayout>
\ No newline at end of file
+ android:clickable="true" >\r
+\r
+ <!-- The main content view -->\r
+ <LinearLayout\r
+ xmlns:android="http://schemas.android.com/apk/res/android"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="match_parent"\r
+ android:background="@color/background_color"\r
+ android:baselineAligned="false"\r
+ android:orientation="horizontal"\r
+ android:id="@+id/ListLayout"\r
+ android:contentDescription="@string/list_layout"\r
+ >\r
+\r
+\r
+ <FrameLayout\r
+ android:id="@+id/left_fragment_container"\r
+ android:layout_width="0dp"\r
+ android:layout_height="match_parent"\r
+ android:layout_weight="1" />\r
+\r
+ <FrameLayout\r
+ android:id="@+id/right_fragment_container"\r
+ android:layout_width="0dp"\r
+ android:layout_height="match_parent"\r
+ android:layout_weight="2" />\r
+ </LinearLayout>\r
+\r
+ <include\r
+ layout="@layout/drawer"\r
+ android:layout_width="240dp"\r
+ android:layout_height="match_parent"\r
+ android:layout_gravity="start"/>\r
+\r
+</android.support.v4.widget.DrawerLayout>\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2015 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="56dp"
+ android:clickable="true"
+ android:orientation="vertical"
+ android:background="#fff"
+ android:paddingLeft="16dp"
+ tools:context=".MainActivity" >
+
+ <TextView
+ android:id="@+id/textView1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:drawablePadding="5dp"
+ android:gravity="center_vertical"
+ android:paddingLeft="16dp"
+ android:textSize="16dp" >
+
+ </TextView>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="@android:color/black" />
+
+</LinearLayout>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2015 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/textView1"
+ android:layout_width="wrap_content"
+ android:background="#fff"
+ android:layout_height="56dp"
+ android:layout_marginLeft="8dp"
+ android:gravity="left"
+ android:paddingLeft="16dp"
+ android:paddingTop="8dp"
+ android:textSize="16dp"
+ android:groupIndicator="@android:color/transparent"
+/>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2012 Bartek Przybylski
+ Copyright (C) 2015 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:oc="http://schemas.android.com/apk/res/com.owncloud.android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:gravity="center_horizontal"
+ android:orientation="vertical"
+ android:padding="20dp" >
+
+
+ <TextView
+ android:id="@+id/header"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/pass_code_enter_pass_code"
+ android:textColor="@android:color/black"
+ android:gravity="center_horizontal"
+ />
+
+ <TextView
+ android:id="@+id/explanation"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/pass_code_configure_your_pass_code_explanation"
+ android:textAppearance="@android:style/TextAppearance.Small"
+ android:gravity="center_horizontal"
+ />
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal" >
+
+ <EditText
+ android:id="@+id/txt0"
+ android:focusable="true"
+ style="@style/PassCodeStyle"
+ android:cursorVisible="true"
+ android:imeOptions="flagNoExtractUi"
+ ><requestFocus/></EditText>
+
+ <EditText
+ android:id="@+id/txt1"
+ style="@style/PassCodeStyle"
+ android:cursorVisible="true"
+ android:imeOptions="flagNoExtractUi"
+ />
+
+ <EditText
+ android:id="@+id/txt2"
+ style="@style/PassCodeStyle"
+ android:cursorVisible="true"
+ android:imeOptions="flagNoExtractUi"
+ />
+
+ <EditText
+ android:id="@+id/txt3"
+ style="@style/PassCodeStyle"
+ android:cursorVisible="true"
+ android:imeOptions="flagNoExtractUi"
+ />
+ </LinearLayout>
+
+ <Button
+ android:id="@+id/cancel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/common_cancel" />
+
+</LinearLayout>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<!--\r
- ownCloud Android client application\r
-\r
- Copyright (C) 2012 Bartek Przybylski\r
- Copyright (C) 2015 ownCloud Inc.\r
-\r
- This program is free software: you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License version 2,\r
- as published by the Free Software Foundation.\r
-\r
- This program is distributed in the hope that it will be useful,\r
- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- GNU General Public License for more details.\r
-\r
- You should have received a copy of the GNU General Public License\r
- along with this program. If not, see <http://www.gnu.org/licenses/>.\r
--->\r
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\r
- xmlns:oc="http://schemas.android.com/apk/res/com.owncloud.android"\r
- android:layout_width="fill_parent"\r
- android:layout_height="fill_parent"\r
- android:gravity="center_horizontal"\r
- android:orientation="vertical"\r
- android:padding="20dp" >\r
-\r
-\r
- <TextView\r
- android:id="@+id/pinHdr"\r
- android:layout_width="wrap_content"\r
- android:layout_height="wrap_content"\r
- android:text="@string/pincode_enter_pin_code"\r
- android:textColor="@android:color/black"\r
- android:gravity="center_horizontal"\r
- />\r
-\r
- <TextView\r
- android:id="@+id/pinHdrExpl"\r
- android:layout_width="wrap_content"\r
- android:layout_height="wrap_content"\r
- android:text="@string/pincode_configure_your_pin_explanation"\r
- android:textAppearance="@android:style/TextAppearance.Small"\r
- android:gravity="center_horizontal"\r
- />\r
- \r
- <LinearLayout\r
- android:layout_width="fill_parent"\r
- android:layout_height="wrap_content"\r
- android:gravity="center_horizontal" >\r
-\r
- <EditText\r
- android:id="@+id/txt1"\r
- android:focusable="true"\r
- style="@style/PassCodeStyle"\r
- android:cursorVisible="true"\r
- ><requestFocus/></EditText>\r
-\r
- <EditText\r
- android:id="@+id/txt2"\r
- style="@style/PassCodeStyle" />\r
-\r
- <EditText\r
- android:id="@+id/txt3"\r
- style="@style/PassCodeStyle" />\r
-\r
- <EditText\r
- android:id="@+id/txt4"\r
- style="@style/PassCodeStyle" />\r
- </LinearLayout>\r
-\r
- <Button\r
- android:id="@+id/cancel"\r
- android:layout_width="wrap_content"\r
- android:layout_height="wrap_content"\r
- android:text="@string/common_cancel" />\r
-\r
-</LinearLayout>\r
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+
+<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical" >
+ android:clickable="true" >
<com.ortiz.touch.ExtendedViewPager
android:id="@+id/fragmentPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
+
+ <include
+ layout="@layout/drawer"
+ android:layout_width="240dp"
+ android:layout_height="match_parent"
+ android:layout_gravity="start"/>
<!-- LinearLayout
android:id="@+id/fragment"
<!- - Preview: layout=@layout/preview_image_fragment - ->
</LinearLayout -->
-</LinearLayout>
\ No newline at end of file
+</android.support.v4.widget.DrawerLayout>
\ No newline at end of file
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/top"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:background="#000000"
tools:context=".ui.fragment.PreviewImageFragment" >
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
- android:layout_below="@id/image"
+ android:layout_alignParentBottom="true"
android:layout_margin="40dp"
android:text="@string/placeholder_sentence"
+ android:textColor="@color/owncloud_blue_bright"
/>
</RelativeLayout>
\ No newline at end of file
android:layout_width="wrap_content" android:background="#fefefe"
android:gravity="center">
<TextView android:layout_width="fill_parent" android:text="@string/uploader_top_message"
- android:layout_height="wrap_content" android:id="@+id/textView1" android:textColor="@android:color/black"
+ android:layout_height="wrap_content" android:id="@+id/drawer_username" android:textColor="@android:color/black"
android:gravity="center_horizontal"></TextView>
<FrameLayout android:layout_height="fill_parent"
android:layout_width="fill_parent" android:id="@+id/frameLayout1"
- android:layout_below="@+id/textView1" android:layout_above="@+id/linearLayout1">
+ android:layout_below="@+id/drawer_username" android:layout_above="@+id/linearLayout1">
<ListView android:id="@android:id/list" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:divider="@drawable/uploader_list_separator"
android:dividerHeight="1dip"></ListView>
<TextView
android:text="TextView"
android:layout_width="fill_parent"
- android:id="@+id/textView1"
+ android:id="@+id/drawer_username"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:layout_gravity="center_vertical"
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
-<menu xmlns:android="http://schemas.android.com/apk/res/android" >
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_upload"
android:icon="@drawable/ic_action_upload"
android:orderInCategory="2"
- android:showAsAction="always"
+ app:showAsAction="always"
android:title="@string/actionbar_upload"
android:contentDescription="@string/actionbar_upload"/>
<item
android:id="@+id/action_create_dir"
android:icon="@drawable/ic_action_create_dir"
android:orderInCategory="2"
- android:showAsAction="always"
+ app:showAsAction="always"
android:title="@string/actionbar_mkdir"
android:contentDescription="@string/actionbar_mkdir"/>
<item
android:id="@+id/action_sync_account"
android:icon="@drawable/ic_action_refresh"
android:orderInCategory="2"
- android:showAsAction="never"
+ app:showAsAction="never"
android:title="@string/actionbar_sync"
android:contentDescription="@string/actionbar_sync"/>
- <item
- android:id="@+id/action_settings"
- android:icon="@drawable/ic_action_settings"
- android:orderInCategory="2"
- android:showAsAction="never"
- android:title="@string/actionbar_settings"
- android:contentDescription="@string/actionbar_settings"/>
- <item
- android:id="@+id/action_logger"
- android:icon="@drawable/ic_action_settings"
- android:orderInCategory="2"
- android:showAsAction="never"
- android:title="@string/actionbar_logger"
- android:contentDescription="@string/actionbar_logger"/>
<item
android:id="@+id/action_sort"
- android:icon="@android:drawable/ic_menu_sort_alphabetically"
+ android:icon="@android:drawable/ic_menu_sort_by_size"
android:orderInCategory="2"
- android:showAsAction="never"
+ app:showAsAction="never"
android:title="@string/actionbar_sort"
android:contentDescription="@string/actionbar_sort"/>
- <!-- <item android:id="@+id/search" android:title="@string/actionbar_search" android:icon="@drawable/ic_action_search"></item> -->
+ <!-- <item android:id="@+id/search"
+ android:title="@string/actionbar_search"
+ android:icon="@drawable/ic_action_search"></item> -->
</menu>
\ No newline at end of file
<string name="actionbar_settings">Instellings</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_help">Hulp</string>
<string name="auth_username">Gebruikersnaam</string>
<string name="auth_password">Wagwoord</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_send_file">أرسل</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="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">كلمة سر التطبيق</string>
- <string name="prefs_pincode_summary">حماية العميل</string>
<string name="prefs_instant_upload">رفع الصورة مباشرة</string>
<string name="prefs_instant_upload_summary">رفع صورة المؤخذة عبر الكاميرا</string>
<string name="prefs_instant_video_upload">رفع فيديو مباشرة</string>
<string name="foreign_files_local_text">محلي :%1$s</string>
<string name="foreign_files_remote_text">خارجي : %1$s</string>
<string name="upload_query_move_foreign_files">لا يوجد مساحة كافية لنسخ الملفات المحددة لمجلد %1$s . هل ترغب بنقلهم بدلاً من ذلك؟</string>
- <string name="pincode_enter_pin_code">يرجى إدخال كلمة السر</string>
- <string name="pincode_configure_your_pin">أدخل كلمة السر</string>
- <string name="pincode_configure_your_pin_explanation">سيتم طلب PIN في كل مرة يتم فيها تشغيل التطبيق</string>
- <string name="pincode_reenter_your_pincode">يرجى إدخال كلمة السر مرة أخرى</string>
- <string name="pincode_remove_your_pincode">إزالة كلمة السر</string>
- <string name="pincode_mismatch">كلمتا السر غير متطابقتين</string>
- <string name="pincode_wrong">كلمه السر غير صحيحة</string>
- <string name="pincode_removed">تمت إزالة كلمه السر</string>
- <string name="pincode_stored">تم تسجيل كلمت السر</string>
<string name="media_notif_ticker">مشغل الموسيقى %1$s </string>
<string name="media_state_playing">%1$s (يتم التشغيل)</string>
<string name="media_state_loading">%1$s (يتم التحميل)</string>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Ümumi</string>
<string name="prefs_category_more">Daha da</string>
<string name="prefs_accounts">Hesablar</string>
<string name="prefs_manage_accounts">İstifadəçilərin idarəedilməsi</string>
- <string name="prefs_pincode">Proqram təminatının PİN-i</string>
- <string name="prefs_pincode_summary">Müştərini qoru</string>
<string name="prefs_instant_upload">Ani şəkil yükləmələri</string>
<string name="prefs_instant_upload_summary">Kamera vasitəsi ilə götürülmüş şəkillərin tez yüklənməsi</string>
<string name="prefs_instant_video_upload">Ani video yükləmələri</string>
<string name="foreign_files_local_text">Daxili: %1$s</string>
<string name="foreign_files_remote_text">Uzaq: %1$s</string>
<string name="upload_query_move_foreign_files">Seçdiyiniz faylların %1$s qovluğuna köçüçrülməsi üçün kifayət qədər yer yoxdur. Əvəzinə onları köçürmək istəyirsinizmi?</string>
- <string name="pincode_enter_pin_code">Xahiş olunur öz proqramınızın PİN-ni daxil edəsiniz</string>
- <string name="pincode_configure_your_pin">Proqramınızın PİN-ni daxil edin</string>
- <string name="pincode_configure_your_pin_explanation">Proqram hər dəfə işə düşdükdə PİN yenidən istəniləcək</string>
- <string name="pincode_reenter_your_pincode">Öz proqramınızn PİN-ni yenidən daxil etməyi xahiş edirik</string>
- <string name="pincode_remove_your_pincode">Öz proqramınızın PİN-ni silin</string>
- <string name="pincode_mismatch">Proqram PİN-ləri eyni deyil</string>
- <string name="pincode_wrong">Yalnış proqram PİN-i</string>
- <string name="pincode_removed">Proqram PİN-i silindi</string>
- <string name="pincode_stored">Proqram PİN-i saxlanıldı </string>
<string name="media_notif_ticker">%1$s musiqi oxuducusu</string>
<string name="media_state_playing">%1$s (oxuyur)</string>
<string name="media_state_loading">%1$s (yüklənir)</string>
<string name="prefs_category_security">Təhlükəsizlik</string>
<string name="prefs_instant_video_upload_path_title">Video ünvanını yüklə</string>
<string name="download_folder_failed_content">Qovluğun endirilməsinin %1$s hissəsi tamamlana bilməz </string>
- <string name="subject_token">%1$s paylaşdı \"%2$s\" sizinlə</string>
<string name="auth_refresh_button">Qoşulmanı yenilə</string>
<string name="auth_host_address">Server ünvanı</string>
</resources>
<string name="actionbar_settings">Налады</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="file_list_seconds_ago">Секунд таму</string>
<string name="common_yes">Так</string>
<string name="common_no">Не</string>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</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_instant_video_upload">Незабавно качване на видео</string>
<string name="foreign_files_local_text">Локален: %1$s</string>
<string name="foreign_files_remote_text">Отдалечен: %1$s</string>
<string name="upload_query_move_foreign_files">Няма достатъчно място за копирането на избраните файлове до папка %1$s. Да се преместят ли вместо това?</string>
- <string name="pincode_enter_pin_code">Въведете своя App ПИН</string>
- <string name="pincode_configure_your_pin">Въведете своя App ПИН</string>
- <string name="pincode_configure_your_pin_explanation">ПИН-ът ще бъде поискан всеки път, когато програмата стартира.</string>
- <string name="pincode_reenter_your_pincode">Въведете своя App ПИН отново.</string>
- <string name="pincode_remove_your_pincode">Премахнете своя App ПИН</string>
- <string name="pincode_mismatch">App ПИН-овете не съвпадат</string>
- <string name="pincode_wrong">Неправилен App ПИН</string>
- <string name="pincode_removed">App ПИН премахнат</string>
- <string name="pincode_stored">App ПИН запазен</string>
<string name="media_notif_ticker">%1$s музикален плеър</string>
<string name="media_state_playing">%1$s (пусната)</string>
<string name="media_state_loading">%1$s (се зарежда)</string>
<string name="prefs_category_security">Сигурност</string>
<string name="prefs_instant_video_upload_path_title">Качване на видео път</string>
<string name="download_folder_failed_content">Свалянето на директорията %1$s не може да бъде завършено</string>
- <string name="subject_token">%1$s споделено \"%2$s\" с теб</string>
<string name="auth_refresh_button">Обнови връзката</string>
<string name="auth_host_address">Адрес на сървъра</string>
</resources>
<string name="actionbar_send_file">পাঠাও</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="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">অ্যাপ PIN</string>
- <string name="prefs_pincode_summary">আপনার ক্লায়েন্ট সামলান</string>
<string name="prefs_instant_upload">দ্রুত ছবি আপলোড</string>
<string name="prefs_instant_upload_summary">ক্যামেরা থেকে তোলা ছবি তৎক্ষণাৎ আপলোড</string>
<string name="prefs_instant_video_upload">দ্রুত ভিডিও আপলোড</string>
<string name="foreign_files_local_text">স্থানীয়: %1$s</string>
<string name="foreign_files_remote_text">দুরবর্তী: %1$s</string>
<string name="upload_query_move_foreign_files">%1$s ফোল্ডারে ফাইল কপি করার মত যথেষ্ট জায়গা নেই। এগুলো অন্যত্র রাখবেন? </string>
- <string name="pincode_enter_pin_code">দয়া করে আপনার App PIN দিন</string>
- <string name="pincode_configure_your_pin">আপনার App PIN দিন</string>
- <string name="pincode_configure_your_pin_explanation">প্রতিবার অ্যাপ চালু করার সময় PIN এর জন্য অনুরোধ করা হবে</string>
- <string name="pincode_reenter_your_pincode">দয়া করে আবার App 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="media_notif_ticker">%1$s মিউজিক প্লেয়ার</string>
<string name="media_state_playing">%1$s (বাজানো হচ্ছে)</string>
<string name="media_state_loading">%1$s (লোড করা হচ্ছে)</string>
<string name="actionbar_settings">সেটিংস</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_imprint">অঙ্কিত করা</string>
<string name="auth_username">ইউজারনেম</string>
<string name="sync_string_files">ফাইলস</string>
<string name="actionbar_send_file">Pošalji</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_more">Više</string>
<string name="prefs_help">Pomoć</string>
<string name="auth_username">Korisničko ime</string>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Més</string>
<string name="prefs_accounts">Comptes</string>
<string name="prefs_manage_accounts">Gestió de comptes</string>
- <string name="prefs_pincode">PIN de l\'aplicació</string>
- <string name="prefs_pincode_summary">Protegiu el client</string>
+ <string name="prefs_passcode">Contrasenya</string>
<string name="prefs_instant_upload">Pujada instantànies de fotografies</string>
<string name="prefs_instant_upload_summary">Puja instantàniament les fotografies preses amb la càmera</string>
<string name="prefs_instant_video_upload">Pujades de vídeos instantanies</string>
<string name="foreign_files_local_text">Local: %1$s</string>
<string name="foreign_files_remote_text">Remot: %1$s</string>
<string name="upload_query_move_foreign_files">No hi ha prou espai per copiar els fitxers seleccionats a la carpeta %1$s. Els hi voleu moure?</string>
- <string name="pincode_enter_pin_code">Escriviu el PIN de l\'aplicació</string>
- <string name="pincode_configure_your_pin">Escriviu el PIN de l\'aplicació</string>
- <string name="pincode_configure_your_pin_explanation">es requerirà el PIN cada vegada que s\'iniciï l\'aplicació</string>
- <string name="pincode_reenter_your_pincode">Torneu a escriure el PIN de l\'aplicació </string>
- <string name="pincode_remove_your_pincode">Elimina el PIN de l\'aplicació</string>
- <string name="pincode_mismatch">Els PINs de l\'aplicació no coincideixen</string>
- <string name="pincode_wrong">El PIN de l\'aplicació no és correcte</string>
- <string name="pincode_removed">S\'ha eliminat el PIN de l\'aplicació </string>
- <string name="pincode_stored">S\'ha desat el PIN de l\'aplicació </string>
<string name="media_notif_ticker">reproductor de música %1$s</string>
<string name="media_state_playing">%1$s (sonant)</string>
<string name="media_state_loading">%1$s (carregant)</string>
</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">Všechny soubory</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Nastavení</string>
+ <string name="drawer_item_logs">Logy</string>
+ <string name="drawer_close">Zavřít</string>
<string name="prefs_category_general">Obecné</string>
<string name="prefs_category_more">Více</string>
<string name="prefs_accounts">Účty</string>
<string name="prefs_manage_accounts">Spravovat účty</string>
- <string name="prefs_pincode">PIN do aplikace</string>
- <string name="prefs_pincode_summary">Chraňte svého klienta</string>
+ <string name="prefs_passcode">Zámek bezpečnostního kódu</string>
<string name="prefs_instant_upload">Okamžité nahrávání obrázků</string>
<string name="prefs_instant_upload_summary">Okamžitě nahrávat vytvořené fotografie</string>
<string name="prefs_instant_video_upload">Okamžité nahrávání videa</string>
<string name="filedetails_download">Stáhnout</string>
<string name="filedetails_sync_file">Obnovit soubor</string>
<string name="filedetails_renamed_in_upload_msg">Soubor byl v průběhu odesílání přejmenován na %1$s</string>
+ <string name="list_layout">Náhled seznamu</string>
<string name="action_share_file">Sdílet odkaz</string>
<string name="action_unshare_file">Zrušit sdílení odkazu</string>
<string name="common_yes">Ano</string>
<string name="foreign_files_local_text">Místní: %1$s</string>
<string name="foreign_files_remote_text">Vzdálené: %1$s</string>
<string name="upload_query_move_foreign_files">Není dostatek místa pro zkopírování vybraných souborů do adresáře %1$s. Přejete si je místo kopírování přesunout?</string>
- <string name="pincode_enter_pin_code">Zadejte PIN aplikace</string>
- <string name="pincode_configure_your_pin">Zadat PIN aplikace</string>
- <string name="pincode_configure_your_pin_explanation">Při každém spuštění aplikace bude vyžadováno zadání PIN</string>
- <string name="pincode_reenter_your_pincode">Zadejte znovu PIN aplikace</string>
- <string name="pincode_remove_your_pincode">Odstranit PIN aplikace</string>
- <string name="pincode_mismatch">PINy aplikace se neshodují</string>
- <string name="pincode_wrong">Neplatný PIN aplikace</string>
- <string name="pincode_removed">PIN aplikace odstraněn</string>
- <string name="pincode_stored">PIN aplikace uložen</string>
+ <string name="pass_code_enter_pass_code">Zadejte prosím svůj bezpečnostní kód</string>
+ <string name="pass_code_configure_your_pass_code">Zadejte svůj bezpečnostní kód</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Bezpečnostní kód bude vyžadován při každém spuštění aplikace</string>
+ <string name="pass_code_reenter_your_pass_code">Zopakujte bezpečnostní kód</string>
+ <string name="pass_code_remove_your_pass_code">Odstraňte svůj bezpečnostní kód</string>
+ <string name="pass_code_mismatch">Bezpečnostní kód se liší</string>
+ <string name="pass_code_wrong">Nesprávný bezpečnostní kód</string>
+ <string name="pass_code_removed">Bezpečnostní kód odstraněn</string>
+ <string name="pass_code_stored">Bezpečnostní kód uložen</string>
<string name="media_notif_ticker">Hudební přehrávač %1$s</string>
<string name="media_state_playing">%1$s (přehrává)</string>
<string name="media_state_loading">%1$s (načítá)</string>
<string name="sync_file_nothing_to_do_msg">Obsah souboru je již synchronizován</string>
<string name="create_dir_fail_msg">Adresář nemohl být vytvořen</string>
<string name="filename_forbidden_characters">Zakázané znaky: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Jméno souboru obsahuje aelspoň jeden neplatný znak</string>
<string name="filename_empty">Název nemůže být prázdný</string>
<string name="wait_a_moment">Počkejte chvíli</string>
<string name="filedisplay_unexpected_bad_get_content">Neočekávaný problém - zkuste zvolit soubor jinou aplikací</string>
<string name="filedisplay_no_file_selected">Žádný soubor nebyl vybrán</string>
<string name="activity_chooser_title">Odeslat odkaz ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Kopírování souboru z privátního úložiště</string>
<string name="oauth_check_onoff">Přihlásit se s oAuth2</string>
<string name="oauth_login_connection">Připojuji se k oAuth2 serveru...</string>
<string name="ssl_validator_header">Identitu stránky nelze ověřit</string>
<string name="prefs_category_security">Zabezpečení</string>
<string name="prefs_instant_video_upload_path_title">Cesta pro nahrávání videí</string>
<string name="download_folder_failed_content">Stažení adresáře %1$s nemohlo být dokončeno</string>
- <string name="subject_token">%1$s sdílí \"%2$s\" s vámi</string>
+ <string name="shared_subject_header">sdílené</string>
+ <string name="with_you_subject_header">s vámi</string>
+ <string name="subject_token">%1$s s vámi sdílí \"%2$s\"</string>
<string name="auth_refresh_button">Obnovit připojení</string>
<string name="auth_host_address">Adresa serveru</string>
+ <string name="common_error_out_memory">Nedostatek paměti</string>
+ <string name="username">Uživatelské jméno</string>
</resources>
<string name="actionbar_send_file">Anfon</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Cyffredinol</string>
<string name="prefs_accounts">Cyfrifon</string>
<string name="prefs_manage_accounts">Rheoli Cyfrifon</string>
- <string name="prefs_pincode">PIN Ap</string>
- <string name="prefs_pincode_summary">Amddiffyn eich cleient</string>
<string name="prefs_help">Cymorth</string>
<string name="prefs_imprint">Imprint</string>
<string name="auth_username">Enw defnyddiwr</string>
<string name="foreign_files_fail">Methwyd symud rhai ffeiliau</string>
<string name="foreign_files_local_text">Lleol: %1$s</string>
<string name="foreign_files_remote_text">Pell: %1$s</string>
- <string name="pincode_enter_pin_code">Cyflwynwch PIN eich Ap</string>
- <string name="pincode_configure_your_pin">Cyflwynwch PIN eich Ap</string>
- <string name="pincode_configure_your_pin_explanation">Bydd cais am y PIN bob tro mae\'r ap yn cychwyn</string>
- <string name="pincode_reenter_your_pincode">Ailgyflwynwch PIN eich Ap</string>
- <string name="pincode_remove_your_pincode">Gwaredwch PIN eich Ap</string>
- <string name="pincode_mismatch">Nid yw PINau yr Ap yr un fath</string>
- <string name="pincode_wrong">PIN Ap anghywir</string>
- <string name="pincode_removed">Gwaredwyd PIN Ap</string>
- <string name="pincode_stored">Cadwyd PIN Ap</string>
<string name="auth_no_net_conn_title">Dim cysylltiad rhwydwaith</string>
<string name="auth_nossl_plain_ok_title">Nid oes cysylltiad diogel ar gael.</string>
<string name="auth_connection_established">Sefydlwyd y cysylltiad</string>
</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">Alle filer</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Indstillinger</string>
+ <string name="drawer_item_logs">Logregistreringer</string>
+ <string name="drawer_close">Luk</string>
<string name="prefs_category_general">Generel</string>
<string name="prefs_category_more">Mere</string>
<string name="prefs_accounts">Konti</string>
<string name="prefs_manage_accounts">Administrér konti</string>
- <string name="prefs_pincode">App PIN</string>
- <string name="prefs_pincode_summary">Beskyt din klient</string>
+ <string name="prefs_passcode">Passcode-lås</string>
<string name="prefs_instant_upload">Upload billeder straks</string>
<string name="prefs_instant_upload_summary">Upload straks billeder taget med kameraet</string>
<string name="prefs_instant_video_upload">Upload videoer straks</string>
<string name="filedetails_download">Hent</string>
<string name="filedetails_sync_file">Genopfrisk fil</string>
<string name="filedetails_renamed_in_upload_msg">Filen blev omdøbt til %1$s under upload</string>
+ <string name="list_layout">Listevisning</string>
<string name="action_share_file">Del link</string>
<string name="action_unshare_file">Ophæv deling</string>
<string name="common_yes">Ja</string>
<string name="foreign_files_local_text">Lokal: %1$s</string>
<string name="foreign_files_remote_text">Fjernplacering: %1$s</string>
<string name="upload_query_move_foreign_files">Der er ikke plads nok til at kopiere de valgte filer ind i mappen %1$s. Vil du flytte dem i stedet?</string>
- <string name="pincode_enter_pin_code">Indsæt venligst din App PIN</string>
- <string name="pincode_configure_your_pin">Indtast App PIN</string>
- <string name="pincode_configure_your_pin_explanation">PIN koden vil blive anmodet om hver gang applikationen bliver startet</string>
- <string name="pincode_reenter_your_pincode">Indtast venligst App PIN igen</string>
- <string name="pincode_remove_your_pincode">Fjern din App PIN</string>
- <string name="pincode_mismatch">App PIN er ikke ens</string>
- <string name="pincode_wrong">Forkert App PIN</string>
- <string name="pincode_removed">App PIN fjernet</string>
- <string name="pincode_stored">App PIN gemt</string>
+ <string name="pass_code_enter_pass_code">Indsæt venligst din passcode</string>
+ <string name="pass_code_configure_your_pass_code">Angiv din passcode</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Denne passcode vil blive forespurgt hver gang app\'en startes</string>
+ <string name="pass_code_reenter_your_pass_code">Angiv venligst din passcode påny</string>
+ <string name="pass_code_remove_your_pass_code">Fjern din passcode</string>
+ <string name="pass_code_mismatch">Passcode\'erne er ikke ens</string>
+ <string name="pass_code_wrong">Ukorrekt passcode</string>
+ <string name="pass_code_removed">Passcode blev fjernet</string>
+ <string name="pass_code_stored">Passcode blev gendannet</string>
<string name="media_notif_ticker">%1$s musikafspiller</string>
<string name="media_state_playing">%1$s (afspiller)</string>
<string name="media_state_loading">%1$s (indlæser)</string>
<string name="filedisplay_unexpected_bad_get_content">Uventet problem; prøv venligst en anden applikation til at vælge filen</string>
<string name="filedisplay_no_file_selected">Ingen fil blev valgt</string>
<string name="activity_chooser_title">Send link til ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Kopierer fil fra privat lager.</string>
<string name="oauth_check_onoff">Log på med oAuth2</string>
<string name="oauth_login_connection">Forbinder til oAuth2-server...</string>
<string name="ssl_validator_header">Sidens identitet kunne ikke verificeres</string>
<string name="prefs_category_security">Sikkerhed</string>
<string name="prefs_instant_video_upload_path_title">Sti til videoupload</string>
<string name="download_folder_failed_content">Download af %1$s mappe kunne ikke fuldføres</string>
- <string name="subject_token">%1$s delt \"%2$s\" med dig</string>
+ <string name="shared_subject_header">delt</string>
+ <string name="with_you_subject_header">med dig</string>
<string name="auth_refresh_button">Genopfrisk forbindelsen</string>
<string name="auth_host_address">Serveradresse</string>
+ <string name="common_error_out_memory">Ikke tilstrækkelig hukommelse</string>
+ <string name="username">Brugernavn</string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
+ <string name="actionbar_upload">Hochladen</string>
<string name="actionbar_upload_files">Dateien</string>
+ <string name="actionbar_open_with">Öffnen mit</string>
+ <string name="actionbar_mkdir">Neuer Ordner</string>
<string name="actionbar_settings">Einstellungen</string>
+ <string name="actionbar_see_details">Details</string>
+ <string name="actionbar_send_file">Senden</string>
+ <string name="actionbar_sort">Sortieren</string>
+ <string name="actionbar_sort_title">Sortieren nach</string>
+ <string-array name="actionbar_sortby">
+ <item>A-Z</item>
+ <item>Neueste - Älteste</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Allgemein</string>
+ <string name="prefs_accounts">Konten</string>
+ <string name="prefs_manage_accounts">Konten verwalten</string>
+ <string name="prefs_instant_upload_summary">Videos, die mit der Kamera aufgenommen werden sofort hochladen</string>
+ <string name="prefs_instant_video_upload_summary">Videos, die mit der Kamera aufgenommen werden sofort hochladen</string>
+ <string name="prefs_log_title">Logging einschalten</string>
+ <string name="prefs_log_summary">Dies wird verwendet um Probleme aufzuzeichnen</string>
+ <string name="prefs_log_title_history">Logging Verlauf</string>
+ <string name="prefs_log_summary_history">Dies zeigt die aufgenommenen Logs</string>
+ <string name="prefs_log_delete_history_button">Verlauf löschen</string>
<string name="prefs_help">Hilfe</string>
+ <string name="prefs_recommend">Einem Freund empfehlen</string>
+ <string name="prefs_feedback">Rückmeldung</string>
+ <string name="recommend_subject">Versuch %1$s auf deinem Handy!</string>
+ <string name="recommend_text">Ich lade dich ein %1$s auf deinem Handy zu verwenden!\nDownloade es hier: %2$s</string>
+ <string name="auth_check_server">Server überprüfen</string>
+ <string name="auth_host_url">Server Adresse https://...</string>
+ <string name="auth_username">Benutzername</string>
<string name="auth_password">Passwort</string>
+ <string name="auth_register">Neu bei %1$s?</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_btn_new_folder_text">Neuer Ordner</string>
+ <string name="uploader_wrn_no_account_title">Kein Benutzerkonto gefunden</string>
+ <string name="uploader_wrn_no_account_text">Es existieren keine %1$s Konten auf deinem Gerät. Bitte erstelle zuerst ein Konto.</string>
+ <string name="uploader_wrn_no_account_quit_btn_text">Schließen</string>
+ <string name="uploader_wrn_no_content_title">Kein Inhalt zum hochladen</string>
+ <string name="uploader_wrn_no_content_text">Es wurde kein Inhalt empfangen. Nichts zum hochladen.</string>
+ <string name="uploader_error_forbidden_content">%1$s ist es nicht erlaubt auf den geiteilten Inhalt zuzugreifen</string>
+ <string name="uploader_info_uploading">Lade hoch</string>
+ <string name="file_list_seconds_ago">Sekunden zuvor</string>
+ <string name="file_list_empty">Es ist nichts hier. Lade etwas hoch!</string>
+ <string name="file_list_loading">Lade...</string>
+ <string name="local_file_list_empty">Es sind keine Dateien in diesem Ordner.</string>
+ <string name="file_list_folder">Ordner</string>
+ <string name="file_list_folders">Ordner</string>
+ <string name="file_list_file">Datei</string>
+ <string name="file_list_files">Dateien</string>
+ <string name="filedetails_select_file">Auf eine Datei drücken, um mehr Informationen zu erhalten.</string>
+ <string name="filedetails_size">Größe:</string>
+ <string name="filedetails_type">Typ:</string>
+ <string name="filedetails_created">Erstellt am:</string>
+ <string name="filedetails_modified">Verändert am:</string>
<string name="filedetails_download">Herunterladen</string>
+ <string name="filedetails_sync_file">Datei neu laden</string>
+ <string name="action_share_file">Link teilen</string>
+ <string name="action_unshare_file">Link nicht mehr teilen</string>
+ <string name="common_yes">Ja</string>
+ <string name="common_no">Nein</string>
+ <string name="common_ok">OK</string>
+ <string name="common_cancel_download">Herunterladen abbrechen</string>
+ <string name="common_cancel_upload">Hochladen abbrechen</string>
<string name="common_cancel">Abbrechen</string>
+ <string name="common_save_exit">Speichern & Schließen</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">Konto löschen</string>
+ <string name="create_account">Konto erstellen</string>
+ <string name="upload_chooser_title">Hochladen von ...</string>
+ <string name="uploader_info_dirname">Ordner Name</string>
+ <string name="uploader_upload_in_progress_ticker">Lade hoch ...</string>
+ <string name="uploader_upload_succeeded_ticker">Hochladen erfolgreich</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s wurde 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 fertig gestellt werden</string>
+ <string name="uploader_upload_failed_credentials_error">Hochladen fehlgeschlagen, du musst dich erneut anmelden</string>
+ <string name="downloader_download_in_progress_ticker">Lade herunter ...</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 fertig gestellt werden</string>
+ <string name="downloader_not_downloaded_yet">Noch nicht heruntergeladen</string>
+ <string name="downloader_download_failed_credentials_error">Herunterladen fehlgeschlagen, du musst dich erneut anmelden</string>
+ <string name="common_choose_account">Konto wählen</string>
+ <string name="sync_fail_ticker">Synchronisierung fehlgeschlagen</string>
+ <string name="sync_fail_ticker_unauthorized">Synchronisierung fehlgeschlagen, du musst dich erneut anmelden</string>
+ <string name="sync_fail_content">Synchronisation von %1$s konnte nicht fertig gestellt werden</string>
+ <string name="sync_fail_content_unauthorized">Falsches passwort für %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">Konflikte entdeckt</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d synchronisierte Dateien konnten nicht synchronisiert werden </string>
+ <string name="sync_fail_in_favourites_content">Inhalte von %1$d Dateien konnten nicht synchronisiert werden (%2$d Konflikte)</string>
+ <string name="sync_foreign_files_forgotten_explanation">Ab Version 1.3.16 werden alle Dateien, die von diesem Gerät hochgeladen werden, in den lokalen Ordner %1$s kopiert um zu vermeiden, dass Datenverlust entsteht, wenn eine einzelne Datei mit mehreren Konten synchronisiert wird.\n\nWegen dieser Änderung wurden alle Dateien, die mit einer früheren Version der App hochgeladen wurden, in den Ordner %2$s kopiert. Jedoch verhinderte ein Fehler, dass die Operation, während der synchronisation des Kontos, erfolgreich beendet wurde. Du kannst die Datei(en) entweder so lassen, wie sie sind und den Link zu %3$s löschen oder die Datei(en) in den Ordner %1$s verschieben und den Link zu %4$s behalten.\n\nUnten aufgelistet findest du die lokalen und die dazugehörigen hochgeladenen Dateien in %5$s.</string>
+ <string name="sync_current_folder_was_removed">Ordner %1$s existiert nicht mehr</string>
+ <string name="foreign_files_move">Alle verschieben</string>
+ <string name="foreign_files_success">Alle Dateien wurden verschoben</string>
+ <string name="foreign_files_fail">Ein paar Dateien konnten nicht verschoben werden</string>
+ <string name="foreign_files_local_text">Lokal: %1$s</string>
+ <string name="ssl_validator_btn_details_see">Details</string>
+ <string name="activity_chooser_send_file_title">Senden</string>
<string name="empty"></string>
+ <string name="prefs_category_accounts">Konten</string>
<string name="auth_host_address">Adresse des Servers</string>
</resources>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<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_passcode">PIN gesperrt</string>
<string name="prefs_instant_upload">Sofortiger Bilderupload</string>
<string name="prefs_instant_upload_summary">Fotos von der Kamera sofort hochladen</string>
<string name="prefs_instant_video_upload">Sofortiger Videoupload</string>
<string name="foreign_files_local_text">Lokal: %1$s</string>
<string name="foreign_files_remote_text">Remote: %1$s</string>
<string name="upload_query_move_foreign_files">Es steht nicht genügend Speicherplatz zur Verfügung um die ausgewählten Dateien in den Ordner %1$s zu kopieren. Möchten Sie diese stattdessen verschieben?</string>
- <string name="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="pass_code_enter_pass_code">Bitte PIN eingeben</string>
+ <string name="pass_code_configure_your_pass_code">Bitte PIN eingeben</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Die PIN wird jedes mal wenn die App gestartet wird abgefragt</string>
+ <string name="pass_code_reenter_your_pass_code">Bitte PIN erneut eingeben</string>
+ <string name="pass_code_remove_your_pass_code">PIN entfernen</string>
+ <string name="pass_code_mismatch">Die PINs stimmen nicht überein</string>
+ <string name="pass_code_wrong">PIN nicht korrekt</string>
+ <string name="pass_code_removed">PIN entfernt</string>
+ <string name="pass_code_stored">PIN 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="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuchen Sie, die Datei in einer anderen App zu öffnen.</string>
<string name="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string>
<string name="activity_chooser_title">Link senden an …</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Kopiere Datei vom privatem Speicher</string>
<string name="oauth_check_onoff">Anmelden mit oAuth2</string>
<string name="oauth_login_connection">Mit dem oAuth2-Server wird verbunden …</string>
<string name="ssl_validator_header">Die Identität der Website konnte nicht überprüft werden</string>
<string name="prefs_category_security">Sicherheit</string>
<string name="prefs_instant_video_upload_path_title">Verzeichnis zum Hochladen der Videos</string>
<string name="download_folder_failed_content">Herunterladen des %1$s - Ordners konnte nicht abgeschlossen werden</string>
- <string name="subject_token">%1$s hat „%2$s“ mit Ihnen geteilt</string>
<string name="auth_refresh_button">Verbindung aktualisieren</string>
<string name="auth_host_address">Serveradresse</string>
+ <string name="common_error_out_memory">Nicht genügend Speicher</string>
</resources>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Einstellungen</string>
<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ütze Deinen Client</string>
+ <string name="prefs_passcode">PIN gesperrt</string>
<string name="prefs_instant_upload">Sofortiger Bilder-Upload</string>
<string name="prefs_instant_upload_summary">Lade Fotos von der Kamera sofort hoch</string>
<string name="prefs_instant_video_upload">Sofortiger Video-Upload</string>
<string name="foreign_files_local_text">Lokal: %1$s</string>
<string name="foreign_files_remote_text">Remote: %1$s</string>
<string name="upload_query_move_foreign_files">Es steht nicht genügend Speicherplatz zur Verfügung um die ausgewählten Dateien in den %1$s Ordner zu kopieren. Möchtest du diese stattdessen verschieben?</string>
- <string name="pincode_enter_pin_code">Bitte gib Deine App-PIN ein</string>
- <string name="pincode_configure_your_pin">Bitte gib Deine 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 gib Deine 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="pass_code_enter_pass_code">Bitte PIN eingeben</string>
+ <string name="pass_code_configure_your_pass_code">Bitte PIN eingeben</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Die PIN wird jedes mal beim Start der App abgefragt</string>
+ <string name="pass_code_reenter_your_pass_code">Bitte PIN nochmals eingeben</string>
+ <string name="pass_code_remove_your_pass_code">PIN entfernen</string>
+ <string name="pass_code_mismatch">Die PINs stimmen nicht überein</string>
+ <string name="pass_code_wrong">PIN nicht korrekt</string>
+ <string name="pass_code_removed">PIN entfernt</string>
+ <string name="pass_code_stored">PIN gespeichert</string>
<string name="media_notif_ticker">%1$s Musik Player</string>
<string name="media_state_playing">%1$s (playing)</string>
<string name="media_state_loading">%1$s (loading)</string>
<string name="filedisplay_unexpected_bad_get_content">Ein unerwartetes Problem ist aufgetreten. Bitte versuche, die Datei in einer anderen App zu öffnen</string>
<string name="filedisplay_no_file_selected">Es wurde keine Datei ausgewählt.</string>
<string name="activity_chooser_title">Link senden an…</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Kopiere Datei vom privatem Speicher</string>
<string name="oauth_check_onoff">Anmelden mit oAuth2</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="prefs_category_security">Sicherheit</string>
<string name="prefs_instant_video_upload_path_title">Verzeichnis zum Hochladen der Videos</string>
<string name="download_folder_failed_content">Herunterladen des %1$s - Ordners konnte nicht abgeschlossen werden</string>
- <string name="subject_token">%1$s hat „%2$s“ mit Dir geteilt</string>
<string name="auth_refresh_button">Verbindung aktualisieren</string>
<string name="auth_host_address">Serveradresse</string>
+ <string name="common_error_out_memory">Nicht genügend Speicher</string>
</resources>
</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">Όλα τα αρχεία</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Ρυθμίσεις</string>
+ <string name="drawer_item_logs">Αρχεία καταγραφών</string>
+ <string name="drawer_close">Κλείσιμο</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">PIN εφαρμογής</string>
- <string name="prefs_pincode_summary">Προστατέψτε το δέκτη σας</string>
+ <string name="prefs_passcode">Κλείδωμα με κωδικό πρόσβασης</string>
<string name="prefs_instant_upload">Στιγμιαίες μεταφορτώσεις εικόνων</string>
<string name="prefs_instant_upload_summary">Μεταφορτώστε απευθείας φωτογραφίες από την κάμερα</string>
<string name="prefs_instant_video_upload">Στιγμιαίες μεταφορτώσεις βίντεο</string>
<string name="filedetails_download">Λήψη</string>
<string name="filedetails_sync_file">Ανανέωση αρχείου</string>
<string name="filedetails_renamed_in_upload_msg">Το αρχείο μετονομάστηκε σε %1$s κατά τη μεταφόρτωση</string>
+ <string name="list_layout">Διάταξη Λίστας</string>
<string name="action_share_file">Διαμοιρασμός συνδέσμου</string>
<string name="action_unshare_file">Ακύρωση διαμοιρασμού συνδέσμου</string>
<string name="common_yes">Ναι</string>
<string name="foreign_files_local_text">Τοπικά: %1$s</string>
<string name="foreign_files_remote_text">Απομακρυσμένα: %1$s</string>
<string name="upload_query_move_foreign_files">Δεν υπάρχει αρκετός διαθέσιμος αποθηκευτικός χώρος για να αντιγραφούν τα επιλεγμένα αρχεία στον φάκελο %1$s. Θα θέλατε να τα μετακινήσετε αντί αυτού;</string>
- <string name="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="pass_code_enter_pass_code">Παρακαλώ, εισάγετε τον κωδικό σας πρόσβασης</string>
+ <string name="pass_code_configure_your_pass_code">Εισάγετε τον κωδικό πρόσβασης</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Ο κωδικός πρόσβασης θα ζητείται κάθε φορά που εκκινεί η εφαρμογή</string>
+ <string name="pass_code_reenter_your_pass_code">Παρακαλώ, επανεισάγετε τον κωδικό σας πρόσβασης</string>
+ <string name="pass_code_remove_your_pass_code">Αφαίρεση του κωδικού σας πρόσβασης</string>
+ <string name="pass_code_mismatch">Οι κωδικοί πρόσβασης δεν ταιριάζουν</string>
+ <string name="pass_code_wrong">Εσφαλμένος κωδικός πρόσβασης</string>
+ <string name="pass_code_removed">Ο κωδικός πρόσβασης αφαιρέθηκε</string>
+ <string name="pass_code_stored">Ο κωδικός πρόσβασης αποθηκεύτηκε</string>
<string name="media_notif_ticker">%1$s αναπαραγωγή μουσικής</string>
<string name="media_state_playing">%1$s (αναπαραγωγή)</string>
<string name="media_state_loading">%1$s (φόρτωση)</string>
<string name="sync_file_nothing_to_do_msg">Τα περιεχόμενα του αρχείου έχουν ήδη συγχρονιστεί</string>
<string name="create_dir_fail_msg">Η δημιουργία φακέλου απέτυχε</string>
<string name="filename_forbidden_characters">Μη-επιτρεπόμενοι χαρακτήρες: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Το όνομα αρχείου περιέχει έναν τουλάχιστον μη έγκυρο χαρακτήρα</string>
<string name="filename_empty">Το όνομα αρχείου δεν μπορεί να είναι κενό.</string>
<string name="wait_a_moment">Παρακαλούμε περιμένετε</string>
<string name="filedisplay_unexpected_bad_get_content">Απροσδόκητο σφάλμα - παρακαλώ επιλέξτε το αρχείο από μια άλλη εφαρμογή</string>
<string name="filedisplay_no_file_selected">Δεν επιλέχθηκαν αρχεία </string>
<string name="activity_chooser_title">Αποστολή συνδέσμου σε ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Αντιγραφή αρχείου από ιδιωτική αποθήκευση</string>
<string name="oauth_check_onoff">Σύνδεση με oAuth2</string>
<string name="oauth_login_connection">Σύνδεση με το διακομιστή oAuth2 σε εξέλιξη...</string>
<string name="ssl_validator_header">Η ταυτότητα της σελίδας δεν μπορεί να επληθευτεί</string>
<string name="prefs_category_security">Ασφάλεια</string>
<string name="prefs_instant_video_upload_path_title">Διαδρομή Μεταφόρτωσης Βίντεο</string>
<string name="download_folder_failed_content">Η λήψη του φακέλου %1$s δεν ολοκληρώθηκε με επιτυχία.</string>
- <string name="subject_token">%1$s μοιράστηκε \"%2$s\" μαζί σας</string>
+ <string name="shared_subject_header">διαμοιρασμένα</string>
+ <string name="with_you_subject_header">με εσάς</string>
+ <string name="subject_token">Ο %1$s διαμοιράστηκε το \"%2$s\" με εσάς</string>
<string name="auth_refresh_button">Ανανέωση σύνδεσης</string>
<string name="auth_host_address">Διεύθυνση διακομιστή</string>
+ <string name="common_error_out_memory">Δεν υπάρχει αρκετή μνήμη</string>
+ <string name="username">Όνομα χρήστη</string>
</resources>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">More</string>
<string name="prefs_accounts">Accounts</string>
<string name="prefs_manage_accounts">Manage Accounts</string>
- <string name="prefs_pincode">App PIN</string>
- <string name="prefs_pincode_summary">Protect your client</string>
+ <string name="prefs_passcode">Passcode lock</string>
<string name="prefs_instant_upload">Instant picture uploads</string>
<string name="prefs_instant_upload_summary">Instantly upload pictures taken by camera</string>
<string name="prefs_instant_video_upload">Instant video uploads</string>
<string name="foreign_files_local_text">Local: %1$s</string>
<string name="foreign_files_remote_text">Remote: %1$s</string>
<string name="upload_query_move_foreign_files">There is not enough space to copy the selected files into the %1$s folder. Would you like to move them instead? </string>
- <string name="pincode_enter_pin_code">Please, insert your App PIN</string>
- <string name="pincode_configure_your_pin">Enter your App PIN</string>
- <string name="pincode_configure_your_pin_explanation">The PIN will be requested every time the app is started</string>
- <string name="pincode_reenter_your_pincode">Please, re-enter your App PIN</string>
- <string name="pincode_remove_your_pincode">Remove your App PIN</string>
- <string name="pincode_mismatch">The App PINs are not the same</string>
- <string name="pincode_wrong">Incorrect App PIN</string>
- <string name="pincode_removed">App PIN removed</string>
- <string name="pincode_stored">App PIN stored</string>
+ <string name="pass_code_enter_pass_code">Please, insert your passcode</string>
+ <string name="pass_code_configure_your_pass_code">Enter your passcode</string>
+ <string name="pass_code_configure_your_pass_code_explanation">The passcode will be requested every time the app is started</string>
+ <string name="pass_code_reenter_your_pass_code">Please, reenter your passcode</string>
+ <string name="pass_code_remove_your_pass_code">Remove your passcode</string>
+ <string name="pass_code_mismatch">The passcodes are not the same</string>
+ <string name="pass_code_wrong">Incorrect passcode</string>
+ <string name="pass_code_removed">Passcode removed</string>
+ <string name="pass_code_stored">Passcode stored</string>
<string name="media_notif_ticker">%1$s music player</string>
<string name="media_state_playing">%1$s (playing)</string>
<string name="media_state_loading">%1$s (loading)</string>
<string name="auth_fail_get_user_name">Your server is not returning a correct user id, please contact an administrator
</string>
<string name="auth_can_not_auth_against_server">Cannot authenticate against this server</string>
- <string name="auth_account_does_not_exist">Account does not exist on the device yet</string>
+ <string name="auth_account_does_not_exist">Account does not exist in the device yet</string>
<string name="fd_keep_in_sync">Keep file up to date</string>
<string name="common_rename">Rename</string>
<string name="common_remove">Remove</string>
<string name="filedisplay_unexpected_bad_get_content">Unexpected problem; please select the file from a different app</string>
<string name="filedisplay_no_file_selected">No file was selected</string>
<string name="activity_chooser_title">Send link to …</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Copying file from private storage</string>
<string name="oauth_check_onoff">Log in with oAuth2</string>
<string name="oauth_login_connection">Connecting to oAuth2 server…</string>
<string name="ssl_validator_header">The identity of the site could not be verified</string>
<string name="prefs_category_security">Security</string>
<string name="prefs_instant_video_upload_path_title">Upload Video Path</string>
<string name="download_folder_failed_content">Download of %1$s folder could not be completed</string>
- <string name="subject_token">%1$s shared \"%2$s\" with you</string>
<string name="auth_refresh_button">Refresh connection</string>
<string name="auth_host_address">Server address</string>
+ <string name="common_error_out_memory">Not enough memory</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_send_file">Sendi</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Ĝeneralo</string>
<string name="prefs_category_more">Pli</string>
<string name="prefs_accounts">Kontoj</string>
<string name="prefs_manage_accounts">Administri kontojn</string>
- <string name="prefs_pincode">PIN de App-aplikaĵo</string>
- <string name="prefs_pincode_summary">Protekti vian klienton</string>
<string name="prefs_help">Helpo</string>
<string name="prefs_recommend">Rekomendi al amiko</string>
<string name="auth_check_server">Kontroli servilon</string>
<string name="uploader_info_uploading">Alŝutante</string>
<string name="file_list_seconds_ago">sekundoj antaŭe</string>
<string name="file_list_empty">Nenio estas ĉi tie. Alŝutu ion!</string>
+ <string name="file_list_loading">Ŝargante...</string>
<string name="file_list_folder">dosierujo</string>
<string name="file_list_folders">dosierujoj</string>
<string name="file_list_file">dosiero</string>
<string name="foreign_files_fail">Iuj dosieroj ne povis moviĝi</string>
<string name="foreign_files_local_text">Loka: %1$s</string>
<string name="foreign_files_remote_text">Malloka: %1$s</string>
- <string name="pincode_enter_pin_code">Bonvolu enigi vian PIN-on de aplikaĵo</string>
- <string name="pincode_configure_your_pin">Enigu PIN-on de aplikaĵo</string>
- <string name="pincode_reenter_your_pincode">Bonvolu reenigi PIN-on de aplikaĵo</string>
- <string name="pincode_remove_your_pincode">Forigu vian PIN-on de aplikaĵo</string>
- <string name="pincode_mismatch">La du PIN-oj de aplikaĵo malsamas</string>
- <string name="pincode_wrong">Malĝusta PIN de aplikaĵo</string>
- <string name="pincode_removed">PIN de aplikaĵo foriĝis</string>
- <string name="pincode_stored">PIN de aplikaĵo konserviĝis</string>
<string name="media_state_playing">%1$s (ludanta)</string>
<string name="media_state_loading">%1$s (ŝarganta)</string>
<string name="auth_getting_authorization">Ekhavante rajtigon...</string>
<string name="preview_image_description">Antaŭvido de bildo</string>
<string name="preview_image_error_unknown_format">Ĉi tiu bildo ne povas montriĝi</string>
<string name="error__upload__local_file_not_copied">%1$s ne povis kopiiĝi al la loka dosierujo %2$s</string>
+ <string name="share_link_password_title">Enigu pasvorton</string>
+ <string name="share_link_empty_password">Vi devas enigi pasvorton</string>
<string name="activity_chooser_send_file_title">Sendi</string>
<string name="copy_link">Kopii ligilon</string>
<string name="clipboard_text_copied">Kopiita en la tondejon</string>
<string name="prefs_category_accounts">Kontoj</string>
<string name="saml_authentication_required_text">Aŭtentiĝo nepras</string>
<string name="saml_authentication_wrong_pass">Malĝusta pasvorto</string>
+ <string name="actionbar_move">Movi</string>
<string name="folder_picker_choose_button_text">Elekti</string>
+ <string name="move_file_invalid_overwrite">La dosiero jam ekzistas en la cela dosierujo</string>
<string name="prefs_category_security">Sekuro</string>
<string name="auth_host_address">Servila adreso</string>
</resources>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_accounts">Cuentas</string>
<string name="prefs_manage_accounts">Gestionar cuentas</string>
- <string name="prefs_pincode">PIN de aplicación</string>
- <string name="prefs_pincode_summary">Protejé tu cliente</string>
<string name="prefs_instant_upload">Subir fotos instantáneamente. </string>
<string name="prefs_instant_upload_summary">Subir instantáneamente fotos tomadas por la cámara.</string>
<string name="prefs_instant_video_upload">Subir videos instantáneamente. </string>
<string name="foreign_files_local_text">Local: %1$s</string>
<string name="foreign_files_remote_text">Remote: %1$s</string>
<string name="upload_query_move_foreign_files">No hay espacio suficiente para copiar los archivos seleccionados dentro de la carpeta %1$s. ¿Te gustaría en su lugar moverlos?</string>
- <string name="pincode_enter_pin_code">Por favor, escribí el PIN de la aplicación</string>
- <string name="pincode_configure_your_pin">Ingresá el PIN de la aplicación</string>
- <string name="pincode_configure_your_pin_explanation">Se te pedirá el PIN cada vez que esta app sea iniciada.</string>
- <string name="pincode_reenter_your_pincode">Por favor, ingresá nuevamente el PIN de la aplicación</string>
- <string name="pincode_remove_your_pincode">Borrar tu PIN de la aplicación</string>
- <string name="pincode_mismatch">Los PIN no son iguales</string>
- <string name="pincode_wrong">El PIN de la aplicación es incorrecto</string>
- <string name="pincode_removed">El PIN de la aplicación fue borrado</string>
- <string name="pincode_stored">El PIN de la aplicación fue almacenado</string>
<string name="media_notif_ticker">Reproductor de música %1$s</string>
<string name="media_state_playing">%1$s (reproduciendo)</string>
<string name="media_state_loading">%1$s (cargando)</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_see_details">detalles</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">General</string>
<string name="prefs_accounts">Cuentas</string>
<string name="prefs_manage_accounts">Administrar Cuentas</string>
- <string name="prefs_pincode">PIN de la aplicación</string>
- <string name="prefs_pincode_summary">Proteger su cliente</string>
<string name="prefs_instant_upload">Subida instantánea de imagenes</string>
<string name="prefs_instant_upload_summary">Subida instantánea de imágenes tomadas con la cámara</string>
<string name="prefs_help">Ayuda</string>
<string name="foreign_files_fail">algunos archivos no pueden ser transferidos</string>
<string name="foreign_files_local_text">Local: %1$s</string>
<string name="foreign_files_remote_text">Remoto: %1$s</string>
- <string name="pincode_enter_pin_code">Por favor, ingreses su PIN de aplicación</string>
- <string name="pincode_configure_your_pin">Ingrese su PIN de aplicación</string>
- <string name="pincode_configure_your_pin_explanation">El PIN será solicitado cada vez que la aplicación se inicie</string>
- <string name="pincode_reenter_your_pincode">Por favor, reingrese su PIN de aplicación</string>
- <string name="pincode_remove_your_pincode">Remover el PIN de su aplicación</string>
- <string name="pincode_mismatch">Los PINs de su aplicación no coinciden</string>
- <string name="pincode_wrong">PIN de aplicación incorrecto</string>
- <string name="pincode_removed">PIN de aplicación removido</string>
- <string name="pincode_stored">PIN de aplicación almacenada</string>
<string name="media_notif_ticker">Reproductor de música %1$s</string>
<string name="media_state_playing">(sonando) %1$s</string>
<string name="media_state_loading">(cargando) %1$s</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_upload_files">Archivos</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="sync_string_files">Archivos</string>
<string name="empty"></string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_send_file">Enviar</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_accounts">Cuentas</string>
<string name="prefs_manage_accounts">Gestionar cuentas</string>
- <string name="prefs_pincode">PIN de aplicación </string>
- <string name="prefs_pincode_summary">Proteja su cliente</string>
<string name="prefs_log_title">Habilitar registro</string>
<string name="prefs_log_summary">Esto es usado para registrar problemas</string>
<string name="prefs_log_title_history">Historia del Registro</string>
<string name="foreign_files_fail">Algunos archivos no han podido ser movidos</string>
<string name="foreign_files_local_text">Local: %1$s</string>
<string name="foreign_files_remote_text">Remoto: %1$s</string>
- <string name="pincode_enter_pin_code">Por favor, inserta tu PIN de aplicación</string>
- <string name="pincode_configure_your_pin">Introduzca un PIN para la aplicación</string>
- <string name="pincode_configure_your_pin_explanation">Se solicitará el PIN cada vez que se inicie la aplicación</string>
- <string name="pincode_reenter_your_pincode">Repita el PIN para la aplicación, por favor</string>
- <string name="pincode_remove_your_pincode">Borre su PIN de aplicación</string>
- <string name="pincode_mismatch">Los PIN introducidos no son iguales</string>
- <string name="pincode_wrong">PIN de aplicación incorrecto</string>
- <string name="pincode_removed">PIN de aplicación borrado</string>
- <string name="pincode_stored">PIN de aplicación guardado</string>
<string name="media_notif_ticker">Reproductor de música %1$s</string>
<string name="media_state_playing">%1$s (reproduciendo)</string>
<string name="media_state_loading">%1$s (cargando)</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_upload_files">Archivos</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="sync_string_files">Archivos</string>
<string name="empty"></string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
</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">Todos los archivos</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Ajustes</string>
+ <string name="drawer_item_logs">Registros</string>
+ <string name="drawer_close">Cerrar</string>
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Más</string>
<string name="prefs_accounts">Cuentas</string>
<string name="prefs_manage_accounts">Gestionar cuentas</string>
- <string name="prefs_pincode">PIN de aplicación </string>
- <string name="prefs_pincode_summary">Proteja su cliente</string>
+ <string name="prefs_passcode">Contraseña</string>
<string name="prefs_instant_upload">Subida instantánea de imágenes</string>
<string name="prefs_instant_upload_summary">Sube instantáneamente las fotos tomadas con la cámara</string>
<string name="prefs_instant_video_upload">Subidas instantáneas de video</string>
<string name="filedetails_download">Descargar</string>
<string name="filedetails_sync_file">Actualizar archivo</string>
<string name="filedetails_renamed_in_upload_msg">El fichero fue renombrado como %1$s durante la subida</string>
+ <string name="list_layout">Diseño de lista</string>
<string name="action_share_file">Compartir con enlace</string>
<string name="action_unshare_file">Dejar de compartir</string>
<string name="common_yes">Sí</string>
<string name="foreign_files_local_text">Local: %1$s</string>
<string name="foreign_files_remote_text">Remoto: %1$s</string>
<string name="upload_query_move_foreign_files">No hay suficiente espacio para copiar los archivos seleccionados a la carpeta %1$s. ¿Desea moverlos en vez de copiarlos?</string>
- <string name="pincode_enter_pin_code">Por favor, inserte su PIN de aplicación</string>
- <string name="pincode_configure_your_pin">Introduzca un PIN para la aplicación</string>
- <string name="pincode_configure_your_pin_explanation">Se solicitará el PIN cada vez que se inicie la aplicación</string>
- <string name="pincode_reenter_your_pincode">Repita el PIN para la aplicación, por favor</string>
- <string name="pincode_remove_your_pincode">Borre su PIN de aplicación</string>
- <string name="pincode_mismatch">Los PIN introducidos no son iguales</string>
- <string name="pincode_wrong">PIN de aplicación incorrecto</string>
- <string name="pincode_removed">PIN de aplicación borrado</string>
- <string name="pincode_stored">PIN de aplicación guardado</string>
+ <string name="pass_code_enter_pass_code">Por favor, introduzca su contraseña</string>
+ <string name="pass_code_configure_your_pass_code">Introduzca su contraseña</string>
+ <string name="pass_code_configure_your_pass_code_explanation">La contraseña será requerida cada vez que la aplicación sea iniciada</string>
+ <string name="pass_code_reenter_your_pass_code">Reintroduzca la contraseña, por favor.</string>
+ <string name="pass_code_remove_your_pass_code">Borre su contraseña</string>
+ <string name="pass_code_mismatch">Las contraseñas no son identicas</string>
+ <string name="pass_code_wrong">Contraseña incorrecta</string>
+ <string name="pass_code_removed">Contraseña borrada</string>
+ <string name="pass_code_stored">Contraseña almacenada</string>
<string name="media_notif_ticker">Reproductor de música %1$s</string>
<string name="media_state_playing">%1$s (reproduciendo)</string>
<string name="media_state_loading">%1$s (cargando)</string>
<string name="sync_file_nothing_to_do_msg">Ya está sincronizado</string>
<string name="create_dir_fail_msg">No se pudo crear la carpeta</string>
<string name="filename_forbidden_characters">Carácteres ilegales: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Nombre de archivo contiene al menos un caracter no válido</string>
<string name="filename_empty">El nombre de archivo no puede estar vacío</string>
<string name="wait_a_moment">Espere un momento</string>
<string name="filedisplay_unexpected_bad_get_content">Problema inesperado; por favor, pruebe otra app para seleccionar el archivo</string>
<string name="filedisplay_no_file_selected">No hay ficheros seleccionados.</string>
<string name="activity_chooser_title">Enviar enlace a...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Copiando el archivo desde el almacenamiento privado.</string>
<string name="oauth_check_onoff">Ingresar con oAuth2</string>
<string name="oauth_login_connection">Conectando al servidor oAuth2...</string>
<string name="ssl_validator_header">La identidad del sitio no puede ser verificada</string>
<string name="file_list_empty_moving">Aquí no hay nada. ¡Puede agregar una carpeta!</string>
<string name="folder_picker_choose_button_text">Elegir</string>
<string name="move_file_not_found">No se puede mover. Revise si el archivo existe</string>
- <string name="move_file_invalid_into_descendent">No se puede mover una carpeta dentro de una de SUS subcarpetas.</string>
+ <string name="move_file_invalid_into_descendent">No se puede mover una carpeta dentro de una de sus subcarpetas.</string>
<string name="move_file_invalid_overwrite">El archivo ya existe en la carpeta de destino</string>
<string name="move_file_error">Hubo un error al tratar de mover este archivo o carpeta</string>
<string name="forbidden_permissions_move">para mover este archivo</string>
<string name="prefs_category_security">Seguridad</string>
<string name="prefs_instant_video_upload_path_title">Guardar videos subidos en la carpeta:</string>
<string name="download_folder_failed_content">La descarga de la carpeta %1$s no ha podido ser completada</string>
- <string name="subject_token">%1$s compartió \"%2$s\" contigo</string>
+ <string name="shared_subject_header">compartido</string>
+ <string name="with_you_subject_header">con usted</string>
+ <string name="subject_token">%1$s compartió \"%2$s\" conmigo</string>
<string name="auth_refresh_button">Refrescar la conexión</string>
<string name="auth_host_address">Dirección del servidor</string>
+ <string name="common_error_out_memory">No hay suficiente memoria</string>
+ <string name="username">Nombre de usuario</string>
</resources>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Üldine</string>
<string name="prefs_category_more">Rohkem</string>
<string name="prefs_accounts">Kontod</string>
<string name="prefs_manage_accounts">Halda kontosid</string>
- <string name="prefs_pincode">Rakenduse PIN</string>
- <string name="prefs_pincode_summary">Kaitse oma klienti</string>
<string name="prefs_instant_upload">Piltide kohene üleslaadimine</string>
<string name="prefs_instant_upload_summary">Laadi koheselt üles kaameraga tehtud pildid</string>
<string name="prefs_instant_video_upload">Videote kohene üleslaadimine</string>
<string name="foreign_files_local_text">Kohalik: %1$s</string>
<string name="foreign_files_remote_text">Serveris: %1$s</string>
<string name="upload_query_move_foreign_files">Pole piisavalt ruumi kopeerimaks valitud faile kataloogi %1$s. Kas soovid kopeerimise asemel neid ümber tõsta?</string>
- <string name="pincode_enter_pin_code">Palun sisesta oma rakenduse PIN</string>
- <string name="pincode_configure_your_pin">Sisesta oma rakenduse PIN</string>
- <string name="pincode_configure_your_pin_explanation">PIN-i nõutakse iga kord, kui rakendus käivitatakse</string>
- <string name="pincode_reenter_your_pincode">Palun sisesta oma rakenduse PIN uuesti</string>
- <string name="pincode_remove_your_pincode">Eemalda oma rakenduse PIN</string>
- <string name="pincode_mismatch">Mõlemad rakenduse PIN-id pole samad</string>
- <string name="pincode_wrong">Vigane rakenduse PIN</string>
- <string name="pincode_removed">Rakenduse PIN on eemaldatud</string>
- <string name="pincode_stored">Rakenduse PIN on salvestatud</string>
<string name="media_notif_ticker">%1$s muusika mängija</string>
<string name="media_state_playing">%1$s (mängib)</string>
<string name="media_state_loading">%1$s (laeb)</string>
<string name="prefs_category_security">Turvalisus</string>
<string name="prefs_instant_video_upload_path_title">Video üleslaadimise asukoht</string>
<string name="download_folder_failed_content">Kausta %1$s allalaadimine ei õnnestunud</string>
- <string name="subject_token">%1$s jagas sinuga \"%2$s\"</string>
<string name="auth_refresh_button">Värskenda ühendust</string>
<string name="auth_host_address">Serveri aadress</string>
</resources>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</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_pincode">App PIN</string>
- <string name="prefs_pincode_summary">Babestu zure bezeroa</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="foreign_files_local_text">Bertakoa: %1$s</string>
<string name="foreign_files_remote_text">Urrunekoa: %1$s</string>
<string name="upload_query_move_foreign_files">Ez dago leku nahikorik hautatutako fitxategiak %1$s karpetan kopiatzeko. Nahi al duzu kopiatu ordez bertara mugitzea?</string>
- <string name="pincode_enter_pin_code">Mesedez, sartu zure aplikazioaren PINa</string>
- <string name="pincode_configure_your_pin">Sartu aplikazioaren PINa</string>
- <string name="pincode_configure_your_pin_explanation">PINa aplikazioa abiarazten den bakoitzean eskatuko da</string>
- <string name="pincode_reenter_your_pincode">Sartu berriz aplikazioarenPINa, mesedez</string>
- <string name="pincode_remove_your_pincode">Ezabatu zure aplikazioaren PINa</string>
- <string name="pincode_mismatch">Aplikazioko bi PINak ez dira berdinak</string>
- <string name="pincode_wrong">Aplikazioaren PINa ezda zuzena</string>
- <string name="pincode_removed">Aplikazioaren PINa kendu da</string>
- <string name="pincode_stored">Aplikazioaren PINa gorde da</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="actionbar_send_file">ارسال</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="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">PIN برنامه</string>
- <string name="prefs_pincode_summary">حفاظت از مشتری</string>
<string name="prefs_log_title">فعال کردن ورود</string>
<string name="prefs_log_summary">این برای مشکلات ورود استفاده شده است.</string>
<string name="prefs_log_title_history">تاریخچه ورود</string>
<string name="foreign_files_fail">بعضی از فایل ها نمی توانند انتقال یابند</string>
<string name="foreign_files_local_text">محلی: %1$s</string>
<string name="foreign_files_remote_text">دور از دسترس: %1$s</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="media_notif_ticker">%1$s پخش کننده موسیقی</string>
<string name="media_state_playing">%1$s ( در حال پخش موسیقی )</string>
<string name="media_state_loading">%1$s (درحال بارگذاری)</string>
</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">Kaikki tiedostot</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Asetukset</string>
+ <string name="drawer_item_logs">Lokit</string>
+ <string name="drawer_close">Sulje</string>
<string name="prefs_category_general">Yleiset</string>
<string name="prefs_category_more">Enemmän</string>
<string name="prefs_accounts">Tilit</string>
<string name="prefs_manage_accounts">Tilien hallinta</string>
- <string name="prefs_pincode">Sovelluksen PIN-koodi</string>
- <string name="prefs_pincode_summary">Suojaa asiakasohjelmasi</string>
+ <string name="prefs_passcode">Suojakoodilukitus</string>
<string name="prefs_instant_upload">Kuvien välitön lähetys</string>
<string name="prefs_instant_upload_summary">Lähetä kameralla otetut kuvat välittömästi</string>
<string name="prefs_instant_video_upload">Välittömät videolähetykset</string>
<string name="prefs_help">Ohje</string>
<string name="prefs_recommend">Suosittele kaverille</string>
<string name="prefs_feedback">Palaute</string>
+ <string name="prefs_imprint">Tiedot</string>
<string name="prefs_remember_last_share_location">Muista jaon sijainti</string>
<string name="prefs_remember_last_upload_location_summary">Muista viimeisin jaon lähetyssijainti</string>
<string name="recommend_subject">Kokeile %1$sia älypuhelimellasi!</string>
<string name="filedetails_download">Lataa</string>
<string name="filedetails_sync_file">Päivitä tiedosto</string>
<string name="filedetails_renamed_in_upload_msg">Tiedoston nimeksi muutettiin %1$s siirron yhteydessä</string>
+ <string name="list_layout">Luettelon asettelu</string>
<string name="action_share_file">Jaa linkki</string>
<string name="action_unshare_file">Poista linkin jako</string>
<string name="common_yes">Kyllä</string>
<string name="foreign_files_fail">Joidenkin tiedostojen siirtäminen epäonnistui</string>
<string name="foreign_files_local_text">Paikallinen: %1$s</string>
<string name="foreign_files_remote_text">Etä: %1$s</string>
- <string name="pincode_enter_pin_code">Aseta sovelluksesi PIN</string>
- <string name="pincode_configure_your_pin">Anna sovelluksen PIN</string>
- <string name="pincode_configure_your_pin_explanation">PIN kysytään joka kerta, kun sovellus käynnistetään</string>
- <string name="pincode_reenter_your_pincode">Anna sovelluksen PIN uudestaan</string>
- <string name="pincode_remove_your_pincode">Poista sovelluksen PIN</string>
- <string name="pincode_mismatch">Sovelluksen PIN-koodit eivät täsmää</string>
- <string name="pincode_wrong">Väärä sovelluksen PIN</string>
- <string name="pincode_removed">Sovelluksen PIN poistettu</string>
- <string name="pincode_stored">Sovelluksen PIN-koodi tallennettu</string>
+ <string name="pass_code_enter_pass_code">Anna suojakoodisi</string>
+ <string name="pass_code_configure_your_pass_code">Anna suojakoodisi</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Suojakoodi kysytään joka kerta, kun sovellus käynnistetään</string>
+ <string name="pass_code_reenter_your_pass_code">Anna suojakoodi uudelleen</string>
+ <string name="pass_code_remove_your_pass_code">Poista suojakoodi käytöstä</string>
+ <string name="pass_code_mismatch">Suojakoodit eivät täsmää</string>
+ <string name="pass_code_wrong">Virheellinen suojakoodi</string>
+ <string name="pass_code_removed">Suojakoodi poistettu</string>
+ <string name="pass_code_stored">Suojakoodi tallennettu</string>
<string name="media_notif_ticker">%1$s-musiikkisoitin</string>
<string name="media_state_playing">%1$s (toistetaan)</string>
<string name="media_state_loading">%1$s (ladataan)</string>
<string name="sync_file_nothing_to_do_msg">Tiedoston sisältö on jo synkronoitu</string>
<string name="create_dir_fail_msg">Kansion luominen epäonnistui</string>
<string name="filename_forbidden_characters">Kielletyt merkit: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Tiedoston nimi sisältää ainakin yhden virheellisen merkin</string>
<string name="filename_empty">Tiedoston nimi ei voi olla tyhjä</string>
<string name="wait_a_moment">Odota hetki</string>
<string name="filedisplay_unexpected_bad_get_content">Odottamaton ongelma; kokeile valita tiedosto toisella sovelluksella</string>
<string name="filedisplay_no_file_selected">Tiedostoa ei valittu</string>
<string name="activity_chooser_title">Lähetä linkki…</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Kopioidaan tiedostoa yksityisestä tallennustilasta</string>
<string name="oauth_check_onoff">Kirjaudu oAuth2:lla</string>
<string name="oauth_login_connection">Yhdistetään oAuth2-palvelimeen…</string>
<string name="ssl_validator_header">Sivuston identiteetin vahvistaminen ei onnistunut</string>
<string name="ssl_validator_no_info_about_error">- Ei lisätietoja virheestä</string>
<string name="placeholder_filetype">PNG-kuva</string>
<string name="placeholder_filesize">389 kt</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Lähetä kuvat vain WiFi-verkossa</string>
<string name="instant_video_upload_on_wifi">Lähetä videot vain wifi-yhteydellä</string>
<string name="instant_upload_path">/InstantUpload</string>
<string name="prefs_instant_upload_path_title">Lähetyspolku</string>
<string name="share_link_no_support_share_api">Jakaminen ei ole käytössä palvelimellasi. Ota yhteys
ylläpitäjään.</string>
+ <string name="share_link_file_no_exist">Jakaminen epäonnistui. Varmista, että tiedosto on olemassa</string>
<string name="share_link_file_error">Virhe tiedoston tai kansion jakamista yrittäessä</string>
<string name="share_link_password_title">Anna salasana</string>
<string name="share_link_empty_password">Salasana on pakko antaa</string>
<string name="actionbar_logger">Lokit</string>
<string name="log_send_history_button">Lähetä historia</string>
<string name="log_send_no_mail_app">Lokien lähettämistä varten ei löytynyt sovellusta. Asenna sähköpostisovellus!</string>
+ <string name="log_send_mail_subject">%1$sin Android-sovelluksen lokit</string>
<string name="log_progress_dialog_text">Ladataan tietoja…</string>
<string name="saml_authentication_required_text">Tunnistautuminen vaaditaan</string>
<string name="saml_authentication_wrong_pass">Väärä salasana</string>
<string name="move_file_error">Tämän tiedoston tai kansion siirtoa yrittäessä tapahtui virhe</string>
<string name="prefs_category_instant_uploading">Välittömät lähetykset</string>
<string name="prefs_category_security">Tietoturva</string>
+ <string name="shared_subject_header">jaettu</string>
+ <string name="with_you_subject_header">kanssasi</string>
<string name="subject_token">%1$s jakoi kohteen \"%2$s\" kanssasi</string>
<string name="auth_refresh_button">Päivitä yhteys</string>
<string name="auth_host_address">Palvelimen osoite</string>
+ <string name="common_error_out_memory">Muistia ei ole riittävästi</string>
+ <string name="username">Käyttäjätunnus</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
</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">Tous les fichiers</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Paramètres</string>
+ <string name="drawer_item_logs">Logs</string>
+ <string name="drawer_close">Fermer</string>
<string name="prefs_category_general">Général</string>
<string name="prefs_category_more">Plus</string>
<string name="prefs_accounts">Comptes</string>
<string name="prefs_manage_accounts">Gestion des comptes</string>
- <string name="prefs_pincode">Code de sécurité</string>
- <string name="prefs_pincode_summary">Protéger l\'accès à l\'application</string>
+ <string name="prefs_passcode">Code de sécurité</string>
<string name="prefs_instant_upload">Téléversement immédiat des photos</string>
<string name="prefs_instant_upload_summary">Téléverser immédiatement les photos prises par la caméra</string>
<string name="prefs_instant_video_upload">Téléversement immédiat des vidéos</string>
<string name="prefs_help">Aide</string>
<string name="prefs_recommend">Recommander à un ami</string>
<string name="prefs_feedback">Commentaires</string>
- <string name="prefs_imprint">Mentions légales</string>
+ <string name="prefs_imprint">Mentions</string>
<string name="prefs_remember_last_share_location">Mémoriser l\'emplacement de partage</string>
<string name="prefs_remember_last_upload_location_summary">Mémoriser le dernier emplacement de téléversement</string>
<string name="recommend_subject">Essayez %1$s sur votre smartphone !</string>
<string name="sync_string_files">Fichiers</string>
<string name="setup_btn_connect">Connecter</string>
<string name="uploader_btn_upload_text">Téléverser</string>
- <string name="uploader_btn_new_folder_text">Créer un dossier</string>
+ <string name="uploader_btn_new_folder_text">Nouveau dossier</string>
<string name="uploader_top_message">Sélectionner le dossier d\'envoi :</string>
<string name="uploader_wrn_no_account_title">Aucun compte n\'a été trouvé</string>
<string name="uploader_wrn_no_account_text">Aucun compte %1$s n\'a été trouvé. Veuillez commencer par en configurer un.</string>
<string name="filedetails_download">Télécharger</string>
<string name="filedetails_sync_file">Actualiser le fichier</string>
<string name="filedetails_renamed_in_upload_msg">Le fichier a été renommé en %s pendant le téléversement</string>
+ <string name="list_layout">Affichage en liste</string>
<string name="action_share_file">Partager le lien</string>
<string name="action_unshare_file">Ne plus partager ce lien</string>
<string name="common_yes">Oui</string>
<string name="sync_fail_in_favourites_content">Le contenu de %1$d fichiers n\'a pu être synchronisé (%2$d conflits)</string>
<string name="sync_foreign_files_forgotten_ticker">Certains fichiers locaux ont été oubliés</string>
<string name="sync_foreign_files_forgotten_content">%1$d fichiers du dossier %2$s n\'ont pas pu être copiés dans</string>
- <string name="sync_foreign_files_forgotten_explanation">Depuis la version 1.3.16, les fichiers envoyés depuis ce périphérique sont copiés dans le dossier local %1$s pour éviter une perte de données lorsqu\'un même fichier est synchronisé avec plusieurs comptes.
+ <string name="sync_foreign_files_forgotten_explanation">Depuis la version 1.3.16, les fichiers envoyés depuis cet appareil sont copiés dans le dossier local %1$s pour éviter une perte de données lorsqu\'un même fichier est synchronisé avec plusieurs comptes.
En raison de cette modification, tous les fichiers envoyés avec des versions antérieures de cette application ont été copiés dans le dossier %2$s. Cependant, une erreur a empêché l\'achèvement de cette opération pendant la synchronisation du compte. Vous pouvez soit laisser les fichiers tels quels et supprimer le lien vers %3$s, soit déplacer les fichiers dans le dossier %1$s et garder le lien vers %4$s.
<string name="foreign_files_local_text">Local : %1$s</string>
<string name="foreign_files_remote_text">Distant : %1$s</string>
<string name="upload_query_move_foreign_files">Il n\'y a pas assez de place disponible pour copier les fichiers sélectionnés dans le dossier %1$s. Voulez-vous les déplacer à la place ?</string>
- <string name="pincode_enter_pin_code">Veuillez saisir votre code de sécurité</string>
- <string name="pincode_configure_your_pin">Veuillez saisir votre code de sécurité </string>
- <string name="pincode_configure_your_pin_explanation">Le code de sécurité vous sera demandé à chaque lancement de l\'application</string>
- <string name="pincode_reenter_your_pincode">Veuillez saisir de nouveau votre code de sécurité</string>
- <string name="pincode_remove_your_pincode">Retirer le code de sécurité</string>
- <string name="pincode_mismatch">Les deux codes saisis ne concordent pas</string>
- <string name="pincode_wrong">Code de sécurité incorrect</string>
- <string name="pincode_removed">Code de sécurité retiré</string>
- <string name="pincode_stored">Code de sécurité enregistré</string>
+ <string name="pass_code_enter_pass_code">Veuillez saisir votre code de sécurité</string>
+ <string name="pass_code_configure_your_pass_code">Saisissez votre code de sécurité</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Le code de sécurité sera demandé à chaque ouverture de l\'application</string>
+ <string name="pass_code_reenter_your_pass_code">Veuillez à nouveau saisir votre code de sécurité</string>
+ <string name="pass_code_remove_your_pass_code">Supprimer votre code de sécurité</string>
+ <string name="pass_code_mismatch">Les codes de sécurité ne sont pas identiques</string>
+ <string name="pass_code_wrong">Code de sécurité incorrect</string>
+ <string name="pass_code_removed">Code de sécurité supprimé</string>
+ <string name="pass_code_stored">Code de sécurité enregistré</string>
<string name="media_notif_ticker">%1$s lecteur de musique</string>
<string name="media_state_playing">%1$s (lecture)</string>
<string name="media_state_loading">%1$s (chargement)</string>
<string name="auth_connection_established">Connexion établie</string>
<string name="auth_testing_connection">Test de connexion</string>
<string name="auth_not_configured_title">Configuration du serveur erronée</string>
- <string name="auth_account_not_new">Un compte pour les même utilisateur et serveur existe déjà sur cet appareil</string>
+ <string name="auth_account_not_new">Un compte pour les mêmes utilisateur et serveur existe déjà sur cet appareil</string>
<string name="auth_account_not_the_same">L\'utilisateur entré ne correspond pas à l\'utilisateur de ce compte</string>
<string name="auth_unknown_error_title">Une erreur inconnue s\'est produite.</string>
<string name="auth_unknown_host_title">Impossible de trouver l\'hôte</string>
<string name="sync_file_nothing_to_do_msg">Le contenu du fichier est déjà synchronisé</string>
<string name="create_dir_fail_msg">Le dossier n\'a pas pu être créé</string>
<string name="filename_forbidden_characters">Caractères interdits : / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Le nom de fichier contient au moins un caractère non valide</string>
<string name="filename_empty">Le nom du fichier ne peut pas être vide</string>
<string name="wait_a_moment">Veuillez patienter</string>
<string name="filedisplay_unexpected_bad_get_content">Problème inattendu. Veuillez essayer une autre application pour la sélection du fichier</string>
<string name="filedisplay_no_file_selected">Aucun fichier sélectionné</string>
<string name="activity_chooser_title">Envoyer le lien vers…</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Copie du fichier depuis le stockage privé</string>
<string name="oauth_check_onoff">Connexion avec oAuth2</string>
<string name="oauth_login_connection">Connexion au serveur oAuth2…</string>
<string name="ssl_validator_header">L\'identité du site ne peut être vérifiée</string>
<string name="prefs_category_instant_uploading">Téléversement immédiat</string>
<string name="prefs_category_security">Sécurité</string>
<string name="prefs_instant_video_upload_path_title">Répertoire de téléversement des vidéos</string>
- <string name="download_folder_failed_content">Le téléchargement du dossier %1$s n\'a pas pu être achevé</string>
+ <string name="download_folder_failed_content">Le téléchargement de %1$s dossier(s) n\'a pas pu être achevé</string>
+ <string name="shared_subject_header">partagé</string>
+ <string name="with_you_subject_header">avec vous</string>
<string name="subject_token">%1$s a partagé \"%2$s\" avec vous</string>
<string name="auth_refresh_button">Actualiser la connexion</string>
<string name="auth_host_address">Adresse du serveur</string>
+ <string name="common_error_out_memory">Mémoire insuffisante</string>
+ <string name="username">Nom d\'utilisateur</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
</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">Todos os ficheiros</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Axustes</string>
+ <string name="drawer_item_logs">Rexistros</string>
+ <string name="drawer_close">Pechar</string>
<string name="prefs_category_general">Xeral</string>
<string name="prefs_category_more">Máis</string>
<string name="prefs_accounts">Contas</string>
<string name="prefs_manage_accounts">Administrar as contas</string>
- <string name="prefs_pincode">PIN da aplicación</string>
- <string name="prefs_pincode_summary">Protexa o seu cliente</string>
+ <string name="prefs_passcode">Código de bloqueo</string>
<string name="prefs_instant_upload">Envío instantáneo de fotos</string>
<string name="prefs_instant_upload_summary">Enviar instantaneamente as fotos tiradas coa cámara</string>
<string name="prefs_instant_video_upload">Envío instantáneo de vídeos</string>
<string name="filedetails_download">Descargar</string>
<string name="filedetails_sync_file">Actualizar o ficheiro</string>
<string name="filedetails_renamed_in_upload_msg">O ficheiro foi renomeado a %1$s durante o envío</string>
+ <string name="list_layout">Deseño da lista</string>
<string name="action_share_file">Ligazón para compartir</string>
<string name="action_unshare_file">Deixar de compartir a ligazón</string>
<string name="common_yes">Si</string>
<string name="foreign_files_local_text">Local: %1$s</string>
<string name="foreign_files_remote_text">Remoto: %1$s</string>
<string name="upload_query_move_foreign_files">Non hai espazo abondo para copiar os ficheiros seleccionados no cartafol %1$s. Quere movelos no canto de copialos?</string>
- <string name="pincode_enter_pin_code">Insira o seu PIN da aplicación</string>
- <string name="pincode_configure_your_pin">Introduza o seu PIN da aplicación</string>
- <string name="pincode_configure_your_pin_explanation">Pediráselle o PIN cada vez que se inicie a aplicación</string>
- <string name="pincode_reenter_your_pincode">Volva a introducir o seu PIN da aplicación</string>
- <string name="pincode_remove_your_pincode">Retirar o seu PIN da aplicación</string>
- <string name="pincode_mismatch">Os PIN da aplicación non son iguais</string>
- <string name="pincode_wrong">O PIN da aplicación é incorrecto</string>
- <string name="pincode_removed">O PIN da aplicación foi retirado</string>
- <string name="pincode_stored">Almacenouse o PIN da aplicación</string>
+ <string name="pass_code_enter_pass_code">Introduza o seu código de acceso</string>
+ <string name="pass_code_configure_your_pass_code">Escriba o seu código de acceso</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Solicitaráselle o código de acceso cada vez que inicie a aplicación</string>
+ <string name="pass_code_reenter_your_pass_code">Volva escribir o seu código de acceso</string>
+ <string name="pass_code_remove_your_pass_code">Retirar o seu código de acceso</string>
+ <string name="pass_code_mismatch">Os códigos de acceso non son iguais</string>
+ <string name="pass_code_wrong">Código de acceso incorrecto</string>
+ <string name="pass_code_removed">Retirouse o código de acceso</string>
+ <string name="pass_code_stored">O código de acceso foi almacenado</string>
<string name="media_notif_ticker">%1$s reprodutor musical</string>
<string name="media_state_playing">%1$s (reproducindo)</string>
<string name="media_state_loading">%1$s (cargando)</string>
<string name="media_err_timeout">Esgotouse o tempo de espera tentando reproducir</string>
<string name="media_err_invalid_progressive_playback">Non é posíbel enviar como fluxo o ficheiro multimedia</string>
<string name="media_err_unknown">Non é posíbel reproducir o ficheiro multimedia co reprodutor «stock»</string>
- <string name="media_err_security_ex">Produciuse un erro de seguranza tentando reproducir %1$s</string>
+ <string name="media_err_security_ex">Produciuse un erro de seguridade tentando reproducir %1$s</string>
<string name="media_err_io_ex">Produciuse un erro de entrada tentando reproducir %1$s</string>
<string name="media_err_unexpected">Produciuse un erro non agardado tentando reproducir %1$s</string>
<string name="media_rewind_description">Botón de retroceso</string>
<string name="sync_file_nothing_to_do_msg">Os contidos do ficheiro xa están sincronizados</string>
<string name="create_dir_fail_msg">Non foi posíbel crear o cartafol</string>
<string name="filename_forbidden_characters">Caracteres non permitidos: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">O nome de ficheiro contén algún carácter incorrecto</string>
<string name="filename_empty">O nome de ficheiro non pode estar baleiro</string>
<string name="wait_a_moment">Agarde un chisco</string>
<string name="filedisplay_unexpected_bad_get_content">Produciuse un erro non agardado. Seleccione o ficheiro con outra aplicación diferente</string>
<string name="filedisplay_no_file_selected">Non se escolleu ningún ficheiro</string>
<string name="activity_chooser_title">Enviar a ligazón a ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Copiando o ficheiro desde o almacenamento privado</string>
<string name="oauth_check_onoff">Acceder con oAuth2</string>
<string name="oauth_login_connection">Conectando co servidor oAuth2…</string>
<string name="ssl_validator_header">Non foi posíbel verificar a identidade do sitio</string>
<string name="move_file_error">Produciuse un erro ao tentar mover este ficheiro ou cartafol.</string>
<string name="forbidden_permissions_move">para mover este ficheiro</string>
<string name="prefs_category_instant_uploading">Envío instantáneo</string>
- <string name="prefs_category_security">Seguranza</string>
+ <string name="prefs_category_security">Seguridade</string>
<string name="prefs_instant_video_upload_path_title">Enviar a ruta do vídeo</string>
<string name="download_folder_failed_content">Non foi posíbel completar a descarga do cartafol %1$s</string>
+ <string name="shared_subject_header">compartido</string>
+ <string name="with_you_subject_header">con vostede</string>
<string name="subject_token">%1$s compartiu «%2$s» con vostede</string>
<string name="auth_refresh_button">Actualizar a conexión</string>
<string name="auth_host_address">Enderezo do servidor</string>
+ <string name="common_error_out_memory">Non hai memoria abondo</string>
+ <string name="username">Nome de usuario</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_send_file">שליחה</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="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">קוד יישום</string>
- <string name="prefs_pincode_summary">הגנה על הלקוח שלך</string>
<string name="prefs_instant_upload">העלאת תמונות מהירה</string>
<string name="prefs_instant_upload_summary">העלאה מהירה של תמונות שצולמו במצלמה</string>
<string name="prefs_instant_video_upload">העלאת סרטים מהירה</string>
<string name="foreign_files_local_text">מקומי: %1$s</string>
<string name="foreign_files_remote_text">מרוחק: %1$s</string>
<string name="upload_query_move_foreign_files">אין מספיק מקום להעתקת הקבצים שנבחרו אל תיקיית %1$s . האם להעביר אותם במקום?</string>
- <string name="pincode_enter_pin_code">נא להזין את קוד היישום שלך</string>
- <string name="pincode_configure_your_pin">נא להזין את קוד היישום שלך</string>
- <string name="pincode_configure_your_pin_explanation">תופיע בקשה לקוד בכל פעם שהיישום מופעל</string>
- <string name="pincode_reenter_your_pincode">נא להזין את קוד היישום שלך מחדש</string>
- <string name="pincode_remove_your_pincode">הסרת קוד היישום שלך</string>
- <string name="pincode_mismatch">הקודים של היישום שונים</string>
- <string name="pincode_wrong">קוד היישום שגוי</string>
- <string name="pincode_removed">קוד היישום הוסר</string>
- <string name="pincode_stored">קוד היישום אוחסן</string>
<string name="media_notif_ticker">נגנן המוזיקה %1$s</string>
<string name="media_state_playing">%1$s (מתנגן)</string>
<string name="media_state_loading">%1$s (בטעינה)</string>
<string name="actionbar_send_file">भेजें</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">सामान्य </string>
<string name="prefs_category_more">और अधिक</string>
<string name="prefs_accounts">खाते </string>
- <string name="prefs_pincode">एप्प पिन </string>
- <string name="prefs_pincode_summary">अपने उपभोक्ता की सुरक्षा करें </string>
<string name="prefs_help">सहायता </string>
<string name="auth_username">उपभोक्ता का नाम</string>
<string name="auth_password">पासवर्ड</string>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Općenito</string>
<string name="prefs_category_more">više</string>
<string name="prefs_accounts">Korisnićki računi</string>
<string name="prefs_manage_accounts">Upravljaj računima</string>
- <string name="prefs_pincode">PIN aplikacije</string>
- <string name="prefs_pincode_summary">Zaštit svog klijenta</string>
<string name="prefs_instant_upload">Trenutni upload slika</string>
<string name="prefs_instant_upload_summary">Trenutni upload slika snimljenih kamerom</string>
<string name="prefs_instant_video_upload">Trenutni upload videa</string>
<string name="actionbar_send_file">Küldjük el</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Általános</string>
<string name="prefs_category_more">Több</string>
<string name="prefs_accounts">Fiókok</string>
<string name="prefs_manage_accounts">Fiókok kezelése</string>
- <string name="prefs_pincode">Alkalmazás PIN</string>
- <string name="prefs_pincode_summary">Védje meg az alkalmazást</string>
<string name="prefs_instant_upload">Azonnali képfeltöltések</string>
<string name="prefs_instant_upload_summary">Kamera által készítette képek azonnali feltöltése</string>
<string name="prefs_instant_video_upload">Azonnali video feltöltések</string>
<string name="foreign_files_local_text">Helyi: %1$s</string>
<string name="foreign_files_remote_text">Távoli: %1$s</string>
<string name="upload_query_move_foreign_files">Nincs elég hely a kiválasztott fájlok másolására a %1$s könyvtárban. Szeretnéd áthelyezni inkább?</string>
- <string name="pincode_enter_pin_code">Kérem adja meg az alkalmazás PIN-kódját</string>
- <string name="pincode_configure_your_pin">Az alkalmazás PIN-kódja</string>
- <string name="pincode_configure_your_pin_explanation">A PIN-t kötelező lesz megadni az alkalmazás minden indításakor</string>
- <string name="pincode_reenter_your_pincode">Kérem, adja meg újra az alkalmazás PIN-kódját</string>
- <string name="pincode_remove_your_pincode">Az alkalmazás PIN-kódjának eltávolítása</string>
- <string name="pincode_mismatch">A megadott PIN-ek nem egyeznek meg</string>
- <string name="pincode_wrong">Rossz a megadott PIN</string>
- <string name="pincode_removed">Az alkalmazás PIN-ját eltávolítottuk</string>
- <string name="pincode_stored">Az alkalmazás PIN-jét eltároltuk</string>
<string name="media_notif_ticker">%1$s zene lejátszó</string>
<string name="media_state_playing">%1$s (lejátszás)</string>
<string name="media_state_loading">%1$s (betöltés)</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="filedetails_download">Բեռնել</string>
<string name="empty"></string>
</resources>
<string name="actionbar_send_file">Invia</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Plus</string>
<string name="prefs_accounts">Contos</string>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Umum</string>
<string name="prefs_category_more">Lainnya</string>
<string name="prefs_accounts">Akun</string>
<string name="prefs_manage_accounts">Kelola Akun</string>
- <string name="prefs_pincode">PIN Apl</string>
- <string name="prefs_pincode_summary">Lindungi klien Anda</string>
+ <string name="prefs_passcode">Kunci kode sandi</string>
<string name="prefs_instant_upload">Unggah gambar cepat</string>
<string name="prefs_instant_upload_summary">Unggah gambar yang diambil kamera dengan cepat</string>
<string name="prefs_instant_video_upload">Unggah video cepat</string>
<string name="sync_fail_in_favourites_content">Konten berkas %1$d tidak dapat disinkronasikan (%2$d konflik)</string>
<string name="sync_foreign_files_forgotten_ticker">Beberapa berkas lokal terlupakan</string>
<string name="sync_foreign_files_forgotten_content">%1$d berkas diluar folder %2$s tidak dapat disalin kedalamnya</string>
- <string name="sync_foreign_files_forgotten_explanation">Sejak versi 1.3.16, berkas-berkas yang diunggah dari piranti ini akan disalin kedalam folder %1$s lokal untuk mencagah kehilangan data saat berkas tunggal disinkronkan dengan akun lebih dari satu.\n\nAkibat perubahan ini, semua berkas yang diunggah di versi aplikasi sebelumnya disalin kedalam folder %2$s. Namun, sebuah kesalahan mencegah penyelesaian operasi ini saat sinkronisasi akun. Anda boleh meninggalkan berkas seperti ini dan menghapus tautan ke %3$s atau memindahkan berkas kedalam folder %1$s dan membiarkan tautan ke %4$s.\n\nYang tampak dibawah adalah berkas lokal, dan berkas remote didalam %5$s yang dihubungkan dengannya.</string>
+ <string name="sync_foreign_files_forgotten_explanation">Sejak versi 1.3.16, berkas-berkas yang diunggah dari perangkat ini akan disalin kedalam folder %1$s lokal untuk mencagah kehilangan data saat berkas tunggal disinkronkan dengan akun lebih dari satu.\n\nAkibat perubahan ini, semua berkas yang diunggah di versi aplikasi sebelumnya disalin kedalam folder %2$s. Namun, sebuah kesalahan mencegah penyelesaian operasi ini saat sinkronisasi akun. Anda boleh meninggalkan berkas seperti ini dan menghapus tautan ke %3$s atau memindahkan berkas kedalam folder %1$s dan membiarkan tautan ke %4$s.\n\nYang tampak dibawah adalah berkas lokal, dan berkas remote didalam %5$s yang dihubungkan dengannya.</string>
<string name="sync_current_folder_was_removed">Folder %1$s tidak ada lagi</string>
<string name="foreign_files_move">Pindahkan semua</string>
<string name="foreign_files_success">Semua berkas sudah dipindahkan</string>
<string name="foreign_files_local_text">Lokal: %1$s</string>
<string name="foreign_files_remote_text">Jauh: %1$s</string>
<string name="upload_query_move_foreign_files">Ruang tidak cukup untuk menyalin berkas terpilih kedalam folder %1$s. Apakah Anda ingin memindahkannya saja?</string>
- <string name="pincode_enter_pin_code">Silakan masukkan PIN Apl</string>
- <string name="pincode_configure_your_pin">Masukkan PIN Apl</string>
- <string name="pincode_configure_your_pin_explanation">PIN akan selalu diminta setiap kali apl dijalankan</string>
- <string name="pincode_reenter_your_pincode">Silakan masukkan ulang PIN Apl</string>
- <string name="pincode_remove_your_pincode">Hapus PIN Apl</string>
- <string name="pincode_mismatch">PIN Apl tidak sama</string>
- <string name="pincode_wrong">PIN Apl salah</string>
- <string name="pincode_removed">PIN Apl dihapus</string>
- <string name="pincode_stored">PIN Apl disimpan</string>
+ <string name="pass_code_enter_pass_code">Silakan masukkan kode sandi Anda</string>
+ <string name="pass_code_configure_your_pass_code">Masukkan kode sandi Anda</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Kode sandi akan diminta setiap kali apl dijalankan.</string>
+ <string name="pass_code_reenter_your_pass_code">Silakan masukkan ulang kode sandi Anda</string>
+ <string name="pass_code_remove_your_pass_code">Hapus kode sandi Anda</string>
+ <string name="pass_code_mismatch">Kode sandi tidak sama</string>
+ <string name="pass_code_wrong">Kode sandi salah</string>
+ <string name="pass_code_removed">Kode sandi dihapus</string>
+ <string name="pass_code_stored">Kode sandi disimpan</string>
<string name="media_notif_ticker">Pemutar musik %1$s</string>
<string name="media_state_playing">%1$s (dimainkan)</string>
<string name="media_state_loading">%1$s (sedang dimuat)</string>
<string name="auth_no_net_conn_title">Tidak ada koneksi internet</string>
<string name="auth_nossl_plain_ok_title">Sambungan aman tidak tersedia</string>
<string name="auth_connection_established">Sambungan dibuat</string>
+ <string name="auth_testing_connection">Mencoba sambungan</string>
<string name="auth_not_configured_title">Konfigurasi server cacat</string>
<string name="auth_account_not_new">Akun untuk pengguna dan server yang sama sudah ada dalam perangkat</string>
<string name="auth_account_not_the_same">Pengguna yang dimasukkan tidak cocok dengan pengguna akun ini</string>
<string name="auth_fail_get_user_name">Server Anda tidak membalas id pengguna dengan banar, Sialakn hubungi Administrator
</string>
<string name="auth_can_not_auth_against_server">Tidak dapat mengotentikasi pada server ini</string>
+ <string name="auth_account_does_not_exist">Akun tidak ada di perangkat ini</string>
<string name="fd_keep_in_sync">Biarkan berkas tetap terbaru</string>
<string name="common_rename">Ubah nama</string>
<string name="common_remove">Hapus</string>
<string name="filedisplay_unexpected_bad_get_content">Masalah tidak terduga, silahkan pilih berkas dari apl yang berbeda</string>
<string name="filedisplay_no_file_selected">Tidak ada berkas yang terpilih</string>
<string name="activity_chooser_title">Kirim taukan ke</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Menyalin berkas dari penyimpanan pribadi</string>
<string name="oauth_check_onoff">Masuk dengan oAuth2</string>
<string name="oauth_login_connection">Menyambungkan ke server oAuth2...</string>
<string name="ssl_validator_header">Identitas situs tidak dapat diverfikasi</string>
<string name="share_link_file_error">Terjadi kesalahan saat mencoba membagikan berkas atau folder ini</string>
<string name="unshare_link_file_no_exist">Tidak dapat menghapus berbagi. Mohon periksa apakah berkas ada</string>
<string name="unshare_link_file_error">Terjadi kesalahan saat mencoba menghapus berbagi berkas dan folder ini</string>
+ <string name="share_link_password_title">Masukkan sandi</string>
+ <string name="share_link_empty_password">Anda harus memasukkan sandi</string>
<string name="activity_chooser_send_file_title">Kirim</string>
<string name="copy_link">Salin tautan</string>
<string name="clipboard_text_copied">Disalin ke papan klip</string>
<string name="auth_redirect_non_secure_connection_title">Sambungan aman dialihkan ke rute yang tidak aman.</string>
<string name="actionbar_logger">Log</string>
<string name="log_send_history_button">Kirim Riwayat</string>
+ <string name="log_send_no_mail_app">Tidak ada apl untuk mengirim log. Instal apl mail!</string>
+ <string name="log_send_mail_subject">%1$s Android apl log</string>
+ <string name="log_progress_dialog_text">Memuat data...</string>
<string name="saml_authentication_required_text">Diperlukan otentikasi</string>
<string name="saml_authentication_wrong_pass">Sandi salah</string>
<string name="actionbar_move">Pindah</string>
<string name="forbidden_permissions_move">untuk memindahkan berkas ini</string>
<string name="prefs_category_instant_uploading">Unggah Cepat</string>
<string name="prefs_category_security">Keamanan</string>
+ <string name="prefs_instant_video_upload_path_title">Unggah Lokasi Video</string>
+ <string name="download_folder_failed_content">Mengunduh folder %1$s tidak selesai</string>
+ <string name="auth_refresh_button">Menyegarkan sambungan</string>
<string name="auth_host_address">Alamat server</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_send_file">Senda</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_more">Meira</string>
<string name="prefs_help">Hjálp</string>
<string name="auth_username">Notendanafn</string>
</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">Tutti i file</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Impostazioni</string>
+ <string name="drawer_item_logs">Registri</string>
+ <string name="drawer_close">Chiudi</string>
<string name="prefs_category_general">Generale</string>
<string name="prefs_category_more">Altro</string>
<string name="prefs_accounts">Account</string>
<string name="prefs_manage_accounts">Gestisci account</string>
- <string name="prefs_pincode">PIN App</string>
- <string name="prefs_pincode_summary">Proteggi il tuo client l\'applicazione</string>
+ <string name="prefs_passcode">Blocco con codice di sicurezza</string>
<string name="prefs_instant_upload">Caricamenti istantanei delle foto</string>
<string name="prefs_instant_upload_summary">Carica immediatamente le foto dalla fotocamera</string>
<string name="prefs_instant_video_upload">Caricamenti istantanei dei video</string>
<string name="filedetails_download">Scarica</string>
<string name="filedetails_sync_file">Aggiorna file</string>
<string name="filedetails_renamed_in_upload_msg">Il file è stato rinominato in %1$s durante il caricamento</string>
+ <string name="list_layout">Struttura elenco</string>
<string name="action_share_file">Condividi collegamento</string>
<string name="action_unshare_file">Rimuovi condivisione collegamento</string>
<string name="common_yes">Sì</string>
<string name="foreign_files_local_text">Locale: %1$s</string>
<string name="foreign_files_remote_text">Remoto %1$s</string>
<string name="upload_query_move_foreign_files">Non c\'è spazio sufficiente per copiare i file selezionati nella cartella %1$s. Vuoi invece spostarli?</string>
- <string name="pincode_enter_pin_code">Inserisci il PIN dell\'applicazione</string>
- <string name="pincode_configure_your_pin">Inserisci il PIN di l\'applicazione</string>
- <string name="pincode_configure_your_pin_explanation">Il PIN sarà richiesto ad ogni avvio dell\'applicazione</string>
- <string name="pincode_reenter_your_pincode">Inserisci nuovamente il PIN di l\'applicazione</string>
- <string name="pincode_remove_your_pincode">Rimuovi il PIN di l\'applicazione</string>
- <string name="pincode_mismatch">I PIN di l\'applicazione non corrispondono</string>
- <string name="pincode_wrong">PIN di l\'applicazione non corretto</string>
- <string name="pincode_removed">PIN di l\'applicazione rimosso</string>
- <string name="pincode_stored">PIN di l\'applicazione memorizzato</string>
+ <string name="pass_code_enter_pass_code">Digita il tuo codice segreto</string>
+ <string name="pass_code_configure_your_pass_code">Digita il tuo codice segreto</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Il codice segreto sarà richiesto ogni volta che l\'applicazione è avviata</string>
+ <string name="pass_code_reenter_your_pass_code">Digita nuovamente il tuo codice segreto</string>
+ <string name="pass_code_remove_your_pass_code">Rimuovi il tuo codice segreto</string>
+ <string name="pass_code_mismatch">I codici segreti non corrispondono</string>
+ <string name="pass_code_wrong">Codice segreto non corretto</string>
+ <string name="pass_code_removed">Codice segreto rimosso</string>
+ <string name="pass_code_stored">Codice segreto memorizzato</string>
<string name="media_notif_ticker">Lettore musicale %1$s</string>
<string name="media_state_playing">%1$s (in riproduzione)</string>
<string name="media_state_loading">%1$s (in caricamento)</string>
<string name="sync_file_nothing_to_do_msg">Contenuti del file già sincronizzati</string>
<string name="create_dir_fail_msg">La cartella non può essere creata</string>
<string name="filename_forbidden_characters">Caratteri proibiti: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Il nome del file contiene almeno un carattere non valido</string>
<string name="filename_empty">Il nome del file non può essere vuoto</string>
<string name="wait_a_moment">Attendi</string>
<string name="filedisplay_unexpected_bad_get_content">Problema inatteso; prova un\'altra applicazione per selezionare il file</string>
<string name="filedisplay_no_file_selected">Non è stato selezionato alcun file</string>
<string name="activity_chooser_title">Invia collegamento a...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Copia file dall\'archiviazione privata</string>
<string name="oauth_check_onoff">Accesso con oAuth2.</string>
<string name="oauth_login_connection">Connessione al server oAuth2 in corso...</string>
<string name="ssl_validator_header">L\'identità del sito non può essere verificata</string>
<string name="prefs_category_security">Protezione</string>
<string name="prefs_instant_video_upload_path_title">Percorso di caricamento video</string>
<string name="download_folder_failed_content">Lo scaricamento della cartella %1$s non può essere completato</string>
+ <string name="shared_subject_header">condiviso</string>
+ <string name="with_you_subject_header">con te</string>
<string name="subject_token">%1$s ha condiviso \"%2$s\" con te</string>
<string name="auth_refresh_button">Aggiorna la connessione</string>
<string name="auth_host_address">Indirizzo del server</string>
+ <string name="common_error_out_memory">Memoria insufficiente</string>
+ <string name="username">Nome utente</string>
</resources>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</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">アプリのパスワード</string>
- <string name="prefs_pincode_summary">クライアントを保護する</string>
+ <string name="prefs_passcode">パスコードロック</string>
<string name="prefs_instant_upload">自動画像アップロード</string>
<string name="prefs_instant_upload_summary">カメラで撮影した画像を自動アップロード</string>
<string name="prefs_instant_video_upload">自動動画アップロード</string>
<string name="foreign_files_local_text">ローカル: %1$s</string>
<string name="foreign_files_remote_text">リモート: %1$s</string>
<string name="upload_query_move_foreign_files">十分なスペースがないため、選択されたファイルを %1$s フォルダーにコピーすることができません。コピーする代わりに、それらを移動させますか?</string>
- <string name="pincode_enter_pin_code">アプリのパスワードを入力してください</string>
- <string name="pincode_configure_your_pin">アプリのパスワードを入力してください</string>
- <string name="pincode_configure_your_pin_explanation">アプリ開始時に毎回PINが要求されます。</string>
- <string name="pincode_reenter_your_pincode">アプリのパスワードを再入力してください</string>
- <string name="pincode_remove_your_pincode">アプリのパスワードを削除</string>
- <string name="pincode_mismatch">アプリのパスワードが一致しません</string>
- <string name="pincode_wrong">無効なアプリのパスワードです</string>
- <string name="pincode_removed">アプリのパスワードを削除しました</string>
- <string name="pincode_stored">アプリのパスワードを保存しました</string>
<string name="media_notif_ticker">%1$s ミュージックプレーヤー</string>
<string name="media_state_playing">%1$s (プレイ中)</string>
<string name="media_state_loading">%1$s (読込中)</string>
<string name="prefs_category_instant_uploading">自動アップロード</string>
<string name="prefs_category_security">セキュリティ</string>
<string name="prefs_instant_video_upload_path_title">動画のアップロードパス</string>
- <string name="download_folder_failed_content">%1$s のフォルダのダウンロードが完了しませんでした。</string>
- <string name="subject_token">%1$sがあなたと\"%2$s\"を共有しました</string>
+ <string name="download_folder_failed_content">%1$s フォルダーのダウンロードが完了しませんでした</string>
<string name="auth_refresh_button">再接続中</string>
<string name="auth_host_address">サーバーアドレス</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="filedetails_download">Njipuk</string>
<string name="empty"></string>
</resources>
<string name="actionbar_send_file">გაგზავნა</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="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">აპლიკაციის PIN–ი</string>
- <string name="prefs_pincode_summary">თქვენი კლიენტის დაცვა</string>
<string name="prefs_help">დახმარება</string>
<string name="prefs_feedback">უკუკავშირი</string>
<string name="prefs_imprint">ბეჭედი</string>
<string name="foreign_files_fail">რამოდენიმე ფაილის გადატანა ვერ მოხერხდა</string>
<string name="foreign_files_local_text">ლოკალური: %1$s</string>
<string name="foreign_files_remote_text">დაშორებული: %1$s</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_no_net_conn_title">ქსელური კავშირი არ არის</string>
<string name="auth_nossl_plain_ok_title">დაცული კავშირი არ არსებობს.</string>
<string name="auth_connection_established">კავშირი დამყარდა</string>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</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">ភីនកូដ កម្មវិធី</string>
<string name="prefs_log_title">ដំណើរការការចូលទៅកាន់</string>
<string name="prefs_log_summary">នេះជាបញ្ហាសម្រាប់អ្នកដែលបានចូលទៅកាន់</string>
<string name="prefs_log_title_history">ប្រវត្តិនៃការចូលទៅកាន់</string>
<string name="downloader_download_failed_ticker">ការទាញយកបានបរាជ័យ</string>
<string name="common_choose_account">ជ្រើសគណនី</string>
<string name="foreign_files_move">ផ្លាស់ទីទាំងអស់</string>
- <string name="pincode_enter_pin_code">សូម ដាក់បញ្ចូល App PIN របស់អ្នក</string>
- <string name="pincode_configure_your_pin">បញ្ចូល App PIN របស់អ្នក</string>
- <string name="pincode_reenter_your_pincode">សូម បញ្ចូល App PIN របស់អ្នកម្តងទៀត</string>
- <string name="pincode_remove_your_pincode">លុប App PIN របស់អ្នក</string>
- <string name="pincode_mismatch">App PIN ទាំងនេះមិនដូចគ្នាទេ</string>
- <string name="pincode_wrong">App PIN មិនត្រឹមត្រូវទេ</string>
- <string name="pincode_removed">App PIN បានលុបចេញហើយ</string>
- <string name="pincode_stored">App PIN បានយកមកវិញ</string>
<string name="auth_trying_to_login">កំពុងតែព្យាយាមដើម្បីចូល...</string>
<string name="auth_no_net_conn_title">គ្មានបណ្តាញតភ្ជាប់ទេ</string>
<string name="auth_unknown_error_title">មិនស្គាល់កំហុសបានកើតឡើង!</string>
<string name="actionbar_send_file">ಕಳುಹಿಸಿ</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_more">ಇನ್ನಷ್ಟು</string>
<string name="prefs_help">ಸಹಾಯ</string>
<string name="prefs_imprint">ಮುದ್ರೆ</string>
<resources>
<string name="about_android">%1$s 안드로이드 앱</string>
<string name="about_version">버전 %1$s</string>
- <string name="actionbar_sync">계정 새로고침</string>
+ <string name="actionbar_sync">계정 새로 고침</string>
<string name="actionbar_upload">업로드</string>
<string name="actionbar_upload_from_apps">다른 앱의 콘텐츠</string>
<string name="actionbar_upload_files">파일</string>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</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">앱 암호</string>
- <string name="prefs_pincode_summary">내 클라이언트 보호</string>
+ <string name="prefs_passcode">암호 잠금</string>
<string name="prefs_instant_upload">사진 즉시 업로드</string>
<string name="prefs_instant_upload_summary">카메라로 찍은 사진 즉시 업로드</string>
<string name="prefs_instant_video_upload">동영상 즉시 업로드</string>
<string name="foreign_files_local_text">로컬: %1$s</string>
<string name="foreign_files_remote_text">원격: %1$s</string>
<string name="upload_query_move_foreign_files">선택한 파일을 폴더 %1$s(으)로 복사할 공간이 부족합니다. 파일을 이동하시겠습니까?</string>
- <string name="pincode_enter_pin_code">앱 암호를 입력하십시오</string>
- <string name="pincode_configure_your_pin">앱 암호를 입력하십시오</string>
- <string name="pincode_configure_your_pin_explanation">앱을 시작할 때마다 암호를 물어봅니다</string>
- <string name="pincode_reenter_your_pincode">앱 암호를 다시 입력하십시오</string>
- <string name="pincode_remove_your_pincode">앱 암호 삭제</string>
- <string name="pincode_mismatch">앱 암호가 일치하지 않습니다</string>
- <string name="pincode_wrong">앱 암호가 잘못되었습니다</string>
- <string name="pincode_removed">앱 암호가 삭제되었습니다</string>
- <string name="pincode_stored">앱 암호가 저장되었습니다</string>
+ <string name="pass_code_enter_pass_code">암호를 입력하십시오</string>
+ <string name="pass_code_configure_your_pass_code">암호를 입력하십시오</string>
+ <string name="pass_code_configure_your_pass_code_explanation">앱을 시작할 때마다 암호를 물어봅니다</string>
+ <string name="pass_code_reenter_your_pass_code">암호를 다시 입력하십시오</string>
+ <string name="pass_code_remove_your_pass_code">내 암호 삭제</string>
+ <string name="pass_code_mismatch">암호가 일치하지 않습니다</string>
+ <string name="pass_code_wrong">암호가 잘못됨</string>
+ <string name="pass_code_removed">암호 삭제됨</string>
+ <string name="pass_code_stored">암호 저장됨</string>
<string name="media_notif_ticker">%1$s 음악 재생기</string>
<string name="media_state_playing">%1$s (재생 중)</string>
<string name="media_state_loading">%1$s (불러오는 중)</string>
<string name="auth_fail_get_user_name">서버에서 올바른 사용자 ID를 반환하지 않았습니다. 관리자에게 연락하십시오
</string>
<string name="auth_can_not_auth_against_server">이 서버에 인증할 수 없음</string>
- <string name="auth_account_does_not_exist">ì\9e¥ì¹\98ì\97\90 ì\95\84ì§\81 ê³\84ì \95ì\9d´ ì¡´ì\9e¬í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.</string>
+ <string name="auth_account_does_not_exist">ì\9e¥ì¹\98ì\97\90 ì\95\84ì§\81 ê³\84ì \95ì\9d´ ì\97\86ì\9d\8c</string>
<string name="fd_keep_in_sync">파일을 최신 정보로 유지</string>
<string name="common_rename">이름 바꾸기</string>
<string name="common_remove">삭제</string>
<string name="filedisplay_unexpected_bad_get_content">예상하지 못한 오류입니다. 다른 앱에서 파일을 선택하십시오</string>
<string name="filedisplay_no_file_selected">선택한 파일 없음</string>
<string name="activity_chooser_title">다음으로 링크 보내기...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">개인 저장소에서 파일 복사</string>
<string name="oauth_check_onoff">oAuth2로 로그인하기</string>
<string name="oauth_login_connection">oAuth2 서버에 연결 중...</string>
<string name="ssl_validator_header">사이트 인증서를 확인할 수 없습니다</string>
<string name="share_link_file_error">이 파일이나 폴더를 공유하는 중 오류 발생</string>
<string name="unshare_link_file_no_exist">공유를 해제할 수 없습니다. 파일이 있는지 확인하십시오</string>
<string name="unshare_link_file_error">이 파일이나 폴더의 공유를 해제하는 중 오류 발생</string>
- <string name="share_link_password_title">비밀번호를 입력하십시요.</string>
- <string name="share_link_empty_password">비밀번호를 입력해야만 합니다.</string>
+ <string name="share_link_password_title">암호 입력</string>
+ <string name="share_link_empty_password">암호를 입력해야 합니다</string>
<string name="activity_chooser_send_file_title">보내기</string>
<string name="copy_link">링크 주소 복사</string>
<string name="clipboard_text_copied">클립보드로 복사됨</string>
<string name="prefs_category_instant_uploading">즉시 업로드</string>
<string name="prefs_category_security">보안</string>
<string name="prefs_instant_video_upload_path_title">동영상 업로드 경로</string>
- <string name="download_folder_failed_content">%1$s 폴더를 다운로드할 수 없습니다</string>
- <string name="subject_token">%1$s에서 \"%2$s\"를 당신과 공유하였습니다.</string>
+ <string name="download_folder_failed_content">폴더 %1$s을(를) 다운로드할 수 없음</string>
<string name="auth_refresh_button">연결 새로 고침</string>
<string name="auth_host_address">서버 주소</string>
</resources>
<string name="actionbar_settings">دهستكاری</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">گشتی</string>
<string name="prefs_accounts">هەژمارەکان</string>
<string name="prefs_help">یارمەتی</string>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
+ <string name="about_android">%1$s Android-App</string>
<string name="about_version">Versioun %1$s</string>
+ <string name="actionbar_sync">Kont opfrëschen</string>
<string name="actionbar_upload">Eroplueden</string>
- <string name="actionbar_upload_files">Dateien</string>
+ <string name="actionbar_upload_from_apps">Contenu aus aneren Appen</string>
+ <string name="actionbar_upload_files">Fichieren</string>
<string name="actionbar_open_with">Opmaachen mat</string>
+ <string name="actionbar_mkdir">Neien Dossier</string>
<string name="actionbar_settings">Astellungen</string>
<string name="actionbar_see_details">Detailer</string>
<string name="actionbar_send_file">Schécken</string>
+ <string name="actionbar_sort">Zortéieren</string>
+ <string name="actionbar_sort_title">Zortéieren no</string>
+ <string-array name="actionbar_sortby">
+ <item>A-Z</item>
+ <item>Nei - Al</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Allgemeng</string>
<string name="prefs_category_more">Méi</string>
- <string name="prefs_accounts">Accounten</string>
- <string name="prefs_pincode">App PIN</string>
+ <string name="prefs_accounts">Konten</string>
+ <string name="prefs_manage_accounts">Konte geréieren</string>
+ <string name="prefs_instant_upload">Biller direkt eroplueden</string>
+ <string name="prefs_instant_upload_summary">Biller vum Fotoapparat direkt eroplueden</string>
+ <string name="prefs_instant_video_upload">Videoen direkt eroplueden</string>
+ <string name="prefs_instant_video_upload_summary">Biller vun der Kamera direkt eroplueden</string>
+ <string name="prefs_log_title">Protokoller aktivéieren</string>
+ <string name="prefs_log_summary">Heiduerch gi Problemer protokolléiert</string>
+ <string name="prefs_log_title_history">Protokoll-Historique</string>
+ <string name="prefs_log_summary_history">Hei ginn déi enregistréiert Protokoller ugewisen</string>
+ <string name="prefs_log_delete_history_button">Historique läschen</string>
<string name="prefs_help">Hëllef</string>
+ <string name="prefs_recommend">Engem Frënd recommendéieren</string>
<string name="prefs_feedback">Feedback</string>
+ <string name="prefs_imprint">Impressum</string>
+ <string name="auth_check_server">Server kontrolléieren</string>
+ <string name="auth_host_url">Server-Adress https://…</string>
<string name="auth_username">Benotzernumm</string>
<string name="auth_password">Passwuert</string>
- <string name="sync_string_files">Dateien</string>
+ <string name="auth_register">Nei bei %1$s?</string>
+ <string name="sync_string_files">Fichieren</string>
<string name="setup_btn_connect">Verbannen</string>
<string name="uploader_btn_upload_text">Eroplueden</string>
+ <string name="uploader_btn_new_folder_text">Neien Dossier</string>
<string name="uploader_wrn_no_account_title">Keen Account fonnt</string>
<string name="uploader_wrn_no_account_setup_btn_text">Setup</string>
<string name="uploader_wrn_no_account_quit_btn_text">Erausgoen</string>
+ <string name="uploader_wrn_no_content_text">Et gouf kee Contenu emfaangen. Näischt do fir eropzelueden.</string>
<string name="uploader_info_uploading">Eroplueden</string>
- <string name="file_list_seconds_ago">Sekonnen hir</string>
- <string name="file_list_empty">Hei ass näischt. Lued eppes rop!</string>
+ <string name="file_list_seconds_ago">Sekonnen hier</string>
+ <string name="file_list_empty">Hei ass näischt. Lued eppes erop!</string>
<string name="file_list_folder">Dossier</string>
<string name="file_list_folders">Dossieren</string>
- <string name="file_list_file">Datei</string>
- <string name="file_list_files">Dateien</string>
+ <string name="file_list_file">Fichier</string>
+ <string name="file_list_files">Fichieren</string>
<string name="filedetails_size">Gréisst:</string>
<string name="filedetails_type">Typ:</string>
<string name="filedetails_created">Erstallt:</string>
<string name="filedetails_modified">Geännert:</string>
- <string name="filedetails_download">Download</string>
+ <string name="filedetails_download">Eroflueden</string>
+ <string name="filedetails_sync_file">Fichier opfrëschen</string>
<string name="action_share_file">Link deelen</string>
<string name="common_yes">Jo</string>
<string name="common_no">Nee</string>
<string name="common_ok">OK</string>
- <string name="common_cancel_upload">Upload ofbriechen</string>
+ <string name="common_cancel_download">Eroflueden ofbriechen</string>
+ <string name="common_cancel_upload">Eroplueden ofbriechen</string>
<string name="common_cancel">Ofbriechen</string>
- <string name="common_save_exit">Späicher & géi raus</string>
- <string name="common_error">Fehler</string>
- <string name="common_error_unknown">Et ass en onbekannte Fehler opgetrueden</string>
+ <string name="common_save_exit">Späicheren an Zoumaachen</string>
+ <string name="common_error">Feeler</string>
+ <string name="common_error_unknown">Onbekannte Feeler</string>
<string name="about_title">Iwwer</string>
<string name="change_password">Passwuert änneren</string>
- <string name="delete_account">Account läschen</string>
- <string name="create_account">Account erstellen</string>
- <string name="uploader_info_dirname">Dossiers Numm:</string>
- <string name="uploader_upload_in_progress_ticker">Gett eropgelueden ...</string>
- <string name="uploader_upload_succeeded_ticker">Eroplueden färdeg</string>
- <string name="uploader_upload_failed_ticker">Eroplueden huet net geklappt</string>
- <string name="downloader_download_failed_ticker">Eroflueden huet net geklappt</string>
- <string name="common_choose_account">Wiel en Account aus</string>
- <string name="foreign_files_move">Alles bewegen</string>
- <string name="pincode_enter_pin_code">Gëff w.e.g. däin App PIN an</string>
- <string name="pincode_configure_your_pin">Gëff däin App PIN an</string>
- <string name="pincode_reenter_your_pincode">Gëff däin App PIN w.e.g. nei an</string>
- <string name="pincode_remove_your_pincode">Huel däin App PIN raus</string>
- <string name="pincode_wrong">Ongültegen App PIN</string>
- <string name="pincode_removed">App PIN geläscht</string>
- <string name="pincode_stored">App PIN gespaichert</string>
- <string name="auth_no_net_conn_title">Keng Netzwierk Verbindung</string>
- <string name="auth_nossl_plain_ok_title">Keng geséchert Verbindung verfügbar.</string>
- <string name="auth_connection_established">Verbindung hiergestallt</string>
- <string name="auth_not_configured_title">Ongülteg Server Konfiguratioun</string>
- <string name="auth_unknown_error_title">Et ass en onbekannte Fehler opgetrueden!</string>
- <string name="auth_incorrect_path_title">Server Instanz net fonnt</string>
- <string name="common_rename">Ëm-benennen</string>
+ <string name="delete_account">Kont läschen</string>
+ <string name="create_account">Kont uleeën</string>
+ <string name="uploader_info_dirname">Dossiersnumm:</string>
+ <string name="uploader_upload_in_progress_ticker">Lueden erop ...</string>
+ <string name="uploader_upload_succeeded_ticker">Eroplueden ofgeschloss</string>
+ <string name="uploader_upload_succeeded_content_single">%1$s gouf erfollegräich eropgelueden</string>
+ <string name="uploader_upload_failed_ticker">Eropluede feelgeschloen</string>
+ <string name="uploader_upload_failed_content_single">Eropluede vun %1$s konnt net ofgeschloss ginn</string>
+ <string name="uploader_upload_failed_credentials_error">Eropluede feelgeschloen, du muss dech nei aloggen</string>
+ <string name="downloader_download_in_progress_ticker">Lueden erof …</string>
+ <string name="downloader_download_succeeded_ticker">Eroflueden ofgeschloss</string>
+ <string name="downloader_download_succeeded_content">%1$s gouf erfollegräich erofgelueden</string>
+ <string name="downloader_download_failed_ticker">Erofluede feelgeschloen</string>
+ <string name="downloader_download_failed_content">Erofluede vun %1$s konnt net ofgeschloss ginn</string>
+ <string name="downloader_not_downloaded_yet">Nach net erofgelueden</string>
+ <string name="downloader_download_failed_credentials_error">Erofluede feelgeschloen, du muss dech nei aloggen</string>
+ <string name="common_choose_account">Kont auswielen</string>
+ <string name="sync_fail_ticker">Synchroniséierung feelgeschloen</string>
+ <string name="sync_fail_ticker_unauthorized">Synchroniséierung feelgeschloen, du muss dech nei aloggen</string>
+ <string name="sync_fail_content">Synchroniséierung vun %1$s konnt net ofgeschloss ginn</string>
+ <string name="sync_fail_content_unauthorized">Ongëltegt Passwuert fir %1$s</string>
+ <string name="sync_conflicts_in_favourites_ticker">Konflikter fonnt</string>
+ <string name="sync_foreign_files_forgotten_ticker">Verschidde lokal Fichiere goufe vergiess</string>
+ <string name="sync_current_folder_was_removed">Den Dossier %1$s existéiert net méi</string>
+ <string name="foreign_files_move">All réckelen</string>
+ <string name="foreign_files_success">All d\'Fichiere goufe geréckelt</string>
+ <string name="foreign_files_fail">Verschidde Fichiere konnten net geréckelt ginn</string>
+ <string name="foreign_files_local_text">Lokal: %1$s</string>
+ <string name="foreign_files_remote_text">Um Server: %1$s</string>
+ <string name="media_notif_ticker">%1$s Musek-Programm</string>
+ <string name="media_state_playing">%1$s (spillt of)</string>
+ <string name="media_state_loading">%1$s (lued)</string>
+ <string name="media_event_done">%1$s Ofspillen ofgeschloss</string>
+ <string name="media_err_nothing_to_play">Kee Mediefichier fonnt</string>
+ <string name="media_err_no_account">Kee Kont uginn</string>
+ <string name="media_err_not_in_owncloud">Fichier net an engem gëltege Kont</string>
+ <string name="media_err_unsupported">Medie-Codec net ënnerstëtzt</string>
+ <string name="media_err_io">Mediefichier konnt net gelies ginn</string>
+ <string name="media_err_malformed">Mediefichier net korrekt encodéiert</string>
+ <string name="media_err_timeout">Zäit ofgelaf beim Versuch de Fichier ofzespillen</string>
+ <string name="media_err_invalid_progressive_playback">Mediefichier konnt net gestreamt ginn</string>
+ <string name="media_err_unknown">Mediefichier konnt net mam Standard-Medieprogramm ofgespillt ginn</string>
+ <string name="media_err_security_ex">Sécherheetsfeeler beim Ofspille vun %1$s</string>
+ <string name="media_rewind_description">Zréckspull-Knäppchen</string>
+ <string name="media_play_pause_description">Ofspill- oder Paus-Knäppchen</string>
+ <string name="auth_no_net_conn_title">Keng Netzwierkconnectioun</string>
+ <string name="auth_nossl_plain_ok_title">Keng geséchert Connectioun disponibel.</string>
+ <string name="auth_connection_established">Connectioun hiergestallt</string>
+ <string name="auth_testing_connection">Testen d\'Connectioun</string>
+ <string name="auth_not_configured_title">Ongëlteg Server-Konfiguratioun</string>
+ <string name="auth_unknown_error_title">Et ass en onbekannte Feeler opgetrueden!</string>
+ <string name="auth_unknown_host_title">Server konnt net fonnt ginn</string>
+ <string name="auth_incorrect_path_title">Server-Instanz net fonnt</string>
+ <string name="auth_timeout_title">De Server huet ze laang gebraucht fir ze äntweren</string>
+ <string name="auth_incorrect_address_title">Ongëlteg URL</string>
+ <string name="auth_ssl_general_error_title">SSL-Initialiséierung feelgeschloen</string>
+ <string name="auth_ssl_unverified_server_title">Konnt d\'Identitéit vum SSL-Server net verifizéieren</string>
+ <string name="auth_bad_oc_version_title">Onbekannte Server-Versioun</string>
+ <string name="auth_wrong_connection_title">Konnt d\'Connectioun net hierstellen</string>
+ <string name="auth_secure_connection">Sécher Connectioun hiergestallt</string>
+ <string name="auth_unauthorized">Falsche Benotzernumm oder falscht Passwuert</string>
+ <string name="auth_oauth_error">Authoriséierung net erfollegräich</string>
+ <string name="auth_oauth_error_access_denied">Accès duerch den Authoriséierungsserver verweigert</string>
+ <string name="auth_expired_basic_auth_toast">Gëff w.e.g. däin aktuellt Passwuert an</string>
+ <string name="auth_expired_saml_sso_token_toast">Deng Sessioun ass ofgelaf. Connectéier dech nei w.e.g.</string>
+ <string name="auth_unsupported_auth_method">De Server ënnerstëtzt dës Authentifizéierungsmethod net</string>
+ <string name="fd_keep_in_sync">Fichier aktuell halen</string>
+ <string name="common_rename">Ëmbenennen</string>
<string name="common_remove">Läschen</string>
- <string name="confirmation_remove_local">Nemmen Lokal</string>
+ <string name="confirmation_remove_alert">Wëlls du %1$s wierklech läschen?</string>
+ <string name="confirmation_remove_folder_alert">Wëlls du %1$s an de ganzen Inhalt wierklech läschen?</string>
+ <string name="confirmation_remove_local">Nemme lokal</string>
+ <string name="confirmation_remove_folder_local">Nëmme lokal Inhalter</string>
<string name="confirmation_remove_remote">Vum Server läschen</string>
+ <string name="confirmation_remove_remote_and_local">Um Server a lokal</string>
+ <string name="remove_success_msg">Erfollegräich geläscht</string>
+ <string name="remove_fail_msg">Läsche feelgeschloen</string>
+ <string name="rename_dialog_title">Gëff en neien Numm an</string>
+ <string name="sync_file_nothing_to_do_msg">Fichiersinhalter scho synchroniséiert</string>
+ <string name="create_dir_fail_msg">Dossier konnt net ugeluecht ginn</string>
+ <string name="filename_empty">De Fichiersnumm kann net eidel sinn</string>
+ <string name="wait_a_moment">Waart ee Moment</string>
+ <string name="filedisplay_no_file_selected">Kee Fichier selektionéiert</string>
+ <string name="activity_chooser_title">Link schécken un …</string>
+ <string name="oauth_check_onoff">Mat oAuth2 aloggen</string>
+ <string name="ssl_validator_reason_cert_expired">- D\'Server-Zerfitikat ass ofgelaf</string>
+ <string name="ssl_validator_reason_cert_not_yet_valid">- D\'Validitéitsdate vum Server-Zertifikat leien an der Zukunft</string>
+ <string name="ssl_validator_reason_hostname_not_verified">- D\'URL stëmmt net mam Servernumm am Zertifikat iwwereneen</string>
+ <string name="ssl_validator_question">Wëlls du dësem Zertifikat trotzdeem vertrauen?</string>
+ <string name="ssl_validator_not_saved">Den Zertifikat konnt net gespäichert ginn</string>
<string name="ssl_validator_btn_details_see">Detailer</string>
<string name="ssl_validator_btn_details_hide">Verstoppen</string>
+ <string name="ssl_validator_label_subject">Ausgestallt un:</string>
+ <string name="ssl_validator_label_issuer">Ausgestallt vun:</string>
+ <string name="ssl_validator_label_CN">Allgemengen Numm:</string>
+ <string name="ssl_validator_label_O">Organisatioun:</string>
+ <string name="ssl_validator_label_OU">Organisatiounseenheet:</string>
<string name="ssl_validator_label_C">Land:</string>
<string name="ssl_validator_label_ST">Staat:</string>
<string name="ssl_validator_label_L">Uert:</string>
- <string name="ssl_validator_label_validity">Gültegkeet:</string>
+ <string name="ssl_validator_label_validity">Gëltegkeet:</string>
<string name="ssl_validator_label_validity_from">Vun:</string>
- <string name="ssl_validator_label_validity_to">Fir:</string>
+ <string name="ssl_validator_label_validity_to">Un:</string>
<string name="ssl_validator_label_signature">Signatur:</string>
- <string name="placeholder_filetype">PNG Bild</string>
- <string name="placeholder_filesize">389 KB</string>
- <string name="placeholder_timestamp">2012/05/18 12:23</string>
+ <string name="ssl_validator_label_signature_algorithm">Algorithmus:</string>
+ <string name="ssl_validator_null_cert">Den Zertifikat konnt net ugewise ginn.</string>
+ <string name="ssl_validator_no_info_about_error">- Keng Informatioun iwwer de Feeler</string>
+ <string name="placeholder_sentence">Dëst ass e Plazhaler</string>
+ <string name="placeholder_filename">plazhaler.txt</string>
+ <string name="placeholder_filetype">PNG-Bild</string>
+ <string name="placeholder_filesize">389kB</string>
+ <string name="placeholder_timestamp">18.05.2012 12:23</string>
<string name="placeholder_media_time">12:23:45</string>
<string name="conflict_keep_both">Béid halen</string>
<string name="conflict_overwrite">Iwwerschreiwen</string>
<string name="conflict_dont_upload">Net eroplueden</string>
+ <string name="preview_image_description">Biller-Virschau</string>
+ <string name="preview_image_error_unknown_format">Dëst Bild kann net ugewise ginn</string>
+ <string name="error__upload__local_file_not_copied">%1$s konnt net an de lokalen Dossier %2$s kopéiert ginn</string>
+ <string name="prefs_instant_upload_path_title">Pad fir d\'Eroplueden</string>
+ <string name="share_link_password_title">E Passwuert aginn</string>
+ <string name="share_link_empty_password">Du muss e Passwuert aginn</string>
<string name="activity_chooser_send_file_title">Schécken</string>
+ <string name="copy_link">Link kopéieren</string>
+ <string name="clipboard_text_copied">An d\'Tëschenoflag kopéiert</string>
+ <string name="error_cant_bind_to_operations_service">Kritesche Feeler: D\'Operatioune konnten net ausgeféiert ginn</string>
+ <string name="network_error_socket_exception">Bei der Connectioun mam Server ass e Feeler opgetrueden.</string>
+ <string name="network_error_socket_timeout_exception">Beim Waarden op de Server ass e Feeler opgetrueden, d\'Operatioun konnt net duerchgeféiert ginn</string>
+ <string name="network_error_connect_timeout_exception">Beim Waarden op de Server ass e Feeler opgetrueden, d\'Operatioun konnt net duerchgeféiert ginn</string>
+ <string name="network_host_not_available">D\'Operatioun konnt net ofgeschloss ginn, de Server ass net disponibel</string>
<string name="empty"></string>
- <string name="prefs_category_accounts">Accounten</string>
+ <string name="forbidden_permissions">Du hues keng Berechtegung %s</string>
+ <string name="forbidden_permissions_rename">fir dëse Fichier ëmzebenennen</string>
+ <string name="forbidden_permissions_delete">fir dëse Fichier ze läschen</string>
+ <string name="share_link_forbidden_permissions">fir dëse Fichier ze deelen</string>
+ <string name="unshare_link_forbidden_permissions">fir dëse Fichier net méi ze deelen</string>
+ <string name="forbidden_permissions_create">fir dëse Fichier unzeleeën</string>
+ <string name="uploader_upload_forbidden_permissions">fir an dësen Dossier eropzelueden</string>
+ <string name="downloader_download_file_not_found">De Fichier ass net méi um Server disponibel</string>
+ <string name="prefs_category_accounts">Konten</string>
+ <string name="prefs_add_account">Kont dobäisetzen</string>
+ <string name="auth_redirect_non_secure_connection_title">Sécher Connectioun gëtt op eng onsécher Route ëmgeleet.</string>
+ <string name="actionbar_logger">Protokoller</string>
+ <string name="log_send_history_button">Historique schécken</string>
+ <string name="log_send_no_mail_app">Keng App fonnt fir d\'Protokoller ze schécken. Installéier eng Mail-App!</string>
+ <string name="log_send_mail_subject">Protokoller vun der %1$s-Android-App</string>
+ <string name="log_progress_dialog_text">Date gi gelueden…</string>
+ <string name="saml_authentication_required_text">Authentifizéierung néideg</string>
+ <string name="saml_authentication_wrong_pass">Falscht Passwuert</string>
+ <string name="actionbar_move">Réckelen</string>
+ <string name="file_list_empty_moving">Hei ass näischt. Setz en Dossier dobäi!</string>
<string name="folder_picker_choose_button_text">Auswielen</string>
- <string name="auth_host_address">Server Adress</string>
+ <string name="move_file_not_found">Konnt net réckelen. Kontrolléier w.e.g. ob de Fichier existéiert</string>
+ <string name="move_file_invalid_into_descendent">Et ass net méiglech, en Dossier an en Ënnerdossier vu sech selwer ze réckelen</string>
+ <string name="move_file_invalid_overwrite">De Fichier existéiert schonn am Zildossier</string>
+ <string name="move_file_error">Beim Réckele vun dësem Fichier oder Dossier ass e Feeler opgetrueden</string>
+ <string name="forbidden_permissions_move">fir dëse Fichier ze réckelen</string>
+ <string name="prefs_category_instant_uploading">Direkt eropgeluede Fichieren</string>
+ <string name="prefs_category_security">Sécherheet</string>
+ <string name="prefs_instant_video_upload_path_title">Pad fir d\'Eropluede vun de Videoen</string>
+ <string name="download_folder_failed_content">D\'Erofluede vum %1$s-Dossier konnt net ofgeschloss ginn</string>
+ <string name="auth_refresh_button">Connectioun opfrëschen</string>
+ <string name="auth_host_address">Server-Adress</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="common_error_unknown">ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ</string>
<string name="empty"></string>
</resources>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Bendras</string>
<string name="prefs_category_more">Daugiau</string>
<string name="prefs_accounts">Paskyros</string>
<string name="prefs_manage_accounts">Tvarkyti paskyras</string>
- <string name="prefs_pincode">App programos PIN kodas</string>
- <string name="prefs_pincode_summary">Apsaugokite savo klientą</string>
<string name="prefs_instant_upload">Momentiniai nuotraukų įkėlimai</string>
<string name="prefs_instant_upload_summary">Iš karto nusiųsti nufotografuotas nuotraukas</string>
<string name="prefs_instant_video_upload">Momentiniai video įkėlimai</string>
<string name="foreign_files_fail">Kai kurių failų negalima perkelti</string>
<string name="foreign_files_local_text">Vietinis: %1$s</string>
<string name="foreign_files_remote_text">Nuotolinis: %1$s</string>
- <string name="pincode_enter_pin_code">Prašome įvesti savo programos PIN kodą</string>
- <string name="pincode_configure_your_pin">Įveskite taikymas programos PIN kodą</string>
- <string name="pincode_configure_your_pin_explanation">PIN bus prašomas kiekvieną kartą paleidus programą</string>
- <string name="pincode_reenter_your_pincode">Prašome pakartoti taikymas PIN kodą</string>
- <string name="pincode_remove_your_pincode">Pašalinti taikymas programos PIN kodą</string>
- <string name="pincode_mismatch">Abu taikymas programos PIN kodai nesutampa</string>
- <string name="pincode_wrong">Neteisingas taikymas programos PIN kodas</string>
- <string name="pincode_removed">Taikymas programos PIN kodas pašalintas</string>
- <string name="pincode_stored">Taikymas programos PIN kodas išsaugotas</string>
<string name="media_notif_ticker">%1$s muzikos grotuvas</string>
<string name="media_state_playing">%1$s (grojama)</string>
<string name="media_state_loading">%1$s (įkeliama)</string>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Vispārīgi</string>
<string name="prefs_category_more">Vairāk</string>
<string name="prefs_accounts">Konti</string>
<string name="prefs_manage_accounts">Pārvaldīt kontus</string>
- <string name="prefs_pincode">Lietotnes PIN</string>
- <string name="prefs_pincode_summary">Aizsargā savu klientu</string>
<string name="prefs_instant_upload">Automātiskā bilžu augšuplāde</string>
<string name="prefs_instant_upload_summary">Automātiski augšuplādēt tikko uzņemtās bildes</string>
<string name="prefs_instant_video_upload">Automātiskā video augšuplāde</string>
<string name="sync_conflicts_in_favourites_content">Nevarēja sinhronizēt %1$d kept-in-sync datnes</string>
<string name="sync_fail_in_favourites_ticker">Kept-in-sync datnes cieta neveiksmi</string>
<string name="sync_fail_in_favourites_content">Nevarēja sinhronizēt %1$d datņu saturu (%2$d konflikti)</string>
- <string name="pincode_enter_pin_code">Lūdzu, ierakstiet savu lietotnes PIN</string>
- <string name="pincode_configure_your_pin">Ievadiet savu lietotnes PIN</string>
- <string name="pincode_configure_your_pin_explanation">PIN tiks pieprasīts katrā lietotnes palaišanas reizē</string>
- <string name="pincode_reenter_your_pincode">Lūdzu, vēlreiz ievadiet savu lietotnes PIN</string>
- <string name="pincode_remove_your_pincode">Izņemt savu lietotnes PIN</string>
- <string name="pincode_mismatch">Lietotņu PIN nav vienādi</string>
- <string name="pincode_wrong">Nepareizs lietotnes PIN</string>
- <string name="pincode_removed">Lietotnes PIN ir izņemts</string>
- <string name="pincode_stored">Lietotnes PIN ir noglabāts</string>
<string name="auth_trying_to_login">Mēģina ierakstīties...</string>
<string name="auth_no_net_conn_title">Nav tīkla savienojumu</string>
<string name="auth_nossl_plain_ok_title">Nav pieejams drošs savienojums.</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
+ <string name="about_android">%1$s Андроид апликација</string>
+ <string name="about_version">верзија %1$s</string>
+ <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_open_with">Отвори со</string>
<string name="actionbar_mkdir">Нова папка</string>
<string name="actionbar_settings">Параметри</string>
<string name="actionbar_see_details">Детали:</string>
<string name="actionbar_send_file">Прати</string>
+ <string name="actionbar_sort">Сортирај</string>
+ <string name="actionbar_sort_title">Сортирај по</string>
+ <string-array name="actionbar_sortby">
+ <item>А-Ш</item>
+ <item>Најнови - Најстари</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</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">Апликативен ПИН</string>
- <string name="prefs_pincode_summary">Заштитете го вашиот клиент</string>
+ <string name="prefs_passcode">Заклучено со код</string>
+ <string name="prefs_instant_upload">Инстантно префрлање на слики</string>
+ <string name="prefs_instant_upload_summary">Инстантно префрли слики направени со камера</string>
+ <string name="prefs_instant_video_upload">Инстантно префрлање на видеа</string>
+ <string name="prefs_instant_video_upload_summary">Инстантно префрла видеа снимени со камерата</string>
<string name="prefs_log_title">Овозможи логирање</string>
+ <string name="prefs_log_summary">Ова е користено за логирање на проблеми</string>
+ <string name="prefs_log_title_history">Историја на логирање</string>
+ <string name="prefs_log_summary_history">Ова ги прикажува снимените логови</string>
+ <string name="prefs_log_delete_history_button">Избриши историја</string>
<string name="prefs_help">Помош</string>
<string name="prefs_recommend">Препорачај на пријател</string>
<string name="prefs_feedback">Повратен одговор</string>
+ <string name="prefs_imprint">Печат</string>
+ <string name="prefs_remember_last_share_location">Запомни ја локацијата на споделувањеот</string>
+ <string name="prefs_remember_last_upload_location_summary">Запомни ја последната локација на споделување на префрлање</string>
+ <string name="recommend_subject">Пробајте %1$s на вашиот паметен телефон!</string>
+ <string name="recommend_text">Сакам да ве поканам да го користите %1$s на вашиот телефон.\nСимнете го овде: %2$s</string>
+ <string name="auth_check_server">Проверка на серверот</string>
<string name="auth_host_url">Адреса на серверот https://…</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_btn_new_folder_text">Нова папка</string>
+ <string name="uploader_top_message">Избери папка за префрлање:</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_seconds_ago">пред секунди</string>
- <string name="file_list_empty">Тука нема ништо. Снимете нешто!</string>
- <string name="file_list_folder">фолдер</string>
- <string name="file_list_folders">фолдери</string>
+ <string name="file_list_empty">Тука нема ништо. Префрлете нешто!</string>
+ <string name="file_list_loading">Вчитување</string>
+ <string name="local_file_list_empty">Нема датотеки во оваа папка.</string>
+ <string name="file_list_folder">папка</string>
+ <string name="file_list_folders">папки</string>
<string name="file_list_file">датотека</string>
<string name="file_list_files">датотеки</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="action_share_file">Сподели ја врската</string>
+ <string name="action_unshare_file">Тргнете го споделувањето на врската</string>
<string name="common_yes">Да</string>
<string name="common_no">Не</string>
<string name="common_ok">Во ред</string>
+ <string name="common_cancel_download">Откажи превземање</string>
<string name="common_cancel_upload">Откажи прикачување</string>
<string name="common_cancel">Откажи</string>
+ <string name="common_save_exit">Сними & Излез</string>
<string name="common_error">Грешка</string>
<string name="common_loading">Вчитувам ...</string>
<string name="common_error_unknown">Непозната грешка</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_succeeded_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="uploader_upload_failed_credentials_error">Прикачувањето не успеа, морате повторно да се најавите</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="downloader_not_downloaded_yet">Сеуште не е превземено</string>
+ <string name="downloader_download_failed_credentials_error">Превземањето не успеа, морате повторно да се најавите</string>
<string name="common_choose_account">Одбери сметка</string>
<string name="sync_fail_ticker">Синхронизацијата беше неуспешна</string>
+ <string name="sync_fail_ticker_unauthorized">Синхронизацијата не успеа, морате повторно да се најавите</string>
+ <string name="sync_fail_content">Синхронизацијата на %1$s не може да се заврши</string>
+ <string name="sync_fail_content_unauthorized">Не е точна лозинката за %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Пронајден е конфликт</string>
+ <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="sync_foreign_files_forgotten_ticker">Некои локални датотеки беа заборавени</string>
+ <string name="sync_foreign_files_forgotten_content">%1$d датотеки од %2$s папката не можат да се копираат</string>
+ <string name="sync_foreign_files_forgotten_explanation">Од верзијата 1.3.16, датотеките прикачени од овој уред се копираат во локалниот фолдер %1$s за да се спречи загуба на податоци кога една датотека се синхронизира со повеќе сметки.\n\nПоради оваа промена, сите датотеки прикачени во претходните верзии на оваа апликација беа копирани во %2$s папката. Меѓутоа, грешка спречи го спречи завршувањето на оваа операција за време на синхронизацијата на сметката. Можете или да ја оставите датотеката(ките) како што е/се или да го отстраните линкот до %3$s, или да ја преместите датотеката(ките) во папката %1$s и да го зачувате линкот до %4$s.\n\nПодолу се наведени локалните датотеки и одалечените датотеки во %5$s каде што беа поврзани.</string>
+ <string name="sync_current_folder_was_removed">Папката %1$s веќе не постои</string>
<string name="foreign_files_move">Префрли ги сите</string>
- <string name="pincode_enter_pin_code">Ве молам внесето го вашиот апликативен ПИН</string>
- <string name="pincode_configure_your_pin">Внесето го вашиот апликативен ПИН</string>
- <string name="pincode_reenter_your_pincode">Ве молам повторно внесето го вашиот апликативен ПИН</string>
- <string name="pincode_remove_your_pincode">Одстранете го го вашиот апликативен ПИН</string>
- <string name="pincode_mismatch">Апликативните ПИН-ови не се исти</string>
- <string name="pincode_wrong">Грешен апликативен ПИН</string>
- <string name="pincode_removed">Апликативниот ПИН е одстранет</string>
- <string name="pincode_stored">Апликативниот ПИН е снимен</string>
- <string name="auth_trying_to_login">Обиди се да се најавиш...</string>
+ <string name="foreign_files_success">Сите папки беа преместени</string>
+ <string name="foreign_files_fail">Некои датотеки не можат да се преместат</string>
+ <string name="foreign_files_local_text">Локално: %1$s</string>
+ <string name="foreign_files_remote_text">Одалечено: %1$s</string>
+ <string name="upload_query_move_foreign_files">Нема доволно место за да се копират избраните датотеки во папката %1$s. Сакате ли да ги преместите наместо тоа?</string>
+ <string name="pass_code_enter_pass_code">Ве молам, внесете го вашиот код</string>
+ <string name="pass_code_configure_your_pass_code">Венсете го вашиот код</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Кодот ќе биде баран секогаш кога ќе биде покрената апликацијата</string>
+ <string name="pass_code_reenter_your_pass_code">Ве молам, повторно внесете го вашиот код</string>
+ <string name="pass_code_remove_your_pass_code">Избришете го вашиот код</string>
+ <string name="pass_code_mismatch">Кодовите не се исти</string>
+ <string name="pass_code_wrong">Неточен код</string>
+ <string name="pass_code_removed">Кодот е отстранет</string>
+ <string name="pass_code_stored">Кодот е снимен</string>
+ <string name="media_notif_ticker">%1$s пуштач на музика</string>
+ <string name="media_state_playing">%1$s (свири)</string>
+ <string name="media_state_loading">%1$s (вчитувам)</string>
+ <string name="media_event_done">репродуцирањето на %1$s заврши</string>
+ <string name="media_err_nothing_to_play">Не се најдени медиум датотеки </string>
+ <string name="media_err_no_account">Не е обезбедена сметка</string>
+ <string name="media_err_not_in_owncloud">Датотеката не е во валидна сметка</string>
+ <string name="media_err_unsupported">Неподржан кодек на медиумот</string>
+ <string name="media_err_io">Медиа датотеката не може да се прочита</string>
+ <string name="media_err_malformed">Медиа датотеката не е точно енкодирана</string>
+ <string name="media_err_timeout">Заврши времето за пробување да се пушти </string>
+ <string name="media_err_invalid_progressive_playback">Медиа датотеката не може да се стрима</string>
+ <string name="media_err_unknown">Медиа датотеката не може да се пушти со вградениот пуштач на медиум</string>
+ <string name="media_err_security_ex">Сигурносна грешка при пуштање на %1$s</string>
+ <string name="media_err_io_ex">Влезна грешка при пуштање на %1$s</string>
+ <string name="media_err_unexpected">Неочекувана грешка при пуштање на %1$s</string>
+ <string name="media_rewind_description">Копче за премотување</string>
+ <string name="media_play_pause_description">Копче за пуштање или пауза</string>
+ <string name="media_forward_description">Копче за брзо премотување</string>
+ <string name="auth_getting_authorization">Добивање на авторизација...</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_unknown_error_title">Се појави непознаа грешка!</string>
+ <string name="auth_testing_connection">Тестирање на конекцијата</string>
+ <string name="auth_not_configured_title">Погрешна конфигурација на серверот</string>
+ <string name="auth_account_not_new">Сметка за истиот корисник и сервер веќе постои на уредот</string>
+ <string name="auth_account_not_the_same">Внесениот корисник не се совпаѓа со корисникот на оваа сметка</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_ssl_unverified_server_title">Не можев да го проверам SSL серверскиот идентитет</string>
<string name="auth_bad_oc_version_title">Верзијата на серверот не е препознаена</string>
<string name="auth_secure_connection">Воспоставена е безбедна конекција</string>
<string name="auth_unauthorized">Погрешно корисничко име или лозинка</string>
<string name="auth_oauth_error">Неуспешна авторизација</string>
+ <string name="auth_oauth_error_access_denied">Одбиен пристап од авторизацискиот сервер</string>
+ <string name="auth_wtf_reenter_URL">Неочекувана сосотојба; ве молам, внесете го URL на серверот уште еднаш</string>
+ <string name="auth_expired_oauth_token_toast">Вашата авторизација истече. Ве молам, авторизирајте се повторно</string>
<string name="auth_expired_basic_auth_toast">Внесете ја вашата тековна лозинка:</string>
+ <string name="auth_expired_saml_sso_token_toast">Вашата сесија истече. Ве молам поврзете се повторно</string>
+ <string name="auth_connecting_auth_server">Се поврзувам со серверот за авторизација</string>
+ <string name="auth_unsupported_auth_method">Серверот не го подржува овој метод на авторизација</string>
+ <string name="auth_unsupported_multiaccount">%1$s не подржува повеќе сметки</string>
+ <string name="auth_fail_get_user_name">Вашиот сервер не праќа точен кориснички id, ве молам контактирајте го администраторот
+ </string>
+ <string name="auth_can_not_auth_against_server">Не можам да се авторизирам на овој сервер </string>
+ <string name="auth_account_does_not_exist">Сметката сеуште не постои на овој уред</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="filename_forbidden_characters">Забранети карактери: / \\ < > : \" | ? *</string>
+ <string name="filename_empty">Името на датотеката не може да биде празно</string>
<string name="wait_a_moment">Почекајте малку</string>
<string name="filedisplay_unexpected_bad_get_content">Неочекуван проблем ; ве молам одберете датотека од друга апликација</string>
<string name="filedisplay_no_file_selected">Нема избрано датотека</string>
+ <string name="activity_chooser_title">Пратете линк на ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Копирам датотека од приватното складиште</string>
<string name="oauth_check_onoff">Најави се со oAuth2</string>
+ <string name="oauth_login_connection">Се поврзувам со серверот на oAuth2</string>
+ <string name="ssl_validator_header">Идентитетот на страната не може да се потврди</string>
+ <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 не се совпаѓа со hostname во сертификатот</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_to">До:</string>
<string name="ssl_validator_label_signature">Потпис:</string>
<string name="ssl_validator_label_signature_algorithm">Алгоритам:</string>
+ <string name="ssl_validator_null_cert">Сертификатот не може да прикаже.</string>
+ <string name="ssl_validator_no_info_about_error">- Нема информација за грешката</string>
+ <string name="placeholder_sentence">Ова е резервирано место</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">PNG слика</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="conflict_title">Конфликт при надградбата</string>
+ <string name="instant_upload_on_wifi">Прикачувај слики само преку WiFi</string>
+ <string name="instant_video_upload_on_wifi">Прикачувај видеа само преку WiFi</string>
+ <string name="instant_upload_path">/InstantUpload</string>
+ <string name="conflict_title">Конфликт при ажурирање</string>
+ <string name="conflict_message">Одалечената датотека %s не е синхронизирана со локалната датотека. Ако продолжите ќе се замени содржината на датотеката на серверот.</string>
<string name="conflict_keep_both">Задржи ги и двете</string>
<string name="conflict_overwrite">Препиши</string>
+ <string name="conflict_dont_upload">Не прикачувај</string>
+ <string name="preview_image_description">Преглед на сликата</string>
+ <string name="preview_image_error_unknown_format">Сликата не може да се прикаже</string>
+ <string name="error__upload__local_file_not_copied">%1$s не може да се копира во локалната папка %2$s</string>
+ <string name="prefs_instant_upload_path_title">Патека за прикачување</string>
+ <string name="share_link_no_support_share_api">Жалиме, споделувањето не е овозможено на вашиот сервер. Ве молам контактирајте го вашиот
+ администратор.</string>
+ <string name="share_link_file_no_exist">Не можам да споделам. Ве молам проверете дали постои датотеката</string>
+ <string name="share_link_file_error">Се случи грешка кога пробав да ја споделам оваа папка</string>
+ <string name="unshare_link_file_no_exist">Не можам да го тргнам споделувањето. Ве молам проверете дали постои датотеката</string>
+ <string name="unshare_link_file_error">Се случи грешка кога пробав да го тргнам споделувањето на оваа датотека или папка</string>
+ <string name="share_link_password_title">Внесете лозинка</string>
+ <string name="share_link_empty_password">Морате да внесете лозинка</string>
<string name="activity_chooser_send_file_title">Прати</string>
+ <string name="copy_link">Копирај врска</string>
+ <string name="clipboard_text_copied">Копирано во клипборд</string>
+ <string name="error_cant_bind_to_operations_service">Критична грешка: не можам да ја извршам операцијата</string>
+ <string name="network_error_socket_exception">Се случи грешка при конектирање со серверот.</string>
+ <string name="network_error_socket_timeout_exception">Се случи грешка при чекање на на серверот, операцијата не можеше да се изврши</string>
+ <string name="network_error_connect_timeout_exception">Се случи грешка при чекање на на серверот, операцијата не можеше да се изврши</string>
+ <string name="network_host_not_available">Операцијата не можеше да заврши, серверот не е достапен</string>
<string name="empty"></string>
+ <string name="forbidden_permissions">Немате дозвола %s</string>
+ <string name="forbidden_permissions_rename">да ја преименувате датотеката</string>
+ <string name="forbidden_permissions_delete">да ја избришете оваа датотека</string>
+ <string name="share_link_forbidden_permissions">да ја споделите оваа датотека</string>
+ <string name="unshare_link_forbidden_permissions">да тргнете споделување на оваа датотека</string>
+ <string name="forbidden_permissions_create">да создадете датотека</string>
+ <string name="uploader_upload_forbidden_permissions">да прикачите во оваа папка</string>
+ <string name="downloader_download_file_not_found">Датотеката веќе не е достапна на серверот</string>
<string name="prefs_category_accounts">Сметки</string>
+ <string name="prefs_add_account">Додади сметка</string>
+ <string name="auth_redirect_non_secure_connection_title">Сигурната конекција е преусмерена на несигурна рута.</string>
+ <string name="actionbar_logger">Логови</string>
+ <string name="log_send_history_button">Прати историја</string>
+ <string name="log_send_no_mail_app">Нема апликација за праќање на логови. Инсталирајте апликација за пошта!</string>
+ <string name="log_send_mail_subject">%1$s Апликација на Андроид за логови</string>
+ <string name="log_progress_dialog_text">Вчитувам на податоци...</string>
<string name="saml_authentication_required_text">Потребна е автентификација</string>
<string name="saml_authentication_wrong_pass">Погрешна лозинка</string>
+ <string name="actionbar_move">Премести</string>
+ <string name="file_list_empty_moving">Тука нема ништо. Можете да додадете папка!</string>
<string name="folder_picker_choose_button_text">Избери</string>
+ <string name="move_file_not_found">Не можам да преместам. Ве молам проверете дали постои датотеката</string>
+ <string name="move_file_invalid_into_descendent">Не е можно да се премести папката во нејзината подпапка</string>
+ <string name="move_file_invalid_overwrite">Датотеката веќе постои во целната папка</string>
+ <string name="move_file_error">Се случи грешка кога пробував да ја преместам оваа датотека или папка</string>
+ <string name="forbidden_permissions_move">да ја преместам оваа датотека</string>
+ <string name="prefs_category_instant_uploading">Инстант прикачувања</string>
<string name="prefs_category_security">Безбедност</string>
+ <string name="prefs_instant_video_upload_path_title">Прикачи патека на видео</string>
+ <string name="download_folder_failed_content">Превземањето на папката %1$s не може да се заврши</string>
+ <string name="auth_refresh_button">Освежи ја конекцијата</string>
<string name="auth_host_address">Адреса на сервер</string>
</resources>
<string name="actionbar_upload_files">ഫയലുകൾ</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="sync_string_files">ഫയലുകൾ</string>
<string name="empty"></string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_settings">Тохиргоо</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Ерөнхий</string>
<string name="auth_username">Хэрэглэгчийн нэр</string>
<string name="auth_password">Нууц үг</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_settings">Set</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Umum</string>
<string name="prefs_category_more">Lanjutan</string>
<string name="prefs_accounts">Akaun</string>
- <string name="prefs_pincode">PIN App</string>
<string name="prefs_help">Bantuan</string>
<string name="auth_username">Nama pengguna</string>
<string name="auth_password">Kata laluan</string>
<string name="uploader_upload_failed_ticker">Muatnaik gagal</string>
<string name="downloader_download_in_progress_ticker">Muatturun....</string>
<string name="common_choose_account">Pilih akaun</string>
- <string name="pincode_configure_your_pin">Masukkan PIN App anda</string>
- <string name="pincode_reenter_your_pincode">Sila, memasukkan semula PIN App anda</string>
- <string name="pincode_stored">PIN App disimpan</string>
<string name="auth_no_net_conn_title">Tiada sambungan rangkaian</string>
<string name="common_rename">Namakan</string>
<string name="common_remove">Buang</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_upload_files">ဖိုင်များ</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_help">အကူအညီ</string>
<string name="auth_username">သုံးစွဲသူအမည်</string>
<string name="auth_password">စကားဝှက်</string>
</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">Alle filer</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Innstillinger</string>
+ <string name="drawer_item_logs">Logger</string>
+ <string name="drawer_close">Lukk</string>
<string name="prefs_category_general">Generelt</string>
<string name="prefs_category_more">Mer</string>
<string name="prefs_accounts">Kontoer</string>
<string name="prefs_manage_accounts">Håndter kontoer</string>
- <string name="prefs_pincode">PIN kode</string>
- <string name="prefs_pincode_summary">Beskytt klienten din</string>
+ <string name="prefs_passcode">Passordlås</string>
<string name="prefs_instant_upload">Umiddelbare bildeopplastninger</string>
<string name="prefs_instant_upload_summary">Last opp bilder tatt av kameraet umiddelbart</string>
<string name="prefs_instant_video_upload">Umiddelbare video-opplastninger</string>
<string name="filedetails_download">Last ned</string>
<string name="filedetails_sync_file">Oppdater fil</string>
<string name="filedetails_renamed_in_upload_msg">Filnavnet ble endret til %1$s under opplasting</string>
+ <string name="list_layout">Listeoppsett</string>
<string name="action_share_file">Del lenke</string>
<string name="action_unshare_file">Avslutt deling av lenke</string>
<string name="common_yes">Ja</string>
<string name="foreign_files_local_text">Lokal: %1$s</string>
<string name="foreign_files_remote_text">Ekstern: %1$s</string>
<string name="upload_query_move_foreign_files">Det er ikke nok plass til å kopiere de valgte filene inn i mappen %1$s. Vil du flytte dem i stedet? </string>
- <string name="pincode_enter_pin_code">Vennligst tast inn din App-PIN</string>
- <string name="pincode_configure_your_pin">Skriv inn din PIN kode</string>
- <string name="pincode_configure_your_pin_explanation">PIN koden vil bli ettersourt hver gang appen starter</string>
- <string name="pincode_reenter_your_pincode">Vennligst tast inn din PIN kode på nytt</string>
- <string name="pincode_remove_your_pincode">Fjern din PIN kode</string>
- <string name="pincode_mismatch">PIN kodene du tastet er ulike</string>
- <string name="pincode_wrong">Feil PIN kode</string>
- <string name="pincode_removed">PIN kode fjernet</string>
- <string name="pincode_stored">PIN kode lagret</string>
+ <string name="pass_code_enter_pass_code">Legg inn passordet ditt</string>
+ <string name="pass_code_configure_your_pass_code">Skriv inn passordet ditt</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Passordet vil bli krevd hver gang appen startes</string>
+ <string name="pass_code_reenter_your_pass_code">Skriv inn passordet på nytt</string>
+ <string name="pass_code_remove_your_pass_code">Fjern passordet ditt</string>
+ <string name="pass_code_mismatch">Passordene er ikke like</string>
+ <string name="pass_code_wrong">Feil passord</string>
+ <string name="pass_code_removed">Passord fjernet</string>
+ <string name="pass_code_stored">Passord lagret</string>
<string name="media_notif_ticker">%1$s musikkspiller</string>
<string name="media_state_playing">%1$s (spiller)</string>
<string name="media_state_loading">%1$s (laster)</string>
<string name="sync_file_nothing_to_do_msg">filinnhold er allerede synkronisert</string>
<string name="create_dir_fail_msg">Mappe kunne ikke opprettes</string>
<string name="filename_forbidden_characters">Forbudte tegn: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Filnavnet inneholder minst ett ulovlig tegn</string>
<string name="filename_empty">Filnavn kan ikke være tomt</string>
<string name="wait_a_moment">Vent et øyeblikk</string>
<string name="filedisplay_unexpected_bad_get_content">Uforventet problem; vennligst velg filen fra en annen applikasjon</string>
<string name="filedisplay_no_file_selected">Ingen fil ble valgt</string>
<string name="activity_chooser_title">Send lenke til ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Kopierer fil fra privat lager</string>
<string name="oauth_check_onoff">Logg inn med oAuth2</string>
<string name="oauth_login_connection">Kobler til oAuth2 server...</string>
<string name="ssl_validator_header">Identiteten til siden kunne ikke verifiseres</string>
<string name="prefs_category_security">Sikkerhet</string>
<string name="prefs_instant_video_upload_path_title">Sti til video-opplasting</string>
<string name="download_folder_failed_content">Nedlasting av %1$s mappen kunne ikke fullføres</string>
- <string name="subject_token">%1$s har delt \"%2$s\" med deg</string>
+ <string name="shared_subject_header">delte</string>
+ <string name="with_you_subject_header">med deg</string>
+ <string name="subject_token">%1$s delte \"%2$s\" med deg</string>
<string name="auth_refresh_button">Oppfrisk forbindelse</string>
<string name="auth_host_address">Server-adresse</string>
+ <string name="common_error_out_memory">Ikke nok minne</string>
+ <string name="username">Brukernavn</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
</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">Alle bestanden</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Instellingen</string>
+ <string name="drawer_item_logs">Logs</string>
+ <string name="drawer_close">Sluiten</string>
<string name="prefs_category_general">Algemeen</string>
<string name="prefs_category_more">Meer</string>
<string name="prefs_accounts">Accounts</string>
<string name="prefs_manage_accounts">Beheer accounts</string>
- <string name="prefs_pincode">App PIN</string>
- <string name="prefs_pincode_summary">Beveilig je client</string>
+ <string name="prefs_passcode">Pincode slot</string>
<string name="prefs_instant_upload">Directe uploads van afbeeldingen</string>
<string name="prefs_instant_upload_summary">Direct uploaden van foto\'s genomen met de camera</string>
<string name="prefs_instant_video_upload">Direct uploaden van video\'s</string>
<string name="filedetails_download">Download</string>
<string name="filedetails_sync_file">Bestand verversen</string>
<string name="filedetails_renamed_in_upload_msg">Bestand is tijdens het uploaden hernoemd naar %1$s</string>
+ <string name="list_layout">Lijst layout</string>
<string name="action_share_file">Deel link</string>
<string name="action_unshare_file">Link niet meer delen</string>
<string name="common_yes">Ja</string>
<string name="foreign_files_local_text">Lokaal: %1$s</string>
<string name="foreign_files_remote_text">Extern: %1$s</string>
<string name="upload_query_move_foreign_files">Er is niet genoeg ruimte om de bestanden te gekopieëren in map %1$s. Wilt u ze erheen verplaatsten? </string>
- <string name="pincode_enter_pin_code">Voer App PIN in</string>
- <string name="pincode_configure_your_pin">Voer App PIN in</string>
- <string name="pincode_configure_your_pin_explanation">De PIN wordt steeds opnieuw gevraagd als de app wordt gestart</string>
- <string name="pincode_reenter_your_pincode">Voer App PIN opnieuw in</string>
- <string name="pincode_remove_your_pincode">Verwijder App PIN</string>
- <string name="pincode_mismatch">App PIN\'s komen niet overeen</string>
- <string name="pincode_wrong">Foutieve applicatie PIN</string>
- <string name="pincode_removed">App PIN verwijderd</string>
- <string name="pincode_stored">App PIN opgeslagen</string>
+ <string name="pass_code_enter_pass_code">Geef uw pincode op</string>
+ <string name="pass_code_configure_your_pass_code">Invoeren pincode</string>
+ <string name="pass_code_configure_your_pass_code_explanation">De pincode wordt elke keer gevraagd bij opstarten van de app</string>
+ <string name="pass_code_reenter_your_pass_code">Voer de pincode nogmaals in</string>
+ <string name="pass_code_remove_your_pass_code">Verwijderen pincode</string>
+ <string name="pass_code_mismatch">De pincodes komen niet overeen</string>
+ <string name="pass_code_wrong">Onjuiste pincode</string>
+ <string name="pass_code_removed">Pincode verwijderd</string>
+ <string name="pass_code_stored">Pincode opgeslagen</string>
<string name="media_notif_ticker">%1$s muziekspeler</string>
<string name="media_state_playing">%1$s (speelt)</string>
<string name="media_state_loading">%1$s (laden)</string>
<string name="sync_file_nothing_to_do_msg">Bestandsinhoud is al gesynchroniseerd</string>
<string name="create_dir_fail_msg">Map kon niet worden aangemaakt</string>
<string name="filename_forbidden_characters">Verboden tekens: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">De bestandsnaam bevat ten minste één ongeldig teken</string>
<string name="filename_empty">Bestandsnaam mag niet leeg zijn</string>
<string name="wait_a_moment">Even geduld</string>
<string name="filedisplay_unexpected_bad_get_content">Onverwacht probleem; probeer een andere app om het bestand te selecteren</string>
<string name="filedisplay_no_file_selected">Er werd geen bestand geselecteerd</string>
<string name="activity_chooser_title">Verstuur link naar ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Kopiëren bestand vanaf privéopslag</string>
<string name="oauth_check_onoff">Inloggen met oAuth2</string>
<string name="oauth_login_connection">Verbinden met oAuth2-server.</string>
<string name="ssl_validator_header">De identiteit van de site kan niet worden gecontroleerd</string>
<string name="prefs_category_security">Beveiliging</string>
<string name="prefs_instant_video_upload_path_title">Upload Video Pad</string>
<string name="download_folder_failed_content">Download van %1$s map kon niet worden voltooid</string>
+ <string name="shared_subject_header">gedeeld</string>
+ <string name="with_you_subject_header">met u</string>
<string name="subject_token">%1$s deelde \"%2$s\" met u</string>
<string name="auth_refresh_button">Verversen verbinding</string>
<string name="auth_host_address">Serveradres</string>
+ <string name="common_error_out_memory">Niet voldoende geheugen</string>
+ <string name="username">Gebruikersnaam</string>
</resources>
<string name="actionbar_send_file">Send</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Generelt</string>
<string name="prefs_category_more">Meir</string>
<string name="prefs_accounts">Kontoar</string>
<string name="prefs_manage_accounts">Behandle kontoar</string>
- <string name="prefs_pincode">Programpinkode</string>
- <string name="prefs_pincode_summary">Beskytt klienten din</string>
<string name="prefs_instant_upload">Last opp bilete omgåande</string>
<string name="prefs_instant_upload_summary">Last opp bilete når du tek dei med kameraet</string>
<string name="prefs_instant_video_upload">Last opp film</string>
<string name="common_choose_account">Vel konto</string>
<string name="sync_fail_ticker">Feil ved synkronisering</string>
<string name="sync_fail_content">Klarte ikkje å synkronisera ferdig %1$s</string>
- <string name="pincode_enter_pin_code">Ver venleg og skriv inn programpinkoden</string>
- <string name="pincode_configure_your_pin">Skriv inn programpinkoden</string>
- <string name="pincode_reenter_your_pincode">Ver venleg å skriv inn programpinkoden på nytt</string>
- <string name="pincode_remove_your_pincode">Fjern programpinkoden</string>
- <string name="pincode_mismatch">Programpinkodane er ikkje like</string>
- <string name="pincode_wrong">Feil programpinkode</string>
- <string name="pincode_removed">Programpinkode er fjerna</string>
- <string name="pincode_stored">Programpinkode er lagra</string>
<string name="auth_trying_to_login">Prøvar å logge på...</string>
<string name="auth_no_net_conn_title">Inga nettilkopling</string>
<string name="auth_nossl_plain_ok_title">Trygg tilkopling ikkje tilgjengeleg.</string>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
+ <string name="about_version">version %1$s</string>
<string name="actionbar_upload">Amontcarga</string>
<string name="actionbar_upload_files">Fichièrs</string>
+ <string name="actionbar_mkdir">Novèl dorsièr</string>
<string name="actionbar_settings">Configuracion</string>
+ <string name="actionbar_send_file">Mandar</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Paramètres</string>
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Mai d\'aquò</string>
<string name="prefs_accounts">Comptes</string>
<string name="prefs_manage_accounts">Maneja comptes</string>
<string name="prefs_help">Ajuda</string>
+ <string name="prefs_imprint">Mencions legalas</string>
<string name="auth_username">Nom d\'usancièr</string>
<string name="auth_password">Senhal</string>
<string name="sync_string_files">Fichièrs</string>
<string name="setup_btn_connect">Connecta</string>
<string name="uploader_btn_upload_text">Amontcarga</string>
+ <string name="uploader_btn_new_folder_text">Novèl dorsièr</string>
<string name="uploader_wrn_no_account_title">Cap de compte trobat</string>
<string name="uploader_wrn_no_account_setup_btn_text">Configuracion</string>
<string name="uploader_wrn_no_account_quit_btn_text">Quita</string>
<string name="filedetails_created">Creat :</string>
<string name="filedetails_modified">Modificat :</string>
<string name="filedetails_download">Avalcarga</string>
+ <string name="action_share_file">Partiment per ligam</string>
<string name="common_yes">Òc</string>
<string name="common_no">Non</string>
<string name="common_ok">D\'accòrdi</string>
<string name="common_cancel_upload"> Anulla l\'amontcargar</string>
<string name="common_cancel">Annula</string>
<string name="common_error">Error</string>
+ <string name="common_error_unknown">Error Desconeguda </string>
<string name="about_title">A prepaus</string>
<string name="change_password">Cambia lo senhal</string>
<string name="delete_account">Escafa lo compte</string>
<string name="create_account">Crea un compte</string>
<string name="upload_chooser_title">Avalcarga dempuèi ...</string>
+ <string name="uploader_info_dirname">Nom del dorsièr</string>
<string name="uploader_upload_in_progress_ticker">Al avalcargar ...</string>
<string name="uploader_upload_succeeded_ticker">Capitada d\'avalcargar</string>
<string name="common_choose_account">Causís lo compte</string>
- <string name="pincode_enter_pin_code">Dintras ton PIN d\'App, se te plai</string>
<string name="common_rename">Torna nomenar</string>
+ <string name="common_remove">Suprimir</string>
+ <string name="ssl_validator_label_C">País :</string>
+ <string name="activity_chooser_send_file_title">Mandar</string>
+ <string name="clipboard_text_copied">Copiat dins lo quichapapièrs</string>
<string name="empty"></string>
<string name="prefs_category_accounts">Comptes</string>
+ <string name="saml_authentication_required_text">Autentificacion requesida</string>
+ <string name="saml_authentication_wrong_pass">Senhal incorrècte</string>
<string name="folder_picker_choose_button_text">Causís</string>
+ <string name="auth_host_address">Adreça del servidor</string>
+ <string name="username">Nom d\'utilizaire</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_send_file">ਭੇਜੋ</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">ਆਮ</string>
<string name="prefs_accounts">ਅਕਾਊਂਟ</string>
<string name="prefs_log_title">ਲਾਗ ਰੱਖਣਾ ਚਾਲੂ</string>
<string name="foreign_files_fail">ਕੁਝ ਫਾਇਲਾਂ ਨੂੰ ਭੇਜਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</string>
<string name="foreign_files_local_text">ਲੋਕਲ: %1$s</string>
<string name="foreign_files_remote_text">ਰਿਮੋਟ: %1$s</string>
- <string name="pincode_enter_pin_code">ਆਪਣਾ ਐਪ ਪਿੰਨ ਦਿਉ ਜੀ</string>
<string name="media_notif_ticker">%1$s ਸੰਗੀਤ ਪਲੇਅਰ</string>
<string name="media_state_playing">%1$s (ਚੱਲਦਾ ਹੈ)</string>
<string name="media_state_loading">%1$s (ਲੋਡ ਹੁੰਦਾ ਹੈ)</string>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Ogólne</string>
<string name="prefs_category_more">Więcej</string>
<string name="prefs_accounts">Konta</string>
<string name="prefs_manage_accounts">Zarządzaj kontami</string>
- <string name="prefs_pincode">PIN aplikacji</string>
- <string name="prefs_pincode_summary">Chroń swojego klienta</string>
+ <string name="prefs_passcode">Blokowanie hasła</string>
<string name="prefs_instant_upload">natychmiastowa wysyłka obrazków</string>
<string name="prefs_instant_upload_summary">Wysyłaj od razu zdjęcia zrobione aparatem</string>
<string name="prefs_instant_video_upload">Natychmiastowa wysyłka wideo</string>
<string name="filedetails_download">Pobierz</string>
<string name="filedetails_sync_file">Odśwież plik</string>
<string name="filedetails_renamed_in_upload_msg">Podczas wysyłania nazwa pliku została zmieniona na %1$s</string>
+ <string name="list_layout">Lista szablonów wyglądu</string>
<string name="action_share_file">Udostępnij link</string>
<string name="action_unshare_file">Anuluj udostępnianie</string>
<string name="common_yes">Tak</string>
<string name="foreign_files_local_text">Lokalnie: %1$s</string>
<string name="foreign_files_remote_text">Zdalnie: %1$s</string>
<string name="upload_query_move_foreign_files">Nie ma wystarczająco miejśca, aby skopiować zaznaczone pliki do folderu %1$s. Chciałbyś je przenieść?</string>
- <string name="pincode_enter_pin_code">Podaj PIN aplikacji</string>
- <string name="pincode_configure_your_pin">Wpisz PIN aplikacji</string>
- <string name="pincode_configure_your_pin_explanation">Kod PIN będzie wymagany za każdym razem, gdy aplikacja będzie uruchamiana.</string>
- <string name="pincode_reenter_your_pincode">Ponownie wpisz PIN aplikacji</string>
- <string name="pincode_remove_your_pincode">Usuń PIN aplikacji</string>
- <string name="pincode_mismatch">Podane numery PIN są różne</string>
- <string name="pincode_wrong">Niepoprawny PIN aplikacji</string>
- <string name="pincode_removed">Usunięto PIN aplikacji</string>
- <string name="pincode_stored">Zapisano PIN aplikacji</string>
+ <string name="pass_code_enter_pass_code">Proszę podać swoje hasło</string>
+ <string name="pass_code_configure_your_pass_code">Wpisz swoje hasło</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Hasło będzie wymagane przy każdym uruchomieniu aplikacji</string>
+ <string name="pass_code_reenter_your_pass_code">Proszę powtórzyć hasło</string>
+ <string name="pass_code_remove_your_pass_code">Usuń swoje hasło</string>
+ <string name="pass_code_mismatch">Podane hasła nie są takie same</string>
+ <string name="pass_code_wrong">Nieprawidłowe hasło</string>
+ <string name="pass_code_removed">Hasło zostało usunięte</string>
+ <string name="pass_code_stored">Hasło zostało zapisane</string>
<string name="media_notif_ticker">%1$s odtwarzacz muzyki</string>
<string name="media_state_playing">%1$s (odtwarzany)</string>
<string name="media_state_loading">%1$s (wczytywany)</string>
<string name="filedisplay_unexpected_bad_get_content">Nieoczekiwany problem; spróbuj wybrać plik z innej aplikacji</string>
<string name="filedisplay_no_file_selected">Nie wybrano żadnych plików</string>
<string name="activity_chooser_title">Wyślij link do ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Kopiowanie pliku z prywatnego zasobu</string>
<string name="oauth_check_onoff">Loguj przez oAuth2</string>
<string name="oauth_login_connection">Łączenie z serwerem oAuth2...</string>
<string name="ssl_validator_header">Nie można zweryfikować tożsamości strony</string>
<string name="prefs_category_security">Bezpieczeństwo</string>
<string name="prefs_instant_video_upload_path_title">Katalog wysyłania dla wideo</string>
<string name="download_folder_failed_content">Pobieranie %1$s katalogu nie może zostać ukończone</string>
- <string name="subject_token">%1$s wspólne \"%2$s\" z tobą</string>
<string name="auth_refresh_button">Odśwież połączenie</string>
<string name="auth_host_address">Adres Serwera</string>
+ <string name="common_error_out_memory">Brak wystarczającej pamięci</string>
</resources>
</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">Todos os arquivos</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Configurações</string>
+ <string name="drawer_item_logs">Logs</string>
+ <string name="drawer_close">Fechar</string>
<string name="prefs_category_general">Geral</string>
<string name="prefs_category_more">Mais</string>
<string name="prefs_accounts">Contas</string>
<string name="prefs_manage_accounts">Gerenciar Contas</string>
- <string name="prefs_pincode">PIN App</string>
- <string name="prefs_pincode_summary">Proteja seu cliente</string>
+ <string name="prefs_passcode">Bloqueio de senha</string>
<string name="prefs_instant_upload">Envio instantâneo de imagem</string>
<string name="prefs_instant_upload_summary">Enviar instantaneamente fotos tiradas com a camera</string>
<string name="prefs_instant_video_upload">Envio instantâneo de vídeos</string>
<string name="filedetails_download">Baixar</string>
<string name="filedetails_sync_file">Atualizar arquivo</string>
<string name="filedetails_renamed_in_upload_msg">Arquivo foi renomeado para %1$s durante o envio</string>
+ <string name="list_layout">Lista de Layout</string>
<string name="action_share_file">Compartilhar link</string>
<string name="action_unshare_file">Descompartilhar o link</string>
<string name="common_yes">Sim</string>
<string name="foreign_files_local_text">Local: %1$s</string>
<string name="foreign_files_remote_text">Remoto: %1$s</string>
<string name="upload_query_move_foreign_files">Não existe espaço suficiente para copiar os arquivos selecionados para a pasta %1$s. Você gostaria de ao invés de copiar movê-los? </string>
- <string name="pincode_enter_pin_code">Por favor, insira o seu PIN de Aplicativo</string>
- <string name="pincode_configure_your_pin">Insira seu PIN de Aplicativo</string>
- <string name="pincode_configure_your_pin_explanation">O PIN (senha) será solicitado toda vez que o aplicativo for iniciado</string>
- <string name="pincode_reenter_your_pincode">Por favor, reinsira seu PIN de Aplicativo</string>
- <string name="pincode_remove_your_pincode">Remova seu PIN de Aplicativo</string>
- <string name="pincode_mismatch">Os PINs de Aplicativo não são iguais</string>
- <string name="pincode_wrong">PIN de Aplicativo incorreto</string>
- <string name="pincode_removed">PIN de Aplicativo removido</string>
- <string name="pincode_stored">PIN de Aplicativo armazenado</string>
+ <string name="pass_code_enter_pass_code">Por favor, insira o código de acesso</string>
+ <string name="pass_code_configure_your_pass_code">Digite o código de acesso</string>
+ <string name="pass_code_configure_your_pass_code_explanation">O código de acesso será solicitado toda vez que o aplicativo é iniciado</string>
+ <string name="pass_code_reenter_your_pass_code">Por favor, insira novamente o seu código de acesso</string>
+ <string name="pass_code_remove_your_pass_code">Remover o seu código de acesso</string>
+ <string name="pass_code_mismatch">Os códigos de acesso não são os mesmos</string>
+ <string name="pass_code_wrong">Código de acesso incorreto</string>
+ <string name="pass_code_removed">Código de acesso removido</string>
+ <string name="pass_code_stored">Código de acesso armazenado</string>
<string name="media_notif_ticker">%1$s reprodutor de música</string>
<string name="media_state_playing">%1$s (reproduzindo)</string>
<string name="media_state_loading">%1$s (carregando)</string>
<string name="sync_file_nothing_to_do_msg">Conteúdo do arquivo já foi sincronizado</string>
<string name="create_dir_fail_msg">A pasta não pode ser criada</string>
<string name="filename_forbidden_characters">Caracteres proibidos: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">O nome do arquivo contem pelo menos um caractere inválido </string>
<string name="filename_empty">O nome do arquivo não pode estar vazio</string>
<string name="wait_a_moment">Aguarde um momento</string>
<string name="filedisplay_unexpected_bad_get_content">Problema inesperado; por favor, tente selecionar o arquivo com outro app</string>
<string name="filedisplay_no_file_selected">Nenhum arquivo foi selecionado</string>
<string name="activity_chooser_title">Enviar o link para</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Copiando o arquivo de armazenagem privada</string>
<string name="oauth_check_onoff">Login com oAuth2</string>
<string name="oauth_login_connection">Conectando-se a oAuth2 servidor ...</string>
<string name="ssl_validator_header">A identidade do site não pode ser verificada</string>
<string name="prefs_category_security">Segurança</string>
<string name="prefs_instant_video_upload_path_title">Enviar o Caminho do Vídeo</string>
<string name="download_folder_failed_content">Baixar %1$s da pasta não pode ser completado</string>
- <string name="subject_token">%1$s compartilhou \"%2$s\" com você</string>
+ <string name="shared_subject_header">compartilhado</string>
+ <string name="with_you_subject_header">com você</string>
<string name="auth_refresh_button">Reinicializar conexão</string>
<string name="auth_host_address">Endereço do servidor</string>
+ <string name="common_error_out_memory">Não há memoria suficiente</string>
+ <string name="username">Nome do Usuário</string>
</resources>
</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">Todos os ficheiros</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Definições</string>
+ <string name="drawer_close">Fechar</string>
<string name="prefs_category_general">Geral</string>
<string name="prefs_category_more">Mais</string>
<string name="prefs_accounts">Contas</string>
<string name="prefs_manage_accounts">Gerir Contas</string>
- <string name="prefs_pincode">PIN da App</string>
- <string name="prefs_pincode_summary">Proteja o seu cliente</string>
<string name="prefs_instant_upload">Envios instantâneos de imagens</string>
<string name="prefs_instant_upload_summary">Envio instantâneo de imagens tiradas com a câmara</string>
<string name="prefs_instant_video_upload">Envios instantâneos dos vídeos</string>
<string name="filedetails_sync_file">Atualizar ficheiro</string>
<string name="filedetails_renamed_in_upload_msg">O ficheiro foi renomeado para %1$s durante o envio.</string>
<string name="action_share_file">Partilhar a hiperligação</string>
- <string name="action_unshare_file">Deixar de partilhar a hiperligação</string>
+ <string name="action_unshare_file">Cancelar partilha da hiperligação</string>
<string name="common_yes">Sim</string>
<string name="common_no">Não</string>
<string name="common_ok">ACEITAR</string>
<string name="uploader_upload_succeeded_content_single">%1$s foi enviado com sucesso</string>
<string name="uploader_upload_failed_ticker">Não foi possível enviar</string>
<string name="uploader_upload_failed_content_single">Não foi possível concluir o envio de %1$s.</string>
- <string name="uploader_upload_failed_credentials_error">Falha no carregamento, é necessário fazer novo login</string>
+ <string name="uploader_upload_failed_credentials_error">Falha no envio, precisa de reiniciar a sessão</string>
<string name="downloader_download_in_progress_ticker">A transferir...</string>
<string name="downloader_download_in_progress_content">%1$d%% A transferir %2$s</string>
<string name="downloader_download_succeeded_ticker">Transferência bem sucedida</string>
<string name="downloader_download_failed_credentials_error">Não foi possível transferir, tem de iniciar a sessão novamente</string>
<string name="common_choose_account">Escolha a conta</string>
<string name="sync_fail_ticker">Falhou a sincronização</string>
- <string name="sync_fail_ticker_unauthorized">Falhou a sincronização, necessita fazer um novo login</string>
- <string name="sync_fail_content">Não foi possível sincronizar %1$s</string>
+ <string name="sync_fail_ticker_unauthorized">Falhou a sincronização, precisa de reiniciar a sessão</string>
+ <string name="sync_fail_content">Não foi possível concluir a sincronização de %1$s</string>
<string name="sync_fail_content_unauthorized">Senha inválida para %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">Foram encontrados conflitos</string>
<string name="sync_conflicts_in_favourites_content">Não foi possível sincronizar o ficheiro %1$d</string>
<string name="sync_fail_in_favourites_ticker">Falhou a operação de manter os ficheiros sincronizados</string>
- <string name="sync_fail_in_favourites_content">Não foi possível sincronizar o conteúdo de %1$d ficheiros (%2$d conflictos)</string>
+ <string name="sync_fail_in_favourites_content">Não foi possível sincronizar o conteúdo de %1$d ficheiros (%2$d conflitos)</string>
<string name="sync_foreign_files_forgotten_ticker">Alguns ficheiros locais ficaram esquecidos</string>
<string name="sync_foreign_files_forgotten_content">Nao foi possivel copiar os ficheiros %1$d da pasta %2$s para</string>
<string name="sync_foreign_files_forgotten_explanation">Tal como na versão 1.3.16, os ficheiros que foram enviados deste dispositivo são copiados para a pasta local %1$s para prevenir perda de dados quando um ficheiro é partilhado com várias contas.\n\nDevido a esta alteração, todos os ficheiros das versões anteriores foram copiados para a pasta %2$s. No entanto, um erro impediu a conclusão deste processo durante a sincronização da conta. Pode deixar o ficheiro(s) como estão e remover o link para %3$s, ou mover o(s) ficheiro(s) para a pasta %1$s e guardar o link para %4$s. \n\nEm baixo estão listados ficheiro(s) locais e remotos em %5$s que foram ligados.</string>
<string name="foreign_files_local_text">Local: %1$s</string>
<string name="foreign_files_remote_text">Remoto: %1$s</string>
<string name="upload_query_move_foreign_files">Não existe espaço disponível para copiar o ficheiro seleccionado para a pasta %1$s . Em vez disso deseja mover o ficheiro?</string>
- <string name="pincode_enter_pin_code">Por favor, insira o PIN da App</string>
- <string name="pincode_configure_your_pin">Insira o PIN da App</string>
- <string name="pincode_configure_your_pin_explanation">O PIN será pedido sempre que a app seja iniciada.</string>
- <string name="pincode_reenter_your_pincode">Por favor, reinsira o PIN da App</string>
- <string name="pincode_remove_your_pincode">Remover o seu PIN da App</string>
- <string name="pincode_mismatch">Os CÓDIGOS da APP não são iguais</string>
- <string name="pincode_wrong">CÓDIGO da App Incorreto</string>
- <string name="pincode_removed">CÓDIGOS da App removido</string>
- <string name="pincode_stored">CÓDIGO da App guardado</string>
- <string name="media_notif_ticker">%1$s leitor de música</string>
+ <string name="media_notif_ticker">%1$s reprodutor de música</string>
<string name="media_state_playing">%1$s (a reproduzir)</string>
<string name="media_state_loading">%1$s (a carregar)</string>
- <string name="media_event_done">%1$s leitura terminada</string>
- <string name="media_err_nothing_to_play">Não foi encontrado nenhum ficheiro de média</string>
- <string name="media_err_no_account">Não foi fornecida conta</string>
+ <string name="media_event_done">%1$s reprodução terminada</string>
+ <string name="media_err_nothing_to_play">Não foi encontrado nenhum ficheiro de multimédia</string>
+ <string name="media_err_no_account">Não foi indicada uma conta</string>
<string name="media_err_not_in_owncloud">O ficheiro não está numa conta válida</string>
<string name="media_err_unsupported">Codec de multimédia não suportado</string>
<string name="media_err_io">Não foi possível ler o ficheiro de multimédia</string>
- <string name="media_err_malformed">Ficheiro erradamente codificado (codec)</string>
- <string name="media_err_timeout">O tempo de espera para jogar expirou</string>
- <string name="media_err_invalid_progressive_playback">O ficheiro não pode ser reproduzido (streaming)</string>
+ <string name="media_err_malformed">O ficheiro de multimédia não foi codificado corretamente</string>
+ <string name="media_err_timeout">Tempo expirado enquanto tentava jogar</string>
+ <string name="media_err_invalid_progressive_playback">O ficheiro de multimédia não pôde ser transmitido</string>
<string name="media_err_unknown">O ficheiro não pode ser reproduzido com o leitor de média de origem</string>
<string name="media_err_security_ex">Erro de segurança a tentar reproduzir o ficheiro %1$s</string>
<string name="media_err_io_ex">Erro de input a tentar reproduzir %1$s</string>
<string name="prefs_category_security">Segurança</string>
<string name="prefs_instant_video_upload_path_title">Envio do Caminho do Vídeo</string>
<string name="download_folder_failed_content">Não foi possível completar o download da pasta %1$s</string>
- <string name="subject_token">%1$s partilhou \"%2$s\" consigo</string>
+ <string name="shared_subject_header">partilhado</string>
+ <string name="with_you_subject_header">consigo</string>
<string name="auth_refresh_button">Recarregar ligação</string>
<string name="auth_host_address">Endereço do servidor</string>
+ <string name="common_error_out_memory">Falta de memória</string>
+ <string name="username">Nome de utilizador</string>
</resources>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">Mai mult</string>
<string name="prefs_accounts">Conturi</string>
<string name="prefs_manage_accounts">Administrare conturi</string>
- <string name="prefs_pincode">PIN-ul aplicaţiei</string>
- <string name="prefs_pincode_summary">Protejaţi-vă clientul</string>
<string name="prefs_instant_upload">Încărcare instantă de imagini</string>
<string name="prefs_instant_upload_summary">Încarcă instantant imagini luate cu camera</string>
<string name="prefs_instant_video_upload">Încărcare instantă de videoclipuri.</string>
<string name="foreign_files_remote_text">La distanta: %1$s</string>
<string name="upload_query_move_foreign_files">Nu este suficient spațiu pentru a copia fișierele selectate în dosarul %1$s . Dorești să le muți în loc?
</string>
- <string name="pincode_enter_pin_code">Te rugăm să specifici PIN-ul aplicației</string>
- <string name="pincode_configure_your_pin">Introduceti PIN-ul aplicatiei</string>
- <string name="pincode_configure_your_pin_explanation">PIN-ul va fi solicitat ori de cate ori aplicaţia este pornita</string>
- <string name="pincode_reenter_your_pincode">Va rugam , reintroduceti PIN-ul aplicatiei</string>
- <string name="pincode_remove_your_pincode">Elimină PIN-ul aplicației</string>
- <string name="pincode_mismatch">Cele două PIN-uri ale aplicației nu sunt similare</string>
- <string name="pincode_wrong">PIN-ul aplicației este incorect</string>
- <string name="pincode_removed">PIN-ul aplicației a fost eliminat</string>
- <string name="pincode_stored">PIN-ul aplicației a fost memorat</string>
<string name="media_notif_ticker">%1$s player de muzică</string>
<string name="media_state_playing">%1$s (cântă)</string>
<string name="media_state_loading">%1$s (încarcă)</string>
<string name="prefs_category_security">Securitate</string>
<string name="prefs_instant_video_upload_path_title">Calea de încărcare Video</string>
<string name="download_folder_failed_content">Descărcarea fișierului %1$s nu s-a finisat</string>
- <string name="subject_token">%1$s partajat \"%2$s\" cu tine</string>
<string name="auth_refresh_button">Reîmprospătează conexiunea</string>
<string name="auth_host_address">Adresa server-ului</string>
</resources>
</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">Все файлы</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Настройки</string>
+ <string name="drawer_item_logs">Журналы</string>
+ <string name="drawer_close">Закрыть</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">PIN приложения</string>
- <string name="prefs_pincode_summary">Защитить ваш клиент</string>
+ <string name="prefs_passcode">Блокировка кодом</string>
<string name="prefs_instant_upload">Мгновенная загрузка фотографий</string>
<string name="prefs_instant_upload_summary">Немедленно загружать фотографии сделанные камерой</string>
<string name="prefs_instant_video_upload">Мгновенная загрузка видео</string>
<string name="filedetails_download">Скачать</string>
<string name="filedetails_sync_file">Обновить файл</string>
<string name="filedetails_renamed_in_upload_msg">Файл был переименован в %1$s во время загрузки</string>
+ <string name="list_layout">Макет списка</string>
<string name="action_share_file">Поделиться ссылкой</string>
<string name="action_unshare_file">Убрать ссылку</string>
<string name="common_yes">Да</string>
<string name="foreign_files_local_text">Локальные: %1$s</string>
<string name="foreign_files_remote_text">Удаленные: %1$s</string>
<string name="upload_query_move_foreign_files">Для копирования выбранных файлов в каталог %1$s недостаточно свободного места. Скопировать в другое место?</string>
- <string name="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="pass_code_enter_pass_code">Пожалуйста, укажите код</string>
+ <string name="pass_code_configure_your_pass_code">Укажите ваш код</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Код будет запрашиваться каждый раз при запуске приложения</string>
+ <string name="pass_code_reenter_your_pass_code">Пожалуйста, укажите код ещё раз</string>
+ <string name="pass_code_remove_your_pass_code">Убрать код</string>
+ <string name="pass_code_mismatch">Коды не совпадают</string>
+ <string name="pass_code_wrong">Некоррентный код</string>
+ <string name="pass_code_removed">Код удален</string>
+ <string name="pass_code_stored">Код сохранен</string>
<string name="media_notif_ticker">%1$s аудиоплеер</string>
<string name="media_state_playing">%1$s (проигрывается)</string>
<string name="media_state_loading">%1$s (загружается)</string>
<string name="sync_file_nothing_to_do_msg">Содержимое файла уже синхронизировано</string>
<string name="create_dir_fail_msg">Невозможно создать каталог</string>
<string name="filename_forbidden_characters">Недопустимые символы: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Имя файла содержит по крайней мере один некорректный символ</string>
<string name="filename_empty">Имя файла не может быть пустым</string>
<string name="wait_a_moment">Подождите немного</string>
<string name="filedisplay_unexpected_bad_get_content">Неизвестная ошибка; выберите этот файл из другого приложения</string>
<string name="filedisplay_no_file_selected">Файлы не выбраны</string>
<string name="activity_chooser_title">Отправить ссылку ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Копирование файла из частной хранилища</string>
<string name="oauth_check_onoff">Войти через oAuth2</string>
<string name="oauth_login_connection">Подключение к серверу oAuth2...</string>
<string name="ssl_validator_header">Подлинность сайта не может быть проверена</string>
<string name="prefs_category_security">Безопасность</string>
<string name="prefs_instant_video_upload_path_title">Путь для загрузки Видео</string>
<string name="download_folder_failed_content">Загрузка папки %1$s не может быть завершена</string>
+ <string name="shared_subject_header">поделился</string>
+ <string name="with_you_subject_header">с вами</string>
<string name="subject_token">%1$s предоставил вам доступ к \"%2$s\"</string>
<string name="auth_refresh_button">Обновить соединение</string>
<string name="auth_host_address">Адрес сервера</string>
+ <string name="common_error_out_memory">Недостаточно памяти</string>
+ <string name="username">Имя пользователя</string>
</resources>
<string name="actionbar_settings">සිටුවම්</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="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_summary">ඔබේ සේවාලාභියා සුරකින්න</string>
<string name="prefs_help">උදව්</string>
<string name="auth_username">පරිශීලක නම</string>
<string name="auth_password">මුර පදය</string>
</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">Všetky súbory</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Nastavenia</string>
+ <string name="drawer_item_logs">Logy</string>
+ <string name="drawer_close">Zavrieť</string>
<string name="prefs_category_general">Všeobecné</string>
<string name="prefs_category_more">Viac</string>
<string name="prefs_accounts">Účty</string>
<string name="prefs_manage_accounts">Správa účtov</string>
- <string name="prefs_pincode">PIN aplikácie</string>
- <string name="prefs_pincode_summary">Chrániť klienta aplikácie</string>
<string name="prefs_instant_upload">Okamžité nahratie obrázka</string>
<string name="prefs_instant_upload_summary">Okamžite nahrať obrázok zaznamenaný fotoaparátom</string>
<string name="prefs_instant_video_upload">Okamžité nahranie videa</string>
<string name="foreign_files_local_text">Lokálne: %1$s</string>
<string name="foreign_files_remote_text">Vzdialené: %1$s</string>
<string name="upload_query_move_foreign_files">Nie je dostatok miesta na skopírovanie vybraných súborov do priečinka %1$s. Želáte si ich namiesto toho presunúť?</string>
- <string name="pincode_enter_pin_code">Zadajte PIN aplikácie</string>
- <string name="pincode_configure_your_pin">Zadajte PIN aplikácie</string>
- <string name="pincode_configure_your_pin_explanation">Pri každom spustení aplikácie bude vyžadovaný PIN</string>
- <string name="pincode_reenter_your_pincode">Zadajte znovu PIN aplikácie</string>
- <string name="pincode_remove_your_pincode">Zrušiť PIN pre aplikáciu</string>
- <string name="pincode_mismatch">PINy sa neshodujú</string>
- <string name="pincode_wrong">Nesprávny PIN aplikácie</string>
- <string name="pincode_removed">PIN aplikácie bol odstránený</string>
- <string name="pincode_stored">PIN aplikácie bol uložený</string>
+ <string name="pass_code_enter_pass_code">Prosím, vložte svoje heslo:</string>
+ <string name="pass_code_configure_your_pass_code">Vložte svoje heslo</string>
+ <string name="pass_code_reenter_your_pass_code">Prosím, vložte znovu svoje heslo:</string>
+ <string name="pass_code_remove_your_pass_code">Zmazať svoje heslo</string>
<string name="media_notif_ticker">Prehrávač hudby %1$s</string>
<string name="media_state_playing">%1$s (prehráva)</string>
<string name="media_state_loading">%1$s (načítava)</string>
<string name="auth_no_net_conn_title">Bez sieťového pripojenia</string>
<string name="auth_nossl_plain_ok_title">Nie je k dispozícii bezpečné pripojenie</string>
<string name="auth_connection_established">Pripojenie vytvorené</string>
+ <string name="auth_testing_connection">Testuje sa pripojenie</string>
<string name="auth_not_configured_title">Nesprávna konfigurácia servera</string>
<string name="auth_account_not_new">Účet pre tohoto používateľa a tento server už v tomto zariadení existuje</string>
<string name="auth_account_not_the_same">Zadané prihlasovacie údaje používateľa sú nesprávne</string>
<string name="share_link_file_error">Pri pokuse o zdieľanie tohto súboru alebo priečinka došlo k chybe</string>
<string name="unshare_link_file_no_exist">Nemožno ukončiť zdieľanie. Skontrolujte, či súbor existuje</string>
<string name="unshare_link_file_error">Pri pokuse zrušiť zdieľanie tohto súboru alebo priečinka došlo k chybe</string>
+ <string name="share_link_password_title">Vložte heslo</string>
+ <string name="share_link_empty_password">Musíte vložiť heslo</string>
<string name="activity_chooser_send_file_title">Odoslať</string>
<string name="copy_link">Kopíruj odkaz</string>
<string name="clipboard_text_copied">Skopírované do schránky</string>
<string name="prefs_category_security">Zabezpečenie</string>
<string name="prefs_instant_video_upload_path_title">Cesta pre nahrávanie videí</string>
<string name="download_folder_failed_content">Sťahovanie %1$s priečinka nebolo dokončené</string>
- <string name="subject_token">%1$s vám zdieľa „%2$s“</string>
+ <string name="shared_subject_header">zdieľané</string>
+ <string name="with_you_subject_header">s vami</string>
+ <string name="subject_token">%1$s vám zdieľal \"%2$s\"</string>
+ <string name="auth_refresh_button">Obnoviť pripojenie</string>
<string name="auth_host_address">Adresa servera</string>
+ <string name="common_error_out_memory">Nedostatok pamäte</string>
+ <string name="username">Používateľské meno</string>
</resources>
</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">Vse datoteke</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Nastavitve</string>
+ <string name="drawer_item_logs">Dnevnik</string>
+ <string name="drawer_close">Zapri</string>
<string name="prefs_category_general">Splošno</string>
<string name="prefs_category_more">Več</string>
<string name="prefs_accounts">Računi</string>
<string name="prefs_manage_accounts">Upravljanje z računi</string>
- <string name="prefs_pincode">Koda PIN programa</string>
- <string name="prefs_pincode_summary">Zaščitite odjemalec</string>
+ <string name="prefs_passcode">Zaklep s kodo PIN</string>
<string name="prefs_instant_upload">Takojšnje pošiljanje slik</string>
<string name="prefs_instant_upload_summary">Takojšnje pošiljanje slik, zajetih s fotoaparatom, na strežnik</string>
<string name="prefs_instant_video_upload">Takojšnje pošiljanje posnetkov</string>
<string name="filedetails_download">Prejmi</string>
<string name="filedetails_sync_file">Osveži datoteko</string>
<string name="filedetails_renamed_in_upload_msg">Datoteka je bila med nalaganjem preimenovana v %1$s</string>
+ <string name="list_layout">Postavitev seznama</string>
<string name="action_share_file">Povezava za souporabo</string>
<string name="action_unshare_file">Odstrani možnost souporabe</string>
<string name="common_yes">Da</string>
<string name="foreign_files_local_text">Krajevno: %1$s</string>
<string name="foreign_files_remote_text">Oddaljeno: %1$s</string>
<string name="upload_query_move_foreign_files">Ni dovolj prostora za kopiranje izbranih datotek v mapo %1$s. Ali jih želite premakniti?</string>
- <string name="pincode_enter_pin_code">Vnesite kodo PIN programa</string>
- <string name="pincode_configure_your_pin">Vnesite kodo PIN programa</string>
- <string name="pincode_configure_your_pin_explanation">Koda PIN bo zahtevana vsakič pred zagonom programa.</string>
- <string name="pincode_reenter_your_pincode">Ponovno vnesite kodo PIN programa</string>
- <string name="pincode_remove_your_pincode">Odstrani kodo PIN programa</string>
- <string name="pincode_mismatch">Vrednosti kod PIN programa nista enaki</string>
- <string name="pincode_wrong">Nepravilna koda PIN programa</string>
- <string name="pincode_removed">Koda PIN programa je odstranjena</string>
- <string name="pincode_stored">Koda PIN programa je shranjena</string>
+ <string name="pass_code_enter_pass_code">Vnesite kodo PIN programa</string>
+ <string name="pass_code_configure_your_pass_code">Vnesite kodo PIN programa</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Koda bo zahtevana vsakič pred zagonom programa.</string>
+ <string name="pass_code_reenter_your_pass_code">Ponovno vnesite kodo</string>
+ <string name="pass_code_remove_your_pass_code">Odstrani kodo PIN programa</string>
+ <string name="pass_code_mismatch">Vpisani kodi PIN nista enaki</string>
+ <string name="pass_code_wrong">Napačna koda PIN</string>
+ <string name="pass_code_removed">Koda PIN je odstranjena</string>
+ <string name="pass_code_stored">Koda PIN je shranjena</string>
<string name="media_notif_ticker">Predvajalnik glasbe %1$s</string>
<string name="media_state_playing">%1$s (se predvaja)</string>
<string name="media_state_loading">%1$s (se nalaga)</string>
<string name="sync_file_nothing_to_do_msg">Vsebina datoteke je že usklajena</string>
<string name="create_dir_fail_msg">Mape ni mogoče ustvariti</string>
<string name="filename_forbidden_characters">Nedovoljeni znaki: characters: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Ime datoteke vsebuje vsaj en neveljaven znak.</string>
<string name="filename_empty">Ime datoteke ne sme biti prazno</string>
<string name="wait_a_moment">Počakajte trenutek ...</string>
<string name="filedisplay_unexpected_bad_get_content">Prišlo je do nepričakovane napake. Poskusite datoteko izbrati z drugim programom.</string>
<string name="filedisplay_no_file_selected">Ni izbranih datotek</string>
<string name="activity_chooser_title">Pošlji povezavo ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Kopiranje datoteke iz zasebne shrambe</string>
<string name="oauth_check_onoff">Prijava z oAuth2</string>
<string name="oauth_login_connection">Poteka povezovanje s strežnikom oAuth2 ...</string>
<string name="ssl_validator_header">Istovetnosti strani ni mogoče preveriti</string>
<string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">Pošiljaj slike le preko povezav Wi-Fi</string>
<string name="instant_video_upload_on_wifi">Pošlji posnetke le preko povezave Wi-Fi</string>
- <string name="instant_upload_path">/TakojšnjePošiljanje</string>
+ <string name="instant_upload_path">/Poslano</string>
<string name="conflict_title">Posodobi podatke spora</string>
<string name="conflict_message">Oddaljena datoteka %s ni usklajena s krajevno. Z nadaljevanem bo datoteka na strežniku zamenjana s krajevno.</string>
<string name="conflict_keep_both">Ohrani obe</string>
<string name="prefs_category_security">Varnost</string>
<string name="prefs_instant_video_upload_path_title">Pot videa za pošiljanje</string>
<string name="download_folder_failed_content">Imenika %1$s ni mogoče prejeti v celoti</string>
- <string name="subject_token">Uporabnik %1$s je omogočil souporabo \"%2$s\".</string>
+ <string name="shared_subject_header">v souporabi</string>
+ <string name="with_you_subject_header">z vami</string>
<string name="auth_refresh_button">Osveži povezavo</string>
<string name="auth_host_address">Naslov strežnika</string>
+ <string name="common_error_out_memory">Ni dovolj pomnilnika</string>
+ <string name="username">Uporabniško ime</string>
</resources>
<string name="actionbar_send_file">Dërgo</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Përgjithshme</string>
<string name="prefs_category_more">Më tepër</string>
<string name="prefs_accounts">Llogarit</string>
- <string name="prefs_pincode">PIN-i Aplikacionit</string>
- <string name="prefs_pincode_summary">Ruani klientin tuaj</string>
<string name="prefs_help">Ndihmë</string>
<string name="prefs_imprint">Stampoj</string>
<string name="auth_username">Përdoruesi</string>
<string name="downloader_download_succeeded_content">%1$s u shkarkua me sukses</string>
<string name="downloader_download_failed_ticker">Shkarkimi dështoj</string>
<string name="common_choose_account">Zgjidhni Llogarine</string>
- <string name="pincode_enter_pin_code">Lutemi, vendosni PIN tuaj</string>
- <string name="pincode_reenter_your_pincode">Lutemi, rivendosni PIN tuaj</string>
- <string name="pincode_remove_your_pincode">Hiqni PIN in tuaj</string>
- <string name="pincode_mismatch">PIN-et nuk jane te njejte</string>
- <string name="pincode_wrong">PIN i gabuar</string>
- <string name="pincode_removed">PIN-i u hoq</string>
- <string name="pincode_stored">PIN-i u ruajt</string>
<string name="auth_no_net_conn_title">Nuk ka lidhje ne Rrjet</string>
<string name="auth_connection_established">Lidhja u vendos</string>
<string name="auth_secure_connection">Lidhja e Sigurt vendos</string>
<string name="actionbar_send_file">Pošalji</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Opšte</string>
<string name="prefs_accounts">Nalozi</string>
<string name="prefs_manage_accounts">Upravljaj nalozima</string>
<string name="common_cancel">Otkaži</string>
<string name="common_error">Greška</string>
<string name="common_error_unknown">Nepoznata greška</string>
+ <string name="about_title">O programu</string>
<string name="change_password">Izmeni lozinku</string>
<string name="delete_account">Ukloni nalog</string>
<string name="create_account">Novi nalog</string>
<string name="ssl_validator_label_signature">Potpis:</string>
<string name="conflict_keep_both">Zadrži oboje</string>
<string name="activity_chooser_send_file_title">Pošalji</string>
+ <string name="clipboard_text_copied">Kopirano u klipbord</string>
<string name="empty"></string>
<string name="prefs_category_accounts">Nalozi</string>
<string name="folder_picker_choose_button_text">Izaberi</string>
<string name="about_version">верзија %1$s</string>
<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_upload_from_apps">садржај из других апликација</string>
+ <string name="actionbar_upload_files">фајлове</string>
<string name="actionbar_open_with">Отвори помоћу</string>
<string name="actionbar_mkdir">Нова фасцикла</string>
<string name="actionbar_settings">Поставке</string>
<string name="actionbar_see_details">Детаљи</string>
<string name="actionbar_send_file">Пошаљи</string>
- <string name="actionbar_sort">Разврстај</string>
+ <string name="actionbar_sort">Разврставање</string>
<string name="actionbar_sort_title">Разврставање</string>
<string-array name="actionbar_sortby">
<item>A-Z</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">Сви фајлови</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Поставке</string>
+ <string name="drawer_item_logs">Записници</string>
+ <string name="drawer_close">Затвори</string>
<string name="prefs_category_general">Опште</string>
- <string name="prefs_category_more">Ð\92иÑ\88е</string>
+ <string name="prefs_category_more">Ð\9eÑ\81Ñ\82ало</string>
<string name="prefs_accounts">Налози</string>
<string name="prefs_manage_accounts">Управљање налозима</string>
- <string name="prefs_pincode">ПИБ апликације</string>
- <string name="prefs_pincode_summary">Заштитите програм</string>
- <string name="prefs_instant_upload">Тренутно отпремање фотографија</string>
- <string name="prefs_instant_upload_summary">Тренутно отпремај фотографије сликане камером</string>
- <string name="prefs_instant_video_upload">Тренутно отпремање видеа</string>
- <string name="prefs_instant_video_upload_summary">Тренутно отпремај видео снимљен камером</string>
+ <string name="prefs_passcode">Закључавање кодом</string>
+ <string name="prefs_instant_upload">Отпремање фотографија</string>
+ <string name="prefs_instant_upload_summary">тренутно отпремај фотографије сликане камером</string>
+ <string name="prefs_instant_video_upload">Отпремање видеа</string>
+ <string name="prefs_instant_video_upload_summary">тренутно отпремај видео снимљен камером</string>
<string name="prefs_log_title">Укључи бележење</string>
- <string name="prefs_log_summary">Ð\9eво Ñ\81е коÑ\80иÑ\81Ñ\82и за бележење проблема</string>
+ <string name="prefs_log_summary">коÑ\80иÑ\81Ñ\82и Ñ\81е за бележење проблема</string>
<string name="prefs_log_title_history">Историјат бележења</string>
- <string name="prefs_log_summary_history">Ð\9eво пÑ\80иказÑ\83Ñ\98е Ñ\81аÑ\87Ñ\83ване запиÑ\81нике</string>
+ <string name="prefs_log_summary_history">приказује сачуване записнике</string>
<string name="prefs_log_delete_history_button">Обриши историјат</string>
<string name="prefs_help">Помоћ</string>
<string name="prefs_recommend">Препоручи пријатељу</string>
<string name="prefs_feedback">Ваше мишљење</string>
<string name="prefs_imprint">Жиг</string>
<string name="prefs_remember_last_share_location">Упамти локацију дељења</string>
- <string name="prefs_remember_last_upload_location_summary">Ð\9fамти последњу локацију отпремања дељења</string>
+ <string name="prefs_remember_last_upload_location_summary">памти последњу локацију отпремања дељења</string>
<string name="recommend_subject">Пробајте %1$s на вашем телефону!</string>
<string name="recommend_text">Предлажем вам да пробате %1$s на вашем телефону!\nПреузмите овде: %2$s</string>
<string name="auth_check_server">Провери сервер</string>
- <string name="auth_host_url">Ð\90дреса сервера https://…</string>
+ <string name="auth_host_url">адреса сервера https://…</string>
<string name="auth_username">Корисничко име</string>
<string name="auth_password">Лозинка</string>
<string name="auth_register">Нов вам је %1$s?</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_error_forbidden_content">Апликацији %1$s није дозвољен приступ дељеном садржају</string>
<string name="uploader_info_uploading">Отпремање</string>
<string name="file_list_seconds_ago">пре пар секунди</string>
<string name="file_list_empty">Овде нема ничег. Отпремите нешто!</string>
<string name="file_list_loading">Учитавам</string>
<string name="local_file_list_empty">Нема фајлова у овој фасцикли.</string>
<string name="file_list_folder">фасцикла</string>
- <string name="file_list_folders">Ñ\84аÑ\81Ñ\86икле</string>
+ <string name="file_list_folders">Ñ\84аÑ\81Ñ\86икли</string>
<string name="file_list_file">фајл</string>
- <string name="file_list_files">Ñ\84аÑ\98лови</string>
+ <string name="file_list_files">Ñ\84аÑ\98лова</string>
<string name="filedetails_select_file">Тапните на фајл ради приказа додатних информација.</string>
<string name="filedetails_size">Величина:</string>
<string name="filedetails_type">Врста:</string>
<string name="filedetails_download">Преузми</string>
<string name="filedetails_sync_file">Освежи фајл</string>
<string name="filedetails_renamed_in_upload_msg">Фајл је преименован у %1$s током отпремања</string>
+ <string name="list_layout">Распоред листе</string>
<string name="action_share_file">Веза дељења</string>
<string name="action_unshare_file">Не дели везом</string>
<string name="common_yes">Да</string>
<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%% oтпрема %2$s</string>
+ <string name="uploader_upload_in_progress_content">%1$d%% oтпремам %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="uploader_upload_failed_credentials_error">Отпремање неуспешно. Поново се пријавите.</string>
<string name="downloader_download_in_progress_ticker">Преузимам…</string>
- <string name="downloader_download_in_progress_content">%1$d%% Ð\9fреузимам %2$s</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="foreign_files_local_text">Локално: %1$s</string>
<string name="foreign_files_remote_text">Удаљено: %1$s</string>
<string name="upload_query_move_foreign_files">Нема довољно простора да би се изабрани фајлови копирали у фасциклу %1$s. Желите ли да их преместите? </string>
- <string name="pincode_enter_pin_code">Унесите ПИБ апликације</string>
- <string name="pincode_configure_your_pin">Унесите ПИБ за апликацију</string>
- <string name="pincode_configure_your_pin_explanation">Са сваким покретањем апликације мораћете да унесете ПИБ</string>
- <string name="pincode_reenter_your_pincode">Унесите ПИБ поново</string>
- <string name="pincode_remove_your_pincode">Уклоните ПИБ апликације</string>
- <string name="pincode_mismatch">Бројеви се не поклапају</string>
- <string name="pincode_wrong">Неисправан ПИБ</string>
- <string name="pincode_removed">ПИБ је уклоњен</string>
- <string name="pincode_stored">ПИБ је упамћен</string>
+ <string name="pass_code_enter_pass_code">Унесите код за закључавање</string>
+ <string name="pass_code_configure_your_pass_code">Унесите код за закључавање</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Код ће бити затражен сваки пут кад се апликација покрене</string>
+ <string name="pass_code_reenter_your_pass_code">Поново унесите код</string>
+ <string name="pass_code_remove_your_pass_code">Уклоните код за закључавање</string>
+ <string name="pass_code_mismatch">Кодови се не поклапају</string>
+ <string name="pass_code_wrong">Неисправан код</string>
+ <string name="pass_code_removed">Код за закључавање уклоњен</string>
+ <string name="pass_code_stored">Код за закључавање је сачуван</string>
<string name="media_notif_ticker">%1$s музички плејер</string>
<string name="media_state_playing">%1$s (пуштам)</string>
<string name="media_state_loading">%1$s (учитавам)</string>
<string name="sync_file_nothing_to_do_msg">Садржај је већ синхронизован</string>
<string name="create_dir_fail_msg">Фасцикла се не може направити</string>
<string name="filename_forbidden_characters">Забрањени знакови: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Назив садржи бар један недозвољен карактер</string>
<string name="filename_empty">Назив фајла не може бити празан</string>
<string name="wait_a_moment">Сачекајте тренутак</string>
<string name="filedisplay_unexpected_bad_get_content">Неочекивани проблем. Изаберите фајл другом апликацијом</string>
<string name="filedisplay_no_file_selected">Нисте изабрали фајл</string>
<string name="activity_chooser_title">Пошаљи везу ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Копирам фајл из личног складишта</string>
<string name="oauth_check_onoff">Пријави се помоћу „oAuth2“</string>
<string name="oauth_login_connection">Повезујем се на „oAuth2“ сервер...</string>
<string name="ssl_validator_header">Не могу да проверим идентитет сајта</string>
<string name="prefs_category_security">Безбедност</string>
<string name="prefs_instant_video_upload_path_title">Путања отпремања видеа</string>
<string name="download_folder_failed_content">Преузимање фасцикле %1$s не може бити довршено</string>
+ <string name="shared_subject_header">дељено</string>
+ <string name="with_you_subject_header">са вама</string>
<string name="subject_token">%1$s подели „%2$s“ са вама</string>
<string name="auth_refresh_button">Освежи везу</string>
<string name="auth_host_address">Адреса сервера</string>
+ <string name="common_error_out_memory">Нема довољно меморије</string>
+ <string name="username">Корисничко име</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Allmänt</string>
<string name="prefs_category_more">Mer</string>
<string name="prefs_accounts">Konton</string>
<string name="prefs_manage_accounts">Hantera konton</string>
- <string name="prefs_pincode">applikation PIN</string>
- <string name="prefs_pincode_summary">Skydda applikation-klienten</string>
<string name="prefs_instant_upload">Direktuppladdning av kamerabilder</string>
<string name="prefs_instant_upload_summary">Direktuppladning av bilder tagna med kameran</string>
<string name="prefs_instant_video_upload">Direktuppladning av video</string>
<string name="foreign_files_local_text">Lokal: %1$s</string>
<string name="foreign_files_remote_text">Fjärr: %1$s</string>
<string name="upload_query_move_foreign_files">Det finns inte tillräckligt med ledigt utrymme för att kopiera de valda filerna till %1$s mappen. Skulle du vilja flytta dem istället?</string>
- <string name="pincode_enter_pin_code">Ange din PIN</string>
- <string name="pincode_configure_your_pin">Ange applikation PIN</string>
- <string name="pincode_configure_your_pin_explanation">Din PIN måste anges varje gång du startar programmet.</string>
- <string name="pincode_reenter_your_pincode">Ange applikation PIN igen</string>
- <string name="pincode_remove_your_pincode">Radera applikation PIN</string>
- <string name="pincode_mismatch">Båda applikation PIN är inte lika</string>
- <string name="pincode_wrong">Felaktig applikationd PIN</string>
- <string name="pincode_removed">applikation PIN raderad</string>
- <string name="pincode_stored">applikation PIN sparad</string>
<string name="media_notif_ticker">%1$ musikspelare</string>
<string name="media_state_playing">%1$s (spelar)</string>
<string name="media_state_loading">%1$s (buffrar)</string>
<string name="share_link_file_error">Ett fel uppstod vid försök att dela denna fil eller mapp</string>
<string name="unshare_link_file_no_exist">Lyckades ej sluta dela. Vänligen kontrollera om filen existerar</string>
<string name="unshare_link_file_error">Ett fel uppstod vid försök att sluta dela denna fil eller mapp</string>
+ <string name="share_link_password_title">Ange ett lösenord</string>
+ <string name="share_link_empty_password">Du måste ange ett lösenord</string>
<string name="activity_chooser_send_file_title">Skicka</string>
<string name="copy_link">Kopiera länk</string>
<string name="clipboard_text_copied">Kopierat till urklipp</string>
<string name="prefs_category_instant_uploading">Direktuppladning</string>
<string name="prefs_category_security">Säkerhet</string>
<string name="prefs_instant_video_upload_path_title">Uppladdnings-sökväg för video</string>
+ <string name="download_folder_failed_content">Neddladning utav %1$s mappen kunde inte slutföras</string>
<string name="auth_host_address">Serveradress</string>
</resources>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_send_file">அனுப்பவும்</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="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">மென்பொருள் பதிவு எண் </string>
- <string name="prefs_pincode_summary">உங்கள் வாடிக்கையாளர் பாதுகாக்கவும்</string>
<string name="prefs_instant_upload">உடனடி புகைப்பட பதிவேற்றம்</string>
<string name="prefs_instant_upload_summary">உடனடியாக கேமரா மூலம் எடுக்கப்பட்ட படங்களை பதிவேற்றம் செய்யவும்</string>
<string name="prefs_instant_video_upload">உடனடி காணொளி பதிவேற்றம்</string>
<string name="actionbar_see_details">விவரங்கள்</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="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_help">உதவி</string>
<string name="auth_username">பயனாளர் பெயர்</string>
<string name="auth_password">கடவுச்சொல்</string>
<string name="sync_fail_content">ஒத்திசைவாக்கலின் %1$s ஆனதை முடிக்கமுடியவில்லை</string>
<string name="sync_conflicts_in_favourites_ticker">முரன்பாடுகள் கண்டுப்பிடிக்கப்பட்டன</string>
<string name="sync_fail_in_favourites_content">கோப்புகள் %1$d இலுள்ள உள்ளடக்கங்களை ஒத்திசைவாக்கமுடியாது (%2$d முரன்பாடுகள்) </string>
- <string name="pincode_enter_pin_code">தயவுசெய்து உங்களுடைய App PIN ஐ உள்ளிடுக</string>
- <string name="pincode_configure_your_pin">இன் App PIN ஐ உள்ளிடுக</string>
- <string name="pincode_configure_your_pin_explanation">செயலி தொடங்கும் ஒவ்வொரு நேரமும் PIN கேட்கப்படுகின்றது.</string>
- <string name="pincode_reenter_your_pincode">தயவுசெய்து மீண்டும் App PIN ஐ உள்ளிடுக</string>
- <string name="pincode_remove_your_pincode">உங்களுடைய App PIN ஐ அகற்றுக</string>
- <string name="pincode_mismatch">இரண்டு App PIN களும் ஒன்றே அல்ல</string>
- <string name="pincode_wrong">தவறான App PIN </string>
- <string name="pincode_removed">App PIN அகற்றப்பட்டது</string>
- <string name="pincode_stored">App 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="actionbar_send_file">పంపించు</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_more">మరిన్ని</string>
<string name="prefs_help">సహాయం</string>
<string name="auth_username">వాడుకరి పేరు</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<?xml version='1.0' encoding='UTF-8'?>
<resources>
+ <string name="about_android">%1$s แอพฯ แอนดรอยด์</string>
+ <string name="about_version">รุ่น %1$s</string>
+ <string name="actionbar_sync">ฟื้นฟูบัญชี</string>
<string name="actionbar_upload">อัพโหลดไฟล์</string>
- <string name="actionbar_upload_from_apps">à¹\80à¸\99ืà¹\89à¸à¸«à¸²à¸\88าà¸\81à¹\81à¸à¸\9bฯอื่นๆ</string>
+ <string name="actionbar_upload_from_apps">à¹\80à¸\99ืà¹\89à¸à¸«à¸²à¸\88าà¸\81à¹\81à¸à¸\9eฯ อื่นๆ</string>
<string name="actionbar_upload_files">ไฟล์</string>
+ <string name="actionbar_open_with">เปิดด้วย</string>
<string name="actionbar_mkdir">โฟลเดอร์ใหม่</string>
<string name="actionbar_settings">ตั้งค่า</string>
<string name="actionbar_see_details">รายละเอียด</string>
<string name="actionbar_send_file">ส่ง</string>
+ <string name="actionbar_sort">จัดเรียง</string>
+ <string name="actionbar_sort_title">เรียงตาม</string>
+ <string-array name="actionbar_sortby">
+ <item>A-Z</item>
+ <item>ใหม่ที่สุด - เก่าที่สุด</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">ไฟล์ทั้งหมด</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">ตั้งค่า</string>
+ <string name="drawer_item_logs">บันทึก</string>
+ <string name="drawer_close">ปิด</string>
<string name="prefs_category_general">ทั่วไป</string>
- <string name="prefs_category_more">มาà¸\81</string>
+ <string name="prefs_category_more">à¹\80à¸\9eิà¹\88มà¹\80à¸\95ิม</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_passcode">ล็อค Passcodes</string>
+ <string name="prefs_instant_upload">อัพโหลดรูปภาพทันที</string>
+ <string name="prefs_instant_upload_summary">อัพโหลดรูปภาพที่ถ่ายโดยกล้องทันที</string>
+ <string name="prefs_instant_video_upload">อัพโหลดวิดีโอทันที</string>
+ <string name="prefs_instant_video_upload_summary">อัพโหลดวิดีโอที่บันทึกโดยกล้องทันที</string>
+ <string name="prefs_log_title">เปิดใช้งานการบันทึกข้อมูล</string>
+ <string name="prefs_log_summary">นี้จะใช้เพื่อบันทึกปัญหาที่เกิดขึ้น</string>
+ <string name="prefs_log_title_history">ประวัติการบันทึกข้อมูล</string>
+ <string name="prefs_log_summary_history">สิ่งนี้จะแสดงข้อมูลที่ถูกบันทึกไว้</string>
+ <string name="prefs_log_delete_history_button">ลบประวัติ</string>
<string name="prefs_help">ช่วยเหลือ</string>
+ <string name="prefs_recommend">แนะนำให้เพื่อน</string>
+ <string name="prefs_feedback">ข้อเสนอแนะ</string>
+ <string name="prefs_imprint">ประทับ</string>
+ <string name="prefs_remember_last_share_location">จดจำตำแหน่งที่ใช้ร่วมกัน</string>
+ <string name="prefs_remember_last_upload_location_summary">จดจำตำแหน่งล่าสุดที่ใช้ร่วมกัน</string>
+ <string name="recommend_subject">ลองใช้ %1$s บนสมาร์ทโฟนของคุณ!</string>
+ <string name="recommend_text">ฉันอยากจะขอเชิญให้คุณใช้ %1$s บนสมาร์ทโฟนของคุณ!\nดาวน์โหลดที่นี่: %2$s</string>
+ <string name="auth_check_server">ตรวจสอบเซิร์ฟเวอร์</string>
+ <string name="auth_host_url">ที่อยู่ของเซิร์ฟเวอร์ https://…</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_btn_new_folder_text">โฟลเดอร์ใหม่</string>
+ <string name="uploader_top_message">เลือกโฟลเดอร์ที่ต้องการอัพโหลด:</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">ยัà¸\87à¹\84มà¹\88มีà¹\80à¸\99ืà¹\89à¸à¸«à¸²à¹\83หà¹\89à¸\95à¹\89à¸à¸\87à¸à¸±à¸\9eโหลด</string>
- <string name="uploader_wrn_no_content_text">ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¹\80à¸\99ืà¹\89à¸à¸«à¸² à¹\84มà¹\88มีà¸à¸°à¹\84รà¹\83หà¹\89à¸\95à¹\89à¸à¸\87à¸à¸±à¸\9eà¹\82หลà¸\94</string>
- <string name="uploader_error_forbidden_content">%1$s ไม่อนุญาตให้เข้าถึงเนื้อหาที่ถูกแชร์ไว้</string>
+ <string name="uploader_wrn_no_content_title">ยัà¸\87à¹\84มà¹\88มีà¹\80à¸\99ืà¹\89à¸à¸«à¸²à¸\97ีà¹\88à¸\96ูà¸\81à¸à¸±à¸\9bโหลด</string>
+ <string name="uploader_wrn_no_content_text">ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¹\80à¸\99ืà¹\89à¸à¸«à¸² ยัà¸\87à¹\84มà¹\88มีà¸\81ารà¸à¸±à¸\9eà¹\82หลà¸\94à¹\83à¸\94à¹\86</string>
+ <string name="uploader_error_forbidden_content">%1$s à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸à¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\80à¸\99ืà¹\89à¸à¸«à¸²à¸\97ีà¹\88à¸\96ูà¸\81à¹\81à¸\8aรà¹\8cà¹\84วà¹\89</string>
<string name="uploader_info_uploading">กำลังอัพโหลด</string>
<string name="file_list_seconds_ago">วินาที ก่อนหน้านี้</string>
- <string name="file_list_empty">ยังไม่มีไฟล์ใดๆอยู่ที่นี่ กรุณาอัพโหลดไฟล์!</string>
+ <string name="file_list_empty">ยังไม่มีไฟล์ใดๆเลย ลองอัปโหลดดูสิ!</string>
+ <string name="file_list_loading">กำลังโหลด ...</string>
+ <string name="local_file_list_empty">ยังไม่มีไฟล์ในโฟลเดอร์นี้</string>
<string name="file_list_folder">โฟลเดอร์</string>
<string name="file_list_folders">โฟลเดอร์</string>
<string name="file_list_file">ไฟล์</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="list_layout">เค้าโครงรายการ</string>
+ <string name="action_share_file">แชร์ลิงค์</string>
+ <string name="action_unshare_file">ยกเลิกการแชร์ลิงค์</string>
<string name="common_yes">ตกลง</string>
<string name="common_no">ไม่ตกลง</string>
<string name="common_ok">ตกลง</string>
<string name="common_cancel">ยกเลิก</string>
<string name="common_save_exit">บันทึก & ออก</string>
<string name="common_error">ข้อผิดพลาด</string>
+ <string name="common_loading">กำลังโหลด ...</string>
<string name="common_error_unknown">ข้อผิดพลาดที่ไม่ทราบสาเหตุ</string>
<string name="about_title">เกี่ยวกับเรา</string>
<string name="change_password">เปลี่ยนรหัสผ่าน</string>
<string name="delete_account">ลบบัญชี</string>
<string name="create_account">สร้างบัญชีใหม่</string>
- <string name="upload_chooser_title">อัพโหลดไฟล์จาก...</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_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="uploader_upload_failed_content_single">ไม่สามารถดำเนินการอัพโหลด %1$s ให้เสร็จสมบูรณ์ได้</string>
+ <string name="uploader_upload_failed_credentials_error">อัพโหลดล้มเหลวคุณจะต้องเข้าสู่ระบบใหม่</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="downloader_not_downloaded_yet">ยังดาวน์โหลดไม่ได้</string>
+ <string name="downloader_download_failed_credentials_error">การดาวน์โหลดล้มเหลวคุณจะต้องเข้าสู่ระบบใหม่</string>
<string name="common_choose_account">เลือกบัญชี</string>
<string name="sync_fail_ticker">การเชื่อมผสานข้อมูลล้มเหลว</string>
+ <string name="sync_fail_ticker_unauthorized">การเชื่อมผสานข้อมูลล้มเหลว คุณจะต้องเข้าสู่ระบบใหม่</string>
<string name="sync_fail_content">การเชื่อมผสานข้อมูลของ %1$s ไม่สามารถดำเนินการให้เสร็จสมบูรณ์ได้</string>
+ <string name="sync_fail_content_unauthorized">รหัสผ่านไม่ถูกต้องสำหรับ %1$s</string>
<string name="sync_conflicts_in_favourites_ticker">ตรวจพบความขัดแย้ง</string>
- <string name="sync_conflicts_in_favourites_content">%1$d à¹\84à¸\9fลà¹\8c kept-in-sync à¹\84มà¹\88สามารà¸\96à¸\9cสาà¸\99à¹\80à¸\8aืà¹\88à¸à¸¡ข้อมูลได้</string>
+ <string name="sync_conflicts_in_favourites_content">%1$d à¹\84à¸\9fลà¹\8c kept-in-sync à¹\84มà¹\88สามารà¸\96à¹\80à¸\8aืà¹\88à¸à¸¡à¸\9cสาà¸\99ข้อมูลได้</string>
<string name="sync_fail_in_favourites_ticker">ไฟล์ Kept-in-sync ล้มเหลว</string>
<string name="sync_fail_in_favourites_content">เนื้อหาของไฟล์ %1$d ไม่สามารถผสานเชื่อมข้อมูลได้ (ความขัดแย้ง %2$d รายการ)</string>
- <string name="sync_foreign_files_forgotten_ticker">มีบางแฟ้มข้อมูลในเครื่องถูกลืม</string>
+ <string name="sync_foreign_files_forgotten_ticker">มีแฟ้มข้อมูลต้นทางบางแฟ้มถูกลืม</string>
+ <string name="sync_foreign_files_forgotten_content">ไม่สามารถคัดลอกไฟล์ %1$d ไปยังโฟลเดอร์ %2$s</string>
+ <string name="sync_foreign_files_forgotten_explanation">ขณะที่รุ่น 1.3.16 ไฟล์ที่อัปโหลดจากเครื่องของคุณจะถูกคัดลอกไปสำรองไว้ที่ต้นทาง %1$s เพื่อป้องกันการสูญเสียข้อมูลเมื่อไฟล์เดียวถูกซิงค์กับบัญชีหลายบัญชี \n\n การเปลี่ยนแปลงนี้ไฟล์ทั้งหมดที่อัปโหลดในรุ่นก่อนหน้า ของ app นี้ถูกคัดลอกลงในโฟลเดอร์ %2$s แต่ก็อาจมีข้อผิดพลาดในการดำเนินการนี้ช่วงระหว่างการประสานบัญชี คุณอาจจะสูญเสียข้อมูล เช่นเดียวกับการลบ หรือย้ายไฟล์และเชื่อมโยงไปยัง %3$s ส่วนโฟลเดอร์ %1$s จะถูกเชื่อมโยงไปยัง %4$s \n\n รายชื่อด้านล่าง เป็นแฟ้มต้นทาง และแฟ้มปลายทาง ใน %5$s มันจะถูกนำมาเชื่อมโยงกัน</string>
+ <string name="sync_current_folder_was_removed">โฟลเดอร์ %1$s หายไปแล้ว</string>
<string name="foreign_files_move">ย้ายทั้งหมด</string>
<string name="foreign_files_success">ทุกแฟ้มข้อมูลถูกย้ายเรียบร้อยแล้ว</string>
<string name="foreign_files_fail">มีบางแฟ้มข้อมูลไม่สามารถย้ายได้</string>
<string name="foreign_files_local_text">ต้นทาง: %1$s</string>
<string name="foreign_files_remote_text">ปลายทาง: %1$s</string>
- <string name="pincode_enter_pin_code">กรุณาใส่ PIN แอปของคุณ</string>
- <string name="pincode_configure_your_pin">กรอกรหัส PIN ของ App</string>
- <string name="pincode_configure_your_pin_explanation">หมายเลข PIN ดังกล่าวจะถูกร้องขอทุกครั้งที่เริ่มใช้งานแอปฯ</string>
- <string name="pincode_reenter_your_pincode">กรุณากรอกรหัส PIN ของแอป App ใหม่อีกครั้ง</string>
- <string name="pincode_remove_your_pincode">ลบรหัส PIN แอป ของ App ของคุณ</string>
- <string name="pincode_mismatch">รหัส App API ไม่ตรงกัน</string>
- <string name="pincode_wrong">รหัส PIN App ไม่ถูกต้อง</string>
- <string name="pincode_removed">รหัส PIN แอปสำหรับ ถูกลบออกแล้ว</string>
- <string name="pincode_stored">จัดเก็บรหัส PIN แอป ของ แล้ว</string>
+ <string name="upload_query_move_foreign_files">พื้นที่ใน %1$s ไม่เพียงพอต่อการย้ายไฟล์ คุณต้องการที่จะย้ายไปที่อื่นแทน?</string>
+ <string name="pass_code_enter_pass_code">กรุณาใส่ Passcodes ของคุณ</string>
+ <string name="pass_code_configure_your_pass_code">ใส่ Passcodes ของคุณ</string>
+ <string name="pass_code_configure_your_pass_code_explanation">จะมีการร้องขอ Passcodes ทุกครั้งเมื่อเริ่มต้นใช้แอพฯ</string>
+ <string name="pass_code_reenter_your_pass_code">กรุณาป้อน Passcodes ของคุณอีกครั้ง</string>
+ <string name="pass_code_remove_your_pass_code">ลบ Passcodes ของคุณ</string>
+ <string name="pass_code_mismatch">Passcodes ของคุณไม่ตรงกัน</string>
+ <string name="pass_code_wrong">Passcode ไม่ถูกต้อง</string>
+ <string name="pass_code_removed">ลบ Passcode</string>
+ <string name="pass_code_stored">Passcode ที่เก็บไว้</string>
+ <string name="media_notif_ticker">เล่นเพลง %1$s</string>
+ <string name="media_state_playing">%1$s (กำลังเล่น)</string>
+ <string name="media_state_loading">%1$s (กำลังโหลด)</string>
+ <string name="media_event_done">%1$s เล่นเสร็จแล้ว</string>
+ <string name="media_err_nothing_to_play">ไม่พบไฟล์สื่อ</string>
+ <string name="media_err_no_account">ไม่มีบัญชีที่ระบุ</string>
+ <string name="media_err_not_in_owncloud">ไฟล์ไม่ได้อยู่ในบัญชีที่ถูกต้อง</string>
+ <string name="media_err_unsupported">สื่อไม่สนับสนุนตัวแปลงสัญญาณ</string>
+ <string name="media_err_io">ไม่สามารถอ่านไฟล์สื่อ</string>
+ <string name="media_err_malformed">เข้ารหัสไฟล์สื่อไม่ถูกต้อง</string>
+ <string name="media_err_timeout">หมดเวลาในขณะที่พยายามจะเล่น</string>
+ <string name="media_err_invalid_progressive_playback">ไฟล์สื่อไม่สามารถสตรีม</string>
+ <string name="media_err_unknown">เล่นไฟล์สื่อกับเครื่องเล่นสื่อไม่ได้</string>
+ <string name="media_err_security_ex">เกิดข้อผิดพลาดเรื่องความปลอดภัยขณะพยายามที่จะเล่น %1$s</string>
+ <string name="media_err_io_ex">ป้อนข้อมูลผิดพลาดขณะพยายามที่จะเล่น %1$s</string>
+ <string name="media_err_unexpected">เกิดข้อผิดพลาดขณะพยายามที่จะเล่น %1$s</string>
+ <string name="media_rewind_description">ปุ่มย้อนกลับ</string>
+ <string name="media_play_pause_description">เล่นหรือกดปุ่มหยุดชั่วคราว</string>
+ <string name="media_forward_description">ปุ่มเลื่อนไปข้างหน้า</string>
+ <string name="auth_getting_authorization">ได้รับการอนุมัติ ...</string>
<string name="auth_trying_to_login">กำลังเข้าสู่ระบบ...</string>
<string name="auth_no_net_conn_title">ไม่มีการเชื่อมต่อเครือข่ายใดๆ</string>
- <string name="auth_nossl_plain_ok_title">à¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¸\95à¹\88à¸à¹\81à¸\9aà¸\9aรัà¸\81ษาà¸\84วามà¸\9bลà¸à¸\94ภัยà¹\84มà¹\88สามารà¸\96à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84à¸\94à¹\89</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">การกำหนดค่า Malformed เซิร์ฟเวอร์</string>
- <string name="auth_unknown_error_title">เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ!</string>
+ <string name="auth_account_not_new">บัญชีผู้ใช้และเซิร์ฟเวอร์เดียวกันมีอยู่แล้วในเครื่อง</string>
+ <string name="auth_account_not_the_same">ป้อนผู้ใช้ไม่ตรงกับบัญชีของผู้ใช้นี้</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">Malformed URL</string>
<string name="auth_ssl_general_error_title">การเตรียมใช้งาน SSL ล้มเหลว</string>
- <string name="auth_bad_oc_version_title">รุ่นของเซิร์ฟเวอร์เซิร์ฟเวอร์ ไม่เป็นที่รู้จัก</string>
+ <string name="auth_ssl_unverified_server_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_secure_connection">เชื่อมต่อแบบปลอดภัยเสร็จสมบูรณ์</string>
+ <string name="auth_unauthorized">ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง</string>
+ <string name="auth_oauth_error">ตรวจสอบสิทธิ์ไม่สำเร็จ</string>
+ <string name="auth_oauth_error_access_denied">การเข้าถึงถูกปฏิเสธโดยเซิร์ฟเวอร์ตรวจสอบสิทธิ์</string>
+ <string name="auth_wtf_reenter_URL">เกิดข้อผิดพลาด โปรดป้อน URL เซิร์ฟเวอร์อีกครั้ง</string>
+ <string name="auth_expired_oauth_token_toast">สิทธิ์การเข้าถึงของคุณหมดอายุแล้ว กรุณาขอสิทธิ์ใหม่</string>
+ <string name="auth_expired_basic_auth_toast">กรุณาใส่รหัสผ่านปัจจุบัน</string>
+ <string name="auth_expired_saml_sso_token_toast">เซสชันของคุณหมดอายุ โปรดเชื่อมต่ออีกครั้ง</string>
+ <string name="auth_connecting_auth_server">กำลังเชื่อมต่อกับเซิร์ฟเวอร์เพื่อยืนยันตัวตน</string>
+ <string name="auth_unsupported_auth_method">เซิร์ฟเวอร์ไม่สนับสนุนการยืนยันตัวตนนี้</string>
+ <string name="auth_unsupported_multiaccount">%1$s ไม่สนับสนุนให้มีหลายบัญชี</string>
+ <string name="auth_fail_get_user_name">เซิร์ฟเวอร์ของคุณไม่ได้ส่งคืนรหัสผู้ใช้ที่ถูกต้อง กรุณาติดต่อผู้ดูแลระบบ!</string>
+ <string name="auth_can_not_auth_against_server">ไม่สามารถยืนยันตัวตนกับเซิร์ฟเวอร์นี้</string>
+ <string name="auth_account_does_not_exist">ยังไม่มีบัญชีในอุปกรณ์นี้</string>
<string name="fd_keep_in_sync">ปรับปรุงไฟล์ให้ทันสมัยอยู่เสมอ</string>
<string name="common_rename">เปลี่ยนชื่อ</string>
<string name="common_remove">ลบออก</string>
- <string name="confirmation_remove_local">เฉพาะเซิร์ฟเวอร์ภายในเท่านั้น</string>
- <string name="confirmation_remove_folder_local">เนื้อหาที่อยู่ในเครื่องเท่านั้น</string>
+ <string name="confirmation_remove_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">à¸\97ัà¹\89à¸\87à¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วà¸à¸£à¹\8cระยะà¹\84à¸\81ลà¹\81ละà¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วà¸à¸£à¹\8cภายà¹\83à¸\99</string>
+ <string name="confirmation_remove_remote_and_local">à¸\95à¹\89à¸\99à¸\97าà¸\87à¹\81ละà¸\9bลายà¸\97าà¸\87</string>
<string name="remove_success_msg">ลบเรียบร้อยแล้ว</string>
- <string name="remove_fail_msg">à¸\81ารลà¸\9aà¸à¸à¸\81à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\84à¸\94à¹\89à¸à¸¢à¹\88าà¸\87à¹\80สรà¹\87à¸\88สมà¸\9aูรà¸\93à¹\8c</string>
+ <string name="remove_fail_msg">à¹\84มà¹\88สามารà¸\96ลà¸\9aà¹\84à¸\94à¹\89</string>
<string name="rename_dialog_title">กรอกชื่อใหม่</string>
- <string name="rename_local_fail_msg">à¹\84à¸\9fลà¹\8cà¸\84ัà¸\94ลà¸à¸\81ภายà¹\83à¸\99ไม่สามารถเปลี่ยนชื่อได้, กรุณาเปลี่ยนเป็นชื่อใหม่</string>
+ <string name="rename_local_fail_msg">à¹\84à¸\9fลà¹\8cà¸\95à¹\89à¸\99à¸\97าà¸\87à¸\97ีà¹\88à¸\84ัà¸\94ลà¸à¸\81ไม่สามารถเปลี่ยนชื่อได้, กรุณาเปลี่ยนเป็นชื่อใหม่</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="sync_file_nothing_to_do_msg">เนื้อหาของไฟล์มีข้อมูลอยู่แล้ว</string>
+ <string name="create_dir_fail_msg">ไม่สามารถสร้างโฟลเดอร์</string>
+ <string name="filename_forbidden_characters">ห้ามใช้ตัวอักษรดังนี้: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">มีชื่อแฟ้มอย่างน้อยหนึ่งตัวอักษรที่ไม่ถูกต้อง</string>
+ <string name="filename_empty">ต้องใส่ชื่อไฟล์</string>
<string name="wait_a_moment">กรุณารอสักครู่</string>
- <string name="filedisplay_unexpected_bad_get_content">à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¸\97ีà¹\88à¹\84มà¹\88à¸\84าà¸\94à¸\84ิà¸\94 ; à¸\81รุà¸\93าลà¸à¸\87à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\81à¸à¸\9bฯà¸à¸·à¹\88à¸\99à¹\86 à¹\80à¸\9eืà¹\88à¸à¹\80ลืà¸à¸\81à¹\84à¸\9fลà¹\8c</string>
+ <string name="filedisplay_unexpected_bad_get_content">มีà¸\9bัà¸\8dหาà¹\80à¸\81ิà¸\94à¸\82ึà¹\89à¸\99 à¸\81รุà¸\93าà¹\80ลืà¸à¸\81à¹\84à¸\9fลà¹\8cà¸\87าà¸\99à¹\81à¸à¸\9eฯà¸à¸·à¹\88à¸\99à¹\86</string>
<string name="filedisplay_no_file_selected">ไม่มีไฟล์ที่ถูกเลือก</string>
- <string name="ssl_validator_header">ไม่สามารถยืนยันความถูกต้องของตัวตนของเว็บไซต์ได้</string>
+ <string name="activity_chooser_title">ส่งลิงค์ไปยัง ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">คัดลอกไฟล์จากพื้นที่จัดเก็บส่วนตัว</string>
+ <string name="oauth_check_onoff">เข้าสู่ระบบด้วย oAuth2</string>
+ <string name="oauth_login_connection">เชื่อมต่อกับเซิร์ฟเวอร์ oAuth2 ...</string>
+ <string name="ssl_validator_header">ไม่สามารถยืนยันตัวตนของเว็บไซต์ได้</string>
<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_label_validity_to">ถึง:</string>
<string name="ssl_validator_label_signature">ลายเซ็นต์:</string>
<string name="ssl_validator_label_signature_algorithm">อัลกอริทึ่ม:</string>
- <string name="placeholder_sentence">นี่เป็นตัวยึด</string>
+ <string name="ssl_validator_null_cert">ไม่สามารถแสดงใบรับรอง</string>
+ <string name="ssl_validator_no_info_about_error">- ไม่มีข้อมูลเกี่ยวกับข้อผิดพลาด</string>
+ <string name="placeholder_sentence">นี่คือ placeholder</string>
+ <string name="placeholder_filename">placeholder.txt</string>
+ <string name="placeholder_filetype">รูปภาพ PNG</string>
+ <string name="placeholder_filesize">389 กิโลไบต์</string>
+ <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
+ <string name="placeholder_media_time">12:23:45</string>
<string name="instant_upload_on_wifi">อัพโหลดรูปภาพผ่านทาง WiFi เท่านั้น</string>
+ <string name="instant_video_upload_on_wifi">อัพโหลดวีดีโอผ่านทาง WiFi เท่านั้น</string>
<string name="instant_upload_path">/อัพโหลดทันที</string>
- <string name="conflict_title">à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\9bัà¸\8dหาà¸\84วามà¸\82ัà¸\94à¹\81ยà¹\89à¸\87</string>
- <string name="conflict_message">à¹\84à¸\9fลà¹\8cระยะà¹\84à¸\81ล %s ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9cสาà¸\99à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\81ัà¸\9aà¹\84à¸\9fลà¹\8cà¹\83à¸\99à¹\80à¸\84รืà¹\88à¸à¸\87 à¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\95à¹\88à¸à¹\84à¸\9bà¸\88ะà¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\97à¸\99à¸\97ีà¹\88à¹\80à¸\99ืà¹\89à¸à¸«à¸²à¸\82à¸à¸\87à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88อยู่บนเซิร์ฟเวอร์</string>
+ <string name="conflict_title">à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\82à¹\89à¸à¸\9cิà¸\94à¸\9eลาà¸\94</string>
+ <string name="conflict_message">à¹\84à¸\9fลà¹\8cระยะà¹\84à¸\81ล %s ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\9cสาà¸\99à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\81ัà¸\9aà¹\84à¸\9fลà¹\8cà¸\95à¹\89à¸\99à¸\97าà¸\87 à¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\95à¹\88à¸à¹\84à¸\9bà¸\88ะà¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\97à¸\99à¸\97ีà¹\88à¹\80à¸\99ืà¹\89à¸à¸«à¸²à¸\82à¸à¸\87à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88มีอยู่บนเซิร์ฟเวอร์</string>
<string name="conflict_keep_both">เก็บไว้ทั้งสองอย่าง</string>
<string name="conflict_overwrite">เขียนทับ</string>
<string name="conflict_dont_upload">ไม่ต้องอัพโหลด</string>
+ <string name="preview_image_description">แสดงรูปภาพตัวอย่าง</string>
+ <string name="preview_image_error_unknown_format">ไม่สามารถแสดงรูปภาพนี้ได้</string>
+ <string name="error__upload__local_file_not_copied">%1$s ไม่สามารถคัดลอกไปยังโฟลเดอร์ %2$s ในเครื่อง</string>
+ <string name="prefs_instant_upload_path_title">เส้นทางอัพโหลด</string>
+ <string name="share_link_no_support_share_api">ขออภัยการแชร์ไม่ได้เปิดใช้งานบนเซิร์ฟเวอร์ของคุณ กรุณาติดต่อผู้ดูแลระบบ</string>
+ <string name="share_link_file_no_exist">ไม่สามารถแชร์ กรุณาตรวจสอบไฟล์ที่มีอยู่</string>
+ <string name="share_link_file_error">เกิดข้อผิดพลาดในขณะที่พยายามจะแชร์ไฟล์หรือโฟลเดอร์นี้</string>
+ <string name="unshare_link_file_no_exist">ไม่สามารถยกเลิกการแชร์ กรุณาตรวจสอบไฟล์ที่มีอยู่</string>
+ <string name="unshare_link_file_error">เกิดข้อผิดพลาดในขณะที่จะยกเลิกการอชร์ไฟล์หรือโฟลเดอร์นี้</string>
+ <string name="share_link_password_title">ป้อนรหัสผ่าน</string>
+ <string name="share_link_empty_password">คุณจะต้องใส่รหัสผ่าน</string>
<string name="activity_chooser_send_file_title">ส่ง</string>
+ <string name="copy_link">คัดลอกลิงค์</string>
+ <string name="clipboard_text_copied">คัดลอกไปยังคลิปบอร์ด</string>
+ <string name="error_cant_bind_to_operations_service">ข้อผิดพลาด: ไม่สามารถดำเนินการได้</string>
+ <string name="network_error_socket_exception">เกิดข้อผิดพลาดขณะกำลังเชื่อมต่อกับเซิร์ฟเวอร์</string>
+ <string name="network_error_socket_timeout_exception">เกิดข้อผิดพลาดขณะที่รอการดำเนินการจากเซิร์ฟเวอร์</string>
+ <string name="network_error_connect_timeout_exception">เกิดข้อผิดพลาดขณะที่รอการดำเนินการจากเซิร์ฟเวอร์</string>
+ <string name="network_host_not_available">การดำเนินการอาจยังไม่เสร็จสมบูรณ์ เซิร์ฟเวอร์ไม่สามารถใช้งานได้</string>
<string name="empty"></string>
+ <string name="forbidden_permissions">คุณไม่ได้รับสิทธิ์ %s</string>
+ <string name="forbidden_permissions_rename">เพื่อเปลี่ยนชื่อไฟล์นี้</string>
+ <string name="forbidden_permissions_delete">เพื่อลบไฟล์นี้</string>
+ <string name="share_link_forbidden_permissions">เพื่อแชร์ไฟล์นี้</string>
+ <string name="unshare_link_forbidden_permissions">เพื่อเลิกแชร์ไฟล์นี้</string>
+ <string name="forbidden_permissions_create">เพื่อสร้างไฟล์</string>
+ <string name="uploader_upload_forbidden_permissions">เพื่ออัพโหลดในโฟลเดอร์นี้</string>
+ <string name="downloader_download_file_not_found">ไฟล์ไม่พร้อมใช้งานบนเซิร์ฟเวอร์</string>
<string name="prefs_category_accounts">บัญชี</string>
+ <string name="prefs_add_account">เพิ่มบัญชี</string>
+ <string name="auth_redirect_non_secure_connection_title">การเชื่อมต่อที่ปลอดภัยถูกเปลี่ยนเส้นทางไปยังเส้นทางที่ไม่ปลอดภัย</string>
+ <string name="actionbar_logger">บันทึก</string>
+ <string name="log_send_history_button">ส่งประวัติ</string>
+ <string name="log_send_no_mail_app">ไม่พบการส่งบันทึกของแอพฯ ติดตั้งแอพฯเมล!</string>
+ <string name="log_send_mail_subject">%1$s บันทึกแอพแอนดรอยด์</string>
+ <string name="log_progress_dialog_text">กำลังโหลดข้อมูล ...</string>
+ <string name="saml_authentication_required_text">จำเป็นต้องยืนยันตัวตน</string>
+ <string name="saml_authentication_wrong_pass">รหัสผ่านไม่ถูกต้อง</string>
+ <string name="actionbar_move">ย้าย</string>
+ <string name="file_list_empty_moving">ไม่มีสิ่งใดในที่นี่ คุณสามารถสร้างโฟลเดอร์!</string>
<string name="folder_picker_choose_button_text">เลือก</string>
+ <string name="move_file_not_found">ไม่สามารถย้ายไฟล์ กรุณาตรวจสอบว่าไฟล์ยังคงอยู่</string>
+ <string name="move_file_invalid_into_descendent">มันเป็นไปไม่ได้ที่จะย้ายโฟลเดอร์ที่มีราก</string>
+ <string name="move_file_invalid_overwrite">มีไฟล์อยู่แล้วในโฟลเดอร์ปลายทาง</string>
+ <string name="move_file_error">เกิดข้อผิดพลาดขณะพยายามที่จะย้ายไฟล์หรือโฟลเดอร์นี้</string>
+ <string name="forbidden_permissions_move">เพื่อย้ายไฟล์นี้</string>
+ <string name="prefs_category_instant_uploading">อัพโหลดทันที</string>
+ <string name="prefs_category_security">ความปลอดภัย</string>
+ <string name="prefs_instant_video_upload_path_title">อัพโหลดเส้นทางวิดีโอ</string>
+ <string name="download_folder_failed_content">การดาวน์โหลดโฟลเดอร์ %1$s อาจไม่สำเร็จ</string>
+ <string name="shared_subject_header">ถูกแชร์</string>
+ <string name="with_you_subject_header">กับคุณ</string>
+ <string name="subject_token">%1$s ได้แชร์ \"%2$s\" กับคุณ</string>
+ <string name="auth_refresh_button">ฟื้นฟูการเชื่อมต่อ</string>
<string name="auth_host_address">ที่อยู่เซิร์ฟเวอร์</string>
+ <string name="common_error_out_memory">หน่วยความจำไม่พอ</string>
+ <string name="username">ชื่อผู้ใช้</string>
</resources>
</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">Tüm dosyalar</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Ayarlar</string>
+ <string name="drawer_item_logs">Günlükler</string>
+ <string name="drawer_close">Kapat</string>
<string name="prefs_category_general">Genel</string>
<string name="prefs_category_more">Daha fazla</string>
<string name="prefs_accounts">Hesaplar</string>
<string name="prefs_manage_accounts">Hesapları Yönet</string>
- <string name="prefs_pincode">Uygulama PIN\'i</string>
- <string name="prefs_pincode_summary">İstemcinizi koruyun</string>
+ <string name="prefs_passcode">Parola kod kilidi</string>
<string name="prefs_instant_upload">Anında fotoğraf yüklemeleri</string>
<string name="prefs_instant_upload_summary">Kamera ile çekilen fotoğrafları anında yükle</string>
<string name="prefs_instant_video_upload">Anında video yüklemeleri</string>
<string name="filedetails_download">İndir</string>
<string name="filedetails_sync_file">Dosyayı yenile</string>
<string name="filedetails_renamed_in_upload_msg">Dosya adı, yükleme sırasında %1$s olarak değiştirildi</string>
+ <string name="list_layout">Liste Yerleşimi</string>
<string name="action_share_file">Paylaşma bağlantısı</string>
<string name="action_unshare_file">Bağlantı paylaşımını kaldır</string>
<string name="common_yes">Evet</string>
<string name="foreign_files_local_text">Yerel: %1$s</string>
<string name="foreign_files_remote_text">Uzak: %1$s</string>
<string name="upload_query_move_foreign_files">Seçilen dosyaları %1$s dizinine kopyalamak için yeterli alan yok. Bunun yerine dosyayı içine taşımak ister misiniz?</string>
- <string name="pincode_enter_pin_code">Lütfen uygulama PIN\'inizi girin</string>
- <string name="pincode_configure_your_pin">Uygulama PIN\'inizi girin</string>
- <string name="pincode_configure_your_pin_explanation">PIN uygulama yeniden başladığında tekrar sorulacak</string>
- <string name="pincode_reenter_your_pincode">Lütfen, uygulama PIN\'inizi tekrar girin</string>
- <string name="pincode_remove_your_pincode">Uygulama PIN\'inizi kaldırın</string>
- <string name="pincode_mismatch">Her iki Uygulama PIN\'i aynı değil</string>
- <string name="pincode_wrong">Yanlış Uygulama PIN\'i</string>
- <string name="pincode_removed">Uygulama PIN\'i kaldırıldı</string>
- <string name="pincode_stored">Uygulama PIN\'i saklandı</string>
+ <string name="pass_code_enter_pass_code">Lütfen parola kodu kilidini girin</string>
+ <string name="pass_code_configure_your_pass_code">Parola kodunuzu girin</string>
+ <string name="pass_code_configure_your_pass_code_explanation">Parola kodu uygulama her başlatıldığında sorulacaktır</string>
+ <string name="pass_code_reenter_your_pass_code">Lütfen parola kodunuzu yeniden girin</string>
+ <string name="pass_code_remove_your_pass_code">Parola kodunuzu kaldırın</string>
+ <string name="pass_code_mismatch">Parola kodları aynı değil</string>
+ <string name="pass_code_wrong">Hatalı parola kodu</string>
+ <string name="pass_code_removed">Parola kodu kaldırıldı</string>
+ <string name="pass_code_stored">Parola kodu depolandı</string>
<string name="media_notif_ticker">%1$s müzik çalar</string>
<string name="media_state_playing">%1$s (oynatılıyor)</string>
<string name="media_state_loading">%1$s (yükleniyor)</string>
<string name="sync_file_nothing_to_do_msg">Dosya içerikleri zaten eşitlenmiş</string>
<string name="create_dir_fail_msg">Klasör oluşturulamadı</string>
<string name="filename_forbidden_characters">Yasaklı karakterler: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Dosya adı en az bir geçersiz karakter içeriyor</string>
<string name="filename_empty">Dosya adı boş olamaz</string>
<string name="wait_a_moment">Bir süre bekleyin</string>
<string name="filedisplay_unexpected_bad_get_content">Beklenmedik sorun; lütfen dosya seçmek için farklı bir uygulama kullanın</string>
<string name="filedisplay_no_file_selected">Hiçbir dosya seçilmedi</string>
<string name="activity_chooser_title">Bağlantıyı gönder ...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Dosya özel depolamadan kopyalanıyor</string>
<string name="oauth_check_onoff">oAuth2 ile oturum aç</string>
<string name="oauth_login_connection">oAuth2 sunucusuna bağlanılıyor…</string>
<string name="ssl_validator_header">Bu sitenin sertifikası doğrulanamadı</string>
<string name="prefs_category_security">Güvenlik</string>
<string name="prefs_instant_video_upload_path_title">Video Yükleme Yolu</string>
<string name="download_folder_failed_content">%1$s klasörün indirilmesi tamamlanamadı</string>
- <string name="subject_token">%1$s sizinle \"%2$s\" paylaşımını yaptı</string>
+ <string name="shared_subject_header">sizinle</string>
+ <string name="with_you_subject_header">paylaştı</string>
<string name="auth_refresh_button">Bağlantıyı yenile</string>
<string name="auth_host_address">Sunucu adresi</string>
+ <string name="common_error_out_memory">Yeterli hafıza yok</string>
+ <string name="username">Kullanıcı adı</string>
</resources>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--TODO re-enable when server-side folder size calculation is available
+ <item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="empty"></string>
+</resources>
<string name="actionbar_send_file">يوللا</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">ئادەتتىكى</string>
<string name="prefs_category_more">تېخىمۇ كۆپ</string>
<string name="prefs_accounts">ھېساباتلار</string>
</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>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</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">Захист Вашог App клієнта</string>
<string name="prefs_instant_upload">Миттєві зображення</string>
<string name="prefs_instant_upload_summary">Миттєві зображення з камери</string>
<string name="prefs_instant_video_upload">Миттєві відео</string>
<string name="foreign_files_local_text">Локально: %1$s</string>
<string name="foreign_files_remote_text">Віддалено: %1$s</string>
<string name="upload_query_move_foreign_files">Недостатньо місця для копіювання обраних файлів у теку %1$s. Чи бажаєте ви перемістити їх замість копіювання?</string>
- <string name="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">Повторно введіть App програмний PIN, будь ласка</string>
- <string name="pincode_remove_your_pincode">Видалити свій App програмний PIN</string>
- <string name="pincode_mismatch">Обидва App програмних PIN не однакові</string>
- <string name="pincode_wrong">Не вірний App програмний PIN</string>
- <string name="pincode_removed">App програмний PIN видалено</string>
- <string name="pincode_stored">App програмний PIN збережено</string>
<string name="media_notif_ticker">%1$s музичний плеєр</string>
<string name="media_state_playing">%1$s (відтворення)</string>
<string name="media_state_loading">%1$s (завантаження)</string>
<string name="sync_file_nothing_to_do_msg">Зміст файлу вже синхронізовано</string>
<string name="create_dir_fail_msg">Не вдалося створити теку</string>
<string name="filename_forbidden_characters">Заборонені символи: / \\ < > : \" | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">Ім’я файлу містить принаймні один некоректний символ</string>
<string name="filename_empty"> Ім\'я файлу не може бути порожнім.</string>
<string name="wait_a_moment">Зачекайте хвилинку</string>
<string name="filedisplay_unexpected_bad_get_content">Несподівані проблеми ; будь ласка, спробуйте використати іншу програму для вибору файлу</string>
<string name="filedisplay_no_file_selected">Не обрано файл</string>
<string name="activity_chooser_title">Надіслати посилання...</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Копіювання файлу з приватного сховища</string>
<string name="oauth_check_onoff">Увійти через oAuth2</string>
<string name="oauth_login_connection">Підключення до серверу oAuth2...</string>
<string name="ssl_validator_header">Не вдалося перевірити ідентифікацію сайта</string>
<string name="prefs_category_security">Безпека</string>
<string name="prefs_instant_video_upload_path_title">Шлях завантаження відео</string>
<string name="download_folder_failed_content">Скачування теки %1$s не може бути завершено</string>
- <string name="subject_token">%1$s розшарено \"%2$s\" з вами</string>
<string name="auth_refresh_button">Оновити з\'єднання</string>
<string name="auth_host_address">Ареса серверу</string>
</resources>
<string name="actionbar_send_file">بھجیں</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_more">مزید</string>
<string name="prefs_help">مدد</string>
<string name="auth_username">یوزر نیم</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
<string name="actionbar_send_file">Gởi</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">Tổng hợp</string>
<string name="prefs_category_more">hơn</string>
<string name="prefs_accounts">Tài khoản</string>
<string name="prefs_manage_accounts">Quản lý tài khoản</string>
- <string name="prefs_pincode">Mã PIN ứng dụng App</string>
- <string name="prefs_pincode_summary">Bảo vệ App client của bạn</string>
<string name="prefs_log_title">Bật chế độ nhật trình</string>
<string name="prefs_log_summary">Được sử dụng cho các vấn đề liên quan đến nhật trình</string>
<string name="prefs_log_title_history">Nhật trình dữ kiện</string>
<string name="foreign_files_fail">Một vài tập tin không thể chuyển đi</string>
<string name="foreign_files_local_text">Cục bộ: %1$s</string>
<string name="foreign_files_remote_text">Từ xa: %1$s</string>
- <string name="pincode_enter_pin_code">Vui lòng, nhập mã PIN ứng dụng của bạn</string>
- <string name="pincode_configure_your_pin">Nhập mã PIN ứng dụng App</string>
- <string name="pincode_configure_your_pin_explanation">Mã PIN sẽ được yêu cầu mỗi khi ứng dụng được bật </string>
- <string name="pincode_reenter_your_pincode">Vui lòng nhập lại mã PIN ứng dụng App</string>
- <string name="pincode_remove_your_pincode">Hủy mã PIN ứng dụng App của bạn</string>
- <string name="pincode_mismatch">Mã PIN ứng dụng App không được trùng</string>
- <string name="pincode_wrong">Mã PIN ứng dụng App không đúng</string>
- <string name="pincode_removed">Mã PIN ứng dụng App đã bị xóa</string>
- <string name="pincode_stored">Mã PIN ứng dụng App đã được lưu trữ</string>
<string name="media_notif_ticker">%1$s trình phát nhạc</string>
<string name="media_state_playing">%1$s (đang phát)</string>
<string name="media_state_loading">%1$s (đang tải)</string>
<resources>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="empty"></string>
</resources>
</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">全部文件</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">设置</string>
+ <string name="drawer_item_logs">日志</string>
+ <string name="drawer_close">关闭</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_passcode">密码锁</string>
<string name="prefs_instant_upload">即时图片上传</string>
<string name="prefs_instant_upload_summary">即时上传相机拍摄的图片</string>
<string name="prefs_instant_video_upload">即时上传视频</string>
<string name="filedetails_download">下载</string>
<string name="filedetails_sync_file">刷新文件</string>
<string name="filedetails_renamed_in_upload_msg">上传过程中文件被更名为了 %1$s</string>
+ <string name="list_layout">列表布局</string>
<string name="action_share_file">分享链接</string>
<string name="action_unshare_file">取消分享链接</string>
<string name="common_yes">是</string>
<string name="foreign_files_local_text">本地: %1$s</string>
<string name="foreign_files_remote_text">远程:%1$s</string>
<string name="upload_query_move_foreign_files">没有足够的空间以复制选定的文件到 %1$s 文件夹,您想移动文件到此文件夹吗?</string>
- <string name="pincode_enter_pin_code">请输入您的App PIN码</string>
- <string name="pincode_configure_your_pin">输入 App PIN码</string>
- <string name="pincode_configure_your_pin_explanation">每次应用启动时都会请求PIN码</string>
- <string name="pincode_reenter_your_pincode">再次输入 App PIN码</string>
- <string name="pincode_remove_your_pincode">移除 App PIN码</string>
- <string name="pincode_mismatch">两次 App PIN码不同</string>
- <string name="pincode_wrong">App PIN码不正确</string>
- <string name="pincode_removed">App PIN码已移除</string>
- <string name="pincode_stored">App PIN码已保存</string>
+ <string name="pass_code_enter_pass_code">请输入您的密码</string>
+ <string name="pass_code_configure_your_pass_code">输入您的密码</string>
+ <string name="pass_code_configure_your_pass_code_explanation">每次应用启动将会请求密码</string>
+ <string name="pass_code_reenter_your_pass_code">请重新输入您的密码</string>
+ <string name="pass_code_remove_your_pass_code">移除您的密码</string>
+ <string name="pass_code_mismatch">密码不一致</string>
+ <string name="pass_code_wrong">错误的密码</string>
+ <string name="pass_code_removed">移除的密码</string>
+ <string name="pass_code_stored">存储的密码</string>
<string name="media_notif_ticker">%1$s 音乐播放器</string>
<string name="media_state_playing">%1$s (播放中)</string>
<string name="media_state_loading">%1$s (载入中)</string>
<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_account_not_new">此设备中已经存在同名同服务器的帐号</string>
<string name="auth_account_not_the_same">输入用户与此帐户的用户不符</string>
<string name="auth_fail_get_user_name">您的服务器没有返回一个正确的用户 id,请联系管理员
</string>
<string name="auth_can_not_auth_against_server">无法通过此服务器认证</string>
+ <string name="auth_account_does_not_exist">设备中还未存在该帐号</string>
<string name="fd_keep_in_sync">保证文件更新</string>
<string name="common_rename">重命名</string>
<string name="common_remove">删除</string>
<string name="filedisplay_unexpected_bad_get_content">未知问题;请试试用其他程序选择此文件</string>
<string name="filedisplay_no_file_selected">未选择文件</string>
<string name="activity_chooser_title">发送链接给 …</string>
+ <string name="wait_for_tmp_copy_from_private_storage">从私有存储中拷贝文件</string>
<string name="oauth_check_onoff">使用oAuth2登陆</string>
<string name="oauth_login_connection">连接oAuth2 服务器...</string>
<string name="ssl_validator_header">站点身份无法验证</string>
<string name="share_link_file_error">共享文件或目录出错</string>
<string name="unshare_link_file_no_exist">无法取消共享。请检查文件是否存在</string>
<string name="unshare_link_file_error">解除文件或目录共享时出错</string>
+ <string name="share_link_password_title">输入密码</string>
+ <string name="share_link_empty_password">您必须输入密码</string>
<string name="activity_chooser_send_file_title">发送</string>
<string name="copy_link">复制链接</string>
<string name="clipboard_text_copied">复制到剪贴板</string>
<string name="prefs_category_security">安全</string>
<string name="prefs_instant_video_upload_path_title">视频上传路径</string>
<string name="download_folder_failed_content">%1$s 文件夹的下载无法完成</string>
+ <string name="shared_subject_header">已共享</string>
+ <string name="with_you_subject_header">与你</string>
+ <string name="auth_refresh_button">刷新连接</string>
<string name="auth_host_address">服务器地址</string>
+ <string name="common_error_out_memory">内存不足</string>
+ <string name="username">用户名</string>
</resources>
<string name="actionbar_send_file">傳送</string>
<!--TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item>-->
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
<string name="prefs_category_general">一般</string>
<string name="prefs_category_more">更多</string>
<string name="prefs_accounts">帳號</string>
</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">所有檔案</string>
+ <!--TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">設定</string>
+ <string name="drawer_item_logs">紀錄</string>
+ <string name="drawer_close"> 關閉</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 密碼</string>
- <string name="prefs_pincode_summary">保護您的 App 用戶端</string>
<string name="prefs_instant_upload">即時圖片上傳</string>
<string name="prefs_instant_upload_summary">即時上傳相機照片</string>
<string name="prefs_instant_video_upload">即時影像上傳</string>
<string name="foreign_files_local_text">本地: %1$s</string>
<string name="foreign_files_remote_text">遠端: %1$s</string>
<string name="upload_query_move_foreign_files">無足夠的空間可以複製檔案到 %1$s 目錄. 是否使用移動的方式來處理? </string>
- <string name="pincode_enter_pin_code">請輸入您的 App 密碼</string>
- <string name="pincode_configure_your_pin">輸入您的 App 密碼</string>
- <string name="pincode_configure_your_pin_explanation">這個密碼在你每次啟動這程式時都會被要求輸入</string>
- <string name="pincode_reenter_your_pincode">請重新輸入您的 App 密碼</string>
- <string name="pincode_remove_your_pincode">移除您的 App 密碼</string>
- <string name="pincode_mismatch">App 密碼不相符</string>
- <string name="pincode_wrong">App 密碼不正確</string>
- <string name="pincode_removed">App 密碼已移除</string>
- <string name="pincode_stored">App 密碼已儲存</string>
<string name="media_notif_ticker">%1$s 音樂播放器</string>
<string name="media_state_playing">%1$s (播放中)</string>
<string name="media_state_loading">%1$s (載入中)</string>
<string name="prefs_category_security">安全性</string>
<string name="prefs_instant_video_upload_path_title">影片上傳路徑</string>
<string name="download_folder_failed_content">%1$s 目錄的下載未完成</string>
+ <string name="shared_subject_header">以分享的</string>
+ <string name="with_you_subject_header">與你</string>
<string name="subject_token">%1$s 分享了 \"%2$s\" 給您</string>
<string name="auth_refresh_button">重新連線</string>
<string name="auth_host_address">伺服器位址</string>
+ <string name="username">使用者名稱</string>
</resources>
<color name="filelist_icon_backgorund">#DDDDDD</color>
<color name="owncloud_blue_bright">#00ddff</color>
<color name="list_item_lastmod_and_filesize_text">#989898</color>
+ <color name="black">#000000</color>
<color name="textColor">#303030</color>
<color name="list_divider_background">#fff0f0f0</color>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ownCloud Android client application
+
+ Copyright (C) 2015 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+
+<resources>
+ <!-- Nav Drawer Menu Items -->
+ <string-array name="drawer_items">
+ <!--TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<item>@string/prefs_accounts</item>-->
+ <item>@string/drawer_item_all_files</item>
+ <!--<item>@string/drawer_item_on_device</item>-->
+ <item>@string/actionbar_settings</item>
+ <item>@string/actionbar_logger</item>
+ </string-array>
+
+ <!-- Nav Drawer Content Descriptions -->
+ <string-array name="drawer_content_descriptions">
+ <!-- TODO re-enable when "Accounts" is available in Navigation Drawer-->
+ <!--<item>@string/drawer_item_accounts</item>-->
+ <item>@string/drawer_item_all_files</item>
+ <!--<item>@string/drawer_item_on_device</item>-->
+ <item>@string/drawer_item_settings</item>
+ <item>@string/drawer_item_logs</item>
+ </string-array>
+
+</resources>
\ No newline at end of file
<!-- Flags to enable/disable some features -->
<string name = "send_files_to_other_apps">on</string>
+ <string name = "share_feature">on</string>
<!-- Colors -->
<!-- TODO re-enable when server-side folder size calculation is available
<item>Biggest - Smallest</item> -->
</string-array>
+ <!-- TODO re-enable when "Accounts" is available in Navigation Drawer -->
+ <!--<string name="drawer_item_accounts">Accounts</string>-->
+ <string name="drawer_item_all_files">All files</string>
+ <!-- TODO re-enable when "On Device" is available
+ <string name="drawer_item_on_device">On device</string>-->
+ <string name="drawer_item_settings">Settings</string>
+ <string name="drawer_item_logs">Logs</string>
+ <string name="drawer_close">Close</string>
<string name="prefs_category_general">General</string>
<string name="prefs_category_more">More</string>
<string name="prefs_accounts">Accounts</string>
<string name="prefs_manage_accounts">Manage Accounts</string>
- <string name="prefs_pincode">App PIN</string>
- <string name="prefs_pincode_summary">Protect your client</string>
+ <string name="prefs_passcode">Passcode lock</string>
<string name="prefs_instant_upload">Instant picture uploads</string>
<string name="prefs_instant_upload_summary">Instantly upload pictures taken by camera</string>
<string name="prefs_instant_video_upload">Instant video uploads</string>
<string name="filedetails_download">Download</string>
<string name="filedetails_sync_file">Refresh file</string>
<string name="filedetails_renamed_in_upload_msg">File was renamed to %1$s during upload</string>
+ <string name="list_layout">List Layout</string>
<string name="action_share_file">Share link</string>
<string name="action_unshare_file">Unshare link</string>
<string name="common_yes">Yes</string>
<string name="foreign_files_local_text">"Local: %1$s"</string>
<string name="foreign_files_remote_text">"Remote: %1$s"</string>
<string name="upload_query_move_foreign_files">There is not space enough to copy the selected files into the %1$s folder. Would you like to move them instead? </string>
- <string name="pincode_enter_pin_code">Please, insert your App PIN</string>
+ <string name="pass_code_enter_pass_code">Please, insert your passcode</string>
- <string name="pincode_configure_your_pin">Enter your App PIN</string>
- <string name="pincode_configure_your_pin_explanation">The PIN will be requested every time the app is started</string>
- <string name="pincode_reenter_your_pincode">Please, reenter your App PIN</string>
- <string name="pincode_remove_your_pincode">Remove your App PIN</string>
- <string name="pincode_mismatch">The App PINs are not the same</string>
- <string name="pincode_wrong">Incorrect App PIN</string>
- <string name="pincode_removed">App PIN removed</string>
- <string name="pincode_stored">App PIN stored</string>
+ <string name="pass_code_configure_your_pass_code">Enter your passcode</string>
+ <string name="pass_code_configure_your_pass_code_explanation">The passcode will be requested every time the app is started</string>
+ <string name="pass_code_reenter_your_pass_code">Please, reenter your passcode</string>
+ <string name="pass_code_remove_your_pass_code">Remove your passcode</string>
+ <string name="pass_code_mismatch">The passcodes are not the same</string>
+ <string name="pass_code_wrong">Incorrect passcode</string>
+ <string name="pass_code_removed">Passcode removed</string>
+ <string name="pass_code_stored">Passcode stored</string>
<string name="media_notif_ticker">"%1$s music player"</string>
<string name="media_state_playing">"%1$s (playing)"</string>
<string name="sync_file_nothing_to_do_msg">File contents already synchronized</string>
<string name="create_dir_fail_msg">Folder could not be created</string>
<string name="filename_forbidden_characters">Forbidden characters: / \\ < > : " | ? *</string>
+ <string name="filename_forbidden_charaters_from_server">File name contains at least one invalid character</string>
<string name="filename_empty">File name cannot be empty</string>
<string name="wait_a_moment">Wait a moment</string>
<string name="filedisplay_unexpected_bad_get_content">"Unexpected problem ; please select the file from a different app"</string>
<string name="filedisplay_no_file_selected">No file was selected</string>
<string name="activity_chooser_title">Send link to …</string>
+ <string name="wait_for_tmp_copy_from_private_storage">Copying file from private storage</string>
<string name="oauth_check_onoff">Login with oAuth2</string>
<string name="oauth_login_connection">Connecting to oAuth2 server…</string>
<string name="prefs_instant_video_upload_path_title">Upload Video Path</string>
<string name="download_folder_failed_content">Download of %1$s folder could not be completed</string>
+ <string name="shared_subject_header">shared</string>
+ <string name="with_you_subject_header">with you</string>
+
<string name="subject_token">%1$s shared \"%2$s\" with you</string>
<string name="auth_refresh_button">Refresh connection</string>
<string name="auth_host_address">Server address</string>
+ <string name="common_error_out_memory">Not enough memory</string>
+ <string name="username">Username</string>
</resources>
<style name="Animations" />
<!-- General ownCloud app style -->
- <style name="Theme.ownCloud" parent="style/Theme.Sherlock.Light.DarkActionBar">
+ <style name="Theme.ownCloud" parent="style/Theme.AppCompat.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
<item name="actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
<item name="android:buttonStyle">@style/Theme.ownCloud.ButtonStyle</item>
- <item name="actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
- <item name="android:actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
</style>
- <style name="Theme.ownCloud.noActionBar" parent="style/Theme.Sherlock.Light.NoActionBar">
- <item name="android:actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
- <item name="actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
- <item name="android:buttonStyle">@style/Theme.ownCloud.ButtonStyle</item>
- <item name="actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
- <item name="android:actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
+ <style name="Theme.ownCloud.noActionBar" parent="style/Theme.AppCompat.Light">
+ <item name="android:buttonStyle">@style/Theme.ownCloud.ButtonStyle</item>
</style>
-
- <style name="Theme.ownCloud.Fullscreen" parent="style/Theme.Sherlock.NoActionBar">
- <item name="android:actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
- <item name="actionBarStyle">@style/Theme.ownCloud.Widget.ActionBar</item>
- <item name="android:windowFullscreen">true</item>
- <item name="actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
- <item name="android:actionDropDownStyle">@style/Theme.ownCloud.DropDownStyle</item>
+
+ <style name="Theme.ownCloud.Fullscreen" parent="style/Theme.AppCompat">
+ <item name="android:windowFullscreen">true</item>
</style>
- <style name="Theme.ownCloud.Widget.ActionBar" parent="style/Widget.Sherlock.Light.ActionBar.Solid.Inverse">
+ <style name="Theme.ownCloud.Widget.ActionBar"
+ parent="style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
<item name="android:background">@drawable/main_header_bg</item>
<item name="background">@drawable/main_header_bg</item>
<item name="android:textColor">#ffffff</item>
<item name="android:shadowRadius">1</item>
<item name="android:shadowDy">1</item>
<item name="android:backgroundSplit">@drawable/split_action_bg</item>
- <item name="android:indeterminateProgressStyle">@style/Theme.ownCloud.IndeterminateStyle</item>
- <item name="indeterminateProgressStyle">@style/Theme.ownCloud.IndeterminateStyle</item>
</style>
<!-- Dialogs -->
</style>
<!-- DropDown -->
- <style name="Theme.ownCloud.DropDownStyle" parent="style/Widget.Sherlock.Spinner.DropDown.ActionBar">
- <item name="android:background">@drawable/abs__spinner_ab_holo_dark</item>
+ <style name="Theme.ownCloud.DropDownStyle"
+ parent="style/Widget.AppCompat.Spinner.DropDown.ActionBar">
+ <!--<item name="android:background">@drawable/spinner_inner</item>-->
</style>
- <style name="Theme.ownCloud.IndeterminateStyle" parent="style/Widget.Sherlock.ProgressBar">
- <item name="android:indeterminateDrawable">@drawable/abs__progress_medium_holo</item>
+ <style name="Theme.ownCloud.IndeterminateStyle"
+ parent="style/Widget.AppCompat.ProgressBar">
+ <!--<item name="android:indeterminateDrawable">@drawable/abs__progress_medium_holo</item>-->
</style>
<!-- Notifications -->
</PreferenceCategory>
<PreferenceCategory android:title="@string/prefs_category_security">
- <!-- ListPreference
- android:key="select_oc_account"
- android:title="@string/prefs_select_oc_account"
- android:summary="@string/prefs_summary_select_oc_account"
- / -->
- <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:title="@string/prefs_pincode" android:key="set_pincode"
- android:summary="@string/prefs_pincode_summary"/>
+ <android.preference.CheckBoxPreference android:title="@string/prefs_passcode" android:key="set_pincode" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/prefs_category_instant_uploading" android:key="instant_uploading_category">
include ':owncloud-android-library'
-include 'libs/actionbarsherlock_lib'
include ':'
:initForAnt
echo "Executing Ant setup..."
::If the directory exists the script has already been executed
-if not exist .\actionbarsherlock (
-
- ::Gets the owncloud-android-library
- call git submodule init
- call git submodule update
-
- ::Clones the actionbarsherlock and checks-out the right release (4.2.0)
- git clone "https://github.com/JakeWharton/ActionBarSherlock.git" "actionbarsherlock"
- cd "actionbarsherlock"
- git checkout "90939dc3925ffaaa0de269bbbe1b35e274968ea1"
- cd ../
-
- call android.bat update project -p actionbarsherlock/library -n ActionBarSherlock --target android-19
- call android.bat update lib-project -p owncloud-android-library
- call android.bat update project -p .
- call android.bat update project -p oc_jb_workaround
- copy /Y third_party\android-support-library\android-support-v4.jar actionbarsherlock\library\libs\android-support-v4.jar
- call android.bat update test-project -p tests -m ..
-)
+
+::Gets the owncloud-android-library
+call git submodule init
+call git submodule update
+
+call android.bat update project -p libs/android-support-appcompat-v7-exploded-aar --target android-16
+call android.bat update lib-project -p owncloud-android-library
+call android.bat update project -p .
+call android.bat update project -p oc_jb_workaround
+call android.bat update test-project -p tests -m ..
+
goto complete
:initDefault
#!/bin/bash -e
-#Repository
-ActionBarSherlockRepo="https://github.com/JakeWharton/ActionBarSherlock.git"
-
-#Directory for actionbarsherlock
-DIRECTORY="actionbarsherlock"
-
-#Commit for version 4.2 of actionbar sherlock
-COMMIT="90939dc3925ffaaa0de269bbbe1b35e274968ea1"
-
-
function initDefault {
git submodule init
git submodule update
}
function initForAnt {
- #If the directory exists the script has already been executed
- if [ ! -d "$DIRECTORY" ]; then
-
- #Gets the owncloud-android-library
- git submodule init
- git submodule update
-
- #Clones the actionbarsherlock and checks-out the right release (4.2.0)
- git clone $ActionBarSherlockRepo $DIRECTORY
- cd $DIRECTORY
- git checkout $COMMIT
- cd ../
- #As default it updates the ant scripts
- android update project -p "$DIRECTORY"/library -n ActionBarSherlock --target android-19
- android update lib-project -p owncloud-android-library
- android update project -p .
- android update project -p oc_jb_workaround
- cp third_party/android-support-library/android-support-v4.jar actionbarsherlock/library/libs/android-support-v4.jar
- android update test-project -p tests -m ..
- fi
+ #Gets the owncloud-android-library
+ git submodule init
+ git submodule update
+
+ #Prepare project android-support-appcompat-v7 ; JAR file is not enough, includes resources
+ android update lib-project -p libs/android-support-appcompat-v7-exploded-aar --target android-16
+
+ #As default it updates the ant scripts
+ android update lib-project -p owncloud-android-library
+ android update project -p .
+ android update project -p oc_jb_workaround
+ android update test-project -p tests -m ..
}
#No args
*/
package com.owncloud.android;
+import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.Bundle;
+import com.owncloud.android.authentication.PassCodeManager;
import com.owncloud.android.datamodel.ThumbnailsCacheManager;
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory.Policy;
import com.owncloud.android.lib.common.utils.Log_OC;
+
/**
* Main Application of the project
*
private static final String TAG = MainApp.class.getSimpleName();
private static final String AUTH_ON = "on";
-
+
@SuppressWarnings("unused")
private static final String POLICY_SINGLE_SESSION_PER_ACCOUNT = "single session per account";
@SuppressWarnings("unused")
private static final String POLICY_ALWAYS_NEW_CLIENT = "always new client";
private static Context mContext;
+
+ // TODO Enable when "On Device" is recovered?
+ // TODO better place
+ // private static boolean mOnlyOnDevice = false;
+
public void onCreate(){
super.onCreate();
Log_OC.startLogging();
Log_OC.d("Debug", "start logging");
}
+
+ // register global protection with pass code
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ this.registerActivityLifecycleCallbacks( new ActivityLifecycleCallbacks() {
+
+ @Override
+ public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
+ Log_OC.d(activity.getClass().getSimpleName(), "onCreate(Bundle) starting" );
+ PassCodeManager.getPassCodeManager().onActivityCreated(activity);
+ }
+
+ @Override
+ public void onActivityStarted(Activity activity) {
+ Log_OC.d(activity.getClass().getSimpleName(), "onStart() starting" );
+ PassCodeManager.getPassCodeManager().onActivityStarted(activity);
+ }
+
+ @Override
+ public void onActivityResumed(Activity activity) {
+ Log_OC.d(activity.getClass().getSimpleName(), "onResume() starting" );
+ }
+
+ @Override
+ public void onActivityPaused(Activity activity) {
+ Log_OC.d(activity.getClass().getSimpleName(), "onPause() ending");
+ }
+
+ @Override
+ public void onActivityStopped(Activity activity) {
+ Log_OC.d(activity.getClass().getSimpleName(), "onStop() ending" );
+ PassCodeManager.getPassCodeManager().onActivityStopped(activity);
+ }
+
+ @Override
+ public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
+ Log_OC.d(activity.getClass().getSimpleName(), "onSaveInstanceState(Bundle) starting" );
+ }
+
+ @Override
+ public void onActivityDestroyed(Activity activity) {
+ Log_OC.d(activity.getClass().getSimpleName(), "onDestroy() ending" );
+ }
+ });
+ }
}
public static Context getAppContext() {
return getAppContext().getResources().getString(R.string.log_name);
}
+ // TODO Enable when "On Device" is recovered ?
+// public static void showOnlyFilesOnDevice(boolean state){
+// mOnlyOnDevice = state;
+// }
+//
+// public static boolean getOnlyOnDevice(){
+// return mOnlyOnDevice;
+// }
+
// user agent
public static String getUserAgent() {
String appString = getAppContext().getResources().getString(R.string.user_agent);
import android.accounts.AccountAuthenticatorResponse;
import android.accounts.AccountManager;
import android.os.Bundle;
-
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
+import android.support.v7.app.ActionBarActivity;
/*
* Base class for implementing an Activity that is used to help implement an AbstractAccountAuthenticator.
* then error AccountManager.ERROR_CODE_CANCELED will be called on the response.
*/
-public class AccountAuthenticatorActivity extends SherlockFragmentActivity {
+public class AccountAuthenticatorActivity extends ActionBarActivity {
private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
private Bundle mResultBundle = null;
\r
import com.owncloud.android.MainApp;\r
import com.owncloud.android.lib.common.accounts.AccountTypeUtils;\r
+import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;\r
+import com.owncloud.android.lib.common.utils.Log_OC;\r
import com.owncloud.android.lib.resources.status.OwnCloudVersion;\r
\r
import android.accounts.Account;\r
import android.accounts.AccountManager;\r
import android.content.Context;\r
import android.content.SharedPreferences;\r
+import android.net.Uri;\r
import android.preference.PreferenceManager;\r
\r
public class AccountUtils {\r
- public static final String WEBDAV_PATH_1_2 = "/webdav/owncloud.php";\r
- public static final String WEBDAV_PATH_2_0 = "/files/webdav.php";\r
- public static final String WEBDAV_PATH_4_0 = "/remote.php/webdav";\r
+\r
+ private static final String TAG = AccountUtils.class.getSimpleName();\r
+\r
+ public static final String WEBDAV_PATH_4_0_AND_LATER = "/remote.php/webdav";\r
private static final String ODAV_PATH = "/remote.php/odav";\r
private static final String SAML_SSO_PATH = "/remote.php/webdav";\r
- public static final String CARDDAV_PATH_2_0 = "/apps/contacts/carddav.php";\r
- public static final String CARDDAV_PATH_4_0 = "/remote/carddav.php";\r
public static final String STATUS_PATH = "/status.php";\r
\r
+ public static final int ACCOUNT_VERSION = 1;\r
+\r
/**\r
* Can be used to get the currently selected ownCloud {@link Account} in the\r
* application preferences.\r
}\r
\r
\r
- /**\r
- * Checks, whether or not there are any ownCloud accounts setup.\r
- * \r
- * @return true, if there is at least one account.\r
- */\r
- public static boolean accountsAreSetup(Context context) {\r
- AccountManager accMan = AccountManager.get(context);\r
- Account[] accounts = accMan\r
- .getAccountsByType(MainApp.getAccountType());\r
- return accounts.length > 0;\r
- }\r
- \r
- \r
public static boolean setCurrentOwnCloudAccount(Context context, String accountName) {\r
boolean result = false;\r
if (accountName != null) {\r
Account[] ocAccounts = AccountManager.get(context).getAccountsByType(\r
MainApp.getAccountType());\r
- boolean found = false;\r
+ boolean found;\r
for (Account account : ocAccounts) {\r
found = (account.name.equals(accountName));\r
if (found) {\r
* according to its version and the authorization method used.\r
* \r
* @param version Version of ownCloud server.\r
- * @param authTokenType Authorization token type, matching some of the AUTH_TOKEN_TYPE_* constants in {@link AccountAuthenticator}. \r
- * @return WebDAV path for given OC version and authorization method, null if OC version is unknown.\r
+ * @param authTokenType Authorization token type, matching some of the AUTH_TOKEN_TYPE_* constants in\r
+ * {@link AccountAuthenticator}.\r
+ * @return WebDAV path for given OC version and authorization method, null if OC version\r
+ * is unknown; versions prior to ownCloud 4 are not supported anymore\r
*/\r
public static String getWebdavPath(OwnCloudVersion version, String authTokenType) {\r
if (version != null) {\r
if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(authTokenType)) {\r
return SAML_SSO_PATH;\r
}\r
- if (version.compareTo(OwnCloudVersion.owncloud_v4) >= 0)\r
- return WEBDAV_PATH_4_0;\r
- if (version.compareTo(OwnCloudVersion.owncloud_v3) >= 0\r
- || version.compareTo(OwnCloudVersion.owncloud_v2) >= 0)\r
- return WEBDAV_PATH_2_0;\r
- if (version.compareTo(OwnCloudVersion.owncloud_v1) >= 0)\r
- return WEBDAV_PATH_1_2;\r
+ return WEBDAV_PATH_4_0_AND_LATER;\r
}\r
return null;\r
}\r
- \r
+\r
+\r
+ /**\r
+ * Update the accounts in AccountManager to meet the current version of accounts expected by the app, if needed.\r
+ *\r
+ * Introduced to handle a change in the structure of stored account names needed to allow different OC servers\r
+ * in the same domain, but not in the same path.\r
+ *\r
+ * @param context Used to access the AccountManager.\r
+ */\r
+ public static void updateAccountVersion(Context context) {\r
+ Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(context);\r
+ AccountManager accountMgr = AccountManager.get(context);\r
+\r
+ if ( currentAccount != null ) {\r
+ String currentAccountVersion = accountMgr.getUserData(currentAccount, Constants.KEY_OC_ACCOUNT_VERSION);\r
+\r
+ if (currentAccountVersion == null) {\r
+ Log_OC.i(TAG, "Upgrading accounts to account version #" + ACCOUNT_VERSION);\r
+ Account[] ocAccounts = accountMgr.getAccountsByType(MainApp.getAccountType());\r
+ String serverUrl, username, newAccountName, password;\r
+ Account newAccount;\r
+ for (Account account : ocAccounts) {\r
+ // build new account name\r
+ serverUrl = accountMgr.getUserData(account, Constants.KEY_OC_BASE_URL);\r
+ username = account.name.substring(0, account.name.lastIndexOf('@'));\r
+ newAccountName = com.owncloud.android.lib.common.accounts.AccountUtils.\r
+ buildAccountName(Uri.parse(serverUrl), username);\r
+\r
+ // migrate to a new account, if needed\r
+ if (!newAccountName.equals(account.name)) {\r
+ Log_OC.d(TAG, "Upgrading " + account.name + " to " + newAccountName);\r
+\r
+ // create the new account\r
+ newAccount = new Account(newAccountName, MainApp.getAccountType());\r
+ password = accountMgr.getPassword(account);\r
+ accountMgr.addAccountExplicitly(newAccount, (password != null) ? password : "", null);\r
+\r
+ // copy base URL\r
+ accountMgr.setUserData(newAccount, Constants.KEY_OC_BASE_URL, serverUrl);\r
+\r
+ // copy server version\r
+ accountMgr.setUserData(\r
+ newAccount,\r
+ Constants.KEY_OC_VERSION,\r
+ accountMgr.getUserData(account, Constants.KEY_OC_VERSION)\r
+ );\r
+\r
+ // copy cookies\r
+ accountMgr.setUserData(\r
+ newAccount,\r
+ Constants.KEY_COOKIES,\r
+ accountMgr.getUserData(account, Constants.KEY_COOKIES)\r
+ );\r
+\r
+ // copy type of authentication\r
+ String isSamlStr = accountMgr.getUserData(account, Constants.KEY_SUPPORTS_SAML_WEB_SSO);\r
+ boolean isSaml = "TRUE".equals(isSamlStr);\r
+ if (isSaml) {\r
+ accountMgr.setUserData(newAccount, Constants.KEY_SUPPORTS_SAML_WEB_SSO, "TRUE");\r
+ }\r
+\r
+ String isOauthStr = accountMgr.getUserData(account, Constants.KEY_SUPPORTS_OAUTH2);\r
+ boolean isOAuth = "TRUE".equals(isOauthStr);\r
+ if (isOAuth) {\r
+ accountMgr.setUserData(newAccount, Constants.KEY_SUPPORTS_OAUTH2, "TRUE");\r
+ }\r
+ /* TODO - study if it's possible to run this method in a background thread to copy the authToken\r
+ if (isOAuth || isSaml) {\r
+ accountMgr.setAuthToken(newAccount, mAuthTokenType, mAuthToken);\r
+ }\r
+ */\r
+\r
+ // don't forget the account saved in preferences as the current one\r
+ if (currentAccount.name.equals(account.name)) {\r
+ AccountUtils.setCurrentOwnCloudAccount(context, newAccountName);\r
+ }\r
+\r
+ // remove the old account\r
+ accountMgr.removeAccount(account, null, null);\r
+ // will assume it succeeds, not a big deal otherwise\r
+\r
+ } else {\r
+ // servers which base URL is in the root of their domain need no change\r
+ Log_OC.d(TAG, account.name + " needs no upgrade ");\r
+ newAccount = account;\r
+ }\r
+\r
+ // at least, upgrade account version\r
+ Log_OC.d(TAG, "Setting version " + ACCOUNT_VERSION + " to " + newAccountName);\r
+ accountMgr.setUserData(\r
+ newAccount, Constants.KEY_OC_ACCOUNT_VERSION, Integer.toString(ACCOUNT_VERSION)\r
+ );\r
+\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ public static String trimWebdavSuffix(String url) {\r
+ while(url.endsWith("/")) {\r
+ url = url.substring(0, url.length() - 1);\r
+ }\r
+ int pos = url.lastIndexOf(WEBDAV_PATH_4_0_AND_LATER);\r
+ if (pos >= 0) {\r
+ url = url.substring(0, pos);\r
+\r
+ } else {\r
+ pos = url.lastIndexOf(ODAV_PATH);\r
+ if (pos >= 0) {\r
+ url = url.substring(0, pos);\r
+ }\r
+ }\r
+ return url;\r
+ }\r
+\r
+ /**\r
+ * Access the version of the OC server corresponding to an account SAVED IN THE ACCOUNTMANAGER\r
+ *\r
+ * @param account ownCloud account\r
+ * @return Version of the OC server corresponding to account, according to the data saved\r
+ * in the system AccountManager\r
+ */\r
+ public static OwnCloudVersion getServerVersion(Account account) {\r
+ OwnCloudVersion serverVersion = null;\r
+ if (account != null) {\r
+ AccountManager accountMgr = AccountManager.get(MainApp.getAppContext());\r
+ String serverVersionStr = accountMgr.getUserData(account, Constants.KEY_OC_VERSION);\r
+ if (serverVersionStr != null) {\r
+ serverVersion = new OwnCloudVersion(serverVersionStr);\r
+ }\r
+ }\r
+ return serverVersion;\r
+ }\r
+\r
}\r
import android.os.Handler;\r
import android.os.IBinder;\r
import android.preference.PreferenceManager;\r
+import android.support.v4.app.DialogFragment;\r
import android.support.v4.app.Fragment;\r
import android.support.v4.app.FragmentManager;\r
import android.support.v4.app.FragmentTransaction;\r
import android.view.View;\r
import android.view.View.OnFocusChangeListener;\r
import android.view.View.OnTouchListener;\r
-import android.view.Window;\r
import android.view.inputmethod.EditorInfo;\r
import android.webkit.HttpAuthHandler;\r
import android.webkit.SslErrorHandler;\r
import android.widget.TextView.OnEditorActionListener;\r
import android.widget.Toast;\r
\r
-import com.actionbarsherlock.app.SherlockDialogFragment;\r
import com.owncloud.android.MainApp;\r
import com.owncloud.android.R;\r
import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;\r
/// Identifier of operation in progress which result shouldn't be lost \r
private long mWaitingForOpId = Long.MAX_VALUE;\r
\r
- private final String BASIC_TOKEN_TYPE = AccountTypeUtils.getAuthTokenTypePass(MainApp.getAccountType());\r
- private final String OAUTH_TOKEN_TYPE = AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType());\r
+ private final String BASIC_TOKEN_TYPE = AccountTypeUtils.getAuthTokenTypePass(\r
+ MainApp.getAccountType());\r
+ private final String OAUTH_TOKEN_TYPE = AccountTypeUtils.getAuthTokenTypeAccessToken(\r
+ MainApp.getAccountType());\r
private final String SAML_TOKEN_TYPE =\r
AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType());\r
\r
protected void onCreate(Bundle savedInstanceState) {\r
//Log_OC.wtf(TAG, "onCreate init");\r
super.onCreate(savedInstanceState);\r
- getWindow().requestFeature(Window.FEATURE_NO_TITLE);\r
+\r
+ // Workaround, for fixing a problem with Android Library Suppor v7 19\r
+ //getWindow().requestFeature(Window.FEATURE_NO_TITLE);\r
+ if (getSupportActionBar() != null) {\r
+ getSupportActionBar().hide();\r
+\r
+ getSupportActionBar().setDisplayHomeAsUpEnabled(false);\r
+ getSupportActionBar().setDisplayShowHomeEnabled(false);\r
+ getSupportActionBar().setDisplayShowTitleEnabled(false);\r
+ }\r
\r
mIsFirstAuthAttempt = true;\r
\r
if (mAccount != null) {\r
mServerInfo.mBaseUrl = mAccountMgr.getUserData(mAccount, Constants.KEY_OC_BASE_URL);\r
// TODO do next in a setter for mBaseUrl\r
- mServerInfo.mIsSslConn = mServerInfo.mBaseUrl.startsWith("https://"); \r
- String ocVersion = mAccountMgr.getUserData(mAccount, Constants.KEY_OC_VERSION);\r
- if (ocVersion != null) {\r
- mServerInfo.mVersion = new OwnCloudVersion(ocVersion);\r
- }\r
+ mServerInfo.mIsSslConn = mServerInfo.mBaseUrl.startsWith("https://");\r
+ mServerInfo.mVersion = AccountUtils.getServerVersion(mAccount);\r
} else {\r
mServerInfo.mBaseUrl = getString(R.string.server_url).trim();\r
mServerInfo.mIsSslConn = mServerInfo.mBaseUrl.startsWith("https://");\r
findViewById(R.id.hostUrlFrame).setVisibility(View.GONE);\r
mRefreshButton = findViewById(R.id.centeredRefreshButton);\r
}\r
- showRefreshButton(mServerIsChecked && !mServerIsValid && \r
+ showRefreshButton(mServerIsChecked && !mServerIsValid &&\r
mWaitingForOpId > Integer.MAX_VALUE);\r
mServerStatusView = (TextView) findViewById(R.id.server_status_text);\r
showServerStatus();\r
* intended to defer the processing of the redirection caught in \r
* {@link #onNewIntent(Intent)} until {@link #onResume()} \r
* \r
- * See {@link #onSaveInstanceState(Bundle)}\r
+ * See {@link super#onSaveInstanceState(Bundle)}\r
*/\r
@Override\r
protected void onSaveInstanceState(Bundle outState) {\r
mOkButton.setEnabled(false);\r
mServerInfo = new GetServerInfoOperation.ServerInfo();\r
showRefreshButton(false);\r
- \r
+\r
if (uri.length() != 0) {\r
// Handle internationalized domain names\r
uri = DisplayUtils.convertIdn(uri, true);\r
+\r
mServerStatusText = R.string.auth_testing_connection;\r
mServerStatusIcon = R.drawable.progress_small;\r
showServerStatus();\r
Intent getServerInfoIntent = new Intent();\r
getServerInfoIntent.setAction(OperationsService.ACTION_GET_SERVER_INFO);\r
getServerInfoIntent.putExtra(\r
- OperationsService.EXTRA_SERVER_URL, \r
+ OperationsService.EXTRA_SERVER_URL,\r
normalizeUrlSuffix(uri)\r
);\r
if (mOperationsServiceBinder != null) {\r
dialog.show(getSupportFragmentManager(), WAIT_DIALOG_TAG);\r
\r
/// validate credentials accessing the root folder\r
- OwnCloudCredentials credentials = OwnCloudCredentialsFactory.newBasicCredentials(username, password);\r
+ OwnCloudCredentials credentials = OwnCloudCredentialsFactory.newBasicCredentials(username,\r
+ password);\r
accessRootFolder(credentials);\r
}\r
\r
\r
if ( mAction == ACTION_CREATE) {\r
mUsernameInput.setText(username);\r
- success = createAccount();\r
+ success = createAccount(result);\r
} else {\r
\r
if (!mUsernameInput.getText().toString().equals(username)) {\r
\r
} catch (AccountNotFoundException e) {\r
Log_OC.e(TAG, "Account " + mAccount + " was removed!", e);\r
- Toast.makeText(this, R.string.auth_account_does_not_exist, Toast.LENGTH_SHORT).show();\r
+ Toast.makeText(this, R.string.auth_account_does_not_exist,\r
+ Toast.LENGTH_SHORT).show();\r
finish();\r
}\r
}\r
url = "http://" + url;\r
}\r
}\r
- \r
+\r
url = normalizeUrlSuffix(url);\r
}\r
return (url != null ? url : "");\r
\r
// TODO remove, if possible\r
private String trimUrlWebdav(String url){ \r
- if(url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_4_0)){\r
- url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_4_0.length()); \r
- } else if(url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_2_0)){\r
- url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_2_0.length()); \r
- } else if (url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_1_2)){\r
- url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_1_2.length()); \r
- } \r
- return (url != null ? url : "");\r
+ if(url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_4_0_AND_LATER)){\r
+ url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_4_0_AND_LATER.length());\r
+ }\r
+ return url;\r
}\r
\r
\r
Log_OC.d(TAG, "Got ACCESS TOKEN: " + mAuthToken);\r
\r
/// validate token accessing to root folder / getting session\r
- OwnCloudCredentials credentials = OwnCloudCredentialsFactory.newBearerCredentials(mAuthToken);\r
+ OwnCloudCredentials credentials = OwnCloudCredentialsFactory.newBearerCredentials(\r
+ mAuthToken);\r
accessRootFolder(credentials);\r
\r
} else {\r
Log_OC.d(TAG, "Successful access - time to save the account");\r
\r
boolean success = false;\r
+\r
if (mAction == ACTION_CREATE) {\r
- success = createAccount();\r
+ success = createAccount(result);\r
\r
} else {\r
try {\r
\r
} catch (AccountNotFoundException e) {\r
Log_OC.e(TAG, "Account " + mAccount + " was removed!", e);\r
- Toast.makeText(this, R.string.auth_account_does_not_exist, Toast.LENGTH_SHORT).show();\r
+ Toast.makeText(this, R.string.auth_account_does_not_exist,\r
+ Toast.LENGTH_SHORT).show();\r
finish();\r
}\r
}\r
response.putString(AccountManager.KEY_ACCOUNT_TYPE, mAccount.type);\r
\r
if (AccountTypeUtils.getAuthTokenTypeAccessToken(MainApp.getAccountType()).\r
- equals(mAuthTokenType)) { \r
+ equals(mAuthTokenType)) {\r
response.putString(AccountManager.KEY_AUTHTOKEN, mAuthToken);\r
// the next line is necessary, notifications are calling directly to the \r
// AuthenticatorActivity to update, without AccountManager intervention\r
* \r
* TODO Decide how to name the OAuth accounts\r
*/\r
- private boolean createAccount() {\r
+ private boolean createAccount(RemoteOperationResult authResult) {\r
/// create and save new ownCloud account\r
boolean isOAuth = AccountTypeUtils.\r
getAuthTokenTypeAccessToken(MainApp.getAccountType()).equals(mAuthTokenType);\r
boolean isSaml = AccountTypeUtils.\r
getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(mAuthTokenType);\r
\r
+ String lastPermanentLocation = authResult.getLastPermanentLocation();\r
+ if (lastPermanentLocation != null) {\r
+ mServerInfo.mBaseUrl = AccountUtils.trimWebdavSuffix(lastPermanentLocation);\r
+ }\r
+\r
Uri uri = Uri.parse(mServerInfo.mBaseUrl);\r
String username = mUsernameInput.getText().toString().trim();\r
if (isOAuth) {\r
);\r
}\r
\r
+ // include account version with the new account\r
+ mAccountMgr.setUserData(\r
+ mAccount,\r
+ Constants.KEY_OC_ACCOUNT_VERSION,\r
+ Integer.toString(AccountUtils.ACCOUNT_VERSION)\r
+ );\r
+\r
/// add the new account as default in preferences, if there is none already\r
Account defaultAccount = AccountUtils.getCurrentOwnCloudAccount(this);\r
if (defaultAccount == null) {\r
/// add user data to the new account; TODO probably can be done in the last parameter \r
// addAccountExplicitly, or in KEY_USERDATA\r
mAccountMgr.setUserData(\r
- mAccount, Constants.KEY_OC_VERSION, mServerInfo.mVersion.getVersion()\r
+ mAccount, Constants.KEY_OC_VERSION, mServerInfo.mVersion.getVersion()\r
);\r
mAccountMgr.setUserData(\r
mAccount, Constants.KEY_OC_BASE_URL, mServerInfo.mBaseUrl\r
}\r
\r
\r
- private void getRemoteUserNameOperation(String sessionCookie, boolean followRedirects) {\r
+ private void getRemoteUserNameOperation(String sessionCookie) {\r
\r
Intent getUserNameIntent = new Intent();\r
getUserNameIntent.setAction(OperationsService.ACTION_GET_USER_NAME);\r
if (sessionCookie != null && sessionCookie.length() > 0) {\r
Log_OC.d(TAG, "Successful SSO - time to save the account");\r
mAuthToken = sessionCookie;\r
- getRemoteUserNameOperation(sessionCookie, true);\r
+ getRemoteUserNameOperation(sessionCookie);\r
Fragment fd = getSupportFragmentManager().findFragmentByTag(SAML_DIALOG_TAG);\r
- if (fd != null && fd instanceof SherlockDialogFragment) {\r
- Dialog d = ((SherlockDialogFragment)fd).getDialog();\r
+ if (fd != null && fd instanceof DialogFragment) {\r
+ Dialog d = ((DialogFragment)fd).getDialog();\r
if (d != null && d.isShowing()) {\r
d.dismiss();\r
}\r
X509Certificate x509Certificate, SslError error, SslErrorHandler handler\r
) {\r
// Show a dialog with the certificate info\r
- SslUntrustedCertDialog dialog = null;\r
+ SslUntrustedCertDialog dialog;\r
if (x509Certificate == null) {\r
dialog = SslUntrustedCertDialog.newInstanceForEmptySslError(error, handler);\r
} else {\r
\r
private void dismissDialog(String dialogTag){\r
Fragment frag = getSupportFragmentManager().findFragmentByTag(dialogTag);\r
- if (frag != null && frag instanceof SherlockDialogFragment) {\r
- SherlockDialogFragment dialog = (SherlockDialogFragment) frag;\r
+ if (frag != null && frag instanceof DialogFragment) {\r
+ DialogFragment dialog = (DialogFragment) frag;\r
dialog.dismiss();\r
}\r
}\r
\r
doOnResumeAndBound();\r
\r
- } else {\r
- return;\r
}\r
\r
}\r
\r
/**\r
* Create and show dialog for request authentication to the user\r
- * @param webView\r
- * @param handler\r
+ * @param webView Web view to emebd into the authentication dialog.\r
+ * @param handler Object responsible for catching and recovering HTTP authentication fails.\r
*/\r
public void createAuthenticationDialog(WebView webView, HttpAuthHandler handler) {\r
\r
mIsFirstAuthAttempt = true;\r
}\r
\r
-\r
}\r
import android.net.Uri;
import android.os.AsyncTask;
-import com.owncloud.android.MainApp;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.OwnCloudClientFactory;
import com.owncloud.android.lib.common.OwnCloudCredentials;
+import com.owncloud.android.lib.common.network.RedirectionPath;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation;
// Client
Uri uri = Uri.parse(url);
OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(uri, mContext, true);
-
client.setCredentials(credentials);
// Operation
);
result = operation.execute(client);
+ if (operation.wasRedirected()) {
+ RedirectionPath redirectionPath = operation.getRedirectionPath();
+ String permanentLocation = redirectionPath.getLastPermanentLocation();
+ result.setLastPermanentLocation(permanentLocation);
+ }
+
} else {
result = new RemoteOperationResult(RemoteOperationResult.ResultCode.UNKNOWN_ERROR);
}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author David A. Velasco
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.authentication;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.PowerManager;
+import android.preference.PreferenceManager;
+import android.view.WindowManager;
+
+import com.owncloud.android.MainApp;
+import com.owncloud.android.ui.activity.PassCodeActivity;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class PassCodeManager {
+
+ private static final Set<Class> sExemptOfPasscodeActivites;
+
+ static {
+ sExemptOfPasscodeActivites = new HashSet<Class>();
+ sExemptOfPasscodeActivites.add(PassCodeActivity.class);
+ // other activities may be exempted, if needed
+ }
+
+ private static int PASS_CODE_TIMEOUT = 1000;
+ // keeping a "low" positive value is the easiest way to prevent the pass code is requested on rotations
+
+ public static PassCodeManager mPassCodeManagerInstance = null;
+
+ public static PassCodeManager getPassCodeManager() {
+ if (mPassCodeManagerInstance == null) {
+ mPassCodeManagerInstance = new PassCodeManager();
+ }
+ return mPassCodeManagerInstance;
+ }
+
+ private Long mTimestamp = 0l;
+ private int mVisibleActivitiesCounter = 0;
+
+ protected PassCodeManager() {};
+
+ public void onActivityCreated(Activity activity) {
+ if (passCodeIsEnabled()) {
+ activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
+ } else {
+ activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
+ }
+ }
+
+ public void onActivityStarted(Activity activity) {
+ if (!sExemptOfPasscodeActivites.contains(activity.getClass()) &&
+ passCodeShouldBeRequested()
+ ){
+
+ Intent i = new Intent(MainApp.getAppContext(), PassCodeActivity.class);
+ i.setAction(PassCodeActivity.ACTION_REQUEST);
+ i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ activity.startActivity(i);
+
+ }
+
+ mVisibleActivitiesCounter++; // keep it AFTER passCodeShouldBeRequested was checked
+ }
+
+ public void onActivityStopped(Activity activity) {
+ if (mVisibleActivitiesCounter > 0) {
+ mVisibleActivitiesCounter--;
+ }
+ setUnlockTimestamp();
+ PowerManager powerMgr = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
+ if (passCodeIsEnabled() && powerMgr != null && !powerMgr.isScreenOn()) {
+ activity.moveTaskToBack(true);
+ }
+ }
+
+ private void setUnlockTimestamp() {
+ mTimestamp = System.currentTimeMillis();
+ }
+
+ private boolean passCodeShouldBeRequested(){
+ if ((System.currentTimeMillis() - mTimestamp) > PASS_CODE_TIMEOUT &&
+ mVisibleActivitiesCounter <= 0
+ ){
+ return passCodeIsEnabled();
+ }
+ return false;
+ }
+
+ private boolean passCodeIsEnabled() {
+ SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.getAppContext());
+ return (appPrefs.getBoolean("set_pincode", false));
+ }
+
+}
import java.util.List;
import java.util.Vector;
-import com.owncloud.android.MainApp;
-import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
-import com.owncloud.android.lib.common.utils.Log_OC;
-import com.owncloud.android.lib.resources.shares.OCShare;
-import com.owncloud.android.lib.resources.shares.ShareType;
-import com.owncloud.android.lib.resources.files.FileUtils;
-import com.owncloud.android.utils.FileStorageUtils;
-
import android.accounts.Account;
import android.content.ContentProviderClient;
import android.content.ContentProviderOperation;
import android.os.RemoteException;
import android.provider.MediaStore;
+import com.owncloud.android.MainApp;
+import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
+import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.lib.resources.files.FileUtils;
+import com.owncloud.android.lib.resources.shares.OCShare;
+import com.owncloud.android.lib.resources.shares.ShareType;
+import com.owncloud.android.utils.FileStorageUtils;
+
public class FileDataStorageManager {
public static final int ROOT_PARENT_ID = 0;
}
- public Vector<OCFile> getFolderContent(OCFile f) {
+ public Vector<OCFile> getFolderContent(OCFile f/*, boolean onlyOnDevice*/) {
if (f != null && f.isFolder() && f.getFileId() != -1) {
- return getFolderContent(f.getFileId());
+ // TODO Enable when "On Device" is recovered ?
+ return getFolderContent(f.getFileId()/*, onlyOnDevice*/);
} else {
return new Vector<OCFile>();
}
- public Vector<OCFile> getFolderImages(OCFile folder) {
+ public Vector<OCFile> getFolderImages(OCFile folder/*, boolean onlyOnDevice*/) {
Vector<OCFile> ret = new Vector<OCFile>();
if (folder != null) {
- // TODO better implementation, filtering in the access to database instead of here
- Vector<OCFile> tmp = getFolderContent(folder);
+ // TODO better implementation, filtering in the access to database instead of here
+ // TODO Enable when "On Device" is recovered ?
+ Vector<OCFile> tmp = getFolderContent(folder/*, onlyOnDevice*/);
OCFile current = null;
for (int i=0; i<tmp.size(); i++) {
current = tmp.get(i);
return ret;
}
-
public boolean saveFile(OCFile file) {
boolean overriden = false;
ContentValues cv = new ContentValues();
File localFolder = new File(localFolderPath);
if (localFolder.exists()) {
// stage 1: remove the local files already registered in the files database
- Vector<OCFile> files = getFolderContent(folder.getFileId());
+ // TODO Enable when "On Device" is recovered ?
+ Vector<OCFile> files = getFolderContent(folder.getFileId()/*, false*/);
if (files != null) {
for (OCFile file : files) {
if (file.isFolder()) {
}
- private Vector<OCFile> getFolderContent(long parentId) {
+ private Vector<OCFile> getFolderContent(long parentId/*, boolean onlyOnDevice*/) {
Vector<OCFile> ret = new Vector<OCFile>();
if (c.moveToFirst()) {
do {
OCFile child = createFileInstance(c);
- ret.add(child);
+ // TODO Enable when "On Device" is recovered ?
+ // if (child.isFolder() || !onlyOnDevice || onlyOnDevice && child.isDown()){
+ ret.add(child);
+ // }
} while (c.moveToNext());
}
}
private ArrayList<ContentProviderOperation> prepareRemoveSharesInFolder(
- OCFile folder, ArrayList<ContentProviderOperation> preparedOperations
- ) {
+ OCFile folder, ArrayList<ContentProviderOperation> preparedOperations) {
if (folder != null) {
String where = ProviderTableMeta.OCSHARES_PATH + "=?" + " AND "
+ ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?";
String [] whereArgs = new String[]{ "", mAccount.name };
-
- Vector<OCFile> files = getFolderContent(folder);
+
+ // TODO Enable when "On Device" is recovered ?
+ Vector<OCFile> files = getFolderContent(folder /*, false*/);
for (OCFile file : files) {
whereArgs[0] = file.getRemotePath();
package com.owncloud.android.datamodel;
import java.io.File;
+import java.io.InputStream;
import java.lang.ref.WeakReference;
import org.apache.commons.httpclient.HttpStatus;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.lib.common.OwnCloudAccount;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
-import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import com.owncloud.android.ui.adapter.DiskLruImageCache;
private static final String TAG = ThumbnailsCacheManager.class.getSimpleName();
private static final String CACHE_FOLDER = "thumbnailCache";
- private static final String MINOR_SERVER_VERSION_FOR_THUMBS = "7.8.0";
-
+
private static final Object mThumbnailsDiskCacheLock = new Object();
private static DiskLruImageCache mThumbnailCache = null;
private static boolean mThumbnailCacheStarting = true;
private static final CompressFormat mCompressFormat = CompressFormat.JPEG;
private static final int mCompressQuality = 70;
private static OwnCloudClient mClient = null;
- private static String mServerVersion = null;
public static Bitmap mDefaultImg =
BitmapFactory.decodeResource(
while (mThumbnailCacheStarting) {
try {
mThumbnailsDiskCacheLock.wait();
- } catch (InterruptedException e) {}
+ } catch (InterruptedException e) {
+ Log_OC.e(TAG, "Wait in mThumbnailsDiskCacheLock was interrupted", e);
+ }
}
if (mThumbnailCache != null) {
- return (Bitmap) mThumbnailCache.getBitmap(key);
+ return mThumbnailCache.getBitmap(key);
}
}
return null;
try {
if (mAccount != null) {
- AccountManager accountMgr = AccountManager.get(MainApp.getAppContext());
-
- mServerVersion = accountMgr.getUserData(mAccount, Constants.KEY_OC_VERSION);
OwnCloudAccount ocAccount = new OwnCloudAccount(mAccount,
MainApp.getAppContext());
mClient = OwnCloudClientManagerFactory.getDefaultSingleton().
bitmap = null;
}
- if (mImageViewReference != null && bitmap != null) {
+ if (bitmap != null) {
final ImageView imageView = mImageViewReference.get();
final ThumbnailGenerationTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
- if (this == bitmapWorkerTask && imageView != null) {
+ if (this == bitmapWorkerTask) {
String tagId = "";
if (mFile instanceof OCFile){
tagId = String.valueOf(((OCFile)mFile).getFileId());
} else if (mFile instanceof File){
- tagId = String.valueOf(((File)mFile).hashCode());
+ tagId = String.valueOf(mFile.hashCode());
}
if (String.valueOf(imageView.getTag()).equals(tagId)) {
if (mProgressWheelRef != null) {
private int getThumbnailDimension(){
// Converts dp to pixel
Resources r = MainApp.getAppContext().getResources();
- return (int) Math.round(r.getDimension(R.dimen.file_icon_size_grid));
+ return Math.round(r.getDimension(R.dimen.file_icon_size_grid));
}
private Point getScreenDimension(){
} else {
// Download thumbnail from server
- if (mClient != null && mServerVersion != null) {
- OwnCloudVersion serverOCVersion = new OwnCloudVersion(mServerVersion);
- if (serverOCVersion.compareTo(
- new OwnCloudVersion(MINOR_SERVER_VERSION_FOR_THUMBS)) >= 0) {
+ OwnCloudVersion serverOCVersion = AccountUtils.getServerVersion(mAccount);
+ if (mClient != null && serverOCVersion != null) {
+ if (serverOCVersion.supportsRemoteThumbnails()) {
try {
- int status = -1;
-
String uri = mClient.getBaseUri() + "" +
"/index.php/apps/files/api/v1/thumbnail/" +
pxW + "/" + pxH + Uri.encode(file.getRemotePath(), "/");
Log_OC.d("Thumbnail", "URI: " + uri);
GetMethod get = new GetMethod(uri);
- status = mClient.executeMethod(get);
+ int status = mClient.executeMethod(get);
if (status == HttpStatus.SC_OK) {
+// byte[] bytes = get.getResponseBody();
+// Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0,
+// bytes.length);
+ InputStream inputStream = get.getResponseBodyAsStream();
+ Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
+ thumbnail = ThumbnailUtils.extractThumbnail(bitmap, pxW, pxH);
byte[] bytes = get.getResponseBody();
String type = "";
} else {
type = "Resized image";
}
- Log_OC.d("Thumbnail", type + " size of " + file.getRemotePath() + ": " + bytes.length);
+ Log_OC.d("Thumbnail",
+ type + " size of " + file.getRemotePath()
+ + ": " + bytes.length);
- Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0,
- bytes.length);
+ // bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
if (mIsThumbnail) {
thumbnail = ThumbnailUtils.extractThumbnail(bitmap, pxW, pxH);
public class ProviderMeta {\r
\r
public static final String DB_NAME = "filelist";\r
- public static final int DB_VERSION = 9;\r
+ public static final int DB_VERSION = 10;\r
\r
private ProviderMeta() {\r
}\r
}
}
- /**
- * Filters out the file actions available in the passed {@link Menu} taken into account
- * the state of the {@link OCFile} held by the filter.
- *
- * Second method needed thanks to ActionBarSherlock.
- *
- * TODO Get rid of it when ActionBarSherlock is replaced for newer Android Support Library.
- *
- * @param menu Options or context menu to filter.
- */
- public void filter(com.actionbarsherlock.view.Menu menu) {
-
- List<Integer> toShow = new ArrayList<Integer>();
- List<Integer> toHide = new ArrayList<Integer>();
-
- filter(toShow, toHide);
-
- com.actionbarsherlock.view.MenuItem item = null;
- for (int i : toShow) {
- item = menu.findItem(i);
- if (item != null) {
- item.setVisible(true);
- item.setEnabled(true);
- }
- }
- for (int i : toHide) {
- item = menu.findItem(i);
- if (item != null) {
- item.setVisible(false);
- item.setEnabled(false);
- }
- }
- }
/**
* Performs the real filtering, to be applied in the {@link Menu} by the caller methods.
// SHARE FILE
// TODO add check on SHARE available on server side?
- if (mFile == null) {
+ boolean shareAllowed = (mContext != null &&
+ mContext.getString(R.string.share_feature).equalsIgnoreCase("on"));
+ if (!shareAllowed || mFile == null) {
toHide.add(R.id.action_share_file);
} else {
toShow.add(R.id.action_share_file);
// UNSHARE FILE
// TODO add check on SHARE available on server side?
- if (mFile == null || !mFile.isShareByLink()) {
+ if ( !shareAllowed || (mFile == null || !mFile.isShareByLink())) {
toHide.add(R.id.action_unshare_file);
} else {
toShow.add(R.id.action_unshare_file);
}
-
-
+
// SEE DETAILS
if (mFile == null || mFile.isFolder()) {
toHide.add(R.id.action_see_details);
import org.apache.http.protocol.HTTP;
import android.accounts.Account;
-import android.accounts.AccountManager;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.datamodel.ThumbnailsCacheManager;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
-import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.status.OwnCloudVersion;
Intent intentForSavedMimeType = new Intent(Intent.ACTION_VIEW);
intentForSavedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
- intentForSavedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ intentForSavedMimeType.setFlags(
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+ );
Intent intentForGuessedMimeType = null;
if (storagePath.lastIndexOf('.') >= 0) {
- String guessedMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));
+ String guessedMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
+ storagePath.substring(storagePath.lastIndexOf('.') + 1)
+ );
if (guessedMimeType != null && !guessedMimeType.equals(file.getMimetype())) {
intentForGuessedMimeType = new Intent(Intent.ACTION_VIEW);
intentForGuessedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), guessedMimeType);
- intentForGuessedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ intentForGuessedMimeType.setFlags(
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+ );
}
}
- Intent chooserIntent = null;
+ Intent chooserIntent;
if (intentForGuessedMimeType != null) {
chooserIntent = Intent.createChooser(intentForGuessedMimeType, mFileActivity.getString(R.string.actionbar_open_with));
} else {
} else {
// Show a Message
- Toast t = Toast.makeText(mFileActivity, mFileActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG);
+ Toast t = Toast.makeText(
+ mFileActivity, mFileActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG
+ );
t.show();
}
}
*/
public boolean isSharedSupported() {
if (mFileActivity.getAccount() != null) {
- AccountManager accountManager = AccountManager.get(mFileActivity);
-
- String version = accountManager.getUserData(mFileActivity.getAccount(), Constants.KEY_OC_VERSION);
- return (new OwnCloudVersion(version)).isSharedSupported();
+ OwnCloudVersion serverVersion = AccountUtils.getServerVersion(mFileActivity.getAccount());
+ return (serverVersion != null && serverVersion.isSharedSupported());
}
return false;
}
mWaitingForOpId = waitingForOpId;
}
-
+ /**
+ * @return 'True' if the server doesn't need to check forbidden characters
+ */
+ public boolean isVersionWithForbiddenCharacters() {
+ if (mFileActivity.getAccount() != null) {
+ OwnCloudVersion serverVersion = AccountUtils.getServerVersion(mFileActivity.getAccount());
+ return (serverVersion != null && serverVersion.isVersionWithForbiddenCharacters());
+ }
+ return false;
+ }
}
Account account = AccountUtils.getCurrentOwnCloudAccount(context);
if (account == null) {
- Log_OC.w(TAG, "No owncloud account found for instant upload, aborting");
+ Log_OC.w(TAG, "No ownCloud account found for instant upload, aborting");
return;
}
import android.support.v4.app.NotificationCompat;
import android.webkit.MimeTypeMap;
-import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.authentication.AuthenticatorActivity;
import com.owncloud.android.lib.common.OwnCloudAccount;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
-import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
private Account mLastAccount = null;
private FileDataStorageManager mStorageManager;
- private ConcurrentMap<String, UploadFileOperation> mPendingUploads = new ConcurrentHashMap<String, UploadFileOperation>();
+ private ConcurrentMap<String, UploadFileOperation> mPendingUploads =
+ new ConcurrentHashMap<String, UploadFileOperation>();
private UploadFileOperation mCurrentUpload = null;
private NotificationManager mNotificationManager;
public static String getUploadFinishMessage() {
- return FileUploader.class.getName().toString() + UPLOAD_FINISH_MESSAGE;
+ return FileUploader.class.getName() + UPLOAD_FINISH_MESSAGE;
}
/**
if (uploadType == UPLOAD_SINGLE_FILE) {
if (intent.hasExtra(KEY_FILE)) {
- files = new OCFile[] { (OCFile) intent.getParcelableExtra(KEY_FILE) };
+ files = new OCFile[] { intent.getParcelableExtra(KEY_FILE) };
} else {
localPaths = new String[] { intent.getStringExtra(KEY_LOCAL_FILE) };
files = new OCFile[localPaths.length];
for (int i = 0; i < localPaths.length; i++) {
files[i] = obtainNewOCFileToUpload(remotePaths[i], localPaths[i],
- ((mimeTypes != null) ? mimeTypes[i] : (String) null), storageManager);
+ ((mimeTypes != null) ? mimeTypes[i] : null), storageManager);
if (files[i] == null) {
// TODO @andomaex add failure Notification
return Service.START_NOT_STICKY;
}
}
- AccountManager aMgr = AccountManager.get(this);
- String version = aMgr.getUserData(account, Constants.KEY_OC_VERSION);
- OwnCloudVersion ocv = new OwnCloudVersion(version);
+ OwnCloudVersion ocv = AccountUtils.getServerVersion(account);
boolean chunked = FileUploader.chunkedUploadIsSupported(ocv);
AbstractList<String> requestedUploads = new Vector<String>();
* Map of listeners that will be reported about progress of uploads from a
* {@link FileUploaderBinder} instance
*/
- private Map<String, OnDatatransferProgressListener> mBoundListeners = new HashMap<String, OnDatatransferProgressListener>();
+ private Map<String, OnDatatransferProgressListener> mBoundListeners =
+ new HashMap<String, OnDatatransferProgressListener>();
/**
* Cancels a pending or current upload of a remote file.
* @param file A file in the queue of pending uploads
*/
public void cancel(Account account, OCFile file) {
- UploadFileOperation upload = null;
+ UploadFileOperation upload;
synchronized (mPendingUploads) {
upload = mPendingUploads.remove(buildRemoteName(account, file));
}
notifyUploadStart(mCurrentUpload);
- RemoteOperationResult uploadResult = null, grantResult = null;
+ RemoteOperationResult uploadResult = null, grantResult;
try {
/// prepare client object to send requests to the ownCloud server
mPendingUploads.remove(uploadKey);
Log_OC.i(TAG, "Remove CurrentUploadItem from pending upload Item Map.");
}
- if (uploadResult.isException()) {
+ if (uploadResult != null && uploadResult.isException()) {
// enforce the creation of a new client object for next uploads;
// this grant that a new socket will be created in the future if
// the current exception is due to an abrupt lose of network connection
int tickerId = (uploadResult.isSuccess()) ? R.string.uploader_upload_succeeded_ticker :
R.string.uploader_upload_failed_ticker;
- String content = null;
+ String content;
// check credentials error
boolean needsToUpdateCredentials = (
/**
* Checks if content provider, using the content:// scheme, returns a file with mime-type
* 'application/pdf' but file has not extension
- * @param localPath
- * @param mimeType
+ * @param localPath Full path to a file in the local file system.
+ * @param mimeType MIME type of the file.
* @return true if is needed to add the pdf file extension to the file
*/
private boolean isPdfFileFromContentProviderWithoutExtension(String localPath,
/**
* Remove uploads of an account
- * @param accountName
+ * @param accountName Name of an OC account
*/
private void cancelUploadForAccount(String accountName){
// this can be slow if there are many uploads :(
import android.content.Context;
import android.content.Intent;
-import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
OCFile file = getStorageManager().getFileByPath(mPath);
if (file!=null) {
mSendIntent.putExtra(Intent.EXTRA_TEXT, share.getShareLink());
- mSendIntent.putExtra(Intent.EXTRA_SUBJECT, String.format(mContext.getString(R.string.subject_token),
+ mSendIntent.putExtra(Intent.EXTRA_SUBJECT,
+ String.format(mContext.getString(R.string.subject_token),
getClient().getCredentials().getUsername(), file.getFileName()));
file.setPublicLink(share.getShareLink());
file.setShareByLink(true);
import java.util.ArrayList;
-import com.owncloud.android.MainApp;
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.operations.RemoteOperation;
if (url.endsWith("/")) {
url = url.substring(0, url.length() - 1);
}
- if(url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_4_0)){
- url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_4_0.length());
- } else if(url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_2_0)){
- url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_2_0.length());
- } else if (url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_1_2)){
- url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_1_2.length());
+ if(url.toLowerCase().endsWith(AccountUtils.WEBDAV_PATH_4_0_AND_LATER)){
+ url = url.substring(0, url.length() - AccountUtils.WEBDAV_PATH_4_0_AND_LATER.length());
}
}
return url;
if (mRemoteFolderChanged) {
result = fetchAndSyncRemoteFolder(client);
} else {
- mChildren = mStorageManager.getFolderContent(mLocalFolder);
+ // TODO Enable when "On Device" is recovered ?
+ mChildren = mStorageManager.getFolderContent(mLocalFolder/*, false*/);
}
}
List<SynchronizeFileOperation> filesToSyncContents = new Vector<SynchronizeFileOperation>();
// get current data about local contents of the folder to synchronize
- List<OCFile> localFiles = mStorageManager.getFolderContent(mLocalFolder);
+ // TODO Enable when "On Device" is recovered ?
+ List<OCFile> localFiles = mStorageManager.getFolderContent(mLocalFolder/*, false*/);
Map<String, OCFile> localFilesMap = new HashMap<String, OCFile>(localFiles.size());
for (OCFile file : localFiles) {
localFilesMap.put(file.getRemotePath(), file);
package com.owncloud.android.operations;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
import android.accounts.Account;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
-import com.owncloud.android.MainApp;
+
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileDownloader;
import com.owncloud.android.services.OperationsService;
import com.owncloud.android.utils.FileStorageUtils;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
import java.util.concurrent.atomic.AtomicBoolean;
//import android.support.v4.content.LocalBroadcastManager;
}
// get current data about local contents of the folder to synchronize
- List<OCFile> localFiles = storageManager.getFolderContent(mLocalFolder);
+ // TODO Enable when "On Device" is recovered ?
+ List<OCFile> localFiles = storageManager.getFolderContent(mLocalFolder/*, false*/);
Map<String, OCFile> localFilesMap = new HashMap<String, OCFile>(localFiles.size());
for (OCFile file : localFiles) {
localFilesMap.put(file.getRemotePath(), file);
private void prepareOpsFromLocalKnowledge() throws OperationCancelledException {
- List<OCFile> children = getStorageManager().getFolderContent(mLocalFolder);
+ // TODO Enable when "On Device" is recovered ?
+ List<OCFile> children = getStorageManager().getFolderContent(mLocalFolder/*, false*/);
for (OCFile child : children) {
/// classify file to sync/download contents later
if (child.isFolder()) {
package com.owncloud.android.providers;
+import java.io.File;
+import java.security.Provider;
import java.util.ArrayList;
import java.util.HashMap;
+import com.owncloud.android.MainApp;
import com.owncloud.android.R;
+import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.db.ProviderMeta;
import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
+import com.owncloud.android.lib.common.accounts.AccountUtils;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.shares.ShareType;
+import com.owncloud.android.utils.FileStorageUtils;
+import android.accounts.Account;
+import android.accounts.AccountManager;
import android.content.ContentProvider;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
ProviderTableMeta.FILE_KEEP_IN_SYNC);
mFileProjectionMap.put(ProviderTableMeta.FILE_ACCOUNT_OWNER,
ProviderTableMeta.FILE_ACCOUNT_OWNER);
- mFileProjectionMap.put(ProviderTableMeta.FILE_ETAG,
+ mFileProjectionMap.put(ProviderTableMeta.FILE_ETAG,
ProviderTableMeta.FILE_ETAG);
mFileProjectionMap.put(ProviderTableMeta.FILE_SHARE_BY_LINK,
ProviderTableMeta.FILE_SHARE_BY_LINK);
private static final int SHARES = 4;
private static final String TAG = FileContentProvider.class.getSimpleName();
-
+
// Projection for ocshares table
private static HashMap<String, String> mOCSharesProjectionMap;
static {
mOCSharesProjectionMap.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER,
ProviderTableMeta.OCSHARES_ACCOUNT_OWNER);
}
-
+
private UriMatcher mUriMatcher;
-
+
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
//Log_OC.d(TAG, "Deleting " + uri + " at provider " + this);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
-
+
private int delete(SQLiteDatabase db, Uri uri, String where, String[] whereArgs) {
int count = 0;
switch (mUriMatcher.match(uri)) {
if (children != null && children.moveToFirst()) {
long childId;
boolean isDir;
- //String remotePath;
while (!children.isAfterLast()) {
childId = children.getLong(children.getColumnIndex(ProviderTableMeta._ID));
isDir = "DIR".equals(children.getString(
//remotePath = children.getString(children.getColumnIndex(ProviderTableMeta.FILE_PATH));
if (isDir) {
count += delete(
- db,
- ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_DIR, childId),
- null,
+ db,
+ ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_DIR, childId),
+ null,
null
);
} else {
count += delete(
- db,
+ db,
ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, childId),
- null,
+ null,
null
);
}
getContext().getContentResolver().notifyChange(newUri, null);
return newUri;
}
-
+
private Uri insert(SQLiteDatabase db, Uri uri, ContentValues values) {
switch (mUriMatcher.match(uri)){
case ROOT_DIRECTORY:
String remotePath = values.getAsString(ProviderTableMeta.FILE_PATH);
String accountName = values.getAsString(ProviderTableMeta.FILE_ACCOUNT_OWNER);
String[] projection = new String[] {
- ProviderTableMeta._ID, ProviderTableMeta.FILE_PATH,
- ProviderTableMeta.FILE_ACCOUNT_OWNER
+ ProviderTableMeta._ID, ProviderTableMeta.FILE_PATH,
+ ProviderTableMeta.FILE_ACCOUNT_OWNER
};
- String where = ProviderTableMeta.FILE_PATH + "=? AND " +
+ String where = ProviderTableMeta.FILE_PATH + "=? AND " +
ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?";
String[] whereArgs = new String[] {remotePath, accountName};
Cursor doubleCheck = query(db, uri, projection, where, whereArgs, null);
- // ugly patch; serious refactorization is needed to reduce work in
+ // ugly patch; serious refactorization is needed to reduce work in
// FileDataStorageManager and bring it to FileContentProvider
- if (doubleCheck == null || !doubleCheck.moveToFirst()) {
+ if (doubleCheck == null || !doubleCheck.moveToFirst()) {
long rowId = db.insert(ProviderTableMeta.FILE_TABLE_NAME, null, values);
if (rowId > 0) {
- Uri insertedFileUri =
+ Uri insertedFileUri =
ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, rowId);
return insertedFileUri;
} else {
} else {
// file is already inserted; race condition, let's avoid a duplicated entry
Uri insertedFileUri = ContentUris.withAppendedId(
- ProviderTableMeta.CONTENT_URI_FILE,
+ ProviderTableMeta.CONTENT_URI_FILE,
doubleCheck.getLong(doubleCheck.getColumnIndex(ProviderTableMeta._ID))
);
doubleCheck.close();
return insertedFileUri;
}
-
+
case SHARES:
String path = values.getAsString(ProviderTableMeta.OCSHARES_PATH);
String accountNameShare= values.getAsString(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER);
String[] projectionShare = new String[] {
- ProviderTableMeta._ID, ProviderTableMeta.OCSHARES_PATH,
- ProviderTableMeta.OCSHARES_ACCOUNT_OWNER
+ ProviderTableMeta._ID, ProviderTableMeta.OCSHARES_PATH,
+ ProviderTableMeta.OCSHARES_ACCOUNT_OWNER
};
- String whereShare = ProviderTableMeta.OCSHARES_PATH + "=? AND " +
+ String whereShare = ProviderTableMeta.OCSHARES_PATH + "=? AND " +
ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?";
String[] whereArgsShare = new String[] {path, accountNameShare};
Uri insertedShareUri = null;
- Cursor doubleCheckShare =
+ Cursor doubleCheckShare =
query(db, uri, projectionShare, whereShare, whereArgsShare, null);
- // ugly patch; serious refactorization is needed to reduce work in
+ // ugly patch; serious refactorization is needed to reduce work in
// FileDataStorageManager and bring it to FileContentProvider
- if (doubleCheckShare == null || !doubleCheckShare.moveToFirst()) {
+ if (doubleCheckShare == null || !doubleCheckShare.moveToFirst()) {
long rowId = db.insert(ProviderTableMeta.OCSHARES_TABLE_NAME, null, values);
if (rowId >0) {
- insertedShareUri =
+ insertedShareUri =
ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_SHARE, rowId);
} else {
throw new SQLException("ERROR " + uri);
} else {
// file is already inserted; race condition, let's avoid a duplicated entry
insertedShareUri = ContentUris.withAppendedId(
- ProviderTableMeta.CONTENT_URI_SHARE,
+ ProviderTableMeta.CONTENT_URI_SHARE,
doubleCheckShare.getLong(
doubleCheckShare.getColumnIndex(ProviderTableMeta._ID)
)
}
updateFilesTableAccordingToShareInsertion(db, uri, values);
return insertedShareUri;
-
+
default:
throw new IllegalArgumentException("Unknown uri id: " + uri);
}
-
+
}
-
+
private void updateFilesTableAccordingToShareInsertion(
SQLiteDatabase db, Uri uri, ContentValues shareValues
) {
ContentValues fileValues = new ContentValues();
fileValues.put(
- ProviderTableMeta.FILE_SHARE_BY_LINK,
- ShareType.PUBLIC_LINK.getValue() ==
- shareValues.getAsInteger(ProviderTableMeta.OCSHARES_SHARE_TYPE)? 1 : 0
+ ProviderTableMeta.FILE_SHARE_BY_LINK,
+ ShareType.PUBLIC_LINK.getValue() ==
+ shareValues.getAsInteger(ProviderTableMeta.OCSHARES_SHARE_TYPE) ? 1 : 0
);
- String whereShare = ProviderTableMeta.FILE_PATH + "=? AND " +
+ String whereShare = ProviderTableMeta.FILE_PATH + "=? AND " +
ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?";
String[] whereArgsShare = new String[] {
- shareValues.getAsString(ProviderTableMeta.OCSHARES_PATH),
+ shareValues.getAsString(ProviderTableMeta.OCSHARES_PATH),
shareValues.getAsString(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER)
};
db.update(ProviderTableMeta.FILE_TABLE_NAME, fileValues, whereShare, whereArgsShare);
}
-
+
@Override
public boolean onCreate() {
mDbHelper = new DataBaseHelper(getContext());
-
+
String authority = getContext().getResources().getString(R.string.authority);
mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
mUriMatcher.addURI(authority, null, ROOT_DIRECTORY);
mUriMatcher.addURI(authority, "dir/#", DIRECTORY);
mUriMatcher.addURI(authority, "shares/", SHARES);
mUriMatcher.addURI(authority, "shares/#", SHARES);
-
+
return true;
}
-
+
@Override
public Cursor query(
- Uri uri,
- String[] projection,
- String selection,
- String[] selectionArgs,
+ Uri uri,
+ String[] projection,
+ String selection,
+ String[] selectionArgs,
String sortOrder
) {
-
+
Cursor result = null;
SQLiteDatabase db = mDbHelper.getReadableDatabase();
db.beginTransaction();
}
return result;
}
-
+
private Cursor query(
- SQLiteDatabase db,
- Uri uri,
- String[] projection,
- String selection,
- String[] selectionArgs,
+ SQLiteDatabase db,
+ Uri uri,
+ String[] projection,
+ String selection,
+ String[] selectionArgs,
String sortOrder
) {
-
+
SQLiteQueryBuilder sqlQuery = new SQLiteQueryBuilder();
sqlQuery.setTables(ProviderTableMeta.FILE_TABLE_NAME);
+ uri.getPathSegments().get(1));
}
break;
- case SHARES:
+ case SHARES:
sqlQuery.setTables(ProviderTableMeta.OCSHARES_TABLE_NAME);
sqlQuery.setProjectionMap(mOCSharesProjectionMap);
if (uri.getPathSegments().size() > 1) {
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-
+
int count = 0;
SQLiteDatabase db = mDbHelper.getWritableDatabase();
db.beginTransaction();
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
-
-
+
+
private int update(
- SQLiteDatabase db,
- Uri uri,
- ContentValues values,
- String selection,
+ SQLiteDatabase db,
+ Uri uri,
+ ContentValues values,
+ String selection,
String[] selectionArgs
) {
switch (mUriMatcher.match(uri)) {
ProviderTableMeta.FILE_TABLE_NAME, values, selection, selectionArgs
);
}
- }
+ }
- /*
+ /*
private int updateFolderSize(SQLiteDatabase db, String folderId) {
int count = 0;
String [] whereArgs = new String[] { folderId };
-
- // read current size saved for the folder
+
+ // read current size saved for the folder
long folderSize = 0;
long folderParentId = -1;
Uri selectFolderUri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, folderId);
folderParentId = folderCursor.getLong(folderCursor.getColumnIndex(ProviderTableMeta.FILE_PARENT));;
}
folderCursor.close();
-
+
// read and sum sizes of children
long childrenSize = 0;
Uri selectChildrenUri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, folderId);
}
}
childrenCursor.close();
-
+
// update if needed
if (folderSize != childrenSize) {
Log_OC.d("FileContentProvider", "Updating " + folderSize + " to " + childrenSize);
ContentValues cv = new ContentValues();
cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, childrenSize);
count = db.update(ProviderTableMeta.FILE_TABLE_NAME, cv, folderWhere, whereArgs);
-
+
// propagate update until root
if (folderParentId > FileDataStorageManager.ROOT_PARENT_ID) {
Log_OC.d("FileContentProvider", "Propagating update to " + folderParentId);
return count;
}
*/
-
+
@Override
- public ContentProviderResult[] applyBatch (ArrayList<ContentProviderOperation> operations)
+ public ContentProviderResult[] applyBatch (ArrayList<ContentProviderOperation> operations)
throws OperationApplicationException {
- Log_OC.d("FileContentProvider", "applying batch in provider " + this +
+ Log_OC.d("FileContentProvider", "applying batch in provider " + this +
" (temporary: " + isTemporary() + ")" );
ContentProviderResult[] results = new ContentProviderResult[operations.size()];
int i=0;
-
+
SQLiteDatabase db = mDbHelper.getWritableDatabase();
db.beginTransaction(); // it's supposed that transactions can be nested
try {
+ ProviderTableMeta.FILE_KEEP_IN_SYNC + " INTEGER, "
+ ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA + " INTEGER, "
+ ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA + " INTEGER, "
- + ProviderTableMeta.FILE_ETAG + " TEXT, "
+ + ProviderTableMeta.FILE_ETAG + " TEXT, "
+ ProviderTableMeta.FILE_SHARE_BY_LINK + " INTEGER, "
+ ProviderTableMeta.FILE_PUBLIC_LINK + " TEXT, "
+ ProviderTableMeta.FILE_PERMISSIONS + " TEXT null,"
+ ProviderTableMeta.FILE_UPDATE_THUMBNAIL + " INTEGER," //boolean
+ ProviderTableMeta.FILE_IS_DOWNLOADING + " INTEGER);" //boolean
);
-
+
// Create table ocshares
db.execSQL("CREATE TABLE " + ProviderTableMeta.OCSHARES_TABLE_NAME + "("
+ ProviderTableMeta._ID + " INTEGER PRIMARY KEY, "
+ ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME + " TEXT, "
+ ProviderTableMeta.OCSHARES_IS_DIRECTORY + " INTEGER, " // boolean
+ ProviderTableMeta.OCSHARES_USER_ID + " INTEGER, "
- + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER,"
+ + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER,"
+ ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + " TEXT );" );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log_OC.i("SQL", "Entering in onUpgrade");
- boolean upgraded = false;
+ boolean upgraded = false;
if (oldVersion == 1 && newVersion >= 2) {
Log_OC.i("SQL", "Entering in the #1 ADD in onUpgrade");
db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
db.beginTransaction();
try {
db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
- " ADD COLUMN " + ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA +
+ " ADD COLUMN " + ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA +
" INTEGER " + " DEFAULT 0");
-
+
// assume there are not local changes pending to upload
- db.execSQL("UPDATE " + ProviderTableMeta.FILE_TABLE_NAME +
- " SET " + ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA + " = "
- + System.currentTimeMillis() +
+ db.execSQL("UPDATE " + ProviderTableMeta.FILE_TABLE_NAME +
+ " SET " + ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA + " = "
+ + System.currentTimeMillis() +
" WHERE " + ProviderTableMeta.FILE_STORAGE_PATH + " IS NOT NULL");
-
+
upgraded = true;
db.setTransactionSuccessful();
} finally {
Log_OC.i("SQL", "Entering in the #3 ADD in onUpgrade");
db.beginTransaction();
try {
- db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
- " ADD COLUMN " + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA +
- " INTEGER " + " DEFAULT 0");
-
- db.execSQL("UPDATE " + ProviderTableMeta.FILE_TABLE_NAME +
+ db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
+ " ADD COLUMN " + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA +
+ " INTEGER " + " DEFAULT 0");
+
+ db.execSQL("UPDATE " + ProviderTableMeta.FILE_TABLE_NAME +
" SET " + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA + " = " +
ProviderTableMeta.FILE_MODIFIED +
" WHERE " + ProviderTableMeta.FILE_STORAGE_PATH + " IS NOT NULL");
-
+
upgraded = true;
db.setTransactionSuccessful();
} finally {
}
}
if (!upgraded)
- Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion +
+ Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion +
", newVersion == " + newVersion);
-
+
if (oldVersion < 5 && newVersion >= 5) {
Log_OC.i("SQL", "Entering in the #4 ADD in onUpgrade");
db.beginTransaction();
try {
- db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
+ db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
" ADD COLUMN " + ProviderTableMeta.FILE_ETAG + " TEXT " +
" DEFAULT NULL");
-
+
upgraded = true;
db.setTransactionSuccessful();
} finally {
}
}
if (!upgraded)
- Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion +
+ Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion +
", newVersion == " + newVersion);
if (oldVersion < 6 && newVersion >= 6) {
db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
" ADD COLUMN " + ProviderTableMeta.FILE_SHARE_BY_LINK + " INTEGER " +
" DEFAULT 0");
-
+
db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
" ADD COLUMN " + ProviderTableMeta.FILE_PUBLIC_LINK + " TEXT " +
" DEFAULT NULL");
+ ProviderTableMeta.OCSHARES_SHARE_TYPE + " INTEGER, "
+ ProviderTableMeta.OCSHARES_SHARE_WITH + " TEXT, "
+ ProviderTableMeta.OCSHARES_PATH + " TEXT, "
- + ProviderTableMeta.OCSHARES_PERMISSIONS+ " INTEGER, "
+ + ProviderTableMeta.OCSHARES_PERMISSIONS + " INTEGER, "
+ ProviderTableMeta.OCSHARES_SHARED_DATE + " INTEGER, "
+ ProviderTableMeta.OCSHARES_EXPIRATION_DATE + " INTEGER, "
+ ProviderTableMeta.OCSHARES_TOKEN + " TEXT, "
+ ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME + " TEXT, "
+ ProviderTableMeta.OCSHARES_IS_DIRECTORY + " INTEGER, " // boolean
+ ProviderTableMeta.OCSHARES_USER_ID + " INTEGER, "
- + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER,"
- + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + " TEXT );" );
+ + ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + " INTEGER,"
+ + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + " TEXT );");
upgraded = true;
db.setTransactionSuccessful();
}
}
if (!upgraded)
- Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion +
+ Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion +
", newVersion == " + newVersion);
if (oldVersion < 7 && newVersion >= 7) {
Log_OC.i("SQL", "Entering in the #7 ADD in onUpgrade");
db.beginTransaction();
try {
- db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
+ db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
" ADD COLUMN " + ProviderTableMeta.FILE_PERMISSIONS + " TEXT " +
" DEFAULT NULL");
- db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
+ db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
" ADD COLUMN " + ProviderTableMeta.FILE_REMOTE_ID + " TEXT " +
" DEFAULT NULL");
-
+
upgraded = true;
db.setTransactionSuccessful();
} finally {
}
}
if (!upgraded)
- Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion +
+ Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion +
", newVersion == " + newVersion);
if (oldVersion < 8 && newVersion >= 8) {
Log_OC.i("SQL", "Entering in the #8 ADD in onUpgrade");
db.beginTransaction();
try {
- db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
+ db.execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME +
" ADD COLUMN " + ProviderTableMeta.FILE_UPDATE_THUMBNAIL + " INTEGER " +
" DEFAULT 0");
if (!upgraded)
Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion +
", newVersion == " + newVersion);
+
+ if (oldVersion < 10 && newVersion >= 10) {
+ Log_OC.i("SQL", "Entering in the #10 ADD in onUpgrade");
+ updateAccountName(db);
+ upgraded = true;
+ }
+ if (!upgraded)
+ Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion +
+ ", newVersion == " + newVersion);
+ }
+ }
+
+
+ /**
+ * Version 10 of database does not modify its scheme. It coincides with the upgrade of the ownCloud account names
+ * structure to include in it the path to the server instance. Updating the account names and path to local files
+ * in the files table is a must to keep the existing account working and the database clean.
+ *
+ * See {@link com.owncloud.android.authentication.AccountUtils#updateAccountVersion(android.content.Context)}
+ *
+ * @param db Database where table of files is included.
+ */
+ private void updateAccountName(SQLiteDatabase db){
+ Log_OC.d("SQL", "THREAD: "+ Thread.currentThread().getName());
+ AccountManager ama = AccountManager.get(getContext());
+ try {
+ // get accounts from AccountManager ; we can't be sure if accounts in it are updated or not although
+ // we know the update was previously done in {link @FileActivity#onCreate} because the changes through
+ // AccountManager are not synchronous
+ Account[] accounts = AccountManager.get(getContext()).getAccountsByType(
+ MainApp.getAccountType());
+ String serverUrl, username, oldAccountName, newAccountName;
+ for (Account account : accounts) {
+ // build both old and new account name
+ serverUrl = ama.getUserData(account, AccountUtils.Constants.KEY_OC_BASE_URL);
+ username = account.name.substring(0, account.name.lastIndexOf('@'));
+ oldAccountName = AccountUtils.buildAccountNameOld(Uri.parse(serverUrl), username);
+ newAccountName = AccountUtils.buildAccountName(Uri.parse(serverUrl), username);
+
+ // update values in database
+ db.beginTransaction();
+ try {
+ ContentValues cv = new ContentValues();
+ cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, newAccountName);
+ int num = db.update(ProviderTableMeta.FILE_TABLE_NAME,
+ cv,
+ ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?",
+ new String[]{oldAccountName});
+
+ Log_OC.d("SQL", "Updated account in database: old name == " + oldAccountName +
+ ", new name == " + newAccountName + " (" + num + " rows updated )");
+
+ // update path for downloaded files
+ updateDownloadedFiles(db, newAccountName, oldAccountName);
+
+ db.setTransactionSuccessful();
+
+ } catch (SQLException e) {
+ Log_OC.e(TAG, "SQL Exception upgrading account names or paths in database", e);
+ } finally {
+ db.endTransaction();
+ }
+ }
+ } catch (Exception e) {
+ Log_OC.e(TAG, "Exception upgrading account names or paths in database", e);
+ }
+ }
+
+
+ /**
+ * Rename the local ownCloud folder of one account to match the a rename of the account itself. Updates the
+ * table of files in database so that the paths to the local files keep being the same.
+ *
+ * @param db Database where table of files is included.
+ * @param newAccountName New name for the target OC account.
+ * @param oldAccountName Old name of the target OC account.
+ */
+ private void updateDownloadedFiles(SQLiteDatabase db, String newAccountName,
+ String oldAccountName) {
+
+ String whereClause = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " +
+ ProviderTableMeta.FILE_STORAGE_PATH + " IS NOT NULL";
+
+ Cursor c = db.query(ProviderTableMeta.FILE_TABLE_NAME,
+ null,
+ whereClause,
+ new String[] { newAccountName },
+ null, null, null);
+
+ try {
+ if (c.moveToFirst()) {
+ // create storage path
+ String oldAccountPath = FileStorageUtils.getSavePath(oldAccountName);
+ String newAccountPath = FileStorageUtils.getSavePath(newAccountName);
+
+ // move files
+ File oldAccountFolder = new File(oldAccountPath);
+ File newAccountFolder = new File(newAccountPath);
+ oldAccountFolder.renameTo(newAccountFolder);
+
+ // update database
+ do {
+ // Update database
+ String oldPath = c.getString(
+ c.getColumnIndex(ProviderTableMeta.FILE_STORAGE_PATH));
+ OCFile file = new OCFile(
+ c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PATH)));
+ String newPath = FileStorageUtils.getDefaultSavePathFor(newAccountName, file);
+
+ ContentValues cv = new ContentValues();
+ cv.put(ProviderTableMeta.FILE_STORAGE_PATH, newPath);
+ db.update(ProviderTableMeta.FILE_TABLE_NAME,
+ cv,
+ ProviderTableMeta.FILE_STORAGE_PATH + "=?",
+ new String[]{oldPath});
+
+ Log_OC.v("SQL", "Updated path of downloaded file: old file name == " + oldPath +
+ ", new file name == " + newPath);
+
+ } while (c.moveToNext());
+ }
+ } finally {
+ c.close();
}
+
}
}
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.shares.ShareType;
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import com.owncloud.android.lib.resources.users.GetRemoteUserNameOperation;
import com.owncloud.android.operations.common.SyncOperation;
import com.owncloud.android.operations.CreateFolderOperation;
import com.owncloud.android.operations.UnshareLinkOperation;
import android.accounts.Account;
+import android.accounts.AccountManager;
import android.accounts.AccountsException;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
return true;
//Log_OC.wtf(TAG, "Sending callback later");
} else {
- if (!mServiceHandler.mPendingOperations.isEmpty()) {
- return true;
- } else {
- return false;
- }
- //Log_OC.wtf(TAG, "Not finished yet");
+ return (!mServiceHandler.mPendingOperations.isEmpty());
}
}
mService);
mOwnCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton().
getClientFor(ocAccount, mService);
+
+ OwnCloudVersion version = com.owncloud.android.authentication.AccountUtils.getServerVersion(
+ mLastTarget.mAccount
+ );
+ mOwnCloudClient.setOwnCloudVersion(version);
+
mStorageManager = new FileDataStorageManager(
mLastTarget.mAccount,
mService.getContentResolver()
+++ /dev/null
-/**
- * ownCloud Android client application
- *
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2015 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.syncadapter;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.entity.ByteArrayEntity;
-
-import com.owncloud.android.authentication.AccountUtils;
-import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
-
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.AuthenticatorException;
-import android.accounts.OperationCanceledException;
-import android.content.ContentProviderClient;
-import android.content.Context;
-import android.content.SyncResult;
-import android.content.res.AssetFileDescriptor;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.ContactsContract;
-
-public class ContactSyncAdapter extends AbstractOwnCloudSyncAdapter {
- private String mAddrBookUri;
-
- public ContactSyncAdapter(Context context, boolean autoInitialize) {
- super(context, autoInitialize);
- mAddrBookUri = null;
- }
-
- @Override
- public void onPerformSync(Account account, Bundle extras, String authority,
- ContentProviderClient provider, SyncResult syncResult) {
- setAccount(account);
- setContentProviderClient(provider);
- Cursor c = getLocalContacts(false);
- if (c.moveToFirst()) {
- do {
- String lookup = c.getString(c
- .getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
- String a = getAddressBookUri();
- String uri = a + lookup + ".vcf";
- FileInputStream f;
- try {
- f = getContactVcard(lookup);
- HttpPut query = new HttpPut(uri);
- byte[] b = new byte[f.available()];
- f.read(b);
- query.setEntity(new ByteArrayEntity(b));
- fireRawRequest(query);
- } catch (IOException e) {
- e.printStackTrace();
- return;
- } catch (OperationCanceledException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (AuthenticatorException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } while (c.moveToNext());
- // } while (c.moveToNext());
- }
-
- }
-
- private String getAddressBookUri() {
- if (mAddrBookUri != null)
- return mAddrBookUri;
-
- AccountManager am = getAccountManager();
- @SuppressWarnings("deprecation")
- String uri = am.getUserData(getAccount(),
- Constants.KEY_OC_URL).replace(
- AccountUtils.WEBDAV_PATH_2_0, AccountUtils.CARDDAV_PATH_2_0);
- uri += "/addressbooks/"
- + getAccount().name.substring(0,
- getAccount().name.lastIndexOf('@')) + "/default/";
- mAddrBookUri = uri;
- return uri;
- }
-
- private FileInputStream getContactVcard(String lookupKey)
- throws IOException {
- Uri uri = Uri.withAppendedPath(
- ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
- AssetFileDescriptor fd = getContext().getContentResolver()
- .openAssetFileDescriptor(uri, "r");
- return fd.createInputStream();
- }
-
- private Cursor getLocalContacts(boolean include_hidden_contacts) {
- return getContext().getContentResolver().query(
- ContactsContract.Contacts.CONTENT_URI,
- new String[] { ContactsContract.Contacts._ID,
- ContactsContract.Contacts.LOOKUP_KEY },
- ContactsContract.Contacts.IN_VISIBLE_GROUP + " = ?",
- new String[] { (include_hidden_contacts ? "0" : "1") },
- ContactsContract.Contacts._ID + " DESC");
- }
-
-}
+++ /dev/null
-/**
- * ownCloud Android client application
- *
- * Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2015 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.syncadapter;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.IBinder;
-
-public class ContactSyncService extends Service {
- private static final Object syncAdapterLock = new Object();
- private static AbstractOwnCloudSyncAdapter mSyncAdapter = null;
-
- @Override
- public void onCreate() {
- synchronized (syncAdapterLock) {
- if (mSyncAdapter == null) {
- mSyncAdapter = new ContactSyncAdapter(getApplicationContext(),
- true);
- }
- }
- }
-
- @Override
- public IBinder onBind(Intent arg0) {
- return mSyncAdapter.getSyncAdapterBinder();
- }
-
-}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author masensio
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui;
+
+public class NavigationDrawerItem {
+
+ private String mTitle;
+ private String mContentDescription;
+
+ // Constructors
+ public NavigationDrawerItem(){}
+
+ public NavigationDrawerItem(String title){
+ mTitle = title;
+ }
+
+ public NavigationDrawerItem(String title, String contentDescription){
+ mTitle = title;
+ mContentDescription = contentDescription;
+ }
+
+ // Getters and Setters
+ public String getTitle() {
+ return mTitle;
+ }
+
+ public void setTitle(String title) {
+ this.mTitle = title;
+ }
+
+ public String getContentDescription() {
+ return mContentDescription;
+ }
+
+ public void setContentDescription(String contentDescription) {
+ this.mContentDescription = contentDescription;
+ }
+}
--- /dev/null
+package com.owncloud.android.ui;
+
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+
+/**
+ * Created by tobi on 24.05.15.
+ */
+public class TextDrawable extends Drawable {
+
+ private final String text;
+ private final Paint paint;
+ private final Paint bg;
+
+ public TextDrawable(String text, int r, int g, int b) {
+
+ this.text = text;
+ Integer color = Color.rgb(r, g, b);
+
+ bg = new Paint();
+ bg.setStyle(Paint.Style.FILL);
+ bg.setColor(color);
+
+ paint = new Paint();
+ paint.setColor(Color.WHITE);
+ paint.setTextSize(20);
+ paint.setAntiAlias(true);
+ paint.setFakeBoldText(true);
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ canvas.drawRect(0,-20,20,40,bg);
+ canvas.drawText(text, 4, 6, paint);
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ paint.setAlpha(alpha);
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ paint.setColorFilter(cf);
+ }
+
+ @Override
+ public int getOpacity() {
+ return PixelFormat.TRANSLUCENT;
+ }
+}
package com.owncloud.android.ui.activity;
-import com.actionbarsherlock.app.ActionBar;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.dialog.ConflictsResolveDialog.OnConflictDecisionMadeListener;
import com.owncloud.android.utils.DisplayUtils;
+import android.app.ActionBar;
import android.content.Intent;
import android.os.Bundle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- ActionBar actionBar = getSupportActionBar();
+ ActionBar actionBar = getActionBar();
actionBar.setIcon(DisplayUtils.getSeasonalIconId());
}
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.DialogFragment;
+import android.support.v7.app.ActionBarActivity;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
/**
- * Activity reporting errors occurred when local files uploaded to an ownCloud account with an app in
- * version under 1.3.16 where being copied to the ownCloud local folder.
+ * Activity reporting errors occurred when local files uploaded to an ownCloud account with an app
+ * in version under 1.3.16 where being copied to the ownCloud local folder.
*
* Allows the user move the files to the ownCloud local folder. let them unlinked to the remote
* files.
*
* Shown when the error notification summarizing the list of errors is clicked by the user.
*/
-public class ErrorsWhileCopyingHandlerActivity extends SherlockFragmentActivity implements OnClickListener {
+public class ErrorsWhileCopyingHandlerActivity extends ActionBarActivity
+ implements OnClickListener {
private static final String TAG = ErrorsWhileCopyingHandlerActivity.class.getSimpleName();
- public static final String EXTRA_ACCOUNT = ErrorsWhileCopyingHandlerActivity.class.getCanonicalName() + ".EXTRA_ACCOUNT";
- public static final String EXTRA_LOCAL_PATHS = ErrorsWhileCopyingHandlerActivity.class.getCanonicalName() + ".EXTRA_LOCAL_PATHS";
- public static final String EXTRA_REMOTE_PATHS = ErrorsWhileCopyingHandlerActivity.class.getCanonicalName() + ".EXTRA_REMOTE_PATHS";
+ public static final String EXTRA_ACCOUNT =
+ ErrorsWhileCopyingHandlerActivity.class.getCanonicalName() + ".EXTRA_ACCOUNT";
+ public static final String EXTRA_LOCAL_PATHS =
+ ErrorsWhileCopyingHandlerActivity.class.getCanonicalName() + ".EXTRA_LOCAL_PATHS";
+ public static final String EXTRA_REMOTE_PATHS =
+ ErrorsWhileCopyingHandlerActivity.class.getCanonicalName() + ".EXTRA_REMOTE_PATHS";
private static final String WAIT_DIALOG_TAG = "WAIT_DIALOG";
/// customize text message
TextView textView = (TextView) findViewById(R.id.message);
String appName = getString(R.string.app_name);
- String message = String.format(getString(R.string.sync_foreign_files_forgotten_explanation), appName, appName, appName, appName, mAccount.name);
+ String message = String.format(getString(R.string.sync_foreign_files_forgotten_explanation),
+ appName, appName, appName, appName, mAccount.name);
textView.setText(message);
textView.setMovementMethod(new ScrollingMovementMethod());
/**
- * Customized adapter, showing the local files as main text in two-lines list item and the remote files
- * as the secondary text.
+ * Customized adapter, showing the local files as main text in two-lines list item and the
+ * remote files as the secondary text.
*/
public class ErrorsWhileCopyingListAdapter extends ArrayAdapter<String> {
ErrorsWhileCopyingListAdapter() {
- super(ErrorsWhileCopyingHandlerActivity.this, android.R.layout.two_line_list_item, android.R.id.text1, mLocalPaths);
+ super(ErrorsWhileCopyingHandlerActivity.this, android.R.layout.two_line_list_item,
+ android.R.id.text1, mLocalPaths);
}
@Override
public View getView (int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
- LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ LayoutInflater vi = (LayoutInflater) getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(android.R.layout.two_line_list_item, null);
}
if (view != null) {
text1.setText(String.format(getString(R.string.foreign_files_local_text), localPath));
}
}
- if (mRemotePaths != null && mRemotePaths.size() > 0 && position >= 0 && position < mRemotePaths.size()) {
+ if (mRemotePaths != null && mRemotePaths.size() > 0 && position >= 0 &&
+ position < mRemotePaths.size()) {
TextView text2 = (TextView) view.findViewById(android.R.id.text2);
String remotePath = mRemotePaths.get(position);
if (text2 != null && remotePath != null) {
if (result) {
// nothing else to do in this activity
- Toast t = Toast.makeText(ErrorsWhileCopyingHandlerActivity.this, getString(R.string.foreign_files_success), Toast.LENGTH_LONG);
+ Toast t = Toast.makeText(ErrorsWhileCopyingHandlerActivity.this,
+ getString(R.string.foreign_files_success), Toast.LENGTH_LONG);
t.show();
finish();
} else {
- Toast t = Toast.makeText(ErrorsWhileCopyingHandlerActivity.this, getString(R.string.foreign_files_fail), Toast.LENGTH_LONG);
+ Toast t = Toast.makeText(ErrorsWhileCopyingHandlerActivity.this,
+ getString(R.string.foreign_files_fail), Toast.LENGTH_LONG);
t.show();
}
}
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.ActionBarActivity;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
import android.widget.Toast;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
+import com.owncloud.android.BuildConfig;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.FileOperationsHelper;
import com.owncloud.android.files.services.FileDownloader;
-import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
+import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.operations.UnshareLinkOperation;
import com.owncloud.android.services.OperationsService;
import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
-import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
+import com.owncloud.android.ui.NavigationDrawerItem;
+import com.owncloud.android.ui.adapter.NavigationDrawerListAdapter;
import com.owncloud.android.ui.dialog.LoadingDialog;
import com.owncloud.android.ui.dialog.SharePasswordDialogFragment;
import com.owncloud.android.utils.ErrorMessageAdapter;
+import java.util.ArrayList;
+
/**
- * Activity with common behaviour for activities handling {@link OCFile}s in ownCloud {@link Account}s .
+ * Activity with common behaviour for activities handling {@link OCFile}s in ownCloud
+ * {@link Account}s .
*/
-public class FileActivity extends SherlockFragmentActivity
+public class FileActivity extends ActionBarActivity
implements OnRemoteOperationListener, ComponentsGetter {
public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE";
public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT";
- public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW";
- public static final String EXTRA_FROM_NOTIFICATION = "com.owncloud.android.ui.activity.FROM_NOTIFICATION";
+ public static final String EXTRA_WAITING_TO_PREVIEW =
+ "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW";
+ public static final String EXTRA_FROM_NOTIFICATION =
+ "com.owncloud.android.ui.activity.FROM_NOTIFICATION";
public static final String TAG = FileActivity.class.getSimpleName();
private static final String KEY_WAITING_FOR_OP_ID = "WAITING_FOR_OP_ID";
private static final String DIALOG_SHARE_PASSWORD = "DIALOG_SHARE_PASSWORD";
private static final String KEY_TRY_SHARE_AGAIN = "TRY_SHARE_AGAIN";
+ private static final String KEY_ACTION_BAR_TITLE = "ACTION_BAR_TITLE";
protected static final long DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS = 200;
- /** OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located. */
+ /** OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located.*/
private Account mAccount;
/** Main {@link OCFile} handled by the activity.*/
private OCFile mFile;
- /** Flag to signal that the activity will is finishing to enforce the creation of an ownCloud {@link Account} */
+ /** Flag to signal that the activity will is finishing to enforce the creation of an ownCloud
+ * {@link Account} */
private boolean mRedirectingToSetupAccount = false;
/** Flag to signal when the value of mAccount was set */
private ServiceConnection mDownloadServiceConnection, mUploadServiceConnection = null;
private boolean mTryShareAgain = false;
-
+
+ // Navigation Drawer
+ protected DrawerLayout mDrawerLayout;
+ protected ActionBarDrawerToggle mDrawerToggle;
+ protected ListView mDrawerList;
+
+ // Slide menu items
+ protected String[] mDrawerTitles;
+ protected String[] mDrawerContentDescriptions;
+
+ protected ArrayList<NavigationDrawerItem> mDrawerItems;
+
+ protected NavigationDrawerListAdapter mNavigationDrawerAdapter = null;
+
+
+ // TODO re-enable when "Accounts" is available in Navigation Drawer
+// protected boolean mShowAccounts = false;
/**
* Loads the ownCloud {@link Account} and main {@link OCFile} to be handled by the instance of
super.onCreate(savedInstanceState);
mHandler = new Handler();
mFileOperationsHelper = new FileOperationsHelper(this);
- Account account;
+ Account account = null;
if(savedInstanceState != null) {
- account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
mFile = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE);
mFromNotification = savedInstanceState.getBoolean(FileActivity.EXTRA_FROM_NOTIFICATION);
mFileOperationsHelper.setOpIdWaitingFor(
savedInstanceState.getLong(KEY_WAITING_FOR_OP_ID, Long.MAX_VALUE)
);
mTryShareAgain = savedInstanceState.getBoolean(KEY_TRY_SHARE_AGAIN);
+ getSupportActionBar().setTitle(savedInstanceState.getString(KEY_ACTION_BAR_TITLE));
} else {
account = getIntent().getParcelableExtra(FileActivity.EXTRA_ACCOUNT);
mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE);
- mFromNotification = getIntent().getBooleanExtra(FileActivity.EXTRA_FROM_NOTIFICATION, false);
+ mFromNotification = getIntent().getBooleanExtra(FileActivity.EXTRA_FROM_NOTIFICATION,
+ false);
}
+ AccountUtils.updateAccountVersion(this); // best place, before any access to AccountManager
+ // or database
+
setAccount(account, savedInstanceState != null);
mOperationsServiceConnection = new OperationsServiceConnection();
- bindService(new Intent(this, OperationsService.class), mOperationsServiceConnection, Context.BIND_AUTO_CREATE);
+ bindService(new Intent(this, OperationsService.class), mOperationsServiceConnection,
+ Context.BIND_AUTO_CREATE);
mDownloadServiceConnection = newTransferenceServiceConnection();
if (mDownloadServiceConnection != null) {
- bindService(new Intent(this, FileDownloader.class), mDownloadServiceConnection, Context.BIND_AUTO_CREATE);
+ bindService(new Intent(this, FileDownloader.class), mDownloadServiceConnection,
+ Context.BIND_AUTO_CREATE);
}
mUploadServiceConnection = newTransferenceServiceConnection();
if (mUploadServiceConnection != null) {
- bindService(new Intent(this, FileUploader.class), mUploadServiceConnection, Context.BIND_AUTO_CREATE);
+ bindService(new Intent(this, FileUploader.class), mUploadServiceConnection,
+ Context.BIND_AUTO_CREATE);
}
}
-
+ @Override
+ protected void onNewIntent (Intent intent) {
+ Log_OC.v(TAG, "onNewIntent() start");
+ Account current = AccountUtils.getCurrentOwnCloudAccount(this);
+ if (current != null && mAccount != null && !mAccount.name.equals(current.name)) {
+ mAccount = current;
+ }
+ Log_OC.v(TAG, "onNewIntent() stop");
+ }
+
/**
* Since ownCloud {@link Account}s can be managed from the system setting menu,
* the existence of the {@link Account} associated to the instance must be checked
*/
@Override
protected void onRestart() {
+ Log_OC.v(TAG, "onRestart() start");
super.onRestart();
- boolean validAccount = (mAccount != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), mAccount.name));
+ boolean validAccount = (mAccount != null && AccountUtils.exists(mAccount, this));
if (!validAccount) {
swapToDefaultAccount();
}
+ Log_OC.v(TAG, "onRestart() end");
}
if (mOperationsServiceBinder != null) {
doOnResumeAndBound();
}
-
}
@Override
protected void onPause() {
-
if (mOperationsServiceBinder != null) {
mOperationsServiceBinder.removeOperationListener(this);
}
super.onDestroy();
}
-
-
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+ // Sync the toggle state after onRestoreInstanceState has occurred.
+ if (mDrawerToggle != null) {
+ mDrawerToggle.syncState();
+ if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
+ getSupportActionBar().setTitle(R.string.app_name);
+ mDrawerToggle.setDrawerIndicatorEnabled(true);
+ }
+ }
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ if (mDrawerToggle != null) {
+ mDrawerToggle.onConfigurationChanged(newConfig);
+ }
+ }
+
+ protected void initDrawer(){
+ // constant settings for action bar when navigation drawer is inited
+ getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+
+
+ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ // Notification Drawer
+ LinearLayout navigationDrawerLayout = (LinearLayout) findViewById(R.id.left_drawer);
+ mDrawerList = (ListView) navigationDrawerLayout.findViewById(R.id.drawer_list);
+
+ // TODO re-enable when "Accounts" is available in Navigation Drawer
+// // load Account in the Drawer Title
+// // User-Icon
+// ImageView userIcon = (ImageView) navigationDrawerLayout.findViewById(R.id.drawer_userIcon);
+// userIcon.setImageResource(DisplayUtils.getSeasonalIconId());
+//
+// // Username
+// TextView username = (TextView) navigationDrawerLayout.findViewById(R.id.drawer_username);
+// Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
+//
+// if (account != null) {
+// int lastAtPos = account.name.lastIndexOf("@");
+// username.setText(account.name.substring(0, lastAtPos));
+// }
+
+ // load slide menu items
+ mDrawerTitles = getResources().getStringArray(R.array.drawer_items);
+
+ // nav drawer content description from resources
+ mDrawerContentDescriptions = getResources().
+ getStringArray(R.array.drawer_content_descriptions);
+
+ // nav drawer items
+ mDrawerItems = new ArrayList<NavigationDrawerItem>();
+ // adding nav drawer items to array
+ // TODO re-enable when "Accounts" is available in Navigation Drawer
+ // Accounts
+ // mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[0],
+ // mDrawerContentDescriptions[0]));
+ // All Files
+ mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[0], mDrawerContentDescriptions[0]));
+
+ // TODO Enable when "On Device" is recovered
+ // On Device
+ //mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2],
+ // mDrawerContentDescriptions[2]));
+
+ // Settings
+ mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[1], mDrawerContentDescriptions[1]));
+ // Logs
+ if (BuildConfig.DEBUG) {
+ mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2],
+ mDrawerContentDescriptions[2]));
+ }
+
+ // setting the nav drawer list adapter
+ mNavigationDrawerAdapter = new NavigationDrawerListAdapter(getApplicationContext(), this,
+ mDrawerItems);
+ mDrawerList.setAdapter(mNavigationDrawerAdapter);
+
+ mDrawerToggle = new ActionBarDrawerToggle(
+ this,
+ mDrawerLayout,
+ R.drawable.ic_drawer,
+ R.string.app_name,
+ R.string.drawer_close) {
+
+ /** Called when a drawer has settled in a completely closed state. */
+ public void onDrawerClosed(View view) {
+ super.onDrawerClosed(view);
+ updateActionBarTitleAndHomeButton(null);
+ invalidateOptionsMenu();
+ }
+
+ /** Called when a drawer has settled in a completely open state. */
+ public void onDrawerOpened(View drawerView) {
+ super.onDrawerOpened(drawerView);
+ getSupportActionBar().setTitle(R.string.app_name);
+ mDrawerToggle.setDrawerIndicatorEnabled(true);
+ invalidateOptionsMenu();
+ }
+ };
+
+ //mDrawerToggle.setDrawerIndicatorEnabled(true);
+ // Set the list's click listener
+ mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
+
+ // Set the drawer toggle as the DrawerListener
+ mDrawerLayout.setDrawerListener(mDrawerToggle);
+ }
+
+ /**
+ * Updates title bar and home buttons (state and icon).
+ *
+ * Assumes that navigation drawer is NOT visible.
+ */
+ protected void updateActionBarTitleAndHomeButton(OCFile chosenFile) {
+ String title = getString(R.string.default_display_name_for_root_folder); // default
+ boolean inRoot;
+
+ /// choose the appropiate title
+ if (chosenFile == null) {
+ // mFile determines the title
+ inRoot = (mFile == null || mFile.getParentId() == 0);
+ if (!inRoot) {
+ title = mFile.getFileName();
+ }
+
+ } else if (chosenFile.getParentId() != 0){
+ // chosenFile determines the title, instead of mFile
+ title = chosenFile.getFileName();
+ inRoot = false;
+
+ } else{
+ inRoot = true;
+ }
+
+ /// set the chosen title
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setTitle(title);
+ /// also as content description
+ View actionBarTitleView = getWindow().getDecorView().findViewById(
+ getResources().getIdentifier("action_bar_title", "id", "android")
+ );
+ if (actionBarTitleView != null) { // it's null in Android 2.x
+ actionBarTitleView.setContentDescription(title);
+ }
+
+ /// set home button properties
+ mDrawerToggle.setDrawerIndicatorEnabled(inRoot);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayShowTitleEnabled(true);
+
+ }
+
+
/**
* Sets and validates the ownCloud {@link Account} associated to the Activity.
*
*/
protected void setAccount(Account account, boolean savedAccount) {
Account oldAccount = mAccount;
- boolean validAccount = (account != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), account.name));
+ boolean validAccount =
+ (account != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(),
+ account.name));
if (validAccount) {
mAccount = account;
mAccountWasSet = true;
*/
private void createFirstAccount() {
AccountManager am = AccountManager.get(getApplicationContext());
- am.addAccount(MainApp.getAccountType(),
- null,
- null,
- null,
- this,
- new AccountCreationCallback(),
- null);
+ am.addAccount(MainApp.getAccountType(),
+ null,
+ null,
+ null,
+ this,
+ new AccountCreationCallback(),
+ null);
}
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(FileActivity.EXTRA_FILE, mFile);
- outState.putParcelable(FileActivity.EXTRA_ACCOUNT, mAccount);
outState.putBoolean(FileActivity.EXTRA_FROM_NOTIFICATION, mFromNotification);
outState.putLong(KEY_WAITING_FOR_OP_ID, mFileOperationsHelper.getOpIdWaitingFor());
outState.putBoolean(KEY_TRY_SHARE_AGAIN, mTryShareAgain);
+ outState.putString(KEY_ACTION_BAR_TITLE, getSupportActionBar().getTitle().toString());
}
/**
- * Getter for the ownCloud {@link Account} where the main {@link OCFile} handled by the activity is located.
+ * Getter for the ownCloud {@link Account} where the main {@link OCFile} handled by the activity
+ * is located.
*
- * @return OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located.
+ * @return OwnCloud {@link Account} where the main {@link OCFile} handled by the activity
+ * is located.
*/
public Account getAccount() {
return mAccount;
*/
@Override
public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
- Log_OC.d(TAG, "Received result of operation in FileActivity - common behaviour for all the FileActivities ");
+ Log_OC.d(TAG, "Received result of operation in FileActivity - common behaviour for all the "
+ + "FileActivities ");
mFileOperationsHelper.setOpIdWaitingFor(Long.MAX_VALUE);
}
- private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) {
+ private void onUnshareLinkOperationFinish(UnshareLinkOperation operation,
+ RemoteOperationResult result) {
dismissLoadingDialog();
if (result.isSuccess()){
updateFileFromDB();
} else {
- Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
- Toast.LENGTH_LONG);
+ Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result,
+ operation, getResources()), Toast.LENGTH_LONG);
t.show();
}
}
- private void onSynchronizeFolderOperationFinish(SynchronizeFolderOperation operation, RemoteOperationResult result) {
+ private void onSynchronizeFolderOperationFinish(
+ SynchronizeFolderOperation operation, RemoteOperationResult result
+ ) {
if (!result.isSuccess() && result.getCode() != ResultCode.CANCELLED){
- Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
- Toast.LENGTH_LONG);
+ Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result,
+ operation, getResources()), Toast.LENGTH_LONG);
t.show();
}
}
mOperationsServiceBinder.addOperationListener(FileActivity.this, mHandler);
long waitingForOpId = mFileOperationsHelper.getOpIdWaitingFor();
if (waitingForOpId <= Integer.MAX_VALUE) {
- boolean wait = mOperationsServiceBinder.dispatchResultIfFinished((int)waitingForOpId, this);
+ boolean wait = mOperationsServiceBinder.dispatchResultIfFinished((int)waitingForOpId,
+ this);
if (!wait ) {
dismissLoadingDialog();
}
public FileUploaderBinder getFileUploaderBinder() {
return mUploaderBinder;
}
-
-
+
+
+ public void restart(){
+ Intent i = new Intent(this, FileDisplayActivity.class);
+ i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(i);
+ }
+
+// TODO re-enable when "Accounts" is available in Navigation Drawer
+// public void closeDrawer() {
+// mDrawerLayout.closeDrawers();
+// }
+
+ public void allFilesOption(){
+ restart();
+ }
+
+ private class DrawerItemClickListener implements ListView.OnItemClickListener {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ // TODO re-enable when "Accounts" is available in Navigation Drawer
+// if (mShowAccounts && position > 0){
+// position = position - 1;
+// }
+ switch (position){
+ // TODO re-enable when "Accounts" is available in Navigation Drawer
+// case 0: // Accounts
+// mShowAccounts = !mShowAccounts;
+// mNavigationDrawerAdapter.setShowAccounts(mShowAccounts);
+// mNavigationDrawerAdapter.notifyDataSetChanged();
+// break;
+
+ case 0: // All Files
+ allFilesOption();
+ mDrawerLayout.closeDrawers();
+ break;
+
+ // TODO Enable when "On Device" is recovered ?
+// case 2:
+// MainApp.showOnlyFilesOnDevice(true);
+// mDrawerLayout.closeDrawers();
+// break;
+
+ case 1: // Settings
+ Intent settingsIntent = new Intent(getApplicationContext(),
+ Preferences.class);
+ startActivity(settingsIntent);
+ mDrawerLayout.closeDrawers();
+ break;
+
+ case 2: // Logs
+ Intent loggerIntent = new Intent(getApplicationContext(),
+ LogHistoryActivity.class);
+ startActivity(loggerIntent);
+ mDrawerLayout.closeDrawers();
+ break;
+ }
+ }
+ }
}
package com.owncloud.android.ui.activity;
-import java.io.File;
-
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AuthenticatorException;
import android.annotation.TargetApi;
import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
-import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
-import android.os.Environment;
import android.os.IBinder;
import android.preference.PreferenceManager;
-import android.provider.DocumentsContract;
-import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
-import android.util.Log;
+import android.support.v4.view.GravityCompat;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.TextView;
+import android.view.Window;
import android.widget.Toast;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.ActionBar.OnNavigationListener;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
-import com.actionbarsherlock.view.Window;
-import com.owncloud.android.BuildConfig;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.operations.CreateFolderOperation;
import com.owncloud.android.operations.CreateShareOperation;
import com.owncloud.android.operations.MoveFileOperation;
+import com.owncloud.android.operations.RefreshFolderOperation;
import com.owncloud.android.operations.RemoveFileOperation;
import com.owncloud.android.operations.RenameFileOperation;
import com.owncloud.android.operations.SynchronizeFileOperation;
-import com.owncloud.android.operations.RefreshFolderOperation;
import com.owncloud.android.operations.UnshareLinkOperation;
import com.owncloud.android.services.observer.FileObserverService;
import com.owncloud.android.syncadapter.FileSyncAdapter;
+import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
import com.owncloud.android.ui.dialog.SslUntrustedCertDialog;
import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener;
+import com.owncloud.android.ui.dialog.UploadSourceDialogFragment;
import com.owncloud.android.ui.fragment.FileDetailFragment;
import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.ui.fragment.OCFileListFragment;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.UriUtils;
+import java.io.File;
+
/**
* Displays, what files the user has available in his ownCloud.
*/
-public class FileDisplayActivity extends HookActivity implements
-FileFragment.ContainerActivity, OnNavigationListener,
-OnSslUntrustedCertListener, OnEnforceableRefreshListener {
-
- private ArrayAdapter<String> mDirectories;
+public class FileDisplayActivity extends HookActivity
+ implements FileFragment.ContainerActivity,
+ OnSslUntrustedCertListener, OnEnforceableRefreshListener {
private SyncBroadcastReceiver mSyncBroadcastReceiver;
private UploadFinishReceiver mUploadFinishReceiver;
private static final String KEY_SYNC_IN_PROGRESS = "SYNC_IN_PROGRESS";
private static final String KEY_WAITING_TO_SEND = "WAITING_TO_SEND";
- public static final int DIALOG_SHORT_WAIT = 0;
- private static final int DIALOG_CHOOSE_UPLOAD_SOURCE = 1;
- private static final int DIALOG_CERT_NOT_SAVED = 2;
-
public static final String ACTION_DETAILS = "com.owncloud.android.ui.activity.action.DETAILS";
- private static final int ACTION_SELECT_CONTENT_FROM_APPS = 1;
- private static final int ACTION_SELECT_MULTIPLE_FILES = 2;
+ public static final int ACTION_SELECT_CONTENT_FROM_APPS = 1;
+ public static final int ACTION_SELECT_MULTIPLE_FILES = 2;
public static final int ACTION_MOVE_FILES = 3;
private static final String TAG = FileDisplayActivity.class.getSimpleName();
private boolean mSyncInProgress = false;
- private String DIALOG_UNTRUSTED_CERT;
-
+ private static String DIALOG_UNTRUSTED_CERT = "DIALOG_UNTRUSTED_CERT";
+ private static String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER";
+ private static String DIALOG_UPLOAD_SOURCE = "DIALOG_UPLOAD_SOURCE";
+ private static String DIALOG_CERT_NOT_SAVED = "DIALOG_CERT_NOT_SAVED";
+
private OCFile mWaitingToSend;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
- Log_OC.d(TAG, "onCreate() start");
+ Log_OC.v(TAG, "onCreate() start");
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid
+ super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account
+ // is valid
- // PIN CODE request ; best location is to decide, let's try this first
- if (getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN) && savedInstanceState == null) {
- requestPinCode();
- } else if (getIntent().getAction() == null && savedInstanceState == null) {
- requestPinCode();
- }
-
- /// grant that FileObserverService is watching favourite files
+ /// grant that FileObserverService is watching favorite files
if (savedInstanceState == null) {
Intent initObserversIntent = FileObserverService.makeInitIntent(this);
startService(initObserversIntent);
/// Load of saved instance state
if(savedInstanceState != null) {
- mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW);
+ mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(
+ FileDisplayActivity.KEY_WAITING_TO_PREVIEW);
mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS);
- mWaitingToSend = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND);
+ mWaitingToSend = (OCFile) savedInstanceState.getParcelable(
+ FileDisplayActivity.KEY_WAITING_TO_SEND);
} else {
mWaitingToPreview = null;
/// USER INTERFACE
// Inflate and set the layout view
- setContentView(R.layout.files);
+ setContentView(R.layout.files);
+
+ // Navigation Drawer
+ initDrawer();
+
mDualPane = getResources().getBoolean(R.bool.large_land_layout);
mLeftFragmentContainer = findViewById(R.id.left_fragment_container);
mRightFragmentContainer = findViewById(R.id.right_fragment_container);
}
// Action bar setup
- mDirectories = new CustomArrayAdapter<String>(this, R.layout.sherlock_spinner_dropdown_item);
- getSupportActionBar().setHomeButtonEnabled(true); // mandatory since Android ICS, according to the official documentation
- setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/); // always AFTER setContentView(...) ; to work around bug in its implementation
+ getSupportActionBar().setHomeButtonEnabled(true); // mandatory since Android ICS,
+ // according to the official
+ // documentation
+
+ setSupportProgressBarIndeterminateVisibility(mSyncInProgress
+ /*|| mRefreshSharesInProgress*/);
+ // always AFTER setContentView(...) ; to work around bug in its implementation
setBackgroundText();
- Log_OC.d(TAG, "onCreate() end");
+ Log_OC.v(TAG, "onCreate() end");
}
-
+
@Override
protected void onStart() {
+ Log_OC.v(TAG, "onStart() start");
super.onStart();
getSupportActionBar().setIcon(DisplayUtils.getSeasonalIconId());
+ Log_OC.v(TAG, "onStart() end");
}
@Override
protected void onDestroy() {
+ Log_OC.v(TAG, "onDestroy() start");
super.onDestroy();
+ Log_OC.v(TAG, "onDestroy() end");
}
/**
protected void onAccountSet(boolean stateWasRecovered) {
super.onAccountSet(stateWasRecovered);
if (getAccount() != null) {
- /// Check whether the 'main' OCFile handled by the Activity is contained in the current Account
+ /// Check whether the 'main' OCFile handled by the Activity is contained in the
+ // current Account
OCFile file = getFile();
// get parent from path
String parentPath = "";
if (file != null) {
if (file.isDown() && file.getLastSyncDateForProperties() == 0) {
- // upload in progress - right now, files are not inserted in the local cache until the upload is successful
- // get parent from path
- parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName()));
+ // upload in progress - right now, files are not inserted in the local
+ // cache until the upload is successful get parent from path
+ parentPath = file.getRemotePath().substring(0,
+ file.getRemotePath().lastIndexOf(file.getFileName()));
if (getStorageManager().getFileByPath(parentPath) == null)
file = null; // not able to know the directory where the file is uploading
} else {
- file = getStorageManager().getFileByPath(file.getRemotePath()); // currentDir = null if not in the current Account
+ file = getStorageManager().getFileByPath(file.getRemotePath());
+ // currentDir = null if not in the current Account
}
}
if (file == null) {
file = getStorageManager().getFileByPath(OCFile.ROOT_PATH); // never returns null
}
setFile(file);
- setNavigationListWithFolder(file);
if (!stateWasRecovered) {
Log_OC.d(TAG, "Initializing Fragments in onAccountChanged..");
} else {
updateFragmentsVisibility(!file.isFolder());
- updateNavigationElementsInActionBar(file.isFolder() ? null : file);
+ updateActionBarTitleAndHomeButton(file.isFolder() ? null : file);
}
}
}
- private void setNavigationListWithFolder(OCFile file) {
- mDirectories.clear();
- OCFile fileIt = file;
- String parentPath;
- while(fileIt != null && fileIt.getFileName() != OCFile.ROOT_PATH) {
- if (fileIt.isFolder()) {
- mDirectories.add(fileIt.getFileName());
- }
- // get parent from path
- parentPath = fileIt.getRemotePath().substring(0, fileIt.getRemotePath().lastIndexOf(fileIt.getFileName()));
- fileIt = getStorageManager().getFileByPath(parentPath);
- }
- mDirectories.add(OCFile.PATH_SEPARATOR);
- }
-
-
private void createMinFragments() {
OCFileListFragment listOfFiles = new OCFileListFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
/// First fragment
OCFileListFragment listOfFiles = getListOfFilesFragment();
if (listOfFiles != null) {
- listOfFiles.listDirectory(getCurrentDir());
+ listOfFiles.listDirectory(getCurrentDir());
+ // TODO Enable when "On Device" is recovered
+ // listOfFiles.listDirectory(getCurrentDir(), MainApp.getOnlyOnDevice());
} else {
Log_OC.e(TAG, "Still have a chance to lose the initializacion of list fragment >(");
}
if (secondFragment != null) {
setSecondFragment(secondFragment);
updateFragmentsVisibility(true);
- updateNavigationElementsInActionBar(file);
+ updateActionBarTitleAndHomeButton(file);
} else {
cleanSecondFragment();
if (file.isDown() && PreviewMediaFragment.canBePreviewed(file)
&& file.getLastSyncDateForProperties() > 0 // temporal fix
) {
- int startPlaybackPosition = getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0);
- boolean autoplay = getIntent().getBooleanExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, true);
- secondFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition, autoplay);
+ int startPlaybackPosition =
+ getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0);
+ boolean autoplay =
+ getIntent().getBooleanExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, true);
+ secondFragment = new PreviewMediaFragment(file, getAccount(),
+ startPlaybackPosition, autoplay);
} else {
- secondFragment = new FileDetailFragment(file, getAccount());
+ secondFragment = FileDetailFragment.newInstance(file, getAccount());
}
}
return secondFragment;
private OCFileListFragment getListOfFilesFragment() {
- Fragment listOfFiles = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_LIST_OF_FILES);
+ Fragment listOfFiles = getSupportFragmentManager().findFragmentByTag(
+ FileDisplayActivity.TAG_LIST_OF_FILES);
if (listOfFiles != null) {
return (OCFileListFragment)listOfFiles;
}
}
public FileFragment getSecondFragment() {
- Fragment second = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_SECOND_FRAGMENT);
+ Fragment second = getSupportFragmentManager().findFragmentByTag(
+ FileDisplayActivity.TAG_SECOND_FRAGMENT);
if (second != null) {
return (FileFragment)second;
}
tr.commit();
}
updateFragmentsVisibility(false);
- updateNavigationElementsInActionBar(null);
+ updateActionBarTitleAndHomeButton(null);
}
protected void refreshListOfFilesFragment() {
OCFileListFragment fileListFragment = getListOfFilesFragment();
- if (fileListFragment != null) {
+ if (fileListFragment != null) {
fileListFragment.listDirectory();
+ // TODO Enable when "On Device" is recovered ?
+ // fileListFragment.listDirectory(MainApp.getOnlyOnDevice());
}
}
- protected void refreshSecondFragment(String downloadEvent, String downloadedRemotePath, boolean success) {
+ protected void refreshSecondFragment(String downloadEvent, String downloadedRemotePath,
+ boolean success) {
FileFragment secondFragment = getSecondFragment();
- boolean waitedPreview = (mWaitingToPreview != null && mWaitingToPreview.getRemotePath().equals(downloadedRemotePath));
+ boolean waitedPreview = (mWaitingToPreview != null &&
+ mWaitingToPreview.getRemotePath().equals(downloadedRemotePath));
if (secondFragment != null && secondFragment instanceof FileDetailFragment) {
FileDetailFragment detailsFragment = (FileDetailFragment) secondFragment;
OCFile fileInFragment = detailsFragment.getFile();
- if (fileInFragment != null && !downloadedRemotePath.equals(fileInFragment.getRemotePath())) {
+ if (fileInFragment != null &&
+ !downloadedRemotePath.equals(fileInFragment.getRemotePath())) {
// the user browsed to other file ; forget the automatic preview
mWaitingToPreview = null;
boolean detailsFragmentChanged = false;
if (waitedPreview) {
if (success) {
- mWaitingToPreview = getStorageManager().getFileById(mWaitingToPreview.getFileId()); // update the file from database, for the local storage path
+ mWaitingToPreview = getStorageManager().getFileById(
+ mWaitingToPreview.getFileId()); // update the file from database,
+ // for the local storage path
if (PreviewMediaFragment.canBePreviewed(mWaitingToPreview)) {
startMediaPreview(mWaitingToPreview, 0, true);
detailsFragmentChanged = true;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
- if (BuildConfig.DEBUG) {
- menu.findItem(R.id.action_logger).setVisible(true);
- } else {
- menu.findItem(R.id.action_logger).setVisible(false);
- }
+ boolean drawerOpen = mDrawerLayout.isDrawerOpen(GravityCompat.START);
+ menu.findItem(R.id.action_upload).setVisible(!drawerOpen);
+ menu.findItem(R.id.action_create_dir).setVisible(!drawerOpen);
+ menu.findItem(R.id.action_sort).setVisible(!drawerOpen);
+ menu.findItem(R.id.action_sync_account).setVisible(!drawerOpen);
+
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getSherlock().getMenuInflater();
+ MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
boolean retval = true;
switch (item.getItemId()) {
- case R.id.action_create_dir: {
- CreateFolderDialogFragment dialog =
- CreateFolderDialogFragment.newInstance(getCurrentDir());
- dialog.show(getSupportFragmentManager(), "createdirdialog");
- break;
- }
- case R.id.action_sync_account: {
- startSynchronization();
- break;
- }
- case R.id.action_upload: {
- showDialog(DIALOG_CHOOSE_UPLOAD_SOURCE);
- break;
- }
- case R.id.action_settings: {
- Intent settingsIntent = new Intent(this, Preferences.class);
- startActivity(settingsIntent);
- break;
- }
- case R.id.action_logger: {
- Intent loggerIntent = new Intent(getApplicationContext(),LogHistoryActivity.class);
- startActivity(loggerIntent);
- break;
- }
- case android.R.id.home: {
- FileFragment second = getSecondFragment();
- OCFile currentDir = getCurrentDir();
- if((currentDir != null && currentDir.getParentId() != 0) ||
- (second != null && second.getFile() != null)) {
- onBackPressed();
-
+ case R.id.action_create_dir: {
+ CreateFolderDialogFragment dialog =
+ CreateFolderDialogFragment.newInstance(getCurrentDir());
+ dialog.show(getSupportFragmentManager(), DIALOG_CREATE_FOLDER);
+ break;
}
- break;
- }
- case R.id.action_sort: {
- SharedPreferences appPreferences = PreferenceManager
- .getDefaultSharedPreferences(this);
-
- // Read sorting order, default to sort by name ascending
- Integer sortOrder = appPreferences
- .getInt("sortOrder", FileStorageUtils.SORT_NAME);
-
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle(R.string.actionbar_sort_title)
- .setSingleChoiceItems(R.array.actionbar_sortby, sortOrder , new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
-
- switch (which){
- case 0:
- sortByName(true);
- break;
- case 1:
- sortByDate(false);
- break;
-
-// TODO re-enable when server-side folder size calculation is available
-// case 2:
-// sortBySize(false);
-// break;
- }
-
- dialog.dismiss();
-
+ case R.id.action_sync_account: {
+ startSynchronization();
+ break;
+ }
+ case R.id.action_upload: {
+ UploadSourceDialogFragment dialog =
+ UploadSourceDialogFragment.newInstance(getAccount());
+ dialog.show(getSupportFragmentManager(), DIALOG_UPLOAD_SOURCE);
+
+ break;
+ }
+ case android.R.id.home: {
+ FileFragment second = getSecondFragment();
+ OCFile currentDir = getCurrentDir();
+ if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
+ mDrawerLayout.closeDrawer(GravityCompat.START);
+ } else if((currentDir != null && currentDir.getParentId() != 0) ||
+ (second != null && second.getFile() != null)) {
+ onBackPressed();
+
+ } else {
+ mDrawerLayout.openDrawer(GravityCompat.START);
}
- });
- builder.create().show();
- break;
- }
+ break;
+ }
+ case R.id.action_sort: {
+ SharedPreferences appPreferences = PreferenceManager
+ .getDefaultSharedPreferences(this);
+
+ // Read sorting order, default to sort by name ascending
+ Integer sortOrder = appPreferences
+ .getInt("sortOrder", FileStorageUtils.SORT_NAME);
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(R.string.actionbar_sort_title)
+ .setSingleChoiceItems(R.array.actionbar_sortby, sortOrder ,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ switch (which){
+ case 0:
+ sortByName(true);
+ break;
+ case 1:
+ sortByDate(false);
+ break;
+ }
+
+ dialog.dismiss();
+ }
+ });
+ builder.create().show();
+ break;
+ }
default:
retval = super.onOptionsItemSelected(item);
}
Log_OC.d(TAG, "Got to start sync");
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
Log_OC.d(TAG, "Canceling all syncs for " + MainApp.getAuthority());
- ContentResolver.cancelSync(null, MainApp.getAuthority()); // cancel the current synchronizations of any ownCloud account
+ ContentResolver.cancelSync(null, MainApp.getAuthority());
+ // cancel the current synchronizations of any ownCloud account
Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
- Log_OC.d(TAG, "Requesting sync for " + getAccount().name + " at " + MainApp.getAuthority());
+ Log_OC.d(TAG, "Requesting sync for " + getAccount().name + " at " +
+ MainApp.getAuthority());
ContentResolver.requestSync(
getAccount(),
MainApp.getAuthority(), bundle);
} else {
- Log_OC.d(TAG, "Requesting sync for " + getAccount().name + " at " + MainApp.getAuthority() + " with new API");
+ Log_OC.d(TAG, "Requesting sync for " + getAccount().name + " at " +
+ MainApp.getAuthority() + " with new API");
SyncRequest.Builder builder = new SyncRequest.Builder();
builder.setSyncAdapter(getAccount(), MainApp.getAuthority());
builder.setExpedited(true);
}
}
-
- @Override
- public boolean onNavigationItemSelected(int itemPosition, long itemId) {
- if (itemPosition != 0) {
- String targetPath = "";
- for (int i=itemPosition; i < mDirectories.getCount() - 1; i++) {
- targetPath = mDirectories.getItem(i) + OCFile.PATH_SEPARATOR + targetPath;
- }
- targetPath = OCFile.PATH_SEPARATOR + targetPath;
- OCFile targetFolder = getStorageManager().getFileByPath(targetPath);
- if (targetFolder != null) {
- browseTo(targetFolder);
- }
-
- // the next operation triggers a new call to this method, but it's necessary to
- // ensure that the name exposed in the action bar is the current directory when the
- // user selected it in the navigation list
- if (getSupportActionBar().getNavigationMode() == ActionBar.NAVIGATION_MODE_LIST && itemPosition != 0)
- getSupportActionBar().setSelectedNavigationItem(0);
- }
- return true;
- }
-
/**
* Called, when the user selected something for uploading
*
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+ @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
+ if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK ||
+ resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
//getClipData is only supported on api level 16+, Jelly Bean
if (data.getData() == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
for( int i = 0; i < data.getClipData().getItemCount(); i++){
}else {
requestSimpleUpload(data, resultCode);
}
- } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
+ } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK ||
+ resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
requestMultipleUpload(data, resultCode);
} else if (requestCode == ACTION_MOVE_FILES && resultCode == RESULT_OK){
},
DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS
);
+
+ } else {
+ super.onActivityResult(requestCode, resultCode, data);
}
+
}
private void requestMultipleUpload(Intent data, int resultCode) {
String[] filePaths = data.getStringArrayExtra(UploadFilesActivity.EXTRA_CHOSEN_FILES);
if (filePaths != null) {
String[] remotePaths = new String[filePaths.length];
- String remotePathBase = "";
-
- for (int j = mDirectories.getCount() - 2; j >= 0; --j) {
- remotePathBase += OCFile.PATH_SEPARATOR + mDirectories.getItem(j);
- }
- if (!remotePathBase.endsWith(OCFile.PATH_SEPARATOR))
- remotePathBase += OCFile.PATH_SEPARATOR;
+ String remotePathBase = getCurrentDir().getRemotePath();
for (int j = 0; j< remotePaths.length; j++) {
remotePaths[j] = remotePathBase + (new File(filePaths[j])).getName();
}
} else {
Log_OC.d(TAG, "User clicked on 'Update' with no selection");
- Toast t = Toast.makeText(this, getString(R.string.filedisplay_no_file_selected), Toast.LENGTH_LONG);
+ Toast t = Toast.makeText(this, getString(R.string.filedisplay_no_file_selected),
+ Toast.LENGTH_LONG);
t.show();
return;
}
private void requestSimpleUpload(Intent data, int resultCode) {
- String filepath = null;
+ String filePath = null;
String mimeType = null;
Uri selectedImageUri = data.getData();
try {
mimeType = getContentResolver().getType(selectedImageUri);
- String filemanagerstring = selectedImageUri.getPath();
- String selectedImagePath = getPath(selectedImageUri);
+ String fileManagerString = selectedImageUri.getPath();
+ String selectedImagePath = UriUtils.getLocalPath(selectedImageUri, this);
if (selectedImagePath != null)
- filepath = selectedImagePath;
+ filePath = selectedImagePath;
else
- filepath = filemanagerstring;
+ filePath = fileManagerString;
} catch (Exception e) {
- Log_OC.e(TAG, "Unexpected exception when trying to read the result of Intent.ACTION_GET_CONTENT", e);
- e.printStackTrace();
+ Log_OC.e(TAG, "Unexpected exception when trying to read the result of " +
+ "Intent.ACTION_GET_CONTENT", e);
} finally {
- if (filepath == null) {
+ if (filePath == null) {
Log_OC.e(TAG, "Couldn't resolve path to file");
- Toast t = Toast.makeText(this, getString(R.string.filedisplay_unexpected_bad_get_content), Toast.LENGTH_LONG);
+ Toast t = Toast.makeText(
+ this, getString(R.string.filedisplay_unexpected_bad_get_content),
+ Toast.LENGTH_LONG
+ );
t.show();
return;
}
}
Intent i = new Intent(this, FileUploader.class);
- i.putExtra(FileUploader.KEY_ACCOUNT,
- getAccount());
- String remotepath = new String();
- for (int j = mDirectories.getCount() - 2; j >= 0; --j) {
- remotepath += OCFile.PATH_SEPARATOR + mDirectories.getItem(j);
- }
- if (!remotepath.endsWith(OCFile.PATH_SEPARATOR))
- remotepath += OCFile.PATH_SEPARATOR;
-
- if (filepath.startsWith(UriUtils.URI_CONTENT_SCHEME)) {
-
- Cursor cursor = MainApp.getAppContext().getContentResolver()
- .query(Uri.parse(filepath), null, null, null, null, null);
+ i.putExtra(FileUploader.KEY_ACCOUNT, getAccount());
+ OCFile currentDir = getCurrentDir();
+ String remotePath = (currentDir != null) ? currentDir.getRemotePath() : OCFile.ROOT_PATH;
+ if (filePath.startsWith(UriUtils.URI_CONTENT_SCHEME)) {
+ Cursor cursor = getContentResolver().query(Uri.parse(filePath), null, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
- String displayName = cursor.getString(
- cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
- Log.i(TAG, "Display Name: " + displayName + "; mimeType: " + mimeType);
+ String displayName = cursor.getString(cursor.getColumnIndex(
+ OpenableColumns.DISPLAY_NAME));
+ Log_OC.v(TAG, "Display Name: " + displayName );
displayName.replace(File.separatorChar, '_');
displayName.replace(File.pathSeparatorChar, '_');
- remotepath += displayName + DisplayUtils.getComposedFileExtension(filepath);
+ remotePath += displayName + DisplayUtils.getComposedFileExtension(filePath);
}
+ // and what happens in case of error?; wrong target name for the upload
} finally {
cursor.close();
}
} else {
- remotepath += new File(filepath).getName();
+ remotePath += new File(filePath).getName();
}
- i.putExtra(FileUploader.KEY_LOCAL_FILE, filepath);
- i.putExtra(FileUploader.KEY_REMOTE_FILE, remotepath);
+ i.putExtra(FileUploader.KEY_LOCAL_FILE, filePath);
+ i.putExtra(FileUploader.KEY_REMOTE_FILE, remotePath);
i.putExtra(FileUploader.KEY_MIME_TYPE, mimeType);
i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);
if (resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)
- i.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_MOVE);
+ i.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_MOVE);
startService(i);
}
public void onBackPressed() {
OCFileListFragment listOfFiles = getListOfFilesFragment();
if (mDualPane || getSecondFragment() == null) {
+ if (getFile() != null && getFile().getParentId() == 0) {
+ finish();
+ return;
+ }
if (listOfFiles != null) { // should never be null, indeed
- if (mDirectories.getCount() <= 1) {
- finish();
- return;
- }
- int levelsUp = listOfFiles.onBrowseUp();
- for (int i=0; i < levelsUp && mDirectories.getCount() > 1 ; i++) {
- popDirname();
- }
+ listOfFiles.onBrowseUp();
}
}
if (listOfFiles != null) { // should never be null, indeed
@Override
protected void onSaveInstanceState(Bundle outState) {
- // responsibility of restore is preferred in onCreate() before than in onRestoreInstanceState when there are Fragments involved
- Log_OC.d(TAG, "onSaveInstanceState() start");
+ // responsibility of restore is preferred in onCreate() before than in
+ // onRestoreInstanceState when there are Fragments involved
+ Log_OC.v(TAG, "onSaveInstanceState() start");
super.onSaveInstanceState(outState);
outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW, mWaitingToPreview);
outState.putBoolean(FileDisplayActivity.KEY_SYNC_IN_PROGRESS, mSyncInProgress);
- //outState.putBoolean(FileDisplayActivity.KEY_REFRESH_SHARES_IN_PROGRESS, mRefreshSharesInProgress);
+ //outState.putBoolean(FileDisplayActivity.KEY_REFRESH_SHARES_IN_PROGRESS,
+ // mRefreshSharesInProgress);
outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND, mWaitingToSend);
- Log_OC.d(TAG, "onSaveInstanceState() end");
+ Log_OC.v(TAG, "onSaveInstanceState() end");
}
@Override
protected void onResume() {
+ Log_OC.v(TAG, "onResume() start");
super.onResume();
- Log_OC.d(TAG, "onResume() start");
-
+
+ // refresh Navigation Drawer account list
+ mNavigationDrawerAdapter.updateAccountList();
+
+
// refresh list of files
refreshListOfFilesFragment();
syncIntentFilter.addAction(RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED);
mSyncBroadcastReceiver = new SyncBroadcastReceiver();
registerReceiver(mSyncBroadcastReceiver, syncIntentFilter);
- //LocalBroadcastManager.getInstance(this).registerReceiver(mSyncBroadcastReceiver, syncIntentFilter);
+ //LocalBroadcastManager.getInstance(this).registerReceiver(mSyncBroadcastReceiver,
+ // syncIntentFilter);
// Listen for upload messages
IntentFilter uploadIntentFilter = new IntentFilter(FileUploader.getUploadFinishMessage());
registerReceiver(mUploadFinishReceiver, uploadIntentFilter);
// Listen for download messages
- IntentFilter downloadIntentFilter = new IntentFilter(FileDownloader.getDownloadAddedMessage());
+ IntentFilter downloadIntentFilter = new IntentFilter(
+ FileDownloader.getDownloadAddedMessage());
downloadIntentFilter.addAction(FileDownloader.getDownloadFinishMessage());
mDownloadFinishReceiver = new DownloadFinishReceiver();
registerReceiver(mDownloadFinishReceiver, downloadIntentFilter);
- Log_OC.d(TAG, "onResume() end");
+ Log_OC.v(TAG, "onResume() end");
}
@Override
protected void onPause() {
- Log_OC.d(TAG, "onPause() start");
+ Log_OC.v(TAG, "onPause() start");
if (mSyncBroadcastReceiver != null) {
unregisterReceiver(mSyncBroadcastReceiver);
//LocalBroadcastManager.getInstance(this).unregisterReceiver(mSyncBroadcastReceiver);
mDownloadFinishReceiver = null;
}
-
- Log_OC.d(TAG, "onPause() end");
super.onPause();
+ Log_OC.v(TAG, "onPause() end");
}
- @Override
- protected Dialog onCreateDialog(int id) {
- Dialog dialog = null;
- AlertDialog.Builder builder;
- switch (id) {
- case DIALOG_SHORT_WAIT: {
- ProgressDialog working_dialog = new ProgressDialog(this);
- working_dialog.setMessage(getResources().getString(
- R.string.wait_a_moment));
- working_dialog.setIndeterminate(true);
- working_dialog.setCancelable(false);
- dialog = working_dialog;
- break;
- }
- case DIALOG_CHOOSE_UPLOAD_SOURCE: {
-
-
- String[] allTheItems = { getString(R.string.actionbar_upload_files),
- getString(R.string.actionbar_upload_from_apps) };
-
- builder = new AlertDialog.Builder(this);
- builder.setTitle(R.string.actionbar_upload);
- builder.setItems(allTheItems, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int item) {
- if (item == 0) {
- // if (!mDualPane) {
- Intent action = new Intent(FileDisplayActivity.this, UploadFilesActivity.class);
- action.putExtra(UploadFilesActivity.EXTRA_ACCOUNT, FileDisplayActivity.this.getAccount());
- startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES);
- // } else {
- // TODO create and handle new fragment
- // LocalFileListFragment
- // }
- } else if (item == 1) {
- Intent action = new Intent(Intent.ACTION_GET_CONTENT);
- action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE);
- //Intent.EXTRA_ALLOW_MULTIPLE is only supported on api level 18+, Jelly Bean
- if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
- action.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
- }
- startActivityForResult(Intent.createChooser(action, getString(R.string.upload_chooser_title)),
- ACTION_SELECT_CONTENT_FROM_APPS);
- }
- }
- });
- dialog = builder.create();
- break;
- }
- case DIALOG_CERT_NOT_SAVED: {
- builder = new AlertDialog.Builder(this);
- builder.setMessage(getResources().getString(R.string.ssl_validator_not_saved));
- builder.setCancelable(false);
- builder.setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- };
- });
- dialog = builder.create();
- break;
- }
- default:
- dialog = null;
- }
-
- return dialog;
- }
-
- /**
- * Translates a content URI of an content to a physical path on the disk
- *
- * @param uri The URI to resolve
- * @return The path to the content or null if it could not be found
- */
- public String getPath(Uri uri) {
- final boolean isKitKatOrLater = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
-
- // DocumentProvider
- if (isKitKatOrLater && DocumentsContract.isDocumentUri(getApplicationContext(), uri)) {
- // ExternalStorageProvider
- if (UriUtils.isExternalStorageDocument(uri)) {
- final String docId = DocumentsContract.getDocumentId(uri);
- final String[] split = docId.split(":");
- final String type = split[0];
-
- if ("primary".equalsIgnoreCase(type)) {
- return Environment.getExternalStorageDirectory() + "/" + split[1];
- }
- }
- // DownloadsProvider
- else if (UriUtils.isDownloadsDocument(uri)) {
-
- final String id = DocumentsContract.getDocumentId(uri);
- final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
- Long.valueOf(id));
-
- return UriUtils.getDataColumn(getApplicationContext(), contentUri, null, null);
- }
- // MediaProvider
- else if (UriUtils.isMediaDocument(uri)) {
- final String docId = DocumentsContract.getDocumentId(uri);
- final String[] split = docId.split(":");
- final String type = split[0];
-
- Uri contentUri = null;
- if ("image".equals(type)) {
- contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
- } else if ("video".equals(type)) {
- contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
- } else if ("audio".equals(type)) {
- contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
- }
-
- final String selection = "_id=?";
- final String[] selectionArgs = new String[] { split[1] };
-
- return UriUtils.getDataColumn(getApplicationContext(), contentUri, selection, selectionArgs);
- }
- // Documents providers returned as content://...
- else if (UriUtils.isContentDocument(uri)) {
- return uri.toString();
- }
- }
- // MediaStore (and general)
- else if ("content".equalsIgnoreCase(uri.getScheme())) {
-
- // Return the remote address
- if (UriUtils.isGooglePhotosUri(uri))
- return uri.getLastPathSegment();
-
- return UriUtils.getDataColumn(getApplicationContext(), uri, null, null);
- }
- // File
- else if ("file".equalsIgnoreCase(uri.getScheme())) {
- return uri.getPath();
- }
- return null;
- }
-
- /**
- * Pushes a directory to the drop down list
- * @param directory to push
- * @throws IllegalArgumentException If the {@link OCFile#isFolder()} returns false.
- */
- public void pushDirname(OCFile directory) {
- if(!directory.isFolder()){
- throw new IllegalArgumentException("Only directories may be pushed!");
- }
- mDirectories.insert(directory.getFileName(), 0);
- setFile(directory);
- }
-
- /**
- * Pops a directory name from the drop down list
- * @return True, unless the stack is empty
- */
- public boolean popDirname() {
- mDirectories.remove(mDirectories.getItem(0));
- return !mDirectories.isEmpty();
- }
-
- // Custom array adapter to override text colors
- private class CustomArrayAdapter<T> extends ArrayAdapter<T> {
-
- public CustomArrayAdapter(FileDisplayActivity ctx, int view) {
- super(ctx, view);
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
- View v = super.getView(position, convertView, parent);
-
- ((TextView) v).setTextColor(getResources().getColorStateList(
- android.R.color.white));
-
- fixRoot((TextView) v );
- return v;
- }
-
- public View getDropDownView(int position, View convertView,
- ViewGroup parent) {
- View v = super.getDropDownView(position, convertView, parent);
-
- ((TextView) v).setTextColor(getResources().getColorStateList(
- android.R.color.white));
-
- fixRoot((TextView) v );
- return v;
- }
-
- private void fixRoot(TextView v) {
- if (v.getText().equals(OCFile.PATH_SEPARATOR)) {
- v.setText(R.string.default_display_name_for_root_folder);
- }
- }
-
- }
-
private class SyncBroadcastReceiver extends BroadcastReceiver {
/**
String event = intent.getAction();
Log_OC.d(TAG, "Received broadcast " + event);
String accountName = intent.getStringExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME);
- String synchFolderRemotePath = intent.getStringExtra(FileSyncAdapter.EXTRA_FOLDER_PATH);
- RemoteOperationResult synchResult = (RemoteOperationResult)intent.getSerializableExtra(FileSyncAdapter.EXTRA_RESULT);
- boolean sameAccount = (getAccount() != null && accountName.equals(getAccount().name) && getStorageManager() != null);
+ String synchFolderRemotePath =
+ intent.getStringExtra(FileSyncAdapter.EXTRA_FOLDER_PATH);
+ RemoteOperationResult synchResult =
+ (RemoteOperationResult)intent.getSerializableExtra(
+ FileSyncAdapter.EXTRA_RESULT);
+ boolean sameAccount = (getAccount() != null &&
+ accountName.equals(getAccount().name) && getStorageManager() != null);
if (sameAccount) {
mSyncInProgress = true;
} else {
- OCFile currentFile = (getFile() == null) ? null : getStorageManager().getFileByPath(getFile().getRemotePath());
- OCFile currentDir = (getCurrentDir() == null) ? null : getStorageManager().getFileByPath(getCurrentDir().getRemotePath());
+ OCFile currentFile = (getFile() == null) ? null :
+ getStorageManager().getFileByPath(getFile().getRemotePath());
+ OCFile currentDir = (getCurrentDir() == null) ? null :
+ getStorageManager().getFileByPath(getCurrentDir().getRemotePath());
if (currentDir == null) {
// current folder was removed from the server
Toast.makeText( FileDisplayActivity.this,
- String.format(getString(R.string.sync_current_folder_was_removed), mDirectories.getItem(0)),
+ String.format(
+ getString(R.string.
+ sync_current_folder_was_removed),
+ synchFolderRemotePath),
Toast.LENGTH_LONG)
.show();
browseToRoot();
} else {
if (currentFile == null && !getFile().isFolder()) {
- // currently selected file was removed in the server, and now we know it
+ // currently selected file was removed in the server, and now we
+ // know it
cleanSecondFragment();
currentFile = currentDir;
}
- if (synchFolderRemotePath != null && currentDir.getRemotePath().equals(synchFolderRemotePath)) {
+ if (synchFolderRemotePath != null &&
+ currentDir.getRemotePath().equals(synchFolderRemotePath)) {
OCFileListFragment fileListFragment = getListOfFilesFragment();
if (fileListFragment != null) {
- fileListFragment.listDirectory(currentDir);
+ fileListFragment.listDirectory();
+ // TODO Enable when "On Device" is recovered ?
+ // fileListFragment.listDirectory(currentDir,
+ // MainApp.getOnlyOnDevice());
}
}
setFile(currentFile);
}
- mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) && !RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED.equals(event));
+ mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) &&
+ !RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED
+ .equals(event));
if (RefreshFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED.
equals(event) &&
}
removeStickyBroadcast(intent);
Log_OC.d(TAG, "Setting progress visibility to " + mSyncInProgress);
- setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/);
+ setSupportProgressBarIndeterminateVisibility(mSyncInProgress
+ /*|| mRefreshSharesInProgress*/);
setBackgroundText();
}
if (synchResult != null) {
- if (synchResult.getCode().equals(RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED)) {
+ if (synchResult.getCode().equals(
+ RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED)) {
mLastSslUntrustedServerResult = synchResult;
}
}
refreshListOfFilesFragment();
}
- boolean uploadWasFine = intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT, false);
+ boolean uploadWasFine = intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT,
+ false);
boolean renamedInUpload = getFile().getRemotePath().
equals(intent.getStringExtra(FileUploader.EXTRA_OLD_REMOTE_PATH));
boolean sameFile = getFile().getRemotePath().equals(uploadedRemotePath) ||
public void onReceive(Context context, Intent intent) {
try {
boolean sameAccount = isSameAccount(context, intent);
- String downloadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH);
+ String downloadedRemotePath =
+ intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH);
boolean isDescendant = isDescendant(downloadedRemotePath);
if (sameAccount && isDescendant) {
- String linkedToRemotePath = intent.getStringExtra(FileDownloader.EXTRA_LINKED_TO_PATH);
+ String linkedToRemotePath =
+ intent.getStringExtra(FileDownloader.EXTRA_LINKED_TO_PATH);
if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) {
//Log_OC.v(TAG, "refresh #" + ++refreshCounter);
refreshListOfFilesFragment();
}
if (mWaitingToSend != null) {
- mWaitingToSend = getStorageManager().getFileByPath(mWaitingToSend.getRemotePath());
+ mWaitingToSend =
+ getStorageManager().getFileByPath(mWaitingToSend.getRemotePath());
if (mWaitingToSend.isDown()) {
sendDownloadedFile();
}
private boolean isSameAccount(Context context, Intent intent) {
String accountName = intent.getStringExtra(FileDownloader.ACCOUNT_NAME);
- return (accountName != null && getAccount() != null && accountName.equals(getAccount().name));
+ return (accountName != null && getAccount() != null &&
+ accountName.equals(getAccount().name));
}
}
public void browseToRoot() {
OCFileListFragment listOfFiles = getListOfFilesFragment();
if (listOfFiles != null) { // should never be null, indeed
- while (mDirectories.getCount() > 1) {
- popDirname();
- }
OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
listOfFiles.listDirectory(root);
+ // TODO Enable when "On Device" is recovered ?
+ // listOfFiles.listDirectory(root, MainApp.getOnlyOnDevice());
setFile(listOfFiles.getCurrentFile());
startSyncFolderOperation(root, false);
}
cleanSecondFragment();
- }
-
-
- public void browseTo(OCFile folder) {
- if (folder == null || !folder.isFolder()) {
- throw new IllegalArgumentException("Trying to browse to invalid folder " + folder);
- }
- OCFileListFragment listOfFiles = getListOfFilesFragment();
- if (listOfFiles != null) {
- setNavigationListWithFolder(folder);
- listOfFiles.listDirectory(folder);
- setFile(listOfFiles.getCurrentFile());
- startSyncFolderOperation(folder, false);
- } else {
- Log_OC.e(TAG, "Unexpected null when accessing list fragment");
- }
- cleanSecondFragment();
+
}
*/
@Override
public void onBrowsedDownTo(OCFile directory) {
- pushDirname(directory);
+ setFile(directory);
cleanSecondFragment();
-
// Sync Folder
startSyncFolderOperation(directory, false);
-
}
/**
*/
@Override
public void showDetails(OCFile file) {
- Fragment detailFragment = new FileDetailFragment(file, getAccount());
+ Fragment detailFragment = FileDetailFragment.newInstance(file, getAccount());
setSecondFragment(detailFragment);
updateFragmentsVisibility(true);
- updateNavigationElementsInActionBar(file);
+ updateActionBarTitleAndHomeButton(file);
setFile(file);
}
-
- /**
- * TODO
- */
- private void updateNavigationElementsInActionBar(OCFile chosenFile) {
- ActionBar actionBar = getSupportActionBar();
-
- // For adding content description tag to a title field in the action bar
- int actionBarTitleId = getResources().getIdentifier("action_bar_title", "id", "android");
-
- if (chosenFile == null || mDualPane) {
- // only list of files - set for browsing through folders
- OCFile currentDir = getCurrentDir();
- boolean noRoot = (currentDir != null && currentDir.getParentId() != 0);
- actionBar.setDisplayHomeAsUpEnabled(noRoot);
- actionBar.setDisplayShowTitleEnabled(!noRoot);
- if (!noRoot) {
- actionBar.setTitle(getString(R.string.default_display_name_for_root_folder));
- View actionBarTitleView = getWindow().getDecorView().findViewById(actionBarTitleId);
- if (actionBarTitleView != null) { // it's null in Android 2.x
- actionBarTitleView.setContentDescription(getString(R.string.default_display_name_for_root_folder));
- }
- }
- actionBar.setNavigationMode(!noRoot ? ActionBar.NAVIGATION_MODE_STANDARD : ActionBar.NAVIGATION_MODE_LIST);
- actionBar.setListNavigationCallbacks(mDirectories, this); // assuming mDirectories is updated
+ @Override
+ protected void updateActionBarTitleAndHomeButton(OCFile chosenFile) {
+ if (mDualPane) {
+ // in dual pane mode, keep the focus of title an action bar in the current folder
+ super.updateActionBarTitleAndHomeButton(getCurrentDir());
} else {
- actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.setDisplayShowTitleEnabled(true);
- actionBar.setTitle(chosenFile.getFileName());
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
- View actionBarTitleView = getWindow().getDecorView().findViewById(actionBarTitleId);
- if (actionBarTitleView != null) { // it's null in Android 2.x
- getWindow().getDecorView().findViewById(actionBarTitleId).
- setContentDescription(chosenFile.getFileName());
- }
+ super.updateActionBarTitleAndHomeButton(chosenFile);
}
+
}
@Override
public void onServiceConnected(ComponentName component, IBinder service) {
- if (component.equals(new ComponentName(FileDisplayActivity.this, FileDownloader.class))) {
+ if (component.equals(new ComponentName(
+ FileDisplayActivity.this, FileDownloader.class))) {
Log_OC.d(TAG, "Download service connected");
mDownloaderBinder = (FileDownloaderBinder) service;
if (mWaitingToPreview != null)
if (getStorageManager() != null) {
- mWaitingToPreview = getStorageManager().getFileById(mWaitingToPreview.getFileId()); // update the file
+ // update the file
+ mWaitingToPreview =
+ getStorageManager().getFileById(mWaitingToPreview.getFileId());
if (!mWaitingToPreview.isDown()) {
requestForDownload();
}
}
- } else if (component.equals(new ComponentName(FileDisplayActivity.this, FileUploader.class))) {
+ } else if (component.equals(new ComponentName(FileDisplayActivity.this,
+ FileUploader.class))) {
Log_OC.d(TAG, "Upload service connected");
mUploaderBinder = (FileUploaderBinder) service;
} else {
return;
}
- // a new chance to get the mDownloadBinder through getFileDownloadBinder() - THIS IS A MESS
+ // a new chance to get the mDownloadBinder through
+ // getFileDownloadBinder() - THIS IS A MESS
OCFileListFragment listOfFiles = getListOfFilesFragment();
if (listOfFiles != null) {
listOfFiles.listDirectory();
+ // TODO Enable when "On Device" is recovered ?
+ // listOfFiles.listDirectory(MainApp.getOnlyOnDevice());
}
FileFragment secondFragment = getSecondFragment();
if (secondFragment != null && secondFragment instanceof FileDetailFragment) {
@Override
public void onServiceDisconnected(ComponentName component) {
- if (component.equals(new ComponentName(FileDisplayActivity.this, FileDownloader.class))) {
+ if (component.equals(new ComponentName(FileDisplayActivity.this,
+ FileDownloader.class))) {
Log_OC.d(TAG, "Download service disconnected");
mDownloaderBinder = null;
- } else if (component.equals(new ComponentName(FileDisplayActivity.this, FileUploader.class))) {
+ } else if (component.equals(new ComponentName(FileDisplayActivity.this,
+ FileUploader.class))) {
Log_OC.d(TAG, "Upload service disconnected");
mUploaderBinder = null;
}
}
};
-
-
- /**
- * Launch an intent to request the PIN code to the user before letting him use the app
- */
- private void requestPinCode() {
- boolean pinStart = false;
- SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
- pinStart = appPrefs.getBoolean("set_pincode", false);
- if (pinStart) {
- Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);
- i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "FileDisplayActivity");
- startActivity(i);
- }
- }
-
-
@Override
public void onSavedCertificate() {
startSyncFolderOperation(getCurrentDir(), false);
@Override
public void onFailedSavingCertificate() {
- showDialog(DIALOG_CERT_NOT_SAVED);
+ ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(
+ R.string.ssl_validator_not_saved, new String[]{}, R.string.common_ok, -1, -1
+ );
+ dialog.show(getSupportFragmentManager(), DIALOG_CERT_NOT_SAVED);
}
@Override
}
- private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) {
+ private void onCreateShareOperationFinish(CreateShareOperation operation,
+ RemoteOperationResult result) {
if (result.isSuccess()) {
refreshShowDetails();
refreshListOfFilesFragment();
}
- private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) {
+ private void onUnshareLinkOperationFinish(UnshareLinkOperation operation,
+ RemoteOperationResult result) {
if (result.isSuccess()) {
refreshShowDetails();
refreshListOfFilesFragment();
}
/**
- * Updates the view associated to the activity after the finish of an operation trying to remove a
- * file.
+ * Updates the view associated to the activity after the finish of an operation trying to
+ * remove a file.
*
* @param operation Removal operation performed.
* @param result Result of the removal.
*/
- private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) {
+ private void onRemoveFileOperationFinish(RemoveFileOperation operation,
+ RemoteOperationResult result) {
dismissLoadingDialog();
- Toast msg = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
+ Toast msg = Toast.makeText(this,
+ ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
Toast.LENGTH_LONG);
msg.show();
* @param operation Move operation performed.
* @param result Result of the move operation.
*/
- private void onMoveFileOperationFinish(MoveFileOperation operation, RemoteOperationResult result) {
+ private void onMoveFileOperationFinish(MoveFileOperation operation,
+ RemoteOperationResult result) {
if (result.isSuccess()) {
dismissLoadingDialog();
refreshListOfFilesFragment();
/**
- * Updates the view associated to the activity after the finish of an operation trying to rename a
- * file.
+ * Updates the view associated to the activity after the finish of an operation trying to rename
+ * a file.
*
* @param operation Renaming operation performed.
* @param result Result of the renaming.
*/
- private void onRenameFileOperationFinish(RenameFileOperation operation, RemoteOperationResult result) {
+ private void onRenameFileOperationFinish(RenameFileOperation operation,
+ RemoteOperationResult result) {
dismissLoadingDialog();
OCFile renamedFile = operation.getFile();
if (result.isSuccess()) {
FileFragment details = getSecondFragment();
if (details != null) {
- if (details instanceof FileDetailFragment && renamedFile.equals(details.getFile()) ) {
+ if (details instanceof FileDetailFragment &&
+ renamedFile.equals(details.getFile()) ) {
((FileDetailFragment) details).updateFileDetails(renamedFile, getAccount());
showDetails(renamedFile);
- } else if (details instanceof PreviewMediaFragment && renamedFile.equals(details.getFile())) {
+ } else if (details instanceof PreviewMediaFragment &&
+ renamedFile.equals(details.getFile())) {
((PreviewMediaFragment) details).updateFile(renamedFile);
if (PreviewMediaFragment.canBePreviewed(renamedFile)) {
int position = ((PreviewMediaFragment)details).getPosition();
}
}
- if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())) {
+ if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())){
refreshListOfFilesFragment();
}
} else {
- Toast msg = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
+ Toast msg = Toast.makeText(this,
+ ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
Toast.LENGTH_LONG);
msg.show();
}
}
- private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation, RemoteOperationResult result) {
+ private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation,
+ RemoteOperationResult result) {
dismissLoadingDialog();
OCFile syncedFile = operation.getLocalFile();
if (!result.isSuccess()) {
onTransferStateChanged(syncedFile, true, true);
} else {
- Toast msg = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
- Toast.LENGTH_LONG);
+ Toast msg = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result,
+ operation, getResources()), Toast.LENGTH_LONG);
msg.show();
}
}
}
/**
- * Updates the view associated to the activity after the finish of an operation trying create a new folder
+ * Updates the view associated to the activity after the finish of an operation trying create a
+ * new folder
*
* @param operation Creation operation performed.
* @param result Result of the creation.
*/
- private void onCreateFolderOperationFinish(CreateFolderOperation operation, RemoteOperationResult result) {
+ private void onCreateFolderOperationFinish(CreateFolderOperation operation,
+ RemoteOperationResult result) {
if (result.isSuccess()) {
dismissLoadingDialog();
refreshListOfFilesFragment();
public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) {
refreshListOfFilesFragment();
FileFragment details = getSecondFragment();
- if (details != null && details instanceof FileDetailFragment && file.equals(details.getFile()) ) {
+ if (details != null && details instanceof FileDetailFragment &&
+ file.equals(details.getFile()) ) {
if (downloading || uploading) {
((FileDetailFragment)details).updateFileDetails(file, getAccount());
} else {
// perform folder synchronization
RemoteOperation synchFolderOp = new RefreshFolderOperation( folder,
- currentSyncTime,
- false,
- getFileOperationsHelper().isSharedSupported(),
- ignoreETag,
- getStorageManager(),
- getAccount(),
- getApplicationContext()
- );
+ currentSyncTime,
+ false,
+ getFileOperationsHelper().isSharedSupported(),
+ ignoreETag,
+ getStorageManager(),
+ getAccount(),
+ getApplicationContext()
+ );
synchFolderOp.execute(getAccount(), MainApp.getAppContext(), this, null, null);
setSupportProgressBarIndeterminateVisibility(true);
public void showUntrustedCertDialog(RemoteOperationResult result) {
// Show a dialog with the certificate info
SslUntrustedCertDialog dialog = SslUntrustedCertDialog.newInstanceForFullSslError(
- (CertificateCombinedException)result.getException());
+ (CertificateCombinedException) result.getException());
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
dialog.show(ft, DIALOG_UNTRUSTED_CERT);
* Stars the preview of an already down media {@link OCFile}.
*
* @param file Media {@link OCFile} to preview.
- * @param startPlaybackPosition Media position where the playback will be started, in milliseconds.
- * @param autoplay When 'true', the playback will start without user interactions.
+ * @param startPlaybackPosition Media position where the playback will be started,
+ * in milliseconds.
+ * @param autoplay When 'true', the playback will start without user
+ * interactions.
*/
public void startMediaPreview(OCFile file, int startPlaybackPosition, boolean autoplay) {
- Fragment mediaFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition, autoplay);
+ Fragment mediaFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition,
+ autoplay);
setSecondFragment(mediaFragment);
updateFragmentsVisibility(true);
- updateNavigationElementsInActionBar(file);
+ updateActionBarTitleAndHomeButton(file);
setFile(file);
}
* @param file {@link OCFile} to download and preview.
*/
public void startDownloadForPreview(OCFile file) {
- Fragment detailFragment = new FileDetailFragment(file, getAccount());
+ Fragment detailFragment = FileDetailFragment.newInstance(file, getAccount());
setSecondFragment(detailFragment);
mWaitingToPreview = file;
requestForDownload();
updateFragmentsVisibility(true);
- updateNavigationElementsInActionBar(file);
+ updateActionBarTitleAndHomeButton(file);
setFile(file);
}
private void sortByName(boolean ascending){
getListOfFilesFragment().sortByName(ascending);
}
+
+ public void allFilesOption() {
+ browseToRoot();
+ }
}
package com.owncloud.android.ui.activity;
-import java.io.IOException;
-
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AuthenticatorException;
-import android.accounts.OperationCanceledException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
+import android.support.v7.app.ActionBar;
import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
+import android.view.Window;
import android.widget.Button;
import android.widget.Toast;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
-import com.actionbarsherlock.view.Window;
-import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.common.OwnCloudAccount;
if (!stateWasRecovered) {
OCFileListFragment listOfFolders = getListOfFilesFragment();
- listOfFolders.listDirectory(folder);
+ listOfFolders.listDirectory(folder/*, false*/);
startSyncFolderOperation(folder, false);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getSherlock().getMenuInflater();
+ MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
menu.findItem(R.id.action_upload).setVisible(false);
- menu.findItem(R.id.action_settings).setVisible(false);
- menu.findItem(R.id.action_sync_account).setVisible(false);
- menu.findItem(R.id.action_logger).setVisible(false);
menu.findItem(R.id.action_sort).setVisible(false);
return true;
}
protected void refreshListOfFilesFragment() {
OCFileListFragment fileListFragment = getListOfFilesFragment();
- if (fileListFragment != null) {
+ if (fileListFragment != null) {
fileListFragment.listDirectory();
+ // TODO Enable when "On Device" is recovered ?
+ // fileListFragment.listDirectory(false);
}
}
if (listOfFiles != null) { // should never be null, indeed
OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
listOfFiles.listDirectory(root);
+ // TODO Enable when "On Device" is recovered ?
+ // listOfFiles.listDirectory(root, false);
setFile(listOfFiles.getCurrentFile());
updateNavigationElementsInActionBar();
startSyncFolderOperation(root, false);
OCFileListFragment fileListFragment = getListOfFilesFragment();
if (fileListFragment != null) {
fileListFragment.listDirectory(currentDir);
+ // TODO Enable when "On Device" is recovered ?
+ // fileListFragment.listDirectory(currentDir, false);
}
}
setFile(currentFile);
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.ActionBarActivity;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.owncloud.android.R;
import com.owncloud.android.utils.DisplayUtils;
* Added to show explanations for notifications when the user clicks on them, and there no place
* better to show them.
*/
-public class GenericExplanationActivity extends SherlockFragmentActivity {
+public class GenericExplanationActivity extends ActionBarActivity {
- public static final String EXTRA_LIST = GenericExplanationActivity.class.getCanonicalName() + ".EXTRA_LIST";
- public static final String EXTRA_LIST_2 = GenericExplanationActivity.class.getCanonicalName() + ".EXTRA_LIST_2";
- public static final String MESSAGE = GenericExplanationActivity.class.getCanonicalName() + ".MESSAGE";
+ public static final String EXTRA_LIST = GenericExplanationActivity.class.getCanonicalName() +
+ ".EXTRA_LIST";
+ public static final String EXTRA_LIST_2 = GenericExplanationActivity.class.getCanonicalName() +
+ ".EXTRA_LIST_2";
+ public static final String MESSAGE = GenericExplanationActivity.class.getCanonicalName() +
+ ".MESSAGE";
@Override
ListView listView = (ListView) findViewById(R.id.list);
if (list != null && list.size() > 0) {
- //ListAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
+ //ListAdapter adapter = new ArrayAdapter<String>(this,
+ // android.R.layout.simple_list_item_1, list);
ListAdapter adapter = new ExplanationListAdapterView(this, list, list2);
listView.setAdapter(adapter);
} else {
ArrayList<String> mList;
ArrayList<String> mList2;
- ExplanationListAdapterView(Context context, ArrayList<String> list, ArrayList<String> list2) {
+ ExplanationListAdapterView(Context context, ArrayList<String> list,
+ ArrayList<String> list2) {
super(context, android.R.layout.two_line_list_item, android.R.id.text1, list);
mList = list;
mList2 = list2;
public View getView (int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if (view != null) {
- if (mList2 != null && mList2.size() > 0 && position >= 0 && position < mList2.size()) {
+ if (mList2 != null && mList2.size() > 0 && position >= 0 &&
+ position < mList2.size()) {
TextView text2 = (TextView) view.findViewById(android.R.id.text2);
if (text2 != null) {
text2.setText(mList2.get(position));
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.ActionBarActivity;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.dialog.LoadingDialog;
import com.owncloud.android.utils.FileStorageUtils;
-public class LogHistoryActivity extends SherlockFragmentActivity {
+public class LogHistoryActivity extends ActionBarActivity {
private static final String MAIL_ATTACHMENT_TYPE = "text/plain";
setContentView(R.layout.log_send_file);
setTitle(getText(R.string.actionbar_logger));
- ActionBar actionBar = getSherlock().getActionBar();
+ ActionBar actionBar = getSupportActionBar();
actionBar.setIcon(DisplayUtils.getSeasonalIconId());
actionBar.setDisplayHomeAsUpEnabled(true);
Button deleteHistoryButton = (Button) findViewById(R.id.deleteLogHistoryButton);
}
@Override
- public boolean onMenuItemSelected(int featureId, MenuItem item) {
- super.onMenuItemSelected(featureId, item);
+ public boolean onOptionsItemSelected(MenuItem item) {
+ super.onOptionsItemSelected(item);
switch (item.getItemId()) {
- case android.R.id.home:
- finish();
- break;
- default:
- return false;
+ case android.R.id.home:
+ finish();
+ break;
+ default:
+ return false;
}
return true;
}
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author Bartek Przybylski
+ * @author masensio
+ * @author David A. Velasco
+ * Copyright (C) 2011 Bartek Przybylski
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.ui.activity;
+
+import java.util.Arrays;
+
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.ActionBarActivity;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.owncloud.android.R;
+import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.utils.DisplayUtils;
+
+public class PassCodeActivity extends ActionBarActivity {
+
+
+ private static final String TAG = PassCodeActivity.class.getSimpleName();
+
+ public final static String ACTION_ENABLE = PassCodeActivity.class.getCanonicalName() +
+ ".ENABLE";
+ public final static String ACTION_DISABLE = PassCodeActivity.class.getCanonicalName() +
+ ".DISABLE";
+ public final static String ACTION_REQUEST = PassCodeActivity.class.getCanonicalName() +
+ ".REQUEST";
+
+ private Button mBCancel;
+ private TextView mPassCodeHdr;
+ private TextView mPassCodeHdrExplanation;
+ private EditText[] mPassCodeEditTexts = new EditText[4];
+
+ private String [] mPassCodeDigits = {"","","",""};
+ private boolean mConfirmingPassCode = false;
+
+ private boolean mBChange = true; // to control that only one blocks jump
+
+
+ /**
+ * Initializes the activity.
+ *
+ * An intent with a valid ACTION is expected; if none is found, an
+ * {@link IllegalArgumentException} will be thrown.
+ *
+ * @param savedInstanceState Previously saved state - irrelevant in this case
+ */
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.passcodelock);
+
+ mBCancel = (Button) findViewById(R.id.cancel);
+ mPassCodeHdr = (TextView) findViewById(R.id.header);
+ mPassCodeHdrExplanation = (TextView) findViewById(R.id.explanation);
+ mPassCodeEditTexts[0] = (EditText) findViewById(R.id.txt0);
+ mPassCodeEditTexts[0].requestFocus();
+ getWindow().setSoftInputMode(
+ android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ mPassCodeEditTexts[1] = (EditText) findViewById(R.id.txt1);
+ mPassCodeEditTexts[2] = (EditText) findViewById(R.id.txt2);
+ mPassCodeEditTexts[3] = (EditText) findViewById(R.id.txt3);
+
+ if (ACTION_REQUEST.equals(getIntent().getAction())) {
+ /// this is a pass code request; the user has to input the right value
+ mPassCodeHdr.setText(R.string.pass_code_enter_pass_code);
+ mPassCodeHdrExplanation.setVisibility(View.INVISIBLE);
+ setCancelButtonEnabled(false); // no option to cancel
+
+ } else if (ACTION_ENABLE.equals(getIntent().getAction())) {
+ /// pass code preference has just been activated in Preferences;
+ // will receive and confirm pass code value
+ mPassCodeHdr.setText(R.string.pass_code_configure_your_pass_code);
+ //mPassCodeHdr.setText(R.string.pass_code_enter_pass_code);
+ // TODO choose a header, check iOS
+ mPassCodeHdrExplanation.setVisibility(View.VISIBLE);
+ setCancelButtonEnabled(true);
+
+ } else if (ACTION_DISABLE.equals(getIntent().getAction())) {
+ /// pass code preference has just been disabled in Preferences;
+ // will confirm user knows pass code, then remove it
+ mPassCodeHdr.setText(R.string.pass_code_remove_your_pass_code);
+ mPassCodeHdrExplanation.setVisibility(View.INVISIBLE);
+ setCancelButtonEnabled(true);
+
+ } else {
+ throw new IllegalArgumentException("A valid ACTION is needed in the Intent passed to "
+ + TAG);
+ }
+
+ setTextListeners();
+
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setIcon(DisplayUtils.getSeasonalIconId());
+ }
+
+
+ /**
+ * Enables or disables the cancel button to allow the user interrupt the ACTION
+ * requested to the activity.
+ *
+ * @param enabled 'True' makes the cancel button available, 'false' hides it.
+ */
+ protected void setCancelButtonEnabled(boolean enabled){
+ if(enabled){
+ mBCancel.setVisibility(View.VISIBLE);
+ mBCancel.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ revertActionAndExit();
+ }
+ });
+ } else {
+ mBCancel.setVisibility(View.GONE);
+ mBCancel.setVisibility(View.INVISIBLE);
+ mBCancel.setOnClickListener(null);
+ }
+ }
+
+
+ /**
+ * Binds the appropiate listeners to the input boxes receiving each digit of the pass code.
+ */
+ protected void setTextListeners() {
+
+ /// First input field
+ mPassCodeEditTexts[0].addTextChangedListener(new PassCodeDigitTextWatcher(0, false));
+
+
+ /*------------------------------------------------
+ * SECOND BOX
+ -------------------------------------------------*/
+ mPassCodeEditTexts[1].addTextChangedListener(new PassCodeDigitTextWatcher(1, false));
+
+ mPassCodeEditTexts[1].setOnKeyListener(new View.OnKeyListener() {
+
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) { // TODO WIP: event should be
+ // used to control what's exactly happening with DEL, not any custom field...
+ mPassCodeEditTexts[0].setText("");
+ mPassCodeEditTexts[0].requestFocus();
+ if (!mConfirmingPassCode)
+ mPassCodeDigits[0] = "";
+ mBChange = false;
+
+ } else if (!mBChange) {
+ mBChange = true;
+ }
+ return false;
+ }
+ });
+
+ mPassCodeEditTexts[1].setOnFocusChangeListener(new View.OnFocusChangeListener() {
+
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ /// TODO WIP: should take advantage of hasFocus to reduce processing
+ if (mPassCodeEditTexts[0].getText().toString().equals("")) { // TODO WIP validation
+ // could be done in a global way, with a single OnFocusChangeListener for all the
+ // input fields
+ mPassCodeEditTexts[0].requestFocus();
+ }
+ }
+ });
+
+
+ /*------------------------------------------------
+ * THIRD BOX
+ -------------------------------------------------*/
+ mPassCodeEditTexts[2].addTextChangedListener(new PassCodeDigitTextWatcher(2, false));
+
+ mPassCodeEditTexts[2].setOnKeyListener(new View.OnKeyListener() {
+
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
+ mPassCodeEditTexts[1].requestFocus();
+ if (!mConfirmingPassCode)
+ mPassCodeDigits[1] = "";
+ mPassCodeEditTexts[1].setText("");
+ mBChange = false;
+
+ } else if (!mBChange) {
+ mBChange = true;
+
+ }
+ return false;
+ }
+ });
+
+ mPassCodeEditTexts[2].setOnFocusChangeListener(new View.OnFocusChangeListener() {
+
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (mPassCodeEditTexts[0].getText().toString().equals("")) {
+ mPassCodeEditTexts[0].requestFocus();
+ } else if (mPassCodeEditTexts[1].getText().toString().equals("")) {
+ mPassCodeEditTexts[1].requestFocus();
+ }
+ }
+ });
+
+
+ /*------------------------------------------------
+ * FOURTH BOX
+ -------------------------------------------------*/
+ mPassCodeEditTexts[3].addTextChangedListener(new PassCodeDigitTextWatcher(3, true));
+
+ mPassCodeEditTexts[3].setOnKeyListener(new View.OnKeyListener() {
+
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
+ mPassCodeEditTexts[2].requestFocus();
+ if (!mConfirmingPassCode)
+ mPassCodeDigits[2] = "";
+ mPassCodeEditTexts[2].setText("");
+ mBChange = false;
+
+ } else if (!mBChange) {
+ mBChange = true;
+ }
+ return false;
+ }
+ });
+
+ mPassCodeEditTexts[3].setOnFocusChangeListener(new View.OnFocusChangeListener() {
+
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+
+ if (mPassCodeEditTexts[0].getText().toString().equals("")) {
+ mPassCodeEditTexts[0].requestFocus();
+ } else if (mPassCodeEditTexts[1].getText().toString().equals("")) {
+ mPassCodeEditTexts[1].requestFocus();
+ } else if (mPassCodeEditTexts[2].getText().toString().equals("")) {
+ mPassCodeEditTexts[2].requestFocus();
+ }
+
+ }
+ });
+
+ } // end setTextListener
+
+
+ /**
+ * Processes the pass code entered by the user just after the last digit was in.
+ *
+ * Takes into account the action requested to the activity, the currently saved pass code and
+ * the previously typed pass code, if any.
+ */
+ private void processFullPassCode() {
+ if (ACTION_REQUEST.equals(getIntent().getAction())) {
+ if (checkPassCode()) {
+ /// pass code accepted in request, user is allowed to access the app
+ finish();
+
+ } else {
+ showErrorAndRestart(R.string.pass_code_wrong, R.string.pass_code_enter_pass_code,
+ View.INVISIBLE);
+ }
+
+ } else if (ACTION_DISABLE.equals(getIntent().getAction())) {
+ if (checkPassCode()) {
+ /// pass code accepted when disabling, pass code is removed
+ SharedPreferences.Editor appPrefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext()).edit();
+ appPrefs.putBoolean("set_pincode", false); // TODO remove; this should be
+ // unnecessary, was done before entering in the activity
+ appPrefs.commit();
+
+ Toast.makeText(PassCodeActivity.this, R.string.pass_code_removed, Toast.LENGTH_LONG).show();
+ finish();
+
+ } else {
+ showErrorAndRestart(R.string.pass_code_wrong, R.string.pass_code_enter_pass_code,
+ View.INVISIBLE);
+ }
+
+ } else if (ACTION_ENABLE.equals(getIntent().getAction())) {
+ /// enabling pass code
+ if (!mConfirmingPassCode) {
+ requestPassCodeConfirmation();
+
+ } else if (confirmPassCode()) {
+ /// confirmed: user typed the same pass code twice
+ savePassCodeAndExit();
+
+ } else {
+ showErrorAndRestart(
+ R.string.pass_code_mismatch, R.string.pass_code_configure_your_pass_code, View.VISIBLE
+ );
+ }
+ }
+ }
+
+
+ private void showErrorAndRestart(int errorMessage, int headerMessage,
+ int explanationVisibility) {
+ Arrays.fill(mPassCodeDigits, null);
+ CharSequence errorSeq = getString(errorMessage);
+ Toast.makeText(this, errorSeq, Toast.LENGTH_LONG).show();
+ mPassCodeHdr.setText(headerMessage); // TODO check if really needed
+ mPassCodeHdrExplanation.setVisibility(explanationVisibility); // TODO check if really needed
+ clearBoxes();
+ }
+
+
+ /**
+ * Ask to the user for retyping the pass code just entered before saving it as the current pass
+ * code.
+ */
+ protected void requestPassCodeConfirmation(){
+ clearBoxes();
+ mPassCodeHdr.setText(R.string.pass_code_reenter_your_pass_code);
+ mPassCodeHdrExplanation.setVisibility(View.INVISIBLE);
+ mConfirmingPassCode = true;
+ }
+
+ /**
+ * Compares pass code entered by the user with the value currently saved in the app.
+ *
+ * @return 'True' if entered pass code equals to the saved one.
+ */
+ protected boolean checkPassCode(){
+ SharedPreferences appPrefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext());
+
+ String savedPassCodeDigits[] = new String[4];
+ savedPassCodeDigits[0] = appPrefs.getString("PrefPinCode1", null);
+ savedPassCodeDigits[1] = appPrefs.getString("PrefPinCode2", null);
+ savedPassCodeDigits[2] = appPrefs.getString("PrefPinCode3", null);
+ savedPassCodeDigits[3] = appPrefs.getString("PrefPinCode4", null);
+
+ boolean result = true;
+ for (int i = 0; i < mPassCodeDigits.length && result; i++) {
+ result = result && (mPassCodeDigits[i] != null) &&
+ mPassCodeDigits[i].equals(savedPassCodeDigits[i]);
+ }
+ return result;
+ }
+
+ /**
+ * Compares pass code retyped by the user in the input fields with the value entered just
+ * before.
+ *
+ * @return 'True' if retyped pass code equals to the entered before.
+ */
+ protected boolean confirmPassCode(){
+ mConfirmingPassCode = false;
+
+ boolean result = true;
+ for (int i = 0; i < mPassCodeEditTexts.length && result; i++) {
+ result = result &&
+ ((mPassCodeEditTexts[i].getText().toString()).equals(mPassCodeDigits[i]));
+ }
+ return result;
+ }
+
+ /**
+ * Sets the input fields to empty strings and puts the focus on the first one.
+ */
+ protected void clearBoxes(){
+ for (int i=0; i < mPassCodeEditTexts.length; i++) {
+ mPassCodeEditTexts[i].setText("");
+ }
+ mPassCodeEditTexts[0].requestFocus();
+ }
+
+ /**
+ * Overrides click on the BACK arrow to correctly cancel ACTION_ENABLE or ACTION_DISABLE, while
+ * preventing than ACTION_REQUEST may be worked around.
+ *
+ * @param keyCode Key code of the key that triggered the down event.
+ * @param event Event triggered.
+ * @return 'True' when the key event was processed by this method.
+ */
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event){
+ if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()== 0){
+ if (ACTION_ENABLE.equals(getIntent().getAction()) ||
+ ACTION_DISABLE.equals(getIntent().getAction())) {
+ revertActionAndExit();
+ }
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ /**
+ * Saves the pass code input by the user as the current pass code.
+ */
+ protected void savePassCodeAndExit() {
+ SharedPreferences.Editor appPrefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext()).edit();
+
+ appPrefs.putString("PrefPinCode1", mPassCodeDigits[0]);
+ appPrefs.putString("PrefPinCode2", mPassCodeDigits[1]);
+ appPrefs.putString("PrefPinCode3", mPassCodeDigits[2]);
+ appPrefs.putString("PrefPinCode4", mPassCodeDigits[3]);
+ appPrefs.putBoolean("set_pincode", true); /// TODO remove; unnecessary,
+ // Preferences did it before entering here
+ appPrefs.commit();
+
+ Toast.makeText(this, R.string.pass_code_stored, Toast.LENGTH_LONG).show();
+ finish();
+ }
+
+ /**
+ * Cancellation of ACTION_ENABLE or ACTION_DISABLE; reverts the enable or disable action done by
+ * {@link Preferences}, then finishes.
+ */
+ protected void revertActionAndExit() {
+ SharedPreferences.Editor appPrefsE = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext()).edit();
+
+ SharedPreferences appPrefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext());
+
+ boolean state = appPrefs.getBoolean("set_pincode", false);
+ appPrefsE.putBoolean("set_pincode", !state);
+ // TODO WIP: this is reverting the value of the preference because it was changed BEFORE
+ // entering
+ // TODO in this activity; was the PreferenceCheckBox in the caller who did it
+ appPrefsE.commit();
+ finish();
+ }
+
+
+ private class PassCodeDigitTextWatcher implements TextWatcher {
+
+ private int mIndex = -1;
+ private boolean mLastOne = false;
+
+ /**
+ * Constructor
+ *
+ * @param index Position in the pass code of the input field that will be bound to
+ * this watcher.
+ * @param lastOne 'True' means that watcher corresponds to the last position of the
+ * pass code.
+ */
+ public PassCodeDigitTextWatcher(int index, boolean lastOne) {
+ mIndex = index;
+ mLastOne = lastOne;
+ if (mIndex < 0) {
+ throw new IllegalArgumentException(
+ "Invalid index in " + PassCodeDigitTextWatcher.class.getSimpleName() +
+ " constructor"
+ );
+ }
+ }
+
+ private int next() {
+ return mLastOne ? 0 : mIndex + 1;
+ }
+
+ /**
+ * Performs several actions when the user types a digit in an input field:
+ * - saves the input digit to the state of the activity; this will allow retyping the
+ * pass code to confirm it.
+ * - moves the focus automatically to the next field
+ * - for the last field, triggers the processing of the full pass code
+ *
+ * @param s
+ */
+ @Override
+ public void afterTextChanged(Editable s) {
+ if (s.length() > 0) {
+ if (!mConfirmingPassCode) {
+ mPassCodeDigits[mIndex] = mPassCodeEditTexts[mIndex].getText().toString();
+ }
+ mPassCodeEditTexts[next()].requestFocus();
+
+ if (mLastOne) {
+ processFullPassCode();
+ }
+
+ } else {
+ Log_OC.d(TAG, "Text box " + mIndex + " was cleaned");
+ }
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ // nothing to do
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ // nothing to do
+ }
+
+ }
+
+
+}
+++ /dev/null
-/**
- * ownCloud Android client application
- *
- * Copyright (C) 2011 Bartek Przybylski
- * Copyright (C) 2015 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package com.owncloud.android.ui.activity;
-
-import java.util.Arrays;
-
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.owncloud.android.R;
-import com.owncloud.android.utils.DisplayUtils;
-
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
-import android.view.View.OnKeyListener;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
-
-public class PinCodeActivity extends SherlockFragmentActivity {
-
-
- public final static String EXTRA_ACTIVITY = "com.owncloud.android.ui.activity.PinCodeActivity.ACTIVITY";
- public final static String EXTRA_NEW_STATE = "com.owncloud.android.ui.activity.PinCodeActivity.NEW_STATE";
-
- private Button mBCancel;
- private TextView mPinHdr;
- private TextView mPinHdrExplanation;
- private EditText mText1;
- private EditText mText2;
- private EditText mText3;
- private EditText mText4;
-
- private String [] mTempText ={"","","",""};
-
- private String mActivity;
-
- private boolean mConfirmingPinCode = false;
- private boolean mPinCodeChecked = false;
- private boolean mNewPasswordEntered = false;
- private boolean mBChange = true; // to control that only one blocks jump
- //private int mTCounter ; // Count the number of attempts an user could introduce the PIN code
-
-
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.pincodelock);
-
- Intent intent = getIntent();
- mActivity = intent.getStringExtra(EXTRA_ACTIVITY);
-
- mBCancel = (Button) findViewById(R.id.cancel);
- mPinHdr = (TextView) findViewById(R.id.pinHdr);
- mPinHdrExplanation = (TextView) findViewById(R.id.pinHdrExpl);
- mText1 = (EditText) findViewById(R.id.txt1);
- mText1.requestFocus();
- getWindow().setSoftInputMode(android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
- mText2 = (EditText) findViewById(R.id.txt2);
- mText3 = (EditText) findViewById(R.id.txt3);
- mText4 = (EditText) findViewById(R.id.txt4);
-
- SharedPreferences appPrefs = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext());
-
-
- // Not PIN Code defined yet.
- // In a previous version settings is allow from start
- if ( (appPrefs.getString("PrefPinCode1", null) == null ) ){
- setChangePincodeView(true);
- mPinCodeChecked = true;
- mNewPasswordEntered = true;
-
- }else{
-
- if (appPrefs.getBoolean("set_pincode", false)){
- // pincode activated
- if (mActivity.equals("preferences")){
- // PIN has been activated yet
- mPinHdr.setText(R.string.pincode_configure_your_pin);
- mPinHdrExplanation.setVisibility(View.VISIBLE);
- mPinCodeChecked = true ; // No need to check it
- setChangePincodeView(true);
- }else{
- // PIN active
- mBCancel.setVisibility(View.INVISIBLE);
- mBCancel.setVisibility(View.GONE);
- mPinHdr.setText(R.string.pincode_enter_pin_code);
- mPinHdrExplanation.setVisibility(View.INVISIBLE);
- setChangePincodeView(false);
- }
-
- }else {
- // pincode removal
- mPinHdr.setText(R.string.pincode_remove_your_pincode);
- mPinHdrExplanation.setVisibility(View.INVISIBLE);
- mPinCodeChecked = false;
- setChangePincodeView(true);
- }
-
- }
- setTextListeners();
-
- ActionBar actionBar = getSupportActionBar();
- actionBar.setIcon(DisplayUtils.getSeasonalIconId());
- }
-
-
-
- protected void setInitVars(){
- mConfirmingPinCode = false;
- mPinCodeChecked = false;
- mNewPasswordEntered = false;
-
- }
-
- protected void setInitView(){
- mBCancel.setVisibility(View.INVISIBLE);
- mBCancel.setVisibility(View.GONE);
- mPinHdr.setText(R.string.pincode_enter_pin_code);
- mPinHdrExplanation.setVisibility(View.INVISIBLE);
- }
-
-
- protected void setChangePincodeView(boolean state){
-
- if(state){
- mBCancel.setVisibility(View.VISIBLE);
- mBCancel.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
-
- SharedPreferences.Editor appPrefsE = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext()).edit();
-
- SharedPreferences appPrefs = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext());
-
- boolean state = appPrefs.getBoolean("set_pincode", false);
- appPrefsE.putBoolean("set_pincode",!state);
- appPrefsE.commit();
- setInitVars();
- finish();
- }
- });
- }
-
- }
-
-
-
- /*
- *
- */
- protected void setTextListeners(){
-
- /*------------------------------------------------
- * FIRST BOX
- -------------------------------------------------*/
-
- mText1.addTextChangedListener(new TextWatcher() {
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before,
- int count) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- if (s.length() > 0) {
- if (!mConfirmingPinCode){
- mTempText[0] = mText1.getText().toString();
-
- }
- mText2.requestFocus();
- }
- }
- });
-
-
-
- /*------------------------------------------------
- * SECOND BOX
- -------------------------------------------------*/
- mText2.addTextChangedListener(new TextWatcher() {
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before,
- int count) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- if (s.length() > 0) {
- if (!mConfirmingPinCode){
- mTempText[1] = mText2.getText().toString();
- }
-
- mText3.requestFocus();
- }
- }
- });
-
- mText2.setOnKeyListener(new OnKeyListener() {
-
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
-
- mText1.setText("");
- mText1.requestFocus();
- if (!mConfirmingPinCode)
- mTempText[0] = "";
- mBChange= false;
-
- }else if(!mBChange){
- mBChange=true;
-
- }
- return false;
- }
- });
-
- mText2.setOnFocusChangeListener(new OnFocusChangeListener() {
-
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- mText2.setCursorVisible(true);
- if (mText1.getText().toString().equals("")){
- mText2.setSelected(false);
- mText2.setCursorVisible(false);
- mText1.requestFocus();
- mText1.setSelected(true);
- mText1.setSelection(0);
- }
-
- }
- });
-
-
- /*------------------------------------------------
- * THIRD BOX
- -------------------------------------------------*/
- mText3.addTextChangedListener(new TextWatcher() {
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before,
- int count) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- if (s.length() > 0) {
- if (!mConfirmingPinCode){
- mTempText[2] = mText3.getText().toString();
- }
- mText4.requestFocus();
- }
- }
- });
-
- mText3.setOnKeyListener(new OnKeyListener() {
-
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
- mText2.requestFocus();
- if (!mConfirmingPinCode)
- mTempText[1] = "";
- mText2.setText("");
- mBChange= false;
-
- }else if(!mBChange){
- mBChange=true;
-
- }
- return false;
- }
- });
-
- mText3.setOnFocusChangeListener(new OnFocusChangeListener() {
-
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- mText3.setCursorVisible(true);
- if (mText1.getText().toString().equals("")){
- mText3.setSelected(false);
- mText3.setCursorVisible(false);
- mText1.requestFocus();
- mText1.setSelected(true);
- mText1.setSelection(0);
- }else if (mText2.getText().toString().equals("")){
- mText3.setSelected(false);
- mText3.setCursorVisible(false);
- mText2.requestFocus();
- mText2.setSelected(true);
- mText2.setSelection(0);
- }
-
- }
- });
-
- /*------------------------------------------------
- * FOURTH BOX
- -------------------------------------------------*/
- mText4.addTextChangedListener(new TextWatcher() {
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before,
- int count) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- if (s.length() > 0) {
-
- if (!mConfirmingPinCode){
- mTempText[3] = mText4.getText().toString();
- }
- mText1.requestFocus();
-
- if (!mPinCodeChecked){
- mPinCodeChecked = checkPincode();
- }
-
- if (mPinCodeChecked &&
- ( mActivity.equals("FileDisplayActivity") || mActivity.equals("PreviewImageActivity") ) ){
- finish();
- } else if (mPinCodeChecked){
-
- Intent intent = getIntent();
- String newState = intent.getStringExtra(EXTRA_NEW_STATE);
-
- if (newState.equals("false")){
- SharedPreferences.Editor appPrefs = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext()).edit();
- appPrefs.putBoolean("set_pincode",false);
- appPrefs.commit();
-
- setInitVars();
- pinCodeEnd(false);
-
- }else{
-
- if (!mConfirmingPinCode){
- pinCodeChangeRequest();
-
- } else {
- confirmPincode();
- }
- }
-
-
- }
- }
- }
- });
-
-
-
- mText4.setOnKeyListener(new OnKeyListener() {
-
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
- mText3.requestFocus();
- if (!mConfirmingPinCode)
- mTempText[2]="";
- mText3.setText("");
- mBChange= false;
-
- }else if(!mBChange){
- mBChange=true;
- }
- return false;
- }
- });
-
- mText4.setOnFocusChangeListener(new OnFocusChangeListener() {
-
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- mText4.setCursorVisible(true);
-
- if (mText1.getText().toString().equals("")){
- mText4.setSelected(false);
- mText4.setCursorVisible(false);
- mText1.requestFocus();
- mText1.setSelected(true);
- mText1.setSelection(0);
- }else if (mText2.getText().toString().equals("")){
- mText4.setSelected(false);
- mText4.setCursorVisible(false);
- mText2.requestFocus();
- mText2.setSelected(true);
- mText2.setSelection(0);
- }else if (mText3.getText().toString().equals("")){
- mText4.setSelected(false);
- mText4.setCursorVisible(false);
- mText3.requestFocus();
- mText3.setSelected(true);
- mText3.setSelection(0);
- }
-
- }
- });
-
-
-
- } // end setTextListener
-
-
- protected void pinCodeChangeRequest(){
-
- clearBoxes();
- mPinHdr.setText(R.string.pincode_reenter_your_pincode);
- mPinHdrExplanation.setVisibility(View.INVISIBLE);
- mConfirmingPinCode =true;
-
- }
-
-
- protected boolean checkPincode(){
-
-
- SharedPreferences appPrefs = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext());
-
- String pText1 = appPrefs.getString("PrefPinCode1", null);
- String pText2 = appPrefs.getString("PrefPinCode2", null);
- String pText3 = appPrefs.getString("PrefPinCode3", null);
- String pText4 = appPrefs.getString("PrefPinCode4", null);
-
- if ( mTempText[0].equals(pText1) &&
- mTempText[1].equals(pText2) &&
- mTempText[2].equals(pText3) &&
- mTempText[3].equals(pText4) ) {
-
- return true;
-
-
- }else {
- Arrays.fill(mTempText, null);
- AlertDialog aDialog = new AlertDialog.Builder(this).create();
- CharSequence errorSeq = getString(R.string.common_error);
- aDialog.setTitle(errorSeq);
- CharSequence cseq = getString(R.string.pincode_wrong);
- aDialog.setMessage(cseq);
- CharSequence okSeq = getString(R.string.common_ok);
- aDialog.setButton(okSeq, new DialogInterface.OnClickListener(){
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- return;
- }
-
- });
- aDialog.show();
- clearBoxes();
- mPinHdr.setText(R.string.pincode_enter_pin_code);
- mPinHdrExplanation.setVisibility(View.INVISIBLE);
- mNewPasswordEntered = true;
- mConfirmingPinCode = false;
-
- }
-
-
- return false;
- }
-
- protected void confirmPincode(){
-
- mConfirmingPinCode = false;
-
- String rText1 = mText1.getText().toString();
- String rText2 = mText2.getText().toString();
- String rText3 = mText3.getText().toString();
- String rText4 = mText4.getText().toString();
-
- if ( mTempText[0].equals(rText1) &&
- mTempText[1].equals(rText2) &&
- mTempText[2].equals(rText3) &&
- mTempText[3].equals(rText4) ) {
-
- savePincodeAndExit();
-
- } else {
-
- Arrays.fill(mTempText, null);
- AlertDialog aDialog = new AlertDialog.Builder(this).create();
- CharSequence errorSeq = getString(R.string.common_error);
- aDialog.setTitle(errorSeq);
- CharSequence cseq = getString(R.string.pincode_mismatch);
- aDialog.setMessage(cseq);
- CharSequence okSeq = getString(R.string.common_ok);
- aDialog.setButton(okSeq, new DialogInterface.OnClickListener(){
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- return;
- }
-
- });
- aDialog.show();
- mPinHdr.setText(R.string.pincode_configure_your_pin);
- mPinHdrExplanation.setVisibility(View.VISIBLE);
- clearBoxes();
- }
-
- }
-
-
- protected void pinCodeEnd(boolean state){
- AlertDialog aDialog = new AlertDialog.Builder(this).create();
-
- if (state){
- CharSequence saveSeq = getString(R.string.common_save_exit);
- aDialog.setTitle(saveSeq);
- CharSequence cseq = getString(R.string.pincode_stored);
- aDialog.setMessage(cseq);
-
- }else{
- CharSequence saveSeq = getString(R.string.common_save_exit);
- aDialog.setTitle(saveSeq);
- CharSequence cseq = getString(R.string.pincode_removed);
- aDialog.setMessage(cseq);
-
- }
- CharSequence okSeq = getString(R.string.common_ok);
- aDialog.setButton(okSeq, new DialogInterface.OnClickListener(){
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- finish();
- return;
- }
-
- });
- aDialog.show();
- }
-
- protected void savePincodeAndExit(){
- SharedPreferences.Editor appPrefs = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext()).edit();
-
- appPrefs.putString("PrefPinCode1", mTempText[0]);
- appPrefs.putString("PrefPinCode2",mTempText[1]);
- appPrefs.putString("PrefPinCode3", mTempText[2]);
- appPrefs.putString("PrefPinCode4", mTempText[3]);
- appPrefs.putBoolean("set_pincode",true);
- appPrefs.commit();
-
- pinCodeEnd(true);
-
-
-
- }
-
-
- protected void clearBoxes(){
-
- mText1.setText("");
- mText2.setText("");
- mText3.setText("");
- mText4.setText("");
- mText1.requestFocus();
- }
-
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event){
- if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()== 0){
-
- if (mActivity.equals("preferences")){
- SharedPreferences.Editor appPrefsE = PreferenceManager
-
- .getDefaultSharedPreferences(getApplicationContext()).edit();
-
- SharedPreferences appPrefs = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext());
-
- boolean state = appPrefs.getBoolean("set_pincode", false);
- appPrefsE.putBoolean("set_pincode",!state);
- appPrefsE.commit();
- setInitVars();
- finish();
- }
- return true;
-
- }
-
- return super.onKeyDown(keyCode, event);
- }
-
-
-
-
-
-}
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
+//import android.support.v7.app.ActionBar;
+import android.app.ActionBar;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.SherlockPreferenceActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
+import com.owncloud.android.BuildConfig;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.ui.RadioButtonPreference;
import com.owncloud.android.utils.DisplayUtils;
-import java.io.File;
-
/**
* An Activity that allows the user to change the application's settings.
*/
-public class Preferences extends SherlockPreferenceActivity
+public class Preferences extends PreferenceActivity
implements AccountManagerCallback<Boolean>, ComponentsGetter {
private static final String TAG = "OwnCloudPreferences";
mDbHandler = new DbHandler(getBaseContext());
addPreferencesFromResource(R.xml.preferences);
- ActionBar actionBar = getSherlock().getActionBar();
- actionBar.setIcon(DisplayUtils.getSeasonalIconId());
- actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.setTitle(R.string.actionbar_settings);
+ // Set properties of Action Bar in an ugly workaround to build correctly without
+ // upgrading minSdk
+ // TODO : increase minSdk; scheduled for next realease, don't wont to mix with this US
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ ActionBar actionBar = getActionBar();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ actionBar.setIcon(DisplayUtils.getSeasonalIconId());
+ }
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setTitle(R.string.actionbar_settings);
+ } else {
+ setTitle(R.string.actionbar_settings);
+ }
// For adding content description tag to a title field in the action bar
int actionBarTitleId = getResources().getIdentifier("action_bar_title", "id", "android");
pCode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);
- i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "preferences");
- i.putExtra(PinCodeActivity.EXTRA_NEW_STATE, newValue.toString());
+ Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
+ Boolean enable = (Boolean) newValue;
+ i.setAction(
+ enable.booleanValue() ? PassCodeActivity.ACTION_ENABLE :
+ PassCodeActivity.ACTION_DISABLE
+ );
startActivity(i);
return true;
}
}
+
+ if (BuildConfig.DEBUG) {
+ Preference pLog = findPreference("log");
+ if (pLog != null ){
+ pLog.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ Intent loggerIntent = new Intent(getApplicationContext(),
+ LogHistoryActivity.class);
+ startActivity(loggerIntent);
+ return true;
+ }
+ });
+ }
+ }
-
boolean recommendEnabled = getResources().getBoolean(R.bool.recommend_enabled);
Preference pRecommend = findPreference("recommend");
if (pRecommend != null){
String appName = getString(R.string.app_name);
String downloadUrl = getString(R.string.url_app_download);
- Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(Preferences.this);
- String username = currentAccount.name.substring(0, currentAccount.name.lastIndexOf('@'));
+ Account currentAccount = AccountUtils.
+ getCurrentOwnCloudAccount(Preferences.this);
+ String username = currentAccount.name.substring(0,
+ currentAccount.name.lastIndexOf('@'));
- String recommendSubject = String.format(getString(R.string.recommend_subject), appName);
+ String recommendSubject = String.format(getString(R.string.recommend_subject),
+ appName);
String recommendText = String.format(getString(R.string.recommend_text),
- appName, downloadUrl, username);
+ appName, downloadUrl);
intent.putExtra(Intent.EXTRA_SUBJECT, recommendSubject);
intent.putExtra(Intent.EXTRA_TEXT, recommendText);
});
}
- mPrefInstantUploadCategory = (PreferenceCategory) findPreference("instant_uploading_category");
+ mPrefInstantUploadCategory =
+ (PreferenceCategory) findPreference("instant_uploading_category");
mPrefInstantUploadPathWiFi = findPreference("instant_upload_on_wifi");
mPrefInstantUpload = findPreference("instant_uploading");
mUploadVideoPath += OCFile.PATH_SEPARATOR;
}
Intent intent = new Intent(Preferences.this, UploadPathActivity.class);
- intent.putExtra(UploadPathActivity.KEY_INSTANT_UPLOAD_PATH, mUploadVideoPath);
+ intent.putExtra(UploadPathActivity.KEY_INSTANT_UPLOAD_PATH,
+ mUploadVideoPath);
startActivityForResult(intent, ACTION_SELECT_UPLOAD_VIDEO_PATH);
return true;
}
}
@Override
- protected void onPause() {
- super.onPause();
- }
-
- @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
// Filter for only showing contextual menu when long press on the
Account a = AccountUtils.getCurrentOwnCloudAccount(this);
String accountName = "";
if (a == null) {
- Account[] accounts = AccountManager.get(this).getAccountsByType(MainApp.getAccountType());
+ Account[] accounts = AccountManager.get(this)
+ .getAccountsByType(MainApp.getAccountType());
if (accounts.length != 0)
accountName = accounts[0].name;
AccountUtils.setCurrentOwnCloudAccount(this, accountName);
@Override
protected void onResume() {
super.onResume();
- SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+ SharedPreferences appPrefs =
+ PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
boolean state = appPrefs.getBoolean("set_pincode", false);
pCode.setChecked(state);
if (requestCode == ACTION_SELECT_UPLOAD_PATH && resultCode == RESULT_OK){
- OCFile folderToUpload = (OCFile) data.getParcelableExtra(UploadPathActivity.EXTRA_FOLDER);
+ OCFile folderToUpload =
+ (OCFile) data.getParcelableExtra(UploadPathActivity.EXTRA_FOLDER);
mUploadPath = folderToUpload.getRemotePath();
} else if (requestCode == ACTION_SELECT_UPLOAD_VIDEO_PATH && resultCode == RESULT_OK){
- OCFile folderToUploadVideo = (OCFile) data.getParcelableExtra(UploadPathActivity.EXTRA_FOLDER);
+ OCFile folderToUploadVideo =
+ (OCFile) data.getParcelableExtra(UploadPathActivity.EXTRA_FOLDER);
mUploadVideoPath = folderToUploadVideo.getRemotePath();
AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE);
Account accounts[] = am.getAccountsByType(MainApp.getAccountType());
for (Account a : accounts) {
- RadioButtonPreference p = (RadioButtonPreference) findPreference(a.name);
+ RadioButtonPreference p =
+ (RadioButtonPreference) findPreference(a.name);
if (key.equals(a.name)) {
boolean accountChanged = !p.isChecked();
p.setChecked(true);
FileDisplayActivity.class
);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
} else {
finish();
@Override
public boolean onPreferenceClick(Preference preference) {
AccountManager am = AccountManager.get(getApplicationContext());
- am.addAccount(MainApp.getAccountType(), null, null, null, Preferences.this, null, null);
+ am.addAccount(MainApp.getAccountType(), null, null, null, Preferences.this,
+ null, null);
return true;
}
});
* Load upload path set on preferences
*/
private void loadInstantUploadPath() {
- SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+ SharedPreferences appPrefs =
+ PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
mUploadPath = appPrefs.getString("instant_upload_path", getString(R.string.instant_upload_path));
mPrefInstantUploadPath.setSummary(mUploadPath);
}
* Save the "Instant Upload Path" on preferences
*/
private void saveInstantUploadPathOnPreferences() {
- SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+ SharedPreferences appPrefs =
+ PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = appPrefs.edit();
editor.putString("instant_upload_path", mUploadPath);
editor.commit();
* Load upload video path set on preferences
*/
private void loadInstantUploadVideoPath() {
- SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+ SharedPreferences appPrefs =
+ PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
mUploadVideoPath = appPrefs.getString("instant_video_upload_path", getString(R.string.instant_upload_path));
mPrefInstantVideoUploadPath.setSummary(mUploadVideoPath);
}
* Save the "Instant Video Upload Path" on preferences
*/
private void saveInstantUploadVideoPathOnPreferences() {
- SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+ SharedPreferences appPrefs =
+ PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = appPrefs.edit();
editor.putString("instant_video_upload_path", mUploadVideoPath);
editor.commit();
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.DialogFragment;
+import android.support.v7.app.ActionBar;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.ActionBar.OnNavigationListener;
-import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
*/
public class UploadFilesActivity extends FileActivity implements
- LocalFileListFragment.ContainerActivity, OnNavigationListener, OnClickListener, ConfirmationDialogFragmentListener {
+ LocalFileListFragment.ContainerActivity, ActionBar.OnNavigationListener,
+ OnClickListener, ConfirmationDialogFragmentListener {
private ArrayAdapter<String> mDirectories;
private File mCurrentDir = null;
private Account mAccountOnCreation;
private DialogFragment mCurrentDialog;
- public static final String EXTRA_CHOSEN_FILES = UploadFilesActivity.class.getCanonicalName() + ".EXTRA_CHOSEN_FILES";
+ public static final String EXTRA_CHOSEN_FILES =
+ UploadFilesActivity.class.getCanonicalName() + ".EXTRA_CHOSEN_FILES";
public static final int RESULT_OK_AND_MOVE = RESULT_FIRST_USER;
- private static final String KEY_DIRECTORY_PATH = UploadFilesActivity.class.getCanonicalName() + ".KEY_DIRECTORY_PATH";
+ private static final String KEY_DIRECTORY_PATH =
+ UploadFilesActivity.class.getCanonicalName() + ".KEY_DIRECTORY_PATH";
private static final String TAG = "UploadFilesActivity";
private static final String WAIT_DIALOG_TAG = "WAIT";
private static final String QUERY_TO_MOVE_DIALOG_TAG = "QUERY_TO_MOVE";
super.onCreate(savedInstanceState);
if(savedInstanceState != null) {
- mCurrentDir = new File(savedInstanceState.getString(UploadFilesActivity.KEY_DIRECTORY_PATH));
+ mCurrentDir = new File(savedInstanceState.getString(
+ UploadFilesActivity.KEY_DIRECTORY_PATH));
} else {
mCurrentDir = Environment.getExternalStorageDirectory();
}
/// USER INTERFACE
// Drop-down navigation
- mDirectories = new CustomArrayAdapter<String>(this, R.layout.sherlock_spinner_dropdown_item);
+ mDirectories = new CustomArrayAdapter<String>(this,
+ R.layout.support_simple_spinner_dropdown_item);
File currDir = mCurrentDir;
while(currDir != null && currDir.getParentFile() != null) {
mDirectories.add(currDir.getName());
// Inflate and set the layout view
setContentView(R.layout.upload_files_layout);
- mFileListFragment = (LocalFileListFragment) getSupportFragmentManager().findFragmentById(R.id.local_files_list);
+ mFileListFragment = (LocalFileListFragment)
+ getSupportFragmentManager().findFragmentById(R.id.local_files_list);
// Set input controllers
// Action bar setup
ActionBar actionBar = getSupportActionBar();
actionBar.setIcon(DisplayUtils.getSeasonalIconId());
- actionBar.setHomeButtonEnabled(true); // mandatory since Android ICS, according to the official documentation
+ actionBar.setHomeButtonEnabled(true); // mandatory since Android ICS, according to the
+ // official documentation
actionBar.setDisplayHomeAsUpEnabled(mCurrentDir != null && mCurrentDir.getName() != null);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
@Override
protected void onSaveInstanceState(Bundle outState) {
- // responsibility of restore is preferred in onCreate() before than in onRestoreInstanceState when there are Fragments involved
+ // responsibility of restore is preferred in onCreate() before than in
+ // onRestoreInstanceState when there are Fragments involved
Log_OC.d(TAG, "onSaveInstanceState() start");
super.onSaveInstanceState(outState);
outState.putString(UploadFilesActivity.KEY_DIRECTORY_PATH, mCurrentDir.getAbsolutePath());
File localFile = new File(localPath);
total += localFile.length();
}
- return (FileStorageUtils.getUsableSpace(mAccountOnCreation.name) >= total);
+ return (new Boolean(FileStorageUtils.getUsableSpace(mAccountOnCreation.name) >= total));
}
/**
finish();
} else {
- // show a dialog to query the user if wants to move the selected files to the ownCloud folder instead of copying
+ // show a dialog to query the user if wants to move the selected files
+ // to the ownCloud folder instead of copying
String[] args = {getString(R.string.app_name)};
- ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_query_move_foreign_files, args, R.string.common_yes, -1, R.string.common_no);
+ ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(
+ R.string.upload_query_move_foreign_files, args, R.string.common_yes, -1, R.string.common_no
+ );
dialog.setOnConfirmationListener(UploadFilesActivity.this);
dialog.show(getSupportFragmentManager(), QUERY_TO_MOVE_DIALOG_TAG);
}
public void onConfirmation(String callerTag) {
Log_OC.d(TAG, "Positive button in dialog was clicked; dialog tag is " + callerTag);
if (callerTag.equals(QUERY_TO_MOVE_DIALOG_TAG)) {
- // return the list of selected files to the caller activity (success), signaling that they should be moved to the ownCloud folder, instead of copied
+ // return the list of selected files to the caller activity (success),
+ // signaling that they should be moved to the ownCloud folder, instead of copied
Intent data = new Intent();
data.putExtra(EXTRA_CHOSEN_FILES, mFileListFragment.getCheckedFilePaths());
setResult(RESULT_OK_AND_MOVE, data);
package com.owncloud.android.ui.activity;
import android.accounts.Account;
-
import android.os.Bundle;
import android.view.View.OnClickListener;
if (!stateWasRecovered) {
OCFileListFragment listOfFolders = getListOfFilesFragment();
- listOfFolders.listDirectory(folder);
+ // TODO Enable when "On Device" is recovered ?
+ listOfFolders.listDirectory(folder/*, false*/);
startSyncFolderOperation(folder, false);
}
* ownCloud Android client application
*
* @author Bartek Przybylski
+ * @author masensio
* Copyright (C) 2012 Bartek Przybylski
* Copyright (C) 2015 ownCloud Inc.
*
import java.util.Stack;
import java.util.Vector;
+
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.AlertDialog;
import android.os.Bundle;
import android.os.Parcelable;
import android.preference.PreferenceManager;
+import android.provider.MediaStore;
import android.provider.MediaStore.Audio;
import android.provider.MediaStore.Images;
import android.provider.MediaStore.Video;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v7.app.ActionBar;
+import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.SimpleAdapter;
import android.widget.Toast;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountAuthenticator;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileUploader;
+import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
-import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.operations.CreateFolderOperation;
import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
+import com.owncloud.android.ui.dialog.LoadingDialog;
+import com.owncloud.android.utils.CopyTmpFileAsyncTask;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.ErrorMessageAdapter;
* This can be used to upload things to an ownCloud instance.
*/
public class Uploader extends FileActivity
- implements OnItemClickListener, android.view.View.OnClickListener {
+ implements OnItemClickListener, android.view.View.OnClickListener,
+ CopyTmpFileAsyncTask.OnCopyTmpFileTaskListener {
private static final String TAG = Uploader.class.getSimpleName();
private String mUploadPath;
private OCFile mFile;
private boolean mAccountSelected;
+ private boolean mAccountSelectionShowing;
+
+ private ArrayList<String> mRemoteCacheData;
+ private int mNumCacheFile;
private final static int DIALOG_NO_ACCOUNT = 0;
private final static int DIALOG_WAITING = 1;
private final static String KEY_PARENTS = "PARENTS";
private final static String KEY_FILE = "FILE";
private final static String KEY_ACCOUNT_SELECTED = "ACCOUNT_SELECTED";
+ private final static String KEY_ACCOUNT_SELECTION_SHOWING = "ACCOUNT_SELECTION_SHOWING";
+ private final static String KEY_NUM_CACHE_FILE = "NUM_CACHE_FILE";
+ private final static String KEY_REMOTE_CACHE_DATA = "REMOTE_CACHE_DATA";
+
+ private static final String DIALOG_WAIT_COPY_FILE = "DIALOG_WAIT_COPY_FILE";
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState == null) {
mParents = new Stack<String>();
mAccountSelected = false;
+ mAccountSelectionShowing = false;
+ mNumCacheFile = 0;
+
+ // ArrayList for files with path in private storage
+ mRemoteCacheData = new ArrayList<String>();
} else {
mParents = (Stack<String>) savedInstanceState.getSerializable(KEY_PARENTS);
mFile = savedInstanceState.getParcelable(KEY_FILE);
mAccountSelected = savedInstanceState.getBoolean(KEY_ACCOUNT_SELECTED);
+ mAccountSelectionShowing = savedInstanceState.getBoolean(KEY_ACCOUNT_SELECTION_SHOWING);
+ mNumCacheFile = savedInstanceState.getInt(KEY_NUM_CACHE_FILE);
+ mRemoteCacheData = savedInstanceState.getStringArrayList(KEY_REMOTE_CACHE_DATA);
}
+
super.onCreate(savedInstanceState);
+ if (mAccountSelected) {
+ setAccount((Account) savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT));
+ }
+
+
ActionBar actionBar = getSupportActionBar();
actionBar.setIcon(DisplayUtils.getSeasonalIconId());
if (accounts.length == 0) {
Log_OC.i(TAG, "No ownCloud account is available");
showDialog(DIALOG_NO_ACCOUNT);
- } else if (accounts.length > 1 && !mAccountSelected) {
+ } else if (accounts.length > 1 && !mAccountSelected && !mAccountSelectionShowing) {
Log_OC.i(TAG, "More than one ownCloud is available");
showDialog(DIALOG_MULTIPLE_ACCOUNT);
+ mAccountSelectionShowing = true;
} else {
if (!savedAccount) {
setAccount(accounts[0]);
//outState.putParcelable(KEY_ACCOUNT, mAccount);
outState.putParcelable(KEY_FILE, mFile);
outState.putBoolean(KEY_ACCOUNT_SELECTED, mAccountSelected);
+ outState.putBoolean(KEY_ACCOUNT_SELECTION_SHOWING, mAccountSelectionShowing);
+ outState.putInt(KEY_NUM_CACHE_FILE, mNumCacheFile);
+ outState.putStringArrayList(KEY_REMOTE_CACHE_DATA, mRemoteCacheData);
+ outState.putParcelable(FileActivity.EXTRA_ACCOUNT, getAccount());
Log_OC.d(TAG, "onSaveInstanceState() end");
}
builder.setPositiveButton(R.string.uploader_wrn_no_account_setup_btn_text, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.ECLAIR_MR1) {
+ if (android.os.Build.VERSION.SDK_INT >
+ android.os.Build.VERSION_CODES.ECLAIR_MR1) {
// using string value since in API7 this
// constatn is not defined
// in API7 < this constatant is defined in
onAccountSet(mAccountWasRestored);
dialog.dismiss();
mAccountSelected = true;
+ mAccountSelectionShowing = false;
}
});
builder.setCancelable(true);
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
+ mAccountSelectionShowing = false;
dialog.cancel();
finish();
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// click on folder in the list
Log_OC.d(TAG, "on item click");
- Vector<OCFile> tmpfiles = getStorageManager().getFolderContent(mFile);
+ // TODO Enable when "On Device" is recovered ?
+ Vector<OCFile> tmpfiles = getStorageManager().getFolderContent(mFile /*, false*/);
if (tmpfiles.size() <= 0) return;
// filter on dirtype
Vector<OCFile> files = new Vector<OCFile>();
actionBar.setHomeButtonEnabled(notRoot);
String full_path = generatePath(mParents);
-
+
Log_OC.d(TAG, "Populating view with content of : " + full_path);
mFile = getStorageManager().getFileByPath(full_path);
if (mFile != null) {
- Vector<OCFile> files = getStorageManager().getFolderContent(mFile);
+ // TODO Enable when "On Device" is recovered ?
+ Vector<OCFile> files = getStorageManager().getFolderContent(mFile/*, false*/);
List<HashMap<String, Object>> data = new LinkedList<HashMap<String,Object>>();
for (OCFile f : files) {
HashMap<String, Object> h = new HashMap<String, Object>();
public void uploadFiles() {
try {
+ // ArrayList for files with path in external storage
ArrayList<String> local = new ArrayList<String>();
ArrayList<String> remote = new ArrayList<String>();
for (Parcelable mStream : mStreamsToUpload) {
Uri uri = (Uri) mStream;
- if (uri !=null) {
+ String data = null;
+ String filePath = "";
+
+ if (uri != null) {
if (uri.getScheme().equals("content")) {
-
- String mimeType = getContentResolver().getType(uri);
-
- if (mimeType.contains("image")) {
- String[] CONTENT_PROJECTION = { Images.Media.DATA,
- Images.Media.DISPLAY_NAME, Images.Media.MIME_TYPE,
- Images.Media.SIZE};
- Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
- null, null);
- c.moveToFirst();
- int index = c.getColumnIndex(Images.Media.DATA);
- String data = c.getString(index);
- local.add(data);
- remote.add(mUploadPath +
- c.getString(c.getColumnIndex(Images.Media.DISPLAY_NAME)));
-
- }
- else if (mimeType.contains("video")) {
- String[] CONTENT_PROJECTION = { Video.Media.DATA,
+ String mimeType = getContentResolver().getType(uri);
+
+ if (mimeType.contains("image")) {
+ String[] CONTENT_PROJECTION = { Images.Media.DATA,
+ Images.Media.DISPLAY_NAME, Images.Media.MIME_TYPE,
+ Images.Media.SIZE };
+ Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
+ null, null);
+ c.moveToFirst();
+ int index = c.getColumnIndex(Images.Media.DATA);
+ data = c.getString(index);
+ filePath = mUploadPath +
+ c.getString(c.getColumnIndex(Images.Media.DISPLAY_NAME));
+
+ } else if (mimeType.contains("video")) {
+ String[] CONTENT_PROJECTION = { Video.Media.DATA,
Video.Media.DISPLAY_NAME, Video.Media.MIME_TYPE,
Video.Media.SIZE, Video.Media.DATE_MODIFIED };
- Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
+ Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
null, null);
- c.moveToFirst();
- int index = c.getColumnIndex(Video.Media.DATA);
- String data = c.getString(index);
- local.add(data);
- remote.add(mUploadPath +
- c.getString(c.getColumnIndex(Video.Media.DISPLAY_NAME)));
+ c.moveToFirst();
+ int index = c.getColumnIndex(Video.Media.DATA);
+ data = c.getString(index);
+ filePath = mUploadPath +
+ c.getString(c.getColumnIndex(Video.Media.DISPLAY_NAME));
- }
- else if (mimeType.contains("audio")) {
- String[] CONTENT_PROJECTION = { Audio.Media.DATA,
+ } else if (mimeType.contains("audio")) {
+ String[] CONTENT_PROJECTION = { Audio.Media.DATA,
Audio.Media.DISPLAY_NAME, Audio.Media.MIME_TYPE,
Audio.Media.SIZE };
- Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
+ Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
null, null);
- c.moveToFirst();
- int index = c.getColumnIndex(Audio.Media.DATA);
- String data = c.getString(index);
- local.add(data);
- remote.add(mUploadPath +
- c.getString(c.getColumnIndex(Audio.Media.DISPLAY_NAME)));
-
- }
- else {
- String filePath = Uri.decode(uri.toString()).replace(uri.getScheme() +
- "://", "");
- // cut everything whats before mnt. It occurred to me that sometimes
- // apps send their name into the URI
- if (filePath.contains("mnt")) {
- String splitedFilePath[] = filePath.split("/mnt");
- filePath = splitedFilePath[1];
- }
- final File file = new File(filePath);
- local.add(file.getAbsolutePath());
- remote.add(mUploadPath + file.getName());
- }
-
+ c.moveToFirst();
+ int index = c.getColumnIndex(Audio.Media.DATA);
+ data = c.getString(index);
+ filePath = mUploadPath +
+ c.getString(c.getColumnIndex(Audio.Media.DISPLAY_NAME));
+
+ } else {
+ Cursor cursor = getContentResolver().query(uri,
+ new String[]{MediaStore.MediaColumns.DISPLAY_NAME},
+ null, null, null);
+ cursor.moveToFirst();
+ int nameIndex = cursor.getColumnIndex(cursor.getColumnNames()[0]);
+ if (nameIndex >= 0) {
+ filePath = mUploadPath + cursor.getString(nameIndex);
+ }
+ }
+
} else if (uri.getScheme().equals("file")) {
- String filePath = Uri.decode(uri.toString()).replace(uri.getScheme() +
+ filePath = Uri.decode(uri.toString()).replace(uri.getScheme() +
"://", "");
if (filePath.contains("mnt")) {
String splitedFilePath[] = filePath.split("/mnt");
filePath = splitedFilePath[1];
}
final File file = new File(filePath);
- local.add(file.getAbsolutePath());
- remote.add(mUploadPath + file.getName());
+ data = file.getAbsolutePath();
+ filePath = mUploadPath + file.getName();
}
else {
throw new SecurityException();
}
+ if (data == null) {
+ mRemoteCacheData.add(filePath);
+ CopyTmpFileAsyncTask copyTask = new CopyTmpFileAsyncTask(this);
+ Object[] params = { uri, filePath, mRemoteCacheData.size()-1,
+ getAccount().name, getContentResolver()};
+ mNumCacheFile++;
+ showWaitingCopyDialog();
+ copyTask.execute(params);
+ } else {
+ remote.add(filePath);
+ local.add(data);
+ }
}
else {
throw new SecurityException();
}
-
- Intent intent = new Intent(getApplicationContext(), FileUploader.class);
- intent.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_MULTIPLE_FILES);
- intent.putExtra(FileUploader.KEY_LOCAL_FILE, local.toArray(new String[local.size()]));
- intent.putExtra(FileUploader.KEY_REMOTE_FILE,
- remote.toArray(new String[remote.size()]));
- intent.putExtra(FileUploader.KEY_ACCOUNT, getAccount());
- startService(intent);
- //Save the path to shared preferences
- SharedPreferences.Editor appPrefs = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext()).edit();
- appPrefs.putString("last_upload_path", mUploadPath);
- appPrefs.apply();
+ Intent intent = new Intent(getApplicationContext(), FileUploader.class);
+ intent.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_MULTIPLE_FILES);
+ intent.putExtra(FileUploader.KEY_LOCAL_FILE, local.toArray(new String[local.size()]));
+ intent.putExtra(FileUploader.KEY_REMOTE_FILE,
+ remote.toArray(new String[remote.size()]));
+ intent.putExtra(FileUploader.KEY_ACCOUNT, getAccount());
+ startService(intent);
- finish();
+ //Save the path to shared preferences
+ SharedPreferences.Editor appPrefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext()).edit();
+ appPrefs.putString("last_upload_path", mUploadPath);
+ appPrefs.apply();
+
+ finish();
}
} catch (SecurityException e) {
// "/" equals root-directory
if(last_path.equals("/")) {
mParents.add("");
- }
- else{
+ } else{
String[] dir_names = last_path.split("/");
for (String dir : dir_names)
mParents.add(dir);
}
//Make sure that path still exists, if it doesn't pop the stack and try the previous path
- while(!getStorageManager().fileExists(generatePath(mParents)) && mParents.size() > 1){
- mParents.pop();
- }
+ while(!getStorageManager().fileExists(generatePath(mParents)) && mParents.size() > 1){
+ mParents.pop();
+ }
}
public boolean onOptionsItemSelected(MenuItem item) {
boolean retval = true;
switch (item.getItemId()) {
- case android.R.id.home: {
- if((mParents.size() > 1)) {
- onBackPressed();
- }
- break;
- }
- default:
- retval = super.onOptionsItemSelected(item);
+ case android.R.id.home:
+ if((mParents.size() > 1)) {
+ onBackPressed();
+ }
+ break;
+
+ default:
+ retval = super.onOptionsItemSelected(item);
}
return retval;
}
-
+
+ /**
+ * Process the result of CopyTmpFileAsyncTask
+ * @param result
+ * @param index
+ */
+ @Override
+ public void onTmpFileCopied(String result, int index) {
+ if (mNumCacheFile -- == 0) {
+ dismissWaitingCopyDialog();
+ }
+ if (result != null) {
+ Intent intent = new Intent(getApplicationContext(), FileUploader.class);
+ intent.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);
+ intent.putExtra(FileUploader.KEY_LOCAL_FILE, result);
+ intent.putExtra(FileUploader.KEY_REMOTE_FILE, mRemoteCacheData.get(index));
+ intent.putExtra(FileUploader.KEY_ACCOUNT, getAccount());
+ startService(intent);
+
+ } else {
+ String message = String.format(getString(R.string.uploader_error_forbidden_content),
+ getString(R.string.app_name));
+ Toast.makeText(this, message, Toast.LENGTH_LONG).show();
+ Log_OC.d(TAG, message);
+ }
+
+ }
+/**
+ * Show waiting for copy dialog
+ */
+ public void showWaitingCopyDialog() {
+ // Construct dialog
+ LoadingDialog loading = new LoadingDialog(
+ getResources().getString(R.string.wait_for_tmp_copy_from_private_storage));
+ FragmentManager fm = getSupportFragmentManager();
+ FragmentTransaction ft = fm.beginTransaction();
+ loading.show(ft, DIALOG_WAIT_COPY_FILE);
+
+ }
+
+
+ /**
+ * Dismiss waiting for copy dialog
+ */
+ public void dismissWaitingCopyDialog(){
+ Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_COPY_FILE);
+ if (frag != null) {
+ LoadingDialog loading = (LoadingDialog) frag;
+ loading.dismiss();
+ }
+ }
}
viewType = ViewType.GRID_ITEM;\r
}\r
\r
- // Create View\r
- switch (viewType){\r
- case GRID_IMAGE:\r
- view = inflator.inflate(R.layout.grid_image, null);\r
- break;\r
- case GRID_ITEM:\r
- view = inflator.inflate(R.layout.grid_item, null);\r
- break;\r
- case LIST_ITEM:\r
- view = inflator.inflate(R.layout.list_item, null);\r
- break;\r
+ // create view only if differs, otherwise reuse\r
+ if (convertView == null || (convertView != null && convertView.getTag() != viewType)) {\r
+ switch (viewType) {\r
+ case GRID_IMAGE:\r
+ view = inflator.inflate(R.layout.grid_image, null);\r
+ view.setTag(ViewType.GRID_IMAGE);\r
+ break;\r
+ case GRID_ITEM:\r
+ view = inflator.inflate(R.layout.grid_item, null);\r
+ view.setTag(ViewType.GRID_ITEM);\r
+ break;\r
+ case LIST_ITEM:\r
+ view = inflator.inflate(R.layout.list_item, null);\r
+ view.setTag(ViewType.LIST_ITEM);\r
+ break;\r
+ }\r
}\r
\r
view.invalidate();\r
* @param updatedStorageManager Optional updated storage manager; used to replace \r
* mStorageManager if is different (and not NULL)\r
*/\r
- public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager) {\r
+ public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager\r
+ /*, boolean onlyOnDevice*/) {\r
mFile = directory;\r
if (updatedStorageManager != null && updatedStorageManager != mStorageManager) {\r
mStorageManager = updatedStorageManager;\r
mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);\r
}\r
if (mStorageManager != null) {\r
- mFiles = mStorageManager.getFolderContent(mFile);\r
+ // TODO Enable when "On Device" is recovered ?\r
+ mFiles = mStorageManager.getFolderContent(mFile/*, onlyOnDevice*/);\r
mFilesOrig.clear();\r
mFilesOrig.addAll(mFiles);\r
\r
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.ui.adapter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class GroupAdapter {
+
+ public String string;
+ public final List<String> children = new ArrayList<String>();
+
+ public GroupAdapter(String string) {
+ this.string = string;
+ }
+
+}
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.ui.adapter;
+
+import android.app.Activity;
+import android.util.SparseArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.BaseExpandableListAdapter;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.owncloud.android.R;
+
+public class MyExpandableListAdapter extends BaseExpandableListAdapter {
+
+ private final SparseArray<GroupAdapter> groups;
+ public LayoutInflater inflater;
+ public Activity activity;
+
+ public MyExpandableListAdapter(Activity act, SparseArray<GroupAdapter> groups) {
+ activity = act;
+ this.groups = groups;
+ inflater = act.getLayoutInflater();
+
+ }
+
+
+ @Override
+ public Object getChild(int groupPosition, int childPosition) {
+ return groups.get(groupPosition).children.get(childPosition);
+ }
+
+ @Override
+ public long getChildId(int groupPosition, int childPosition) {
+ return 0;
+ }
+
+ @Override
+ public View getChildView(int groupPosition, final int childPosition,
+ boolean isLastChild, View convertView, ViewGroup parent) {
+ final String children = (String) getChild(groupPosition, childPosition);
+ TextView text = null;
+ if (convertView == null) {
+ convertView = inflater.inflate(R.layout.listrow_details, null);
+ }
+
+
+ text = (TextView) convertView.findViewById(R.id.textView1);
+ text.setText(children);
+ convertView.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(activity, children, Toast.LENGTH_SHORT).show();
+ }
+ });
+ return convertView;
+ }
+
+ @Override
+ public View getGroupView(int groupPosition, boolean isExpanded,
+ View convertView, ViewGroup parent) {
+ if (convertView == null) {
+ convertView = inflater.inflate(R.layout.listrow_group, null);
+ }
+
+ final GroupAdapter groupAdapter = (GroupAdapter) getGroup(groupPosition);
+ if (groupAdapter.children.size() == 0){
+ convertView.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(activity, groupAdapter.string, Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+ ((TextView) convertView).setText(groupAdapter.string);
+
+ return convertView;
+ }
+
+ @Override
+ public int getChildrenCount(int groupPosition) {
+ return groups.get(groupPosition).children.size();
+ }
+
+ @Override
+ public Object getGroup(int groupPosition) {
+ return groups.get(groupPosition);
+ }
+
+ @Override
+ public int getGroupCount() {
+ return groups.size();
+ }
+
+ @Override
+ public void onGroupCollapsed(int groupPosition) {
+ super.onGroupCollapsed(groupPosition);
+ }
+
+ @Override
+ public void onGroupExpanded(int groupPosition) {
+ super.onGroupExpanded(groupPosition);
+ }
+
+ @Override
+ public long getGroupId(int groupPosition) {
+ return 0;
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return false;
+ }
+
+ @Override
+ public boolean isChildSelectable(int groupPosition, int childPosition) {
+ return false;
+ }
+}
\ No newline at end of file
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author tobiasKaminsky
+ * @author masensio
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.ui.adapter;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.owncloud.android.MainApp;
+import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.ui.NavigationDrawerItem;
+import com.owncloud.android.ui.activity.FileActivity;
+
+import java.util.ArrayList;
+
+public class NavigationDrawerListAdapter extends BaseAdapter {
+
+ private final static String TAG = NavigationDrawerListAdapter.class.getSimpleName();
+
+ private Context mContext;
+
+ private ArrayList<NavigationDrawerItem> mNavigationDrawerItems;
+ private ArrayList<Object> mAll = new ArrayList<Object>();
+ private Account[] mAccounts;
+ private boolean mShowAccounts;
+ private Account mCurrentAccount;
+ private FileActivity mFileActivity;
+
+
+ public NavigationDrawerListAdapter(Context context, FileActivity fileActivity,
+ ArrayList<NavigationDrawerItem> navigationDrawerItems){
+ mFileActivity = fileActivity;
+ mContext = context;
+ mNavigationDrawerItems = navigationDrawerItems;
+
+ updateAccountList();
+
+ mAll.addAll(mNavigationDrawerItems);
+ }
+
+ public void updateAccountList(){
+ AccountManager am = (AccountManager) mContext.getSystemService(mContext.ACCOUNT_SERVICE);
+ mAccounts = am.getAccountsByType(MainApp.getAccountType());
+ mCurrentAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);
+ }
+
+ @Override
+ public int getCount() {
+ if (mShowAccounts){
+ return mNavigationDrawerItems.size() + 1;
+ } else {
+ return mNavigationDrawerItems.size();
+ }
+ }
+
+ @Override
+ public Object getItem(int position) {
+ //return all.get(position);
+ return null;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return 0;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+
+ LayoutInflater inflator = (LayoutInflater) mContext
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ if (mAll.size() > position) {
+ // Normal entry
+ if (mAll.get(position) instanceof NavigationDrawerItem){
+ NavigationDrawerItem navItem = (NavigationDrawerItem) mAll.get(position);
+
+ View view = inflator.inflate(R.layout.drawer_list_item, null);
+ view.setMinimumHeight(40);
+ LinearLayout itemLayout = (LinearLayout) view.findViewById(R.id.itemLayout);
+ itemLayout.setContentDescription(navItem.getContentDescription());
+ TextView itemText = (TextView) view.findViewById(R.id.itemTitle);
+ itemText.setText(navItem.getTitle());
+
+ return view;
+ }
+ // TODO re-enable when "Accounts" is available in Navigation Drawer
+ // Account
+// if (mAll.get(position) instanceof Account[]){
+// final View view = inflator.inflate(R.layout.drawer_account_group, null);
+//
+// final RadioGroup group = (RadioGroup) view.findViewById(R.id.drawer_radio_group);
+//
+// for (Account account : mAccounts) {
+// RadioButton rb = new RadioButton(mContext);
+//
+// rb.setText(account.name);
+// rb.setContentDescription(account.name);
+// rb.setTextColor(Color.BLACK);
+// rb.setEllipsize(TextUtils.TruncateAt.MIDDLE);
+// rb.setSingleLine();
+// rb.setCompoundDrawablePadding(30);
+//
+//
+// try {
+// // using adapted algorithm from /core/js/placeholder.js:50
+// int lastAtPos = account.name.lastIndexOf("@");
+// String username = account.name.substring(0, lastAtPos);
+// byte[] seed = username.getBytes("UTF-8");
+// MessageDigest md = MessageDigest.getInstance("MD5");
+//// Integer seedMd5Int = Math.abs(new String(Hex.encodeHex(seedMd5))
+//// .hashCode());
+// Integer seedMd5Int = String.format(Locale.ROOT, "%032x",
+// new BigInteger(1, md.digest(seed))).hashCode();
+//
+// double maxRange = java.lang.Integer.MAX_VALUE;
+// float hue = (float) (seedMd5Int / maxRange * 360);
+//
+// int[] rgb = BitmapUtils.HSLtoRGB(hue, 90.0f, 65.0f, 1.0f);
+//
+// TextDrawable text = new TextDrawable(username.substring(0, 1).toUpperCase(),
+// rgb[0], rgb[1], rgb[2]);
+// rb.setCompoundDrawablesWithIntrinsicBounds(text, null, null, null);
+//
+//
+// } catch (Exception e){
+// Log_OC.d(TAG, e.toString());
+// rb.setTextColor(mContext.getResources().getColor(R.color.black));
+// }
+// RadioGroup.LayoutParams params = new RadioGroup.LayoutParams(
+// LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
+// params.weight=1.0f;
+// params.setMargins(15, 5, 5, 5);
+//
+// // Check the current account that is being used
+// if (account.name.equals(mCurrentAccount.name)) {
+// rb.setChecked(true);
+// } else {
+// rb.setChecked(false);
+// }
+//
+// group.addView(rb, params);
+// }
+//
+// group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
+// public void onCheckedChanged(RadioGroup group, int checkedId) {
+// // checkedId is the RadioButton selected
+// RadioButton rb = (RadioButton) view.findViewById(checkedId);
+//
+// AccountUtils.setCurrentOwnCloudAccount(mContext,rb.getText().toString());
+// notifyDataSetChanged();
+// mFileActivity.closeDrawer();
+//
+// // restart the main activity
+// mFileActivity.restart();
+// }
+// });
+//
+// return view;
+// }
+ }
+ return convertView;
+ }
+
+ //TODO re-enable when "Accounts" is available in Navigation Drawer
+ // TODO update Account List after creating a new account and on fresh installation
+// public void setShowAccounts(boolean value){
+// mAll.clear();
+// mAll.addAll(mNavigationDrawerItems);
+//
+// if (value){
+// mAll.add(1, mAccounts);
+// }
+// mShowAccounts = value;
+// }
+}
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
import android.webkit.WebView;
-import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
import com.owncloud.android.utils.DisplayUtils;
/**
* Dialog to show the contents of res/raw/CHANGELOG.txt
*/
-public class ChangelogDialog extends SherlockDialogFragment {
+public class ChangelogDialog extends DialogFragment {
- private static final String ARG_CANCELABLE = ChangelogDialog.class.getCanonicalName() + ".ARG_CANCELABLE";
+ private static final String ARG_CANCELABLE = ChangelogDialog.class.getCanonicalName() +
+ ".ARG_CANCELABLE";
/**
* Public factory method to get dialog instances.
*
- * @param cancelable If 'true', the dialog can be cancelled by the user input (BACK button, touch outside...)
+ * @param cancelable If 'true', the dialog can be cancelled by the user input
+ * (BACK button, touch outside...)
* @return New dialog instance, ready to show.
*/
public static ChangelogDialog newInstance(boolean cancelable) {
public Dialog onCreateDialog(Bundle savedInstanceState) {
/// load the custom view to insert in the dialog, between title and
WebView webview = new WebView(getActivity());
- webview.loadUrl("file:///android_res/raw/" + getResources().getResourceEntryName(R.raw.changelog) + ".html");
+ webview.loadUrl("file:///android_res/raw/" +
+ getResources().getResourceEntryName(R.raw.changelog) + ".html");
/// build the dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
* {@inheritDoc}
*-/
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
/// load the custom layout
View view = inflater.inflate(R.layout.fragment_changelog, container);
mEditText = (EditText) view.findViewById(R.id.txt_your_name);
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
-import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.lib.common.utils.Log_OC;
-public class ConfirmationDialogFragment extends SherlockDialogFragment {
+public class ConfirmationDialogFragment extends DialogFragment {
public final static String ARG_CONF_RESOURCE_ID = "resource_id";
public final static String ARG_CONF_ARGUMENTS = "string_array";
builder.setPositiveButton(posBtn,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
- mListener.onConfirmation(getTag());
+ if (mListener != null) {
+ mListener.onConfirmation(getTag());
+ }
dialog.dismiss();
}
});
builder.setNeutralButton(neuBtn,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
- mListener.onNeutral(getTag());
+ if (mListener != null) {
+ mListener.onNeutral(getTag());
+ }
dialog.dismiss();
}
});
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- mListener.onCancel(getTag());
+ if (mListener != null) {
+ mListener.onCancel(getTag());
+ }
dialog.dismiss();
}
});
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
+import android.support.v7.app.ActionBarActivity;
-import com.actionbarsherlock.app.SherlockDialogFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.owncloud.android.R;
import com.owncloud.android.utils.DisplayUtils;
/**
* Dialog which will be displayed to user upon keep-in-sync file conflict.
*/
-public class ConflictsResolveDialog extends SherlockDialogFragment {
+public class ConflictsResolveDialog extends DialogFragment {
public static enum Decision {
CANCEL,
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String remotepath = getArguments().getString("remotepath");
- return new AlertDialog.Builder(getSherlockActivity())
+ return new AlertDialog.Builder(getActivity())
.setIcon(DisplayUtils.getSeasonalIconId())
.setTitle(R.string.conflict_title)
.setMessage(String.format(getString(R.string.conflict_message), remotepath))
.create();
}
- public void showDialog(SherlockFragmentActivity activity) {
+ public void showDialog(ActionBarActivity activity) {
Fragment prev = activity.getSupportFragmentManager().findFragmentByTag("dialog");
FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
if (prev != null) {
this.show(ft, "dialog");
}
- public void dismissDialog(SherlockFragmentActivity activity) {
+ public void dismissDialog(ActionBarActivity activity) {
Fragment prev = activity.getSupportFragmentManager().findFragmentByTag(getTag());
if (prev != null) {
FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
package com.owncloud.android.ui.dialog;
-import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.resources.files.FileUtils;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager.LayoutParams;
*
* Triggers the folder creation when name is confirmed.
*/
-public class CreateFolderDialogFragment
-extends SherlockDialogFragment implements DialogInterface.OnClickListener {
+public class CreateFolderDialogFragment
+ extends DialogFragment implements DialogInterface.OnClickListener {
private static final String ARG_PARENT_FOLDER = "PARENT_FOLDER";
/**
* Public factory method to create new CreateFolderDialogFragment instances.
- *
- * @param file File to remove.
- * @return Dialog ready to show.
+ *
+ * @param parentFolder Folder to create
+ * @return Dialog ready to show.
*/
public static CreateFolderDialogFragment newInstance(OCFile parentFolder) {
CreateFolderDialogFragment frag = new CreateFolderDialogFragment();
mParentFolder = getArguments().getParcelable(ARG_PARENT_FOLDER);
// Inflate the layout for the dialog
- LayoutInflater inflater = getSherlockActivity().getLayoutInflater();
+ LayoutInflater inflater = getActivity().getLayoutInflater();
View v = inflater.inflate(R.layout.edit_box_dialog, null);
// Setup layout
inputText.requestFocus();
// Build the dialog
- AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity());
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(v)
.setPositiveButton(R.string.common_ok, this)
.setNegativeButton(R.string.common_cancel, this)
if (newFolderName.length() <= 0) {
Toast.makeText(
- getSherlockActivity(),
+ getActivity(),
R.string.filename_empty,
Toast.LENGTH_LONG).show();
return;
}
-
- if (!FileUtils.isValidName(newFolderName)) {
- Toast.makeText(
- getSherlockActivity(),
- R.string.filename_forbidden_characters,
- Toast.LENGTH_LONG).show();
+ boolean serverWithForbiddenChars = ((ComponentsGetter)getActivity()).
+ getFileOperationsHelper().isVersionWithForbiddenCharacters();
+
+ if (!FileUtils.isValidName(newFolderName, serverWithForbiddenChars)) {
+ int messageId = 0;
+ if (serverWithForbiddenChars) {
+ messageId = R.string.filename_forbidden_charaters_from_server;
+ } else {
+ messageId = R.string.filename_forbidden_characters;
+ }
+ Toast.makeText(getActivity(), messageId, Toast.LENGTH_LONG).show();
+
return;
}
String path = mParentFolder.getRemotePath();
path += newFolderName + OCFile.PATH_SEPARATOR;
- ((ComponentsGetter)getSherlockActivity()).
+ ((ComponentsGetter)getActivity()).
getFileOperationsHelper().createFolder(path, false);
}
}
package com.owncloud.android.ui.dialog;
-import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AuthenticatorActivity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
import android.text.InputType;
import android.view.WindowManager.LayoutParams;
import android.webkit.HttpAuthHandler;
* Dialog to input authentication credentials
*
*/
-public class CredentialsDialogFragment extends SherlockDialogFragment
+public class CredentialsDialogFragment extends DialogFragment
implements DialogInterface.OnClickListener {
private WebView mWebView = null;
* @param handler HttpAuthHandler
* @return Dialog ready to show
*/
- public static CredentialsDialogFragment newInstanceForCredentials(WebView webView, HttpAuthHandler handler) {
+ public static CredentialsDialogFragment newInstanceForCredentials(WebView webView,
+ HttpAuthHandler handler) {
if (handler == null) {
- throw new IllegalArgumentException("Trying to create instance with parameter handler == null");
+ throw new IllegalArgumentException("Trying to create instance with parameter handler" +
+ " == null");
}
CredentialsDialogFragment frag = new CredentialsDialogFragment();
frag.mHandler = handler;
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Create field for username
- mUsernameET = new EditText(getSherlockActivity());
- mUsernameET.setHint(getSherlockActivity().getText(R.string.auth_username));
+ mUsernameET = new EditText(getActivity());
+ mUsernameET.setHint(getActivity().getText(R.string.auth_username));
// Create field for password
- mPasswordET = new EditText(getSherlockActivity());
- mPasswordET.setHint(getSherlockActivity().getText(R.string.auth_password));
+ mPasswordET = new EditText(getActivity());
+ mPasswordET.setHint(getActivity().getText(R.string.auth_password));
mPasswordET.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
// Prepare LinearLayout for dialog
- LinearLayout ll = new LinearLayout(getSherlockActivity());
+ LinearLayout ll = new LinearLayout(getActivity());
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(mUsernameET);
ll.addView(mPasswordET);
setRetainInstance(true);
Builder authDialog = new AlertDialog
- .Builder(getSherlockActivity())
- .setTitle(getSherlockActivity().getText(R.string.saml_authentication_required_text))
+ .Builder(getActivity())
+ .setTitle(getActivity().getText(R.string.saml_authentication_required_text))
.setView(ll)
.setCancelable(false)
.setPositiveButton(R.string.common_ok, this)
import android.content.DialogInterface;
import android.content.DialogInterface.OnKeyListener;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
import android.view.KeyEvent;
-import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
-public class IndeterminateProgressDialog extends SherlockDialogFragment {
+public class IndeterminateProgressDialog extends DialogFragment {
private static final String ARG_MESSAGE_ID = IndeterminateProgressDialog.class.getCanonicalName() + ".ARG_MESSAGE_ID";
private static final String ARG_CANCELABLE = IndeterminateProgressDialog.class.getCanonicalName() + ".ARG_CANCELABLE";
*/
@Override
public void onConfirmation(String callerTag) {
- ComponentsGetter cg = (ComponentsGetter)getSherlockActivity();
+ ComponentsGetter cg = (ComponentsGetter)getActivity();
FileDataStorageManager storageManager = cg.getStorageManager();
if (storageManager.getFileById(mTargetFile.getFileId()) != null) {
cg.getFileOperationsHelper().removeFile(mTargetFile, false);
*/
@Override
public void onNeutral(String callerTag) {
- ComponentsGetter cg = (ComponentsGetter)getSherlockActivity();
+ ComponentsGetter cg = (ComponentsGetter)getActivity();
cg.getFileOperationsHelper().removeFile(mTargetFile, true);
FileDataStorageManager storageManager = cg.getStorageManager();
boolean containsKeepInSync = false;
if (mTargetFile.isFolder()) {
- Vector<OCFile> files = storageManager.getFolderContent(mTargetFile);
+ // TODO Enable when "On Device" is recovered ?
+ Vector<OCFile> files = storageManager.getFolderContent(mTargetFile/*, false*/);
for(OCFile file: files) {
containsKeepInSync = file.keepInSync() || containsKeepInSync;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;
-import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.resources.files.FileUtils;
* Triggers the rename operation when name is confirmed.
*/
public class RenameFileDialogFragment
-extends SherlockDialogFragment implements DialogInterface.OnClickListener {
+ extends DialogFragment implements DialogInterface.OnClickListener {
private static final String ARG_TARGET_FILE = "TARGET_FILE";
mTargetFile = getArguments().getParcelable(ARG_TARGET_FILE);
// Inflate the layout for the dialog
- LayoutInflater inflater = getSherlockActivity().getLayoutInflater();
+ LayoutInflater inflater = getActivity().getLayoutInflater();
View v = inflater.inflate(R.layout.edit_box_dialog, null);
// Setup layout
inputText.requestFocus();
// Build the dialog
- AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity());
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(v)
.setPositiveButton(R.string.common_ok, this)
.setNegativeButton(R.string.common_cancel, this)
if (newFileName.length() <= 0) {
Toast.makeText(
- getSherlockActivity(),
+ getActivity(),
R.string.filename_empty,
Toast.LENGTH_LONG).show();
return;
}
-
- if (!FileUtils.isValidName(newFileName)) {
- Toast.makeText(
- getSherlockActivity(),
- R.string.filename_forbidden_characters,
- Toast.LENGTH_LONG).show();
+
+ boolean serverWithForbiddenChars = ((ComponentsGetter)getActivity()).
+ getFileOperationsHelper().isVersionWithForbiddenCharacters();
+
+ if (!FileUtils.isValidName(newFileName, serverWithForbiddenChars)) {
+ int messageId = 0;
+ if (serverWithForbiddenChars) {
+ messageId = R.string.filename_forbidden_charaters_from_server;
+ } else {
+ messageId = R.string.filename_forbidden_characters;
+ }
+ Toast.makeText(getActivity(), messageId, Toast.LENGTH_LONG).show();
return;
}
- ((ComponentsGetter)getSherlockActivity()).getFileOperationsHelper().renameFile(mTargetFile, newFileName);
+ ((ComponentsGetter)getActivity()).getFileOperationsHelper().
+ renameFile(mTargetFile, newFileName);
+
}
}
}
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
+import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.webkit.WebView;
import android.widget.RelativeLayout;
-import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.authentication.SsoWebViewClient;
/**
* Dialog to show the WebView for SAML Authentication
*/
-public class SamlWebViewDialog extends SherlockDialogFragment {
+public class SamlWebViewDialog extends DialogFragment {
public final String SAML_DIALOG_TAG = "SamlWebViewDialog";
* Public factory method to get dialog instances.
*
* @param url Url to open at WebView
- * @param targetUrl mBaseUrl + AccountUtils.getWebdavPath(mDiscoveredVersion, mCurrentAuthTokenType)
+ * @param targetUrl mBaseUrl + AccountUtils.getWebdavPath(mDiscoveredVersion, m
+ * CurrentAuthTokenType)
* @return New dialog instance, ready to show.
*/
public static SamlWebViewDialog newInstance(String url, String targetUrl) {
setRetainInstance(true);
- CookieSyncManager.createInstance(getSherlockActivity().getApplicationContext());
+ CookieSyncManager.createInstance(getActivity().getApplicationContext());
if (savedInstanceState == null) {
mInitialUrl = getArguments().getString(ARG_INITIAL_URL);
mTargetUrl = savedInstanceState.getString(ARG_TARGET_URL);
}
- setStyle(SherlockDialogFragment.STYLE_NO_TITLE, R.style.Theme_ownCloud_Dialog);
+ setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Theme_ownCloud_Dialog);
}
@SuppressWarnings("deprecation")
if (mSsoWebView == null) {
// initialize the WebView
- mSsoWebView = new SsoWebView(getSherlockActivity().getApplicationContext());
+ mSsoWebView = new SsoWebView(getActivity().getApplicationContext());
mSsoWebView.setFocusable(true);
mSsoWebView.setFocusableInTouchMode(true);
mSsoWebView.setClickable(true);
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.common.utils.Log_OC;
* Dialog showing a list activities able to resolve a given Intent,
* filtering out the activities matching give package names.
*/
-public class ShareLinkToDialog extends SherlockDialogFragment {
+public class ShareLinkToDialog extends DialogFragment {
private final static String TAG = ShareLinkToDialog.class.getSimpleName();
- private final static String ARG_INTENT = ShareLinkToDialog.class.getSimpleName() + ".ARG_INTENT";
- private final static String ARG_PACKAGES_TO_EXCLUDE = ShareLinkToDialog.class.getSimpleName() + ".ARG_PACKAGES_TO_EXCLUDE";
- private final static String ARG_FILE_TO_SHARE = ShareLinkToDialog.class.getSimpleName() + ".FILE_TO_SHARE";
+ private final static String ARG_INTENT = ShareLinkToDialog.class.getSimpleName() +
+ ".ARG_INTENT";
+ private final static String ARG_PACKAGES_TO_EXCLUDE = ShareLinkToDialog.class.getSimpleName() +
+ ".ARG_PACKAGES_TO_EXCLUDE";
+ private final static String ARG_FILE_TO_SHARE = ShareLinkToDialog.class.getSimpleName() +
+ ".FILE_TO_SHARE";
private ActivityAdapter mAdapter;
private OCFile mFile;
private Intent mIntent;
- public static ShareLinkToDialog newInstance(Intent intent, String[] packagesToExclude, OCFile fileToShare) {
+ public static ShareLinkToDialog newInstance(Intent intent, String[] packagesToExclude,
+ OCFile fileToShare) {
ShareLinkToDialog f = new ShareLinkToDialog();
Bundle args = new Bundle();
args.putParcelable(ARG_INTENT, intent);
public Dialog onCreateDialog(Bundle savedInstanceState) {
mIntent = getArguments().getParcelable(ARG_INTENT);
String[] packagesToExclude = getArguments().getStringArray(ARG_PACKAGES_TO_EXCLUDE);
- List<String> packagesToExcludeList = Arrays.asList(packagesToExclude != null ? packagesToExclude : new String[0]);
+ List<String> packagesToExcludeList = Arrays.asList(packagesToExclude != null ?
+ packagesToExclude : new String[0]);
mFile = getArguments().getParcelable(ARG_FILE_TO_SHARE);
- PackageManager pm= getSherlockActivity().getPackageManager();
- List<ResolveInfo> activities = pm.queryIntentActivities(mIntent, PackageManager.MATCH_DEFAULT_ONLY);
+ PackageManager pm= getActivity().getPackageManager();
+ List<ResolveInfo> activities = pm.queryIntentActivities(mIntent,
+ PackageManager.MATCH_DEFAULT_ONLY);
Iterator<ResolveInfo> it = activities.iterator();
ResolveInfo resolveInfo;
while (it.hasNext()) {
resolveInfo = it.next();
- if (packagesToExcludeList.contains(resolveInfo.activityInfo.packageName.toLowerCase())) {
+ if (packagesToExcludeList.contains(resolveInfo.activityInfo.packageName.toLowerCase())){
it.remove();
}
}
if (!sendAction) {
// add activity for copy to clipboard
- Intent copyToClipboardIntent = new Intent(getSherlockActivity(), CopyToClipboardActivity.class);
+ Intent copyToClipboardIntent = new Intent(getActivity(), CopyToClipboardActivity.class);
List<ResolveInfo> copyToClipboard = pm.queryIntentActivities(copyToClipboardIntent, 0);
if (!copyToClipboard.isEmpty()) {
activities.add(copyToClipboard.get(0));
}
Collections.sort(activities, new ResolveInfo.DisplayNameComparator(pm));
- mAdapter = new ActivityAdapter(getSherlockActivity(), pm, activities);
+ mAdapter = new ActivityAdapter(getActivity(), pm, activities);
return createSelector(sendAction);
titleId = R.string.activity_chooser_title;
}
- return new AlertDialog.Builder(getSherlockActivity())
+ return new AlertDialog.Builder(getActivity())
.setTitle(titleId)
.setAdapter(mAdapter, new DialogInterface.OnClickListener() {
@Override
dialog.dismiss(); // explicitly added for Android 2.x devices
// Send the file
- ((FileActivity)getSherlockActivity()).startActivity(mIntent);
+ ((FileActivity)getActivity()).startActivity(mIntent);
} else {
// Create a new share resource
- ((ComponentsGetter)getSherlockActivity()).getFileOperationsHelper()
+ ((ComponentsGetter)getActivity()).getFileOperationsHelper()
.shareFileWithLinkToApp(mFile, "", mIntent);
}
}
}
private View newView(ViewGroup parent) {
- return(((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.activity_row, parent, false));
+ return(((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).
+ inflate(R.layout.activity_row, parent, false));
}
private void bindView(int position, View row) {
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.Toast;
-import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.ui.activity.FileActivity;
* Triggers the share when the password is introduced.
*/
-public class SharePasswordDialogFragment extends SherlockDialogFragment
+public class SharePasswordDialogFragment extends DialogFragment
implements DialogInterface.OnClickListener {
private static final String ARG_FILE = "FILE";
public void onClick(DialogInterface dialog, int which) {
if (which == AlertDialog.BUTTON_POSITIVE) {
// Enable the flag "Share again"
- ((FileActivity) getSherlockActivity()).setTryShareAgain(true);
+ ((FileActivity) getActivity()).setTryShareAgain(true);
String password =
((TextView)(getDialog().findViewById(R.id.share_password)))
}
// Share the file
- ((FileActivity)getSherlockActivity()).getFileOperationsHelper()
+ ((FileActivity)getActivity()).getFileOperationsHelper()
.shareFileWithLinkToApp(mFile, password, mSendIntent);
} else {
// Disable the flag "Share again"
- ((FileActivity) getSherlockActivity()).setTryShareAgain(false);
+ ((FileActivity) getActivity()).setTryShareAgain(false);
}
}
}
import android.app.Dialog;
import android.net.http.SslError;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.SslErrorHandler;
import android.widget.Button;
-import com.actionbarsherlock.app.SherlockDialogFragment;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.network.CertificateCombinedException;
import com.owncloud.android.lib.common.network.NetworkUtils;
* Abstract implementation of common functionality for different dialogs that
* get the information about the error and the certificate from different classes.
*/
-public class SslUntrustedCertDialog extends SherlockDialogFragment {
+public class SslUntrustedCertDialog extends DialogFragment {
private final static String TAG = SslUntrustedCertDialog.class.getSimpleName();
if (mHandler != null) {
mHandler.cancel();
}
- ((OnSslUntrustedCertListener)getSherlockActivity()).onCancelCertificate();
+ ((OnSslUntrustedCertListener)getActivity()).onCancelCertificate();
}
}
mHandler.proceed();
}
if (m509Certificate != null) {
- Activity activity = getSherlockActivity();
+ Activity activity = getActivity();
try {
NetworkUtils.addCertToKnownServersStore(m509Certificate, activity); // TODO make this asynchronously, it can take some time
((OnSslUntrustedCertListener)activity).onSavedCertificate();
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author David A. Velasco
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.ui.dialog;
+
+import android.accounts.Account;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
+
+import com.owncloud.android.R;
+import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.ui.activity.FileActivity;
+import com.owncloud.android.ui.activity.UploadFilesActivity;
+
+
+/**
+ * Dialog showing two options to allow the user upload files from the filesystem or from other apps.
+ *
+ * Assumes that its parent activity extends {@link FileActivity}
+ */
+public class UploadSourceDialogFragment extends DialogFragment {
+
+ private final static String TAG = UploadSourceDialogFragment.class.getSimpleName();
+ private final static String ARG_ACCOUNT = UploadSourceDialogFragment.class.getSimpleName() +
+ ".ARG_ACCOUNT";
+
+ public static final int ACTION_SELECT_CONTENT_FROM_APPS = 1;
+ public static final int ACTION_SELECT_MULTIPLE_FILES = 2;
+
+ public static UploadSourceDialogFragment newInstance(Account account) {
+ UploadSourceDialogFragment f = new UploadSourceDialogFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_ACCOUNT, account);
+ f.setArguments(args);
+ return f;
+ }
+
+ public UploadSourceDialogFragment() {
+ super();
+ Log_OC.v(TAG, "constructor");
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+
+ String[] allTheItems = {
+ getString(R.string.actionbar_upload_files),
+ getString(R.string.actionbar_upload_from_apps)
+ };
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setTitle(R.string.actionbar_upload);
+ builder.setItems(allTheItems, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int item) {
+ if (item == 0) {
+ Intent action = new Intent(getActivity(), UploadFilesActivity.class);
+ action.putExtra(
+ UploadFilesActivity.EXTRA_ACCOUNT,
+ ((FileActivity)getActivity()).getAccount()
+ );
+ //startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES);
+ // this flow seems broken;
+ // Actionbarsherlock, maybe?
+ getActivity().startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES);
+
+ } else if (item == 1) {
+ Intent action = new Intent(Intent.ACTION_GET_CONTENT);
+ action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE);
+ //Intent.EXTRA_ALLOW_MULTIPLE is only supported on api level 18+, Jelly Bean
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+ action.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
+ }
+ //startActivityForResult( // this flow seems broken;
+ // Actionbarsherlock, maybe?
+ getActivity().startActivityForResult(
+ Intent.createChooser(action, getString(R.string.upload_chooser_title)),
+ ACTION_SELECT_CONTENT_FROM_APPS
+ );
+ }
+ }
+ });
+ return builder.create();
+ }
+
+}
package com.owncloud.android.ui.fragment;
-import com.actionbarsherlock.app.SherlockFragment;
+import android.support.v4.app.Fragment;
-public class AuthenticatorAccountDetailsFragment extends SherlockFragment {
+public class AuthenticatorAccountDetailsFragment extends Fragment {
}
package com.owncloud.android.ui.fragment;
-import com.actionbarsherlock.app.SherlockFragment;
+import android.support.v4.app.Fragment;
-public class AuthenticatorGetStartedFragment extends SherlockFragment {
+public class AuthenticatorGetStartedFragment extends Fragment {
}
import android.os.Build;
import android.os.Bundle;
+import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragment;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.ExtendedListView;
/**
* TODO extending SherlockListFragment instead of SherlockFragment
*/
-public class ExtendedListFragment extends SherlockFragment
-implements OnItemClickListener, OnEnforceableRefreshListener {
+public class ExtendedListFragment extends Fragment
+ implements OnItemClickListener, OnEnforceableRefreshListener {
private static final String TAG = ExtendedListFragment.class.getSimpleName();
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
Log_OC.d(TAG, "onCreateView");
View v = inflater.inflate(R.layout.list_fragment, null);
mListFooterView.invalidate();
} else {
-// mGridView.removeFooterView(mGridFooterView);
-// mListView.removeFooterView(mListFooterView);
+ mGridView.removeFooterView(mGridFooterView);
+ mListView.removeFooterView(mListFooterView);
}
}
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
private static final String TAG = FileDetailFragment.class.getSimpleName();
public static final String FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT";
public static final String FTAG_RENAME_FILE = "RENAME_FILE_FRAGMENT";
-
+
+ private static final String ARG_FILE = "FILE";
+ private static final String ARG_ACCOUNT = "ACCOUNT";
+
+
+ /**
+ * Public factory method to create new FileDetailFragment instances.
+ *
+ * When 'fileToDetail' or 'ocAccount' are null, creates a dummy layout (to use when a file wasn't tapped before).
+ *
+ * @param fileToDetail An {@link OCFile} to show in the fragment
+ * @param account An ownCloud account; needed to start downloads
+ * @return New fragment with arguments set
+ */
+ public static FileDetailFragment newInstance(OCFile fileToDetail, Account account) {
+ FileDetailFragment frag = new FileDetailFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_FILE, fileToDetail);
+ args.putParcelable(ARG_ACCOUNT, account);
+ frag.setArguments(args);
+ return frag;
+ }
/**
* Creates an empty details fragment.
*
- * It's necessary to keep a public constructor without parameters; the system uses it when tries to reinstantiate a fragment automatically.
+ * It's necessary to keep a public constructor without parameters; the system uses it when tries
+ * to reinstantiate a fragment automatically.
*/
public FileDetailFragment() {
super();
mProgressListener = null;
}
- /**
- * Creates a details fragment.
- *
- * When 'fileToDetail' or 'ocAccount' are null, creates a dummy layout (to use when a file wasn't tapped before).
- *
- * @param fileToDetail An {@link OCFile} to show in the fragment
- * @param ocAccount An ownCloud account; needed to start downloads
- */
- public FileDetailFragment(OCFile fileToDetail, Account ocAccount) {
- super(fileToDetail);
- mAccount = ocAccount;
- mLayout = R.layout.file_details_empty;
- mProgressListener = null;
- }
-
-
+
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
-
+
+ setFile((OCFile) getArguments().getParcelable(ARG_FILE));
+ mAccount = getArguments().getParcelable(ARG_ACCOUNT);
+
if (savedInstanceState != null) {
setFile((OCFile)savedInstanceState.getParcelable(FileActivity.EXTRA_FILE));
mAccount = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
mLayout = R.layout.file_details_fragment;
}
- View view = null;
- view = inflater.inflate(mLayout, null);
- mView = view;
+ mView = inflater.inflate(mLayout, null);
if (mLayout == R.layout.file_details_fragment) {
mView.findViewById(R.id.fdKeepInSync).setOnClickListener(this);
mProgressListener = new ProgressListener(progressBar);
mView.findViewById(R.id.fdCancelBtn).setOnClickListener(this);
}
-
+
updateFileDetails(false, false);
- return view;
+ return mView;
}
@Override
getFile(),
mContainerActivity.getStorageManager().getAccount(),
mContainerActivity,
- getSherlockActivity()
+ getActivity()
);
mf.filter(menu);
}
setFilename(file.getFileName());
setFiletype(file.getMimetype(), file.getFileName());
setFilesize(file.getFileLength());
- if(ocVersionSupportsTimeCreated()){
- setTimeCreated(file.getCreationTimestamp());
- }
-
+
setTimeModified(file.getModificationTimestamp());
CheckBox cb = (CheckBox)getView().findViewById(R.id.fdKeepInSync);
setButtonsForDown();
} else {
- // TODO load default preview image; when the local file is removed, the preview remains there
+ // TODO load default preview image; when the local file is removed, the preview
+ // remains there
setButtonsForRemote();
}
}
/**
* Updates the MIME type in view
- * @param mimetype to set
- * @param filename
+ * @param mimetype MIME type to set
+ * @param filename Name of the file, to deduce the icon to use in case the MIME type is not precise enough
*/
private void setFiletype(String mimetype, String filename) {
TextView tv = (TextView) getView().findViewById(R.id.fdType);
if (tv != null) {
- String printableMimetype = DisplayUtils.convertMIMEtoPrettyPrint(mimetype);;
+ String printableMimetype = DisplayUtils.convertMIMEtoPrettyPrint(mimetype);
tv.setText(printableMimetype);
}
ImageView iv = (ImageView) getView().findViewById(R.id.fdIcon);
}
/**
- * Updates the time that the file was created in view
- * @param milliseconds Unix time to set
- */
- private void setTimeCreated(long milliseconds){
- TextView tv = (TextView) getView().findViewById(R.id.fdCreated);
- TextView tvLabel = (TextView) getView().findViewById(R.id.fdCreatedLabel);
- if(tv != null){
- tv.setText(DisplayUtils.unixTimeToHumanReadable(milliseconds));
- tv.setVisibility(View.VISIBLE);
- tvLabel.setVisibility(View.VISIBLE);
- }
- }
-
- /**
* Updates the time that the file was last modified
* @param milliseconds Unix time to set
*/
}
- /**
- * In ownCloud 3.X.X and 4.X.X there is a bug that SabreDAV does not return
- * the time that the file was created. There is a chance that this will
- * be fixed in future versions. Use this method to check if this version of
- * ownCloud has this fix.
- * @return True, if ownCloud the ownCloud version is supporting creation time
- */
- private boolean ocVersionSupportsTimeCreated(){
- /*if(mAccount != null){
- AccountManager accManager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE);
- OwnCloudVersion ocVersion = new OwnCloudVersion(accManager
- .getUserData(mAccount, AccountAuthenticator.KEY_OC_VERSION));
- if(ocVersion.compareTo(new OwnCloudVersion(0x030000)) < 0) {
- return true;
- }
- }*/
- return false;
- }
-
-
public void listenForTransferProgress() {
if (mProgressListener != null) {
if (mContainerActivity.getFileDownloaderBinder() != null) {
- mContainerActivity.getFileDownloaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, getFile());
+ mContainerActivity.getFileDownloaderBinder().
+ addDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
if (mContainerActivity.getFileUploaderBinder() != null) {
- mContainerActivity.getFileUploaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, getFile());
+ mContainerActivity.getFileUploaderBinder().
+ addDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
}
}
public void leaveTransferProgress() {
if (mProgressListener != null) {
if (mContainerActivity.getFileDownloaderBinder() != null) {
- mContainerActivity.getFileDownloaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
+ mContainerActivity.getFileDownloaderBinder().
+ removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
if (mContainerActivity.getFileUploaderBinder() != null) {
- mContainerActivity.getFileUploaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
+ mContainerActivity.getFileUploaderBinder().
+ removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
}
}
/**
- * Helper class responsible for updating the progress bar shown for file uploading or downloading
+ * Helper class responsible for updating the progress bar shown for file uploading or
+ * downloading
*/
private class ProgressListener implements OnDatatransferProgressListener {
int mLastPercent = 0;
}
@Override
- public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filename) {
+ public void onTransferProgress(long progressRate, long totalTransferredSoFar,
+ long totalToTransfer, String filename) {
int percent = (int)(100.0*((double)totalTransferredSoFar)/((double)totalToTransfer));
if (percent != mLastPercent) {
ProgressBar pb = mProgressBar.get();
mLastPercent = percent;
}
- };
+ }
}
import android.app.Activity;
import android.support.v4.app.Fragment;
-import com.actionbarsherlock.app.SherlockFragment;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
/**
* Common methods for {@link Fragment}s containing {@link OCFile}s
*/
-public class FileFragment extends SherlockFragment {
+public class FileFragment extends Fragment {
private OCFile mFile;
/**
* Creates an empty fragment.
*
- * It's necessary to keep a public constructor without parameters; the system uses it when tries to reinstantiate a fragment automatically.
+ * It's necessary to keep a public constructor without parameters; the system uses it when
+ * tries to reinstantiate a fragment automatically.
*/
public FileFragment() {
mFile = null;
mContainerActivity = (ContainerActivity) activity;
} catch (ClassCastException e) {
- throw new ClassCastException(activity.toString() + " must implement " + ContainerActivity.class.getSimpleName());
+ throw new ClassCastException(activity.toString() + " must implement " +
+ ContainerActivity.class.getSimpleName());
}
}
public void showDetails(OCFile file);
- ///// TO UNIFY IN A SINGLE CALLBACK METHOD - EVENT NOTIFICATIONs -> something happened inside the fragment, MAYBE activity is interested --> unify in notification method
+ ///// TO UNIFY IN A SINGLE CALLBACK METHOD - EVENT NOTIFICATIONs -> something happened
+ // inside the fragment, MAYBE activity is interested --> unify in notification method
/**
- * Callback method invoked when a the user browsed into a different folder through the list of files
+ * Callback method invoked when a the user browsed into a different folder through the
+ * list of files
*
- * @param file
+ * @param folder
*/
public void onBrowsedDownTo(OCFile folder);
*
* This happens when a download or upload is started or ended for a file.
*
- * This method is necessary by now to update the user interface of the double-pane layout in tablets
- * because methods {@link FileDownloaderBinder#isDownloading(Account, OCFile)} and {@link FileUploaderBinder#isUploading(Account, OCFile)}
+ * This method is necessary by now to update the user interface of the double-pane layout
+ * in tablets because methods {@link FileDownloaderBinder#isDownloading(Account, OCFile)}
+ * and {@link FileUploaderBinder#isUploading(Account, OCFile)}
* won't provide the needed response before the method where this is called finishes.
*
- * TODO Remove this when the transfer state of a file is kept in the database (other thing TODO)
+ * TODO Remove this when the transfer state of a file is kept in the database
+ * (other thing TODO)
*
* @param file OCFile which state changed.
* @param downloading Flag signaling if the file is now downloading.
import android.widget.AdapterView.AdapterContextMenuInfo;
import com.owncloud.android.R;
+import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.FileMenuFilter;
import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.lib.resources.status.OwnCloudVersion;
+import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.activity.FolderPickerActivity;
import com.owncloud.android.ui.activity.OnEnforceableRefreshListener;
/**
* A Fragment that lists all files and folders in a given path.
*
- * TODO refactorize to get rid of direct dependency on FileDisplayActivity
+ * TODO refactor to get rid of direct dependency on FileDisplayActivity
*/
public class OCFileListFragment extends ExtendedListFragment {
private static final String KEY_FILE = MY_PACKAGE + ".extra.FILE";
- private final static Double THUMBNAIL_THRESHOLD = 0.5;
-
private FileFragment.ContainerActivity mContainerActivity;
private OCFile mFile = null;
private boolean mJustFolders;
private OCFile mTargetFile;
-
+
+
/**
* {@inheritDoc}
mJustFolders = (args == null) ? false : args.getBoolean(ARG_JUST_FOLDERS, false);
mAdapter = new FileListListAdapter(
mJustFolders,
- getSherlockActivity(),
+ getActivity(),
mContainerActivity
);
setListAdapter(mAdapter);
moveCount++;
} // exit is granted because storageManager.getFileByPath("/") never returns null
mFile = parentDir;
-
- listDirectory(mFile);
+
+ // TODO Enable when "On Device" is recovered ?
+ listDirectory(mFile /*, MainApp.getOnlyOnDevice()*/);
onRefresh(false);
if (file != null) {
if (file.isFolder()) {
// update state and view of this fragment
- listDirectory(file);
+ // TODO Enable when "On Device" is recovered ?
+ listDirectory(file/*, MainApp.getOnlyOnDevice()*/);
// then, notify parent activity to let it update its state and view
mContainerActivity.onBrowsedDownTo(file);
// save index and top position
boolean allowContextualActions =
(args == null) ? true : args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, true);
if (allowContextualActions) {
- MenuInflater inflater = getSherlockActivity().getMenuInflater();
+ MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.file_actions_menu, menu);
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
OCFile targetFile = (OCFile) mAdapter.getItem(info.position);
targetFile,
mContainerActivity.getStorageManager().getAccount(),
mContainerActivity,
- getSherlockActivity()
+ getActivity()
);
mf.filter(menu);
}
/// TODO break this direct dependency on FileDisplayActivity... if possible
MenuItem item = menu.findItem(R.id.action_open_file_with);
- FileFragment frag = ((FileDisplayActivity)getSherlockActivity()).getSecondFragment();
+ FileFragment frag = ((FileDisplayActivity)getActivity()).getSecondFragment();
if (frag != null && frag instanceof FileDetailFragment &&
frag.getFile().getFileId() == targetFile.getFileId()) {
item = menu.findItem(R.id.action_see_details);
/**
* Calls {@link OCFileListFragment#listDirectory(OCFile)} with a null parameter
*/
- public void listDirectory(){
+ public void listDirectory(/*boolean onlyOnDevice*/){
listDirectory(null);
+ // TODO Enable when "On Device" is recovered ?
+ // listDirectory(null, onlyOnDevice);
+ }
+
+ public void refreshDirectory(){
+ // TODO Enable when "On Device" is recovered ?
+ listDirectory(getCurrentFile()/*, MainApp.getOnlyOnDevice()*/);
}
/**
*
* @param directory File to be listed
*/
- public void listDirectory(OCFile directory) {
+ public void listDirectory(OCFile directory/*, boolean onlyOnDevice*/) {
FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
if (storageManager != null) {
directory = storageManager.getFileById(directory.getParentId());
}
- mAdapter.swapDirectory(directory, storageManager);
+ // TODO Enable when "On Device" is recovered ?
+ mAdapter.swapDirectory(directory, storageManager/*, onlyOnDevice*/);
if (mFile == null || !mFile.equals(directory)) {
mCurrentListView.setSelection(0);
}
setFooterText(generateFooterText(filesCount, foldersCount));
// decide grid vs list view
- if (((double)imagesCount / (double)filesCount) >= THUMBNAIL_THRESHOLD) {
+ OwnCloudVersion version = AccountUtils.getServerVersion(
+ ((FileActivity)mContainerActivity).getAccount());
+ if (version != null && version.supportsRemoteThumbnails() &&
+ imagesCount > 0 && imagesCount == filesCount) {
switchToGridView();
} else {
switchToListView();
public void sortBySize(boolean descending) {
mAdapter.setSortOrder(FileStorageUtils.SORT_SIZE, descending);
}
-
+
+
+
}
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.ui.fragment.FileFragment;
import android.accounts.Account;
import android.os.Bundle;
+import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
public static final String EXTRA_FILE = "FILE";
public static final String EXTRA_ACCOUNT = "ACCOUNT";
private static final String EXTRA_ERROR = "ERROR";
+
+ private static final String ARG_FILE = "FILE";
+ private static final String ARG_IGNORE_FIRST = "IGNORE_FIRST";
+ private static final String ARG_ACCOUNT = "ACCOUNT" ;
private View mView;
private Account mAccount;
-
+
public ProgressListener mProgressListener;
private boolean mListening;
private boolean mIgnoreFirstSavedState;
private boolean mError;
-
+
+
+ /**
+ * Public factory method to create a new fragment that shows the progress of a file download.
+ *
+ * Android strongly recommends keep the empty constructor of fragments as the only public constructor, and
+ * use {@link #setArguments(Bundle)} to set the needed arguments.
+ *
+ * This method hides to client objects the need of doing the construction in two steps.
+ *
+ * When 'file' is null creates a dummy layout (useful when a file wasn't tapped before).
+ *
+ * @param file An {@link OCFile} to show in the fragment
+ * @param account An OC account; needed to start downloads
+ * @param ignoreFirstSavedState Flag to work around an unexpected behaviour of {@link FragmentStatePagerAdapter}
+ * TODO better solution
+ */
+ public static Fragment newInstance(OCFile file, Account account, boolean ignoreFirstSavedState) {
+ FileDownloadFragment frag = new FileDownloadFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_FILE, file);
+ args.putParcelable(ARG_ACCOUNT, account);
+ args.putBoolean(ARG_IGNORE_FIRST, ignoreFirstSavedState);
+ frag.setArguments(args);
+ return frag;
+ }
+
/**
* Creates an empty details fragment.
*
- * It's necessary to keep a public constructor without parameters; the system uses it when tries to reinstantiate a fragment automatically.
+ * It's necessary to keep a public constructor without parameters; the system uses it when tries to
+ * reinstantiate a fragment automatically.
*/
public FileDownloadFragment() {
super();
mIgnoreFirstSavedState = false;
mError = false;
}
-
-
- /**
- * Creates a details fragment.
- *
- * When 'fileToDetail' or 'ocAccount' are null, creates a dummy layout (to use when a file wasn't tapped before).
- *
- * @param fileToDetail An {@link OCFile} to show in the fragment
- * @param ocAccount An ownCloud account; needed to start downloads
- * @param ignoreFirstSavedState Flag to work around an unexpected behaviour of {@link FragmentStatePagerAdapter}; TODO better solution
- */
- public FileDownloadFragment(OCFile fileToDetail, Account ocAccount, boolean ignoreFirstSavedState) {
- super(fileToDetail);
- mAccount = ocAccount;
- mProgressListener = null;
- mListening = false;
- mIgnoreFirstSavedState = ignoreFirstSavedState;
- mError = false;
- }
-
-
+
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ Bundle args = getArguments();
+ setFile((OCFile)args.getParcelable(ARG_FILE));
+ // TODO better in super, but needs to check ALL the class extending FileFragment; not right now
+
+ mIgnoreFirstSavedState = args.getBoolean(ARG_IGNORE_FIRST);
+ mAccount = args.getParcelable(ARG_ACCOUNT);
}
ProgressBar progressBar = (ProgressBar)mView.findViewById(R.id.progressBar);
mProgressListener = new ProgressListener(progressBar);
- ((ImageButton)mView.findViewById(R.id.cancelBtn)).setOnClickListener(this);
+ (mView.findViewById(R.id.cancelBtn)).setOnClickListener(this);
- ((LinearLayout)mView.findViewById(R.id.fileDownloadLL)).setOnClickListener(new OnClickListener() {
+ (mView.findViewById(R.id.fileDownloadLL)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((PreviewImageActivity) getActivity()).toggleFullScreen();
/**
- * Updates the view depending upon the state of the downloading file.
- *
- * @param transferring When true, the view must be updated assuming that the holded file is
- * downloading, no matter what the downloaderBinder says.
- */
- /*
- public void updateView(boolean transferring) {
- // configure UI for depending upon local state of the file
- // TODO remove
- if (transferring || getFile().isDownloading()) {
- setButtonsForTransferring();
-
- } else if (getFile().isDown()) {
-
- setButtonsForDown();
-
- } else {
- setButtonsForRemote();
- }
- getView().invalidate();
-
- }
- */
-
- /**
* Enables or disables buttons for a file being downloaded
*/
private void setButtonsForTransferring() {
public void listenForTransferProgress() {
if (mProgressListener != null && !mListening) {
if (mContainerActivity.getFileDownloaderBinder() != null) {
- mContainerActivity.getFileDownloaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, getFile());
+ mContainerActivity.getFileDownloaderBinder().addDatatransferProgressListener(
+ mProgressListener, mAccount, getFile()
+ );
mListening = true;
setButtonsForTransferring();
}
public void leaveTransferProgress() {
if (mProgressListener != null) {
if (mContainerActivity.getFileDownloaderBinder() != null) {
- mContainerActivity.getFileDownloaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
+ mContainerActivity.getFileDownloaderBinder().removeDatatransferProgressListener(
+ mProgressListener, mAccount, getFile()
+ );
mListening = false;
}
}
}
-
+
/**
* Helper class responsible for updating the progress bar shown for file uploading or downloading
*/
}
@Override
- public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filename) {
+ public void onTransferProgress(
+ long progressRate, long totalTransferredSoFar, long totalToTransfer, String filename
+ ) {
int percent = (int)(100.0*((double)totalTransferredSoFar)/((double)totalToTransfer));
if (percent != mLastPercent) {
ProgressBar pb = mProgressBar.get();
import com.owncloud.android.lib.common.utils.Log_OC;
public class ImageViewCustom extends ImageView {
-
+
+ private static final String TAG = ImageViewCustom.class.getSimpleName();
+
private static final boolean IS_ICS_OR_HIGHER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
-
- private Bitmap mBitmap;
+ private static final boolean IS_VERSION_BUGGY_ON_RECYCLES =
+ Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR1 ||
+ Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR2;
+
+ private int mBitmapHeight;
+ private int mBitmapWidth;
public ImageViewCustom(Context context) {
@Override
protected void onDraw(Canvas canvas) {
- if(IS_ICS_OR_HIGHER && checkIfMaximumBitmapExceed(canvas)) {
- // Set layer type to software one for avoiding exceed
- // and problems in visualization
+ if(IS_ICS_OR_HIGHER && checkIfMaximumBitmapExceed(canvas) || IS_VERSION_BUGGY_ON_RECYCLES ) {
+ // Software type is set with two targets:
+ // 1. prevent that bitmaps larger than maximum textures allowed are shown as black views in devices
+ // with LAYER_TYPE_HARDWARE enabled by default;
+ // 2. grant that bitmaps are correctly dellocated from memory in versions suffering the bug fixed in
+ // https://android.googlesource.com/platform/frameworks/base/+/034de6b1ec561797a2422314e6ef03e3cd3e08e0;
+ //
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
/**
* Checks if current bitmaps exceed the maximum OpenGL texture size limit
- * @param bitmap
- * @return boolean
+ * @param canvas Canvas where the view will be drawn into.
+ * @return boolean True means that the bitmap is too big for the canvas.
*/
@SuppressLint("NewApi")
private boolean checkIfMaximumBitmapExceed(Canvas canvas) {
- Log_OC.d("OC", "Canvas maximum: " + canvas.getMaximumBitmapWidth() + " - " + canvas.getMaximumBitmapHeight());
- if (mBitmap!= null && (mBitmap.getWidth() > canvas.getMaximumBitmapWidth()
- || mBitmap.getHeight() > canvas.getMaximumBitmapHeight())) {
+ Log_OC.v(TAG, "Canvas maximum: " + canvas.getMaximumBitmapWidth() + " - " + canvas.getMaximumBitmapHeight());
+ if (mBitmapWidth > canvas.getMaximumBitmapWidth()
+ || mBitmapHeight > canvas.getMaximumBitmapHeight()) {
return true;
}
return false;
}
+ @Override
/**
- * Set current bitmap
- * @param bitmap
+ * Keeps the size of the bitmap cached in member variables for faster access in {@link #onDraw(Canvas)} ,
+ * but without keeping another reference to the {@link Bitmap}
*/
- public void setBitmap (Bitmap bitmap) {
- mBitmap = bitmap;
+ public void setImageBitmap (Bitmap bm) {
+ mBitmapWidth = bm.getWidth();
+ mBitmapHeight = bm.getHeight();
+ super.setImageBitmap(bm);
}
}
* 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,
+ * This program is distributed in the hd 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.
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
-import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
-import android.preference.PreferenceManager;
+import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewPager;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBar;
+import android.view.MenuItem;
import android.view.View;
+import android.view.Window;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.view.MenuItem;
-import com.actionbarsherlock.view.Window;
import com.ortiz.touch.ExtendedViewPager;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.operations.UnshareLinkOperation;
import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.activity.FileDisplayActivity;
-import com.owncloud.android.ui.activity.PinCodeActivity;
import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.utils.DisplayUtils;
/**
* Holds a swiping galley where image files contained in an ownCloud directory are shown
*/
-public class PreviewImageActivity extends FileActivity implements
- FileFragment.ContainerActivity,
-ViewPager.OnPageChangeListener, OnRemoteOperationListener {
+public class PreviewImageActivity extends FileActivity implements
+ FileFragment.ContainerActivity,
+ ViewPager.OnPageChangeListener, OnRemoteOperationListener {
public static final int DIALOG_SHORT_WAIT = 0;
private View mFullScreenAnchorView;
-
+
@Override
protected void onCreate(Bundle savedInstanceState) {
+ requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
+
super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.preview_image_activity);
-
+
+ // Navigation Drawer
+ initDrawer();
+
+ // ActionBar
ActionBar actionBar = getSupportActionBar();
actionBar.setIcon(DisplayUtils.getSeasonalIconId());
- actionBar.setDisplayHomeAsUpEnabled(true);
+ updateActionBarTitleAndHomeButton(null);
actionBar.hide();
-
- // PIN CODE request
- if (getIntent().getExtras() != null && savedInstanceState == null && fromNotification()) {
- requestPinCode();
- }
+
// Make sure we're running on Honeycomb or higher to use FullScreen and
// Immersive Mode
mFullScreenAnchorView = getWindow().getDecorView();
// to keep our UI controls visibility in line with system bars
// visibility
- mFullScreenAnchorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
+ mFullScreenAnchorView.setOnSystemUiVisibilityChangeListener
+ (new View.OnSystemUiVisibilityChangeListener() {
@SuppressLint("InlinedApi")
@Override
public void onSystemUiVisibilityChange(int flags) {
ActionBar actionBar = getSupportActionBar();
if (visible) {
actionBar.show();
+ mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
} else {
actionBar.hide();
+ mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
}
});
private void initViewPager() {
// get parent from path
- String parentPath = getFile().getRemotePath().substring(0, getFile().getRemotePath().lastIndexOf(getFile().getFileName()));
+ String parentPath = getFile().getRemotePath().substring(0,
+ getFile().getRemotePath().lastIndexOf(getFile().getFileName()));
OCFile parentFolder = getStorageManager().getFileByPath(parentPath);
if (parentFolder == null) {
// should not be necessary
parentFolder = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
}
- mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), parentFolder, getAccount(), getStorageManager());
+
+ // TODO Enable when "On Device" is recovered ?
+ mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(),
+ parentFolder, getAccount(), getStorageManager()/*, MainApp.getOnlyOnDevice()*/);
+
mViewPager = (ExtendedViewPager) findViewById(R.id.fragmentPager);
- int position = mHasSavedPosition ? mSavedPosition : mPreviewImagePagerAdapter.getFilePosition(getFile());
+ int position = mHasSavedPosition ? mSavedPosition :
+ mPreviewImagePagerAdapter.getFilePosition(getFile());
position = (position >= 0) ? position : 0;
mViewPager.setAdapter(mPreviewImagePagerAdapter);
mViewPager.setOnPageChangeListener(this);
mViewPager.setCurrentItem(position);
if (position == 0 && !getFile().isDown()) {
- // this is necessary because mViewPager.setCurrentItem(0) just after setting the adapter does not result in a call to #onPageSelected(0)
+ // this is necessary because mViewPager.setCurrentItem(0) just after setting the
+ // adapter does not result in a call to #onPageSelected(0)
mRequestWaitingForBinder = true;
}
}
}
- private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) {
+ private void onUnshareLinkOperationFinish(UnshareLinkOperation operation,
+ RemoteOperationResult result) {
if (result.isSuccess()) {
OCFile file = getStorageManager().getFileByPath(getFile().getRemotePath());
if (file != null) {
}
- private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) {
+ private void onCreateShareOperationFinish(CreateShareOperation operation,
+ RemoteOperationResult result) {
if (result.isSuccess()) {
OCFile file = getStorageManager().getFileByPath(getFile().getRemotePath());
if (file != null) {
@Override
public void onServiceConnected(ComponentName component, IBinder service) {
- if (component.equals(new ComponentName(PreviewImageActivity.this, FileDownloader.class))) {
+ if (component.equals(new ComponentName(PreviewImageActivity.this,
+ FileDownloader.class))) {
mDownloaderBinder = (FileDownloaderBinder) service;
if (mRequestWaitingForBinder) {
mRequestWaitingForBinder = false;
- Log_OC.d(TAG, "Simulating reselection of current page after connection of download binder");
+ Log_OC.d(TAG, "Simulating reselection of current page after connection " +
+ "of download binder");
onPageSelected(mViewPager.getCurrentItem());
}
- } else if (component.equals(new ComponentName(PreviewImageActivity.this, FileUploader.class))) {
+ } else if (component.equals(new ComponentName(PreviewImageActivity.this,
+ FileUploader.class))) {
Log_OC.d(TAG, "Upload service connected");
mUploaderBinder = (FileUploaderBinder) service;
} else {
@Override
public void onServiceDisconnected(ComponentName component) {
- if (component.equals(new ComponentName(PreviewImageActivity.this, FileDownloader.class))) {
+ if (component.equals(new ComponentName(PreviewImageActivity.this,
+ FileDownloader.class))) {
Log_OC.d(TAG, "Download service suddenly disconnected");
mDownloaderBinder = null;
- } else if (component.equals(new ComponentName(PreviewImageActivity.this, FileUploader.class))) {
+ } else if (component.equals(new ComponentName(PreviewImageActivity.this,
+ FileUploader.class))) {
Log_OC.d(TAG, "Upload service suddenly disconnected");
mUploaderBinder = null;
}
switch(item.getItemId()){
case android.R.id.home:
- backToDisplayActivity();
+ if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
+ mDrawerLayout.closeDrawer(GravityCompat.START);
+ } else {
+ backToDisplayActivity();
+ }
returnValue = true;
break;
default:
@Override
protected void onResume() {
super.onResume();
- //Log_OC.e(TAG, "ACTIVITY, ONRESUME");
+
mDownloadFinishReceiver = new DownloadFinishReceiver();
IntentFilter filter = new IntentFilter(FileDownloader.getDownloadFinishMessage());
@Override
protected void onPostResume() {
- //Log_OC.e(TAG, "ACTIVITY, ONPOSTRESUME");
super.onPostResume();
}
@Override
public void onPause() {
- unregisterReceiver(mDownloadFinishReceiver);
- mDownloadFinishReceiver = null;
+ if (mDownloadFinishReceiver != null){
+ unregisterReceiver(mDownloadFinishReceiver);
+ mDownloadFinishReceiver = null;
+ }
+
super.onPause();
}
Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class);
showDetailsIntent.setAction(FileDisplayActivity.ACTION_DETAILS);
showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, file);
- showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));
+ showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT,
+ AccountUtils.getCurrentOwnCloudAccount(this));
startActivity(showDetailsIntent);
int pos = mPreviewImagePagerAdapter.getFilePosition(file);
file = mPreviewImagePagerAdapter.getFileAt(pos);
}
/**
- * This method will be invoked when a new page becomes selected. Animation is not necessarily complete.
+ * This method will be invoked when a new page becomes selected. Animation is not necessarily
+ * complete.
*
- * @param Position Position index of the new selected page
+ * @param position Position index of the new selected page
*/
@Override
public void onPageSelected(int position) {
} else {
OCFile currentFile = mPreviewImagePagerAdapter.getFileAt(position);
getSupportActionBar().setTitle(currentFile.getFileName());
-
+ mDrawerToggle.setDrawerIndicatorEnabled(false);
+
// Call to reset image zoom to initial state
((PreviewImagePagerAdapter) mViewPager.getAdapter()).resetZoom();
}
* Called when the scroll state changes. Useful for discovering when the user begins dragging,
* when the pager is automatically settling to the current page. when it is fully stopped/idle.
*
- * @param State The new scroll state (SCROLL_STATE_IDLE, _DRAGGING, _SETTLING
+ * @param state The new scroll state (SCROLL_STATE_IDLE, _DRAGGING, _SETTLING
*/
@Override
public void onPageScrollStateChanged(int state) {
}
/**
- * This method will be invoked when the current page is scrolled, either as part of a programmatically
- * initiated smooth scroll or a user initiated touch scroll.
+ * This method will be invoked when the current page is scrolled, either as part of a
+ * programmatically initiated smooth scroll or a user initiated touch scroll.
*
* @param position Position index of the first page currently being displayed.
- * Page position+1 will be visible if positionOffset is nonzero.
+ * Page position+1 will be visible if positionOffset is
+ * nonzero.
*
- * @param positionOffset Value from [0, 1) indicating the offset from the page at position.
+ * @param positionOffset Value from [0, 1) indicating the offset from the page
+ * at position.
* @param positionOffsetPixels Value in pixels indicating the offset from position.
*/
@Override
OCFile file = getStorageManager().getFileByPath(downloadedRemotePath);
int position = mPreviewImagePagerAdapter.getFilePosition(file);
- boolean downloadWasFine = intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false);
- //boolean isOffscreen = Math.abs((mViewPager.getCurrentItem() - position)) <= mViewPager.getOffscreenPageLimit();
+ boolean downloadWasFine = intent.getBooleanExtra(
+ FileDownloader.EXTRA_DOWNLOAD_RESULT, false);
+ //boolean isOffscreen = Math.abs((mViewPager.getCurrentItem() - position))
+ // <= mViewPager.getOffscreenPageLimit();
- if (position >= 0 && intent.getAction().equals(FileDownloader.getDownloadFinishMessage())) {
+ if (position >= 0 &&
+ intent.getAction().equals(FileDownloader.getDownloadFinishMessage())) {
if (downloadWasFine) {
mPreviewImagePagerAdapter.updateFile(position, file);
} else {
mPreviewImagePagerAdapter.updateWithDownloadError(position);
}
- mPreviewImagePagerAdapter.notifyDataSetChanged(); // will trigger the creation of new fragments
+ mPreviewImagePagerAdapter.notifyDataSetChanged(); // will trigger the creation
+ // of new fragments
} else {
Log_OC.d(TAG, "Download finished, but the fragment is offscreen");
ActionBar actionBar = getSupportActionBar();
if (!actionBar.isShowing()) {
actionBar.show();
+ mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
} else {
actionBar.hide();
+ mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
}
}
}
-
-
- /**
- * Launch an intent to request the PIN code to the user before letting him use the app
- */
- private void requestPinCode() {
- boolean pinStart = false;
- SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
- pinStart = appPrefs.getBoolean("set_pincode", false);
- if (pinStart) {
- Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);
- i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "PreviewImageActivity");
- startActivity(i);
- }
- }
@Override
public void onBrowsedDownTo(OCFile folder) {
return false;
}
+ @Override
+ public void allFilesOption(){
+ backToDisplayActivity();
+ super.allFilesOption();
+ }
}
*/
package com.owncloud.android.ui.preview;
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
import java.lang.ref.WeakReference;
import android.accounts.Account;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.BitmapFactory.Options;
import android.graphics.Point;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentStatePagerAdapter;
-import android.view.Display;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.ui.dialog.RemoveFileDialogFragment;
import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.utils.BitmapUtils;
+import com.owncloud.android.utils.DisplayUtils;
import third_parties.michaelOrtiz.TouchImageViewCustom;
/**
* This fragment shows a preview of a downloaded image.
+ *
+ * Trying to get an instance with a NULL {@link OCFile} will produce an
+ * {@link IllegalStateException}.
*
- * Trying to get an instance with NULL {@link OCFile} or ownCloud {@link Account} values will produce an {@link IllegalStateException}.
- *
- * If the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on instantiation too.
+ * If the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on
+ * instantiation too.
*/
public class PreviewImageFragment extends FileFragment {
public static final String EXTRA_FILE = "FILE";
- public static final String EXTRA_ACCOUNT = "ACCOUNT";
- private View mView;
- private Account mAccount;
+ private static final String ARG_FILE = "FILE";
+ private static final String ARG_IGNORE_FIRST = "IGNORE_FIRST";
+
private TouchImageViewCustom mImageView;
private TextView mMessageView;
private ProgressBar mProgressWheel;
private LoadBitmapTask mLoadBitmapTask = null;
-
+
/**
- * Creates a fragment to preview an image.
- *
- * When 'imageFile' or 'ocAccount' are null
- *
- * @param fileToDetail An {@link OCFile} to preview as an image in the fragment
- * @param ocAccount An ownCloud account; needed to start downloads
- * @param ignoreFirstSavedState Flag to work around an unexpected behaviour of {@link FragmentStatePagerAdapter}; TODO better solution
+ * Public factory method to create a new fragment that previews an image.
+ *
+ * Android strongly recommends keep the empty constructor of fragments as the only public
+ * constructor, and
+ * use {@link #setArguments(Bundle)} to set the needed arguments.
+ *
+ * This method hides to client objects the need of doing the construction in two steps.
+ *
+ * @param imageFile An {@link OCFile} to preview as an image in the fragment
+ * @param ignoreFirstSavedState Flag to work around an unexpected behaviour of
+ * {@link FragmentStatePagerAdapter}
+ * ; TODO better solution
*/
- public PreviewImageFragment(OCFile fileToDetail, Account ocAccount, boolean ignoreFirstSavedState, boolean showResizedImage) {
- super(fileToDetail);
- mAccount = ocAccount;
- mShowResizedImage = showResizedImage;
- mIgnoreFirstSavedState = ignoreFirstSavedState;
+ public static PreviewImageFragment newInstance(OCFile imageFile, boolean ignoreFirstSavedState,
+ boolean showResizedImage){
+ PreviewImageFragment frag = new PreviewImageFragment();
+ frag.mShowResizedImage = showResizedImage;
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_FILE, imageFile);
+ args.putBoolean(ARG_IGNORE_FIRST, ignoreFirstSavedState);
+ frag.setArguments(args);
+ return frag;
}
+
/**
* Creates an empty fragment for image previews.
*
- * MUST BE KEPT: the system uses it when tries to reinstantiate a fragment automatically (for instance, when the device is turned a aside).
+ * MUST BE KEPT: the system uses it when tries to reinstantiate a fragment automatically
+ * (for instance, when the device is turned a aside).
*
- * DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful construction
+ * DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful
+ * construction
*/
public PreviewImageFragment() {
- super();
- mAccount = null;
mIgnoreFirstSavedState = false;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ Bundle args = getArguments();
+ setFile((OCFile)args.getParcelable(ARG_FILE));
+ // TODO better in super, but needs to check ALL the class extending FileFragment;
+ // not right now
+
+ mIgnoreFirstSavedState = args.getBoolean(ARG_IGNORE_FIRST);
setHasOptionsMenu(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
- mView = inflater.inflate(R.layout.preview_image_fragment, container, false);
- mImageView = (TouchImageViewCustom) mView.findViewById(R.id.image);
+ View view = inflater.inflate(R.layout.preview_image_fragment, container, false);
+ mImageView = (TouchImageViewCustom) view.findViewById(R.id.image);
mImageView.setVisibility(View.GONE);
mImageView.setOnClickListener(new OnClickListener() {
@Override
}
});
- mMessageView = (TextView)mView.findViewById(R.id.message);
+ mMessageView = (TextView)view.findViewById(R.id.message);
mMessageView.setVisibility(View.GONE);
- mProgressWheel = (ProgressBar)mView.findViewById(R.id.progressWheel);
+ mProgressWheel = (ProgressBar)view.findViewById(R.id.progressWheel);
mProgressWheel.setVisibility(View.VISIBLE);
- return mView;
+ return view;
}
/**
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
if (!mIgnoreFirstSavedState) {
- OCFile file = (OCFile)savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_FILE);
+ OCFile file = savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_FILE);
setFile(file);
- mAccount = savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_ACCOUNT);
} else {
mIgnoreFirstSavedState = false;
}
if (getFile() == null) {
throw new IllegalStateException("Instanced with a NULL OCFile");
}
- if (mAccount == null) {
- throw new IllegalStateException("Instanced with a NULL ownCloud Account");
- }
}
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(PreviewImageFragment.EXTRA_FILE, getFile());
- outState.putParcelable(PreviewImageFragment.EXTRA_ACCOUNT, mAccount);
}
if (thumbnail != null && !getFile().needsUpdateThumbnail()){
mProgressWheel.setVisibility(View.GONE);
mImageView.setImageBitmap(thumbnail);
- mImageView.setBitmap(thumbnail);
mImageView.setVisibility(View.VISIBLE);
mBitmap = thumbnail;
} else {
if (ThumbnailsCacheManager.cancelPotentialWork(getFile(), mImageView)) {
final ThumbnailsCacheManager.ThumbnailGenerationTask task =
new ThumbnailsCacheManager.ThumbnailGenerationTask(
- mImageView, mContainerActivity.getStorageManager(), mAccount, mProgressWheel
- );
+ mImageView, mContainerActivity.getStorageManager(),
+ mContainerActivity.getStorageManager().getAccount(),
+ mProgressWheel);
if (thumbnail == null) {
thumbnail = ThumbnailsCacheManager.mDefaultImg;
}
}
} else {
mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel);
- mLoadBitmapTask.execute(new String[]{getFile().getStoragePath()});
+ mLoadBitmapTask.execute(getFile().getStoragePath());
}
}
}
@Override
public void onStop() {
- super.onStop();
+ Log_OC.d(TAG, "onStop starts");
if (mLoadBitmapTask != null) {
mLoadBitmapTask.cancel(true);
mLoadBitmapTask = null;
}
-
+ super.onStop();
}
/**
getFile(),
mContainerActivity.getStorageManager().getAccount(),
mContainerActivity,
- getSherlockActivity()
+ getActivity()
);
mf.filter(menu);
}
if (mBitmap != null) {
mBitmap.recycle();
System.gc();
+ // putting this in onStop() is just the same; the fragment is always destroyed by
+ // {@link FragmentStatePagerAdapter} when the fragment in swiped further than the
+ // valid offscreen distance, and onStop() is never called before than that
}
super.onDestroy();
}
/**
* Weak reference to the target {@link ImageView} where the bitmap will be loaded into.
- *
- * Using a weak reference will avoid memory leaks if the target ImageView is retired from memory before the load finishes.
+ *
+ * Using a weak reference will avoid memory leaks if the target ImageView is retired from
+ * memory before the load finishes.
*/
private final WeakReference<ImageViewCustom> mImageViewRef;
/**
* Weak reference to the target {@link TextView} where error messages will be written.
- *
- * Using a weak reference will avoid memory leaks if the target ImageView is retired from memory before the load finishes.
+ *
+ * Using a weak reference will avoid memory leaks if the target ImageView is retired from
+ * memory before the load finishes.
*/
private final WeakReference<TextView> mMessageViewRef;
/**
* Weak reference to the target {@link ProgressBar} shown while the load is in progress.
*
- * Using a weak reference will avoid memory leaks if the target ImageView is retired from memory before the load finishes.
+ * Using a weak reference will avoid memory leaks if the target ImageView is retired from
+ * memory before the load finishes.
*/
private final WeakReference<ProgressBar> mProgressWheelRef;
*
* @param imageView Target {@link ImageView} where the bitmap will be loaded into.
*/
- public LoadBitmapTask(ImageViewCustom imageView, TextView messageView, ProgressBar progressWheel) {
+ public LoadBitmapTask(ImageViewCustom imageView, TextView messageView,
+ ProgressBar progressWheel) {
mImageViewRef = new WeakReference<ImageViewCustom>(imageView);
mMessageViewRef = new WeakReference<TextView>(messageView);
mProgressWheelRef = new WeakReference<ProgressBar>(progressWheel);
@Override
protected Bitmap doInBackground(String... params) {
Bitmap result = null;
- if (params.length != 1) return result;
+ if (params.length != 1) return null;
String storagePath = params[0];
try {
- if (isCancelled()) return result;
-
- File picture = new File(storagePath);
-
- if (picture != null) {
- // Decode file into a bitmap in real size for being able to make zoom on
- // the image
- result = BitmapFactory.decodeStream(new FlushedInputStream
- (new BufferedInputStream(new FileInputStream(picture))));
- }
+ int maxDownScale = 3; // could be a parameter passed to doInBackground(...)
+ Point screenSize = DisplayUtils.getScreenSize(getActivity());
+ int minWidth = screenSize.x;
+ int minHeight = screenSize.y;
+ for (int i = 0; i < maxDownScale && result == null; i++) {
+ if (isCancelled()) return null;
+ try {
+ result = BitmapUtils.decodeSampledBitmapFromFile(storagePath, minWidth,
+ minHeight);
+
+ if (isCancelled()) return result;
+
+ if (result == null) {
+ mErrorMessageId = R.string.preview_image_error_unknown_format;
+ Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath);
+ break;
+ } else {
+ // Rotate image, obeying exif tag.
+ result = BitmapUtils.rotateImage(result, storagePath);
+ }
- if (isCancelled()) return result;
-
- if (result == null) {
- mErrorMessageId = R.string.preview_image_error_unknown_format;
- Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath);
- } else {
- // Rotate image, obeying exif tag.
- result = BitmapUtils.rotateImage(result, storagePath);
+ } catch (OutOfMemoryError e) {
+ mErrorMessageId = R.string.common_error_out_memory;
+ if (i < maxDownScale - 1) {
+ Log_OC.w(TAG, "Out of memory rendering file " + storagePath +
+ " ; scaling down");
+ minWidth = minWidth / 2;
+ minHeight = minHeight / 2;
+
+ } else {
+ Log_OC.w(TAG, "Out of memory rendering file " + storagePath +
+ " ; failing");
+ }
+ if (result != null) {
+ result.recycle();
+ }
+ result = null;
+ }
}
-
- } catch (OutOfMemoryError e) {
- Log_OC.e(TAG, "Out of memory occured for file " + storagePath, e);
- if (isCancelled()) return result;
-
- // If out of memory error when loading or rotating image, try to load it scaled
- result = loadScaledImage(storagePath);
-
- if (result == null) {
- mErrorMessageId = R.string.preview_image_error_unknown_format;
- Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath);
- } else {
- // Rotate scaled image, obeying exif tag
- result = BitmapUtils.rotateImage(result, storagePath);
- }
-
} catch (NoSuchFieldError e) {
mErrorMessageId = R.string.common_error_unknown;
Log_OC.e(TAG, "Error from access to unexisting field despite protection; file "
} else {
showErrorMessage();
}
+ if (result != null && mBitmap != result) {
+ // unused bitmap, release it! (just in case)
+ result.recycle();
+ }
}
@SuppressLint("InlinedApi")
private void showLoadedImage(Bitmap result) {
- if (mImageViewRef != null) {
- final ImageViewCustom imageView = mImageViewRef.get();
- if (imageView != null) {
- imageView.setBitmap(result);
- imageView.setImageBitmap(result);
- imageView.setVisibility(View.VISIBLE);
- mBitmap = result;
- } // else , silently finish, the fragment was destroyed
- }
- if (mMessageViewRef != null) {
- final TextView messageView = mMessageViewRef.get();
- if (messageView != null) {
- messageView.setVisibility(View.GONE);
- } // else , silently finish, the fragment was destroyed
+ final ImageViewCustom imageView = mImageViewRef.get();
+ if (imageView != null) {
+ Log_OC.d(TAG, "Showing image with resolution " + result.getWidth() + "x" +
+ result.getHeight());
+ imageView.setImageBitmap(result);
+ imageView.setVisibility(View.VISIBLE);
+ mBitmap = result; // needs to be kept for recycling when not useful
}
+
+ final TextView messageView = mMessageViewRef.get();
+ if (messageView != null) {
+ messageView.setVisibility(View.GONE);
+ } // else , silently finish, the fragment was destroyed
}
private void showErrorMessage() {
- if (mImageViewRef != null) {
- final ImageView imageView = mImageViewRef.get();
- if (imageView != null) {
- // shows the default error icon
- imageView.setVisibility(View.VISIBLE);
- } // else , silently finish, the fragment was destroyed
- }
- if (mMessageViewRef != null) {
- final TextView messageView = mMessageViewRef.get();
- if (messageView != null) {
- messageView.setText(mErrorMessageId);
- messageView.setVisibility(View.VISIBLE);
- } // else , silently finish, the fragment was destroyed
- }
+ final ImageView imageView = mImageViewRef.get();
+ if (imageView != null) {
+ // shows the default error icon
+ imageView.setVisibility(View.VISIBLE);
+ } // else , silently finish, the fragment was destroyed
+
+ final TextView messageView = mMessageViewRef.get();
+ if (messageView != null) {
+ messageView.setText(mErrorMessageId);
+ messageView.setVisibility(View.VISIBLE);
+ } // else , silently finish, the fragment was destroyed
}
private void hideProgressWheel() {
- if (mProgressWheelRef != null) {
- final ProgressBar progressWheel = mProgressWheelRef.get();
- if (progressWheel != null) {
- progressWheel.setVisibility(View.GONE);
- }
+ final ProgressBar progressWheel = mProgressWheelRef.get();
+ if (progressWheel != null) {
+ progressWheel.setVisibility(View.GONE);
}
}
}
/**
- * Helper method to test if an {@link OCFile} can be passed to a {@link PreviewImageFragment} to be previewed.
+ * Helper method to test if an {@link OCFile} can be passed to a {@link PreviewImageFragment}
+ * to be previewed.
*
* @param file File to test if can be previewed.
* @return 'True' if the file can be handled by the fragment.
return mImageView;
}
- static class FlushedInputStream extends FilterInputStream {
- public FlushedInputStream(InputStream inputStream) {
- super(inputStream);
- }
-
- @Override
- public long skip(long n) throws IOException {
- long totalBytesSkipped = 0L;
- while (totalBytesSkipped < n) {
- long bytesSkipped = in.skip(n - totalBytesSkipped);
- if (bytesSkipped == 0L) {
- int byteValue = read();
- if (byteValue < 0) {
- break; // we reached EOF
- } else {
- bytesSkipped = 1; // we read one byte
- }
- }
- totalBytesSkipped += bytesSkipped;
- }
- return totalBytesSkipped;
- }
- }
-
- /**
- * Load image scaled
- * @param storagePath: path of the image
- * @return Bitmap
- */
- @SuppressWarnings("deprecation")
- private Bitmap loadScaledImage(String storagePath) {
-
- Log_OC.d(TAG, "Loading image scaled");
-
- // set desired options that will affect the size of the bitmap
- BitmapFactory.Options options = new Options();
- options.inScaled = true;
- options.inPurgeable = true;
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
- options.inPreferQualityOverSpeed = false;
- }
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
- options.inMutable = false;
- }
- // make a false load of the bitmap - just to be able to read outWidth, outHeight and outMimeType
- options.inJustDecodeBounds = true;
- BitmapFactory.decodeFile(storagePath, options);
-
- int width = options.outWidth;
- int height = options.outHeight;
- int scale = 1;
-
- Display display = getActivity().getWindowManager().getDefaultDisplay();
- Point size = new Point();
- int screenWidth;
- int screenHeight;
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB_MR2) {
- display.getSize(size);
- screenWidth = size.x;
- screenHeight = size.y;
- } else {
- screenWidth = display.getWidth();
- screenHeight = display.getHeight();
- }
-
- if (width > screenWidth) {
- // second try to scale down the image , this time depending upon the screen size
- scale = (int) Math.floor((float)width / screenWidth);
- }
- if (height > screenHeight) {
- scale = Math.max(scale, (int) Math.floor((float)height / screenHeight));
- }
- options.inSampleSize = scale;
-
- // really load the bitmap
- options.inJustDecodeBounds = false; // the next decodeFile call will be real
- return BitmapFactory.decodeFile(storagePath, options);
-
- }
}
*/
package com.owncloud.android.ui.preview;
-import java.util.Collections;
-import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
/**
* Constructor.
*
- * @param fragmentManager {@link FragmentManager} instance that will handle the {@link Fragment}s provided by the adapter.
+ * @param fragmentManager {@link FragmentManager} instance that will handle
+ * the {@link Fragment}s provided by the adapter.
* @param parentFolder Folder where images will be searched for.
* @param storageManager Bridge to database.
*/
- public PreviewImagePagerAdapter(FragmentManager fragmentManager, OCFile parentFolder, Account account, FileDataStorageManager storageManager) {
+ public PreviewImagePagerAdapter(FragmentManager fragmentManager, OCFile parentFolder,
+ Account account, FileDataStorageManager storageManager /*,
+ boolean onlyOnDevice*/) {
super(fragmentManager);
if (fragmentManager == null) {
mAccount = account;
mStorageManager = storageManager;
- mImageFiles = mStorageManager.getFolderImages(parentFolder);
+ // TODO Enable when "On Device" is recovered ?
+ mImageFiles = mStorageManager.getFolderImages(parentFolder/*, false*/);
mImageFiles = FileStorageUtils.sortFolder(mImageFiles);
OCFile file = mImageFiles.get(i);
Fragment fragment = null;
if (file.isDown()) {
- fragment = new PreviewImageFragment(file, mAccount, mObsoletePositions.contains(Integer.valueOf(i)), false);
+ fragment = PreviewImageFragment.newInstance(file,
+ mObsoletePositions.contains(Integer.valueOf(i)), false);
+
} else if (mDownloadErrors.contains(Integer.valueOf(i))) {
- fragment = new FileDownloadFragment(file, mAccount, true);
+ fragment = FileDownloadFragment.newInstance(file, mAccount, true);
((FileDownloadFragment)fragment).setError(true);
mDownloadErrors.remove(Integer.valueOf(i));
} else {
- fragment = new PreviewImageFragment(file, mAccount, mObsoletePositions.contains(Integer.valueOf(i)), true);
+ fragment = PreviewImageFragment.newInstance(file,
+ mObsoletePositions.contains(Integer.valueOf(i)), true);
}
mObsoletePositions.remove(Integer.valueOf(i));
return fragment;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.os.Bundle;
import android.os.IBinder;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Toast;
import android.widget.VideoView;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.FileMenuFilter;
/**
* This fragment shows a preview of a downloaded media file (audio or video).
*
- * Trying to get an instance with NULL {@link OCFile} or ownCloud {@link Account} values will produce an {@link IllegalStateException}.
+ * Trying to get an instance with NULL {@link OCFile} or ownCloud {@link Account} values will
+ * produce an {@link IllegalStateException}.
*
- * By now, if the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on instantiation too.
+ * By now, if the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is
+ * generated on instantiation too.
*/
public class PreviewMediaFragment extends FileFragment implements
OnTouchListener {
private void stopAudio() {
- Intent i = new Intent(getSherlockActivity(), MediaService.class);
+ Intent i = new Intent(getActivity(), MediaService.class);
i.setAction(MediaService.ACTION_STOP_ALL);
- getSherlockActivity().startService(i);
+ getActivity().startService(i);
}
getFile(),
mContainerActivity.getStorageManager().getAccount(),
mContainerActivity,
- getSherlockActivity()
+ getActivity()
);
mf.filter(menu);
}
*
* Just starts the playback.
*
- * @param mp {@link MediaPlayer} instance performing the playback.
+ * @param vp {@link MediaPlayer} instance performing the playback.
*/
@Override
public void onPrepared(MediaPlayer vp) {
public boolean onError(MediaPlayer mp, int what, int extra) {
if (mVideoPreview.getWindowToken() != null) {
String message = MediaService.getMessageForMediaError(
- getSherlockActivity(), what, extra);
- new AlertDialog.Builder(getSherlockActivity())
+ getActivity(), what, extra);
+ new AlertDialog.Builder(getActivity())
.setMessage(message)
.setPositiveButton(android.R.string.VideoView_error_button,
new DialogInterface.OnClickListener() {
if (mMediaServiceBinder != null && mMediaController != null) {
mMediaServiceBinder.unregisterMediaController(mMediaController);
}
- getSherlockActivity().unbindService(mMediaServiceConnection);
+ getActivity().unbindService(mMediaServiceConnection);
mMediaServiceConnection = null;
mMediaServiceBinder = null;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN && v == mVideoPreview) {
- startFullScreenVideo();
+ // added a margin on the left to avoid interfering with gesture to open navigation drawer
+ if (event.getX() / Resources.getSystem().getDisplayMetrics().density > 24.0) {
+ startFullScreenVideo();
+ }
return true;
}
return false;
private void startFullScreenVideo() {
- Intent i = new Intent(getSherlockActivity(), PreviewVideoActivity.class);
+ Intent i = new Intent(getActivity(), PreviewVideoActivity.class);
i.putExtra(FileActivity.EXTRA_ACCOUNT, mAccount);
i.putExtra(FileActivity.EXTRA_FILE, getFile());
i.putExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, mVideoPreview.isPlaying());
if (mMediaServiceConnection == null) {
mMediaServiceConnection = new MediaServiceConnection();
}
- getSherlockActivity().bindService( new Intent(getSherlockActivity(),
+ getActivity().bindService( new Intent(getActivity(),
MediaService.class),
mMediaServiceConnection,
Context.BIND_AUTO_CREATE);
@Override
public void onServiceConnected(ComponentName component, IBinder service) {
- if (getSherlockActivity() != null) {
+ if (getActivity() != null) {
if (component.equals(
- new ComponentName(getSherlockActivity(), MediaService.class))) {
+ new ComponentName(getActivity(), MediaService.class))) {
Log_OC.d(TAG, "Media service connected");
mMediaServiceBinder = (MediaServiceBinder) service;
if (mMediaServiceBinder != null) {
@Override
public void onServiceDisconnected(ComponentName component) {
- if (component.equals(new ComponentName(getSherlockActivity(), MediaService.class))) {
+ if (component.equals(new ComponentName(getActivity(), MediaService.class))) {
Log_OC.e(TAG, "Media service suddenly disconnected");
if (mMediaController != null) {
mMediaController.setMediaPlayer(null);
} else {
Toast.makeText(
- getSherlockActivity(),
+ getActivity(),
"No media controller to release when disconnected from media service",
Toast.LENGTH_SHORT).show();
}
* Finishes the preview
*/
private void finish() {
- getSherlockActivity().onBackPressed();
+ getActivity().onBackPressed();
}
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
-
+
+ // calculates the largest inSampleSize value (for smallest sample) that is a power of 2 and keeps both
+ // height and width **larger** than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
/**
+ * Convert HSL values to a RGB Color.
+ *
+ * @param h Hue is specified as degrees in the range 0 - 360.
+ * @param s Saturation is specified as a percentage in the range 1 - 100.
+ * @param l Lumanance is specified as a percentage in the range 1 - 100.
+ * @paran alpha the alpha value between 0 - 1
+ * adapted from https://svn.codehaus.org/griffon/builders/gfxbuilder/tags/GFXBUILDER_0.2/
+ * gfxbuilder-core/src/main/com/camick/awt/HSLColor.java
+ */
+ public static int[] HSLtoRGB(float h, float s, float l, float alpha)
+ {
+ if (s <0.0f || s > 100.0f)
+ {
+ String message = "Color parameter outside of expected range - Saturation";
+ throw new IllegalArgumentException( message );
+ }
+
+ if (l <0.0f || l > 100.0f)
+ {
+ String message = "Color parameter outside of expected range - Luminance";
+ throw new IllegalArgumentException( message );
+ }
+
+ if (alpha <0.0f || alpha > 1.0f)
+ {
+ String message = "Color parameter outside of expected range - Alpha";
+ throw new IllegalArgumentException( message );
+ }
+
+ // Formula needs all values between 0 - 1.
+
+ h = h % 360.0f;
+ h /= 360f;
+ s /= 100f;
+ l /= 100f;
+
+ float q = 0;
+
+ if (l < 0.5)
+ q = l * (1 + s);
+ else
+ q = (l + s) - (s * l);
+
+ float p = 2 * l - q;
+
+ int r = Math.round(Math.max(0, HueToRGB(p, q, h + (1.0f / 3.0f)) * 256));
+ int g = Math.round(Math.max(0, HueToRGB(p, q, h) * 256));
+ int b = Math.round(Math.max(0, HueToRGB(p, q, h - (1.0f / 3.0f)) * 256));
+
+ int[] array = {r, g, b};
+ return array;
+ }
+
+ private static float HueToRGB(float p, float q, float h){
+ if (h < 0) h += 1;
+
+ if (h > 1 ) h -= 1;
+
+ if (6 * h < 1)
+ {
+ return p + ((q - p) * 6 * h);
+ }
+
+ if (2 * h < 1 )
+ {
+ return q;
+ }
+
+ if (3 * h < 2)
+ {
+ return p + ( (q - p) * 6 * ((2.0f / 3.0f) - h) );
+ }
+
+ return p;
+ }
+
+ /**
* Checks if file passed is an image
* @param file
* @return true/false
--- /dev/null
+/**
+ * ownCloud Android client application
+ *
+ * @author masensio
+ * Copyright (C) 2015 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.utils;
+
+import android.content.ContentResolver;
+import android.net.Uri;
+import android.os.AsyncTask;
+
+import com.owncloud.android.lib.common.utils.Log_OC;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.lang.ref.WeakReference;
+
+/**
+ * AsyncTask to copy a file from a uri in a temporal file
+ */
+public class CopyTmpFileAsyncTask extends AsyncTask<Object, Void, String> {
+
+ private final String TAG = CopyTmpFileAsyncTask.class.getSimpleName();
+ private final WeakReference<OnCopyTmpFileTaskListener> mListener;
+ private int mIndex;
+
+ public int getIndex(){
+ return mIndex;
+ }
+
+ public CopyTmpFileAsyncTask(OnCopyTmpFileTaskListener listener) {
+ mListener = new WeakReference<OnCopyTmpFileTaskListener>(listener);
+ }
+
+ /**
+ * Params for execute:
+ * - Uri: uri of file
+ * - String: path for saving the file into the app
+ * - int: index of upload
+ * - String: accountName
+ * - ContentResolver: content resolver
+ */
+ @Override
+ protected String doInBackground(Object[] params) {
+ String result = null;
+
+ if (params != null && params.length == 5) {
+ Uri uri = (Uri) params[0];
+ String filePath = (String) params[1];
+ mIndex = ((Integer) params[2]).intValue();
+ String accountName = (String) params[3];
+ ContentResolver contentResolver = (ContentResolver) params[4];
+
+ String fullTempPath = FileStorageUtils.getTemporalPath(accountName) + filePath;
+ InputStream inputStream = null;
+ FileOutputStream outputStream = null;
+
+ try {
+ inputStream = contentResolver.openInputStream(uri);
+ File cacheFile = new File(fullTempPath);
+ File tempDir = cacheFile.getParentFile();
+ if (!tempDir.exists()) {
+ tempDir.mkdirs();
+ }
+ cacheFile.createNewFile();
+ outputStream = new FileOutputStream(fullTempPath);
+ byte[] buffer = new byte[4096];
+
+ int count = 0;
+
+ while ((count = inputStream.read(buffer)) > 0) {
+ outputStream.write(buffer, 0, count);
+ }
+
+ outputStream.close();
+ inputStream.close();
+
+ result = fullTempPath;
+ } catch (Exception e) {
+ Log_OC.e(TAG, "Exception ", e);
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (Exception e1) {
+ Log_OC.e(TAG, "Input Stream Exception ", e1);
+ }
+ }
+
+ if (outputStream != null) {
+ try {
+ outputStream.close();
+ } catch (Exception e1) {
+ Log_OC.e(TAG, "Output Stream Exception ", e1);
+ }
+ }
+
+ if (fullTempPath != null) {
+ File f = new File(fullTempPath);
+ f.delete();
+ }
+ result = null;
+ }
+ } else {
+ throw new IllegalArgumentException("Error in parameters number");
+ }
+
+ return result;
+ }
+
+ @Override
+ protected void onPostExecute(String result) {
+
+ OnCopyTmpFileTaskListener listener = mListener.get();
+ if (listener!= null)
+ {
+ listener.onTmpFileCopied(result, mIndex);
+ }
+ }
+
+ /*
+ * Interface to retrieve data from recognition task
+ */
+ public interface OnCopyTmpFileTaskListener{
+
+ void onTmpFileCopied(String result, int index);
+ }
+}
import java.util.Vector;\r
\r
import android.annotation.TargetApi;\r
+import android.app.Activity;\r
import android.content.Context;\r
+import android.graphics.Point;\r
import android.os.Build;\r
import android.text.format.DateUtils;\r
+import android.view.Display;\r
import android.webkit.MimeTypeMap;\r
\r
import com.owncloud.android.MainApp;\r
*/\r
@TargetApi(Build.VERSION_CODES.GINGERBREAD)\r
public static String convertIdn(String url, boolean toASCII) {\r
- \r
+\r
+ String urlNoDots = url;\r
+ String dots="";\r
+ while (urlNoDots.startsWith(".")) {\r
+ urlNoDots = url.substring(1);\r
+ dots = dots + ".";\r
+ }\r
+\r
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {\r
// Find host name after '//' or '@'\r
int hostStart = 0;\r
- if (url.indexOf("//") != -1) {\r
+ if (urlNoDots.indexOf("//") != -1) {\r
hostStart = url.indexOf("//") + "//".length();\r
} else if (url.indexOf("@") != -1) {\r
hostStart = url.indexOf("@") + "@".length();\r
}\r
- \r
+\r
int hostEnd = url.substring(hostStart).indexOf("/");\r
// Handle URL which doesn't have a path (path is implicitly '/')\r
- hostEnd = (hostEnd == -1 ? url.length() : hostStart + hostEnd);\r
- \r
- String host = url.substring(hostStart, hostEnd);\r
+ hostEnd = (hostEnd == -1 ? urlNoDots.length() : hostStart + hostEnd);\r
+\r
+ String host = urlNoDots.substring(hostStart, hostEnd);\r
host = (toASCII ? IDN.toASCII(host) : IDN.toUnicode(host));\r
- \r
- return url.substring(0, hostStart) + host + url.substring(hostEnd);\r
+\r
+ return dots + urlNoDots.substring(0, hostStart) + host + urlNoDots.substring(hostEnd);\r
} else {\r
- return url;\r
+ return dots + url;\r
}\r
}\r
\r
return path;\r
}\r
\r
+\r
+ /**\r
+ * Gets the screen size in pixels in a backwards compatible way\r
+ *\r
+ * @param caller Activity calling; needed to get access to the {@link android.view.WindowManager}\r
+ * @return Size in pixels of the screen, or default {@link Point} if caller is null\r
+ */\r
+ public static Point getScreenSize(Activity caller) {\r
+ Point size = new Point();\r
+ if (caller != null) {\r
+ Display display = caller.getWindowManager().getDefaultDisplay();\r
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB_MR2) {\r
+ display.getSize(size);\r
+ } else {\r
+ size.set(display.getWidth(), display.getHeight());\r
+ }\r
+ }\r
+ return size;\r
+ }\r
+\r
}\r
}
- public static String getErrorCauseMessage(RemoteOperationResult result, RemoteOperation operation, Resources res) {
+ public static String getErrorCauseMessage(RemoteOperationResult result,
+ RemoteOperation operation, Resources res) {
String message = null;
if (operation instanceof UploadFileOperation) {
if (result.isSuccess()) {
- message = String.format(res.getString(R.string.uploader_upload_succeeded_content_single),
+ message = String.format(
+ res.getString(R.string.uploader_upload_succeeded_content_single),
((UploadFileOperation) operation).getFileName());
} else {
if (result.getCode() == ResultCode.LOCAL_STORAGE_FULL
|| result.getCode() == ResultCode.LOCAL_STORAGE_NOT_COPIED) {
- message = String.format(res.getString(R.string.error__upload__local_file_not_copied),
+ message = String.format(
+ res.getString(R.string.error__upload__local_file_not_copied),
((UploadFileOperation) operation).getFileName(),
res.getString(R.string.app_name));
/*
message = String.format(res.getString(R.string.forbidden_permissions),
res.getString(R.string.uploader_upload_forbidden_permissions));
+ } else if (result.getCode() == ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER) {
+ message = res.getString(R.string.filename_forbidden_charaters_from_server);
+
} else {
- message = String.format(res.getString(R.string.uploader_upload_failed_content_single),
+ message = String.format(
+ res.getString(R.string.uploader_upload_failed_content_single),
((UploadFileOperation) operation).getFileName());
}
}
} else if (operation instanceof DownloadFileOperation) {
if (result.isSuccess()) {
- message = String.format(res.getString(R.string.downloader_download_succeeded_content),
+ message = String.format(
+ res.getString(R.string.downloader_download_succeeded_content),
new File(((DownloadFileOperation) operation).getSavePath()).getName());
} else {
message = res.getString(R.string.downloader_download_file_not_found);
} else {
- message = String.format(res.getString(R.string.downloader_download_failed_content), new File(
+ message = String.format(
+ res.getString(R.string.downloader_download_failed_content), new File(
((DownloadFileOperation) operation).getSavePath()).getName());
}
}
} else if (isNetworkError(result.getCode())) {
message = getErrorMessage(result, res);
+ } else if (result.getCode() == ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER) {
+ message = res.getString(R.string.filename_forbidden_charaters_from_server);
+
} else {
message = res.getString(R.string.rename_server_fail_msg);
}
} else if (isNetworkError(result.getCode())) {
message = getErrorMessage(result, res);
+ } else if (result.getCode() == ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER) {
+ message = res.getString(R.string.filename_forbidden_charaters_from_server);
} else {
message = res.getString(R.string.create_dir_fail_msg);
}
} else if (operation instanceof CreateShareOperation) {
- if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { // Error --> SHARE_NOT_FOUND
+ if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { // Error --> SHARE_NOT_FOUND
message = res.getString(R.string.share_link_file_no_exist);
} else if (result.getCode() == ResultCode.SHARE_FORBIDDEN) {
} else if (operation instanceof UnshareLinkOperation) {
- if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { // Error --> SHARE_NOT_FOUND
+ if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { // Error --> SHARE_NOT_FOUND
message = res.getString(R.string.unshare_link_file_no_exist);
} else if (result.getCode() == ResultCode.SHARE_FORBIDDEN) {
message = String.format(res.getString(R.string.forbidden_permissions),
res.getString(R.string.forbidden_permissions_move));
- }else { // Generic error
+ } else if (result.getCode() == ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER) {
+ message = res.getString(R.string.filename_forbidden_charaters_from_server);
+
+ } else { // Generic error
// Show a Message, operation finished without success
message = res.getString(R.string.move_file_error);
}
package com.owncloud.android.utils;
+import android.annotation.TargetApi;
+import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.provider.DocumentsContract;
+import android.provider.MediaStore;
+import android.provider.OpenableColumns;
+
+import com.owncloud.android.MainApp;
+import com.owncloud.android.lib.common.utils.Log_OC;
+
+import java.io.File;
/**
* A helper class for some Uri operations.
*/
public class UriUtils {
-
+
+ public static final String TAG = UriUtils.class.getSimpleName();
+
public static final String URI_CONTENT_SCHEME = "content://";
public static boolean isContentDocument(Uri uri) {
return uri.toString().startsWith(URI_CONTENT_SCHEME);
}
+
+
+ /**
+ * Translates a content:// URI referred to a local file file to a path on the local filesystem
+ *
+ * @param uri The URI to resolve
+ * @return The path in the file system to the content or null if it could not be found (not a file)
+ */
+ @TargetApi(Build.VERSION_CODES.KITKAT)
+ public static String getLocalPath(Uri uri, Context context) {
+ final boolean isKitKatOrLater = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+
+ // DocumentProvider
+ if (isKitKatOrLater && DocumentsContract.isDocumentUri(context, uri)) {
+ // ExternalStorageProvider
+ if (UriUtils.isExternalStorageDocument(uri)) {
+ final String docId = DocumentsContract.getDocumentId(uri);
+ final String[] split = docId.split(":");
+ final String type = split[0];
+
+ if ("primary".equalsIgnoreCase(type)) {
+ return Environment.getExternalStorageDirectory() + "/" + split[1];
+ }
+ }
+ // DownloadsProvider
+ else if (UriUtils.isDownloadsDocument(uri)) {
+
+ final String id = DocumentsContract.getDocumentId(uri);
+ final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
+ Long.valueOf(id));
+
+ return UriUtils.getDataColumn(context, contentUri, null, null);
+ }
+ // MediaProvider
+ else if (UriUtils.isMediaDocument(uri)) {
+ final String docId = DocumentsContract.getDocumentId(uri);
+ final String[] split = docId.split(":");
+ final String type = split[0];
+
+ Uri contentUri = null;
+ if ("image".equals(type)) {
+ contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
+ } else if ("video".equals(type)) {
+ contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
+ } else if ("audio".equals(type)) {
+ contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
+ }
+
+ final String selection = "_id=?";
+ final String[] selectionArgs = new String[] { split[1] };
+
+ return UriUtils.getDataColumn(context, contentUri, selection, selectionArgs);
+ }
+ // Documents providers returned as content://...
+ else if (UriUtils.isContentDocument(uri)) {
+ return uri.toString();
+ }
+ }
+ // MediaStore (and general)
+ else if ("content".equalsIgnoreCase(uri.getScheme())) {
+
+ // Return the remote address
+ if (UriUtils.isGooglePhotosUri(uri))
+ return uri.getLastPathSegment();
+
+ return UriUtils.getDataColumn(context, uri, null, null);
+ }
+ // File
+ else if ("file".equalsIgnoreCase(uri.getScheme())) {
+ return uri.getPath();
+ }
+ return null;
+ }
+
}