Selaa lähdekoodia

Merge branch 'develop' into refactor_remote_saml_authentication

masensio 11 vuotta sitten
vanhempi
commit
f4dc4e45f8

+ 61 - 0
oc_framework-test-project/oc_framework-test-test/src/com/owncloud/android/oc_framework_test_project/test/ReadFileTest.java

@@ -0,0 +1,61 @@
+/* ownCloud Android client application
+ *   Copyright (C) 2012-2013 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.oc_framework_test_project.test;
+
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
+import com.owncloud.android.oc_framework_test_project.TestActivity;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+/**
+ * Class to test Read File Operation
+ * @author masensio
+ *
+ */
+
+public class ReadFileTest extends 	ActivityInstrumentationTestCase2<TestActivity> {
+	
+	/* File data to read. This file must exist on the account */
+    private final String mRemoteFolderPath = "/fileToRead.txt";
+    
+    
+    private TestActivity mActivity;
+    
+    public ReadFileTest() {
+        super(TestActivity.class);
+    }
+    
+    @Override
+      protected void setUp() throws Exception {
+        super.setUp();
+        setActivityInitialTouchMode(false);
+        mActivity = getActivity();
+    }
+
+    /**
+     * Test Read File
+     */
+    public void testReadFile() {
+
+            RemoteOperationResult result = mActivity.readFile(mRemoteFolderPath);
+            assertTrue(result.getData().size() ==  1);
+            assertTrue(result.isSuccess());
+    }
+    
+
+}

+ 11 - 1
oc_framework/src/com/owncloud/android/oc_framework/operations/RemoteFile.java

@@ -22,6 +22,7 @@ import java.io.Serializable;
 import android.os.Parcel;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.Parcelable;
 
 
+import com.owncloud.android.oc_framework.network.webdav.WebdavEntry;
 import com.owncloud.android.oc_framework.utils.FileUtils;
 import com.owncloud.android.oc_framework.utils.FileUtils;
 
 
 /**
 /**
@@ -33,7 +34,7 @@ import com.owncloud.android.oc_framework.utils.FileUtils;
 public class RemoteFile implements Parcelable, Serializable {
 public class RemoteFile implements Parcelable, Serializable {
 
 
 	/** Generated - should be refreshed every time the class changes!! */
 	/** Generated - should be refreshed every time the class changes!! */
-	private static final long serialVersionUID = 7256606476031992757L;
+	private static final long serialVersionUID = 532139091191390616L;
 	
 	
 	private String mRemotePath;
 	private String mRemotePath;
 	private String mMimeType;
 	private String mMimeType;
@@ -108,6 +109,15 @@ public class RemoteFile implements Parcelable, Serializable {
         }
         }
         mRemotePath = path;
         mRemotePath = path;
 	}
 	}
+	
+	public RemoteFile(WebdavEntry we) {
+        this(we.decodedPath());
+        this.setCreationTimestamp(we.createTimestamp());
+        this.setLength(we.contentLength());
+        this.setMimeType(we.contentType());
+        this.setModifiedTimestamp(we.modifiedTimestamp());
+        this.setEtag(we.etag());
+	}
 
 
 	/**
 	/**
      * Used internally. Reset all file properties
      * Used internally. Reset all file properties

+ 2 - 2
oc_framework/src/com/owncloud/android/oc_framework/operations/RemoteOperationResult.java

@@ -99,7 +99,7 @@ public class RemoteOperationResult implements Serializable {
     private String mRedirectedLocation;
     private String mRedirectedLocation;
 
 
     private ArrayList<RemoteFile> mFiles;
     private ArrayList<RemoteFile> mFiles;
-	
+    
     public RemoteOperationResult(ResultCode code) {
     public RemoteOperationResult(ResultCode code) {
         mCode = code;
         mCode = code;
         mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || code == ResultCode.OK_NO_SSL);
         mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || code == ResultCode.OK_NO_SSL);
@@ -320,7 +320,7 @@ public class RemoteOperationResult implements Serializable {
         } else if (mCode == ResultCode.ACCOUNT_NOT_THE_SAME) {
         } else if (mCode == ResultCode.ACCOUNT_NOT_THE_SAME) {
             return "Authenticated with a different account than the one updating";
             return "Authenticated with a different account than the one updating";
         } else if (mCode == ResultCode.INVALID_CHARACTER_IN_NAME) {
         } else if (mCode == ResultCode.INVALID_CHARACTER_IN_NAME) {
-        	return "The file name contains an forbidden character";
+                return "The file name contains an forbidden character";
         }
         }
 
 
         return "Operation finished with HTTP status code " + mHttpCode + " (" + (isSuccess() ? "success" : "fail") + ")";
         return "Operation finished with HTTP status code " + mHttpCode + " (" + (isSuccess() ? "success" : "fail") + ")";

+ 108 - 0
oc_framework/src/com/owncloud/android/oc_framework/operations/remote/ReadRemoteFileOperation.java

@@ -0,0 +1,108 @@
+/* ownCloud Android client application
+ *   Copyright (C) 2012-2013 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.oc_framework.operations.remote;
+
+import java.util.ArrayList;
+
+import org.apache.http.HttpStatus;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.MultiStatus;
+import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
+
+import android.util.Log;
+
+import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
+import com.owncloud.android.oc_framework.network.webdav.WebdavEntry;
+import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
+import com.owncloud.android.oc_framework.operations.RemoteFile;
+import com.owncloud.android.oc_framework.operations.RemoteOperation;
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
+
+
+/**
+ * Remote operation performing the read a file from the ownCloud server.
+ * 
+ * @author David A. Velasco
+ * @author masensio
+ */
+
+public class ReadRemoteFileOperation extends RemoteOperation {
+
+    private static final String TAG = ReadRemoteFileOperation.class.getSimpleName();
+    private static final int SYNC_READ_TIMEOUT = 10000;
+    private static final int SYNC_CONNECTION_TIMEOUT = 5000;
+    
+    private String mRemotePath;
+    
+	
+    /**
+     * Constructor
+     * 
+     * @param remotePath		Remote path of the file. 
+     */
+    public ReadRemoteFileOperation(String remotePath) {
+    	mRemotePath = remotePath;
+    }
+
+    /**
+     * Performs the read operation.
+     * 
+     * @param client		Client object to communicate with the remote ownCloud server.
+     */
+    @Override
+    protected RemoteOperationResult run(WebdavClient client) {
+    	PropFindMethod propfind = null;
+    	RemoteOperationResult result = null;
+
+    	/// take the duty of check the server for the current state of the file there
+    	try {
+    		propfind = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(mRemotePath),
+    				DavConstants.PROPFIND_ALL_PROP,
+    				DavConstants.DEPTH_0);
+    		int status;
+    		status = client.executeMethod(propfind, SYNC_READ_TIMEOUT, SYNC_CONNECTION_TIMEOUT);
+
+    		boolean isMultiStatus = status == HttpStatus.SC_MULTI_STATUS;
+    		if (isMultiStatus) {
+    			// Parse response
+    			MultiStatus resp = propfind.getResponseBodyAsMultiStatus();
+				WebdavEntry we = new WebdavEntry(resp.getResponses()[0], client.getBaseUri().getPath());
+				RemoteFile remoteFile = new RemoteFile(we);
+				ArrayList<RemoteFile> files = new ArrayList<RemoteFile>();
+				files.add(remoteFile);
+
+    			// Result of the operation
+    			result = new RemoteOperationResult(true, status, propfind.getResponseHeaders());
+    			result.setData(files);
+    			
+    		} else {
+    			client.exhaustResponse(propfind.getResponseBodyAsStream());
+    			result = new RemoteOperationResult(false, status, propfind.getResponseHeaders());
+    		}
+
+    	} catch (Exception e) {
+    		result = new RemoteOperationResult(e);
+    		e.printStackTrace();
+    		Log.e(TAG, "Synchronizing  file " + mRemotePath + ": " + result.getLogMessage(), result.getException());
+    	} finally {
+    		if (propfind != null)
+    			propfind.releaseConnection();
+    	}
+    	return result;
+    }
+
+}

