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