blob: 058f18ee71b7e5d6e30442698c4db7f51a2f12e6 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.phone.vvm;
import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.telephony.VisualVoicemailSmsFilterSettings;
import android.util.ArraySet;
import com.android.phone.vvm.RemoteVvmTaskManager;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* Stores the config values needed for visual voicemail sms filtering. The values from
* OmtpVvmCarrierConfigHelper are stored here during activation instead. These values are read and
* written through TelephonyManager.
*/
public class VisualVoicemailSmsFilterConfig {
private static final String VVM_SMS_FILTER_COFIG_SHARED_PREFS_KEY_PREFIX =
"vvm_sms_filter_config_";
private static final String ENABLED_KEY = "_enabled";
private static final String PREFIX_KEY = "_prefix";
private static final String ORIGINATING_NUMBERS_KEY = "_originating_numbers";
private static final String DESTINATION_PORT_KEY = "_destination_port";
private static final String DEFAULT_PACKAGE = "com.android.phone";
public static void enableVisualVoicemailSmsFilter(Context context, String callingPackage,
int subId,
VisualVoicemailSmsFilterSettings settings) {
new Editor(context, callingPackage, subId)
.setBoolean(ENABLED_KEY, true)
.setString(PREFIX_KEY, settings.clientPrefix)
.setStringList(ORIGINATING_NUMBERS_KEY, settings.originatingNumbers)
.setInt(DESTINATION_PORT_KEY, settings.destinationPort)
.apply();
}
public static void disableVisualVoicemailSmsFilter(Context context, String callingPackage,
int subId) {
new Editor(context, callingPackage, subId)
.setBoolean(ENABLED_KEY, false)
.apply();
}
public static VisualVoicemailSmsFilterSettings getActiveVisualVoicemailSmsFilterSettings(
Context context, int subId) {
ComponentName componentName = RemoteVvmTaskManager.getRemotePackage(context, subId);
String packageName;
if (componentName == null) {
packageName = DEFAULT_PACKAGE;
} else {
packageName = componentName.getPackageName();
}
return getVisualVoicemailSmsFilterSettings(
context,
packageName,
subId);
}
@Nullable
public static VisualVoicemailSmsFilterSettings getVisualVoicemailSmsFilterSettings(
Context context,
String packageName, int subId) {
Reader reader = new Reader(context, packageName, subId);
if (!reader.getBoolean(ENABLED_KEY, false)) {
return null;
}
return new VisualVoicemailSmsFilterSettings.Builder()
.setClientPrefix(reader.getString(PREFIX_KEY,
VisualVoicemailSmsFilterSettings.DEFAULT_CLIENT_PREFIX))
.setOriginatingNumbers(reader.getStringSet(ORIGINATING_NUMBERS_KEY,
VisualVoicemailSmsFilterSettings.DEFAULT_ORIGINATING_NUMBERS))
.setDestinationPort(reader.getInt(DESTINATION_PORT_KEY,
VisualVoicemailSmsFilterSettings.DEFAULT_DESTINATION_PORT))
.build();
}
private static SharedPreferences getSharedPreferences(Context context) {
return PreferenceManager
.getDefaultSharedPreferences(context.createDeviceProtectedStorageContext());
}
private static String makePerPhoneAccountKeyPrefix(String packageName, int subId) {
// subId is persistent across reboot and upgrade, but not across devices.
// ICC id is better as a key but it involves more trouble to get one as subId is more
// commonly passed around.
return VVM_SMS_FILTER_COFIG_SHARED_PREFS_KEY_PREFIX + packageName + "_"
+ subId;
}
private static class Editor {
private final SharedPreferences.Editor mPrefsEditor;
private final String mKeyPrefix;
public Editor(Context context, String packageName, int subId) {
mPrefsEditor = getSharedPreferences(context).edit();
mKeyPrefix = makePerPhoneAccountKeyPrefix(packageName, subId);
}
private Editor setInt(String key, int value) {
mPrefsEditor.putInt(makeKey(key), value);
return this;
}
private Editor setString(String key, String value) {
mPrefsEditor.putString(makeKey(key), value);
return this;
}
private Editor setBoolean(String key, boolean value) {
mPrefsEditor.putBoolean(makeKey(key), value);
return this;
}
private Editor setStringList(String key, List<String> value) {
mPrefsEditor.putStringSet(makeKey(key), new ArraySet(value));
return this;
}
public void apply() {
mPrefsEditor.apply();
}
private String makeKey(String key) {
return mKeyPrefix + key;
}
}
private static class Reader {
private final SharedPreferences mPrefs;
private final String mKeyPrefix;
public Reader(Context context, String packageName, int subId) {
mPrefs = getSharedPreferences(context);
mKeyPrefix = makePerPhoneAccountKeyPrefix(packageName, subId);
}
private int getInt(String key, int defaultValue) {
return mPrefs.getInt(makeKey(key), defaultValue);
}
private String getString(String key, String defaultValue) {
return mPrefs.getString(makeKey(key), defaultValue);
}
private boolean getBoolean(String key, boolean defaultValue) {
return mPrefs.getBoolean(makeKey(key), defaultValue);
}
private List<String> getStringSet(String key, List<String> defaultValue) {
Set<String> result = mPrefs.getStringSet(makeKey(key), null);
if (result == null) {
return defaultValue;
}
return new ArrayList<>(result);
}
private String makeKey(String key) {
return mKeyPrefix + key;
}
}
}