+ 2 - 0
oc_framework/src/com/owncloud/android/oc_framework/utils/FileUtils.java

@@ -66,4 +66,6 @@ public class FileUtils {
 		}
 		}
 		return result;
 		return result;
 	}
 	}
+
+	
 }
 }

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

@@ -30,6 +30,7 @@
   <string name="recommend_subject">Experimente %1$s no seu smartphone!</string>
   <string name="recommend_subject">Experimente %1$s no seu smartphone!</string>
   <string name="recommend_text">Quero convidá-lo para experimentar %1$s no seu smartphone!\nDescarregue aqui: %2$s</string>
   <string name="recommend_text">Quero convidá-lo para experimentar %1$s no seu smartphone!\nDescarregue aqui: %2$s</string>
   <string name="auth_check_server">Verificar Servidor</string>
   <string name="auth_check_server">Verificar Servidor</string>
+  <string name="auth_host_url">Endereço do servidor https://..</string>
   <string name="auth_username">Nome de Utilizador</string>
   <string name="auth_username">Nome de Utilizador</string>
   <string name="auth_password">Palavra-passe</string>
   <string name="auth_password">Palavra-passe</string>
   <string name="auth_register">Novo em %1$s?</string>
   <string name="auth_register">Novo em %1$s?</string>

+ 18 - 47
src/com/owncloud/android/files/services/FileUploader.java

@@ -28,29 +28,24 @@ import java.util.Vector;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ConcurrentMap;
 
 
-import org.apache.http.HttpStatus;
-import org.apache.jackrabbit.webdav.DavConstants;
-import org.apache.jackrabbit.webdav.MultiStatus;
-import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
-
 import com.owncloud.android.R;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AuthenticatorActivity;
 import com.owncloud.android.authentication.AuthenticatorActivity;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.db.DbHandler;
 import com.owncloud.android.db.DbHandler;
 import com.owncloud.android.operations.CreateFolderOperation;
 import com.owncloud.android.operations.CreateFolderOperation;
+import com.owncloud.android.oc_framework.operations.RemoteFile;
 import com.owncloud.android.oc_framework.operations.RemoteOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
 import com.owncloud.android.operations.UploadFileOperation;
 import com.owncloud.android.operations.UploadFileOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
 import com.owncloud.android.oc_framework.operations.remote.ExistenceCheckRemoteOperation;
 import com.owncloud.android.oc_framework.operations.remote.ExistenceCheckRemoteOperation;
+import com.owncloud.android.oc_framework.operations.remote.ReadRemoteFileOperation;
 import com.owncloud.android.oc_framework.utils.OwnCloudVersion;
 import com.owncloud.android.oc_framework.utils.OwnCloudVersion;
 import com.owncloud.android.oc_framework.network.webdav.OnDatatransferProgressListener;
 import com.owncloud.android.oc_framework.network.webdav.OnDatatransferProgressListener;
 import com.owncloud.android.oc_framework.accounts.OwnCloudAccount;
 import com.owncloud.android.oc_framework.accounts.OwnCloudAccount;
 import com.owncloud.android.oc_framework.network.webdav.OwnCloudClientFactory;
 import com.owncloud.android.oc_framework.network.webdav.OwnCloudClientFactory;
 import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
 import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
-import com.owncloud.android.oc_framework.network.webdav.WebdavEntry;
-import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
 import com.owncloud.android.ui.activity.FailedUploadActivity;
 import com.owncloud.android.ui.activity.FailedUploadActivity;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
@@ -610,40 +605,15 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
         long syncDate = System.currentTimeMillis();
         long syncDate = System.currentTimeMillis();
         file.setLastSyncDateForData(syncDate);
         file.setLastSyncDateForData(syncDate);
 
 
-        // / new PROPFIND to keep data consistent with server in theory, should
-        // return the same we already have
-        PropFindMethod propfind = null;
-        RemoteOperationResult result = null;
-        try {
-            propfind = new PropFindMethod(mUploadClient.getBaseUri() + WebdavUtils.encodePath(mCurrentUpload.getRemotePath()),
-                    DavConstants.PROPFIND_ALL_PROP,
-                    DavConstants.DEPTH_0);
-            int status = mUploadClient.executeMethod(propfind);
-            boolean isMultiStatus = (status == HttpStatus.SC_MULTI_STATUS);
-            if (isMultiStatus) {
-                MultiStatus resp = propfind.getResponseBodyAsMultiStatus();
-                WebdavEntry we = new WebdavEntry(resp.getResponses()[0], mUploadClient.getBaseUri().getPath());
-                updateOCFile(file, we);
-                file.setLastSyncDateForProperties(syncDate);
-
-            } else {
-                mUploadClient.exhaustResponse(propfind.getResponseBodyAsStream());
-            }
-
-            result = new RemoteOperationResult(isMultiStatus, status, propfind.getResponseHeaders());
-            Log_OC.i(TAG, "Update: synchronizing properties for uploaded " + mCurrentUpload.getRemotePath() + ": "
-                    + result.getLogMessage());
-
-        } catch (Exception e) {
-            result = new RemoteOperationResult(e);
-            Log_OC.e(TAG, "Update: synchronizing properties for uploaded " + mCurrentUpload.getRemotePath() + ": "
-                    + result.getLogMessage(), e);
-
-        } finally {
-            if (propfind != null)
-                propfind.releaseConnection();
+        // new PROPFIND to keep data consistent with server 
+        // in theory, should return the same we already have
+        ReadRemoteFileOperation operation = new ReadRemoteFileOperation(mCurrentUpload.getRemotePath());
+        RemoteOperationResult result = operation.execute(mUploadClient);
+        if (result.isSuccess()) {
+            updateOCFile(file, result.getData().get(0));
+            file.setLastSyncDateForProperties(syncDate);
         }
         }
-
+        
         // / maybe this would be better as part of UploadFileOperation... or
         // / maybe this would be better as part of UploadFileOperation... or
         // maybe all this method
         // maybe all this method
         if (mCurrentUpload.wasRenamed()) {
         if (mCurrentUpload.wasRenamed()) {
@@ -660,13 +630,13 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
         mStorageManager.saveFile(file);
         mStorageManager.saveFile(file);
     }
     }
 
 
