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 */
16package com.android.phone;
17
18import android.annotation.Nullable;
19import android.content.Context;
20import android.content.SharedPreferences;
21import android.preference.PreferenceManager;
22import android.telephony.VisualVoicemailSmsFilterSettings;
23import android.util.ArraySet;
24
25import java.util.ArrayList;
26import java.util.List;
27import java.util.Set;
28
29/**
30 * Stores the config values needed for visual voicemail sms filtering. The values from
31 * OmtpVvmCarrierConfigHelper are stored here during activation instead. These values are read and
32 * written through TelephonyManager.
33 */
34public class VisualVoicemailSmsFilterConfig {
35
36    private static final String VVM_SMS_FILTER_COFIG_SHARED_PREFS_KEY_PREFIX =
37            "vvm_sms_filter_config_";
38    private static final String ENABLED_KEY = "_enabled";
39    private static final String PREFIX_KEY = "_prefix";
40    private static final String ORIGINATING_NUMBERS_KEY = "_originating_numbers";
41    private static final String DESTINATION_PORT_KEY = "_destination_port";
42
43    public static void enableVisualVoicemailSmsFilter(Context context, String callingPackage,
44            int subId,
45            VisualVoicemailSmsFilterSettings settings) {
46        new Editor(context, callingPackage, subId)
47                .setBoolean(ENABLED_KEY, true)
48                .setString(PREFIX_KEY, settings.clientPrefix)
49                .setStringList(ORIGINATING_NUMBERS_KEY, settings.originatingNumbers)
50                .setInt(DESTINATION_PORT_KEY, settings.destinationPort)
51                .apply();
52    }
53
54    public static void disableVisualVoicemailSmsFilter(Context context, String callingPackage,
55            int subId) {
56        new Editor(context, callingPackage, subId)
57                .setBoolean(ENABLED_KEY, false)
58                .apply();
59    }
60
61    @Nullable
62    public static VisualVoicemailSmsFilterSettings getVisualVoicemailSmsFilterSettings(
63            Context context,
64            String packageName, int subId) {
65        Reader reader = new Reader(context, packageName, subId);
66        if (!reader.getBoolean(ENABLED_KEY, false)) {
67            return null;
68        }
69        return new VisualVoicemailSmsFilterSettings.Builder()
70                .setClientPrefix(reader.getString(PREFIX_KEY,
71                        VisualVoicemailSmsFilterSettings.DEFAULT_CLIENT_PREFIX))
72                .setOriginatingNumbers(reader.getStringSet(ORIGINATING_NUMBERS_KEY,
73                        VisualVoicemailSmsFilterSettings.DEFAULT_ORIGINATING_NUMBERS))
74                .setDestinationPort(reader.getInt(DESTINATION_PORT_KEY,
75                        VisualVoicemailSmsFilterSettings.DEFAULT_DESTINATION_PORT))
76                .build();
77    }
78    private static SharedPreferences getSharedPreferences(Context context) {
79        return PreferenceManager
80                .getDefaultSharedPreferences(context.createDeviceProtectedStorageContext());
81    }
82
83    private static String makePerPhoneAccountKeyPrefix(String packageName, int subId) {
84        // subId is persistent across reboot and upgrade, but not across devices.
85        // ICC id is better as a key but it involves more trouble to get one as subId is more
86        // commonly passed around.
87        return VVM_SMS_FILTER_COFIG_SHARED_PREFS_KEY_PREFIX + packageName + "_"
88                + subId;
89    }
90
91    private static class Editor {
92
93        private final SharedPreferences.Editor mPrefsEditor;
94        private final String mKeyPrefix;
95
96        public Editor(Context context, String packageName, int subId) {
97            mPrefsEditor = getSharedPreferences(context).edit();
98            mKeyPrefix = makePerPhoneAccountKeyPrefix(packageName, subId);
99        }
100
101        private Editor setInt(String key, int value) {
102            mPrefsEditor.putInt(makeKey(key), value);
103            return this;
104        }
105
106        private Editor setString(String key, String value) {
107            mPrefsEditor.putString(makeKey(key), value);
108            return this;
109        }
110
111        private Editor setBoolean(String key, boolean value) {
112            mPrefsEditor.putBoolean(makeKey(key), value);
113            return this;
114        }
115
116        private Editor setStringList(String key, List<String> value) {
117            mPrefsEditor.putStringSet(makeKey(key), new ArraySet(value));
118            return this;
119        }
120
121        public void apply() {
122            mPrefsEditor.apply();
123        }
124
125        private String makeKey(String key) {
126            return mKeyPrefix + key;
127        }
128    }
129
130
131    private static class Reader {
132
133        private final SharedPreferences mPrefs;
134        private final String mKeyPrefix;
135
136        public Reader(Context context, String packageName, int subId) {
137            mPrefs = getSharedPreferences(context);
138            mKeyPrefix = makePerPhoneAccountKeyPrefix(packageName, subId);
139        }
140
141        private int getInt(String key, int defaultValue) {
142            return mPrefs.getInt(makeKey(key), defaultValue);
143        }
144
145        private String getString(String key, String defaultValue) {
146            return mPrefs.getString(makeKey(key), defaultValue);
147        }
148
149        private boolean getBoolean(String key, boolean defaultValue) {
150            return mPrefs.getBoolean(makeKey(key), defaultValue);
151        }
152
153        private List<String> getStringSet(String key, List<String> defaultValue) {
154            Set<String> result = mPrefs.getStringSet(makeKey(key), null);
155            if (result == null) {
156                return defaultValue;
157            }
158            return new ArrayList<>(result);
159        }
160
161        private String makeKey(String key) {
162            return mKeyPrefix + key;
163        }
164    }
165}
166