1 /*
2  * Copyright (C) 2016 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.contacts.util;
18 
19 import android.app.backup.BackupManager;
20 import android.content.Context;
21 import android.content.SharedPreferences;
22 
23 import com.android.contacts.model.SimCard;
24 
25 import java.util.ArrayList;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.HashSet;
29 import java.util.List;
30 import java.util.Set;
31 
32 public class SharedPreferenceUtil {
33 
34     public static final String PREFERENCE_KEY_ACCOUNT_SYNC_OFF_DISMISSES =
35             "num-of-dismisses-account-sync-off";
36 
37     public static final String PREFERENCE_KEY_GLOBAL_SYNC_OFF_DISMISSES =
38             "num-of-dismisses-auto-sync-off";
39 
40     public static final String PREFERENCE_KEY_HAMBURGER_PROMO_DISPLAYED =
41             "hamburgerPromoDisplayed";
42 
43     public static final String PREFERENCE_KEY_HAMBURGER_MENU_CLICKED =
44             "hamburgerMenuClicked";
45 
46     public static final String PREFERENCE_KEY_HAMBURGER_PROMO_TRIGGER_ACTION_HAPPENED =
47             "hamburgerPromoTriggerActionHappened";
48 
49     private static final String PREFERENCE_KEY_IMPORTED_SIM_CARDS =
50             "importedSimCards";
51 
52     private static final String PREFERENCE_KEY_DISMISSED_SIM_CARDS =
53             "dismissedSimCards";
54 
55     private static final String PREFERENCE_KEY_RESTORED_DEVICES =
56             "restoredDevices";
57 
58     private static final String PREFERENCE_KEY_DISMISSED_DEVICES =
59             "dismissedDevices";
60 
61     public static final String PREFERENCE_WELCOME_CARD_DISMISSED =
62             "welcome-reminder-card-dismissed";
63 
getHamburgerPromoDisplayedBefore(Context context)64     public static boolean getHamburgerPromoDisplayedBefore(Context context) {
65         return getSharedPreferences(context)
66                 .getBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_DISPLAYED, false);
67     }
68 
setHamburgerPromoDisplayedBefore(Context context)69     public static void setHamburgerPromoDisplayedBefore(Context context) {
70         getSharedPreferences(context).edit()
71                 .putBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_DISPLAYED, true)
72                 .apply();
73         new BackupManager(context).dataChanged();
74     }
75 
getHamburgerMenuClickedBefore(Context context)76     public static boolean getHamburgerMenuClickedBefore(Context context) {
77         return getSharedPreferences(context)
78                 .getBoolean(PREFERENCE_KEY_HAMBURGER_MENU_CLICKED, false);
79     }
80 
setHamburgerMenuClickedBefore(Context context)81     public static void setHamburgerMenuClickedBefore(Context context) {
82         getSharedPreferences(context).edit()
83                 .putBoolean(PREFERENCE_KEY_HAMBURGER_MENU_CLICKED, true)
84                 .apply();
85         new BackupManager(context).dataChanged();
86     }
87 
getHamburgerPromoTriggerActionHappenedBefore(Context context)88     public static boolean getHamburgerPromoTriggerActionHappenedBefore(Context context) {
89         return getSharedPreferences(context)
90                 .getBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_TRIGGER_ACTION_HAPPENED, false);
91     }
92 
setHamburgerPromoTriggerActionHappenedBefore(Context context)93     public static void setHamburgerPromoTriggerActionHappenedBefore(Context context) {
94         getSharedPreferences(context).edit()
95                 .putBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_TRIGGER_ACTION_HAPPENED, true)
96                 .apply();
97         new BackupManager(context).dataChanged();
98     }
99 
100     /**
101      * Show hamburger promo if:
102      * 1) Hamburger menu is never clicked before
103      * 2) Hamburger menu promo is never displayed before
104      * 3) There is at least one available user action
105      *      (for now, available user actions to trigger to displayed hamburger promo are:
106      *       a: QuickContact UI back to PeopleActivity
107      *       b: Search action back to PeopleActivity)
108      */
getShouldShowHamburgerPromo(Context context)109     public static boolean getShouldShowHamburgerPromo(Context context) {
110         return !getHamburgerMenuClickedBefore(context)
111                 && getHamburgerPromoTriggerActionHappenedBefore(context)
112                 && !getHamburgerPromoDisplayedBefore(context);
113     }
114 
getSharedPreferences(Context context)115     protected static SharedPreferences getSharedPreferences(Context context) {
116         return context.getSharedPreferences(getSharedPreferencesFilename(context),
117                 Context.MODE_PRIVATE);
118     }
119 
getSharedPreferencesFilename(Context context)120     public static String getSharedPreferencesFilename(Context context) {
121         return context.getPackageName();
122     }
123 
getNumOfDismissesForAutoSyncOff(Context context)124     public static int getNumOfDismissesForAutoSyncOff(Context context) {
125         return getSharedPreferences(context).getInt(PREFERENCE_KEY_GLOBAL_SYNC_OFF_DISMISSES, 0);
126     }
127 
resetNumOfDismissesForAutoSyncOff(Context context)128     public static void resetNumOfDismissesForAutoSyncOff(Context context) {
129         final int value = getSharedPreferences(context).getInt(
130                 PREFERENCE_KEY_GLOBAL_SYNC_OFF_DISMISSES, 0);
131         if (value != 0) {
132             getSharedPreferences(context).edit()
133                     .putInt(PREFERENCE_KEY_GLOBAL_SYNC_OFF_DISMISSES, 0).apply();
134         }
135     }
136 
incNumOfDismissesForAutoSyncOff(Context context)137     public static void incNumOfDismissesForAutoSyncOff(Context context) {
138         final int value = getSharedPreferences(context).getInt(
139                 PREFERENCE_KEY_GLOBAL_SYNC_OFF_DISMISSES, 0);
140         getSharedPreferences(context).edit()
141                 .putInt(PREFERENCE_KEY_GLOBAL_SYNC_OFF_DISMISSES, value + 1).apply();
142     }
143 
buildSharedPrefsName(String accountName)144     private static String buildSharedPrefsName(String accountName) {
145         return accountName + "-" + PREFERENCE_KEY_ACCOUNT_SYNC_OFF_DISMISSES;
146     }
147 
getNumOfDismissesforAccountSyncOff(Context context, String accountName)148     public static int getNumOfDismissesforAccountSyncOff(Context context, String accountName) {
149         return getSharedPreferences(context).getInt(buildSharedPrefsName(accountName), 0);
150     }
151 
resetNumOfDismissesForAccountSyncOff(Context context, String accountName)152     public static void resetNumOfDismissesForAccountSyncOff(Context context, String accountName) {
153         final int value = getSharedPreferences(context).getInt(
154                 buildSharedPrefsName(accountName), 0);
155         if (value != 0) {
156             getSharedPreferences(context).edit()
157                     .putInt(buildSharedPrefsName(accountName), 0).apply();
158         }
159     }
160 
incNumOfDismissesForAccountSyncOff(Context context, String accountName)161     public static void incNumOfDismissesForAccountSyncOff(Context context, String accountName) {
162         final int value = getSharedPreferences(context).getInt(
163                 buildSharedPrefsName(accountName), 0);
164         getSharedPreferences(context).edit()
165                 .putInt(buildSharedPrefsName(accountName), value + 1).apply();
166     }
167 
persistSimStates(Context context, Collection<SimCard> sims)168     public static void persistSimStates(Context context, Collection<SimCard> sims) {
169         final Set<String> imported = new HashSet<>(getImportedSims(context));
170         final Set<String> dismissed = new HashSet<>(getDismissedSims(context));
171         for (SimCard sim : sims) {
172             final String id = sim.getSimId();
173             if (id == null) {
174                 continue;
175             }
176             if (sim.isImported()) {
177                 imported.add(id);
178             } else {
179                 imported.remove(id);
180             }
181             if (sim.isDismissed()) {
182                 dismissed.add(id);
183             } else {
184                 dismissed.remove(id);
185             }
186         }
187         getSharedPreferences(context).edit()
188                 .putStringSet(PREFERENCE_KEY_IMPORTED_SIM_CARDS, imported)
189                 .putStringSet(PREFERENCE_KEY_DISMISSED_SIM_CARDS, dismissed)
190                 .apply();
191     }
192 
restoreSimStates(Context context, List<SimCard> sims)193     public static List<SimCard> restoreSimStates(Context context, List<SimCard> sims) {
194         final Set<String> imported = getImportedSims(context);
195         final Set<String> dismissed = getDismissedSims(context);
196         List<SimCard> result = new ArrayList<>();
197         for (SimCard sim : sims) {
198             result.add(sim.withImportAndDismissStates(imported.contains(sim.getSimId()),
199                     dismissed.contains(sim.getSimId())));
200         }
201         return result;
202     }
203 
getImportedSims(Context context)204     private static Set<String> getImportedSims(Context context) {
205         return getSharedPreferences(context)
206                 .getStringSet(PREFERENCE_KEY_IMPORTED_SIM_CARDS, Collections.<String>emptySet());
207     }
208 
getDismissedSims(Context context)209     private static Set<String> getDismissedSims(Context context) {
210         return getSharedPreferences(context)
211                 .getStringSet(PREFERENCE_KEY_DISMISSED_SIM_CARDS, Collections.<String>emptySet());
212     }
213 
getRestoredDevices(Context context)214     public static Set<String> getRestoredDevices(Context context) {
215         return getSharedPreferences(context)
216                 .getStringSet(PREFERENCE_KEY_RESTORED_DEVICES, Collections.<String>emptySet());
217     }
218 
getDismissedDevices(Context context)219     public static Set<String> getDismissedDevices(Context context) {
220         return getSharedPreferences(context)
221                 .getStringSet(PREFERENCE_KEY_DISMISSED_DEVICES, Collections.<String>emptySet());
222     }
223 
addRestoredDevice(Context context, String deviceId)224     public static void addRestoredDevice(Context context, String deviceId) {
225         final Set<String> restoredDevices = new HashSet<>(getRestoredDevices(context));
226         restoredDevices.add(deviceId);
227         getSharedPreferences(context).edit()
228                 .putStringSet(PREFERENCE_KEY_RESTORED_DEVICES, restoredDevices)
229                 .apply();
230     }
231 
addDismissedDevice(Context context, String deviceId)232     public static void addDismissedDevice(Context context, String deviceId) {
233         final Set<String> dismissedDevices = new HashSet<>(getDismissedDevices(context));
234         dismissedDevices.add(deviceId);
235         getSharedPreferences(context).edit()
236                 .putStringSet(PREFERENCE_KEY_DISMISSED_DEVICES, dismissedDevices)
237                 .commit();
238     }
239 
removeDismissedDevice(Context context, String deviceId)240     public static void removeDismissedDevice(Context context, String deviceId) {
241         final Set<String> dismissedDevices = new HashSet<>(getDismissedDevices(context));
242         dismissedDevices.remove(deviceId);
243         getSharedPreferences(context).edit()
244                 .putStringSet(PREFERENCE_KEY_DISMISSED_DEVICES, dismissedDevices)
245                 .commit();
246     }
247 
isWelcomeCardDismissed(Context context)248     public static boolean isWelcomeCardDismissed(Context context) {
249         return getSharedPreferences(context).getBoolean(PREFERENCE_WELCOME_CARD_DISMISSED,
250                 false);
251     }
252 
setWelcomeCardDismissed(Context context, boolean isDismissed)253     public static void setWelcomeCardDismissed(Context context, boolean isDismissed) {
254         getSharedPreferences(context).edit().putBoolean(PREFERENCE_WELCOME_CARD_DISMISSED,
255                 isDismissed).apply();
256         new BackupManager(context).dataChanged();
257     }
258 
clear(Context context)259     public static void clear(Context context) {
260         getSharedPreferences(context).edit().clear().commit();
261         new BackupManager(context).dataChanged();
262     }
263 }
264