-    private void updateOCFile(OCFile file, WebdavEntry we) {
-        file.setCreationTimestamp(we.createTimestamp());
-        file.setFileLength(we.contentLength());
-        file.setMimetype(we.contentType());
-        file.setModificationTimestamp(we.modifiedTimestamp());
-        file.setModificationTimestampAtLastSyncForData(we.modifiedTimestamp());
-        // file.setEtag(mCurrentUpload.getEtag());    // TODO Etag, where available
+    private void updateOCFile(OCFile file, RemoteFile remoteFile) {
+        file.setCreationTimestamp(remoteFile.getCreationTimestamp());
+        file.setFileLength(remoteFile.getLength());
+        file.setMimetype(remoteFile.getMimeType());
+        file.setModificationTimestamp(remoteFile.getModifiedTimestamp());
+        file.setModificationTimestampAtLastSyncForData(remoteFile.getModifiedTimestamp());
+        // file.setEtag(remoteFile.getEtag());    // TODO Etag, where available
     }
     }
 
 
     private OCFile obtainNewOCFileToUpload(String remotePath, String localPath, String mimeType,
     private OCFile obtainNewOCFileToUpload(String remotePath, String localPath, String mimeType,
@@ -787,6 +757,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
             }
             }
             showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, upload.getFile());
             showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, upload.getFile());
             showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, upload.getAccount());
             showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, upload.getAccount());
+            showDetailsIntent.putExtra(FileActivity.EXTRA_FROM_NOTIFICATION, true);
             showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
             mNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(),
                     (int) System.currentTimeMillis(), showDetailsIntent, 0);
                     (int) System.currentTimeMillis(), showDetailsIntent, 0);

+ 76 - 115
src/com/owncloud/android/operations/SynchronizeFileOperation.java

@@ -18,33 +18,32 @@
 
 
 package com.owncloud.android.operations;
 package com.owncloud.android.operations;
 
 
-import org.apache.http.HttpStatus;
-import org.apache.jackrabbit.webdav.DavConstants;
-import org.apache.jackrabbit.webdav.MultiStatus;
-import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
-
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.services.FileDownloader;
 import com.owncloud.android.files.services.FileDownloader;
 import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
 import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
-import com.owncloud.android.oc_framework.network.webdav.WebdavEntry;
-import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
 import com.owncloud.android.oc_framework.operations.RemoteOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.oc_framework.operations.remote.ReadRemoteFileOperation;
+import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.Log_OC;
 import com.owncloud.android.utils.Log_OC;
 
 
 import android.accounts.Account;
 import android.accounts.Account;
 import android.content.Context;
 import android.content.Context;
 import android.content.Intent;
 import android.content.Intent;
 
 
+/**
+ * Remote operation performing the read of remote file in the ownCloud server.
+ * 
+ * @author David A. Velasco
+ * @author masensio
+ */
 
 
 public class SynchronizeFileOperation extends RemoteOperation {
 public class SynchronizeFileOperation extends RemoteOperation {
 
 
     private String TAG = SynchronizeFileOperation.class.getSimpleName();
     private String TAG = SynchronizeFileOperation.class.getSimpleName();
-    private static final int SYNC_READ_TIMEOUT = 10000;
-    private static final int SYNC_CONNECTION_TIMEOUT = 5000;
     
     
     private OCFile mLocalFile;
     private OCFile mLocalFile;
     private OCFile mServerFile;
     private OCFile mServerFile;
@@ -74,103 +73,83 @@ public class SynchronizeFileOperation extends RemoteOperation {
 
 
     @Override
     @Override
     protected RemoteOperationResult run(WebdavClient client) {
     protected RemoteOperationResult run(WebdavClient client) {
-        
-        PropFindMethod propfind = null;
+
         RemoteOperationResult result = null;
         RemoteOperationResult result = null;
         mTransferWasRequested = false;
         mTransferWasRequested = false;
-        try {
-            if (!mLocalFile.isDown()) {
-                /// easy decision
-                requestForDownload(mLocalFile);
-                result = new RemoteOperationResult(ResultCode.OK);
-                
-            } else {
-                /// local copy in the device -> need to think a bit more before do anything
-                
-                if (mServerFile == null) {
-                    /// take the duty of check the server for the current state of the file there
-                    propfind = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(mLocalFile.getRemotePath()),
-                            DavConstants.PROPFIND_ALL_PROP,
-                            DavConstants.DEPTH_0);
-                    int status = client.executeMethod(propfind, SYNC_READ_TIMEOUT, SYNC_CONNECTION_TIMEOUT);
-                    boolean isMultiStatus = status == HttpStatus.SC_MULTI_STATUS;
-                    if (isMultiStatus) {
-                        MultiStatus resp = propfind.getResponseBodyAsMultiStatus();
-                        WebdavEntry we = new WebdavEntry(resp.getResponses()[0],
-                                               client.getBaseUri().getPath());
-                        mServerFile = fillOCFile(we);
-                        mServerFile.setLastSyncDateForProperties(System.currentTimeMillis());
-                        
-                    } else {
-                        client.exhaustResponse(propfind.getResponseBodyAsStream());
-                        result = new RemoteOperationResult(false, status, propfind.getResponseHeaders());
-                    }
+        if (!mLocalFile.isDown()) {
+            /// easy decision
+            requestForDownload(mLocalFile);
+            result = new RemoteOperationResult(ResultCode.OK);
+
+        } else {
+            /// local copy in the device -> need to think a bit more before do anything
+
+            if (mServerFile == null) {
+                String remotePath = mLocalFile.getRemotePath();
+                ReadRemoteFileOperation operation = new ReadRemoteFileOperation(remotePath);
+                result = operation.execute(client);
+                if (result.isSuccess()){
+                    mServerFile = FileStorageUtils.fillOCFile(result.getData().get(0));
+                    mServerFile.setLastSyncDateForProperties(System.currentTimeMillis());
                 }
                 }
-                
-                if (result == null) {   // true if the server was not checked. nothing was wrong with the remote request
-              
-                    /// check changes in server and local file
-                    boolean serverChanged = false;
-                    /* time for eTag is coming, but not yet
+            }
+
+            if (result.isSuccess()) {   
+
+                /// check changes in server and local file
+                boolean serverChanged = false;
+                /* time for eTag is coming, but not yet
                     if (mServerFile.getEtag() != null) {
                     if (mServerFile.getEtag() != null) {
                         serverChanged = (!mServerFile.getEtag().equals(mLocalFile.getEtag()));   // TODO could this be dangerous when the user upgrades the server from non-tagged to tagged?
                         serverChanged = (!mServerFile.getEtag().equals(mLocalFile.getEtag()));   // TODO could this be dangerous when the user upgrades the server from non-tagged to tagged?
                     } else { */
                     } else { */
-                        // server without etags
-                        serverChanged = (mServerFile.getModificationTimestamp() > mLocalFile.getModificationTimestampAtLastSyncForData());
-                    //}
-                    boolean localChanged = (mLocalFile.getLocalModificationTimestamp() > mLocalFile.getLastSyncDateForData());
-                        // TODO this will be always true after the app is upgraded to database version 2; will result in unnecessary uploads
-              
-                    /// decide action to perform depending upon changes
-                    //if (!mLocalFile.getEtag().isEmpty() && localChanged && serverChanged) {
-                    if (localChanged && serverChanged) {
-                        result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT);
-                  
-                    } else if (localChanged) {
-                        if (mSyncFileContents) {
-                            requestForUpload(mLocalFile);
-                            // the local update of file properties will be done by the FileUploader service when the upload finishes
-                        } else {
-                            // NOTHING TO DO HERE: updating the properties of the file in the server without uploading the contents would be stupid; 
-                            // So, an instance of SynchronizeFileOperation created with syncFileContents == false is completely useless when we suspect
-                            // that an upload is necessary (for instance, in FileObserverService).
-                        }
-                        result = new RemoteOperationResult(ResultCode.OK);
-                  
-                    } else if (serverChanged) {
-                        if (mSyncFileContents) {
-                            requestForDownload(mLocalFile); // local, not server; we won't to keep the value of keepInSync!
-                            // the update of local data will be done later by the FileUploader service when the upload finishes
-                        } else {
-                            // TODO CHECK: is this really useful in some point in the code?
-                            mServerFile.setKeepInSync(mLocalFile.keepInSync());
-                            mServerFile.setLastSyncDateForData(mLocalFile.getLastSyncDateForData());
-                            mServerFile.setStoragePath(mLocalFile.getStoragePath());
-                            mServerFile.setParentId(mLocalFile.getParentId());
-                            mStorageManager.saveFile(mServerFile);
-                            
-                        }
-                        result = new RemoteOperationResult(ResultCode.OK);
-              
+                // server without etags
+                serverChanged = (mServerFile.getModificationTimestamp() != mLocalFile.getModificationTimestampAtLastSyncForData());
+                //}
+                boolean localChanged = (mLocalFile.getLocalModificationTimestamp() > mLocalFile.getLastSyncDateForData());
+                // TODO this will be always true after the app is upgraded to database version 2; will result in unnecessary uploads
+
+                /// decide action to perform depending upon changes
+                //if (!mLocalFile.getEtag().isEmpty() && localChanged && serverChanged) {
+                if (localChanged && serverChanged) {
+                    result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT);
+
+                } else if (localChanged) {
+                    if (mSyncFileContents) {
+                        requestForUpload(mLocalFile);
+                        // the local update of file properties will be done by the FileUploader service when the upload finishes
                     } else {
                     } else {
-                        // nothing changed, nothing to do
-                        result = new RemoteOperationResult(ResultCode.OK);
+                        // NOTHING TO DO HERE: updating the properties of the file in the server without uploading the contents would be stupid; 
+                        // So, an instance of SynchronizeFileOperation created with syncFileContents == false is completely useless when we suspect
+                        // that an upload is necessary (for instance, in FileObserverService).
                     }
                     }
-              
-                } 
-          
-            }
-            
-            Log_OC.i(TAG, "Synchronizing " + mAccount.name + ", file " + mLocalFile.getRemotePath() + ": " + result.getLogMessage());
-          
-        } catch (Exception e) {
-            result = new RemoteOperationResult(e);
-            Log_OC.e(TAG, "Synchronizing " + mAccount.name + ", file " + (mLocalFile != null ? mLocalFile.getRemotePath() : "NULL") + ": " + result.getLogMessage(), result.getException());
-
-        } finally {
-            if (propfind != null)
-                propfind.releaseConnection();
+                    result = new RemoteOperationResult(ResultCode.OK);
+
+                } else if (serverChanged) {
+                    if (mSyncFileContents) {
+                        requestForDownload(mLocalFile); // local, not server; we won't to keep the value of keepInSync!
+                        // the update of local data will be done later by the FileUploader service when the upload finishes
+                    } else {
+                        // TODO CHECK: is this really useful in some point in the code?
+                        mServerFile.setKeepInSync(mLocalFile.keepInSync());
+                        mServerFile.setLastSyncDateForData(mLocalFile.getLastSyncDateForData());
+                        mServerFile.setStoragePath(mLocalFile.getStoragePath());
+                        mServerFile.setParentId(mLocalFile.getParentId());
+                        mStorageManager.saveFile(mServerFile);
+
+                    }
+                    result = new RemoteOperationResult(ResultCode.OK);
+
+                } else {
+                    // nothing changed, nothing to do
+                    result = new RemoteOperationResult(ResultCode.OK);
+                }
+
+            } 
+
         }
         }
+
+        Log_OC.i(TAG, "Synchronizing " + mAccount.name + ", file " + mLocalFile.getRemotePath() + ": " + result.getLogMessage());
+
         return result;
         return result;
     }
     }
 
 
