diff --git a/res/values/strings.xml b/res/values/strings.xml index 519d03cb7089..86fb84f701a3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -307,6 +307,8 @@ %1$s could not be copied to %2$s local folder Upload path + Use subfolders + Store in subfolders based on year and month Sorry, sharing is not enabled on your server. Please contact your administrator. diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 882ca4413411..b75d6f24667a 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -25,9 +25,13 @@ - + @@ -37,6 +41,10 @@ + diff --git a/src/com/owncloud/android/db/PreferenceManager.java b/src/com/owncloud/android/db/PreferenceManager.java index 22e7ec09f334..523ed612afe2 100644 --- a/src/com/owncloud/android/db/PreferenceManager.java +++ b/src/com/owncloud/android/db/PreferenceManager.java @@ -37,8 +37,10 @@ public abstract class PreferenceManager { private static final String AUTO_PREF__SORT_ASCENDING = "sort_ascending"; private static final String PREF__INSTANT_UPLOADING = "instant_uploading"; private static final String PREF__INSTANT_VIDEO_UPLOADING = "instant_video_uploading"; + private static final String PREF__INSTANT_UPLOAD_PATH_USE_SUBFOLDERS = "instant_upload_path_use_subfolders"; private static final String PREF__INSTANT_UPLOAD_ON_WIFI = "instant_upload_on_wifi"; private static final String PREF__INSTANT_VIDEO_UPLOAD_ON_WIFI = "instant_video_upload_on_wifi"; + private static final String PREF__INSTANT_VIDEO_UPLOAD_PATH_USE_SUBFOLDERS = "instant_video_upload_path_use_subfolders"; public static boolean instantPictureUploadEnabled(Context context) { return getDefaultSharedPreferences(context).getBoolean(PREF__INSTANT_UPLOADING, false); @@ -48,10 +50,18 @@ public static boolean instantVideoUploadEnabled(Context context) { return getDefaultSharedPreferences(context).getBoolean(PREF__INSTANT_VIDEO_UPLOADING, false); } + public static boolean instantPictureUploadPathUseSubfolders(Context context) { + return getDefaultSharedPreferences(context).getBoolean(PREF__INSTANT_UPLOAD_PATH_USE_SUBFOLDERS, false); + } + public static boolean instantPictureUploadViaWiFiOnly(Context context) { return getDefaultSharedPreferences(context).getBoolean(PREF__INSTANT_UPLOAD_ON_WIFI, false); } + public static boolean instantVideoUploadPathUseSubfolders(Context context) { + return getDefaultSharedPreferences(context).getBoolean(PREF__INSTANT_VIDEO_UPLOAD_PATH_USE_SUBFOLDERS, false); + } + public static boolean instantVideoUploadViaWiFiOnly(Context context) { return getDefaultSharedPreferences(context).getBoolean(PREF__INSTANT_VIDEO_UPLOAD_ON_WIFI, false); } diff --git a/src/com/owncloud/android/files/InstantUploadBroadcastReceiver.java b/src/com/owncloud/android/files/InstantUploadBroadcastReceiver.java index b33cb16f6a9a..17e3d0288b47 100644 --- a/src/com/owncloud/android/files/InstantUploadBroadcastReceiver.java +++ b/src/com/owncloud/android/files/InstantUploadBroadcastReceiver.java @@ -83,6 +83,7 @@ private void handleNewPictureAction(Context context, Intent intent) { String file_path = null; String file_name = null; String mime_type = null; + long date_taken = 0; Log_OC.i(TAG, "New photo received"); @@ -116,6 +117,7 @@ private void handleNewPictureAction(Context context, Intent intent) { file_path = c.getString(c.getColumnIndex(Images.Media.DATA)); file_name = c.getString(c.getColumnIndex(Images.Media.DISPLAY_NAME)); mime_type = c.getString(c.getColumnIndex(Images.Media.MIME_TYPE)); + date_taken = System.currentTimeMillis(); c.close(); if (file_path.equals(lastUploadedPhotoPath)) { @@ -134,7 +136,7 @@ private void handleNewPictureAction(Context context, Intent intent) { context, account, file_path, - FileStorageUtils.getInstantUploadFilePath(context, file_name), + FileStorageUtils.getInstantUploadFilePath(context, file_name, date_taken), behaviour, mime_type, true, // create parent folder if not existent @@ -161,6 +163,7 @@ private void handleNewVideoAction(Context context, Intent intent) { String file_path = null; String file_name = null; String mime_type = null; + long date_taken = 0; Log_OC.i(TAG, "New video received"); @@ -186,6 +189,7 @@ private void handleNewVideoAction(Context context, Intent intent) { file_name = c.getString(c.getColumnIndex(Video.Media.DISPLAY_NAME)); mime_type = c.getString(c.getColumnIndex(Video.Media.MIME_TYPE)); c.close(); + date_taken = System.currentTimeMillis(); Log_OC.d(TAG, file_path + ""); int behaviour = getUploadBehaviour(context); @@ -194,7 +198,7 @@ private void handleNewVideoAction(Context context, Intent intent) { context, account, file_path, - FileStorageUtils.getInstantVideoUploadFilePath(context, file_name), + FileStorageUtils.getInstantVideoUploadFilePath(context, file_name, date_taken), behaviour, mime_type, true, // create parent folder if not existent diff --git a/src/com/owncloud/android/ui/activity/Preferences.java b/src/com/owncloud/android/ui/activity/Preferences.java index f7ce28a5efca..68de94895f13 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -110,9 +110,11 @@ public class Preferences extends PreferenceActivity private Preference mPrefInstantUpload; private Preference mPrefInstantUploadBehaviour; private Preference mPrefInstantUploadPath; + private Preference mPrefInstantUploadUseSubfolders; private Preference mPrefInstantUploadPathWiFi; private Preference mPrefInstantVideoUpload; private Preference mPrefInstantVideoUploadPath; + private Preference mPrefInstantVideoUploadUseSubfolders; private Preference mPrefInstantVideoUploadPathWiFi; private String mUploadVideoPath; @@ -391,7 +393,8 @@ public boolean onPreferenceClick(Preference preference) { mPrefInstantUploadCategory = (PreferenceCategory) findPreference("instant_uploading_category"); - + + mPrefInstantUploadUseSubfolders = findPreference("instant_upload_path_use_subfolders"); mPrefInstantUploadPathWiFi = findPreference("instant_upload_on_wifi"); mPrefInstantUpload = findPreference("instant_uploading"); @@ -426,7 +429,8 @@ public boolean onPreferenceClick(Preference preference) { } }); } - + + mPrefInstantVideoUploadUseSubfolders = findPreference("instant_video_upload_path_use_subfolders"); mPrefInstantVideoUploadPathWiFi = findPreference("instant_video_upload_on_wifi"); mPrefInstantVideoUpload = findPreference("instant_video_uploading"); toggleInstantVideoOptions(((CheckBoxPreference) mPrefInstantVideoUpload).isChecked()); @@ -477,9 +481,11 @@ private void toggleInstantPictureOptions(Boolean value){ if (value){ mPrefInstantUploadCategory.addPreference(mPrefInstantUploadPathWiFi); mPrefInstantUploadCategory.addPreference(mPrefInstantUploadPath); + mPrefInstantUploadCategory.addPreference(mPrefInstantUploadUseSubfolders); } else { mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPathWiFi); mPrefInstantUploadCategory.removePreference(mPrefInstantUploadPath); + mPrefInstantUploadCategory.removePreference(mPrefInstantUploadUseSubfolders); } } @@ -487,9 +493,11 @@ private void toggleInstantVideoOptions(Boolean value){ if (value){ mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadPathWiFi); mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadPath); + mPrefInstantUploadCategory.addPreference(mPrefInstantVideoUploadUseSubfolders); } else { mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPathWiFi); mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadPath); + mPrefInstantUploadCategory.removePreference(mPrefInstantVideoUploadUseSubfolders); } } diff --git a/src/com/owncloud/android/utils/FileStorageUtils.java b/src/com/owncloud/android/utils/FileStorageUtils.java index b9b94141e1fc..8c993018f792 100644 --- a/src/com/owncloud/android/utils/FileStorageUtils.java +++ b/src/com/owncloud/android/utils/FileStorageUtils.java @@ -21,8 +21,11 @@ package com.owncloud.android.utils; import java.io.File; +import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Comparator; +import java.util.Date; +import java.util.Locale; import java.util.Vector; import third_parties.daveKoeller.AlphanumComparator; @@ -30,6 +33,7 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.files.RemoteFile; import android.accounts.Account; @@ -47,6 +51,8 @@ * Static methods to help in access to local file system. */ public class FileStorageUtils { + private static final String TAG = FileStorageUtils.class.getSimpleName(); + public static final Integer SORT_NAME = 0; public static final Integer SORT_DATE = 1; public static final Integer SORT_SIZE = 2; @@ -117,12 +123,46 @@ public static final String getLogPath() { return Environment.getExternalStorageDirectory() + File.separator + MainApp.getDataFolder() + File.separator + "log"; } - public static String getInstantUploadFilePath(Context context, String fileName) { + /** + * Returns the a string like 2016/08/ for the passed date. If date is 0 an empty + * string is returned + * + * @param date: date in microseconds since 1st January 1970 + * @return + */ + private static String getSubpathFromDate(long date) { + if (date == 0) { + return ""; + } + try { + SimpleDateFormat formatter = new SimpleDateFormat( + "yyyy" + OCFile.PATH_SEPARATOR + "MM" + OCFile.PATH_SEPARATOR, Locale.ENGLISH); + return formatter.format(new Date(date)); + } + catch(RuntimeException ex) { + Log_OC.w(TAG, "could not extract date from timestamp"); + return ""; + } + } + + /** + * Returns the InstantUploadFilePath on the owncloud instance + * + * @param context + * @param fileName + * @param dateTaken: Time in milliseconds since 1970 when the picture was taken. + * @return + */ + public static String getInstantUploadFilePath(Context context, String fileName, long dateTaken) { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context); String uploadPathdef = context.getString(R.string.instant_upload_path); String uploadPath = pref.getString("instant_upload_path", uploadPathdef); - String value = uploadPath + OCFile.PATH_SEPARATOR + (fileName == null ? "" : fileName); - return value; + String subPath = ""; + if (com.owncloud.android.db.PreferenceManager.instantPictureUploadPathUseSubfolders(context)) { + subPath = getSubpathFromDate(dateTaken); + } + return uploadPath + OCFile.PATH_SEPARATOR + subPath + + (fileName == null ? "" : fileName); } /** @@ -131,12 +171,16 @@ public static String getInstantUploadFilePath(Context context, String fileName) * @param fileName: video file name * @return String: video file path composed */ - public static String getInstantVideoUploadFilePath(Context context, String fileName) { + public static String getInstantVideoUploadFilePath(Context context, String fileName, long dateTaken) { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context); String uploadVideoPathdef = context.getString(R.string.instant_upload_path); String uploadVideoPath = pref.getString("instant_video_upload_path", uploadVideoPathdef); - String value = uploadVideoPath + OCFile.PATH_SEPARATOR + (fileName == null ? "" : fileName); - return value; + String subPath = ""; + if (com.owncloud.android.db.PreferenceManager.instantVideoUploadPathUseSubfolders(context)) { + subPath = getSubpathFromDate(dateTaken); + } + return uploadVideoPath + OCFile.PATH_SEPARATOR + subPath + + (fileName == null ? "" : fileName); } public static String getParentPath(String remotePath) {