package com.github.andlyticsproject;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;
import com.github.andlyticsproject.sync.AutosyncHandler;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
public class Preferences {
// TODO Review this class an clean it up a bit
public static final String PREF = "andlytics_pref";
private static final String HIDDEN_ACCOUNT = "hiddenAccount";
private static final String ACCOUNT_NAME = "accountName";
private static final String GWTPERMUTATION = "permutation";
private static final String POST_REQUEST_GET_FULL_ASSET_INFOS = "post_full_asset_info";
private static final String POST_REQUEST_GET_USER_INFO_SIZE = "post_user_info_size";
private static final String POST_REQUEST_USER_COMMENTS = "post_user_comments";
private static final String POST_REQUEST_FEEDBACK = "post_feedback";
public static final String AUTOSYNC_PERIOD = "autosync.period";
public static final String AUTOSYNC_PERIOD_LAST_NON_ZERO = "autosync.period.last";
private static final String CRASH_REPORT_DISABLE = "acra.enable";
public static final String CHART_TIMEFRAME = "chart.timeframe";
public static final String ADMOB_TIMEFRAME = "admob.timeframe";
private static final String CHART_SMOOTH = "chart.smooth";
private static final String SKIP_AUTO_LOGIN = "skip.auto.login";
private static final String STATS_MODE = "stats.mode";
public static final String NOTIFICATION_CHANGES_RATING = "notification.changes.rating";
public static final String NOTIFICATION_CHANGES_COMMENTS = "notification.changes.comments";
public static final String NOTIFICATION_CHANGES_DOWNLOADS = "notification.changes.download";
public static final String NOTIFICATION_RINGTONE = "notification.ringtone";
public static final String NOTIFICATION_LIGHT = "notification.light";
public static final String NOTIFICATION_WHEN_ACCOUNT_VISISBLE = "notification.when_account_visible";
public static final String DATE_FORMAT_LONG = "dateformat.long";
private static final String ADMOB_HIDE_FOR_UNCONFIGURED_APPS = "admob.hide_for_unconfigured_apps";
private static final String ADMOB_SITE_ID = "admob.siteid";
private static final String ADMOB_ACCOUNT = "admob.account";
private static final String SHOW_CHART_HINT = "show.chart.hint";
private static final String LATEST_VERSION_CODE = "latest.version.code";
private static final String LAST_STATS_REMOTE_UPDATE = "last.stats.remote.update";
// 15 minutes in millis
public static final long STATS_REMOTE_UPDATE_INTERVAL = 15 * 60 * 1000L;
private static final String LAST_COMMENTS_REMOTE_UPDATE = "last.commentts.remote.update";
// make it shorter for comments 5 minutes in millis
public static final long COMMENTS_REMOTE_UPDATE_INTERVAL = 5 * 60 * 1000L;
public static final String USE_GOOGLE_TRANSLATE_APP = "use.google.translate.app";
public static final String SHOW_COMMENT_AUTO_TRANSLATIONS = "show.comment.auto.translations";
public static final String SHOW_DEVELOPER_CUT_REVENUE = "revenue.show.developer.cut";
public static final String NOTIFICATION_PREFS = "notification.prefs";
public enum Timeframe {
LAST_NINETY_DAYS, LAST_THIRTY_DAYS, UNLIMITED, LAST_TWO_DAYS, LATEST_VALUE, LAST_SEVEN_DAYS, MONTH_TO_DATE
}
public enum StatsMode {
PERCENT, DAY_CHANGES
}
private static String cachedDateFormatShort;
private static String cachedDateFormatLong;
public static void disableCrashReports(Context context) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.remove(CRASH_REPORT_DISABLE);
editor.commit();
}
@Deprecated
public static void saveAccountName(Context activity, String accountName) {
SharedPreferences.Editor editor = getSettings(activity).edit();
editor.putString(ACCOUNT_NAME, accountName);
editor.commit();
}
@Deprecated
public static void removeAccountName(Context activity) {
SharedPreferences.Editor editor = getSettings(activity).edit();
editor.remove(ACCOUNT_NAME);
editor.commit();
}
@Deprecated
public static String getAccountName(Context activity) {
return getSettings(activity).getString(ACCOUNT_NAME, null);
}
private static SharedPreferences getSettings(Context activity) {
return activity.getSharedPreferences(PREF, 0);
}
public static String getGwtPermutation(Context activity) {
return getVersionDependingProperty(GWTPERMUTATION, activity);
}
public static void saveGwtPermutation(Context activity, String gwtPermutation) {
saveVersionDependingProperty(GWTPERMUTATION, gwtPermutation, activity);
}
public static int getLastNonZeroAutosyncPeriod(Context activity) {
return getSettings(activity).getInt(AUTOSYNC_PERIOD_LAST_NON_ZERO,
AutosyncHandler.DEFAULT_PERIOD);
}
public static void saveLastNonZeroAutosyncPeriod(Context activity, int syncPeriod) {
SharedPreferences.Editor editor = getSettings(activity).edit();
editor.putInt(AUTOSYNC_PERIOD_LAST_NON_ZERO, syncPeriod);
editor.commit();
}
public static int getAutosyncPeriod(Context activity) {
// We use a ListPreference which only supports saving as strings, so
// need to convert it when reading
return Integer.parseInt(getSettings(activity).getString(AUTOSYNC_PERIOD,
Integer.toString(AutosyncHandler.DEFAULT_PERIOD)));
}
public static String getRequestFullAssetInfo(Context activity) {
return getVersionDependingProperty(POST_REQUEST_GET_FULL_ASSET_INFOS, activity);
}
public static void saveRequestFullAssetInfo(Context activity, String postdata) {
saveVersionDependingProperty(POST_REQUEST_GET_FULL_ASSET_INFOS, postdata, activity);
}
public static String getRequestGetAssetForUserCount(Context context) {
return getVersionDependingProperty(POST_REQUEST_GET_USER_INFO_SIZE, context);
}
public static void saveRequestGetAssetForUserCount(Context context, String string) {
saveVersionDependingProperty(POST_REQUEST_GET_USER_INFO_SIZE, string, context);
}
public static String getRequestUserComments(Context context) {
return getVersionDependingProperty(POST_REQUEST_USER_COMMENTS, context);
}
public static void saveRequestUserComments(Context context, String string) {
saveVersionDependingProperty(POST_REQUEST_USER_COMMENTS, string, context);
}
private static String getVersionDependingProperty(String name, Context context) {
return getSettings(context).getString(name + getAppVersionCode(context), null);
}
private static void saveVersionDependingProperty(String name, String value, Context context) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.putString(name + getAppVersionCode(context), value);
editor.commit();
}
public static int getAppVersionCode(Context context) {
try {
PackageInfo pinfo = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
return pinfo.versionCode;
} catch (NameNotFoundException e) {
Log.e(AndlyticsApp.class.getSimpleName(), "unable to read version code", e);
}
return 0;
}
public static void saveChartTimeframe(Timeframe value, Context context) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.putString(CHART_TIMEFRAME, value.name());
editor.commit();
}
public static Timeframe getChartTimeframe(Context activity) {
return Timeframe.valueOf(getSettings(activity).getString(CHART_TIMEFRAME,
Timeframe.LAST_THIRTY_DAYS.name()));
}
public static Boolean getChartSmooth(Context context) {
return getSettings(context).getBoolean(CHART_SMOOTH, true);
}
public static boolean getSkipAutologin(Context context) {
return getSettings(context).getBoolean(SKIP_AUTO_LOGIN, false);
}
public static void saveSkipAutoLogin(Context context, Boolean value) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.putBoolean(SKIP_AUTO_LOGIN, value);
editor.commit();
}
public static void saveStatsMode(StatsMode value, Context context) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.putString(STATS_MODE, value.name());
editor.commit();
}
public static StatsMode getStatsMode(Context activity) {
return StatsMode.valueOf(getSettings(activity).getString(STATS_MODE,
StatsMode.PERCENT.name()));
}
public static boolean getNotificationPerf(Context context, String prefName) {
return getSettings(context).getBoolean(prefName, true);
}
public static String getNotificationRingtone(Context context) {
return getSettings(context).getString(NOTIFICATION_RINGTONE, null);
}
public static Boolean getShowChartHint(Context context) {
return getSettings(context).getBoolean(SHOW_CHART_HINT, true);
}
public static void saveShowChartHint(Context context, Boolean value) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.putBoolean(SHOW_CHART_HINT, value);
editor.commit();
}
public static String getDateFormatStringShort(Context context) {
if (cachedDateFormatShort != null) {
return cachedDateFormatShort;
}
String dateFormatStringLong = getDateFormatStringLong(context);
// Build the short version by taking the long one and removing the year
// We do this rather than using pre-defined short versions so that the
// user
// can use a default based on their locale
String format = dateFormatStringLong.replace("yyyy", "").replace("yy", "");
// Now go through the string removing any duplicate separators
// and trimming leading/ending separators
StringBuilder builder = new StringBuilder();
char[] chars = format.toCharArray();
int length = chars.length;
for (int i = 0; i < length; i++) {
char c = chars[i];
if (Character.isLetter(c)) {
// Always accept letters
builder.append(c);
} else if ((i > 0) && (i + 1 < length) && (c != chars[i + 1])) {
// Only accept separators is they aren't duplicated
// and aren't at the start or end
builder.append(c);
}
}
format = builder.toString();
cachedDateFormatShort = format;
return format;
}
/**
* Clears the cached string representations used for date formatting Should
* be called whenever the user preference changes
*/
public static void clearCachedDateFormats() {
cachedDateFormatShort = null;
cachedDateFormatLong = null;
}
private static String getDateFormatStringLong(Context context) {
if (cachedDateFormatLong != null) {
return cachedDateFormatLong;
}
String format = getSettings(context).getString(DATE_FORMAT_LONG, "DEFAULT");
if ("DEFAULT".equals(format)) {
format = ((SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT)).toPattern();
// Make it consistent with our pre-defined formats (always show
// yyyy)
format = format.replace("yyyy", "yy").replace("yy", "yyyy");
}
cachedDateFormatLong = format;
return format;
}
@SuppressLint("SimpleDateFormat")
public static DateFormat getDateFormatLong(Context context) {
return new SimpleDateFormat(getDateFormatStringLong(context));
}
@Deprecated
public static void saveAdmobSiteId(Context context, String packageName, String value) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.putString(ADMOB_SITE_ID + packageName, value);
editor.commit();
}
@Deprecated
public static String getAdmobSiteId(Context context, String packageName) {
return getSettings(context).getString(ADMOB_SITE_ID + packageName, null);
}
@Deprecated
public static void saveAdmobAccount(Context context, String siteId, String accountName) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.putString(ADMOB_ACCOUNT + siteId, accountName);
editor.commit();
}
@Deprecated
public static String getAdmobAccount(Context context, String siteId) {
return getSettings(context).getString(ADMOB_ACCOUNT + siteId, null);
}
public static int getLatestVersionCode(Context context) {
return getSettings(context).getInt(LATEST_VERSION_CODE, 0);
}
public static void saveLatestVersionCode(Context context, int latest) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.putInt(LATEST_VERSION_CODE, latest);
editor.commit();
}
public static String getRequestFeedback(Context activity) {
return getVersionDependingProperty(POST_REQUEST_FEEDBACK, activity);
}
public static void saveRequestFeedback(Context activity, String postdata) {
saveVersionDependingProperty(POST_REQUEST_FEEDBACK, postdata, activity);
}
public static Timeframe getAdmobTimeframe(Context context) {
return Timeframe.valueOf(getSettings(context).getString(ADMOB_TIMEFRAME,
Timeframe.LAST_THIRTY_DAYS.name()));
}
public static void saveAdmobTimeframe(Timeframe value, Context context) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.putString(ADMOB_TIMEFRAME, value.name());
editor.commit();
}
@Deprecated
public static void saveIsHiddenAccount(Context context, String accountName, Boolean hidden) {
SharedPreferences.Editor editor = getSettings(context).edit();
editor.putBoolean(HIDDEN_ACCOUNT + accountName, hidden);
editor.commit();
}
@Deprecated
public static boolean getIsHiddenAccount(Context context, String accountName) {
return getSettings(context).getBoolean(HIDDEN_ACCOUNT + accountName, false);
}
public static boolean getHideAdmobForUnconfiguredApps(Context context) {
return getSettings(context).getBoolean(ADMOB_HIDE_FOR_UNCONFIGURED_APPS, false);
}
@Deprecated
public static synchronized long getLastStatsRemoteUpdateTime(Context activity,
String accountName) {
return getSettings(activity).getLong(LAST_STATS_REMOTE_UPDATE + "." + accountName, 0);
}
@Deprecated
public static synchronized void saveLastStatsRemoteUpdateTime(Context activity,
String accountName, long timestamp) {
getSettings(activity).edit()
.putLong(LAST_STATS_REMOTE_UPDATE + "." + accountName, timestamp).commit();
}
/**
* Gets the last time that comments were updated for the given <b>packageName</b>
*
* @param activity
* @param packageName
* @return
*/
@Deprecated
public static synchronized long getLastCommentsRemoteUpdateTime(Context activity,
String packageName) {
return getSettings(activity).getLong(LAST_COMMENTS_REMOTE_UPDATE + "." + packageName, 0);
}
/**
* Sets the time that comments were last updated for the given <b>packageName</b>
*
* @param activity
* @param packageName
* @param timestamp
*/
@Deprecated
public static synchronized void saveLastCommentsRemoteUpdateTime(Context activity,
String packageName, long timestamp) {
getSettings(activity).edit()
.putLong(LAST_COMMENTS_REMOTE_UPDATE + "." + packageName, timestamp).commit();
}
public static synchronized boolean isUseGoogleTranslateApp(Context context) {
return getSettings(context).getBoolean(USE_GOOGLE_TRANSLATE_APP, true);
}
public static synchronized void saveUseGoogleTranslateApp(Context context, boolean value) {
getSettings(context).edit().putBoolean(USE_GOOGLE_TRANSLATE_APP, value).commit();
}
public static synchronized boolean isShowCommentAutoTranslations(Context context) {
return getSettings(context).getBoolean(SHOW_COMMENT_AUTO_TRANSLATIONS, true);
}
public static synchronized void saveShowCommentAutoTranslations(Context context, boolean value) {
getSettings(context).edit().putBoolean(SHOW_COMMENT_AUTO_TRANSLATIONS, value).commit();
}
public static synchronized boolean isShowDeveloperCutRevenue(Context context) {
return getSettings(context).getBoolean(SHOW_DEVELOPER_CUT_REVENUE, true);
}
public static synchronized void saveShowDeveloperCutRevenue(Context context, boolean value) {
getSettings(context).edit().putBoolean(SHOW_DEVELOPER_CUT_REVENUE, value).commit();
}
}