Sfoglia il codice sorgente

Refactored path to directory for instant uploads; fixed some problems with first upload for never-synchronized accounts

David A. Velasco 12 anni fa
parent
commit
9ad30bdded

+ 0 - 1
AndroidManifest.xml

@@ -154,7 +154,6 @@
         
         <activity android:name=".ui.activity.LogHistoryActivity"/>
         
-        <service android:name=".files.services.InstantUploadService" />
         <receiver android:name=".files.InstantUploadBroadcastReceiver">
             <intent-filter>
                 <action android:name="com.android.camera.NEW_PICTURE" />

+ 2 - 3
src/com/owncloud/android/files/InstantUploadBroadcastReceiver.java

@@ -30,7 +30,6 @@ import android.net.ConnectivityManager;
 import android.net.NetworkInfo.State;
 import android.preference.PreferenceManager;
 import android.provider.MediaStore.Images.Media;
-import android.util.Log;
 import android.webkit.MimeTypeMap;
 
 import com.owncloud.android.AccountUtils;
@@ -121,7 +120,7 @@ public class InstantUploadBroadcastReceiver extends BroadcastReceiver {
         Intent i = new Intent(context, FileUploader.class);
         i.putExtra(FileUploader.KEY_ACCOUNT, account);
         i.putExtra(FileUploader.KEY_LOCAL_FILE, file_path);
-        i.putExtra(FileUploader.KEY_REMOTE_FILE, FileStorageUtils.getInstantUploadFilePath(file_name));
+        i.putExtra(FileUploader.KEY_REMOTE_FILE, FileStorageUtils.getInstantUploadFilePath(context, file_name));
         i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);
         i.putExtra(FileUploader.KEY_MIME_TYPE, mime_type);
         i.putExtra(FileUploader.KEY_INSTANT_UPLOAD, true);
@@ -164,7 +163,7 @@ public class InstantUploadBroadcastReceiver extends BroadcastReceiver {
                         Intent i = new Intent(context, FileUploader.class);
                         i.putExtra(FileUploader.KEY_ACCOUNT, account);
                         i.putExtra(FileUploader.KEY_LOCAL_FILE, file_path);
-                        i.putExtra(FileUploader.KEY_REMOTE_FILE, FileStorageUtils.getInstantUploadFilePath(f.getName()));
+                        i.putExtra(FileUploader.KEY_REMOTE_FILE, FileStorageUtils.getInstantUploadFilePath(context, f.getName()));
                         i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);
                         i.putExtra(FileUploader.KEY_INSTANT_UPLOAD, true);
                         context.startService(i);

+ 6 - 5
src/com/owncloud/android/files/services/FileUploader.java

@@ -45,7 +45,6 @@ import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
 import android.os.Process;
-import android.util.Log;
 import android.webkit.MimeTypeMap;
 import android.widget.RemoteViews;
 import android.widget.Toast;
@@ -67,6 +66,7 @@ import com.owncloud.android.ui.activity.InstantUploadActivity;
 import com.owncloud.android.ui.fragment.FileDetailFragment;
 import com.owncloud.android.ui.preview.PreviewImageActivity;
 import com.owncloud.android.ui.preview.PreviewImageFragment;
+import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.OwnCloudVersion;
 
 import eu.alefzero.webdav.OnDatatransferProgressListener;
