OSDN Git Service

Remove console selection (Issue #17) - Part II (Settings & Code)
[android-x86/packages-apps-CMFileManager.git] / src / com / cyanogenmod / filemanager / activities / preferences / SettingsPreferences.java
1 /*
2  * Copyright (C) 2012 The CyanogenMod Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.cyanogenmod.filemanager.activities.preferences;
18
19 import android.app.ActionBar;
20 import android.app.Activity;
21 import android.content.Intent;
22 import android.os.Bundle;
23 import android.preference.CheckBoxPreference;
24 import android.preference.ListPreference;
25 import android.preference.Preference;
26 import android.preference.Preference.OnPreferenceChangeListener;
27 import android.preference.Preference.OnPreferenceClickListener;
28 import android.preference.PreferenceActivity;
29 import android.preference.PreferenceFragment;
30 import android.provider.SearchRecentSuggestions;
31 import android.util.Log;
32 import android.view.MenuItem;
33 import android.view.View;
34 import android.widget.TextView;
35 import android.widget.Toast;
36
37 import com.cyanogenmod.filemanager.FileManagerApplication;
38 import com.cyanogenmod.filemanager.R;
39 import com.cyanogenmod.filemanager.console.ConsoleBuilder;
40 import com.cyanogenmod.filemanager.preferences.AccessMode;
41 import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
42 import com.cyanogenmod.filemanager.preferences.ObjectStringIdentifier;
43 import com.cyanogenmod.filemanager.preferences.Preferences;
44 import com.cyanogenmod.filemanager.providers.RecentSearchesContentProvider;
45 import com.cyanogenmod.filemanager.util.DialogHelper;
46
47 import java.util.List;
48
49 /**
50  * The {@link SettingsPreferences} preferences
51  */
52 public class SettingsPreferences extends PreferenceActivity {
53
54     private static final boolean DEBUG = false;
55
56     private static final String LOG_TAG = "SettingsPreferences"; //$NON-NLS-1$
57
58     /**
59      * {@inheritDoc}
60      */
61     @Override
62     protected void onCreate(Bundle savedInstanceState) {
63         super.onCreate(savedInstanceState);
64
65         //Initialize action bars
66         initTitleActionBar();
67     }
68
69     /**
70      * Method that initializes the titlebar of the activity.
71      */
72     private void initTitleActionBar() {
73         //Configure the action bar options
74         getActionBar().setBackgroundDrawable(
75                 getResources().getDrawable(R.drawable.bg_holo_titlebar));
76         getActionBar().setDisplayOptions(
77                 ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME);
78         getActionBar().setDisplayHomeAsUpEnabled(true);
79         View customTitle = getLayoutInflater().inflate(R.layout.simple_customtitle, null, false);
80         TextView title = (TextView)customTitle.findViewById(R.id.customtitle_title);
81         title.setText(R.string.pref);
82         title.setContentDescription(getString(R.string.pref));
83         getActionBar().setCustomView(customTitle);
84     }
85
86     /**
87      * {@inheritDoc}
88      */
89     @Override
90     public void onBuildHeaders(List<Header> target) {
91         loadHeadersFromResource(R.xml.preferences_headers, target);
92
93         // Retrieve the about header
94         Header aboutHeader = target.get(target.size()-1);
95         try {
96             String appver =
97                     this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
98             aboutHeader.summary = getString(R.string.pref_about_summary, appver);
99         } catch (Exception e) {
100             aboutHeader.summary = getString(R.string.pref_about_summary, ""); //$NON-NLS-1$
101         }
102     }
103
104     /**
105      * {@inheritDoc}
106      */
107     @Override
108     public boolean onOptionsItemSelected(MenuItem item) {
109        switch (item.getItemId()) {
110           case android.R.id.home:
111               finish();
112               return true;
113           default:
114              return super.onOptionsItemSelected(item);
115        }
116     }
117
118     /**
119      * A class that manages the commons options of the application
120      */
121     public static class GeneralPreferenceFragment extends PreferenceFragment {
122
123         private CheckBoxPreference mCaseSensitiveSort;
124         private ListPreference mFreeDiskSpaceWarningLevel;
125         private CheckBoxPreference mComputeFolderStatistics;
126         private ListPreference mAccessMode;
127         private CheckBoxPreference mDebugTraces;
128
129         /**
130          * @hide
131          */
132         boolean mLoaded = false;
133
134         private final OnPreferenceChangeListener mOnChangeListener =
135                 new OnPreferenceChangeListener() {
136             @Override
137             public boolean onPreferenceChange(final Preference preference, Object newValue) {
138                 boolean ret = true;
139
140                 String key = preference.getKey();
141                 if (DEBUG) {
142                     Log.d(LOG_TAG,
143                         String.format("New value for %s: %s",  //$NON-NLS-1$
144                                 key,
145                                 String.valueOf(newValue)));
146                 }
147
148                 // Disk usage warning level
149                 if (FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.
150                         getId().compareTo(key) == 0) {
151                     String value = (String)newValue;
152                     preference.setSummary(
153                             getResources().getString(
154                                     R.string.pref_disk_usage_warning_level_summary, value));
155                 }
156
157                 // Access mode
158                 else if (FileManagerSettings.SETTINGS_ACCESS_MODE.getId().compareTo(key) == 0) {
159                     Activity activity = GeneralPreferenceFragment.this.getActivity();
160
161                     String value = (String)newValue;
162                     AccessMode oldMode = FileManagerApplication.getAccessMode();
163                     AccessMode newMode = AccessMode.fromId(value);
164                     if (oldMode.compareTo(newMode) != 0) {
165                         // The mode was changes. Change the console
166                         if (newMode.compareTo(AccessMode.ROOT) == 0) {
167                             if (!ConsoleBuilder.changeToPrivilegedConsole(
168                                     activity.getApplicationContext())) {
169                                 value = String.valueOf(oldMode.ordinal());
170                                 ret = false;
171                             }
172                         } else {
173                             if (!ConsoleBuilder.changeToNonPrivilegedConsole(
174                                     activity.getApplicationContext())) {
175                                 value = String.valueOf(oldMode.ordinal());
176                                 ret = false;
177                             }
178                         }
179                     }
180
181                     int valueId = Integer.valueOf(value).intValue();
182                     String[] summary = getResources().getStringArray(
183                             R.array.access_mode_summaries);
184                                         preference.setSummary(summary[valueId]);
185                 }
186
187                 // Notify the change (only if fragment is loaded. Default values are loaded
188                 // while not in loaded mode)
189                 if (GeneralPreferenceFragment.this.mLoaded && ret) {
190                     Intent intent = new Intent(FileManagerSettings.INTENT_SETTING_CHANGED);
191                     intent.putExtra(
192                             FileManagerSettings.EXTRA_SETTING_CHANGED_KEY, preference.getKey());
193                     getActivity().sendBroadcast(intent);
194                 }
195
196                 return ret;
197             }
198         };
199
200         /**
201          * {@inheritDoc}
202          */
203         @Override
204         public void onCreate(Bundle savedInstanceState) {
205             super.onCreate(savedInstanceState);
206
207             // Change the preference manager
208             getPreferenceManager().setSharedPreferencesName(Preferences.SETTINGS_FILENAME);
209             getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
210
211             // Add the preferences
212             addPreferencesFromResource(R.xml.preferences_general);
213
214             // Case sensitive sort
215             this.mCaseSensitiveSort =
216                     (CheckBoxPreference)findPreference(
217                             FileManagerSettings.SETTINGS_CASE_SENSITIVE_SORT.getId());
218             this.mCaseSensitiveSort.setOnPreferenceChangeListener(this.mOnChangeListener);
219
220             //Disk usage warning level
221             this.mFreeDiskSpaceWarningLevel =
222                     (ListPreference)findPreference(
223                             FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId());
224             this.mFreeDiskSpaceWarningLevel.setOnPreferenceChangeListener(this.mOnChangeListener);
225             String defaultValue = ((String)FileManagerSettings.
226                                 SETTINGS_DISK_USAGE_WARNING_LEVEL.getDefaultValue());
227             String value = Preferences.getSharedPreferences().getString(
228                                 FileManagerSettings.SETTINGS_DISK_USAGE_WARNING_LEVEL.getId(),
229                                 defaultValue);
230             this.mOnChangeListener.onPreferenceChange(this.mFreeDiskSpaceWarningLevel, value);
231
232             // Compute folder statistics
233             this.mComputeFolderStatistics =
234                     (CheckBoxPreference)findPreference(
235                             FileManagerSettings.SETTINGS_COMPUTE_FOLDER_STATISTICS.getId());
236             this.mComputeFolderStatistics.setOnPreferenceChangeListener(this.mOnChangeListener);
237
238             // Access mode
239             this.mAccessMode =
240                     (ListPreference)findPreference(
241                             FileManagerSettings.SETTINGS_ACCESS_MODE.getId());
242             this.mAccessMode.setOnPreferenceChangeListener(this.mOnChangeListener);
243             defaultValue = ((ObjectStringIdentifier)FileManagerSettings.
244                                 SETTINGS_ACCESS_MODE.getDefaultValue()).getId();
245             value = Preferences.getSharedPreferences().getString(
246                                 FileManagerSettings.SETTINGS_ACCESS_MODE.getId(),
247                                 defaultValue);
248             this.mOnChangeListener.onPreferenceChange(this.mAccessMode, value);
249
250             // Capture Debug traces
251             this.mDebugTraces =
252                     (CheckBoxPreference)findPreference(
253                             FileManagerSettings.SETTINGS_SHOW_TRACES.getId());
254             this.mDebugTraces.setOnPreferenceChangeListener(this.mOnChangeListener);
255
256             // Loaded
257             this.mLoaded = true;
258         }
259     }
260
261     /**
262      * A class that manages the search options
263      */
264     public static class SearchPreferenceFragment extends PreferenceFragment {
265
266         // Internal keys
267         private static final String REMOVE_SEARCH_TERMS_KEY =
268                                             "cm_filemanager_remove_saved_search_terms"; //$NON-NLS-1$
269
270         private CheckBoxPreference mHighlightTerms;
271         private CheckBoxPreference mShowRelevanceWidget;
272         private ListPreference mSortSearchResultMode;
273         private CheckBoxPreference mSaveSearchTerms;
274         private Preference mRemoveSearchTerms;
275
276         /**
277          * @hide
278          */
279         boolean mLoaded = false;
280
281         private final OnPreferenceChangeListener mOnChangeListener =
282                 new OnPreferenceChangeListener() {
283             @Override
284             public boolean onPreferenceChange(Preference preference, Object newValue) {
285                 String key = preference.getKey();
286                 if (DEBUG) {
287                     Log.d(LOG_TAG,
288                         String.format("New value for %s: %s",  //$NON-NLS-1$
289                                 key,
290                                 String.valueOf(newValue)));
291                 }
292
293                 // Saved search terms
294                 if (preference.getKey().compareTo(
295                         FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.getId()) == 0) {
296                     if (!((Boolean)newValue).booleanValue()) {
297                         // Remove search terms if saved search terms
298                         // is not active by the user
299                         clearRecentSearchTerms();
300                     }
301
302                 // Sort search result mode
303                 } else if (FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.
304                         getId().compareTo(key) == 0) {
305                     int value = Integer.valueOf((String)newValue).intValue();
306                     String[] summary = getResources().getStringArray(
307                             R.array.sort_search_results_mode_labels);
308                     preference.setSummary(summary[value]);
309                 }
310
311                 // Notify the change (only if fragment is loaded. Default values are loaded
312                 // while not in loaded mode)
313                 if (SearchPreferenceFragment.this.mLoaded) {
314                     Intent intent = new Intent(FileManagerSettings.INTENT_SETTING_CHANGED);
315                     intent.putExtra(
316                             FileManagerSettings.EXTRA_SETTING_CHANGED_KEY, preference.getKey());
317                     getActivity().sendBroadcast(intent);
318                 }
319
320                 return true;
321             }
322         };
323
324         private final OnPreferenceClickListener mOnClickListener =
325                 new Preference.OnPreferenceClickListener() {
326             @Override
327             public boolean onPreferenceClick(Preference preference) {
328                 if (preference.getKey().compareTo(REMOVE_SEARCH_TERMS_KEY) == 0) {
329                     // Remove search terms
330                     clearRecentSearchTerms();
331
332                     // Advise the user
333                     DialogHelper.showToast(
334                             getActivity(),
335                             getActivity().getString(R.string.pref_remove_saved_search_terms_msg),
336                             Toast.LENGTH_SHORT);
337                 }
338                 return false;
339             }
340         };
341
342         /**
343          * {@inheritDoc}
344          */
345         @Override
346         public void onCreate(Bundle savedInstanceState) {
347             super.onCreate(savedInstanceState);
348
349             // Change the preference manager
350             getPreferenceManager().setSharedPreferencesName(Preferences.SETTINGS_FILENAME);
351             getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
352             this.mLoaded = false;
353
354             // Add the preferences
355             addPreferencesFromResource(R.xml.preferences_search);
356
357             // Highlight terms
358             this.mHighlightTerms =
359                     (CheckBoxPreference)findPreference(
360                             FileManagerSettings.SETTINGS_HIGHLIGHT_TERMS.getId());
361             this.mHighlightTerms.setOnPreferenceChangeListener(this.mOnChangeListener);
362
363             // Relevance widget
364             this.mShowRelevanceWidget =
365                     (CheckBoxPreference)findPreference(
366                             FileManagerSettings.SETTINGS_SHOW_RELEVANCE_WIDGET.getId());
367             this.mShowRelevanceWidget.setOnPreferenceChangeListener(this.mOnChangeListener);
368
369             // Sort search result mode
370             this.mSortSearchResultMode =
371                     (ListPreference)findPreference(
372                             FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId());
373             this.mSortSearchResultMode.setOnPreferenceChangeListener(this.mOnChangeListener);
374             String defaultValue = ((ObjectStringIdentifier)FileManagerSettings.
375                                     SETTINGS_SORT_SEARCH_RESULTS_MODE.getDefaultValue()).getId();
376             String value = Preferences.getSharedPreferences().getString(
377                                     FileManagerSettings.SETTINGS_SORT_SEARCH_RESULTS_MODE.getId(),
378                                     defaultValue);
379             this.mOnChangeListener.onPreferenceChange(this.mSortSearchResultMode, value);
380
381             // Saved search terms
382             this.mSaveSearchTerms =
383                     (CheckBoxPreference)findPreference(
384                             FileManagerSettings.SETTINGS_SAVE_SEARCH_TERMS.getId());
385             this.mSaveSearchTerms.setOnPreferenceChangeListener(this.mOnChangeListener);
386
387             // Remove search terms
388             this.mRemoveSearchTerms = findPreference(REMOVE_SEARCH_TERMS_KEY);
389             this.mRemoveSearchTerms.setOnPreferenceClickListener(this.mOnClickListener);
390
391             // Loaded
392             this.mLoaded = true;
393         }
394
395         /**
396          * Method that removes the recent suggestions on search activity
397          * @hide
398          */
399         void clearRecentSearchTerms() {
400             SearchRecentSuggestions suggestions =
401                     new SearchRecentSuggestions(getActivity(),
402                             RecentSearchesContentProvider.AUTHORITY,
403                             RecentSearchesContentProvider.MODE);
404             suggestions.clearHistory();
405             Preferences.setLastSearch(null);
406         }
407     }
408
409 }