/* * Zirco Browser for Android * * Copyright (C) 2010 J. Devauchelle and contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 3 as published by the Free Software Foundation. * * This program 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. */ package org.zirco.ui.activities.preferences; import java.util.List; import org.zirco.R; import org.zirco.controllers.Controller; import org.zirco.providers.BookmarksProviderWrapper; import org.zirco.ui.activities.AboutActivity; import org.zirco.ui.activities.AdBlockerWhiteListActivity; import org.zirco.ui.activities.ChangelogActivity; import org.zirco.ui.activities.MobileViewListActivity; import org.zirco.ui.activities.MainActivity; import org.zirco.ui.components.CustomWebView; import org.zirco.ui.runnables.XmlHistoryBookmarksExporter; import org.zirco.ui.runnables.XmlHistoryBookmarksImporter; import org.zirco.utils.ApplicationUtils; import org.zirco.utils.Constants; import org.zirco.utils.DateUtils; import org.zirco.utils.IOUtils; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.DialogInterface.OnClickListener; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; import android.preference.PreferenceManager; import android.preference.Preference.OnPreferenceClickListener; import android.webkit.CookieManager; /** * Preferences activity. */ public class PreferencesActivity extends PreferenceActivity { private ProgressDialog mProgressDialog; private OnSharedPreferenceChangeListener mPreferenceChangeListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.layout.preferences_activity); PreferenceCategory browserPreferenceCategory = (PreferenceCategory) findPreference("BrowserPreferenceCategory"); Preference enablePluginsEclair = (Preference) findPreference(Constants.PREFERENCES_BROWSER_ENABLE_PLUGINS_ECLAIR); Preference enablePlugins = (Preference) findPreference(Constants.PREFERENCES_BROWSER_ENABLE_PLUGINS); if (Build.VERSION.SDK_INT <= 7) { browserPreferenceCategory.removePreference(enablePlugins); } else { browserPreferenceCategory.removePreference(enablePluginsEclair); } Preference userAgentPref = (Preference) findPreference(Constants.PREFERENCES_BROWSER_USER_AGENT); userAgentPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { openUserAgentActivity(); return true; } }); Preference fullScreenPref = (Preference) findPreference(Constants.PREFERENCES_SHOW_FULL_SCREEN); fullScreenPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { askForRestart(); return true; } }); Preference hideTitleBarPref = (Preference) findPreference(Constants.PREFERENCES_GENERAL_HIDE_TITLE_BARS); hideTitleBarPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { askForRestart(); return true; } }); Preference searchUrlPref = (Preference) findPreference(Constants.PREFERENCES_GENERAL_SEARCH_URL); searchUrlPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { openSearchUrlActivity(); return true; } }); Preference homepagePref = (Preference) findPreference(Constants.PREFERENCES_GENERAL_HOME_PAGE); homepagePref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { openHomepageActivity(); return true; } }); Preference weaveServerPref = (Preference) findPreference(Constants.PREFERENCE_WEAVE_SERVER); weaveServerPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { openWeaveServerActivity(); return true; } }); Preference aboutPref = (Preference) findPreference("About"); aboutPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { openAboutActivity(); return true; } }); Preference changelogPref = (Preference) findPreference("Changelog"); changelogPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { openChangelogActivity(); return true; } }); Preference mobileViewPref = (Preference) findPreference("MobileViewList"); mobileViewPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { openMobileViewListActivity(); return true; } }); Preference whiteListPref = (Preference) findPreference("AdBlockerWhiteList"); whiteListPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { openWhiteListActivity(); return true; } }); Preference clearHistoryPref = (Preference) findPreference("PrivacyClearHistory"); clearHistoryPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { clearHistory(); return true; } }); Preference clearformDataPref = (Preference) findPreference("PrivacyClearFormData"); clearformDataPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { clearFormData(); return true; } }); Preference clearCachePref = (Preference) findPreference("PrivacyClearCache"); clearCachePref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { clearCache(); return true; } }); Preference clearCookiesPref = (Preference) findPreference("PrivacyClearCookies"); clearCookiesPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { clearCookies(); return true; } }); Preference exportHistoryBookmarksPref = (Preference) findPreference("ExportHistoryBookmarks"); exportHistoryBookmarksPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { exportHistoryBookmarks(); return true; } }); Preference importHistoryBookmarksPref = (Preference) findPreference("ImportHistoryBookmarks"); importHistoryBookmarksPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { importHistoryBookmarks(); return true; } }); Preference clearHistoryBookmarksPref = (Preference) findPreference("ClearHistoryBookmarks"); clearHistoryBookmarksPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { clearHistoryBookmarks(); return true; } }); mPreferenceChangeListener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { MainActivity.INSTANCE.applyPreferences(); } }; PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(mPreferenceChangeListener); } /** * Ask user to restart the app. Do it if click on "Yes". */ private void askForRestart() { ApplicationUtils.showYesNoDialog(this, android.R.drawable.ic_dialog_alert, R.string.PreferencesActivity_RestartDialogTitle, R.string.PreferencesActivity_RestartDialogMessage, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { MainActivity.INSTANCE.restartApplication(); } }); } /** * Display the homepage preference dialog. */ private void openHomepageActivity() { Intent i = new Intent(this, HomepagePreferenceActivity.class); startActivity(i); } private void openWeaveServerActivity() { Intent i = new Intent(this, WeaveServerPreferenceActivity.class); startActivity(i); } /** * Display the search url preference dialog. */ private void openSearchUrlActivity() { Intent i = new Intent(this, SearchUrlPreferenceActivity.class); startActivity(i); } /** * Display the user agent preference dialog. */ private void openUserAgentActivity() { Intent i = new Intent(this, UserAgentPreferenceActivity.class); startActivity(i); } /** * Display the about dialog. */ private void openAboutActivity() { Intent i = new Intent(this, AboutActivity.class); startActivity(i); } /** * Display the changelog dialog. */ private void openChangelogActivity() { Intent i = new Intent(this, ChangelogActivity.class); startActivity(i); } /** * Display the mobile view list activity. */ private void openMobileViewListActivity() { Intent i = new Intent(this, MobileViewListActivity.class); startActivity(i); } /** * Display the ad blocker white list activity. */ private void openWhiteListActivity() { Intent i = new Intent(this, AdBlockerWhiteListActivity.class); startActivity(i); } /** * Clear the history. */ private void doClearHistory() { mProgressDialog = ProgressDialog.show(this, this.getResources().getString(R.string.Commons_PleaseWait), this.getResources().getString(R.string.Commons_ClearingHistory)); new HistoryClearer(); } /** * Display confirmation and clear the history. */ private void clearHistory() { ApplicationUtils.showYesNoDialog(this, android.R.drawable.ic_dialog_alert, R.string.Commons_ClearHistory, R.string.Commons_NoUndoMessage, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); doClearHistory(); } }); } /** * Clear form data. */ private void doClearFormData() { mProgressDialog = ProgressDialog.show(this, this.getResources().getString(R.string.Commons_PleaseWait), this.getResources().getString(R.string.Commons_ClearingFormData)); new FormDataClearer(); } /** * Display confirmation and clear form data. */ private void clearFormData() { ApplicationUtils.showYesNoDialog(this, android.R.drawable.ic_dialog_alert, R.string.Commons_ClearFormData, R.string.Commons_NoUndoMessage, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); doClearFormData(); } }); } /** * Clear the cache. */ private void doClearCache() { mProgressDialog = ProgressDialog.show(this, this.getResources().getString(R.string.Commons_PleaseWait), this.getResources().getString(R.string.Commons_ClearingCache)); new CacheClearer(); } /** * Display confirmation and clear the cache. */ private void clearCache() { ApplicationUtils.showYesNoDialog(this, android.R.drawable.ic_dialog_alert, R.string.Commons_ClearCache, R.string.Commons_NoUndoMessage, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); doClearCache(); } }); } /** * Clear cookies. */ private void doClearCookies() { mProgressDialog = ProgressDialog.show(this, this.getResources().getString(R.string.Commons_PleaseWait), this.getResources().getString(R.string.Commons_ClearingCookies)); new CookiesClearer(); } /** * Display confirmation and clear cookies. */ private void clearCookies() { ApplicationUtils.showYesNoDialog(this, android.R.drawable.ic_dialog_alert, R.string.Commons_ClearCookies, R.string.Commons_NoUndoMessage, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); doClearCookies(); } }); } private void doClearHistoryBookmarks(int choice) { mProgressDialog = ProgressDialog.show(this, this.getResources().getString(R.string.Commons_PleaseWait), this.getResources().getString(R.string.Commons_ClearingHistoryBookmarks)); new HistoryBookmarksClearer(choice); } /** * Clear the history. */ private void clearHistoryBookmarks() { final String[] choices = new String[] { getString(R.string.Commons_History), getString(R.string.Commons_Bookmarks), getString(R.string.Commons_All) }; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setInverseBackgroundForced(true); builder.setIcon(android.R.drawable.ic_dialog_info); builder.setTitle(R.string.Commons_ClearHistoryBookmarks); builder.setSingleChoiceItems(choices, 0, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { doClearHistoryBookmarks(which); dialog.dismiss(); } }); builder.setCancelable(true); builder.setNegativeButton(R.string.Commons_Cancel, null); AlertDialog alert = builder.create(); alert.show(); } /** * Import the given file to bookmarks and history. * @param fileName The file to import. */ private void doImportHistoryBookmarks(String fileName) { if (ApplicationUtils.checkCardState(this, true)) { mProgressDialog = ProgressDialog.show(this, this.getResources().getString(R.string.Commons_PleaseWait), this.getResources().getString(R.string.Commons_ImportingHistoryBookmarks)); XmlHistoryBookmarksImporter importer = new XmlHistoryBookmarksImporter(this, fileName, mProgressDialog); new Thread(importer).start(); } } /** * Ask the user the file to import to bookmarks and history, and launch the import. */ private void importHistoryBookmarks() { List<String> exportedFiles = IOUtils.getExportedBookmarksFileList(); final String[] choices = exportedFiles.toArray(new String[exportedFiles.size()]); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setInverseBackgroundForced(true); builder.setIcon(android.R.drawable.ic_dialog_info); builder.setTitle(getResources().getString(R.string.Commons_ImportHistoryBookmarksSource)); builder.setSingleChoiceItems(choices, 0, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { doImportHistoryBookmarks(choices[which]); dialog.dismiss(); } }); builder.setCancelable(true); builder.setNegativeButton(R.string.Commons_Cancel, null); AlertDialog alert = builder.create(); alert.show(); } /** * Export the bookmarks and history. */ private void doExportHistoryBookmarks() { if (ApplicationUtils.checkCardState(this, true)) { mProgressDialog = ProgressDialog.show(this, this.getResources().getString(R.string.Commons_PleaseWait), this.getResources().getString(R.string.Commons_ExportingHistoryBookmarks)); XmlHistoryBookmarksExporter exporter = new XmlHistoryBookmarksExporter(this, DateUtils.getNowForFileName() + ".xml", BookmarksProviderWrapper.getAllStockRecords(this.getContentResolver()), mProgressDialog); new Thread(exporter).start(); } } /** * Ask the user to confirm the export. Launch it if confirmed. */ private void exportHistoryBookmarks() { ApplicationUtils.showYesNoDialog(this, android.R.drawable.ic_dialog_info, R.string.Commons_HistoryBookmarksExportSDCardConfirmation, R.string.Commons_OperationCanBeLongMessage, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); doExportHistoryBookmarks(); } }); } /** * Base class for all clear operations launched as Runnable. */ private abstract class AbstractClearer implements Runnable { /** * Constructor. Launch itself as a Thread. */ public AbstractClearer() { new Thread(this).start(); } protected Handler mHandler = new Handler() { public void handleMessage(Message msg) { mProgressDialog.dismiss(); } }; } private class HistoryBookmarksClearer extends AbstractClearer { private int mChoice; public HistoryBookmarksClearer(int choice) { mChoice = choice; } @Override public void run() { switch (mChoice) { case 0: BookmarksProviderWrapper.clearHistoryAndOrBookmarks(PreferencesActivity.this.getContentResolver(), true, false); break; case 1: BookmarksProviderWrapper.clearHistoryAndOrBookmarks(PreferencesActivity.this.getContentResolver(), false, true); break; case 2: BookmarksProviderWrapper.clearHistoryAndOrBookmarks(PreferencesActivity.this.getContentResolver(), true, true); break; default: break; } mHandler.sendEmptyMessage(0); } } /** * History clearer thread. */ private class HistoryClearer implements Runnable { /** * Constructor. */ public HistoryClearer() { new Thread(this).start(); } @Override public void run() { // Clear DB History BookmarksProviderWrapper.clearHistoryAndOrBookmarks(getContentResolver(), true, false); // Clear WebViews history for (CustomWebView webView : Controller.getInstance().getWebViewList()) { webView.clearHistory(); } handler.sendEmptyMessage(0); } private Handler handler = new Handler() { public void handleMessage(Message msg) { mProgressDialog.dismiss(); } }; } /** * Form data clearer thread. */ private class FormDataClearer implements Runnable { /** * Constructor. */ public FormDataClearer() { new Thread(this).start(); } @Override public void run() { for (CustomWebView webView : Controller.getInstance().getWebViewList()) { webView.clearFormData(); } handler.sendEmptyMessage(0); } private Handler handler = new Handler() { public void handleMessage(Message msg) { mProgressDialog.dismiss(); } }; } /** * Cache clearer thread. */ private class CacheClearer implements Runnable { /** * Constructor. */ public CacheClearer() { new Thread(this).start(); } @Override public void run() { // Only need to clear the cache from one WebView, as it is application-based. CustomWebView webView = Controller.getInstance().getWebViewList().get(0); webView.clearCache(true); handler.sendEmptyMessage(0); } private Handler handler = new Handler() { public void handleMessage(Message msg) { mProgressDialog.dismiss(); } }; } /** * Cookies clearer thread. */ private class CookiesClearer implements Runnable { /** * Constructor. */ public CookiesClearer() { new Thread(this).start(); } @Override public void run() { CookieManager.getInstance().removeAllCookie(); handler.sendEmptyMessage(0); } private Handler handler = new Handler() { public void handleMessage(Message msg) { mProgressDialog.dismiss(); } }; } }