@@ -499,7 +499,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
 
             // / create remote folder for instant uploads
             if (mCurrentUpload.isRemoteFolderToBeCreated()) {
-                mUploadClient.createDirectory(InstantUploadService.INSTANT_UPLOAD_DIR);
+                mUploadClient.createDirectory(FileStorageUtils.getInstantUploadFilePath(this, ""));
                 // ignoring result fail could just mean that it already exists,
                 // but local database is not synchronized the upload will be
                 // tried anyway
@@ -601,11 +601,12 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
     }
 
     private boolean checkAndFixInstantUploadDirectory(FileDataStorageManager storageManager) {
-        OCFile instantUploadDir = storageManager.getFileByPath(InstantUploadService.INSTANT_UPLOAD_DIR);
+        String instantUploadDirPath = FileStorageUtils.getInstantUploadFilePath(this, "");
+        OCFile instantUploadDir = storageManager.getFileByPath(instantUploadDirPath);
         if (instantUploadDir == null) {
             // first instant upload in the account. never account not
             // synchronized after the remote InstantUpload folder was created
-            OCFile newDir = new OCFile(InstantUploadService.INSTANT_UPLOAD_DIR);
+            OCFile newDir = new OCFile(instantUploadDirPath);
             newDir.setMimetype("DIR");
             OCFile path = storageManager.getFileByPath(OCFile.PATH_SEPARATOR);
 
@@ -613,7 +614,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
                 newDir.setParentId(path.getFileId());
                 storageManager.saveFile(newDir);
                 return true;
-            } else {
+            } else {    // this should not happen anymore
                 return false;
             }
 

+ 0 - 137
src/com/owncloud/android/files/services/InstantUploadService.java

@@ -1,137 +0,0 @@
-/* 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.files.services;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-
-import com.owncloud.android.Log_OC;
-import com.owncloud.android.utils.FileStorageUtils;
-import com.owncloud.android.network.OwnCloudClientUtils;
-
-import eu.alefzero.webdav.WebdavClient;
-
-import android.accounts.Account;
-import android.app.Service;
-import android.content.Intent;
-import android.os.IBinder;
-
-public class InstantUploadService extends Service {
-
-    public static String KEY_FILE_PATH = "KEY_FILEPATH";
-    public static String KEY_FILE_SIZE = "KEY_FILESIZE";
-    public static String KEY_MIME_TYPE = "KEY_MIMETYPE";
-    public static String KEY_DISPLAY_NAME = "KEY_FILENAME";
-    public static String KEY_ACCOUNT = "KEY_ACCOUNT";
-
-    private static String TAG = "InstantUploadService";
-    // TODO make it configurable over the settings dialog
-    public static final String INSTANT_UPLOAD_DIR = "/InstantUpload";
-    private UploaderRunnable mUploaderRunnable;
-
-    @Override
-    public IBinder onBind(Intent arg0) {
-        return null;
-    }
-
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-        if (intent == null || !intent.hasExtra(KEY_ACCOUNT) || !intent.hasExtra(KEY_DISPLAY_NAME)
-                || !intent.hasExtra(KEY_FILE_PATH) || !intent.hasExtra(KEY_FILE_SIZE)
-                || !intent.hasExtra(KEY_MIME_TYPE)) {
-            Log_OC.w(TAG, "Not all required information was provided, abording");
-            return Service.START_NOT_STICKY;
-        }
-
-        if (mUploaderRunnable == null) {
-            mUploaderRunnable = new UploaderRunnable();
-        }
-
-        String filename = intent.getStringExtra(KEY_DISPLAY_NAME);
-        String filepath = intent.getStringExtra(KEY_FILE_PATH);
-        String mimetype = intent.getStringExtra(KEY_MIME_TYPE);
-        Account account = intent.getParcelableExtra(KEY_ACCOUNT);
-        long filesize = intent.getLongExtra(KEY_FILE_SIZE, -1);
-
-        mUploaderRunnable.addElementToQueue(filename, filepath, mimetype, filesize, account);
-
-        // starting new thread for new download doesnt seems like a good idea
-        // maybe some thread pool or single background thread would be better
-        Log_OC.d(TAG, "Starting instant upload thread");
-        new Thread(mUploaderRunnable).start();
-
-        return Service.START_STICKY;
-    }
-
-    private class UploaderRunnable implements Runnable {
-
-        Object mLock;
-        List<HashMap<String, Object>> mHashMapList;
-
-        public UploaderRunnable() {
-            mHashMapList = new LinkedList<HashMap<String, Object>>();
-            mLock = new Object();
-        }
-
-        public void addElementToQueue(String filename, String filepath, String mimetype, long length, Account account) {
-            HashMap<String, Object> new_map = new HashMap<String, Object>();
-            new_map.put(KEY_ACCOUNT, account);
-            new_map.put(KEY_DISPLAY_NAME, filename);
-            new_map.put(KEY_FILE_PATH, filepath);
-            new_map.put(KEY_MIME_TYPE, mimetype);
-            new_map.put(KEY_FILE_SIZE, length);
-
-            synchronized (mLock) {
-                mHashMapList.add(new_map);
-            }
-        }
-
-        private HashMap<String, Object> getFirstObject() {
-            synchronized (mLock) {
-                if (mHashMapList.size() == 0)
-                    return null;
-                HashMap<String, Object> ret = mHashMapList.get(0);
-                mHashMapList.remove(0);
-                return ret;
-            }
-        }
-
-        public void run() {
-            HashMap<String, Object> working_map;
-
-            while ((working_map = getFirstObject()) != null) {
-                Account account = (Account) working_map.get(KEY_ACCOUNT);
-                String filename = (String) working_map.get(KEY_DISPLAY_NAME);
-                String filepath = (String) working_map.get(KEY_FILE_PATH);
-                String mimetype = (String) working_map.get(KEY_MIME_TYPE);
-                
-                WebdavClient wdc = OwnCloudClientUtils.createOwnCloudClient(account, getApplicationContext());
-
-                wdc.createDirectory(INSTANT_UPLOAD_DIR); // fail could just mean that it already exists put will be tried anyway
-                try {
-                    wdc.putFile(filepath, FileStorageUtils.getInstantUploadFilePath(filename), mimetype);
-                } catch (Exception e) {
-                    // nothing to do; this service is deprecated, indeed
-                }
-            }
-        }
-    }
-
-}

+ 1 - 1
src/com/owncloud/android/ui/activity/InstantUploadActivity.java

@@ -440,7 +440,7 @@ public class InstantUploadActivity extends Activity {
      */
     private void startUpload(String img_path) {
         // extract filename
-        String filename = FileStorageUtils.getInstantUploadFilePath(img_path);
+        String filename = FileStorageUtils.getInstantUploadFilePath(this, img_path);
         if (canInstantUpload()) {
             Account account = AccountUtils.getCurrentOwnCloudAccount(InstantUploadActivity.this);
             // add file again to upload queue

+ 6 - 21
src/com/owncloud/android/utils/FileStorageUtils.java

@@ -20,13 +20,14 @@ package com.owncloud.android.utils;
 import java.io.File;
 
 import android.annotation.SuppressLint;
+import android.content.Context;
 import android.net.Uri;
 import android.os.Environment;
 import android.os.StatFs;
 import android.util.Log;
 
+import com.owncloud.android.R;
 import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.files.services.InstantUploadService;
 
 /**
  * Static methods to help in access to local file system.
@@ -69,25 +70,9 @@ public class FileStorageUtils {
         return Environment.getExternalStorageDirectory() + File.separator + "owncloud" + File.separator + "log";
     }
 
-    // to ensure we will not add the slash twice between filename and
-    // folder-name
-    private static String getFileName(String filepath) {
-        if (filepath != null && !"".equals(filepath)) {
-            int psi = filepath.lastIndexOf('/');
-            String filename = filepath;
-            if (psi > -1) {
-                filename = filepath.substring(psi + 1, filepath.length());
-                Log.d(LOG_TAG, "extracted filename :" + filename);
-            }
-            return filename;
-        } else {
-            // Toast
-            Log.w(LOG_TAG, "the given filename was null or empty");
-            return null;
-        }
-    }
-
-    public static String getInstantUploadFilePath(String fileName) {
-        return InstantUploadService.INSTANT_UPLOAD_DIR + "/" + getFileName(fileName);
+    public static String getInstantUploadFilePath(Context context, String fileName) {
+        String uploadPath = context.getString(R.string.instant_upload_path);
+        String value = uploadPath + OCFile.PATH_SEPARATOR +  (fileName == null ? "" : fileName);
+        return value;
     }
 }