@@ -207,24 +186,6 @@ public class SynchronizeFileOperation extends RemoteOperation {
     }
     }
 
 
 
 
-    /**
-     * Creates and populates a new {@link OCFile} object with the data read from the server.
-     * 
-     * @param we        WebDAV entry read from the server for a WebDAV resource (remote file or folder).
-     * @return          New OCFile instance representing the remote resource described by we.
-     */
-    private OCFile fillOCFile(WebdavEntry we) {
-        OCFile file = new OCFile(we.decodedPath());
-        file.setCreationTimestamp(we.createTimestamp());
-        file.setFileLength(we.contentLength());
-        file.setMimetype(we.contentType());
-        file.setModificationTimestamp(we.modifiedTimestamp());
-        file.setEtag(we.etag());
-        
-        return file;
-    }
-
-
     public boolean transferWasRequested() {
     public boolean transferWasRequested() {
         return mTransferWasRequested;
         return mTransferWasRequested;
     }
     }

+ 13 - 56
src/com/owncloud/android/operations/SynchronizeFolderOperation.java

@@ -30,9 +30,6 @@ import java.util.Map;
 import java.util.Vector;
 import java.util.Vector;
 
 
 import org.apache.http.HttpStatus;
 import org.apache.http.HttpStatus;
-import org.apache.jackrabbit.webdav.DavConstants;
-import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
-
 import android.accounts.Account;
 import android.accounts.Account;
 import android.content.Context;
 import android.content.Context;
 import android.content.Intent;
 import android.content.Intent;
@@ -40,11 +37,10 @@ import android.content.Intent;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
 import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
-import com.owncloud.android.oc_framework.network.webdav.WebdavEntry;
-import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
 import com.owncloud.android.oc_framework.operations.RemoteOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.oc_framework.operations.remote.ReadRemoteFileOperation;
 import com.owncloud.android.oc_framework.operations.remote.ReadRemoteFolderOperation;
 import com.owncloud.android.oc_framework.operations.remote.ReadRemoteFolderOperation;
 import com.owncloud.android.oc_framework.operations.RemoteFile;
 import com.owncloud.android.oc_framework.operations.RemoteFile;
 import com.owncloud.android.syncadapter.FileSyncService;
 import com.owncloud.android.syncadapter.FileSyncService;
