mirror of https://github.com/nextcloud/android
instant uploading, first attempt
This commit is contained in:
parent
35ace0b973
commit
9dd2cf294a
|
@ -32,6 +32,7 @@
|
|||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="androud.permission.CAMERA" />
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="8"
|
||||
|
@ -147,7 +148,14 @@
|
|||
<activity android:name=".extensions.ExtensionsListActivity"></activity>
|
||||
<activity android:name=".ui.activity.AccountSelectActivity" android:uiOptions="none" android:label="@string/prefs_accounts"></activity>
|
||||
<service android:name=".files.services.FileUploader" >
|
||||
</service>
|
||||
</service>
|
||||
<service android:name=".files.services.InstantUploadService" />
|
||||
<receiver android:name=".files.PhotoTakenBroadcastReceiver">
|
||||
<intent-filter>
|
||||
<action android:name="com.android.camera.NEW_PICTURE" />
|
||||
<data android:mimeType="image/*" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
</application>
|
||||
|
||||
</manifest>
|
|
@ -6,5 +6,5 @@
|
|||
|
||||
<item android:id="@+id/search" android:title="@string/actionbar_search" android:icon="@drawable/ic_action_search"></item>
|
||||
<item android:id="@+id/action_upload" android:title="@string/actionbar_upload" android:icon="@drawable/ic_action_upload"></item>
|
||||
<item android:id="@+id/action_accounts" android:title="@string/actionbar_settings" android:icon="@android:drawable/ic_menu_preferences"></item>
|
||||
<item android:id="@+id/action_settings" android:title="@string/actionbar_settings" android:icon="@android:drawable/ic_menu_preferences"></item>
|
||||
</menu>
|
||||
|
|
|
@ -1,34 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<PreferenceCategory android:title="@string/prefs_category_general">
|
||||
<CheckBoxPreference
|
||||
android:key="create_thumbnails"
|
||||
android:title="@string/prefs_create_img_thumbnails"
|
||||
/>
|
||||
|
||||
<ListPreference
|
||||
android:key="select_oc_account"
|
||||
android:title="@string/prefs_select_oc_account"
|
||||
android:summary="@string/prefs_summary_select_oc_account"
|
||||
/>
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:title="@string/prefs_category_trackmydevice">
|
||||
<CheckBoxPreference
|
||||
android:key="enable_devicetracking"
|
||||
android:title="@string/prefs_trackmydevice"
|
||||
android:summaryOff="@string/prefs_trackmydevice_summary_off"
|
||||
android:summaryOn="@string/prefs_trackmydevice_summary_on"
|
||||
android:defaultValue="true"/>
|
||||
|
||||
<ListPreference
|
||||
android:key="devicetracking_update_intervall"
|
||||
android:title="@string/prefs_trackmydevice_interval"
|
||||
android:summary="@string/prefs_trackmydevice_interval_summary"
|
||||
android:entries="@array/prefs_trackmydevice_intervall_keys"
|
||||
android:entryValues="@array/prefs_trackmydevice_intervall_values"
|
||||
android:defaultValue="30"
|
||||
android:dependency="enable_devicetracking"/>
|
||||
<CheckBoxPreference android:key="instant_uploading" android:title="Enable instant uploading" android:summary="Instantly upload photos taken by camera"/>
|
||||
</PreferenceCategory>
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
/* ownCloud Android client application
|
||||
* Copyright (C) 2012 Bartek Przybylski
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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 eu.alefzero.owncloud.files;
|
||||
|
||||
import eu.alefzero.owncloud.AccountUtils;
|
||||
import eu.alefzero.owncloud.R;
|
||||
import eu.alefzero.owncloud.files.services.InstantUploadService;
|
||||
import android.accounts.Account;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.database.Cursor;
|
||||
import android.preference.Preference;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.provider.MediaStore.Images.Media;
|
||||
import android.util.Log;
|
||||
|
||||
public class PhotoTakenBroadcastReceiver extends BroadcastReceiver {
|
||||
|
||||
private static String TAG = "PhotoTakenBroadcastReceiver";
|
||||
private static final String[] CONTENT_PROJECTION = { Media.DATA, Media.DISPLAY_NAME, Media.MIME_TYPE, Media.SIZE };
|
||||
|
||||
private static String NEW_PHOTO_ACTION = "com.android.camera.NEW_PICTURE";
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (!PreferenceManager.getDefaultSharedPreferences(context).getBoolean("instant_uploading", false)) {
|
||||
Log.d(TAG, "Instant upload disabled, abording uploading");
|
||||
return;
|
||||
}
|
||||
if (!intent.getAction().equals(NEW_PHOTO_ACTION)) {
|
||||
Log.e(TAG, "Incorrect intent sent: " + intent.getAction());
|
||||
return;
|
||||
}
|
||||
Account account = AccountUtils.getCurrentOwnCloudAccount(context);
|
||||
if (account == null) {
|
||||
Log.w(TAG, "No owncloud account found for instant upload, abording");
|
||||
return;
|
||||
}
|
||||
|
||||
Cursor c = context.getContentResolver().query(intent.getData(), CONTENT_PROJECTION, null, null, null);
|
||||
|
||||
if (!c.moveToFirst()) {
|
||||
Log.e(TAG, "Couldn't resolve given uri!");
|
||||
return;
|
||||
}
|
||||
|
||||
String file_path = c.getString(c.getColumnIndex(Media.DATA));
|
||||
String file_name = c.getString(c.getColumnIndex(Media.DISPLAY_NAME));
|
||||
String mime_type = c.getString(c.getColumnIndex(Media.MIME_TYPE));
|
||||
long file_size = c.getLong(c.getColumnIndex(Media.SIZE));
|
||||
|
||||
c.close();
|
||||
|
||||
Intent upload_intent = new Intent(context, InstantUploadService.class);
|
||||
upload_intent.putExtra(InstantUploadService.KEY_ACCOUNT, account);
|
||||
upload_intent.putExtra(InstantUploadService.KEY_FILE_PATH, file_path);
|
||||
upload_intent.putExtra(InstantUploadService.KEY_DISPLAY_NAME, file_name);
|
||||
upload_intent.putExtra(InstantUploadService.KEY_FILE_SIZE, file_size);
|
||||
upload_intent.putExtra(InstantUploadService.KEY_MIME_TYPE, mime_type);
|
||||
|
||||
context.startService(upload_intent);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,161 @@
|
|||
/* ownCloud Android client application
|
||||
* Copyright (C) 2012 Bartek Przybylski
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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 eu.alefzero.owncloud.files.services;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.httpclient.HttpException;
|
||||
import org.apache.jackrabbit.webdav.client.methods.MkColMethod;
|
||||
|
||||
import eu.alefzero.owncloud.AccountUtils;
|
||||
import eu.alefzero.owncloud.authenticator.AccountAuthenticator;
|
||||
import eu.alefzero.owncloud.utils.OwnCloudVersion;
|
||||
import eu.alefzero.webdav.WebdavClient;
|
||||
|
||||
import android.accounts.Account;
|
||||
import android.accounts.AccountManager;
|
||||
import android.app.Service;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.IBinder;
|
||||
import android.util.Log;
|
||||
|
||||
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";
|
||||
private static 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.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.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;
|
||||
AccountManager am = AccountManager.get(getApplicationContext());
|
||||
|
||||
while ((working_map = getFirstObject()) != null) {
|
||||
Account account = (Account) working_map.get(KEY_ACCOUNT);
|
||||
String username = account.name.substring(0, account.name.lastIndexOf('@'));
|
||||
String password = am.getPassword(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);
|
||||
|
||||
String oc_base_url = am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL);
|
||||
String oc_version = am.getUserData(account, AccountAuthenticator.KEY_OC_VERSION);
|
||||
OwnCloudVersion ocv = new OwnCloudVersion(oc_version);
|
||||
String webdav_path = AccountUtils.getWebdavPath(ocv);
|
||||
WebdavClient wdc = new WebdavClient(Uri.parse(oc_base_url + webdav_path));
|
||||
wdc.allowSelfsignedCertificates();
|
||||
wdc.setCredentials(username, password);
|
||||
|
||||
MkColMethod mkcol = new MkColMethod(oc_base_url+webdav_path+INSTANT_UPLOAD_DIR);
|
||||
int status = 0;
|
||||
try {
|
||||
status = wdc.executeMethod(mkcol);
|
||||
Log.e(TAG, "mkcol returned " + status);
|
||||
wdc.putFile(filepath, INSTANT_UPLOAD_DIR + "/" + filename, mimetype);
|
||||
} catch (HttpException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -134,9 +134,9 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
|
|||
ACTION_SELECT_FILE);
|
||||
break;
|
||||
}
|
||||
case R.id.action_accounts: {
|
||||
Intent accountIntent = new Intent(this, AccountSelectActivity.class);
|
||||
startActivity(accountIntent);
|
||||
case R.id.action_settings: {
|
||||
Intent settingsIntent = new Intent(this, Preferences.class);
|
||||
startActivity(settingsIntent);
|
||||
}
|
||||
case android.R.id.home: {
|
||||
if(mCurrentDir != null && mCurrentDir.getParentId() != 0){
|
||||
|
|
|
@ -78,21 +78,6 @@ public class Preferences extends SherlockPreferenceActivity implements
|
|||
populateAccountList();
|
||||
ActionBar actionBar = getSherlock().getActionBar();
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
// Update summary for device tracking preference
|
||||
mTrackingUpdateInterval = (ListPreference) findPreference("devicetracking_update_intervall");
|
||||
String trackingSummary = getResources().getString(
|
||||
R.string.prefs_trackmydevice_interval_summary);
|
||||
trackingSummary = String.format(trackingSummary,
|
||||
mTrackingUpdateInterval.getValue());
|
||||
mTrackingUpdateInterval.setSummary(trackingSummary);
|
||||
mTrackingUpdateInterval.setOnPreferenceChangeListener(this);
|
||||
|
||||
// Enable or disable device tracking service. Listen on events
|
||||
mDeviceTracking = (CheckBoxPreference) findPreference("enable_devicetracking");
|
||||
mDeviceTracking.setOnPreferenceChangeListener(this);
|
||||
|
||||
// populateSessionList();
|
||||
}
|
||||
|
||||
private void populateSessionList() {
|
||||
|
@ -131,7 +116,7 @@ public class Preferences extends SherlockPreferenceActivity implements
|
|||
if (defaultAccount != null) {
|
||||
mAccountList.setSummary(defaultAccount.name);
|
||||
}
|
||||
|
||||
|
||||
// Transform accounts into array of string for preferences to use
|
||||
String[] accNames = new String[mAccounts.length];
|
||||
for (int i = 0; i < mAccounts.length; i++) {
|
||||
|
@ -180,7 +165,7 @@ public class Preferences extends SherlockPreferenceActivity implements
|
|||
getPreferenceScreen().getPreference(mSelectedMenuItem + 1));
|
||||
break;
|
||||
case android.R.id.home:
|
||||
intent = new Intent(getBaseContext(), LandingActivity.class);
|
||||
intent = new Intent(getBaseContext(), FileDisplayActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
startActivity(intent);
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue