Browse Source

Merge branch 'develop' into navigationDrawer_basic

Conflicts FIXED:
	res/layout/files.xml
David A. Velasco 9 years ago
parent
commit
66f3a45d05
85 changed files with 4616 additions and 33 deletions
  1. 32 0
      automationTest/.classpath
  2. 5 0
      automationTest/.gitignore
  3. 23 0
      automationTest/.project
  4. 12 0
      automationTest/.settings/org.eclipse.jdt.core.prefs
  5. 4 0
      automationTest/.settings/org.eclipse.m2e.core.prefs
  6. 20 0
      automationTest/README.md
  7. 78 0
      automationTest/pom.xml
  8. 4 0
      automationTest/resources/.gitignore
  9. 244 0
      automationTest/src/test/java/com/owncloud/android/test/ui/actions/Actions.java
  10. 22 0
      automationTest/src/test/java/com/owncloud/android/test/ui/groups/FailingTestCategory.java
  11. 138 0
      automationTest/src/test/java/com/owncloud/android/test/ui/groups/FlexibleCategories.java
  12. 24 0
      automationTest/src/test/java/com/owncloud/android/test/ui/groups/IgnoreTestCategory.java
  13. 5 0
      automationTest/src/test/java/com/owncloud/android/test/ui/groups/InProgressCategory.java
  14. 25 0
      automationTest/src/test/java/com/owncloud/android/test/ui/groups/NoIgnoreTestCategory.java
  15. 23 0
      automationTest/src/test/java/com/owncloud/android/test/ui/groups/OtherTestCategory.java
  16. 141 0
      automationTest/src/test/java/com/owncloud/android/test/ui/groups/PatternClasspathClassesFinder.java
  17. 25 0
      automationTest/src/test/java/com/owncloud/android/test/ui/groups/SmokeTestCategory.java
  18. 25 0
      automationTest/src/test/java/com/owncloud/android/test/ui/groups/UnfinishedTestCategory.java
  19. 49 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/CertificatePopUp.java
  20. 94 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/ElementMenuOptions.java
  21. 61 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/FileDetailsView.java
  22. 211 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/FileListView.java
  23. 58 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/GmailEmailListView.java
  24. 50 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/GmailEmailView.java
  25. 63 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/GmailSendMailView.java
  26. 80 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/ImageView.java
  27. 115 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/LoginForm.java
  28. 47 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/MenuList.java
  29. 57 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/MoveView.java
  30. 58 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/NewFolderPopUp.java
  31. 54 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/NotificationView.java
  32. 60 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/PassCodeRequestView.java
  33. 71 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/PassCodeView.java
  34. 46 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/RemoveConfirmationView.java
  35. 101 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/SettingsView.java
  36. 48 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/ShareView.java
  37. 67 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/UploadFilesView.java
  38. 46 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/UploadView.java
  39. 44 0
      automationTest/src/test/java/com/owncloud/android/test/ui/models/WaitAMomentPopUp.java
  40. 1 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/.gitignore
  41. 203 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/Common.java
  42. 54 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/Config.java
  43. 94 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/CreateFolderTestSuite.java
  44. 87 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/DeleteFileTestSuite.java
  45. 92 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/DeleteFolderTestSuite.java
  46. 181 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/LoginTestSuite.java
  47. 77 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/LogoutTestSuite.java
  48. 120 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/MoveFileTestSuite.java
  49. 122 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/MoveFolderTestSuite.java
  50. 98 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/PasscodeTestSuite.java
  51. 77 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RefreshFolderTestSuite.java
  52. 114 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RenameFileTestSuite.java
  53. 112 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RenameFolderTestSuite.java
  54. 44 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RunFailingTests.java
  55. 19 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RunInProgressTest.java
  56. 42 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RunNoIgnoreTests.java
  57. 42 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RunSmokeTests.java
  58. 133 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/ShareLinkFileTestSuite.java
  59. 285 0
      automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/UploadTestSuite.java
  60. 4 0
      automationTest/src/test/resources/.gitignore
  61. 1 1
      res/layout/file_details_empty.xml
  62. 5 2
      res/layout/files.xml
  63. 1 0
      res/values-ca/strings.xml
  64. 12 0
      res/values-da/strings.xml
  65. 1 0
      res/values-el/strings.xml
  66. 1 0
      res/values-en-rGB/strings.xml
  67. 5 0
      res/values-eo/strings.xml
  68. 1 0
      res/values-es/strings.xml
  69. 2 1
      res/values-fr/strings.xml
  70. 3 2
      res/values-gl/strings.xml
  71. 1 0
      res/values-it/strings.xml
  72. 1 0
      res/values-nb-rNO/strings.xml
  73. 1 0
      res/values-nl/strings.xml
  74. 14 0
      res/values-oc/strings.xml
  75. 13 0
      res/values-pl/strings.xml
  76. 1 0
      res/values-pt-rBR/strings.xml
  77. 2 0
      res/values-ru/strings.xml
  78. 1 0
      res/values-sk-rSK/strings.xml
  79. 14 1
      res/values-sl/strings.xml
  80. 2 0
      res/values-sr/strings.xml
  81. 184 26
      res/values-th-rTH/strings.xml
  82. 11 0
      res/values-tr/strings.xml
  83. 6 0
      res/values-tzl/strings.xml
  84. 1 0
      res/values-uk/strings.xml
  85. 1 0
      res/values/strings.xml

