Home | History | Annotate | Download | only in email
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.email;
     18 
     19 import android.content.Context;
     20 import android.content.SharedPreferences;
     21 import android.text.TextUtils;
     22 
     23 import com.android.emailcommon.Logging;
     24 import com.android.emailcommon.provider.Account;
     25 import com.android.mail.utils.LogUtils;
     26 
     27 import org.json.JSONArray;
     28 import org.json.JSONException;
     29 
     30 import java.util.Collections;
     31 import java.util.HashSet;
     32 import java.util.Set;
     33 import java.util.UUID;
     34 
     35 public class Preferences {
     36 
     37     // Preferences file
     38     public static final String PREFERENCES_FILE = "AndroidMail.Main";
     39 
     40     // Preferences field names
     41     @Deprecated
     42     private static final String ACCOUNT_UUIDS = "accountUuids";
     43     private static final String ENABLE_DEBUG_LOGGING = "enableDebugLogging";
     44     private static final String ENABLE_EXCHANGE_LOGGING = "enableExchangeLogging";
     45     private static final String ENABLE_EXCHANGE_FILE_LOGGING = "enableExchangeFileLogging";
     46     private static final String ENABLE_STRICT_MODE = "enableStrictMode";
     47     private static final String DEVICE_UID = "deviceUID";
     48     private static final String ONE_TIME_INITIALIZATION_PROGRESS = "oneTimeInitializationProgress";
     49     private static final String LAST_ACCOUNT_USED = "lastAccountUsed";
     50     // The following are only used for migration
     51     @Deprecated
     52     private static final String AUTO_ADVANCE_DIRECTION = "autoAdvance";
     53     @Deprecated
     54     private static final String TRUSTED_SENDERS = "trustedSenders";
     55     @Deprecated
     56     private static final String CONFIRM_DELETE = "confirm_delete";
     57     @Deprecated
     58     private static final String CONFIRM_SEND = "confirm_send";
     59     @Deprecated
     60     private static final String SWIPE_DELETE = "swipe_delete";
     61     @Deprecated
     62     private static final String CONV_LIST_ICON = "conversation_list_icons";
     63     @Deprecated
     64     private static final String REPLY_ALL = "reply_all";
     65 
     66     @Deprecated
     67     public static final int AUTO_ADVANCE_NEWER = 0;
     68     @Deprecated
     69     public static final int AUTO_ADVANCE_OLDER = 1;
     70     @Deprecated
     71     public static final int AUTO_ADVANCE_MESSAGE_LIST = 2;
     72     // "move to older" was the behavior on older versions.
     73     @Deprecated
     74     private static final int AUTO_ADVANCE_DEFAULT = AUTO_ADVANCE_OLDER;
     75     @Deprecated
     76     private static final boolean CONFIRM_DELETE_DEFAULT = false;
     77     @Deprecated
     78     private static final boolean CONFIRM_SEND_DEFAULT = false;
     79 
     80     @Deprecated
     81     public static final String CONV_LIST_ICON_SENDER_IMAGE = "senderimage";
     82     @Deprecated
     83     public static final String CONV_LIST_ICON_NONE = "none";
     84     @Deprecated
     85     public static final String CONV_LIST_ICON_DEFAULT = CONV_LIST_ICON_SENDER_IMAGE;
     86 
     87     private static Preferences sPreferences;
     88 
     89     private final SharedPreferences mSharedPreferences;
     90 
     91     private Preferences(Context context) {
     92         mSharedPreferences = context.getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE);
     93     }
     94 
     95     /**
     96      * TODO need to think about what happens if this gets GCed along with the
     97      * Activity that initialized it. Do we lose ability to read Preferences in
     98      * further Activities? Maybe this should be stored in the Application
     99      * context.
    100      */
    101     public static synchronized Preferences getPreferences(Context context) {
    102         if (sPreferences == null) {
    103             sPreferences = new Preferences(context);
    104         }
    105         return sPreferences;
    106     }
    107 
    108     public static SharedPreferences getSharedPreferences(Context context) {
    109         return getPreferences(context).mSharedPreferences;
    110     }
    111 
    112     public static String getLegacyBackupPreference(Context context) {
    113         return getPreferences(context).mSharedPreferences.getString(ACCOUNT_UUIDS, null);
    114     }
    115 
    116     public static void clearLegacyBackupPreference(Context context) {
    117         getPreferences(context).mSharedPreferences.edit().remove(ACCOUNT_UUIDS).apply();
    118     }
    119 
    120     public void setEnableDebugLogging(boolean value) {
    121         mSharedPreferences.edit().putBoolean(ENABLE_DEBUG_LOGGING, value).apply();
    122     }
    123 
    124     public boolean getEnableDebugLogging() {
    125         return mSharedPreferences.getBoolean(ENABLE_DEBUG_LOGGING, false);
    126     }
    127 
    128     public void setEnableExchangeLogging(boolean value) {
    129         mSharedPreferences.edit().putBoolean(ENABLE_EXCHANGE_LOGGING, value).apply();
    130     }
    131 
    132     public boolean getEnableExchangeLogging() {
    133         return mSharedPreferences.getBoolean(ENABLE_EXCHANGE_LOGGING, false);
    134     }
    135 
    136     public void setEnableExchangeFileLogging(boolean value) {
    137         mSharedPreferences.edit().putBoolean(ENABLE_EXCHANGE_FILE_LOGGING, value).apply();
    138     }
    139 
    140     public boolean getEnableExchangeFileLogging() {
    141         return mSharedPreferences.getBoolean(ENABLE_EXCHANGE_FILE_LOGGING, false);
    142     }
    143 
    144     public void setEnableStrictMode(boolean value) {
    145         mSharedPreferences.edit().putBoolean(ENABLE_STRICT_MODE, value).apply();
    146     }
    147 
    148     public boolean getEnableStrictMode() {
    149         return mSharedPreferences.getBoolean(ENABLE_STRICT_MODE, false);
    150     }
    151 
    152     /**
    153      * Generate a new "device UID".  This is local to Email app only, to prevent possibility
    154      * of correlation with any other user activities in any other apps.
    155      * @return a persistent, unique ID
    156      */
    157     public synchronized String getDeviceUID() {
    158          String result = mSharedPreferences.getString(DEVICE_UID, null);
    159          if (result == null) {
    160              result = UUID.randomUUID().toString();
    161              mSharedPreferences.edit().putString(DEVICE_UID, result).apply();
    162          }
    163          return result;
    164     }
    165 
    166     public int getOneTimeInitializationProgress() {
    167         return mSharedPreferences.getInt(ONE_TIME_INITIALIZATION_PROGRESS, 0);
    168     }
    169 
    170     public void setOneTimeInitializationProgress(int progress) {
    171         mSharedPreferences.edit().putInt(ONE_TIME_INITIALIZATION_PROGRESS, progress).apply();
    172     }
    173 
    174     /** @deprecated Only used for migration */
    175     @Deprecated
    176     public int getAutoAdvanceDirection() {
    177         return mSharedPreferences.getInt(AUTO_ADVANCE_DIRECTION, AUTO_ADVANCE_DEFAULT);
    178     }
    179 
    180     /** @deprecated Only used for migration */
    181     @Deprecated
    182     public String getConversationListIcon() {
    183         return mSharedPreferences.getString(CONV_LIST_ICON, CONV_LIST_ICON_SENDER_IMAGE);
    184     }
    185 
    186     /** @deprecated Only used for migration */
    187     @Deprecated
    188     public boolean getConfirmDelete() {
    189         return mSharedPreferences.getBoolean(CONFIRM_DELETE, CONFIRM_DELETE_DEFAULT);
    190     }
    191 
    192     /** @deprecated Only used for migration */
    193     @Deprecated
    194     public boolean getConfirmSend() {
    195         return mSharedPreferences.getBoolean(CONFIRM_SEND, CONFIRM_SEND_DEFAULT);
    196     }
    197 
    198     /** @deprecated Only used for migration */
    199     @Deprecated
    200     public boolean hasSwipeDelete() {
    201         return mSharedPreferences.contains(SWIPE_DELETE);
    202     }
    203 
    204     /** @deprecated Only used for migration */
    205     @Deprecated
    206     public boolean getSwipeDelete() {
    207         return mSharedPreferences.getBoolean(SWIPE_DELETE, false);
    208     }
    209 
    210     /** @deprecated Only used for migration */
    211     @Deprecated
    212     public boolean hasReplyAll() {
    213         return mSharedPreferences.contains(REPLY_ALL);
    214     }
    215 
    216     /** @deprecated Only used for migration */
    217     @Deprecated
    218     public boolean getReplyAll() {
    219         return mSharedPreferences.getBoolean(REPLY_ALL, false);
    220     }
    221 
    222     /**
    223      * @deprecated This has been moved to {@link com.android.mail.preferences.MailPrefs}, and is
    224      * only here for migration.
    225      */
    226     @Deprecated
    227     public Set<String> getWhitelistedSenderAddresses() {
    228         try {
    229             return parseEmailSet(mSharedPreferences.getString(TRUSTED_SENDERS, ""));
    230         } catch (JSONException e) {
    231             return Collections.emptySet();
    232         }
    233     }
    234 
    235     HashSet<String> parseEmailSet(String serialized) throws JSONException {
    236         HashSet<String> result = new HashSet<String>();
    237         if (!TextUtils.isEmpty(serialized)) {
    238             JSONArray arr = new JSONArray(serialized);
    239             for (int i = 0, len = arr.length(); i < len; i++) {
    240                 result.add((String) arr.get(i));
    241             }
    242         }
    243         return result;
    244     }
    245 
    246     /**
    247      * Returns the last used account ID as set by {@link #setLastUsedAccountId}.
    248      * The system makes no attempt to automatically track what is considered a "use" - clients
    249      * are expected to call {@link #setLastUsedAccountId} manually.
    250      *
    251      * Note that the last used account may have been deleted in the background so there is also
    252      * no guarantee that the account exists.
    253      */
    254     public long getLastUsedAccountId() {
    255         return mSharedPreferences.getLong(LAST_ACCOUNT_USED, Account.NO_ACCOUNT);
    256     }
    257 
    258     /**
    259      * Sets the specified ID of the last account used. Treated as an opaque ID and does not
    260      * validate the value. Value is saved asynchronously.
    261      */
    262     public void setLastUsedAccountId(long accountId) {
    263         mSharedPreferences
    264                 .edit()
    265                 .putLong(LAST_ACCOUNT_USED, accountId)
    266                 .apply();
    267     }
    268 
    269     public void clear() {
    270         mSharedPreferences.edit().clear().apply();
    271     }
    272 
    273     public void dump() {
    274         if (Logging.LOGD) {
    275             for (String key : mSharedPreferences.getAll().keySet()) {
    276                 LogUtils.v(Logging.LOG_TAG, key + " = " + mSharedPreferences.getAll().get(key));
    277             }
    278         }
    279     }
    280 }
    281