@@ -188,48 +184,27 @@ public class SynchronizeFolderOperation extends RemoteOperation {
         mRemoteFolderChanged = false;
         mRemoteFolderChanged = false;
         RemoteOperationResult result = null;
         RemoteOperationResult result = null;
         String remotePath = null;
         String remotePath = null;
-        PropFindMethod query = null;
-        
-        try {
+
             remotePath = mLocalFolder.getRemotePath();
             remotePath = mLocalFolder.getRemotePath();
             Log_OC.d(TAG, "Checking changes in " + mAccount.name + remotePath);
             Log_OC.d(TAG, "Checking changes in " + mAccount.name + remotePath);
 
 
             // remote request 
             // remote request 
-            query = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(remotePath),
-                    DavConstants.PROPFIND_ALL_PROP,
-                    DavConstants.DEPTH_0);
-            int status = client.executeMethod(query);
-
-            // check and process response
-            if (isMultiStatus(status)) {
-                // parse data from remote folder 
-                WebdavEntry we = new WebdavEntry(query.getResponseBodyAsMultiStatus().getResponses()[0], client.getBaseUri().getPath());
-                OCFile remoteFolder = fillOCFile(we);
-                
-                // check if remote and local folder are different
-                mRemoteFolderChanged = !(remoteFolder.getEtag().equalsIgnoreCase(mLocalFolder.getEtag()));
-                
-                result = new RemoteOperationResult(ResultCode.OK);
+            ReadRemoteFileOperation operation = new ReadRemoteFileOperation(remotePath);
+            result = operation.execute(client);
+            if (result.isSuccess()){
+                OCFile remoteFolder = FileStorageUtils.fillOCFile(result.getData().get(0));
                 
                 
+             // check if remote and local folder are different
+              mRemoteFolderChanged = !(remoteFolder.getEtag().equalsIgnoreCase(mLocalFolder.getEtag()));
+              
+              result = new RemoteOperationResult(ResultCode.OK);
+
+              Log_OC.i(TAG, "Checked " + mAccount.name + remotePath + " : " + (mRemoteFolderChanged ? "changed" : "not changed"));
             } else {
             } else {
                 // check failed
                 // check failed
-                client.exhaustResponse(query.getResponseBodyAsStream());
-                if (status == HttpStatus.SC_NOT_FOUND) {
+                if (result.getCode() == ResultCode.FILE_NOT_FOUND) {
                     removeLocalFolder();
                     removeLocalFolder();
                 }
                 }
-                result = new RemoteOperationResult(false, status, query.getResponseHeaders());
-            }
-
-        } catch (Exception e) {
-            result = new RemoteOperationResult(e);
-            
-
-        } finally {
-            if (query != null)
-                query.releaseConnection();  // let the connection available for other methods
-            if (result.isSuccess()) {
-                Log_OC.i(TAG, "Checked " + mAccount.name + remotePath + " : " + (mRemoteFolderChanged ? "changed" : "not changed"));
-            } else {
                 if (result.isException()) {
                 if (result.isException()) {
                     Log_OC.e(TAG, "Checked " + mAccount.name + remotePath  + " : " + result.getLogMessage(), result.getException());
                     Log_OC.e(TAG, "Checked " + mAccount.name + remotePath  + " : " + result.getLogMessage(), result.getException());
                 } else {
                 } else {
@@ -237,7 +212,6 @@ public class SynchronizeFolderOperation extends RemoteOperation {
                 }
                 }
             }
             }
             
             
-        }
         return result;
         return result;
     }
     }
 
 
@@ -398,23 +372,6 @@ public class SynchronizeFolderOperation extends RemoteOperation {
         return (status == HttpStatus.SC_MULTI_STATUS); 
         return (status == HttpStatus.SC_MULTI_STATUS); 
     }
     }
 
 
-    
-    /**
-     * Creates and populates a new {@link OCFile} object with the data read from the server.
-     * 
-     * @param we        WebDAV entry read from the server for a WebDAV resource (remote file or folder).
-     * @return          New OCFile instance representing the remote resource described by we.
-     */
-    private OCFile fillOCFile(WebdavEntry we) {
-        OCFile file = new OCFile(we.decodedPath());
-        file.setCreationTimestamp(we.createTimestamp());
-        file.setFileLength(we.contentLength());
-        file.setMimetype(we.contentType());
-        file.setModificationTimestamp(we.modifiedTimestamp());
-        file.setEtag(we.etag());
-        return file;
-    }
-
     /**
     /**
      * Creates and populates a new {@link OCFile} object with the data read from the server.
      * Creates and populates a new {@link OCFile} object with the data read from the server.
      * 
      * 

+ 13 - 0
src/com/owncloud/android/ui/activity/FileActivity.java

@@ -47,6 +47,7 @@ public abstract class FileActivity extends SherlockFragmentActivity {
     public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE";
     public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE";
     public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT";
     public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT";
     public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW";
     public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW";
+    public static final String EXTRA_FROM_NOTIFICATION= "com.owncloud.android.ui.activity.FROM_NOTIFICATION";
     
     
     public static final String TAG = FileActivity.class.getSimpleName(); 
     public static final String TAG = FileActivity.class.getSimpleName(); 
     
     
@@ -65,6 +66,9 @@ public abstract class FileActivity extends SherlockFragmentActivity {
     
     
     /** Flag to signal when the value of mAccount was restored from a saved state */ 
     /** Flag to signal when the value of mAccount was restored from a saved state */ 
     private boolean mAccountWasRestored;
     private boolean mAccountWasRestored;
