Change of hearts

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2017-06-30 12:02:24 +02:00 committed by AndyScherzinger
parent 9c6dab3238
commit 5b96a33446
No known key found for this signature in database
GPG key ID: 6CADC7E3523C308B
8 changed files with 147 additions and 212 deletions

View file

@ -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() {

View file

@ -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;
} }
} }

View file

@ -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();

View file

@ -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";
} }
} }

View file

@ -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();
}
}
}
}
} }

View file

@ -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 );"
); );
} }

View file

@ -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) {

View file

@ -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();
}
}
}
}
} }