187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen/* 287c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * Copyright (C) 2016 The Android Open Source Project 387c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * 487c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * Licensed under the Apache License, Version 2.0 (the "License"); 587c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * you may not use this file except in compliance with the License. 687c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * You may obtain a copy of the License at 787c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * 887c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * http://www.apache.org/licenses/LICENSE-2.0 987c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * 1087c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * Unless required by applicable law or agreed to in writing, software 1187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * distributed under the License is distributed on an "AS IS" BASIS, 1287c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1387c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * See the License for the specific language governing permissions and 1487c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * limitations under the License. 1587c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen */ 16c890531fe977852dd19fc920b7719a03f3a31b3eTa-wei Yenpackage com.android.phone.vvm; 1787c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 18b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yenimport android.annotation.Nullable; 1930a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yenimport android.content.ComponentName; 2087c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yenimport android.content.Context; 2187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yenimport android.content.SharedPreferences; 2287c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yenimport android.preference.PreferenceManager; 23b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yenimport android.telephony.VisualVoicemailSmsFilterSettings; 2487c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yenimport android.util.ArraySet; 2587c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 2630a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yenimport com.android.phone.vvm.RemoteVvmTaskManager; 2730a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen 28b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yenimport java.util.ArrayList; 29b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yenimport java.util.List; 3087c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yenimport java.util.Set; 3187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 3287c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen/** 3387c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * Stores the config values needed for visual voicemail sms filtering. The values from 3487c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * OmtpVvmCarrierConfigHelper are stored here during activation instead. These values are read and 3587c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen * written through TelephonyManager. 3687c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen */ 3787c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yenpublic class VisualVoicemailSmsFilterConfig { 3887c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 3987c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen private static final String VVM_SMS_FILTER_COFIG_SHARED_PREFS_KEY_PREFIX = 4087c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen "vvm_sms_filter_config_"; 4187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen private static final String ENABLED_KEY = "_enabled"; 4287c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen private static final String PREFIX_KEY = "_prefix"; 4387c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen private static final String ORIGINATING_NUMBERS_KEY = "_originating_numbers"; 4487c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen private static final String DESTINATION_PORT_KEY = "_destination_port"; 4530a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen private static final String DEFAULT_PACKAGE = "com.android.phone"; 4687c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 47b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen public static void enableVisualVoicemailSmsFilter(Context context, String callingPackage, 48b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen int subId, 49b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen VisualVoicemailSmsFilterSettings settings) { 50b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen new Editor(context, callingPackage, subId) 51b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .setBoolean(ENABLED_KEY, true) 52b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .setString(PREFIX_KEY, settings.clientPrefix) 53b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .setStringList(ORIGINATING_NUMBERS_KEY, settings.originatingNumbers) 54b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .setInt(DESTINATION_PORT_KEY, settings.destinationPort) 55b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .apply(); 5687c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 5787c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 58b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen public static void disableVisualVoicemailSmsFilter(Context context, String callingPackage, 5987c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen int subId) { 60b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen new Editor(context, callingPackage, subId) 61b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .setBoolean(ENABLED_KEY, false) 62b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .apply(); 6387c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 6487c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 6530a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen public static VisualVoicemailSmsFilterSettings getActiveVisualVoicemailSmsFilterSettings( 6630a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen Context context, int subId) { 67527a9c05728cfcd4e1ae02689cface33101b0f54Ta-wei Yen ComponentName componentName = RemoteVvmTaskManager.getRemotePackage(context, subId); 6830a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen String packageName; 6930a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen if (componentName == null) { 7030a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen packageName = DEFAULT_PACKAGE; 7130a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } else { 7230a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen packageName = componentName.getPackageName(); 7330a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } 7430a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen return getVisualVoicemailSmsFilterSettings( 7530a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen context, 7630a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen packageName, 7730a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen subId); 7830a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen } 7930a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen 80b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen @Nullable 81b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen public static VisualVoicemailSmsFilterSettings getVisualVoicemailSmsFilterSettings( 82b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen Context context, 8387c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen String packageName, int subId) { 84b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen Reader reader = new Reader(context, packageName, subId); 85b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen if (!reader.getBoolean(ENABLED_KEY, false)) { 86b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return null; 87b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 88b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return new VisualVoicemailSmsFilterSettings.Builder() 89b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .setClientPrefix(reader.getString(PREFIX_KEY, 90b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen VisualVoicemailSmsFilterSettings.DEFAULT_CLIENT_PREFIX)) 91b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .setOriginatingNumbers(reader.getStringSet(ORIGINATING_NUMBERS_KEY, 92b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen VisualVoicemailSmsFilterSettings.DEFAULT_ORIGINATING_NUMBERS)) 93b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .setDestinationPort(reader.getInt(DESTINATION_PORT_KEY, 94b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen VisualVoicemailSmsFilterSettings.DEFAULT_DESTINATION_PORT)) 95090f695dfc6ffba32fb245b268c9f12a933a22dcTa-wei Yen .setPackageName(packageName) 96b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .build(); 9787c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 9830a69c89f180de2154e2f14d7e25d23eafa7a0c5Ta-wei Yen 99b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private static SharedPreferences getSharedPreferences(Context context) { 100b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return PreferenceManager 101b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen .getDefaultSharedPreferences(context.createDeviceProtectedStorageContext()); 10287c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 10387c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 104b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private static String makePerPhoneAccountKeyPrefix(String packageName, int subId) { 105b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen // subId is persistent across reboot and upgrade, but not across devices. 106b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen // ICC id is better as a key but it involves more trouble to get one as subId is more 107b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen // commonly passed around. 108b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return VVM_SMS_FILTER_COFIG_SHARED_PREFS_KEY_PREFIX + packageName + "_" 109b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen + subId; 11087c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 11187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 112b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private static class Editor { 11387c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 114b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private final SharedPreferences.Editor mPrefsEditor; 115b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private final String mKeyPrefix; 11687c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 117b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen public Editor(Context context, String packageName, int subId) { 118b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mPrefsEditor = getSharedPreferences(context).edit(); 119b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mKeyPrefix = makePerPhoneAccountKeyPrefix(packageName, subId); 120b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 12187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 122b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private Editor setInt(String key, int value) { 123b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mPrefsEditor.putInt(makeKey(key), value); 124b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return this; 125b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 12687c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 127b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private Editor setString(String key, String value) { 128b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mPrefsEditor.putString(makeKey(key), value); 129b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return this; 130b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 13187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 132b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private Editor setBoolean(String key, boolean value) { 133b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mPrefsEditor.putBoolean(makeKey(key), value); 134b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return this; 135b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 13687c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 137b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private Editor setStringList(String key, List<String> value) { 138b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mPrefsEditor.putStringSet(makeKey(key), new ArraySet(value)); 139b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return this; 140b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 14187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 142b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen public void apply() { 143b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mPrefsEditor.apply(); 144b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 14587c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 146b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private String makeKey(String key) { 147b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return mKeyPrefix + key; 148b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 14987c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 15087c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 15187c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 152b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private static class Reader { 15387c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen 154b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private final SharedPreferences mPrefs; 155b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private final String mKeyPrefix; 156b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen 157b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen public Reader(Context context, String packageName, int subId) { 158b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mPrefs = getSharedPreferences(context); 159b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen mKeyPrefix = makePerPhoneAccountKeyPrefix(packageName, subId); 160b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 161b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen 162b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private int getInt(String key, int defaultValue) { 163b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return mPrefs.getInt(makeKey(key), defaultValue); 164b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 165b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen 166b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private String getString(String key, String defaultValue) { 167b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return mPrefs.getString(makeKey(key), defaultValue); 168b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 169b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen 170b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private boolean getBoolean(String key, boolean defaultValue) { 171b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return mPrefs.getBoolean(makeKey(key), defaultValue); 172b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 173b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen 174b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private List<String> getStringSet(String key, List<String> defaultValue) { 175b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen Set<String> result = mPrefs.getStringSet(makeKey(key), null); 176b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen if (result == null) { 177b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return defaultValue; 178b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 179b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return new ArrayList<>(result); 180b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 181b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen 182b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen private String makeKey(String key) { 183b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen return mKeyPrefix + key; 184b692960e9db988bcd9a83036a39aba90baf00668Ta-wei Yen } 18587c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen } 18687c49844374decc60a4c0397c2b33e63b7d5548dTa-wei Yen} 187