+    
+    /** Flag to signal if the activity is launched by a notification */
+    private boolean mFromNotification;
 
 
     
     
     /**
     /**
@@ -82,9 +86,11 @@ public abstract class FileActivity extends SherlockFragmentActivity {
         if(savedInstanceState != null) {
         if(savedInstanceState != null) {
             account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
             account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
             mFile = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE);
             mFile = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE);
+            mFromNotification = savedInstanceState.getBoolean(FileActivity.EXTRA_FROM_NOTIFICATION);
         } else {
         } else {
             account = getIntent().getParcelableExtra(FileActivity.EXTRA_ACCOUNT);
             account = getIntent().getParcelableExtra(FileActivity.EXTRA_ACCOUNT);
             mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE);
             mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE);
+            mFromNotification = getIntent().getBooleanExtra(FileActivity.EXTRA_FROM_NOTIFICATION, false);
         }
         }
 
 
         setAccount(account, savedInstanceState != null);
         setAccount(account, savedInstanceState != null);
@@ -191,6 +197,7 @@ public abstract class FileActivity extends SherlockFragmentActivity {
         super.onSaveInstanceState(outState);
         super.onSaveInstanceState(outState);
         outState.putParcelable(FileActivity.EXTRA_FILE, mFile);
         outState.putParcelable(FileActivity.EXTRA_FILE, mFile);
         outState.putParcelable(FileActivity.EXTRA_ACCOUNT, mAccount);
         outState.putParcelable(FileActivity.EXTRA_ACCOUNT, mAccount);
+        outState.putBoolean(FileActivity.EXTRA_FROM_NOTIFICATION, mFromNotification);
     }
     }
     
     
     
     
@@ -223,6 +230,12 @@ public abstract class FileActivity extends SherlockFragmentActivity {
         return mAccount;
         return mAccount;
     }
     }
 
 
+    /**
+     * @return Value of mFromNotification: True if the Activity is launched by a notification
+     */
+    public boolean fromNotification() {
+        return mFromNotification;
+    }
     
     
     /**
     /**
      * @return  'True' when the Activity is finishing to enforce the setup of a new account.
      * @return  'True' when the Activity is finishing to enforce the setup of a new account.

+ 2 - 0
src/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -162,6 +162,8 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
         // PIN CODE request ;  best location is to decide, let's try this first
         // PIN CODE request ;  best location is to decide, let's try this first
         if (getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN) && savedInstanceState == null) {
         if (getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN) && savedInstanceState == null) {
             requestPinCode();
             requestPinCode();
+        } else if (getIntent().getAction() == null && savedInstanceState == null) {
+            requestPinCode();
         }
         }
 
 
         /// file observer
         /// file observer

+ 81 - 80
src/com/owncloud/android/ui/activity/PinCodeActivity.java

@@ -46,23 +46,23 @@ public class PinCodeActivity extends SherlockFragmentActivity {
     public final static String EXTRA_ACTIVITY = "com.owncloud.android.ui.activity.PinCodeActivity.ACTIVITY";
     public final static String EXTRA_ACTIVITY = "com.owncloud.android.ui.activity.PinCodeActivity.ACTIVITY";
     public final static String EXTRA_NEW_STATE = "com.owncloud.android.ui.activity.PinCodeActivity.NEW_STATE";
     public final static String EXTRA_NEW_STATE = "com.owncloud.android.ui.activity.PinCodeActivity.NEW_STATE";
     
     
-    Button bCancel;
-    TextView mPinHdr;
-    TextView mPinHdrExplanation;
-    EditText mText1;
-    EditText mText2;
-    EditText mText3;
-    EditText mText4;
+    private Button mBCancel;
+    private TextView mPinHdr;
+    private TextView mPinHdrExplanation;
+    private EditText mText1;
+    private EditText mText2;
+    private EditText mText3;
+    private EditText mText4;
     
     
-    String [] tempText ={"","","",""};
+    private String [] mTempText ={"","","",""};
     
     
-    String activity;
+    private String mActivity;
     
     
-    boolean confirmingPinCode = false;
-    boolean pinCodeChecked = false;
-    boolean newPasswordEntered = false;
-    boolean bChange = true; // to control that only one blocks jump
-    int tCounter ; // Count the number of attempts an user could introduce the PIN code
+    private boolean mConfirmingPinCode = false;
+    private boolean mPinCodeChecked = false;
+    private boolean mNewPasswordEntered = false;
+    private boolean mBChange = true; // to control that only one blocks jump
+    //private int mTCounter ; // Count the number of attempts an user could introduce the PIN code
 
 
     
     
     protected void onCreate(Bundle savedInstanceState) {
     protected void onCreate(Bundle savedInstanceState) {
@@ -70,9 +70,9 @@ public class PinCodeActivity extends SherlockFragmentActivity {
         setContentView(R.layout.pincodelock); 
         setContentView(R.layout.pincodelock); 
         
         
         Intent intent = getIntent();
         Intent intent = getIntent();
-        activity = intent.getStringExtra(EXTRA_ACTIVITY);
+        mActivity = intent.getStringExtra(EXTRA_ACTIVITY);
      
      
-        bCancel = (Button) findViewById(R.id.cancel);
+        mBCancel = (Button) findViewById(R.id.cancel);
         mPinHdr = (TextView) findViewById(R.id.pinHdr);
         mPinHdr = (TextView) findViewById(R.id.pinHdr);
         mPinHdrExplanation = (TextView) findViewById(R.id.pinHdrExpl);
         mPinHdrExplanation = (TextView) findViewById(R.id.pinHdrExpl);
         mText1 = (EditText) findViewById(R.id.txt1);
         mText1 = (EditText) findViewById(R.id.txt1);
@@ -90,23 +90,23 @@ public class PinCodeActivity extends SherlockFragmentActivity {
         // In a previous version settings is allow from start
         // In a previous version settings is allow from start
         if ( (appPrefs.getString("PrefPinCode1", null) == null ) ){
         if ( (appPrefs.getString("PrefPinCode1", null) == null ) ){
             setChangePincodeView(true);
             setChangePincodeView(true);
-            pinCodeChecked = true; 
-            newPasswordEntered = true;
+            mPinCodeChecked = true; 
+            mNewPasswordEntered = true;
             
             
         }else{ 
         }else{ 
             
             
             if (appPrefs.getBoolean("set_pincode", false)){
             if (appPrefs.getBoolean("set_pincode", false)){
                // pincode activated
                // pincode activated
-               if (activity.equals("preferences")){
+               if (mActivity.equals("preferences")){
                 // PIN has been activated yet
                 // PIN has been activated yet
                  mPinHdr.setText(R.string.pincode_configure_your_pin);
                  mPinHdr.setText(R.string.pincode_configure_your_pin);
                  mPinHdrExplanation.setVisibility(View.VISIBLE);
                  mPinHdrExplanation.setVisibility(View.VISIBLE);
-                 pinCodeChecked = true ; // No need to check it 
+                 mPinCodeChecked = true ; // No need to check it 
                  setChangePincodeView(true);
                  setChangePincodeView(true);
                }else{
                }else{
                 // PIN active
                 // PIN active
-                 bCancel.setVisibility(View.INVISIBLE);
-                 bCancel.setVisibility(View.GONE);
+                 mBCancel.setVisibility(View.INVISIBLE);
+                 mBCancel.setVisibility(View.GONE);
                  mPinHdr.setText(R.string.pincode_enter_pin_code);
                  mPinHdr.setText(R.string.pincode_enter_pin_code);
                  mPinHdrExplanation.setVisibility(View.INVISIBLE);
                  mPinHdrExplanation.setVisibility(View.INVISIBLE);
                  setChangePincodeView(false);
                  setChangePincodeView(false);
@@ -116,7 +116,7 @@ public class PinCodeActivity extends SherlockFragmentActivity {
             // pincode removal
             // pincode removal
               mPinHdr.setText(R.string.pincode_remove_your_pincode);
               mPinHdr.setText(R.string.pincode_remove_your_pincode);
               mPinHdrExplanation.setVisibility(View.INVISIBLE);
               mPinHdrExplanation.setVisibility(View.INVISIBLE);
-              pinCodeChecked = false;
+              mPinCodeChecked = false;
               setChangePincodeView(true); 
               setChangePincodeView(true); 
            }
            }
            
            
@@ -130,15 +130,15 @@ public class PinCodeActivity extends SherlockFragmentActivity {
 
 
      
      
     protected void setInitVars(){
     protected void setInitVars(){
-        confirmingPinCode = false;
-        pinCodeChecked = false;
-        newPasswordEntered = false;
+        mConfirmingPinCode = false;
+        mPinCodeChecked = false;
+        mNewPasswordEntered = false;
 
 
     }
     }
     
     
     protected void setInitView(){
     protected void setInitView(){
-        bCancel.setVisibility(View.INVISIBLE);
-        bCancel.setVisibility(View.GONE);
+        mBCancel.setVisibility(View.INVISIBLE);
+        mBCancel.setVisibility(View.GONE);
         mPinHdr.setText(R.string.pincode_enter_pin_code);
         mPinHdr.setText(R.string.pincode_enter_pin_code);
         mPinHdrExplanation.setVisibility(View.INVISIBLE);
         mPinHdrExplanation.setVisibility(View.INVISIBLE);
     }
     }
@@ -147,8 +147,8 @@ public class PinCodeActivity extends SherlockFragmentActivity {
     protected void setChangePincodeView(boolean state){
     protected void setChangePincodeView(boolean state){
        
        
         if(state){
         if(state){
-        bCancel.setVisibility(View.VISIBLE);
-        bCancel.setOnClickListener(new OnClickListener() {
+        mBCancel.setVisibility(View.VISIBLE);
+        mBCancel.setOnClickListener(new OnClickListener() {
         @Override
         @Override
         public void onClick(View v) {
         public void onClick(View v) {
             
             
@@ -195,8 +195,8 @@ public class PinCodeActivity extends SherlockFragmentActivity {
             @Override
             @Override
             public void afterTextChanged(Editable s) {
             public void afterTextChanged(Editable s) {
                 if (s.length() > 0) {
                 if (s.length() > 0) {
-                    if (!confirmingPinCode){
-                       tempText[0] = mText1.getText().toString();
+                    if (!mConfirmingPinCode){
+                       mTempText[0] = mText1.getText().toString();
                        
                        
                     }
                     }
                     mText2.requestFocus();
                     mText2.requestFocus();
@@ -224,8 +224,8 @@ public class PinCodeActivity extends SherlockFragmentActivity {
             @Override
             @Override
             public void afterTextChanged(Editable s) {
             public void afterTextChanged(Editable s) {
                 if (s.length() > 0) {
                 if (s.length() > 0) {
-                    if (!confirmingPinCode){
-                        tempText[1] = mText2.getText().toString();
+                    if (!mConfirmingPinCode){
+                        mTempText[1] = mText2.getText().toString();
                     }
                     }
                     
                     
                     mText3.requestFocus();
                     mText3.requestFocus();
@@ -237,16 +237,16 @@ public class PinCodeActivity extends SherlockFragmentActivity {
 
 
             @Override
             @Override
             public boolean onKey(View v, int keyCode, KeyEvent event) {
             public boolean onKey(View v, int keyCode, KeyEvent event) {
-                if (keyCode == KeyEvent.KEYCODE_DEL && bChange) {
+                if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
 
 
                     mText1.setText("");
                     mText1.setText("");
                     mText1.requestFocus();
                     mText1.requestFocus();
-                    if (!confirmingPinCode)
-                       tempText[0] = "";
-                    bChange= false;
+                    if (!mConfirmingPinCode)
+                       mTempText[0] = "";
+                    mBChange= false;
                 
                 
-                }else if(!bChange){
-                    bChange=true;
+                }else if(!mBChange){
+                    mBChange=true;
                     
                     
                 }
                 }
                 return false;
                 return false;
@@ -288,8 +288,8 @@ public class PinCodeActivity extends SherlockFragmentActivity {
             @Override
             @Override
             public void afterTextChanged(Editable s) {
             public void afterTextChanged(Editable s) {
                 if (s.length() > 0) {
                 if (s.length() > 0) {
-                    if (!confirmingPinCode){
-                        tempText[2] = mText3.getText().toString();
+                    if (!mConfirmingPinCode){
+                        mTempText[2] = mText3.getText().toString();
                     }
                     }
                     mText4.requestFocus();
                     mText4.requestFocus();
                 }
                 }
@@ -300,15 +300,15 @@ public class PinCodeActivity extends SherlockFragmentActivity {
 
 
             @Override
             @Override
             public boolean onKey(View v, int keyCode, KeyEvent event) {
             public boolean onKey(View v, int keyCode, KeyEvent event) {
-                if (keyCode == KeyEvent.KEYCODE_DEL && bChange) {
+                if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
                     mText2.requestFocus();
                     mText2.requestFocus();
-                    if (!confirmingPinCode)
-                        tempText[1] = "";
+                    if (!mConfirmingPinCode)
+                        mTempText[1] = "";
                     mText2.setText("");
                     mText2.setText("");
-                    bChange= false;
+                    mBChange= false;
                     
                     
-                }else if(!bChange){
-                    bChange=true;                        
+                }else if(!mBChange){
+                    mBChange=true;                        
                     
                     
                 }
                 }
                 return false;
                 return false;
@@ -356,18 +356,19 @@ public class PinCodeActivity extends SherlockFragmentActivity {
             public void afterTextChanged(Editable s) {
             public void afterTextChanged(Editable s) {
                 if (s.length() > 0) {
                 if (s.length() > 0) {
                     
                     
-                    if (!confirmingPinCode){
-                       tempText[3] = mText4.getText().toString();
+                    if (!mConfirmingPinCode){
+                       mTempText[3] = mText4.getText().toString();
                     }
                     }
                     mText1.requestFocus();
                     mText1.requestFocus();
 
 
-                    if (!pinCodeChecked){
-                        pinCodeChecked = checkPincode();
+                    if (!mPinCodeChecked){
+                        mPinCodeChecked = checkPincode();
                     }
                     }
                     
                     
-                    if (pinCodeChecked && activity.equals("FileDisplayActivity")){
+                    if (mPinCodeChecked && 
+                            ( mActivity.equals("FileDisplayActivity") || mActivity.equals("PreviewImageActivity") ) ){
                         finish();
                         finish();
-                    } else if (pinCodeChecked){
+                    } else if (mPinCodeChecked){
                         
                         
                         Intent intent = getIntent();
                         Intent intent = getIntent();
                         String newState = intent.getStringExtra(EXTRA_NEW_STATE);
                         String newState = intent.getStringExtra(EXTRA_NEW_STATE);
@@ -383,7 +384,7 @@ public class PinCodeActivity extends SherlockFragmentActivity {
                             
                             
                         }else{
                         }else{
                         
                         
-                            if (!confirmingPinCode){
+                            if (!mConfirmingPinCode){
                                 pinCodeChangeRequest();
                                 pinCodeChangeRequest();
                              
                              
                             } else {
                             } else {
@@ -403,15 +404,15 @@ public class PinCodeActivity extends SherlockFragmentActivity {
 
 
             @Override
             @Override
             public boolean onKey(View v, int keyCode, KeyEvent event) {
             public boolean onKey(View v, int keyCode, KeyEvent event) {
-                if (keyCode == KeyEvent.KEYCODE_DEL && bChange) {
+                if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
                     mText3.requestFocus();
                     mText3.requestFocus();
-                    if (!confirmingPinCode)
-                        tempText[2]="";
+                    if (!mConfirmingPinCode)
+                        mTempText[2]="";
                     mText3.setText("");
                     mText3.setText("");
-                    bChange= false;
+                    mBChange= false;
                     
                     
-                }else if(!bChange){
-                    bChange=true;    
+                }else if(!mBChange){
+                    mBChange=true;    
                 }
                 }
                 return false;
                 return false;
             }
             }
@@ -456,7 +457,7 @@ public class PinCodeActivity extends SherlockFragmentActivity {
         clearBoxes(); 
         clearBoxes(); 
         mPinHdr.setText(R.string.pincode_reenter_your_pincode); 
         mPinHdr.setText(R.string.pincode_reenter_your_pincode); 
         mPinHdrExplanation.setVisibility(View.INVISIBLE);        
         mPinHdrExplanation.setVisibility(View.INVISIBLE);        
-        confirmingPinCode =true;
+        mConfirmingPinCode =true;
         
         
     }
     }
     
     
@@ -472,16 +473,16 @@ public class PinCodeActivity extends SherlockFragmentActivity {
         String pText3 = appPrefs.getString("PrefPinCode3", null);
         String pText3 = appPrefs.getString("PrefPinCode3", null);
         String pText4 = appPrefs.getString("PrefPinCode4", null);
         String pText4 = appPrefs.getString("PrefPinCode4", null);
 
 
-        if ( tempText[0].equals(pText1) && 
-             tempText[1].equals(pText2) &&
-             tempText[2].equals(pText3) &&
-             tempText[3].equals(pText4) ) {
+        if ( mTempText[0].equals(pText1) && 
+             mTempText[1].equals(pText2) &&
+             mTempText[2].equals(pText3) &&
+             mTempText[3].equals(pText4) ) {
             
             
             return true;
             return true;
         
         
         
         
         }else {
         }else {
-            Arrays.fill(tempText, null);
+            Arrays.fill(mTempText, null);
             AlertDialog aDialog = new AlertDialog.Builder(this).create();
             AlertDialog aDialog = new AlertDialog.Builder(this).create();
             CharSequence errorSeq = getString(R.string.common_error);
             CharSequence errorSeq = getString(R.string.common_error);
             aDialog.setTitle(errorSeq);
             aDialog.setTitle(errorSeq);
@@ -500,8 +501,8 @@ public class PinCodeActivity extends SherlockFragmentActivity {
             clearBoxes(); 
             clearBoxes(); 
             mPinHdr.setText(R.string.pincode_enter_pin_code);
             mPinHdr.setText(R.string.pincode_enter_pin_code);
             mPinHdrExplanation.setVisibility(View.INVISIBLE);
             mPinHdrExplanation.setVisibility(View.INVISIBLE);
-            newPasswordEntered = true;
-            confirmingPinCode = false;
+            mNewPasswordEntered = true;
+            mConfirmingPinCode = false;
             
             
         }
         }
      
      
@@ -511,23 +512,23 @@ public class PinCodeActivity extends SherlockFragmentActivity {
     
     
     protected void confirmPincode(){
     protected void confirmPincode(){
         
         
-        confirmingPinCode = false;
+        mConfirmingPinCode = false;
         
         
         String rText1 = mText1.getText().toString();
         String rText1 = mText1.getText().toString();
         String rText2 = mText2.getText().toString();
         String rText2 = mText2.getText().toString();
         String rText3 = mText3.getText().toString();
         String rText3 = mText3.getText().toString();
         String rText4 = mText4.getText().toString();
         String rText4 = mText4.getText().toString();
         
         
-        if ( tempText[0].equals(rText1) && 
-             tempText[1].equals(rText2) &&
-             tempText[2].equals(rText3) &&
-             tempText[3].equals(rText4) ) {
+        if ( mTempText[0].equals(rText1) && 
+             mTempText[1].equals(rText2) &&
+             mTempText[2].equals(rText3) &&
+             mTempText[3].equals(rText4) ) {
                         
                         
             savePincodeAndExit();
             savePincodeAndExit();
             
             
         } else {
         } else {
             
             
-            Arrays.fill(tempText, null);
+            Arrays.fill(mTempText, null);
             AlertDialog aDialog = new AlertDialog.Builder(this).create();
             AlertDialog aDialog = new AlertDialog.Builder(this).create();
             CharSequence errorSeq = getString(R.string.common_error);
             CharSequence errorSeq = getString(R.string.common_error);
             aDialog.setTitle(errorSeq);
             aDialog.setTitle(errorSeq);
@@ -584,10 +585,10 @@ public class PinCodeActivity extends SherlockFragmentActivity {
         SharedPreferences.Editor appPrefs = PreferenceManager
         SharedPreferences.Editor appPrefs = PreferenceManager
                 .getDefaultSharedPreferences(getApplicationContext()).edit();
                 .getDefaultSharedPreferences(getApplicationContext()).edit();
         
         
-        appPrefs.putString("PrefPinCode1", tempText[0]);
-        appPrefs.putString("PrefPinCode2",tempText[1]);
-        appPrefs.putString("PrefPinCode3", tempText[2]);
-        appPrefs.putString("PrefPinCode4", tempText[3]);
+        appPrefs.putString("PrefPinCode1", mTempText[0]);
+        appPrefs.putString("PrefPinCode2",mTempText[1]);
+        appPrefs.putString("PrefPinCode3", mTempText[2]);
+        appPrefs.putString("PrefPinCode4", mTempText[3]);
         appPrefs.putBoolean("set_pincode",true);
         appPrefs.putBoolean("set_pincode",true);
         appPrefs.commit();
         appPrefs.commit();
         
         
@@ -612,7 +613,7 @@ public class PinCodeActivity extends SherlockFragmentActivity {
     public boolean onKeyDown(int keyCode, KeyEvent event){
     public boolean onKeyDown(int keyCode, KeyEvent event){
         if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()== 0){
         if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()== 0){
             
             
-            if (activity.equals("preferences")){
+            if (mActivity.equals("preferences")){
                 SharedPreferences.Editor appPrefsE = PreferenceManager
                 SharedPreferences.Editor appPrefsE = PreferenceManager
             
             
                     .getDefaultSharedPreferences(getApplicationContext()).edit();
                     .getDefaultSharedPreferences(getApplicationContext()).edit();

+ 22 - 0
src/com/owncloud/android/ui/preview/PreviewImageActivity.java

@@ -22,8 +22,10 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.content.ServiceConnection;
+import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.IBinder;
+import android.preference.PreferenceManager;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
 import android.support.v4.app.FragmentTransaction;
@@ -45,6 +47,7 @@ import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
+import com.owncloud.android.ui.activity.PinCodeActivity;
 import com.owncloud.android.ui.dialog.LoadingDialog;
 import com.owncloud.android.ui.dialog.LoadingDialog;
 import com.owncloud.android.ui.fragment.FileFragment;
 import com.owncloud.android.ui.fragment.FileFragment;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
@@ -95,6 +98,11 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C
         actionBar.setDisplayHomeAsUpEnabled(true);
         actionBar.setDisplayHomeAsUpEnabled(true);
         actionBar.hide();
         actionBar.hide();
         
         
+        // PIN CODE request
+        if (getIntent().getExtras() != null && savedInstanceState == null && fromNotification()) {
+            requestPinCode();
+        }         
+        
         mFullScreen = true;
         mFullScreen = true;
         if (savedInstanceState != null) {
         if (savedInstanceState != null) {
             mRequestWaitingForBinder = savedInstanceState.getBoolean(KEY_WAITING_FOR_BINDER);
             mRequestWaitingForBinder = savedInstanceState.getBoolean(KEY_WAITING_FOR_BINDER);
@@ -459,4 +467,18 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C
     }
     }
     
     
     
     
+    /**
+     * Launch an intent to request the PIN code to the user before letting him use the app
+     */
+    private void requestPinCode() {
+        boolean pinStart = false;
+        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+        pinStart = appPrefs.getBoolean("set_pincode", false);
+        if (pinStart) {
+            Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);
+            i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "PreviewImageActivity");
+            startActivity(i);
+        }
+    }
+    
 }
 }

+ 16 - 0
src/com/owncloud/android/utils/FileStorageUtils.java

@@ -84,6 +84,22 @@ public class FileStorageUtils {
         return parentPath;
         return parentPath;
     }
     }
     
     
+    /**
+     * Creates and populates a new {@link OCFile} object with the data read from the server.
+     * 
+     * @param remote    remote file read from the server (remote file or folder).
+     * @return          New OCFile instance representing the remote resource described by we.
+     */
+    public static OCFile fillOCFile(RemoteFile remote) {
+        OCFile file = new OCFile(remote.getRemotePath());
+        file.setCreationTimestamp(remote.getCreationTimestamp());
+        file.setFileLength(remote.getLength());
+        file.setMimetype(remote.getMimeType());
+        file.setModificationTimestamp(remote.getModifiedTimestamp());
+        file.setEtag(remote.getEtag());
+        
+        return file;
+    }
     
     
     /**
     /**
      * Creates and populates a new {@link RemoteFile} object with the data read from an {@link OCFile}.
      * Creates and populates a new {@link RemoteFile} object with the data read from an {@link OCFile}.