diff --git a/scripts/analysis/findbugs-results.txt b/scripts/analysis/findbugs-results.txt index 57214136334b..97964b3fde64 100644 --- a/scripts/analysis/findbugs-results.txt +++ b/scripts/analysis/findbugs-results.txt @@ -1 +1 @@ -423 +422 \ No newline at end of file diff --git a/src/main/java/com/owncloud/android/datamodel/SyncedFolder.java b/src/main/java/com/owncloud/android/datamodel/SyncedFolder.java index 24aaa1f3f785..91b42b813469 100644 --- a/src/main/java/com/owncloud/android/datamodel/SyncedFolder.java +++ b/src/main/java/com/owncloud/android/datamodel/SyncedFolder.java @@ -30,23 +30,23 @@ /** * Synced folder entity containing all information per synced folder. */ -@Getter -@Setter @AllArgsConstructor public class SyncedFolder implements Serializable, Cloneable { public static final long UNPERSISTED_ID = Long.MIN_VALUE; + public static final long EMPTY_ENABLED_TIMESTAMP_MS = -1; private static final long serialVersionUID = -793476118299906429L; - private long id = UNPERSISTED_ID; - private String localPath; - private String remotePath; - private Boolean wifiOnly; - private Boolean chargingOnly; - private Boolean subfolderByDate; - private String account; - private Integer uploadAction; - private boolean enabled; - private MediaFolderType type; + @Getter @Setter private long id; + @Getter @Setter private String localPath; + @Getter @Setter private String remotePath; + @Getter @Setter private Boolean wifiOnly; + @Getter @Setter private Boolean chargingOnly; + @Getter @Setter private Boolean subfolderByDate; + @Getter @Setter private String account; + @Getter @Setter private Integer uploadAction; + @Getter private boolean enabled; + @Getter private long enabledTimestampMs; + @Getter @Setter private MediaFolderType type; /** * constructor for new, to be persisted entity. @@ -59,11 +59,25 @@ public class SyncedFolder implements Serializable, Cloneable { * @param account the account owning the synced folder * @param uploadAction the action to be done after the upload * @param enabled flag if synced folder config is active + * @param timestampMs the current timestamp in milliseconds * @param type the type of the folder */ public SyncedFolder(String localPath, String remotePath, Boolean wifiOnly, Boolean chargingOnly, Boolean subfolderByDate, String account, Integer uploadAction, Boolean enabled, - MediaFolderType type) { + long timestampMs, MediaFolderType type) { + this(UNPERSISTED_ID, localPath, remotePath, wifiOnly, chargingOnly, subfolderByDate, account, uploadAction, + enabled, timestampMs, type); + } + + /** + * constructor for wrapping existing folders. + * + * @param id id + */ + protected SyncedFolder(long id, String localPath, String remotePath, Boolean wifiOnly, Boolean chargingOnly, + Boolean subfolderByDate, String account, Integer uploadAction, Boolean enabled, + long timestampMs, MediaFolderType type) { + this.id = id; this.localPath = localPath; this.remotePath = remotePath; this.wifiOnly = wifiOnly; @@ -71,10 +85,18 @@ public SyncedFolder(String localPath, String remotePath, Boolean wifiOnly, Boole this.subfolderByDate = subfolderByDate; this.account = account; this.uploadAction = uploadAction; - this.enabled = enabled; + this.setEnabled(enabled, timestampMs); this.type = type; } + /** + * @param timestampMs the current timestamp in milliseconds + */ + public void setEnabled(boolean enabled, long timestampMs) { + this.enabled = enabled; + this.enabledTimestampMs = enabled ? timestampMs : EMPTY_ENABLED_TIMESTAMP_MS; + } + public Object clone() { try { return super.clone(); diff --git a/src/main/java/com/owncloud/android/datamodel/SyncedFolderDisplayItem.java b/src/main/java/com/owncloud/android/datamodel/SyncedFolderDisplayItem.java index cac3df7a143b..7420b1889295 100644 --- a/src/main/java/com/owncloud/android/datamodel/SyncedFolderDisplayItem.java +++ b/src/main/java/com/owncloud/android/datamodel/SyncedFolderDisplayItem.java @@ -56,9 +56,11 @@ public class SyncedFolderDisplayItem extends SyncedFolder { */ public SyncedFolderDisplayItem(long id, String localPath, String remotePath, Boolean wifiOnly, Boolean chargingOnly, Boolean subfolderByDate, String account, Integer uploadAction, Boolean enabled, - List filePaths, String folderName, long numberOfFiles, MediaFolderType type) + long timestampMs, List filePaths, String folderName, long numberOfFiles, + MediaFolderType type) { - super(id, localPath, remotePath, wifiOnly, chargingOnly, subfolderByDate, account, uploadAction, enabled, type); + super(id, localPath, remotePath, wifiOnly, chargingOnly, subfolderByDate, account, uploadAction, enabled, + timestampMs, type); this.filePaths = filePaths; this.folderName = folderName; this.numberOfFiles = numberOfFiles; @@ -66,8 +68,9 @@ public SyncedFolderDisplayItem(long id, String localPath, String remotePath, Boo public SyncedFolderDisplayItem(long id, String localPath, String remotePath, Boolean wifiOnly, Boolean chargingOnly, Boolean subfolderByDate, String account, Integer uploadAction, Boolean enabled, - String folderName, MediaFolderType type) { - super(id, localPath, remotePath, wifiOnly, chargingOnly, subfolderByDate, account, uploadAction, enabled, type); + long timestampMs, String folderName, MediaFolderType type) { + super(id, localPath, remotePath, wifiOnly, chargingOnly, subfolderByDate, account, uploadAction, enabled, + timestampMs, type); this.folderName = folderName; } } diff --git a/src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java b/src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java index 07712a9e3493..b7dd75d967f6 100644 --- a/src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java +++ b/src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java @@ -27,6 +27,7 @@ import android.database.Cursor; import android.net.Uri; +import com.nextcloud.client.core.Clock; import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.client.preferences.AppPreferencesImpl; import com.owncloud.android.db.ProviderMeta; @@ -37,6 +38,8 @@ import java.util.List; import java.util.Observable; +import javax.inject.Inject; + import androidx.annotation.NonNull; import static com.owncloud.android.datamodel.OCFile.PATH_SEPARATOR; @@ -50,6 +53,8 @@ public class SyncedFolderProvider extends Observable { private ContentResolver mContentResolver; private AppPreferences preferences; + @Inject protected Clock clock; + /** * constructor. * @@ -162,7 +167,7 @@ public int updateSyncedFolderEnabled(long id, Boolean enabled) { // read sync folder object and update SyncedFolder syncedFolder = createSyncedFolderFromCursor(cursor); - syncedFolder.setEnabled(enabled); + syncedFolder.setEnabled(enabled, clock.getCurrentTime()); // update sync folder object in db result = updateSyncFolder(syncedFolder); @@ -347,11 +352,13 @@ private SyncedFolder createSyncedFolderFromCursor(Cursor cursor) { ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_UPLOAD_ACTION)); Boolean enabled = cursor.getInt(cursor.getColumnIndex( ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_ENABLED)) == 1; + long enabledTimestampMs = cursor.getLong(cursor.getColumnIndex( + ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_ENABLED_TIMESTAMP_MS)); MediaFolderType type = MediaFolderType.getById(cursor.getInt(cursor.getColumnIndex( ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_TYPE))); syncedFolder = new SyncedFolder(id, localPath, remotePath, wifiOnly, chargingOnly, subfolderByDate, - accountName, uploadAction, enabled, type); + accountName, uploadAction, enabled, enabledTimestampMs, type); } return syncedFolder; } @@ -370,6 +377,7 @@ private ContentValues createContentValuesFromSyncedFolder(SyncedFolder syncedFol cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_WIFI_ONLY, syncedFolder.getWifiOnly()); cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_CHARGING_ONLY, syncedFolder.getChargingOnly()); cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_ENABLED, syncedFolder.isEnabled()); + cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_ENABLED_TIMESTAMP_MS, syncedFolder.getEnabledTimestampMs()); cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_SUBFOLDER_BY_DATE, syncedFolder.getSubfolderByDate()); cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_ACCOUNT, syncedFolder.getAccount()); cv.put(ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_UPLOAD_ACTION, syncedFolder.getUploadAction()); diff --git a/src/main/java/com/owncloud/android/db/ProviderMeta.java b/src/main/java/com/owncloud/android/db/ProviderMeta.java index 093d36b9f2d8..8bbe982b15d2 100644 --- a/src/main/java/com/owncloud/android/db/ProviderMeta.java +++ b/src/main/java/com/owncloud/android/db/ProviderMeta.java @@ -31,7 +31,7 @@ */ public class ProviderMeta { public static final String DB_NAME = "filelist"; - public static final int DB_VERSION = 49; + public static final int DB_VERSION = 50; private ProviderMeta() { // No instance @@ -220,6 +220,7 @@ static public class ProviderTableMeta implements BaseColumns { public static final String SYNCED_FOLDER_WIFI_ONLY = "wifi_only"; public static final String SYNCED_FOLDER_CHARGING_ONLY = "charging_only"; public static final String SYNCED_FOLDER_ENABLED = "enabled"; + public static final String SYNCED_FOLDER_ENABLED_TIMESTAMP_MS = "enabled_timestamp_ms"; public static final String SYNCED_FOLDER_TYPE = "type"; public static final String SYNCED_FOLDER_SUBFOLDER_BY_DATE = "subfolder_by_date"; public static final String SYNCED_FOLDER_ACCOUNT = "account"; diff --git a/src/main/java/com/owncloud/android/jobs/AccountRemovalJob.java b/src/main/java/com/owncloud/android/jobs/AccountRemovalJob.java index b87d3e99de5b..9065d9a0b673 100644 --- a/src/main/java/com/owncloud/android/jobs/AccountRemovalJob.java +++ b/src/main/java/com/owncloud/android/jobs/AccountRemovalJob.java @@ -57,7 +57,6 @@ import com.owncloud.android.ui.events.AccountRemovedEvent; import com.owncloud.android.utils.EncryptionUtils; import com.owncloud.android.utils.FileStorageUtils; -import com.owncloud.android.utils.FilesSyncHelper; import com.owncloud.android.utils.PushUtils; import org.greenrobot.eventbus.EventBus; @@ -129,7 +128,7 @@ protected Result onRunJob(@NotNull Params params) { arbitraryDataProvider.deleteKeyForAccount(account.name, PENDING_FOR_REMOVAL); // remove synced folders set for account - remoceSyncedFolders(context, account, arbitraryDataProvider); + remoceSyncedFolders(context, account); // delete all uploads for account uploadsStorageManager.removeAccountUploads(account); @@ -174,7 +173,7 @@ private void unregisterPushNotifications(Context context, Account account, Arbit } } - private void remoceSyncedFolders(Context context, Account account, ArbitraryDataProvider arbitraryDataProvider) { + private void remoceSyncedFolders(Context context, Account account) { SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(context.getContentResolver(), AppPreferencesImpl.fromContext(context)); List syncedFolders = syncedFolderProvider.getSyncedFolders(); @@ -183,8 +182,6 @@ private void remoceSyncedFolders(Context context, Account account, ArbitraryData for (SyncedFolder syncedFolder : syncedFolders) { if (syncedFolder.getAccount().equals(account.name)) { - arbitraryDataProvider.deleteKeyForAccount(FilesSyncHelper.GLOBAL, - FilesSyncHelper.SYNCEDFOLDERINITIATED + syncedFolder.getId()); syncedFolderIds.add(syncedFolder.getId()); } } diff --git a/src/main/java/com/owncloud/android/providers/FileContentProvider.java b/src/main/java/com/owncloud/android/providers/FileContentProvider.java index bcfe381e53ec..b82789ce98cd 100644 --- a/src/main/java/com/owncloud/android/providers/FileContentProvider.java +++ b/src/main/java/com/owncloud/android/providers/FileContentProvider.java @@ -42,9 +42,11 @@ import android.os.Binder; import android.text.TextUtils; +import com.nextcloud.client.core.Clock; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.datamodel.SyncedFolder; import com.owncloud.android.db.ProviderMeta; import com.owncloud.android.db.ProviderMeta.ProviderTableMeta; import com.owncloud.android.lib.common.accounts.AccountUtils; @@ -58,6 +60,8 @@ import java.util.HashMap; import java.util.Locale; +import javax.inject.Inject; + import androidx.annotation.NonNull; /** @@ -91,6 +95,7 @@ public class FileContentProvider extends ContentProvider { public static final int ARBITRARY_DATA_TABLE_INTRODUCTION_VERSION = 20; public static final int MINIMUM_PATH_SEGMENTS_SIZE = 1; + @Inject protected Clock clock; private DataBaseHelper mDbHelper; private Context mContext; private UriMatcher mUriMatcher; @@ -822,6 +827,7 @@ private void createSyncedFoldersTable(SQLiteDatabase db) { + ProviderTableMeta.SYNCED_FOLDER_WIFI_ONLY + " INTEGER, " // wifi_only + ProviderTableMeta.SYNCED_FOLDER_CHARGING_ONLY + " INTEGER, " // charging only + ProviderTableMeta.SYNCED_FOLDER_ENABLED + " INTEGER, " // enabled + + ProviderTableMeta.SYNCED_FOLDER_ENABLED_TIMESTAMP_MS + " INTEGER, " // enable date + ProviderTableMeta.SYNCED_FOLDER_SUBFOLDER_BY_DATE + " INTEGER, " // subfolder by date + ProviderTableMeta.SYNCED_FOLDER_ACCOUNT + " TEXT, " // account + ProviderTableMeta.SYNCED_FOLDER_UPLOAD_ACTION + " INTEGER, " // upload action @@ -2013,6 +2019,30 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (!upgraded) { Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion)); } + + if (oldVersion < 50 && newVersion >= 50) { + Log_OC.i(SQL, "Entering in the #50 add persistent enable date to synced_folders table"); + db.beginTransaction(); + try { + db.execSQL(ALTER_TABLE + ProviderTableMeta.SYNCED_FOLDERS_TABLE_NAME + + ADD_COLUMN + ProviderTableMeta.SYNCED_FOLDER_ENABLED_TIMESTAMP_MS + " INTEGER "); + + db.execSQL("UPDATE " + ProviderTableMeta.SYNCED_FOLDERS_TABLE_NAME + " SET " + + ProviderTableMeta.SYNCED_FOLDER_ENABLED_TIMESTAMP_MS + " = CASE " + + " WHEN enabled = 0 THEN " + SyncedFolder.EMPTY_ENABLED_TIMESTAMP_MS + " " + + " ELSE " + clock.getCurrentTime() + + " END "); + + upgraded = true; + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + + if (!upgraded) { + Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion)); + } } @Override diff --git a/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java b/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java index 78ae76286888..f42060bc5093 100644 --- a/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java @@ -41,13 +41,13 @@ import android.widget.LinearLayout; import android.widget.TextView; +import com.nextcloud.client.core.Clock; import com.nextcloud.client.device.PowerManagementService; import com.nextcloud.client.di.Injectable; import com.nextcloud.client.preferences.AppPreferences; import com.owncloud.android.BuildConfig; import com.owncloud.android.MainApp; import com.owncloud.android.R; -import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.MediaFolder; import com.owncloud.android.datamodel.MediaFolderType; import com.owncloud.android.datamodel.MediaProvider; @@ -113,6 +113,7 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA private int type; @Inject AppPreferences preferences; @Inject PowerManagementService powerManagementService; + @Inject Clock clock; @Override protected void onCreate(Bundle savedInstanceState) { @@ -386,6 +387,7 @@ private SyncedFolderDisplayItem createSyncedFolderWithoutMediaFolder(@NonNull Sy syncedFolder.getAccount(), syncedFolder.getUploadAction(), syncedFolder.isEnabled(), + clock.getCurrentTime(), filePaths, localFolder.getName(), files.length, @@ -411,6 +413,7 @@ private SyncedFolderDisplayItem createSyncedFolder(@NonNull SyncedFolder syncedF syncedFolder.getAccount(), syncedFolder.getUploadAction(), syncedFolder.isEnabled(), + clock.getCurrentTime(), mediaFolder.filePaths, mediaFolder.folderName, mediaFolder.numberOfFiles, @@ -432,9 +435,10 @@ private SyncedFolderDisplayItem createSyncedFolderFromMediaFolder(@NonNull Media true, false, false, - getAccount().name, + getAccount().name, FileUploader.LOCAL_BEHAVIOUR_FORGET, false, + clock.getCurrentTime(), mediaFolder.filePaths, mediaFolder.folderName, mediaFolder.numberOfFiles, @@ -519,7 +523,7 @@ public boolean onOptionsItemSelected(MenuItem item) { SyncedFolderDisplayItem emptyCustomFolder = new SyncedFolderDisplayItem( SyncedFolder.UNPERSISTED_ID, null, null, true, false, false, getAccount().name, - FileUploader.LOCAL_BEHAVIOUR_FORGET, false, null, MediaFolderType.CUSTOM); + FileUploader.LOCAL_BEHAVIOUR_FORGET, false, clock.getCurrentTime(), null, MediaFolderType.CUSTOM); onSyncFolderSettingsClick(0, emptyCustomFolder); } @@ -548,9 +552,6 @@ public void showFiles(boolean onDeviceOnly) { @Override public void onSyncStatusToggleClick(int section, SyncedFolderDisplayItem syncedFolderDisplayItem) { - ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(MainApp.getAppContext(). - getContentResolver()); - if (syncedFolderDisplayItem.getId() > UNPERSISTED_ID) { mSyncedFolderProvider.updateSyncedFolderEnabled(syncedFolderDisplayItem.getId(), syncedFolderDisplayItem.isEnabled()); @@ -565,9 +566,6 @@ public void onSyncStatusToggleClick(int section, SyncedFolderDisplayItem syncedF FilesSyncHelper.insertAllDBEntriesForSyncedFolder(syncedFolderDisplayItem); showBatteryOptimizationInfo(); - } else { - String syncedFolderInitiatedKey = "syncedFolderIntitiated_" + syncedFolderDisplayItem.getId(); - arbitraryDataProvider.deleteKeyForAccount("global", syncedFolderInitiatedKey); } } @@ -600,9 +598,6 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { @Override public void onSaveSyncedFolderPreference(SyncedFolderParcelable syncedFolder) { - ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(MainApp.getAppContext(). - getContentResolver()); - // custom folders newly created aren't in the list already, // so triggering a refresh if (MediaFolderType.CUSTOM == syncedFolder.getType() && syncedFolder.getId() == UNPERSISTED_ID) { @@ -610,15 +605,12 @@ public void onSaveSyncedFolderPreference(SyncedFolderParcelable syncedFolder) { SyncedFolder.UNPERSISTED_ID, syncedFolder.getLocalPath(), syncedFolder.getRemotePath(), syncedFolder.getWifiOnly(), syncedFolder.getChargingOnly(), syncedFolder.getSubfolderByDate(), syncedFolder.getAccount(), syncedFolder.getUploadAction(), syncedFolder.getEnabled(), - new File(syncedFolder.getLocalPath()).getName(), syncedFolder.getType()); + clock.getCurrentTime(), new File(syncedFolder.getLocalPath()).getName(), syncedFolder.getType()); long storedId = mSyncedFolderProvider.storeSyncedFolder(newCustomFolder); if (storedId != -1) { newCustomFolder.setId(storedId); if (newCustomFolder.isEnabled()) { FilesSyncHelper.insertAllDBEntriesForSyncedFolder(newCustomFolder); - } else { - String syncedFolderInitiatedKey = "syncedFolderIntitiated_" + newCustomFolder.getId(); - arbitraryDataProvider.deleteKeyForAccount("global", syncedFolderInitiatedKey); } } mAdapter.addSyncFolderItem(newCustomFolder); @@ -635,9 +627,6 @@ public void onSaveSyncedFolderPreference(SyncedFolderParcelable syncedFolder) { item.setId(storedId); if (item.isEnabled()) { FilesSyncHelper.insertAllDBEntriesForSyncedFolder(item); - } else { - String syncedFolderInitiatedKey = "syncedFolderIntitiated_" + item.getId(); - arbitraryDataProvider.deleteKeyForAccount("global", syncedFolderInitiatedKey); } } } else { @@ -645,9 +634,6 @@ public void onSaveSyncedFolderPreference(SyncedFolderParcelable syncedFolder) { mSyncedFolderProvider.updateSyncFolder(item); if (item.isEnabled()) { FilesSyncHelper.insertAllDBEntriesForSyncedFolder(item); - } else { - String syncedFolderInitiatedKey = "syncedFolderIntitiated_" + item.getId(); - arbitraryDataProvider.deleteKeyForAccount("global", syncedFolderInitiatedKey); } } @@ -699,7 +685,7 @@ private SyncedFolderDisplayItem updateSyncedFolderItem(SyncedFolderDisplayItem i item.setChargingOnly(chargingOnly); item.setSubfolderByDate(subfolderByDate); item.setUploadAction(uploadAction); - item.setEnabled(enabled); + item.setEnabled(enabled, clock.getCurrentTime()); return item; } diff --git a/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java index 8a8176e54ef4..cd10bc88d81c 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java @@ -33,6 +33,7 @@ import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter; import com.afollestad.sectionedrecyclerview.SectionedViewHolder; +import com.nextcloud.client.core.Clock; import com.owncloud.android.R; import com.owncloud.android.datamodel.MediaFolderType; import com.owncloud.android.datamodel.SyncedFolderDisplayItem; @@ -44,6 +45,8 @@ import java.util.List; import java.util.Locale; +import javax.inject.Inject; + import androidx.annotation.NonNull; import butterknife.BindView; import butterknife.ButterKnife; @@ -60,6 +63,8 @@ public class SyncedFolderAdapter extends SectionedRecyclerViewAdapter mSyncFolderItems; private final boolean mLight; + @Inject protected Clock clock; + public SyncedFolderAdapter(Context context, int gridWidth, ClickListener listener, boolean light) { mContext = context; mGridWidth = gridWidth; @@ -148,7 +153,7 @@ public void onBindHeaderViewHolder(SectionedViewHolder commonHolder, final int s holder.syncStatusButton.setVisibility(View.VISIBLE); holder.syncStatusButton.setTag(section); holder.syncStatusButton.setOnClickListener(v -> { - mSyncFolderItems.get(section).setEnabled(!mSyncFolderItems.get(section).isEnabled()); + mSyncFolderItems.get(section).setEnabled(!mSyncFolderItems.get(section).isEnabled(), clock.getCurrentTime()); setSyncButtonActiveIcon(holder.syncStatusButton, mSyncFolderItems.get(section).isEnabled()); mListener.onSyncStatusToggleClick(section, mSyncFolderItems.get(section)); }); @@ -157,7 +162,7 @@ public void onBindHeaderViewHolder(SectionedViewHolder commonHolder, final int s holder.syncStatusButton.setVisibility(View.VISIBLE); holder.syncStatusButton.setTag(section); holder.syncStatusButton.setOnClickListener(v -> { - mSyncFolderItems.get(section).setEnabled(!mSyncFolderItems.get(section).isEnabled()); + mSyncFolderItems.get(section).setEnabled(!mSyncFolderItems.get(section).isEnabled(), clock.getCurrentTime()); setSyncButtonActiveIcon(holder.syncStatusButton, mSyncFolderItems.get(section).isEnabled()); mListener.onSyncStatusToggleClick(section, mSyncFolderItems.get(section)); }); diff --git a/src/main/java/com/owncloud/android/utils/FilesSyncHelper.java b/src/main/java/com/owncloud/android/utils/FilesSyncHelper.java index 9116a3d57067..351abe46b298 100644 --- a/src/main/java/com/owncloud/android/utils/FilesSyncHelper.java +++ b/src/main/java/com/owncloud/android/utils/FilesSyncHelper.java @@ -30,7 +30,6 @@ import android.net.Uri; import android.os.Build; import android.provider.MediaStore; -import android.text.TextUtils; import android.util.Log; import com.evernote.android.job.JobManager; @@ -41,7 +40,6 @@ import com.nextcloud.client.network.ConnectivityService; import com.nextcloud.client.preferences.AppPreferences; import com.owncloud.android.MainApp; -import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.FilesystemDataProvider; import com.owncloud.android.datamodel.MediaFolderType; import com.owncloud.android.datamodel.SyncedFolder; @@ -73,7 +71,6 @@ public final class FilesSyncHelper { public static final String TAG = "FileSyncHelper"; public static final String GLOBAL = "global"; - public static final String SYNCEDFOLDERINITIATED = "syncedFolderIntitiated_"; public static final int ContentSyncJobId = 315; @@ -84,59 +81,34 @@ private FilesSyncHelper() { public static void insertAllDBEntriesForSyncedFolder(SyncedFolder syncedFolder) { final Context context = MainApp.getAppContext(); final ContentResolver contentResolver = context.getContentResolver(); - ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(contentResolver); - Long currentTime = System.currentTimeMillis(); - double currentTimeInSeconds = currentTime / 1000.0; - String currentTimeString = Long.toString((long) currentTimeInSeconds); + final long enabledTimestampMs = syncedFolder.getEnabledTimestampMs(); - String syncedFolderInitiatedKey = SYNCEDFOLDERINITIATED + syncedFolder.getId(); - boolean dryRun = TextUtils.isEmpty(arbitraryDataProvider.getValue - (GLOBAL, syncedFolderInitiatedKey)); - - if (MediaFolderType.IMAGE == syncedFolder.getType()) { - if (dryRun) { - arbitraryDataProvider.storeOrUpdateKeyValue(GLOBAL, syncedFolderInitiatedKey, - currentTimeString); - } else { - FilesSyncHelper.insertContentIntoDB(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI - , syncedFolder); + if (syncedFolder.isEnabled() && enabledTimestampMs >= 0) { + MediaFolderType mediaType = syncedFolder.getType(); + if (mediaType == MediaFolderType.IMAGE) { + FilesSyncHelper.insertContentIntoDB(MediaStore.Images.Media.INTERNAL_CONTENT_URI + , syncedFolder); FilesSyncHelper.insertContentIntoDB(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, - syncedFolder); - } - - } else if (MediaFolderType.VIDEO == syncedFolder.getType()) { - - if (dryRun) { - arbitraryDataProvider.storeOrUpdateKeyValue(GLOBAL, syncedFolderInitiatedKey, - currentTimeString); - } else { - FilesSyncHelper.insertContentIntoDB(android.provider.MediaStore.Video.Media.INTERNAL_CONTENT_URI, - syncedFolder); + syncedFolder); + } else if (mediaType == MediaFolderType.VIDEO) { + FilesSyncHelper.insertContentIntoDB(MediaStore.Video.Media.INTERNAL_CONTENT_URI, + syncedFolder); FilesSyncHelper.insertContentIntoDB(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, - syncedFolder); - } - - } else { - try { - if (dryRun) { - arbitraryDataProvider.storeOrUpdateKeyValue(GLOBAL, syncedFolderInitiatedKey, - currentTimeString); - } else { + syncedFolder); + } else { + try { FilesystemDataProvider filesystemDataProvider = new FilesystemDataProvider(contentResolver); Path path = Paths.get(syncedFolder.getLocalPath()); - String dateInitiated = arbitraryDataProvider.getValue(GLOBAL, - syncedFolderInitiatedKey); - Files.walkFileTree(path, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) { - File file = path.toFile(); - if (attrs.lastModifiedTime().toMillis() >= Long.parseLong(dateInitiated) * 1000) { + if (attrs.lastModifiedTime().toMillis() >= enabledTimestampMs) { filesystemDataProvider.storeOrUpdateFileValue(path.toAbsolutePath().toString(), - attrs.lastModifiedTime().toMillis(), file.isDirectory(), syncedFolder); + attrs.lastModifiedTime().toMillis(), + file.isDirectory(), syncedFolder); } return FileVisitResult.CONTINUE; @@ -147,11 +119,9 @@ public FileVisitResult visitFileFailed(Path file, IOException exc) { return FileVisitResult.CONTINUE; } }); - + } catch (IOException e) { + Log.e(TAG, "Something went wrong while indexing files for auto upload " + e.getLocalizedMessage()); } - - } catch (IOException e) { - Log.e(TAG, "Something went wrong while indexing files for auto upload " + e.getLocalizedMessage()); } } } @@ -172,7 +142,6 @@ public static void insertAllDBEntries(AppPreferences preferences, boolean skipCu private static void insertContentIntoDB(Uri uri, SyncedFolder syncedFolder) { final Context context = MainApp.getAppContext(); final ContentResolver contentResolver = context.getContentResolver(); - ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(contentResolver); Cursor cursor; int column_index_data; @@ -191,11 +160,10 @@ private static void insertContentIntoDB(Uri uri, SyncedFolder syncedFolder) { } path = path + "%"; - String syncedFolderInitiatedKey = SYNCEDFOLDERINITIATED + syncedFolder.getId(); - String dateInitiated = arbitraryDataProvider.getValue(GLOBAL, syncedFolderInitiatedKey); + long enabledTimestampMs = syncedFolder.getEnabledTimestampMs(); cursor = context.getContentResolver().query(uri, projection, MediaStore.MediaColumns.DATA + " LIKE ?", - new String[]{path}, null); + new String[]{path}, null); if (cursor != null) { column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); @@ -203,9 +171,10 @@ private static void insertContentIntoDB(Uri uri, SyncedFolder syncedFolder) { while (cursor.moveToNext()) { contentPath = cursor.getString(column_index_data); isFolder = new File(contentPath).isDirectory(); - if (cursor.getLong(column_index_date_modified) >= Long.parseLong(dateInitiated)) { + if (cursor.getLong(column_index_date_modified) >= enabledTimestampMs / 1000.0) { filesystemDataProvider.storeOrUpdateFileValue(contentPath, - cursor.getLong(column_index_date_modified), isFolder, syncedFolder); + cursor.getLong(column_index_date_modified), isFolder, + syncedFolder); } } cursor.close();