Merge branch 'develop' into refactor_remote_operation_to_upload_file
authormasensio <masensio@solidgear.es>
Mon, 16 Dec 2013 12:26:45 +0000 (13:26 +0100)
committermasensio <masensio@solidgear.es>
Mon, 16 Dec 2013 12:26:45 +0000 (13:26 +0100)
Conflicts:
src/com/owncloud/android/files/services/FileUploader.java

1  2 
oc_framework/src/com/owncloud/android/oc_framework/operations/remote/ChunkedUploadRemoteFileOperation.java
src/com/owncloud/android/files/services/FileUploader.java

index bacbcc3,0000000..4df5fea
mode 100644,000000..100644
--- /dev/null
@@@ -1,94 -1,0 +1,94 @@@
-     private static final long CHUNK_SIZE = 1024000;
 +/* ownCloud Android client application
 + *   Copyright (C) 2012 Bartek Przybylski
 + *   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.io.File;
 +import java.io.IOException;
 +import java.io.RandomAccessFile;
 +import java.nio.channels.FileChannel;
 +import java.util.Random;
 +
 +import org.apache.commons.httpclient.HttpException;
 +import org.apache.commons.httpclient.methods.PutMethod;
 +
 +import com.owncloud.android.oc_framework.network.ProgressiveDataTransferer;
 +import com.owncloud.android.oc_framework.network.webdav.ChunkFromFileChannelRequestEntity;
 +import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
 +import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
 +
 +
 +import android.util.Log;
 +
 +
 +public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation {
 +    
++    public static final long CHUNK_SIZE = 1024000;
 +    private static final String OC_CHUNKED_HEADER = "OC-Chunked";
 +    private static final String TAG = ChunkedUploadRemoteFileOperation.class.getSimpleName();
 +
 +    public ChunkedUploadRemoteFileOperation(String storagePath, String remotePath, String mimeType) {
 +               super(storagePath, remotePath, mimeType);      
 +      }
 +    
 +    @Override
 +    protected int uploadFile(WebdavClient client) throws HttpException, IOException {
 +        int status = -1;
 +
 +        FileChannel channel = null;
 +        RandomAccessFile raf = null;
 +        try {
 +            File file = new File(mStoragePath);
 +            raf = new RandomAccessFile(file, "r");
 +            channel = raf.getChannel();
 +            mEntity = new ChunkFromFileChannelRequestEntity(channel, mMimeType, CHUNK_SIZE, file);
 +            //((ProgressiveDataTransferer)mEntity).addDatatransferProgressListeners(getDataTransferListeners());
 +            synchronized (mDataTransferListeners) {
 +                              ((ProgressiveDataTransferer)mEntity).addDatatransferProgressListeners(mDataTransferListeners);
 +                      }
 +            
 +            long offset = 0;
 +            String uriPrefix = client.getBaseUri() + WebdavUtils.encodePath(mRemotePath) + "-chunking-" + Math.abs((new Random()).nextInt(9000)+1000) + "-" ;
 +            long chunkCount = (long) Math.ceil((double)file.length() / CHUNK_SIZE);
 +            for (int chunkIndex = 0; chunkIndex < chunkCount ; chunkIndex++, offset += CHUNK_SIZE) {
 +                if (mPutMethod != null) {
 +                    mPutMethod.releaseConnection();    // let the connection available for other methods
 +                }
 +                mPutMethod = new PutMethod(uriPrefix + chunkCount + "-" + chunkIndex);
 +                mPutMethod.addRequestHeader(OC_CHUNKED_HEADER, OC_CHUNKED_HEADER);
 +                ((ChunkFromFileChannelRequestEntity)mEntity).setOffset(offset);
 +                mPutMethod.setRequestEntity(mEntity);
 +                status = client.executeMethod(mPutMethod);
 +                client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
 +                Log.d(TAG, "Upload of " + mStoragePath + " to " + mRemotePath + ", chunk index " + chunkIndex + ", count " + chunkCount + ", HTTP result status " + status);
 +                if (!isSuccess(status))
 +                    break;
 +            }
 +            
 +        } finally {
 +            if (channel != null)
 +                channel.close();
 +            if (raf != null)
 +                raf.close();
 +            if (mPutMethod != null)
 +                mPutMethod.releaseConnection();    // let the connection available for other methods
 +        }
 +        return status;
 +    }
 +
 +}
@@@ -38,15 -38,17 +38,15 @@@ import com.owncloud.android.authenticat
  import com.owncloud.android.datamodel.FileDataStorageManager;
  import com.owncloud.android.datamodel.OCFile;
  import com.owncloud.android.db.DbHandler;
 -import com.owncloud.android.operations.ChunkedUploadFileOperation;
  import com.owncloud.android.operations.CreateFolderOperation;
 -import com.owncloud.android.operations.ExistenceCheckOperation;
  import com.owncloud.android.oc_framework.operations.RemoteOperation;
  import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
  import com.owncloud.android.operations.UploadFileOperation;
  import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
 +import com.owncloud.android.oc_framework.operations.remote.ExistenceCheckRemoteOperation;
  import com.owncloud.android.oc_framework.utils.OwnCloudVersion;
  import com.owncloud.android.oc_framework.network.webdav.OnDatatransferProgressListener;
  import com.owncloud.android.oc_framework.accounts.OwnCloudAccount;
 -import com.owncloud.android.oc_framework.network.webdav.ChunkFromFileChannelRequestEntity;
  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.WebdavEntry;
@@@ -57,6 -59,7 +57,7 @@@ import com.owncloud.android.ui.activity
  import com.owncloud.android.ui.activity.InstantUploadActivity;
  import com.owncloud.android.ui.preview.PreviewImageActivity;
  import com.owncloud.android.ui.preview.PreviewImageFragment;
+ import com.owncloud.android.utils.DisplayUtils;
  import com.owncloud.android.utils.Log_OC;
  
  import android.accounts.Account;
@@@ -250,7 -253,7 +251,7 @@@ public class FileUploader extends Servi
                  files[i] = obtainNewOCFileToUpload(remotePaths[i], localPaths[i], ((mimeTypes != null) ? mimeTypes[i]
                          : (String) null), storageManager);
                  if (files[i] == null) {
 -                    // TODO @andomaex add failure Notiification
 +                    // TODO @andomaex add failure Notification
                      return Service.START_NOT_STICKY;
                  }
              }
          try {
              for (int i = 0; i < files.length; i++) {
                  uploadKey = buildRemoteName(account, files[i].getRemotePath());
 -                if (chunked
 -                        && (new File(files[i].getStoragePath())).length() > ChunkedUploadFileOperation.CHUNK_SIZE)  // added to work around bug in servers 5.x 
 -                {
 -                    newUpload = new ChunkedUploadFileOperation(account, files[i], isInstant, forceOverwrite,
 -                            localAction);
 -                } else {
 -                    newUpload = new UploadFileOperation(account, files[i], isInstant, forceOverwrite, localAction);
 -                }
 +                newUpload = new UploadFileOperation(account, files[i], chunked, isInstant, forceOverwrite, localAction, 
 +                        getApplicationContext());
 +//                if (chunked) {
 +//                    newUpload = new ChunkedUploadFileOperation(account, files[i], isInstant, forceOverwrite,
 +//                            localAction, getApplicationContext());
 +//                } else {
 +//                    newUpload = new UploadFileOperation(account, files[i], isInstant, forceOverwrite, localAction, 
 +//                            getApplicationContext());
 +//                }
                  if (isInstant) {
                      newUpload.setRemoteFolderToBeCreated();
                  }
       *  @return  An {@link OCFile} instance corresponding to the folder where the file will be uploaded.
       */
      private RemoteOperationResult grantFolderExistence(String pathToGrant) {
 -        RemoteOperation operation = new ExistenceCheckOperation(pathToGrant, this, false);
 +        RemoteOperation operation = new ExistenceCheckRemoteOperation(pathToGrant, this, false);
          RemoteOperationResult result = operation.execute(mUploadClient);
          if (!result.isSuccess() && result.getCode() == ResultCode.FILE_NOT_FOUND && mCurrentUpload.isRemoteFolderToBeCreated()) {
              operation = new CreateFolderOperation( pathToGrant,
      private void notifyUploadStart(UploadFileOperation upload) {
          // / create status notification with a progress bar
          mLastPercent = 0;
-         mNotification = new Notification(R.drawable.icon, getString(R.string.uploader_upload_in_progress_ticker),
+         mNotification = new Notification(DisplayUtils.getSeasonalIconId(), getString(R.string.uploader_upload_in_progress_ticker),
                  System.currentTimeMillis());
          mNotification.flags |= Notification.FLAG_ONGOING_EVENT;
          mDefaultNotificationContentView = mNotification.contentView;
          mNotification.contentView.setProgressBar(R.id.status_progress, 100, 0, false);
          mNotification.contentView.setTextViewText(R.id.status_text,
                  String.format(getString(R.string.uploader_upload_in_progress_content), 0, upload.getFileName()));
-         mNotification.contentView.setImageViewResource(R.id.status_icon, R.drawable.icon);
+         mNotification.contentView.setImageViewResource(R.id.status_icon, DisplayUtils.getSeasonalIconId());
          
          /// includes a pending intent in the notification showing the details view of the file
          Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class);
  
              // / fail -> explicit failure notification
              mNotificationManager.cancel(R.string.uploader_upload_in_progress_ticker);
-             Notification finalNotification = new Notification(R.drawable.icon,
+             Notification finalNotification = new Notification(DisplayUtils.getSeasonalIconId(),
                      getString(R.string.uploader_upload_failed_ticker), System.currentTimeMillis());
              finalNotification.flags |= Notification.FLAG_AUTO_CANCEL;
              String content = null;