mirror of
https://github.com/nextcloud/android.git
synced 2024-11-27 17:46:37 +03:00
Change of hearts
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
9c6dab3238
commit
5b96a33446
8 changed files with 147 additions and 212 deletions
|
@ -48,6 +48,7 @@ import com.owncloud.android.lib.common.utils.Log_OC;
|
||||||
import com.owncloud.android.ui.activity.Preferences;
|
import com.owncloud.android.ui.activity.Preferences;
|
||||||
import com.owncloud.android.ui.activity.WhatsNewActivity;
|
import com.owncloud.android.ui.activity.WhatsNewActivity;
|
||||||
import com.owncloud.android.utils.AnalyticsUtils;
|
import com.owncloud.android.utils.AnalyticsUtils;
|
||||||
|
import com.owncloud.android.utils.FilesSyncHelper;
|
||||||
import com.owncloud.android.utils.PermissionUtil;
|
import com.owncloud.android.utils.PermissionUtil;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -127,7 +128,7 @@ public class MainApp extends MultiDexApplication {
|
||||||
PreferenceManager.setAutoUploadSplitEntries(this, true);
|
PreferenceManager.setAutoUploadSplitEntries(this, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!JobManager.instance().getAllJobRequestsForTag(FilesSyncJob.TAG).isEmpty()) {
|
if (JobManager.instance().getAllJobRequestsForTag(FilesSyncJob.TAG).isEmpty()) {
|
||||||
new JobRequest.Builder(FilesSyncJob.TAG)
|
new JobRequest.Builder(FilesSyncJob.TAG)
|
||||||
.setPeriodic(900000L, 300000L)
|
.setPeriodic(900000L, 300000L)
|
||||||
.setUpdateCurrent(true)
|
.setUpdateCurrent(true)
|
||||||
|
@ -135,6 +136,8 @@ public class MainApp extends MultiDexApplication {
|
||||||
.schedule();
|
.schedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FilesSyncHelper.restartJobsIfNeeded();
|
||||||
|
|
||||||
// register global protection with pass code
|
// register global protection with pass code
|
||||||
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
|
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
|
||||||
|
|
||||||
|
|
|
@ -29,20 +29,20 @@ public class FileSystemDataSet {
|
||||||
private boolean isFolder;
|
private boolean isFolder;
|
||||||
private boolean isSentForUpload;
|
private boolean isSentForUpload;
|
||||||
private long foundAt;
|
private long foundAt;
|
||||||
private String account;
|
private long syncedFolderId;
|
||||||
|
|
||||||
public FileSystemDataSet() {
|
public FileSystemDataSet() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public FileSystemDataSet(int id, String localPath, long modifiedAt, boolean isFolder,
|
public FileSystemDataSet(int id, String localPath, long modifiedAt, boolean isFolder,
|
||||||
boolean isSentForUpload, long foundAt, String account) {
|
boolean isSentForUpload, long foundAt, long syncedFolderId) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.localPath = localPath;
|
this.localPath = localPath;
|
||||||
this.modifiedAt = modifiedAt;
|
this.modifiedAt = modifiedAt;
|
||||||
this.isFolder = isFolder;
|
this.isFolder = isFolder;
|
||||||
this.isSentForUpload = isSentForUpload;
|
this.isSentForUpload = isSentForUpload;
|
||||||
this.foundAt = foundAt;
|
this.foundAt = foundAt;
|
||||||
this.account = account;
|
this.syncedFolderId = syncedFolderId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getId() {
|
public int getId() {
|
||||||
|
@ -93,11 +93,11 @@ public class FileSystemDataSet {
|
||||||
isSentForUpload = sentForUpload;
|
isSentForUpload = sentForUpload;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAccount() {
|
public long getSyncedFolderId() {
|
||||||
return account;
|
return syncedFolderId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAccount(String account) {
|
public void setSyncedFolderId(long syncedFolderId) {
|
||||||
this.account = account;
|
this.syncedFolderId = syncedFolderId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,11 +27,10 @@ import android.net.Uri;
|
||||||
import com.owncloud.android.db.ProviderMeta;
|
import com.owncloud.android.db.ProviderMeta;
|
||||||
import com.owncloud.android.lib.common.utils.Log_OC;
|
import com.owncloud.android.lib.common.utils.Log_OC;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
public class FilesystemDataProvider {
|
public class FilesystemDataProvider {
|
||||||
|
|
||||||
static private final String TAG = FilesystemDataProvider.class.getSimpleName();
|
static private final String TAG = FilesystemDataProvider.class.getSimpleName();
|
||||||
|
@ -45,7 +44,7 @@ public class FilesystemDataProvider {
|
||||||
this.contentResolver = contentResolver;
|
this.contentResolver = contentResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateFilesInList(Object[] paths, String account) {
|
public void updateFilesInList(Object[] paths, String syncedFolderId) {
|
||||||
ContentValues cv = new ContentValues();
|
ContentValues cv = new ContentValues();
|
||||||
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD, 1);
|
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD, 1);
|
||||||
|
|
||||||
|
@ -58,33 +57,26 @@ public class FilesystemDataProvider {
|
||||||
ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM,
|
ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM,
|
||||||
cv,
|
cv,
|
||||||
ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_LOCAL_PATH + " IN (?) and " +
|
ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_LOCAL_PATH + " IN (?) and " +
|
||||||
ProviderMeta.ProviderTableMeta.FILESYSTEM_ACCOUNT + " = ?",
|
ProviderMeta.ProviderTableMeta.FILESYSTEM_SYNCED_FOLDER_ID + " = ?",
|
||||||
stringPaths
|
new String[]{Arrays.toString(stringPaths), syncedFolderId}
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<String> getFilesForUpload(String localPath, String account, @Nullable String filetype) {
|
public Set<String> getFilesForUpload(String localPath, String syncedFolderId) {
|
||||||
Set<String> localPathsToUpload = new HashSet<>();
|
Set<String> localPathsToUpload = new HashSet<>();
|
||||||
|
|
||||||
String likeParam = localPath + "%";
|
String likeParam = localPath + "%";
|
||||||
String likeFiletypeParam = "";
|
|
||||||
if (filetype != null) {
|
|
||||||
likeFiletypeParam = filetype + "%";
|
|
||||||
} else {
|
|
||||||
likeFiletypeParam = "%";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Cursor cursor = contentResolver.query(
|
Cursor cursor = contentResolver.query(
|
||||||
ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM,
|
ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM,
|
||||||
null,
|
null,
|
||||||
ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_LOCAL_PATH + " LIKE ? and " +
|
ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_LOCAL_PATH + " LIKE ? and " +
|
||||||
ProviderMeta.ProviderTableMeta.FILESYSTEM_ACCOUNT + " = ? and " +
|
ProviderMeta.ProviderTableMeta.FILESYSTEM_SYNCED_FOLDER_ID + " = ? and " +
|
||||||
ProviderMeta.ProviderTableMeta.FILESYSTEM_MIMETYPE + " LIKE ? and " +
|
|
||||||
ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD + " = ? and " +
|
ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD + " = ? and " +
|
||||||
ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_IS_FOLDER + " = ?",
|
ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_IS_FOLDER + " = ?",
|
||||||
new String[]{likeParam, account, likeFiletypeParam, "0", "0"},
|
new String[]{likeParam, syncedFolderId, "0", "0"},
|
||||||
null);
|
null);
|
||||||
|
|
||||||
if (cursor != null && cursor.moveToFirst()) {
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
|
@ -132,9 +124,10 @@ public class FilesystemDataProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void storeOrUpdateFileValue(String localPath, long modifiedAt, boolean isFolder, String account,
|
public void storeOrUpdateFileValue(String localPath, long modifiedAt, boolean isFolder, SyncedFolder syncedFolder,
|
||||||
boolean dryRun, @Nullable String mimetype) {
|
boolean dryRun) {
|
||||||
FileSystemDataSet data = getFilesystemDataSet(localPath, account);
|
|
||||||
|
FileSystemDataSet data = getFilesystemDataSet(localPath, syncedFolder);
|
||||||
|
|
||||||
int isFolderValue = 0;
|
int isFolderValue = 0;
|
||||||
if (isFolder) {
|
if (isFolder) {
|
||||||
|
@ -151,12 +144,7 @@ public class FilesystemDataProvider {
|
||||||
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_MODIFIED, modifiedAt);
|
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_MODIFIED, modifiedAt);
|
||||||
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_IS_FOLDER, isFolderValue);
|
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_IS_FOLDER, isFolderValue);
|
||||||
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD, dryRun);
|
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD, dryRun);
|
||||||
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_ACCOUNT, account);
|
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_SYNCED_FOLDER_ID, syncedFolder.getId());
|
||||||
|
|
||||||
if (mimetype != null) {
|
|
||||||
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_MIMETYPE, mimetype);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Uri result = contentResolver.insert(ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM, cv);
|
Uri result = contentResolver.insert(ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM, cv);
|
||||||
|
|
||||||
|
@ -169,10 +157,6 @@ public class FilesystemDataProvider {
|
||||||
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD, 0);
|
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mimetype != null) {
|
|
||||||
cv.put(ProviderMeta.ProviderTableMeta.FILESYSTEM_MIMETYPE, mimetype);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int result = contentResolver.update(
|
int result = contentResolver.update(
|
||||||
ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM,
|
ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM,
|
||||||
|
@ -187,14 +171,14 @@ public class FilesystemDataProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private FileSystemDataSet getFilesystemDataSet(String localPathParam, String account) {
|
private FileSystemDataSet getFilesystemDataSet(String localPathParam, SyncedFolder syncedFolder) {
|
||||||
|
|
||||||
Cursor cursor = contentResolver.query(
|
Cursor cursor = contentResolver.query(
|
||||||
ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM,
|
ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM,
|
||||||
null,
|
null,
|
||||||
ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_LOCAL_PATH + " = ? and " +
|
ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_LOCAL_PATH + " = ? and " +
|
||||||
ProviderMeta.ProviderTableMeta.FILESYSTEM_ACCOUNT + " = ?",
|
ProviderMeta.ProviderTableMeta.FILESYSTEM_SYNCED_FOLDER_ID + " = ?",
|
||||||
new String[]{localPathParam, account},
|
new String[]{localPathParam, Long.toString(syncedFolder.getId())},
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -224,7 +208,7 @@ public class FilesystemDataProvider {
|
||||||
Log_OC.e(TAG, "Arbitrary value could not be created from cursor");
|
Log_OC.e(TAG, "Arbitrary value could not be created from cursor");
|
||||||
} else {
|
} else {
|
||||||
dataSet = new FileSystemDataSet(id, localPath, modifiedAt, isFolder, isSentForUpload, foundAt,
|
dataSet = new FileSystemDataSet(id, localPath, modifiedAt, isFolder, isSentForUpload, foundAt,
|
||||||
account);
|
syncedFolder.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cursor.close();
|
cursor.close();
|
||||||
|
|
|
@ -208,7 +208,6 @@ public class ProviderMeta {
|
||||||
public static final String FILESYSTEM_FILE_IS_FOLDER = "is_folder";
|
public static final String FILESYSTEM_FILE_IS_FOLDER = "is_folder";
|
||||||
public static final String FILESYSTEM_FILE_FOUND_RECENTLY = "found_at";
|
public static final String FILESYSTEM_FILE_FOUND_RECENTLY = "found_at";
|
||||||
public static final String FILESYSTEM_FILE_SENT_FOR_UPLOAD = "upload_triggered";
|
public static final String FILESYSTEM_FILE_SENT_FOR_UPLOAD = "upload_triggered";
|
||||||
public static final String FILESYSTEM_ACCOUNT = "account";
|
public static final String FILESYSTEM_SYNCED_FOLDER_ID = "syncedfolder_id";
|
||||||
public static final String FILESYSTEM_MIMETYPE = "mimetype";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -27,12 +27,10 @@ import android.media.ExifInterface;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import com.evernote.android.job.Job;
|
import com.evernote.android.job.Job;
|
||||||
import com.evernote.android.job.JobManager;
|
import com.evernote.android.job.JobManager;
|
||||||
import com.evernote.android.job.JobRequest;
|
import com.evernote.android.job.JobRequest;
|
||||||
import com.evernote.android.job.util.Device;
|
|
||||||
import com.evernote.android.job.util.support.PersistableBundleCompat;
|
import com.evernote.android.job.util.support.PersistableBundleCompat;
|
||||||
import com.owncloud.android.MainApp;
|
import com.owncloud.android.MainApp;
|
||||||
import com.owncloud.android.datamodel.FilesystemDataProvider;
|
import com.owncloud.android.datamodel.FilesystemDataProvider;
|
||||||
|
@ -47,19 +45,13 @@ import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.ParsePosition;
|
import java.text.ParsePosition;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
public class FilesSyncJob extends Job {
|
public class FilesSyncJob extends Job {
|
||||||
public static final String TAG = "FilesSyncJob";
|
public static final String TAG = "FilesSyncJob";
|
||||||
|
|
||||||
private static final String LAST_AUTOUPLOAD_JOB_RUN = "last_autoupload_job_run";
|
|
||||||
|
|
||||||
// TODO: check for wifi status & charging status, stop and restart jobs as required
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
protected Result onRunJob(Params params) {
|
protected Result onRunJob(Params params) {
|
||||||
|
@ -71,9 +63,8 @@ public class FilesSyncJob extends Job {
|
||||||
TAG);
|
TAG);
|
||||||
wakeLock.acquire();
|
wakeLock.acquire();
|
||||||
|
|
||||||
restartJobsIfNeeded();
|
FilesSyncHelper.restartJobsIfNeeded();
|
||||||
|
FilesSyncHelper.insertAllDBEntries();
|
||||||
FilesSyncHelper.prepareSyncStatusForAccounts();
|
|
||||||
|
|
||||||
// Create all the providers we'll need
|
// Create all the providers we'll need
|
||||||
final FilesystemDataProvider filesystemDataProvider = new FilesystemDataProvider(contentResolver);
|
final FilesystemDataProvider filesystemDataProvider = new FilesystemDataProvider(contentResolver);
|
||||||
|
@ -81,74 +72,62 @@ public class FilesSyncJob extends Job {
|
||||||
|
|
||||||
for (SyncedFolder syncedFolder : syncedFolderProvider.getSyncedFolders()) {
|
for (SyncedFolder syncedFolder : syncedFolderProvider.getSyncedFolders()) {
|
||||||
if (syncedFolder.isEnabled()) {
|
if (syncedFolder.isEnabled()) {
|
||||||
String syncedFolderType;
|
|
||||||
if (MediaFolder.IMAGE == syncedFolder.getType()) {
|
|
||||||
syncedFolderType = "image/";
|
|
||||||
Log.d("IN A JOB", "SYNCED FOLDER VIDEO");
|
|
||||||
} else if (MediaFolder.VIDEO == syncedFolder.getType()) {
|
|
||||||
syncedFolderType = "video/";
|
|
||||||
Log.d("IN A JOB", "SYNCED FOLDER IMAGE");
|
|
||||||
} else {
|
|
||||||
syncedFolderType = null;
|
|
||||||
Log.d("IN A JOB", "SYNCED FOLDER ENABLED");
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.d("IN A JOB", "SYNCED FOLDER ENABLED");
|
|
||||||
|
|
||||||
// ignore custom folders for now
|
// ignore custom folders for now
|
||||||
if (syncedFolderType != null) {
|
if (MediaFolder.CUSTOM != syncedFolder.getType()) {
|
||||||
for (String path : filesystemDataProvider.getFilesForUpload(syncedFolder.getLocalPath(),
|
for (String path : filesystemDataProvider.getFilesForUpload(syncedFolder.getLocalPath(),
|
||||||
syncedFolder.getAccount(), syncedFolderType)) {
|
Long.toString(syncedFolder.getId()))) {
|
||||||
File file = new File(path);
|
if (JobManager.instance().getAllJobRequests().size() < 80) {
|
||||||
|
File file = new File(path);
|
||||||
|
|
||||||
Log.d("IN A JOB", "PERO");
|
Long lastModificationTime = file.lastModified();
|
||||||
Long lastModificationTime = file.lastModified();
|
final Locale currentLocale = context.getResources().getConfiguration().locale;
|
||||||
final Locale currentLocale = context.getResources().getConfiguration().locale;
|
|
||||||
|
|
||||||
if (syncedFolder.equals("image/")) {
|
if (MediaFolder.IMAGE == syncedFolder.getType()) {
|
||||||
String mimetypeString = FileStorageUtils.getMimeTypeFromName(file.getAbsolutePath());
|
String mimetypeString = FileStorageUtils.getMimeTypeFromName(file.getAbsolutePath());
|
||||||
if ("image/jpeg".equalsIgnoreCase(mimetypeString) || "image/tiff".
|
if ("image/jpeg".equalsIgnoreCase(mimetypeString) || "image/tiff".
|
||||||
equalsIgnoreCase(mimetypeString)) {
|
equalsIgnoreCase(mimetypeString)) {
|
||||||
try {
|
try {
|
||||||
ExifInterface exifInterface = new ExifInterface(file.getAbsolutePath());
|
ExifInterface exifInterface = new ExifInterface(file.getAbsolutePath());
|
||||||
String exifDate = exifInterface.getAttribute(ExifInterface.TAG_DATETIME);
|
String exifDate = exifInterface.getAttribute(ExifInterface.TAG_DATETIME);
|
||||||
if (!TextUtils.isEmpty(exifDate)) {
|
if (!TextUtils.isEmpty(exifDate)) {
|
||||||
ParsePosition pos = new ParsePosition(0);
|
ParsePosition pos = new ParsePosition(0);
|
||||||
SimpleDateFormat sFormatter = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss",
|
SimpleDateFormat sFormatter = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss",
|
||||||
currentLocale);
|
currentLocale);
|
||||||
sFormatter.setTimeZone(TimeZone.getTimeZone(TimeZone.getDefault().getID()));
|
sFormatter.setTimeZone(TimeZone.getTimeZone(TimeZone.getDefault().getID()));
|
||||||
Date dateTime = sFormatter.parse(exifDate, pos);
|
Date dateTime = sFormatter.parse(exifDate, pos);
|
||||||
lastModificationTime = dateTime.getTime();
|
lastModificationTime = dateTime.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log_OC.d(TAG, "Failed to get the proper time " + e.getLocalizedMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log_OC.d(TAG, "Failed to get the proper time " + e.getLocalizedMessage());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PersistableBundleCompat bundle = new PersistableBundleCompat();
|
||||||
|
bundle.putString(AutoUploadJob.LOCAL_PATH, file.getAbsolutePath());
|
||||||
|
bundle.putString(AutoUploadJob.REMOTE_PATH, FileStorageUtils.getInstantUploadFilePath(
|
||||||
|
currentLocale,
|
||||||
|
syncedFolder.getRemotePath(), file.getName(),
|
||||||
|
lastModificationTime,
|
||||||
|
syncedFolder.getSubfolderByDate()));
|
||||||
|
bundle.putString(AutoUploadJob.ACCOUNT, syncedFolder.getAccount());
|
||||||
|
bundle.putInt(AutoUploadJob.UPLOAD_BEHAVIOUR, syncedFolder.getUploadAction());
|
||||||
|
|
||||||
|
new JobRequest.Builder(AutoUploadJob.TAG)
|
||||||
|
.setExecutionWindow(30_000L, 80_000L)
|
||||||
|
.setRequiresCharging(syncedFolder.getChargingOnly())
|
||||||
|
.setRequiredNetworkType(syncedFolder.getWifiOnly() ? JobRequest.NetworkType.UNMETERED :
|
||||||
|
JobRequest.NetworkType.CONNECTED)
|
||||||
|
.setExtras(bundle)
|
||||||
|
.setRequirementsEnforced(true)
|
||||||
|
.setUpdateCurrent(false)
|
||||||
|
.build()
|
||||||
|
.schedule();
|
||||||
|
|
||||||
|
filesystemDataProvider.updateFilesInList(new Object[]{path},
|
||||||
|
Long.toString(syncedFolder.getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
PersistableBundleCompat bundle = new PersistableBundleCompat();
|
|
||||||
bundle.putString(AutoUploadJob.LOCAL_PATH, file.getAbsolutePath());
|
|
||||||
bundle.putString(AutoUploadJob.REMOTE_PATH, FileStorageUtils.getInstantUploadFilePath(
|
|
||||||
currentLocale,
|
|
||||||
syncedFolder.getRemotePath(), file.getName(),
|
|
||||||
lastModificationTime,
|
|
||||||
syncedFolder.getSubfolderByDate()));
|
|
||||||
bundle.putString(AutoUploadJob.ACCOUNT, syncedFolder.getAccount());
|
|
||||||
bundle.putInt(AutoUploadJob.UPLOAD_BEHAVIOUR, syncedFolder.getUploadAction());
|
|
||||||
|
|
||||||
new JobRequest.Builder(AutoUploadJob.TAG)
|
|
||||||
.setExecutionWindow(30_000L, 80_000L)
|
|
||||||
.setRequiresCharging(syncedFolder.getChargingOnly())
|
|
||||||
.setRequiredNetworkType(syncedFolder.getWifiOnly() ? JobRequest.NetworkType.UNMETERED :
|
|
||||||
JobRequest.NetworkType.CONNECTED)
|
|
||||||
.setExtras(bundle)
|
|
||||||
.setRequirementsEnforced(true)
|
|
||||||
.setUpdateCurrent(false)
|
|
||||||
.build()
|
|
||||||
.schedule();
|
|
||||||
|
|
||||||
filesystemDataProvider.updateFilesInList(new Object[]{path}, syncedFolder.getAccount());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -157,40 +136,4 @@ public class FilesSyncJob extends Job {
|
||||||
wakeLock.release();
|
wakeLock.release();
|
||||||
return Result.SUCCESS;
|
return Result.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void restartJobsIfNeeded() {
|
|
||||||
final Context context = MainApp.getAppContext();
|
|
||||||
List<Integer> restartedJobIds = new ArrayList<Integer>();
|
|
||||||
int jobId;
|
|
||||||
boolean restartedInCurrentIteration = false;
|
|
||||||
|
|
||||||
for (JobRequest jobRequest : JobManager.instance().getAllJobRequestsForTag(AutoUploadJob.TAG)) {
|
|
||||||
restartedInCurrentIteration = false;
|
|
||||||
// Handle case of charging
|
|
||||||
if (jobRequest.requiresCharging() && Device.isCharging(context)) {
|
|
||||||
if (jobRequest.requiredNetworkType().equals(JobRequest.NetworkType.CONNECTED) &&
|
|
||||||
!Device.getNetworkType(context).equals(JobRequest.NetworkType.ANY)) {
|
|
||||||
jobId = jobRequest.cancelAndEdit().build().schedule();
|
|
||||||
restartedInCurrentIteration = true;
|
|
||||||
} else if (jobRequest.requiredNetworkType().equals(JobRequest.NetworkType.UNMETERED) &&
|
|
||||||
Device.getNetworkType(context).equals(JobRequest.NetworkType.UNMETERED)) {
|
|
||||||
jobId = jobRequest.cancelAndEdit().build().schedule();
|
|
||||||
restartedInCurrentIteration = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle case of wifi
|
|
||||||
|
|
||||||
if (!restartedInCurrentIteration) {
|
|
||||||
if (jobRequest.requiredNetworkType().equals(JobRequest.NetworkType.CONNECTED) &&
|
|
||||||
!Device.getNetworkType(context).equals(JobRequest.NetworkType.ANY)) {
|
|
||||||
jobRequest.cancelAndEdit().build().schedule();
|
|
||||||
} else if (jobRequest.requiredNetworkType().equals(JobRequest.NetworkType.UNMETERED) &&
|
|
||||||
Device.getNetworkType(context).equals(JobRequest.NetworkType.UNMETERED)) {
|
|
||||||
jobRequest.cancelAndEdit().build().schedule();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1258,8 +1258,7 @@ public class FileContentProvider extends ContentProvider {
|
||||||
+ ProviderTableMeta.FILESYSTEM_FILE_IS_FOLDER + " INTEGER, "
|
+ ProviderTableMeta.FILESYSTEM_FILE_IS_FOLDER + " INTEGER, "
|
||||||
+ ProviderTableMeta.FILESYSTEM_FILE_FOUND_RECENTLY + " LONG, "
|
+ ProviderTableMeta.FILESYSTEM_FILE_FOUND_RECENTLY + " LONG, "
|
||||||
+ ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD + " INTEGER, "
|
+ ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD + " INTEGER, "
|
||||||
+ ProviderTableMeta.FILESYSTEM_ACCOUNT + " STRING, "
|
+ ProviderTableMeta.FILESYSTEM_SYNCED_FOLDER_ID + " STRING, "
|
||||||
+ ProviderTableMeta.FILESYSTEM_MIMETYPE + " STRING, "
|
|
||||||
+ ProviderTableMeta.FILESYSTEM_FILE_MODIFIED + " LONG );"
|
+ ProviderTableMeta.FILESYSTEM_FILE_MODIFIED + " LONG );"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -480,9 +480,6 @@ public class FolderSyncActivity extends FileActivity implements FolderSyncAdapte
|
||||||
syncedFolderDisplayItem.setId(storedId);
|
syncedFolderDisplayItem.setId(storedId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FilesSyncHelper.prepareSyncStatusForAccounts();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -525,7 +522,6 @@ public class FolderSyncActivity extends FileActivity implements FolderSyncAdapte
|
||||||
long storedId = mSyncedFolderProvider.storeFolderSync(newCustomFolder);
|
long storedId = mSyncedFolderProvider.storeFolderSync(newCustomFolder);
|
||||||
if (storedId != -1) {
|
if (storedId != -1) {
|
||||||
newCustomFolder.setId(storedId);
|
newCustomFolder.setId(storedId);
|
||||||
FilesSyncHelper.prepareSyncStatusForAccounts();
|
|
||||||
}
|
}
|
||||||
mAdapter.addSyncFolderItem(newCustomFolder);
|
mAdapter.addSyncFolderItem(newCustomFolder);
|
||||||
} else {
|
} else {
|
||||||
|
@ -540,12 +536,10 @@ public class FolderSyncActivity extends FileActivity implements FolderSyncAdapte
|
||||||
long storedId = mSyncedFolderProvider.storeFolderSync(item);
|
long storedId = mSyncedFolderProvider.storeFolderSync(item);
|
||||||
if (storedId != -1) {
|
if (storedId != -1) {
|
||||||
item.setId(storedId);
|
item.setId(storedId);
|
||||||
FilesSyncHelper.prepareSyncStatusForAccounts();
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// existing synced folder setup to be updated
|
// existing synced folder setup to be updated
|
||||||
mSyncedFolderProvider.updateSyncFolder(item);
|
mSyncedFolderProvider.updateSyncFolder(item);
|
||||||
FilesSyncHelper.prepareSyncStatusForAccounts();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dirty) {
|
if(dirty) {
|
||||||
|
|
|
@ -20,107 +20,120 @@
|
||||||
*/
|
*/
|
||||||
package com.owncloud.android.utils;
|
package com.owncloud.android.utils;
|
||||||
|
|
||||||
import android.accounts.Account;
|
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
|
import com.evernote.android.job.JobManager;
|
||||||
|
import com.evernote.android.job.JobRequest;
|
||||||
|
import com.evernote.android.job.util.Device;
|
||||||
import com.owncloud.android.MainApp;
|
import com.owncloud.android.MainApp;
|
||||||
import com.owncloud.android.authentication.AccountUtils;
|
|
||||||
import com.owncloud.android.datamodel.ArbitraryDataProvider;
|
|
||||||
import com.owncloud.android.datamodel.FilesystemDataProvider;
|
import com.owncloud.android.datamodel.FilesystemDataProvider;
|
||||||
|
import com.owncloud.android.datamodel.MediaFolder;
|
||||||
import com.owncloud.android.datamodel.SyncedFolder;
|
import com.owncloud.android.datamodel.SyncedFolder;
|
||||||
import com.owncloud.android.datamodel.SyncedFolderProvider;
|
import com.owncloud.android.datamodel.SyncedFolderProvider;
|
||||||
|
import com.owncloud.android.jobs.AutoUploadJob;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class FilesSyncHelper {
|
public class FilesSyncHelper {
|
||||||
|
|
||||||
private static final String LAST_AUTOUPLOAD_JOB_RUN = "last_autoupload_job_run";
|
public static void insertAllDBEntries() {
|
||||||
|
|
||||||
|
|
||||||
private static void insertAllDBEntries() {
|
|
||||||
boolean dryRun = false;
|
boolean dryRun = false;
|
||||||
|
|
||||||
final Context context = MainApp.getAppContext();
|
|
||||||
final ContentResolver contentResolver = context.getContentResolver();
|
|
||||||
ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(contentResolver);
|
|
||||||
|
|
||||||
for (Account account : AccountUtils.getAccounts(context)) {
|
|
||||||
if (TextUtils.isEmpty(arbitraryDataProvider.getValue(account.name, LAST_AUTOUPLOAD_JOB_RUN))) {
|
|
||||||
dryRun = true;
|
|
||||||
} else {
|
|
||||||
dryRun = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
FilesSyncHelper.insertContentIntoDB(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, dryRun,
|
|
||||||
account.name);
|
|
||||||
FilesSyncHelper.insertContentIntoDB(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, dryRun, account.name);
|
|
||||||
FilesSyncHelper.insertContentIntoDB(android.provider.MediaStore.Video.Media.INTERNAL_CONTENT_URI, dryRun,
|
|
||||||
account.name);
|
|
||||||
FilesSyncHelper.insertContentIntoDB(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, dryRun, account.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void prepareSyncStatusForAccounts() {
|
|
||||||
final Context context = MainApp.getAppContext();
|
final Context context = MainApp.getAppContext();
|
||||||
final ContentResolver contentResolver = context.getContentResolver();
|
final ContentResolver contentResolver = context.getContentResolver();
|
||||||
SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver);
|
SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver);
|
||||||
ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(contentResolver);
|
|
||||||
|
|
||||||
Set<String> enabledAccounts = new HashSet<>();
|
|
||||||
for (SyncedFolder syncedFolder : syncedFolderProvider.getSyncedFolders()) {
|
for (SyncedFolder syncedFolder : syncedFolderProvider.getSyncedFolders()) {
|
||||||
enabledAccounts.add(syncedFolder.getAccount());
|
if (syncedFolder.isEnabled()) {
|
||||||
|
|
||||||
|
if (MediaFolder.IMAGE == syncedFolder.getType()) {
|
||||||
|
FilesSyncHelper.insertContentIntoDB(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI
|
||||||
|
, dryRun, syncedFolder);
|
||||||
|
FilesSyncHelper.insertContentIntoDB(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, dryRun,
|
||||||
|
syncedFolder);
|
||||||
|
} else if (MediaFolder.VIDEO == syncedFolder.getType()) {
|
||||||
|
FilesSyncHelper.insertContentIntoDB(android.provider.MediaStore.Video.Media.INTERNAL_CONTENT_URI,
|
||||||
|
dryRun, syncedFolder);
|
||||||
|
FilesSyncHelper.insertContentIntoDB(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, dryRun,
|
||||||
|
syncedFolder);
|
||||||
|
} else {
|
||||||
|
// custom folder, do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (String enabledAccount : enabledAccounts) {
|
|
||||||
arbitraryDataProvider.storeOrUpdateKeyValue(enabledAccount, LAST_AUTOUPLOAD_JOB_RUN,
|
|
||||||
Long.toString(System.currentTimeMillis()));
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayList<String> accountsArrayList = new ArrayList<>();
|
|
||||||
accountsArrayList.addAll(enabledAccounts);
|
|
||||||
arbitraryDataProvider.deleteForKeyWhereAccountNotIn(accountsArrayList, LAST_AUTOUPLOAD_JOB_RUN);
|
|
||||||
|
|
||||||
insertAllDBEntries();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void insertContentIntoDB(Uri uri, boolean dryRun, String account) {
|
private static void insertContentIntoDB(Uri uri, boolean dryRun, SyncedFolder syncedFolder) {
|
||||||
final Context context = MainApp.getAppContext();
|
final Context context = MainApp.getAppContext();
|
||||||
final ContentResolver contentResolver = context.getContentResolver();
|
final ContentResolver contentResolver = context.getContentResolver();
|
||||||
|
|
||||||
Cursor cursor;
|
Cursor cursor;
|
||||||
int column_index_data, column_index_date_modified, column_index_mimetype;
|
int column_index_data, column_index_date_modified;
|
||||||
|
|
||||||
final FilesystemDataProvider filesystemDataProvider = new FilesystemDataProvider(contentResolver);
|
final FilesystemDataProvider filesystemDataProvider = new FilesystemDataProvider(contentResolver);
|
||||||
|
|
||||||
String contentPath;
|
String contentPath;
|
||||||
boolean isFolder;
|
boolean isFolder;
|
||||||
|
|
||||||
String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DATE_MODIFIED,
|
String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DATE_MODIFIED};
|
||||||
MediaStore.MediaColumns.MIME_TYPE};
|
|
||||||
|
String path = syncedFolder.getLocalPath();
|
||||||
|
if (!path.endsWith("/")) {
|
||||||
|
path = path + "/%";
|
||||||
|
} else {
|
||||||
|
path = path + "%";
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor = context.getContentResolver().query(uri, projection, MediaStore.MediaColumns.DATA + " LIKE ?",
|
||||||
|
new String[]{path}, null);
|
||||||
|
|
||||||
cursor = context.getContentResolver().query(uri, projection, null, null, null);
|
|
||||||
if (cursor != null) {
|
if (cursor != null) {
|
||||||
column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
|
column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
|
||||||
column_index_date_modified = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED);
|
column_index_date_modified = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED);
|
||||||
column_index_mimetype = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.MIME_TYPE);
|
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
contentPath = cursor.getString(column_index_data);
|
contentPath = cursor.getString(column_index_data);
|
||||||
isFolder = new File(contentPath).isDirectory();
|
isFolder = new File(contentPath).isDirectory();
|
||||||
filesystemDataProvider.storeOrUpdateFileValue(cursor.getString(column_index_data),
|
filesystemDataProvider.storeOrUpdateFileValue(cursor.getString(column_index_data),
|
||||||
cursor.getLong(column_index_date_modified), isFolder, account, dryRun,
|
cursor.getLong(column_index_date_modified), isFolder, syncedFolder, dryRun);
|
||||||
cursor.getString(column_index_mimetype));
|
|
||||||
}
|
}
|
||||||
cursor.close();
|
cursor.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void restartJobsIfNeeded() {
|
||||||
|
final Context context = MainApp.getAppContext();
|
||||||
|
boolean restartedInCurrentIteration = false;
|
||||||
|
|
||||||
|
for (JobRequest jobRequest : JobManager.instance().getAllJobRequestsForTag(AutoUploadJob.TAG)) {
|
||||||
|
restartedInCurrentIteration = false;
|
||||||
|
// Handle case of charging
|
||||||
|
if (jobRequest.requiresCharging() && Device.isCharging(context)) {
|
||||||
|
if (jobRequest.requiredNetworkType().equals(JobRequest.NetworkType.CONNECTED) &&
|
||||||
|
!Device.getNetworkType(context).equals(JobRequest.NetworkType.ANY)) {
|
||||||
|
jobRequest.cancelAndEdit().build().schedule();
|
||||||
|
restartedInCurrentIteration = true;
|
||||||
|
} else if (jobRequest.requiredNetworkType().equals(JobRequest.NetworkType.UNMETERED) &&
|
||||||
|
Device.getNetworkType(context).equals(JobRequest.NetworkType.UNMETERED)) {
|
||||||
|
jobRequest.cancelAndEdit().build().schedule();
|
||||||
|
restartedInCurrentIteration = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle case of wifi
|
||||||
|
|
||||||
|
if (!restartedInCurrentIteration) {
|
||||||
|
if (jobRequest.requiredNetworkType().equals(JobRequest.NetworkType.CONNECTED) &&
|
||||||
|
!Device.getNetworkType(context).equals(JobRequest.NetworkType.ANY)) {
|
||||||
|
jobRequest.cancelAndEdit().build().schedule();
|
||||||
|
} else if (jobRequest.requiredNetworkType().equals(JobRequest.NetworkType.UNMETERED) &&
|
||||||
|
Device.getNetworkType(context).equals(JobRequest.NetworkType.UNMETERED)) {
|
||||||
|
jobRequest.cancelAndEdit().build().schedule();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue