/*
* Copyright 2009 Andrew Shu
*
* This file is part of "reddit is fun".
*
* "reddit is fun" 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.
*
* "reddit is fun" 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 "reddit is fun". If not, see <http://www.gnu.org/licenses/>.
*/
package com.andrewshu.android.reddit.settings;
import java.util.Date;
import org.apache.http.client.HttpClient;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.cookie.BasicClientCookie;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;
import android.webkit.CookieSyncManager;
import com.andrewshu.android.reddit.R;
import com.andrewshu.android.reddit.common.Constants;
import com.andrewshu.android.reddit.common.RedditIsFunHttpClientFactory;
import com.andrewshu.android.reddit.common.util.StringUtils;
import com.andrewshu.android.reddit.common.util.Util;
/**
* Common settings
* @author Andrew
*
*/
public class RedditSettings {
private static final String TAG = "RedditSettings";
private String username = null;
private Cookie redditSessionCookie = null;
private String modhash = null;
private String homepage = Constants.FRONTPAGE_STRING;
private boolean useExternalBrowser = false;
private boolean showCommentGuideLines = true;
private boolean confirmQuitOrLogout = true;
private boolean saveHistory = true;
private boolean alwaysShowNextPrevious = true;
private int threadDownloadLimit = Constants.DEFAULT_THREAD_DOWNLOAD_LIMIT;
private String commentsSortByUrl = Constants.CommentsSort.SORT_BY_BEST_URL;
// --- Themes ---
private int theme = R.style.Reddit_Light_Medium;
private int rotation = -1; // -1 means unspecified
private boolean loadThumbnails = true;
private boolean loadThumbnailsOnlyWifi = false;
private String mailNotificationStyle = Constants.PREF_MAIL_NOTIFICATION_STYLE_DEFAULT;
private String mailNotificationService = Constants.PREF_MAIL_NOTIFICATION_SERVICE_OFF;
//
// --- Methods ---
//
// --- Preferences ---
public static class Rotation {
/* From http://developer.android.com/reference/android/R.attr.html#screenOrientation
* unspecified -1
* landscape 0
* portrait 1
* user 2
* behind 3
* sensor 4
* nosensor 5
*/
public static int valueOf(String valueString) {
if (Constants.PREF_ROTATION_UNSPECIFIED.equals(valueString))
return -1;
if (Constants.PREF_ROTATION_PORTRAIT.equals(valueString))
return 1;
if (Constants.PREF_ROTATION_LANDSCAPE.equals(valueString))
return 0;
return -1;
}
public static String toString(int value) {
switch (value) {
case -1:
return Constants.PREF_ROTATION_UNSPECIFIED;
case 1:
return Constants.PREF_ROTATION_PORTRAIT;
case 0:
return Constants.PREF_ROTATION_LANDSCAPE;
default:
return Constants.PREF_ROTATION_UNSPECIFIED;
}
}
}
public void saveRedditPreferences(Context context) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = settings.edit();
// Session
if (this.username != null)
editor.putString("username", this.username);
else
editor.remove("username");
if (this.redditSessionCookie != null) {
editor.putString("reddit_sessionValue", this.redditSessionCookie.getValue());
editor.putString("reddit_sessionDomain", this.redditSessionCookie.getDomain());
editor.putString("reddit_sessionPath", this.redditSessionCookie.getPath());
if (this.redditSessionCookie.getExpiryDate() != null)
editor.putLong("reddit_sessionExpiryDate", this.redditSessionCookie.getExpiryDate().getTime());
}
if (this.modhash != null)
editor.putString("modhash", this.modhash.toString());
// Default subreddit
editor.putString(Constants.PREF_HOMEPAGE, this.homepage.toString());
// Use external browser instead of BrowserActivity
editor.putBoolean(Constants.PREF_USE_EXTERNAL_BROWSER, this.useExternalBrowser);
// Show confirmation dialog when backing out of root Activity
editor.putBoolean(Constants.PREF_CONFIRM_QUIT, this.confirmQuitOrLogout);
// Save reddit history to Browser history
editor.putBoolean(Constants.PREF_SAVE_HISTORY, this.saveHistory);
// Whether to always show the next/previous buttons, or only at bottom of list
editor.putBoolean(Constants.PREF_ALWAYS_SHOW_NEXT_PREVIOUS, this.alwaysShowNextPrevious);
// Comments sort order
editor.putString(Constants.PREF_COMMENTS_SORT_BY_URL, this.commentsSortByUrl);
// Theme and text size
String[] themeTextSize = Util.getPrefsFromThemeResource(this.theme);
editor.putString(Constants.PREF_THEME, themeTextSize[0]);
editor.putString(Constants.PREF_TEXT_SIZE, themeTextSize[1]);
// Comment guide lines
editor.putBoolean(Constants.PREF_SHOW_COMMENT_GUIDE_LINES, this.showCommentGuideLines);
// Rotation
editor.putString(Constants.PREF_ROTATION, RedditSettings.Rotation.toString(this.rotation));
// Thumbnails
editor.putBoolean(Constants.PREF_LOAD_THUMBNAILS, this.loadThumbnails);
editor.putBoolean(Constants.PREF_LOAD_THUMBNAILS_ONLY_WIFI, this.loadThumbnailsOnlyWifi);
// Notifications
editor.putString(Constants.PREF_MAIL_NOTIFICATION_STYLE, this.mailNotificationStyle);
editor.putString(Constants.PREF_MAIL_NOTIFICATION_SERVICE, this.mailNotificationService);
editor.commit();
}
public void loadRedditPreferences(Context context, HttpClient client) {
// Session
SharedPreferences sessionPrefs = PreferenceManager.getDefaultSharedPreferences(context);
this.setUsername(sessionPrefs.getString("username", null));
this.setModhash(sessionPrefs.getString("modhash", null));
String cookieValue = sessionPrefs.getString("reddit_sessionValue", null);
String cookieDomain = sessionPrefs.getString("reddit_sessionDomain", null);
String cookiePath = sessionPrefs.getString("reddit_sessionPath", null);
long cookieExpiryDate = sessionPrefs.getLong("reddit_sessionExpiryDate", -1);
if (cookieValue != null) {
BasicClientCookie redditSessionCookie = new BasicClientCookie("reddit_session", cookieValue);
redditSessionCookie.setDomain(cookieDomain);
redditSessionCookie.setPath(cookiePath);
if (cookieExpiryDate != -1)
redditSessionCookie.setExpiryDate(new Date(cookieExpiryDate));
else
redditSessionCookie.setExpiryDate(null);
this.setRedditSessionCookie(redditSessionCookie);
RedditIsFunHttpClientFactory.getCookieStore().addCookie(redditSessionCookie);
try {
CookieSyncManager.getInstance().sync();
} catch (IllegalStateException ex) {
if (Constants.LOGGING) Log.e(TAG, "CookieSyncManager.getInstance().sync()", ex);
}
}
// Default subreddit
String homepage = sessionPrefs.getString(Constants.PREF_HOMEPAGE, Constants.FRONTPAGE_STRING).trim();
if (StringUtils.isEmpty(homepage))
this.setHomepage(Constants.FRONTPAGE_STRING);
else
this.setHomepage(homepage);
// Use external browser instead of BrowserActivity
this.setUseExternalBrowser(sessionPrefs.getBoolean(Constants.PREF_USE_EXTERNAL_BROWSER, false));
// Show confirmation dialog when backing out of root Activity
this.setConfirmQuitOrLogout(sessionPrefs.getBoolean(Constants.PREF_CONFIRM_QUIT, true));
// Save reddit history to Browser history
this.setSaveHistory(sessionPrefs.getBoolean(Constants.PREF_SAVE_HISTORY, true));
// Whether to always show the next/previous buttons, or only at bottom of list
this.setAlwaysShowNextPrevious(sessionPrefs.getBoolean(Constants.PREF_ALWAYS_SHOW_NEXT_PREVIOUS, true));
// Comments sort order
this.setCommentsSortByUrl(sessionPrefs.getString(Constants.PREF_COMMENTS_SORT_BY_URL, Constants.CommentsSort.SORT_BY_BEST_URL));
// Theme and text size
this.setTheme(Util.getThemeResourceFromPrefs(
sessionPrefs.getString(Constants.PREF_THEME, Constants.PREF_THEME_LIGHT),
sessionPrefs.getString(Constants.PREF_TEXT_SIZE, Constants.PREF_TEXT_SIZE_MEDIUM)));
// Comment guide lines
this.setShowCommentGuideLines(sessionPrefs.getBoolean(Constants.PREF_SHOW_COMMENT_GUIDE_LINES, true));
// Rotation
this.setRotation(RedditSettings.Rotation.valueOf(
sessionPrefs.getString(Constants.PREF_ROTATION, Constants.PREF_ROTATION_UNSPECIFIED)));
// Thumbnails
this.setLoadThumbnails(sessionPrefs.getBoolean(Constants.PREF_LOAD_THUMBNAILS, true));
// Thumbnails on Wifi
this.setLoadThumbnailsOnlyWifi(sessionPrefs.getBoolean(Constants.PREF_LOAD_THUMBNAILS_ONLY_WIFI, false));
// Notifications
this.setMailNotificationStyle(sessionPrefs.getString(Constants.PREF_MAIL_NOTIFICATION_STYLE, Constants.PREF_MAIL_NOTIFICATION_STYLE_DEFAULT));
this.setMailNotificationService(sessionPrefs.getString(Constants.PREF_MAIL_NOTIFICATION_SERVICE, Constants.PREF_MAIL_NOTIFICATION_SERVICE_OFF));
}
public int getDialogTheme() {
if (Util.isLightTheme(theme))
return R.style.Reddit_Light_Dialog;
else
return R.style.Reddit_Dark_Dialog;
}
public int getDialogNoTitleTheme() {
if (Util.isLightTheme(theme))
return R.style.Reddit_Light_Dialog_NoTitle;
else
return R.style.Reddit_Dark_Dialog_NoTitle;
}
public boolean isLoggedIn() {
return username != null;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Cookie getRedditSessionCookie() {
return redditSessionCookie;
}
public void setRedditSessionCookie(Cookie redditSessionCookie) {
this.redditSessionCookie = redditSessionCookie;
}
public String getModhash() {
return modhash;
}
public void setModhash(String modhash) {
this.modhash = modhash;
}
public String getHomepage() {
return homepage;
}
public void setHomepage(String homepage) {
this.homepage = homepage;
}
public boolean isUseExternalBrowser() {
return useExternalBrowser;
}
public void setUseExternalBrowser(boolean useExternalBrowser) {
this.useExternalBrowser = useExternalBrowser;
}
public boolean isShowCommentGuideLines() {
return showCommentGuideLines;
}
public void setShowCommentGuideLines(boolean showCommentGuideLines) {
this.showCommentGuideLines = showCommentGuideLines;
}
public boolean isConfirmQuitOrLogout() {
return confirmQuitOrLogout;
}
public boolean isSaveHistory() {
return saveHistory;
}
public void setConfirmQuitOrLogout(boolean confirmQuitOrLogout) {
this.confirmQuitOrLogout = confirmQuitOrLogout;
}
public void setSaveHistory(boolean saveHistory) {
this.saveHistory = saveHistory;
}
public boolean isAlwaysShowNextPrevious() {
return alwaysShowNextPrevious;
}
public void setAlwaysShowNextPrevious(boolean alwaysShowNextPrevious) {
this.alwaysShowNextPrevious = alwaysShowNextPrevious;
}
public int getThreadDownloadLimit() {
return threadDownloadLimit;
}
public void setThreadDownloadLimit(int threadDownloadLimit) {
this.threadDownloadLimit = threadDownloadLimit;
}
public String getCommentsSortByUrl() {
return commentsSortByUrl;
}
public void setCommentsSortByUrl(String commentsSortByUrl) {
this.commentsSortByUrl = commentsSortByUrl;
}
public int getTheme() {
return theme;
}
public void setTheme(int theme) {
this.theme = theme;
}
public int getRotation() {
return rotation;
}
public void setRotation(int rotation) {
this.rotation = rotation;
}
public boolean isLoadThumbnails() {
return loadThumbnails;
}
public void setLoadThumbnails(boolean loadThumbnails) {
this.loadThumbnails = loadThumbnails;
}
public boolean isLoadThumbnailsOnlyWifi() {
return loadThumbnailsOnlyWifi;
}
public void setLoadThumbnailsOnlyWifi(boolean loadThumbnailsOnlyWifi) {
this.loadThumbnailsOnlyWifi = loadThumbnailsOnlyWifi;
}
public String getMailNotificationStyle() {
return mailNotificationStyle;
}
public void setMailNotificationStyle(String mailNotificationStyle) {
this.mailNotificationStyle = mailNotificationStyle;
}
public String getMailNotificationService() {
return mailNotificationService;
}
public void setMailNotificationService(String mailNotificationService) {
this.mailNotificationService = mailNotificationService;
}
}