19cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen/* 29cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * Copyright (C) 2015 The Android Open Source Project 39cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * 49cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * Licensed under the Apache License, Version 2.0 (the "License"); 59cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * you may not use this file except in compliance with the License. 69cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * You may obtain a copy of the License at 79cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * 89cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * http://www.apache.org/licenses/LICENSE-2.0 99cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * 109cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * Unless required by applicable law or agreed to in writing, software 119cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * distributed under the License is distributed on an "AS IS" BASIS, 129cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * See the License for the specific language governing permissions and 149cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen * limitations under the License 159cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen */ 169cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chenpackage com.android.phone.settings; 179cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen 189cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chenimport android.content.Context; 199cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chenimport android.content.SharedPreferences; 209cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chenimport android.preference.PreferenceManager; 219cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chenimport android.telecom.PhoneAccountHandle; 229cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen 2357c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chenimport com.android.internal.telephony.Phone; 2457c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chenimport com.android.phone.PhoneUtils; 259cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chenimport com.android.phone.vvm.omtp.OmtpConstants; 269cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chenimport com.android.phone.vvm.omtp.sms.StatusMessage; 279cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen 289cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen/** 29a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen * Save visual voicemail login values and whether or not a particular account is enabled in shared 30a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen * preferences to be retrieved later. 3157c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen * Because a voicemail source is tied 1:1 to a phone account, the phone account handle is used in 3257c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen * the key for each voicemail source and the associated data. 339cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen */ 349cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chenpublic class VisualVoicemailSettingsUtil { 359cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen private static final String VISUAL_VOICEMAIL_SHARED_PREFS_KEY_PREFIX = 369cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen "visual_voicemail_"; 379cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen 389cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen private static final String IS_ENABLED_KEY = "is_enabled"; 39a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen // If a carrier vvm app is installed, Google visual voicemail is automatically switched off 40a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen // however, the user can override this setting. 41a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen private static final String IS_USER_SET = "is_user_set"; 424406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen // Record the timestamp of the last full sync so that duplicate syncs can be reduced. 434406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen private static final String LAST_FULL_SYNC_TIMESTAMP = "last_full_sync_timestamp"; 444406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen // Constant indicating that there has never been a full sync. 454406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen public static final long NO_PRIOR_FULL_SYNC = -1; 469cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen 476337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen // Setting for how often retries should be done. 486337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen private static final String SYNC_RETRY_INTERVAL = "sync_retry_interval"; 496337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen private static final long MAX_SYNC_RETRY_INTERVAL_MS = 86400000; // 24 hours 506337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen private static final long DEFAULT_SYNC_RETRY_INTERVAL_MS = 900000; // 15 minutes 516337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen 526337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen 53a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen public static void setVisualVoicemailEnabled(Phone phone, boolean isEnabled, 54a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen boolean isUserSet) { 5557c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen setVisualVoicemailEnabled(phone.getContext(), PhoneUtils.makePstnPhoneAccountHandle(phone), 56a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen isEnabled, isUserSet); 5757c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen } 5857c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen 599cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen public static void setVisualVoicemailEnabled(Context context, PhoneAccountHandle phoneAccount, 60a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen boolean isEnabled, boolean isUserSet) { 619cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 629cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen SharedPreferences.Editor editor = prefs.edit(); 639cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen editor.putBoolean( 649cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen getVisualVoicemailSharedPrefsKey(IS_ENABLED_KEY, phoneAccount), isEnabled); 65a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen editor.putBoolean( 66a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen getVisualVoicemailSharedPrefsKey(IS_USER_SET, phoneAccount), 67a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen isUserSet); 689cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen editor.commit(); 699cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen } 709cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen 7157c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen public static boolean isVisualVoicemailEnabled(Context context, 729cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen PhoneAccountHandle phoneAccount) { 739cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen if (phoneAccount == null) { 749cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen return false; 759cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen } 769cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 779cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen return prefs.getBoolean(getVisualVoicemailSharedPrefsKey(IS_ENABLED_KEY, phoneAccount), 7857c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen false); 7957c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen } 8057c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen 8157c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen public static boolean isVisualVoicemailEnabled(Phone phone) { 8257c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen return isVisualVoicemailEnabled(phone.getContext(), 8357c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen PhoneUtils.makePstnPhoneAccountHandle(phone)); 849cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen } 859cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen 86a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen /** 87a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen * Differentiate user-enabled/disabled to know whether to ignore automatic enabling and 88a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen * disabling by the system. This is relevant when a carrier vvm app is installed and the user 89a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen * manually enables dialer visual voicemail. In that case we would want that setting to persist. 90a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen */ 91a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen public static boolean isVisualVoicemailUserSet(Context context, 92a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen PhoneAccountHandle phoneAccount) { 93a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen if (phoneAccount == null) { 94a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen return false; 95a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen } 96a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 97a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen return prefs.getBoolean( 98a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen getVisualVoicemailSharedPrefsKey(IS_USER_SET, phoneAccount), 99a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen false); 100a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen } 101a04959f74ba9009612804a4a5a5d8dd470969ddcNancy Chen 10257c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen public static void setVisualVoicemailCredentialsFromStatusMessage(Context context, 1039cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen PhoneAccountHandle phoneAccount, StatusMessage message) { 1049cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 1059cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen SharedPreferences.Editor editor = prefs.edit(); 1069cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen 1079cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen editor.putString( 1089cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen getVisualVoicemailSharedPrefsKey(OmtpConstants.IMAP_PORT, phoneAccount), 1099cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen message.getImapPort()); 1109cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen editor.putString( 1119cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen getVisualVoicemailSharedPrefsKey(OmtpConstants.SERVER_ADDRESS, phoneAccount), 1129cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen message.getServerAddress()); 1139cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen editor.putString( 1149cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen getVisualVoicemailSharedPrefsKey(OmtpConstants.IMAP_USER_NAME, phoneAccount), 1159cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen message.getImapUserName()); 1169cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen editor.putString( 1179cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen getVisualVoicemailSharedPrefsKey(OmtpConstants.IMAP_PASSWORD, phoneAccount), 1189cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen message.getImapPassword()); 1199cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen editor.commit(); 1209cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen } 1219cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen 12257c59860b3737d7c3cd36455ad484c035c6c1dfbNancy Chen public static String getVisualVoicemailCredentials(Context context, String key, 1239cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen PhoneAccountHandle phoneAccount) { 1249cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 1259cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen return prefs.getString(getVisualVoicemailSharedPrefsKey(key, phoneAccount), null); 1269cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen } 1279cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen 1286337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen public static long getVisualVoicemailRetryInterval(Context context, 1296337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen PhoneAccountHandle phoneAccount) { 1306337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 1316337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen return prefs.getLong(getVisualVoicemailSharedPrefsKey(SYNC_RETRY_INTERVAL, phoneAccount), 1326337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen DEFAULT_SYNC_RETRY_INTERVAL_MS); 1336337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen } 1346337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen 1356337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen public static void resetVisualVoicemailRetryInterval(Context context, 1366337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen PhoneAccountHandle phoneAccount) { 1376337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen setVisualVoicemailRetryInterval(context, phoneAccount, DEFAULT_SYNC_RETRY_INTERVAL_MS); 1386337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen } 1396337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen 1406337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen public static void setVisualVoicemailRetryInterval(Context context, 1416337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen PhoneAccountHandle phoneAccount, long interval) { 1426337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen SharedPreferences.Editor editor = 1436337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen PreferenceManager.getDefaultSharedPreferences(context).edit(); 1446337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen editor.putLong(getVisualVoicemailSharedPrefsKey(SYNC_RETRY_INTERVAL, phoneAccount), 1456337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen Math.min(interval, MAX_SYNC_RETRY_INTERVAL_MS)); 1466337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen editor.commit(); 1476337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen } 1486337d1be5db67c7b81e7998988ca53da50ab44c2Nancy Chen 1494406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen public static void setVisualVoicemailLastFullSyncTime(Context context, 1504406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen PhoneAccountHandle phoneAccount, long timestamp) { 1514406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen SharedPreferences.Editor editor = 1524406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen PreferenceManager.getDefaultSharedPreferences(context).edit(); 1534406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen editor.putLong(getVisualVoicemailSharedPrefsKey(LAST_FULL_SYNC_TIMESTAMP, phoneAccount), 1544406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen timestamp); 1554406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen editor.commit(); 1564406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen 1574406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen } 1584406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen 1594406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen public static long getVisualVoicemailLastFullSyncTime(Context context, 1604406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen PhoneAccountHandle phoneAccount) { 1614406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 1624406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen return prefs.getLong( 1634406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen getVisualVoicemailSharedPrefsKey(LAST_FULL_SYNC_TIMESTAMP, phoneAccount), 1644406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen NO_PRIOR_FULL_SYNC); 1654406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen } 1664406848c72d9d4f46e30842f434e6e27f4319503Nancy Chen 1671026b43f434926df8edf54cafe626d921cee6165Ta-wei Yen public static String getVisualVoicemailSharedPrefsKey(String key, 1689cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen PhoneAccountHandle phoneAccount) { 1699cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen return VISUAL_VOICEMAIL_SHARED_PREFS_KEY_PREFIX + key + "_" + phoneAccount.getId(); 1709cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen } 1719cc75becf6d2b474b319eeaa10ad16228355b806Nancy Chen} 172