/* Copyright (c) 2009 Christoph Studer <chstuder@gmail.com> * Copyright (c) 2010 Jan Berkel <jan.berkel@gmail.com> * * 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.zegoggles.smssync.preferences; import android.annotation.TargetApi; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.preference.PreferenceManager; import android.util.Log; import com.zegoggles.smssync.contacts.ContactGroup; import com.zegoggles.smssync.mail.DataType; import java.util.Locale; import static com.zegoggles.smssync.App.TAG; import static com.zegoggles.smssync.preferences.Preferences.Keys.APP_LOG; import static com.zegoggles.smssync.preferences.Preferences.Keys.APP_LOG_DEBUG; import static com.zegoggles.smssync.preferences.Preferences.Keys.BACKUP_CONTACT_GROUP; import static com.zegoggles.smssync.preferences.Preferences.Keys.CALLLOG_SYNC_CALENDAR; import static com.zegoggles.smssync.preferences.Preferences.Keys.CALLLOG_SYNC_CALENDAR_ENABLED; import static com.zegoggles.smssync.preferences.Preferences.Keys.CONFIRM_ACTION; import static com.zegoggles.smssync.preferences.Preferences.Keys.ENABLE_AUTO_BACKUP; import static com.zegoggles.smssync.preferences.Preferences.Keys.FIRST_USE; import static com.zegoggles.smssync.preferences.Preferences.Keys.INCOMING_TIMEOUT_SECONDS; import static com.zegoggles.smssync.preferences.Preferences.Keys.LAST_VERSION_CODE; import static com.zegoggles.smssync.preferences.Preferences.Keys.MAIL_SUBJECT_PREFIX; import static com.zegoggles.smssync.preferences.Preferences.Keys.MARK_AS_READ; import static com.zegoggles.smssync.preferences.Preferences.Keys.MARK_AS_READ_ON_RESTORE; import static com.zegoggles.smssync.preferences.Preferences.Keys.MARK_AS_READ_TYPES; import static com.zegoggles.smssync.preferences.Preferences.Keys.MAX_ITEMS_PER_RESTORE; import static com.zegoggles.smssync.preferences.Preferences.Keys.MAX_ITEMS_PER_SYNC; import static com.zegoggles.smssync.preferences.Preferences.Keys.NOTIFICATIONS; import static com.zegoggles.smssync.preferences.Preferences.Keys.REFERENCE_UID; import static com.zegoggles.smssync.preferences.Preferences.Keys.REGULAR_TIMEOUT_SECONDS; import static com.zegoggles.smssync.preferences.Preferences.Keys.RESTORE_STARRED_ONLY; import static com.zegoggles.smssync.preferences.Preferences.Keys.SMS_DEFAULT_PACKAGE; import static com.zegoggles.smssync.preferences.Preferences.Keys.SMS_DEFAULT_PACKAGE_CHANGE_SEEN; import static com.zegoggles.smssync.preferences.Preferences.Keys.THIRD_PARTY_INTEGRATION; import static com.zegoggles.smssync.preferences.Preferences.Keys.WIFI_ONLY; public class Preferences { private static final String ERROR = "error"; private final Context context; private final SharedPreferences preferences; public Preferences(Context context) { this.context = context.getApplicationContext(); this.preferences = PreferenceManager.getDefaultSharedPreferences(this.context); } public enum Keys { ENABLE_AUTO_BACKUP("enable_auto_sync"), INCOMING_TIMEOUT_SECONDS("auto_backup_incoming_schedule"), REGULAR_TIMEOUT_SECONDS ("auto_backup_schedule"), MAX_ITEMS_PER_SYNC("max_items_per_sync"), MAX_ITEMS_PER_RESTORE ("max_items_per_restore"), CALLLOG_SYNC_CALENDAR ("backup_calllog_sync_calendar"), CALLLOG_SYNC_CALENDAR_ENABLED ("backup_calllog_sync_calendar_enabled"), BACKUP_CONTACT_GROUP("backup_contact_group"), CONNECTED("connected"), WIFI_ONLY("wifi_only"), REFERENCE_UID("reference_uid"), MAIL_SUBJECT_PREFIX("mail_subject_prefix"), RESTORE_STARRED_ONLY("restore_starred_only"), @Deprecated MARK_AS_READ("mark_as_read"), MARK_AS_READ_TYPES("mark_as_read_types"), MARK_AS_READ_ON_RESTORE("mark_as_read_on_restore"), THIRD_PARTY_INTEGRATION("third_party_integration"), APP_LOG("app_log"), APP_LOG_DEBUG("app_log_debug"), LAST_VERSION_CODE("last_version_code"), CONFIRM_ACTION("confirm_action"), NOTIFICATIONS("notifications"), FIRST_USE("first_use"), IMAP_SETTINGS("imap_settings"), DONATE("donate"), BACKUP_SETTINGS_SCREEN("auto_backup_settings_screen"), SMS_DEFAULT_PACKAGE("sms_default_package"), SMS_DEFAULT_PACKAGE_CHANGE_SEEN("sms_default_package_change_seen"), ; public final String key; private Keys(String key) { this.key = key; } } public boolean isAppLogEnabled() { return preferences.getBoolean(APP_LOG.key, false); } public boolean isAppLogDebug() { return isAppLogEnabled() && preferences.getBoolean(APP_LOG_DEBUG.key, false); } public ContactGroup getBackupContactGroup() { return new ContactGroup(getStringAsInt(BACKUP_CONTACT_GROUP, -1)); } public boolean isCallLogCalendarSyncEnabled() { return getCallLogCalendarId() >= 0 && preferences.getBoolean(CALLLOG_SYNC_CALENDAR_ENABLED.key, false); } public int getCallLogCalendarId() { return getStringAsInt(CALLLOG_SYNC_CALENDAR, -1); } public boolean isRestoreStarredOnly() { return preferences.getBoolean(RESTORE_STARRED_ONLY.key, false); } public String getReferenceUid() { return preferences.getString(REFERENCE_UID.key, null); } public void setReferenceUid(String referenceUid) { preferences.edit() .putString(REFERENCE_UID.key, referenceUid) .commit(); } public boolean getMailSubjectPrefix() { return preferences.getBoolean(MAIL_SUBJECT_PREFIX.key, Defaults.MAIL_SUBJECT_PREFIX); } public int getMaxItemsPerSync() { return getStringAsInt(MAX_ITEMS_PER_SYNC, Defaults.MAX_ITEMS_PER_SYNC); } public int getMaxItemsPerRestore() { return getStringAsInt(MAX_ITEMS_PER_RESTORE, Defaults.MAX_ITEMS_PER_RESTORE); } public boolean isWifiOnly() { return preferences.getBoolean(WIFI_ONLY.key, false); } public boolean isAllow3rdPartyIntegration() { return preferences.getBoolean(THIRD_PARTY_INTEGRATION.key, false); } private int getStringAsInt(Keys key, int def) { return getStringAsInt(key.key, def); } private int getStringAsInt(String key, int def) { try { String s = preferences.getString(key, null); if (s == null) return def; return Integer.valueOf(s); } catch (NumberFormatException e) { return def; } } public boolean isEnableAutoSync() { return preferences.getBoolean(ENABLE_AUTO_BACKUP.key, Defaults.ENABLE_AUTO_SYNC); } public int getIncomingTimeoutSecs() { return getStringAsInt(INCOMING_TIMEOUT_SECONDS, Defaults.INCOMING_TIMEOUT_SECONDS); } public int getRegularTimeoutSecs() { return getStringAsInt(REGULAR_TIMEOUT_SECONDS, Defaults.REGULAR_TIMEOUT_SECONDS); } public void migrateMarkAsRead() { if (preferences.contains(MARK_AS_READ.key)) { SharedPreferences.Editor editor = preferences.edit(); boolean markAsRead = preferences.getBoolean(MARK_AS_READ.key, true); editor.putString(MARK_AS_READ_TYPES.key, markAsRead ? MarkAsReadTypes.READ.name() : MarkAsReadTypes.UNREAD.name()); editor.remove(MARK_AS_READ.key); editor.commit(); } } public MarkAsReadTypes getMarkAsReadType() { return getDefaultType(MARK_AS_READ_TYPES.key, MarkAsReadTypes.class, MarkAsReadTypes.READ); } public boolean getMarkAsReadOnRestore() { return preferences.getBoolean(MARK_AS_READ_ON_RESTORE.key, Defaults.MARK_AS_READ_ON_RESTORE); } public boolean isFirstBackup() { for (DataType type : DataType.values()) { if (preferences.contains(type.maxSyncedPreference)) { return false; } } return true; } public boolean isFirstUse() { if (isFirstBackup() && !preferences.contains(FIRST_USE.key)) { preferences.edit().putBoolean(FIRST_USE.key, false).commit(); return true; } else { return false; } } public boolean setSmsDefaultPackage(String smsPackage) { return preferences.edit().putString(SMS_DEFAULT_PACKAGE.key, smsPackage).commit(); } public String getSmsDefaultPackage() { return preferences.getString(SMS_DEFAULT_PACKAGE.key, null); } public boolean hasSeenSmsDefaultPackageChangeDialog() { return preferences.contains(SMS_DEFAULT_PACKAGE_CHANGE_SEEN.key); } public boolean setSeenSmsDefaultPackageChangeDialog() { return preferences.edit().putBoolean(SMS_DEFAULT_PACKAGE_CHANGE_SEEN.key, true).commit(); } public void reset() { preferences.edit() .remove(SMS_DEFAULT_PACKAGE_CHANGE_SEEN.key) .remove(SMS_DEFAULT_PACKAGE.key) .commit(); } public boolean isNotificationEnabled() { return preferences.getBoolean(NOTIFICATIONS.key, false); } public boolean confirmAction() { return preferences.getBoolean(CONFIRM_ACTION.key, false); } public String getVersion(boolean code) { PackageInfo pInfo; try { pInfo = context.getPackageManager().getPackageInfo( context.getPackageName(), PackageManager.GET_META_DATA); return "" + (code ? pInfo.versionCode : pInfo.versionName); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, ERROR, e); return null; } } @TargetApi(8) public boolean isInstalledOnSDCard() { PackageInfo pInfo; try { pInfo = context.getPackageManager().getPackageInfo( context.getPackageName(), PackageManager.GET_META_DATA); return (pInfo.applicationInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0; } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, ERROR, e); return false; } } public boolean shouldShowUpgradeMessage() { final String key = "upgrade_message_seen"; boolean seen = preferences.getBoolean(key, false); if (!seen && isOldSmsBackupInstalled()) { preferences.edit().putBoolean(key, true).commit(); return true; } else { return false; } } public boolean shouldShowAboutDialog() { int code; try { PackageInfo pInfo = context.getPackageManager().getPackageInfo( context.getPackageName(), PackageManager.GET_META_DATA); code = pInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, ERROR, e); code = -1; } int lastSeenCode = preferences.getInt(LAST_VERSION_CODE.key, -1); if (lastSeenCode < code) { preferences.edit().putInt(LAST_VERSION_CODE.key, code).commit(); return true; } else { return false; } } boolean isOldSmsBackupInstalled() { try { context.getPackageManager().getPackageInfo( "tv.studer.smssync", PackageManager.GET_META_DATA); return true; } catch (PackageManager.NameNotFoundException e) { return false; } } <T extends Enum<T>> T getDefaultType(String pref, Class<T> tClazz, T defaultType) { try { final String s = preferences.getString(pref, null); return s == null ? defaultType : Enum.valueOf(tClazz, s.toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException e) { Log.e(TAG, "getDefaultType(" + pref + ")", e); return defaultType; } } }