/** * Copyright (C) 2013 Romain Guefveneu. * * This file is part of naonedbus. * * Naonedbus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Naonedbus is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package net.naonedbus.fragment.impl; import java.io.File; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; import net.naonedbus.NBApplication; import net.naonedbus.R; import net.naonedbus.activity.MenuDrawerActivity; import net.naonedbus.manager.impl.HoraireManager; import net.naonedbus.utils.CalendarUtils; import net.naonedbus.widget.item.impl.DrawerMenuItem; import net.naonedbus.widget.item.impl.MainMenuItem; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.IOFileFilter; import android.annotation.TargetApi; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.widget.Toast; import com.bugsense.trace.BugSenseHandler; @TargetApi(Build.VERSION_CODES.HONEYCOMB) public class SettingsFragment extends PreferenceFragment { private ListPreference mNavigationHome; private ListPreference mCalendrierDefaut; private Preference mClearCachePlan; private Preference mClearCacheHoraires; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); mNavigationHome = (ListPreference) getPreferenceScreen().findPreference(NBApplication.PREF_NAVIGATION_HOME); mCalendrierDefaut = (ListPreference) getPreferenceScreen().findPreference(NBApplication.PREF_CALENDRIER_DEFAUT); mClearCachePlan = getPreferenceScreen().findPreference("plan.cache.clear"); mClearCacheHoraires = getPreferenceScreen().findPreference("horaires.cache.clear"); initNavigationHome(preferences); initCalendar(preferences); initClearCache(preferences); } protected boolean isValidFragment(final String fragmentName) { return true; } /** * Initier la liste des sections. * * @param preferences */ private void initNavigationHome(final SharedPreferences preferences) { final List<DrawerMenuItem> items = MenuDrawerActivity.getMainMenuItems(); final List<String> entriesName = new ArrayList<String>(); final List<String> entriesId = new ArrayList<String>(); for (int i = 0; i < items.size(); i++) { final DrawerMenuItem item = items.get(i); if (item instanceof MainMenuItem) { entriesName.add(getString(item.getTitle())); entriesId.add(String.valueOf(i)); } } final int section = Integer.parseInt(preferences.getString(NBApplication.PREF_NAVIGATION_HOME, "0")); final DrawerMenuItem item = items.get(section); mNavigationHome.setSummary(getString(item.getTitle())); mNavigationHome.setEntries(entriesName.toArray(new String[entriesName.size()])); mNavigationHome.setEntryValues(entriesId.toArray(new String[entriesId.size()])); mNavigationHome.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(final Preference preference, final Object newValue) { final DrawerMenuItem item = items.get(Integer.parseInt((String) newValue)); mNavigationHome.setSummary(getString(item.getTitle())); return true; } }); } /** * Initier la liste des calendriers. * * @param preferences */ private void initCalendar(final SharedPreferences preferences) { mCalendrierDefaut.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(final Preference preference, final Object newValue) { setCalendarSummary((String) newValue); return true; } }); setCalendarSummary(preferences); fillCalendars(mCalendrierDefaut); } /** * Initier le vidage du cache. * * @param preferences */ private void initClearCache(final SharedPreferences preferences) { mClearCachePlan.setSummary(getString(R.string.pref_cache_size, readableFileSize(getCacheSize()))); mClearCachePlan.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(final Preference preference) { try { clearCache(); mClearCachePlan.setSummary(getString(R.string.pref_cache_size, readableFileSize(getCacheSize()))); } catch (final IOException e) { BugSenseHandler.sendExceptionMessage("Erreur lors de la suppression du cache des plans", null, e); } return false; } }); mClearCacheHoraires.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(final Preference preference) { clearCacheHoraires(); Toast.makeText(getActivity(), R.string.msg_cache_horaire_clear, Toast.LENGTH_SHORT).show(); return false; } }); } /** * Vider le cache des plans. * * @throws IOException */ private void clearCache() throws IOException { FileUtils.deleteQuietly(getActivity().getCacheDir()); clearWebviewCache(); } /** * Vider le cache horaires. */ private void clearCacheHoraires() { final HoraireManager horaireManager = HoraireManager.getInstance(); horaireManager.clearSchedules(getActivity().getContentResolver()); clearWebviewCache(); } /** * Supprimer le cache webView. */ private void clearWebviewCache() { final File directory = getActivity().getFilesDir(); final Collection<File> webviewFiles = FileUtils.listFiles(directory, webViewFilter, webViewFilter); for (final File file : webviewFiles) { file.delete(); } } private static IOFileFilter webViewFilter = new IOFileFilter() { @Override public boolean accept(final File file) { return file.getName().startsWith("webview"); } @Override public boolean accept(final File file, final String name) { return name.startsWith("webview"); } }; /** * Lister les calendrier dans la ListPreference passée en paramètre. * * @param list */ private void fillCalendars(final ListPreference list) { CharSequence[] entriesName; CharSequence[] entriesId; final Map<Integer, String> calendars = CalendarUtils.getCalendars(getActivity().getContentResolver()); entriesName = new String[calendars.size()]; entriesId = new String[calendars.size()]; int i = 0; for (final Entry<Integer, String> cal : calendars.entrySet()) { entriesName[i] = cal.getValue(); entriesId[i++] = String.valueOf(cal.getKey()); } list.setEntries(entriesName); list.setEntryValues(entriesId); } /** * Afficher le sous-titre du calendrier * * @param preferences */ private void setCalendarSummary(final SharedPreferences preferences) { final String calendarId = preferences.getString(NBApplication.PREF_CALENDRIER_DEFAUT, null); setCalendarSummary(calendarId); } /** * Afficher le sous-titre du calendrier * * @param id */ private void setCalendarSummary(final String id) { if (id != null) { mCalendrierDefaut.setSummary(CalendarUtils.getCalendarName(getActivity().getContentResolver(), id)); } else { mCalendrierDefaut.setSummary(R.string.pref_calendar_summary); } } /** * Calculer la taille du cache * * @return La taille du cache en octets */ private long getCacheSize() { final File cache = getActivity().getCacheDir(); return FileUtils.sizeOfDirectory(cache); } /** * Formatter la taille * * @param size * @return Taille compréhensible par les humains ordinaires */ private String readableFileSize(final long size) { if (size <= 0) return getString(R.string.msg_vide); final String[] units = new String[] { "o", "Ko", "Mo", "Go", "To" }; final int digitGroups = (int) (Math.log10(size) / Math.log10(1024)); return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups]; } }