diff options
author | Jorge Ruesga <jorge@ruesga.com> | 2013-04-19 22:03:27 +0200 |
---|---|---|
committer | Jorge Ruesga <jorge@ruesga.com> | 2013-04-19 23:08:46 +0200 |
commit | 31112c74dfbc913c549d75b3a5eb5f854423950b (patch) | |
tree | 123cea58206a9139e1048850b685413a96bbc80d | |
parent | 661616e72f02ba3caa21cea3c347b6e9750811b3 (diff) | |
download | android_packages_apps_CMFileManager-31112c74dfbc913c549d75b3a5eb5f854423950b.tar.gz android_packages_apps_CMFileManager-31112c74dfbc913c549d75b3a5eb5f854423950b.tar.bz2 android_packages_apps_CMFileManager-31112c74dfbc913c549d75b3a5eb5f854423950b.zip |
CMFM: User-defined date/time format
Allow the user to select the date/time format to use.
JIRA: CYAN-863
Issue: https://jira.cyanogenmod.org/browse/CYAN-863
Change-Id: I13730e8c82e5de96645c9c70f244535eb449e261
Signed-off-by: Jorge Ruesga <jorge@ruesga.com>
10 files changed, 259 insertions, 25 deletions
diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 585b176b..3dd4823c 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -31,6 +31,22 @@ <item>@string/layout_details</item> </string-array> + <!-- General. Filetime format mode --> + <string-array name="filetime_format_mode_labels" translatable="false"> + <item>@string/filetime_format_mode_system</item> + <item>@string/filetime_format_mode_locale</item> + <item>@string/filetime_format_mode_ddMMyyyy_HHmmss</item> + <item>@string/filetime_format_mode_MMddyyyy_HHmmss</item> + <item>@string/filetime_format_mode_yyyyMMdd_HHmmss</item> + </string-array> + <string-array name="filetime_format_mode_values" translatable="false"> + <item>0</item> + <item>1</item> + <item>2</item> + <item>3</item> + <item>4</item> + </string-array> + <!-- General. Disk usage warning level --> <string-array name="disk_usage_warning_level_labels" translatable="false"> <item>75%</item> diff --git a/res/values/strings.xml b/res/values/strings.xml index c8566788..5785312e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -28,6 +28,9 @@ <string name="size_megabytes" translatable="false">MB</string> <string name="size_gigabytes" translatable="false">GB</string> + <!-- Date/time format order (%1$s: date; %2$s: time) --> + <string name="datetime_format_order">%1$s %2$s</string> + <!-- Devices types --> <string name="device_blockdevice">Block device</string> <string name="device_characterdevice">Character device</string> @@ -602,6 +605,13 @@ <!-- Mime/Types * Unknown --> <string name="mime_unknown">Unknown</string> + <!-- Filetime formats --> + <string name="filetime_format_mode_system">System-defined</string> + <string name="filetime_format_mode_locale">Locale-defined</string> + <string name="filetime_format_mode_ddMMyyyy_HHmmss">dd/mm/yyyy hh:mm:ss</string> + <string name="filetime_format_mode_MMddyyyy_HHmmss">mm/dd/yyyy hh:mm:ss</string> + <string name="filetime_format_mode_yyyyMMdd_HHmmss">yyyy-mm-dd hh:mm:ss</string> + <!-- Selection. All possibilities. [1 folder; >1 folders; 1 file; >1 files; >1 folders and 1 file; 1 folder and >1 files; >1 folders and >1 files] Avoid using plural item because is more complex to achieved all strings --> @@ -673,6 +683,8 @@ <string name="pref_case_sensitive_sort">Case-sensitive</string> <!-- Preferences * General * Case sensitive sort and navigating summary --> <string name="pref_case_sensitive_sort_summary">Consider case when navigating or sorting search results</string> + <!-- Preferences * General * Filetime format mode title --> + <string name="pref_filetime_format_mode">Date/time format</string> <!-- Preferences * General *Disk usage warning level title --> <string name="pref_disk_usage_warning_level">Disk usage warning</string> <!-- Preferences * General * Disk usage warning level summary --> diff --git a/res/xml/preferences_general.xml b/res/xml/preferences_general.xml index 121b231c..6c2c884c 100644 --- a/res/xml/preferences_general.xml +++ b/res/xml/preferences_general.xml @@ -30,6 +30,15 @@ android:persistent="true" android:defaultValue="false" /> + <!-- Filetime format --> + <ListPreference + android:key="cm_filemanager_filetime_format_mode" + android:title="@string/pref_filetime_format_mode" + android:entries="@array/filetime_format_mode_labels" + android:entryValues="@array/filetime_format_mode_values" + android:defaultValue="1" + android:persistent="true" /> + <!-- Disk usage warning level --> <ListPreference android:key="cm_filemanager_disk_usage_warning_level" diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 2f491df7..77effe18 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -235,6 +235,16 @@ public class NavigationActivity extends Activity } } } + + // Filetime format mode + if (key.compareTo(FileManagerSettings. + SETTINGS_FILETIME_FORMAT_MODE.getId()) == 0) { + // Refresh the data + synchronized (FileHelper.DATETIME_SYNC) { + FileHelper.sReloadDateTimeFormats = true; + NavigationActivity.this.getCurrentNavigationView().refresh(); + } + } } } else if (intent.getAction().compareTo( @@ -250,9 +260,19 @@ public class NavigationActivity extends Activity } catch (Exception e) { ExceptionUtil.translateException(context, e, true, false); } + } else if (intent.getAction().compareTo( FileManagerSettings.INTENT_THEME_CHANGED) == 0) { applyTheme(); + + } else if (intent.getAction().compareTo(Intent.ACTION_TIME_CHANGED) == 0 || + intent.getAction().compareTo(Intent.ACTION_DATE_CHANGED) == 0 || + intent.getAction().compareTo(Intent.ACTION_TIMEZONE_CHANGED) == 0) { + // Refresh the data + synchronized (FileHelper.DATETIME_SYNC) { + FileHelper.sReloadDateTimeFormats = true; + NavigationActivity.this.getCurrentNavigationView().refresh(); + } } } } @@ -301,6 +321,9 @@ public class NavigationActivity extends Activity filter.addAction(FileManagerSettings.INTENT_SETTING_CHANGED); filter.addAction(FileManagerSettings.INTENT_FILE_CHANGED); filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED); + filter.addAction(Intent.ACTION_DATE_CHANGED); + filter.addAction(Intent.ACTION_TIME_CHANGED); + filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); registerReceiver(this.mNotificationReceiver, filter); //Set the main layout of the activity diff --git a/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java b/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java index 1e98105b..8d1385d9 100644 --- a/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java +++ b/src/com/cyanogenmod/filemanager/activities/preferences/GeneralPreferenceFragment.java @@ -44,6 +44,7 @@ public class GeneralPreferenceFragment extends TitlePreferenceFragment { private static final boolean DEBUG = false; private CheckBoxPreference mCaseSensitiveSort; + private ListPreference mFiletimeFormatMode; private ListPreference mFreeDiskSpaceWarningLevel; private CheckBoxPreference mComputeFolderStatistics; // private CheckBoxPreference mUseFlinger; @@ -69,8 +70,18 @@ public class GeneralPreferenceFragment extends TitlePreferenceFragment { String.valueOf(newValue))); } + // Filetime format mode + if (FileManagerSettings.SETTINGS_FILETIME_FORMAT_MODE. + getId().compareTo(key) == 0) { + String value = (String)newValue; + int valueId = Integer.valueOf(value).intValue(); + String[] labels = getResources().getStringArray( + R.array.filetime_format_mode_labels); + preference.setSummary(labels[valueId]); + } + // Disk usage warning level - if (FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL. + else if (FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL. getId().compareTo(key) == 0) { String value = (String)newValue; preference.setSummary( @@ -141,17 +152,29 @@ public class GeneralPreferenceFragment extends TitlePreferenceFragment { FileManagerSettings.SETTINGS_CASE_SENSITIVE_SORT.getId()); this.mCaseSensitiveSort.setOnPreferenceChangeListener(this.mOnChangeListener); - //Disk usage warning level + // Filetime format mode + this.mFiletimeFormatMode = + (ListPreference)findPreference( + FileManagerSettings.SETTINGS_FILETIME_FORMAT_MODE.getId()); + String defaultValue = ((ObjectStringIdentifier)FileManagerSettings. + SETTINGS_FILETIME_FORMAT_MODE.getDefaultValue()).getId(); + String value = Preferences.getSharedPreferences().getString( + FileManagerSettings.SETTINGS_FILETIME_FORMAT_MODE.getId(), + defaultValue); + this.mOnChangeListener.onPreferenceChange(this.mFiletimeFormatMode, value); + this.mFiletimeFormatMode.setOnPreferenceChangeListener(this.mOnChangeListener); + + // Disk usage warning level this.mFreeDiskSpaceWarningLevel = (ListPreference)findPreference( FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId()); - this.mFreeDiskSpaceWarningLevel.setOnPreferenceChangeListener(this.mOnChangeListener); - String defaultValue = ((String)FileManagerSettings. + defaultValue = ((String)FileManagerSettings. SETTINGS_DISK_USAGE_WARNING_LEVEL.getDefaultValue()); - String value = Preferences.getSharedPreferences().getString( + value = Preferences.getSharedPreferences().getString( FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId(), defaultValue); this.mOnChangeListener.onPreferenceChange(this.mFreeDiskSpaceWarningLevel, value); + this.mFreeDiskSpaceWarningLevel.setOnPreferenceChangeListener(this.mOnChangeListener); // Compute folder statistics this.mComputeFolderStatistics = diff --git a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java index 1ba1137e..e522f249 100644 --- a/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java +++ b/src/com/cyanogenmod/filemanager/adapters/FileSystemObjectAdapter.java @@ -37,7 +37,6 @@ import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; -import java.text.DateFormat; import java.util.ArrayList; import java.util.List; @@ -201,7 +200,6 @@ public class FileSystemObjectAdapter private void processData(List<FileSystemObject> files) { Theme theme = ThemeManager.getCurrentTheme(getContext()); Resources res = getContext().getResources(); - DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); this.mData = new DataHolder[getCount()]; int cc = (files == null) ? getCount() : files.size(); for (int i = 0; i < cc; i++) { @@ -213,7 +211,9 @@ public class FileSystemObjectAdapter if (fso instanceof ParentDirectory) { sbSummary.append(res.getString(R.string.parent_dir)); } else { - sbSummary.append(df.format(fso.getLastModifiedTime())); + sbSummary.append( + FileHelper.formatFileTime( + getContext(), fso.getLastModifiedTime())); sbSummary.append(" "); //$NON-NLS-1$ sbSummary.append(fso.toRawPermissionString()); } diff --git a/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java b/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java index 6f66190d..39c8c721 100644 --- a/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java +++ b/src/com/cyanogenmod/filemanager/preferences/FileManagerSettings.java @@ -79,6 +79,12 @@ public enum FileManagerSettings { */ SETTINGS_CASE_SENSITIVE_SORT("cm_filemanager_case_sensitive_sort", Boolean.FALSE), //$NON-NLS-1$ /** + * Defines the filetime format mode to use + * @hide + */ + SETTINGS_FILETIME_FORMAT_MODE( + "cm_filemanager_filetime_format_mode", FileTimeFormatMode.LOCALE), //$NON-NLS-1$ + /** * When display a warning in free disk widget * @hide */ diff --git a/src/com/cyanogenmod/filemanager/preferences/FileTimeFormatMode.java b/src/com/cyanogenmod/filemanager/preferences/FileTimeFormatMode.java new file mode 100644 index 00000000..a4803d17 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/preferences/FileTimeFormatMode.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.preferences; + +/** + * An enumeration of the search result sort modes. + */ +public enum FileTimeFormatMode implements ObjectStringIdentifier { + + /** + * System-defined. + */ + SYSTEM("0", null), //$NON-NLS-1$ + /** + * Locale dependent + */ + LOCALE("1", null), //$NON-NLS-1$ + /** + * dd/MM/yyyy HH:mm:ss + */ + DDMMYYYY_HHMMSS("2", "dd/MM/yyyy HH:mm:ss"), //$NON-NLS-1$ //$NON-NLS-2$ + /** + * MM/dd/yyyy HH:mm:ss + */ + MMDDYYYY_HHMMSS("3", "MM/dd/yyyy HH:mm:ss"), //$NON-NLS-1$ //$NON-NLS-2$ + /** + * yyyy-MM-dd HH:mm:ss + */ + YYYYMMDD_HHMMSS("4", "yyyy-MM-dd HH:mm:ss"); //$NON-NLS-1$ //$NON-NLS-2$ + + private String mId; + private String mFormat; + + /** + * Constructor of <code>FileTimeFormatMode</code>. + * + * @param id The unique identifier of the enumeration + * @param format The format (if apply) + */ + private FileTimeFormatMode(String id, String format) { + this.mId = id; + this.mFormat = format; + } + + /** + * {@inheritDoc} + */ + @Override + public String getId() { + return this.mId; + } + + /** + * Method that returns the format of the filetime. + * + * @return String The format of the filetime. + */ + public String getFormat() { + return this.mFormat; + } + + /** + * Method that returns an instance of {@link FileTimeFormatMode} from its + * unique identifier. + * + * @param id The unique identifier + * @return FileTimeFormatMode The filetime format mode + */ + public static FileTimeFormatMode fromId(String id) { + FileTimeFormatMode[] values = values(); + int cc = values.length; + for (int i = 0; i < cc; i++) { + if (values[i].mId.compareTo(id) == 0) { + return values[i]; + } + } + return null; + } + +} diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java index c9b8df0d..8408e5fe 100644 --- a/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java +++ b/src/com/cyanogenmod/filemanager/ui/dialogs/FsoPropertiesDialog.java @@ -71,7 +71,7 @@ import com.cyanogenmod.filemanager.util.StorageHelper; import java.io.File; import java.io.IOException; -import java.text.DateFormat; + /** * A class that wraps a dialog for showing information about a {@link FileSystemObject} */ @@ -310,22 +310,12 @@ public class FsoPropertiesDialog } this.mTvSize.setText(size); this.mTvContains.setText("-"); //$NON-NLS-1$ - DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); - try { - tvLastAccessedTime.setText(df.format(this.mFso.getLastAccessedTime())); - } catch (Exception e) { - tvLastAccessedTime.setText("-"); //$NON-NLS-1$ - } - try { - tvLastModifiedTime.setText(df.format(this.mFso.getLastModifiedTime())); - } catch (Exception e) { - tvLastModifiedTime.setText("-"); //$NON-NLS-1$ - } - try { - tvLastChangedTime.setText(df.format(this.mFso.getLastChangedTime())); - } catch (Exception e) { - tvLastChangedTime.setText("-"); //$NON-NLS-1$ - } + tvLastAccessedTime.setText( + FileHelper.formatFileTime(this.mContext, this.mFso.getLastAccessedTime())); + tvLastModifiedTime.setText( + FileHelper.formatFileTime(this.mContext, this.mFso.getLastModifiedTime())); + tvLastChangedTime.setText( + FileHelper.formatFileTime(this.mContext, this.mFso.getLastChangedTime())); //- Permissions String loadingMsg = this.mContext.getString(R.string.loading_message); diff --git a/src/com/cyanogenmod/filemanager/util/FileHelper.java b/src/com/cyanogenmod/filemanager/util/FileHelper.java index 45c8acb5..8687e091 100644 --- a/src/com/cyanogenmod/filemanager/util/FileHelper.java +++ b/src/com/cyanogenmod/filemanager/util/FileHelper.java @@ -45,8 +45,10 @@ import com.cyanogenmod.filemanager.model.SystemFile; import com.cyanogenmod.filemanager.model.User; import com.cyanogenmod.filemanager.preferences.DisplayRestrictions; import com.cyanogenmod.filemanager.preferences.FileManagerSettings; +import com.cyanogenmod.filemanager.preferences.FileTimeFormatMode; import com.cyanogenmod.filemanager.preferences.NavigationSortMode; import com.cyanogenmod.filemanager.preferences.ObjectIdentifier; +import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier; import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; @@ -56,6 +58,8 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -108,6 +112,20 @@ public final class FileHelper { */ public static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$ + // The date/time formats objects + /** + * @hide + */ + public final static Object DATETIME_SYNC = new Object(); + /** + * @hide + */ + public static boolean sReloadDateTimeFormats = true; + private static String sDateTimeFormatOrder = null; + private static FileTimeFormatMode sFiletimeFormatMode = null; + private static DateFormat sDateFormat = null; + private static DateFormat sTimeFormat = null; + /** * Constructor of <code>FileHelper</code>. */ @@ -1261,4 +1279,47 @@ public final class FileHelper { } throw new InsufficientPermissionsException(executable); } + + /** + * Method that formats a filetime date with the specific system settings + * + * @param ctx The current context + * @param filetime The filetime date + * @return String The filetime date formatted + */ + public static String formatFileTime(Context ctx, Date filetime) { + synchronized (DATETIME_SYNC) { + if (sReloadDateTimeFormats) { + String defaultValue = + ((ObjectStringIdentifier)FileManagerSettings. + SETTINGS_FILETIME_FORMAT_MODE.getDefaultValue()).getId(); + String id = FileManagerSettings.SETTINGS_FILETIME_FORMAT_MODE.getId(); + sFiletimeFormatMode = + FileTimeFormatMode.fromId( + Preferences.getSharedPreferences().getString(id, defaultValue)); + if (sFiletimeFormatMode.compareTo(FileTimeFormatMode.SYSTEM) == 0) { + sDateTimeFormatOrder = ctx.getString(R.string.datetime_format_order); + sDateFormat = android.text.format.DateFormat.getDateFormat(ctx); + sTimeFormat = android.text.format.DateFormat.getTimeFormat(ctx); + } else if (sFiletimeFormatMode.compareTo(FileTimeFormatMode.LOCALE) == 0) { + sDateFormat = + DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); + } else { + sDateFormat = new SimpleDateFormat(sFiletimeFormatMode.getFormat()); + } + sReloadDateTimeFormats = false; + } + } + + // Apply the user settings + String formatted = "-"; //$NON-NLS-1$ + if (sFiletimeFormatMode.compareTo(FileTimeFormatMode.SYSTEM) == 0) { + String date = sDateFormat.format(filetime); + String time = sTimeFormat.format(filetime); + formatted = String.format(sDateTimeFormatOrder, date, time); + } else { + formatted = sDateFormat.format(filetime); + } + return formatted; + } } |