/*
* Copyright 2014 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.samples.apps.iosched.settings;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.google.samples.apps.iosched.BuildConfig;
import com.google.samples.apps.iosched.Config;
import com.google.samples.apps.iosched.ui.BaseActivity;
import com.google.samples.apps.iosched.util.TimeUtils;
import com.google.samples.apps.iosched.welcome.WelcomeActivity;
import java.util.TimeZone;
import static com.google.samples.apps.iosched.util.LogUtils.makeLogTag;
/**
* Utilities and constants related to app settings_prefs.
*/
public class SettingsUtils {
private static final String TAG = makeLogTag(SettingsUtils.class);
/**
* This is changed each year to effectively reset certain preferences that should be re-asked
* each year. Note, res/xml/settings_prefs.xml must be updated when this value is updated.
*/
public static final String CONFERENCE_YEAR_PREF_POSTFIX = "_2016";
/**
* Boolean preference indicating the user would like to see times in their local timezone
* throughout the app.
*/
public static final String PREF_LOCAL_TIMES = "pref_local_times";
/**
* Boolean indicating whether the app should attempt to sign in on startup (default true).
*/
public static final String PREF_USER_REFUSED_SIGN_IN = "pref_user_refused_sign_in" +
CONFERENCE_YEAR_PREF_POSTFIX;
/**
* Boolean indicating whether the debug build warning was already shown.
*/
public static final String PREF_DEBUG_BUILD_WARNING_SHOWN = "pref_debug_build_warning_shown";
/**
* Boolean indicating whether ToS has been accepted.
*/
public static final String PREF_TOS_ACCEPTED = "pref_tos_accepted" +
CONFERENCE_YEAR_PREF_POSTFIX;
/**
* Boolean indicating whether CoC has been accepted.
*/
private static final String PREF_CONDUCT_ACCEPTED = "pref_conduct_accepted" +
CONFERENCE_YEAR_PREF_POSTFIX;
/**
* Boolean indicating whether ToS has been accepted.
*/
public static final String PREF_DECLINED_WIFI_SETUP = "pref_declined_wifi_setup" +
CONFERENCE_YEAR_PREF_POSTFIX;
/**
* Boolean indicating whether user has answered if they are local or remote.
*/
public static final String PREF_ANSWERED_LOCAL_OR_REMOTE = "pref_answered_local_or_remote" +
CONFERENCE_YEAR_PREF_POSTFIX;
/**
* Long indicating when a sync was last ATTEMPTED (not necessarily succeeded).
*/
public static final String PREF_LAST_SYNC_ATTEMPTED = "pref_last_sync_attempted";
/**
* Long indicating when a sync last SUCCEEDED.
*/
public static final String PREF_LAST_SYNC_SUCCEEDED = "pref_last_sync_succeeded";
/**
* Long storing the sync interval that's currently configured.
*/
public static final String PREF_CUR_SYNC_INTERVAL = "pref_cur_sync_interval";
/**
* Boolean indicating app should sync sessions with local calendar
*/
public static final String PREF_SYNC_CALENDAR = "pref_sync_calendar";
/**
* Boolean indicating whether the app has performed the (one-time) welcome flow.
*/
public static final String PREF_WELCOME_DONE = "pref_welcome_done" +
CONFERENCE_YEAR_PREF_POSTFIX;
/**
* Boolean indicating if the app can collect Analytics.
*/
public static final String PREF_ANALYTICS_ENABLED = "pref_analytics_enabled";
/**
* Return the {@link TimeZone} the app is set to use (either user or conference).
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static TimeZone getDisplayTimeZone(Context context) {
TimeZone defaultTz = TimeZone.getDefault();
return (isUsingLocalTime(context) && defaultTz != null)
? defaultTz : Config.CONFERENCE_TIMEZONE;
}
/**
* Return true if the user has indicated they want the schedule in local times, false if they
* want to use the conference time zone. This preference is enabled/disabled by the user in the
* {@link SettingsActivity}.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean isUsingLocalTime(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_LOCAL_TIMES, false);
}
/**
* Return true if the user has indicated they're attending I/O in person. This preference can be
* enabled/disabled by the user in the
* {@link SettingsActivity}.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean isAttendeeAtVenue(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(BuildConfig.PREF_ATTENDEE_AT_VENUE, true);
}
/**
* Mark that the app has finished loading the {@code R.raw.bootstrap_data bootstrap data}.
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
*/
public static void markDataBootstrapDone(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(BuildConfig.PREF_DATA_BOOTSTRAP_DONE, true).apply();
}
/**
* Return true when the {@code R.raw.bootstrap_data_json bootstrap data} has been marked loaded.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean isDataBootstrapDone(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(BuildConfig.PREF_DATA_BOOTSTRAP_DONE, false);
}
/**
* Set the attendee preference indicating whether they'll be attending Google I/O on site.
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
* @param newValue New value that will be set.
*/
public static void setAttendeeAtVenue(final Context context, final boolean newValue) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(BuildConfig.PREF_ATTENDEE_AT_VENUE, newValue).apply();
}
/**
* Mark that the user explicitly chose not to sign in so app doesn't ask them again.
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
*/
public static void markUserRefusedSignIn(final Context context, final boolean refused) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(PREF_USER_REFUSED_SIGN_IN, refused).apply();
}
/**
* Return true if user refused to sign in, false if they haven't refused (yet).
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean hasUserRefusedSignIn(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_USER_REFUSED_SIGN_IN, false);
}
/**
* Return true if the
* {@code com.google.samples.apps.iosched.welcome.WelcomeActivity.displayDogfoodWarningDialog() Dogfood Build Warning}
* has already been marked as shown, false if not.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean wasDebugWarningShown(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_DEBUG_BUILD_WARNING_SHOWN, false);
}
/**
* Mark the
* {@code com.google.samples.apps.iosched.welcome.WelcomeActivity.displayDogfoodWarningDialog() Dogfood Build Warning}
* shown to user.
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
*/
public static void markDebugWarningShown(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(PREF_DEBUG_BUILD_WARNING_SHOWN, true).apply();
}
/**
* Return true if user has accepted the
* {@link WelcomeActivity Tos}, false if they haven't (yet).
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean isTosAccepted(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_TOS_ACCEPTED, false);
}
/**
* Return true if user has accepted the Code of
* {@link com.google.samples.apps.iosched.welcome.ConductFragment Conduct}, false if they haven't (yet).
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean isConductAccepted(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_CONDUCT_ACCEPTED, false);
}
/**
* Mark {@code newValue whether} the user has accepted the TOS so the app doesn't ask again.
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
* @param newValue New value that will be set.
*/
public static void markTosAccepted(final Context context, boolean newValue) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(PREF_TOS_ACCEPTED, newValue).apply();
}
/**
* Mark {@code newValue whether} the user has accepted the Code of Conduct so the app doesn't ask again.
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
* @param newValue New value that will be set.
*/
public static void markConductAccepted(final Context context, boolean newValue) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(PREF_CONDUCT_ACCEPTED, newValue).apply();
}
/**
* Return true if user has already declined WiFi setup, but false if they haven't yet.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean hasDeclinedWifiSetup(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_DECLINED_WIFI_SETUP, false);
}
/**
* Mark that the user has explicitly declined WiFi setup assistance.
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
* @param newValue New value that will be set.
*/
public static void markDeclinedWifiSetup(final Context context, boolean newValue) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(PREF_DECLINED_WIFI_SETUP, newValue).apply();
}
/**
* Returns true if user has already indicated whether they're a local or remote I/O attendee,
* false if they haven't answered yet.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean hasAnsweredLocalOrRemote(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_ANSWERED_LOCAL_OR_REMOTE, false);
}
/**
* Mark that the user answered whether they're a local or remote I/O attendee.
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
* @param newValue New value that will be set.
*/
public static void markAnsweredLocalOrRemote(final Context context, boolean newValue) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(PREF_ANSWERED_LOCAL_OR_REMOTE, newValue).apply();
}
/**
* Return true if the first-app-run-activities have already been executed.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean isFirstRunProcessComplete(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_WELCOME_DONE, false);
}
/**
* Mark {@code newValue whether} this is the first time the first-app-run-processes have run.
* Managed by {@link com.google.samples.apps.iosched.ui.BaseActivity the}
* {@link BaseActivity two} base activities.
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
* @param newValue New value that will be set.
*/
public static void markFirstRunProcessesDone(final Context context, boolean newValue) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(PREF_WELCOME_DONE, newValue).apply();
}
/**
* Return a long representing the last time a sync was attempted (regardless of success).
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static long getLastSyncAttemptedTime(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getLong(PREF_LAST_SYNC_ATTEMPTED, 0L);
}
/**
* Mark a sync was attempted (stores current time as 'last sync attempted' preference).
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
*/
public static void markSyncAttemptedNow(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putLong(PREF_LAST_SYNC_ATTEMPTED, TimeUtils.getCurrentTime(context)).apply();
}
/**
* Return a long representing the last time a sync succeeded.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static long getLastSyncSucceededTime(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getLong(PREF_LAST_SYNC_SUCCEEDED, 0L);
}
/**
* Mark that a sync succeeded (stores current time as 'last sync succeeded' preference).
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
*/
public static void markSyncSucceededNow(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putLong(PREF_LAST_SYNC_SUCCEEDED, TimeUtils.getCurrentTime(context)).apply();
}
/**
* Return true if analytics are enabled, false if user has disabled them.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean isAnalyticsEnabled(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_ANALYTICS_ENABLED, true);
}
/**
* Return true if session reminders are enabled, false if user has disabled them.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean shouldShowSessionReminders(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(BuildConfig.PREF_SESSION_REMINDERS_ENABLED, false);
}
/**
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
* @param show Whether app should show session reminders
*/
public static void setShowSessionReminders(final Context context, boolean show) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(BuildConfig.PREF_SESSION_REMINDERS_ENABLED, show).apply();
}
/**
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
* @param show Whether app should show session feedback reminders
*/
public static void setShowSessionFeedbackReminders(final Context context, boolean show) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(BuildConfig.PREF_SESSION_FEEDBACK_REMINDERS_ENABLED, show).apply();
}
/**
* Return true if session feedback reminders are enabled, false if user has disabled them.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean shouldShowSessionFeedbackReminders(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(BuildConfig.PREF_SESSION_FEEDBACK_REMINDERS_ENABLED, false);
}
/**
* Return a long representing the current data sync interval time.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static long getCurSyncInterval(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getLong(PREF_CUR_SYNC_INTERVAL, 0L);
}
/**
* Set a new interval for the data sync time.
*
* @param context Context to be used to edit the {@link android.content.SharedPreferences}.
* @param newValue New value that will be set.
*/
public static void setCurSyncInterval(final Context context, long newValue) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putLong(PREF_CUR_SYNC_INTERVAL, newValue).apply();
}
/**
* Return true if calendar sync is enabled, false if disabled.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
*/
public static boolean shouldSyncCalendar(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_SYNC_CALENDAR, false);
}
/**
* Helper method to register a settings_prefs listener. This method does not automatically handle
* {@code unregisterOnSharedPreferenceChangeListener() un-registering} the listener at the end
* of the {@code context} lifecycle.
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
* @param listener Listener to register.
*/
public static void registerOnSharedPreferenceChangeListener(final Context context,
SharedPreferences.OnSharedPreferenceChangeListener listener) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.registerOnSharedPreferenceChangeListener(listener);
}
/**
* Helper method to un-register a settings_prefs listener typically registered with
* {@code registerOnSharedPreferenceChangeListener()}
*
* @param context Context to be used to lookup the {@link android.content.SharedPreferences}.
* @param listener Listener to un-register.
*/
public static void unregisterOnSharedPreferenceChangeListener(final Context context,
SharedPreferences.OnSharedPreferenceChangeListener listener) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.unregisterOnSharedPreferenceChangeListener(listener);
}
}