/*
* 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.activities.preferences;
import android.app.ActionBar;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.provider.SearchRecentSuggestions;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.cyanogenmod.filemanager.FileManagerApplication;
import com.cyanogenmod.filemanager.R;
import com.cyanogenmod.filemanager.activities.ChangeLogActivity;
import com.cyanogenmod.filemanager.console.ConsoleBuilder;
import com.cyanogenmod.filemanager.preferences.AccessMode;
import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier;
import com.cyanogenmod.filemanager.preferences.Preferences;
import com.cyanogenmod.filemanager.providers.RecentSearchesContentProvider;
import com.cyanogenmod.filemanager.ui.ThemeManager;
import com.cyanogenmod.filemanager.ui.ThemeManager.Theme;
import com.cyanogenmod.filemanager.ui.preferences.ThemeSelectorPreference;
import com.cyanogenmod.filemanager.util.DialogHelper;
import java.util.List;
/**
* The {@link SettingsPreferences} preferences
*/
public class SettingsPreferences extends PreferenceActivity {
private static final String TAG = "SettingsPreferences"; //$NON-NLS-1$
private static final boolean DEBUG = false;
private final BroadcastReceiver mNotificationReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
if (intent.getAction().compareTo(FileManagerSettings.INTENT_THEME_CHANGED) == 0) {
finish();
}
}
}
};
/**
* {@inheritDoc}
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
if (DEBUG) {
Log.d(TAG, "SettingsPreferences.onCreate"); //$NON-NLS-1$
}
// Register the broadcast receiver
IntentFilter filter = new IntentFilter();
filter.addAction(FileManagerSettings.INTENT_THEME_CHANGED);
registerReceiver(this.mNotificationReceiver, filter);
//Initialize action bars
initTitleActionBar();
// Apply the theme
applyTheme();
super.onCreate(savedInstanceState);
}
/**
* {@inheritDoc}
*/
@Override
protected void onDestroy() {
if (DEBUG) {
Log.d(TAG, "SettingsPreferences.onDestroy"); //$NON-NLS-1$
}
// Unregister the receiver
try {
unregisterReceiver(this.mNotificationReceiver);
} catch (Throwable ex) {
/**NON BLOCK**/
}
//All destroy. Continue
super.onDestroy();
}
/**
* Method that initializes the titlebar of the activity.
*/
private void initTitleActionBar() {
//Configure the action bar options
getActionBar().setBackgroundDrawable(
getResources().getDrawable(R.drawable.bg_holo_titlebar));
getActionBar().setDisplayOptions(
ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME);
getActionBar().setDisplayHomeAsUpEnabled(true);
View customTitle = getLayoutInflater().inflate(R.layout.simple_customtitle, null, false);
TextView title = (TextView)customTitle.findViewById(R.id.customtitle_title);
title.setText(R.string.pref);
title.setContentDescription(getString(R.string.pref));
getActionBar().setCustomView(customTitle);
}
/**
* {@inheritDoc}
*/
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preferences_headers, target);
// Retrieve the about header
Header aboutHeader = target.get(target.size()-1);
try {
String appver =
this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
aboutHeader.summary = getString(R.string.pref_about_summary, appver);
} catch (Exception e) {
aboutHeader.summary = getString(R.string.pref_about_summary, ""); //$NON-NLS-1$
}
aboutHeader.intent = new Intent(getApplicationContext(), ChangeLogActivity.class);
}
/**
* {@inheritDoc}
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/**
* A class that manages the commons options of the application
*/
public static class GeneralPreferenceFragment extends PreferenceFragment {
private CheckBoxPreference mCaseSensitiveSort;
private ListPreference mFreeDiskSpaceWarningLevel;
private CheckBoxPreference mComputeFolderStatistics;
// private CheckBoxPreference mUseFlinger;
private ListPreference mAccessMode;
private CheckBoxPreference mDebugTraces;
/**
* @hide
*/
boolean mLoaded = false;
private final OnPreferenceChangeListener mOnChangeListener =
new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(final Preference preference, Object newValue) {
boolean ret = true;
String key = preference.getKey();
if (DEBUG) {
Log.d(TAG,
String.format("New value for %s: %s", //$NON-NLS-1$
key,
String.valueOf(newValue)));
}
// Disk usage warning level
if (FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.
getId().compareTo(key) == 0) {
String value = (String)newValue;
preference.setSummary(
getResources().getString(
R.string.pref_disk_usage_warning_level_summary, value));
}
// Access mode
else if (FileManagerSettings.SETTINGS_ACCESS_MODE.getId().compareTo(key) == 0) {
Activity activity = GeneralPreferenceFragment.this.getActivity();
String value = (String)newValue;
AccessMode oldMode = FileManagerApplication.getAccessMode();
AccessMode newMode = AccessMode.fromId(value);
if (oldMode.compareTo(newMode) != 0) {
// The mode was changes. Change the console
if (newMode.compareTo(AccessMode.ROOT) == 0) {
if (!ConsoleBuilder.changeToPrivilegedConsole(
activity.getApplicationContext())) {
value = String.valueOf(oldMode.ordinal());
ret = false;
}
} else {
if (!ConsoleBuilder.changeToNonPrivilegedConsole(
activity.getApplicationContext())) {
value = String.valueOf(oldMode.ordinal());
ret = false;
}
}
}
int valueId = Integer.valueOf(value).intValue();
String[] summary = getResources().getStringArray(
R.array.access_mode_summaries);
preference.setSummary(summary[valueId]);
}
// Notify the change (only if fragment is loaded. Default values are loaded
// while not in loaded mode)
if (GeneralPreferenceFragment.this.mLoaded && ret) {
Intent intent = new Intent(FileManagerSettings.INTENT_SETTING_CHANGED);
intent.putExtra(
FileManagerSettings.EXTRA_SETTING_CHANGED_KEY, preference.getKey());
getActivity().sendBroadcast(intent);
}
return ret;
}
};
/**
* {@inheritDoc}
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Change the preference manager
getPreferenceManager().setSharedPreferencesName(Preferences.SETTINGS_FILENAME);
getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
// Add the preferences
addPreferencesFromResource(R.xml.preferences_general);
// Case sensitive sort
this.mCaseSensitiveSort =
(CheckBoxPreference)findPreference(
FileManagerSettings.SETTINGS_CASE_SENSITIVE_SORT.getId());
this.mCaseSensitiveSort.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.
SETTINGS_DISK_USAGE_WARNING_LEVEL.getDefaultValue());
String value = Preferences.getSharedPreferences().getString(
FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId(),
defaultValue);
this.mOnChangeListener.onPreferenceChange(this.mFreeDiskSpaceWarningLevel, value);
// Compute folder statistics
this.mComputeFolderStatistics =
(CheckBoxPreference)findPreference(
FileManagerSettings.SETTINGS_COMPUTE_FOLDER_STATISTICS.getId());
this.mComputeFolderStatistics.setOnPreferenceChangeListener(this.mOnChangeListener);
// Use flinger
// this.mUseFlinger =
// (CheckBoxPreference)findPreference(
// FileManagerSettings.SETTINGS_USE_FLINGER.getId());
// this.mUseFlinger.setOnPreferenceChangeListener(this.mOnChangeListener);
// Access mode
this.mAccessMode =
(ListPreference)findPreference(
FileManagerSettings.SETTINGS_ACCESS_MODE.getId());
this.mAccessMode.setOnPreferenceChangeListener(this.mOnChangeListener);
defaultValue = ((ObjectStringIdentifier)FileManagerSettings.
SETTINGS_ACCESS_MODE.getDefaultValue()).getId();
value = Preferences.getSharedPreferences().getString(
FileManagerSettings.SETTINGS_ACCESS_MODE.getId(),
defaultValue);
this.mOnChangeListener.onPreferenceChange(this.mAccessMode, value);
// If device is not rooted, this setting cannot be changed
this.mAccessMode.setEnabled(FileManagerApplication.isDeviceRooted());
// Capture Debug traces
this.mDebugTraces =
(CheckBoxPreference)findPreference(
FileManagerSettings.SETTINGS_SHOW_TRACES.getId());
this.mDebugTraces.setOnPreferenceChangeListener(this.mOnChangeListener);
// Loaded
this.mLoaded = true;
}
}
/**
* A class that manages the search options
*/
public static class SearchPreferenceFragment extends PreferenceFragment {
// Internal keys
private static final String REMOVE_SEARCH_TERMS_KEY =
"cm_filemanager_remove_saved_search_terms"; //$NON-NLS-1$
private CheckBoxPreference mHighlightTerms;
private CheckBoxPreference mShowRelevanceWidget;
private ListPreference mSortSearchResultMode;
private CheckBoxPreference mSaveSearchTerms;
private Preference mRemoveSearchTerms;
/**
* @hide
*/
boolean mLoaded = false;
private final OnPreferenceChangeListener mOnChangeListener =
new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
if (DEBUG) {
Log.d(TAG,
String.format("New value for %s: %s", //$NON-NLS-1$
key,
String.valueOf(newValue)));
}
// Saved search terms
if (preference.getKey().compareTo(
FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.getId()) == 0) {
if (!((Boolean)newValue).booleanValue()) {
// Remove search terms if saved search terms
// is not active by the user
clearRecentSearchTerms();
}
// Sort search result mode
} else if (FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.
getId().compareTo(key) == 0) {
int value = Integer.valueOf((String)newValue).intValue();
String[] summary = getResources().getStringArray(
R.array.sort_search_results_mode_labels);
preference.setSummary(summary[value]);
}
// Notify the change (only if fragment is loaded. Default values are loaded
// while not in loaded mode)
if (SearchPreferenceFragment.this.mLoaded) {
Intent intent = new Intent(FileManagerSettings.INTENT_SETTING_CHANGED);
intent.putExtra(
FileManagerSettings.EXTRA_SETTING_CHANGED_KEY, preference.getKey());
getActivity().sendBroadcast(intent);
}
return true;
}
};
private final OnPreferenceClickListener mOnClickListener =
new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
if (preference.getKey().compareTo(REMOVE_SEARCH_TERMS_KEY) == 0) {
// Remove search terms
clearRecentSearchTerms();
// Advise the user
DialogHelper.showToast(
getActivity(),
getActivity().getString(R.string.pref_remove_saved_search_terms_msg),
Toast.LENGTH_SHORT);
}
return false;
}
};
/**
* {@inheritDoc}
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Change the preference manager
getPreferenceManager().setSharedPreferencesName(Preferences.SETTINGS_FILENAME);
getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
this.mLoaded = false;
// Add the preferences
addPreferencesFromResource(R.xml.preferences_search);
// Highlight terms
this.mHighlightTerms =
(CheckBoxPreference)findPreference(
FileManagerSettings.SETTINGS_HIGHLIGHT_TERMS.getId());
this.mHighlightTerms.setOnPreferenceChangeListener(this.mOnChangeListener);
// Relevance widget
this.mShowRelevanceWidget =
(CheckBoxPreference)findPreference(
FileManagerSettings.SETTINGS_SHOW_RELEVANCE_WIDGET.getId());
this.mShowRelevanceWidget.setOnPreferenceChangeListener(this.mOnChangeListener);
// Sort search result mode
this.mSortSearchResultMode =
(ListPreference)findPreference(
FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId());
this.mSortSearchResultMode.setOnPreferenceChangeListener(this.mOnChangeListener);
String defaultValue = ((ObjectStringIdentifier)FileManagerSettings.
SETTINGS_SORT_SEARCH_RESULTS_MODE.getDefaultValue()).getId();
String value = Preferences.getSharedPreferences().getString(
FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId(),
defaultValue);
this.mOnChangeListener.onPreferenceChange(this.mSortSearchResultMode, value);
// Saved search terms
this.mSaveSearchTerms =
(CheckBoxPreference)findPreference(
FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.getId());
this.mSaveSearchTerms.setOnPreferenceChangeListener(this.mOnChangeListener);
// Remove search terms
this.mRemoveSearchTerms = findPreference(REMOVE_SEARCH_TERMS_KEY);
this.mRemoveSearchTerms.setOnPreferenceClickListener(this.mOnClickListener);
// Loaded
this.mLoaded = true;
}
/**
* Method that removes the recent suggestions on search activity
* @hide
*/
void clearRecentSearchTerms() {
SearchRecentSuggestions suggestions =
new SearchRecentSuggestions(getActivity(),
RecentSearchesContentProvider.AUTHORITY,
RecentSearchesContentProvider.MODE);
suggestions.clearHistory();
Preferences.setLastSearch(null);
}
}
/**
* A class that manages the theme selection
*/
public static class ThemesPreferenceFragment extends PreferenceFragment {
private ThemeSelectorPreference mThemeSelector;
private final OnPreferenceChangeListener mOnChangeListener =
new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
if (DEBUG) {
Log.d(TAG,
String.format("New value for %s: %s", //$NON-NLS-1$
key,
String.valueOf(newValue)));
}
// Notify to all activities that the theme has changed
Intent intent = new Intent(FileManagerSettings.INTENT_THEME_CHANGED);
intent.putExtra(FileManagerSettings.EXTRA_THEME_ID, (String)newValue);
getActivity().sendBroadcast(intent);
//Wait for allow activities to apply the theme, prior to finish settings
try {
Thread.sleep(250L);
} catch (Throwable e) {/**NON BLOCK**/}
getActivity().finish();
return true;
}
};
/**
* {@inheritDoc}
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Change the preference manager
getPreferenceManager().setSharedPreferencesName(Preferences.SETTINGS_FILENAME);
getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
// Add the preferences
addPreferencesFromResource(R.xml.preferences_themes);
// Theme selector
this.mThemeSelector =
(ThemeSelectorPreference)findPreference(
FileManagerSettings.SETTINGS_THEME.getId());
this.mThemeSelector.setOnPreferenceChangeListener(this.mOnChangeListener);
}
}
/**
* Method that applies the current theme to the activity
* @hide
*/
void applyTheme() {
Theme theme = ThemeManager.getCurrentTheme(this);
theme.setBaseTheme(this, false);
//- ActionBar
theme.setTitlebarDrawable(this, getActionBar(), "titlebar_drawable"); //$NON-NLS-1$
View v = getActionBar().getCustomView().findViewById(R.id.customtitle_title);
theme.setTextColor(this, (TextView)v, "text_color"); //$NON-NLS-1$
// -View
theme.setBackgroundDrawable(
this,
this.getWindow().getDecorView(),
"background_drawable"); //$NON-NLS-1$
}
}