+ 32 - 0
automationTest/.classpath

@@ -0,0 +1,32 @@
+<?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>

+ 5 - 0
automationTest/.gitignore

@@ -0,0 +1,5 @@
+
+target/
+ScreenShots/
+.DS_Store
+Users/

+ 23 - 0
automationTest/.project

@@ -0,0 +1,23 @@
+<?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>

+ 12 - 0
automationTest/.settings/org.eclipse.jdt.core.prefs

@@ -0,0 +1,12 @@
+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

+ 4 - 0
automationTest/.settings/org.eclipse.m2e.core.prefs

@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1

+ 20 - 0
automationTest/README.md

@@ -0,0 +1,20 @@
+** 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

+ 78 - 0
automationTest/pom.xml

@@ -0,0 +1,78 @@
+<?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>

+ 4 - 0
automationTest/resources/.gitignore

@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore

+ 244 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/actions/Actions.java

@@ -0,0 +1,244 @@
+/**
+ *   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; 
+	}
+	
+}

+ 22 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/groups/FailingTestCategory.java

@@ -0,0 +1,22 @@
+/**
+ *   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 {}

+ 138 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/groups/FlexibleCategories.java

@@ -0,0 +1,138 @@
+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;
+ }
+}

+ 24 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/groups/IgnoreTestCategory.java

@@ -0,0 +1,24 @@
+/**
+ *   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 {}
+

+ 5 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/groups/InProgressCategory.java

@@ -0,0 +1,5 @@
+package com.owncloud.android.test.ui.groups;
+
+public interface InProgressCategory extends IgnoreTestCategory{
+
+}

+ 25 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/groups/NoIgnoreTestCategory.java

@@ -0,0 +1,25 @@
+/**
+ *   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 {
+
+}

+ 23 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/groups/OtherTestCategory.java

@@ -0,0 +1,23 @@
+/**
+ *   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 {}

+ 141 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/groups/PatternClasspathClassesFinder.java

@@ -0,0 +1,141 @@
+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;
+ }
+}

+ 25 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/groups/SmokeTestCategory.java

@@ -0,0 +1,25 @@
+/**
+ *   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 {
+
+}

+ 25 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/groups/UnfinishedTestCategory.java

@@ -0,0 +1,25 @@
+/**
+ *   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{
+
+}

+ 49 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/CertificatePopUp.java

@@ -0,0 +1,49 @@
+/**
+ *   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;
+	}
+
+}

+ 94 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/ElementMenuOptions.java

@@ -0,0 +1,94 @@
+/**
+ *   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;
+	}
+}

+ 61 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/FileDetailsView.java

@@ -0,0 +1,61 @@
+/**
+ *   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;
+	}
+}

+ 211 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/FileListView.java

@@ -0,0 +1,211 @@
+/**
+ *   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);
+	}
+
+}

+ 58 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/GmailEmailListView.java

@@ -0,0 +1,58 @@
+/**
+ *   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;
+	}
+	
+}

+ 50 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/GmailEmailView.java

@@ -0,0 +1,50 @@
+/**
+ *   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;
+	}
+}

+ 63 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/GmailSendMailView.java

@@ -0,0 +1,63 @@
+/**
+ *   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);
+	}
+}

+ 80 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/ImageView.java

@@ -0,0 +1,80 @@
+/**
+ *   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();
+	}
+}

+ 115 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/LoginForm.java

@@ -0,0 +1,115 @@
+/**
+ *   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;
+	}
+}

+ 47 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/MenuList.java

@@ -0,0 +1,47 @@
+/**
+ *   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;
+	}
+}

+ 57 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/MoveView.java

@@ -0,0 +1,57 @@
+/**
+ *   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);
+	}
+}

+ 58 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/NewFolderPopUp.java

@@ -0,0 +1,58 @@
+/**
+ *   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;
+	}
+}

+ 54 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/NotificationView.java

@@ -0,0 +1,54 @@
+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);
+	}
+
+}

+ 60 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/PassCodeRequestView.java

@@ -0,0 +1,60 @@
+/**
+ *   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);
+	}
+
+}

+ 71 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/PassCodeView.java

@@ -0,0 +1,71 @@
+/**
+ *   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;
+	}
+
+}

+ 46 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/RemoveConfirmationView.java

@@ -0,0 +1,46 @@
+/**
+ *   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;
+	}
+}

+ 101 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/SettingsView.java

@@ -0,0 +1,101 @@
+/**
+ *   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;
+	}
+
+}

+ 48 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/ShareView.java

@@ -0,0 +1,48 @@
+/**
+ *   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;
+	}
+	
+	
+}

+ 67 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/UploadFilesView.java

@@ -0,0 +1,67 @@
+/**
+ *   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();
+	}
+}

+ 46 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/UploadView.java

@@ -0,0 +1,46 @@
+/**
+ *   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();
+	}
+}

+ 44 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/models/WaitAMomentPopUp.java

@@ -0,0 +1,44 @@
+/**
+ *   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;
+	}
+}

+ 1 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/.gitignore

@@ -0,0 +1 @@
+Config.java

+ 203 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/Common.java

@@ -0,0 +1,203 @@
+/**
+ *   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\")")));
+	}
+
+}

+ 54 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/Config.java

@@ -0,0 +1,54 @@
+/**
+ *   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";
+
+}

+ 94 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/CreateFolderTestSuite.java

@@ -0,0 +1,94 @@
+/**
+ *   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();
+	}
+
+}

+ 87 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/DeleteFileTestSuite.java

@@ -0,0 +1,87 @@
+/**
+ *   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();
+	}
+
+}

+ 92 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/DeleteFolderTestSuite.java

@@ -0,0 +1,92 @@
+/**
+ *   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();
+	}
+
+}

+ 181 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/LoginTestSuite.java

@@ -0,0 +1,181 @@
+/**
+ *   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();
+	}
+	
+	
+}

+ 77 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/LogoutTestSuite.java

@@ -0,0 +1,77 @@
+/**
+ *   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();
+	}
+}

+ 120 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/MoveFileTestSuite.java

@@ -0,0 +1,120 @@
+/**
+ *   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();
+	}
+
+}

+ 122 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/MoveFolderTestSuite.java

@@ -0,0 +1,122 @@
+/**
+ *   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();
+	}
+
+
+}

+ 98 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/PasscodeTestSuite.java

@@ -0,0 +1,98 @@
+/**
+ *   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();
+	}
+
+}

+ 77 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RefreshFolderTestSuite.java

@@ -0,0 +1,77 @@
+/**
+ *   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();
+	}
+
+}

+ 114 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RenameFileTestSuite.java

@@ -0,0 +1,114 @@
+/**
+ *   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();
+	}
+
+}

+ 112 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RenameFolderTestSuite.java

@@ -0,0 +1,112 @@
+/**
+ *   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();
+	}
+
+}

+ 44 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RunFailingTests.java

@@ -0,0 +1,44 @@
+/**
+ *   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 {
+
+}

+ 19 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RunInProgressTest.java

@@ -0,0 +1,19 @@
+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 {
+
+}

+ 42 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RunNoIgnoreTests.java

@@ -0,0 +1,42 @@
+/**
+ *   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 {
+}

+ 42 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/RunSmokeTests.java

@@ -0,0 +1,42 @@
+/**
+ *   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 {
+}

+ 133 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/ShareLinkFileTestSuite.java

@@ -0,0 +1,133 @@
+/**
+ *   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();
+	}
+}

+ 285 - 0
automationTest/src/test/java/com/owncloud/android/test/ui/testSuites/UploadTestSuite.java

@@ -0,0 +1,285 @@
+/**
+ *   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();
+	}
+
+
+}
+

+ 4 - 0
automationTest/src/test/resources/.gitignore

@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore

+ 1 - 1
res/layout/file_details_empty.xml

@@ -21,7 +21,7 @@
 	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"

+ 5 - 2
res/layout/files.xml

@@ -30,7 +30,10 @@
         android:layout_height="match_parent"
         android:background="@color/background_color"
         android:baselineAligned="false"
-        android:orientation="horizontal" >
+        android:orientation="horizontal"
+        android:id="@+id/ListLayout"
+        android:contentDescription="@string/list_layout"
+        >
 
 
         <FrameLayout
@@ -52,4 +55,4 @@
         android:layout_height="match_parent"
         android:layout_gravity="start"/>
 
-</android.support.v4.widget.DrawerLayout>
+</android.support.v4.widget.DrawerLayout>

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

@@ -23,6 +23,7 @@
   <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_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>

+ 12 - 0
res/values-da/strings.xml

@@ -23,6 +23,7 @@
   <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_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>
@@ -74,6 +75,7 @@
   <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>
@@ -126,6 +128,15 @@
   <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="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>
@@ -295,4 +306,5 @@
   <string name="subject_token">%1$s delt \"%2$s\" 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>
 </resources>

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

@@ -75,6 +75,7 @@
   <string name="filedetails_download">Λήψη</string>
   <string name="filedetails_sync_file">Ανανέωση αρχείου</string>
   <string name="filedetails_renamed_in_upload_msg">Το αρχείο μετονομάστηκε σε %1$s κατά τη μεταφόρτωση</string>
+  <string name="list_layout">Διάταξη Λίστας</string>
   <string name="action_share_file">Διαμοιρασμός συνδέσμου</string>
   <string name="action_unshare_file">Ακύρωση διαμοιρασμού συνδέσμου</string>
   <string name="common_yes">Ναι</string>

+ 1 - 0
res/values-en-rGB/strings.xml

@@ -306,4 +306,5 @@
   <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>

+ 5 - 0
res/values-eo/strings.xml

@@ -37,6 +37,7 @@
   <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>
@@ -174,6 +175,8 @@
   <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>
@@ -182,7 +185,9 @@
   <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>

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

@@ -75,6 +75,7 @@
   <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>

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

@@ -76,6 +76,7 @@ Téléchargez-le ici : %2$s</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">Disposition 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>
@@ -134,7 +135,7 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq
   <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="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 démarrage de l\'application</string>
+  <string name="pass_code_configure_your_pass_code_explanation">Le code de sécurité sera demandé à chaque ouverture de l\'application</string>
   <string name="pass_code_reenter_your_pass_code">Veuillez à 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>

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

@@ -76,6 +76,7 @@ Descárgueo de aquí: %2$s</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>
@@ -150,7 +151,7 @@ Descárgueo de aquí: %2$s</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>
@@ -301,7 +302,7 @@ Descárgueo de aquí: %2$s</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="subject_token">%1$s compartiu «%2$s» con vostede</string>

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

@@ -75,6 +75,7 @@
   <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>

+ 1 - 0
res/values-nb-rNO/strings.xml

@@ -75,6 +75,7 @@
   <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>

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

@@ -76,6 +76,7 @@ Download hier: %2$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>

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

@@ -2,7 +2,9 @@
 <resources>
   <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>-->
   <string name="prefs_category_general">General</string>
@@ -10,11 +12,13 @@
   <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>
@@ -30,22 +34,32 @@
   <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="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>
 </resources>

+ 13 - 0
res/values-pl/strings.xml

@@ -23,6 +23,7 @@
   <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_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>
@@ -74,6 +75,7 @@
   <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>
@@ -126,6 +128,15 @@
   <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="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>
@@ -201,6 +212,7 @@
   <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>
@@ -295,4 +307,5 @@
   <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>

+ 1 - 0
res/values-pt-rBR/strings.xml

@@ -75,6 +75,7 @@
   <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>

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

@@ -202,6 +202,7 @@
   <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>
@@ -296,4 +297,5 @@
   <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>
 </resources>

+ 1 - 0
res/values-sk-rSK/strings.xml

@@ -150,6 +150,7 @@
   <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>

+ 14 - 1
res/values-sl/strings.xml

@@ -23,6 +23,7 @@
   <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_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>
@@ -74,6 +75,7 @@
   <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>
@@ -126,6 +128,15 @@
   <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="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>
@@ -201,6 +212,7 @@
   <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>
@@ -235,7 +247,7 @@
   <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>
@@ -295,4 +307,5 @@
   <string name="subject_token">Uporabnik %1$s je omogočil souporabo \"%2$s\".</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>
 </resources>

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

@@ -75,6 +75,7 @@
   <string name="filedetails_download">Преузми</string>
   <string name="filedetails_sync_file">Освежи фајл</string>
   <string name="filedetails_renamed_in_upload_msg">Фајл је преименован у %1$s током отпремања</string>
+  <string name="list_layout">Распоред листе</string>
   <string name="action_share_file">Веза дељења</string>
   <string name="action_unshare_file">Не дели везом</string>
   <string name="common_yes">Да</string>
@@ -306,4 +307,5 @@
   <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>
 </resources>

+ 184 - 26
res/values-th-rTH/strings.xml

@@ -1,35 +1,68 @@
 <?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_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>A-Z</item>
+    <item>ใหม่ที่สุด - เก่าที่สุด</item>
+  </string-array>
   <!--TODO re-enable when server-side folder size calculation is available   
     	<item>Biggest - Smallest</item>-->
   <string name="prefs_category_general">ทั่วไป</string>
-  <string name="prefs_category_more">มาก</string>
+  <string name="prefs_category_more">เพิ่มเติม</string>
   <string name="prefs_accounts">บัญชี</string>
   <string name="prefs_manage_accounts">บริหารจัดการบัญชี</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">ยังไม่มีเนื้อหาให้ต้องอัพโหลด</string>
-  <string name="uploader_wrn_no_content_text">ยังไม่ได้รับเนื้อหา ไม่มีอะไรให้ต้องอัพโหลด</string>
-  <string name="uploader_error_forbidden_content">%1$s ไม่อนุญาตให้เข้าถึงเนื้อหาที่ถูกแชร์ไว้</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_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>
@@ -40,7 +73,10 @@
   <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>
@@ -49,70 +85,135 @@
   <string name="common_cancel">ยกเลิก</string>
   <string name="common_save_exit">บันทึก &amp; ออก</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 ไฟล์ kept-in-sync ไม่สามารถผสานเชื่อมข้อมูลได้</string>
+  <string name="sync_conflicts_in_favourites_content">%1$d ไฟล์ kept-in-sync ไม่สามารถเชื่อมผสานข้อมูลได้</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="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">การเชื่อมต่อแบบรักษาความปลอดภัยไม่สามารถใช้งานได้</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">ทั้งเซิร์ฟเวอร์ระยะไกลและเซิร์ฟเวอร์ภายใน</string>
+  <string name="confirmation_remove_remote_and_local">ต้นทางและปลายทาง</string>
   <string name="remove_success_msg">ลบเรียบร้อยแล้ว</string>
-  <string name="remove_fail_msg">การลบออกไม่สามารถดำเนินการได้อย่างเสร็จสมบูรณ์</string>
+  <string name="remove_fail_msg">ไม่สามารถลบได้</string>
   <string name="rename_dialog_title">กรอกชื่อใหม่</string>
-  <string name="rename_local_fail_msg">ไฟล์คัดลอกภายในไม่สามารถเปลี่ยนชื่อได้, กรุณาเปลี่ยนเป็นชื่อใหม่</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="sync_file_nothing_to_do_msg">เนื้อหาของไฟล์มีข้อมูลอยู่แล้ว</string>
+  <string name="create_dir_fail_msg">ไม่สามารถสร้างโฟลเดอร์</string>
+  <string name="filename_forbidden_characters">ห้ามใช้ตัวอักษรดังนี้: / \\ &lt; &gt; : \" | ? *</string>
+  <string name="filename_empty">ต้องใส่ชื่อไฟล์</string>
   <string name="wait_a_moment">กรุณารอสักครู่</string>
-  <string name="filedisplay_unexpected_bad_get_content">เกิดปัญหาที่ไม่คาดคิด ; กรุณาลองใช้งานแอปฯอื่นๆ เพื่อเลือกไฟล์</string>
+  <string name="filedisplay_unexpected_bad_get_content">มีปัญหาเกิดขึ้น กรุณาเลือกไฟล์งานแอพฯอื่นๆ</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>
@@ -134,17 +235,74 @@
   <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">ปรับปรุงปัญหาความขัดแย้ง</string>
-  <string name="conflict_message">ไฟล์ระยะไกล %s ยังไม่ได้ถูกผสานข้อมูลกับไฟล์ในเครื่อง การดำเนินการต่อไปจะเป็นการแทนที่เนื้อหาของไฟล์ที่อยู่บนเซิร์ฟเวอร์</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="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>
 </resources>

+ 11 - 0
res/values-tr/strings.xml

@@ -23,6 +23,7 @@
   <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_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>
@@ -126,6 +127,15 @@
   <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="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>
@@ -296,4 +306,5 @@
   <string name="subject_token">%1$s sizinle \"%2$s\" paylaşımını yaptı</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>
 </resources>

+ 6 - 0
res/values-tzl/strings.xml

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

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

@@ -201,6 +201,7 @@
   <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>

+ 1 - 0
res/values/strings.xml

@@ -86,6 +86,7 @@
     <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>