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