Switch VVM SMS filter to Builder pattern

Bug:27816386
Change-Id: Ia15303fc680671f14ac41179c620f4dd873143ab
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 68ab937..4c9700d 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -52,9 +52,9 @@
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.telephony.ModemActivityInfo;
 import android.telephony.TelephonyHistogram;
+import android.telephony.TelephonyManager;
+import android.telephony.VisualVoicemailSmsFilterSettings;
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.Log;
@@ -74,7 +74,6 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.ProxyController;
-import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.RIL;
 import com.android.internal.telephony.RILConstants;
 import com.android.internal.telephony.SubscriptionController;
@@ -1832,55 +1831,36 @@
     }
 
     @Override
-    public void setVisualVoicemailSmsFilterEnabled(int subId, boolean value) {
+    public void enableVisualVoicemailSmsFilter(String callingPackage, int subId,
+            VisualVoicemailSmsFilterSettings settings) {
+        mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
         VisualVoicemailSmsFilterConfig
-                .setVisualVoicemailSmsFilterEnabled(mPhone.getContext(), subId, value);
+                .enableVisualVoicemailSmsFilter(mPhone.getContext(), callingPackage, subId,
+                        settings);
     }
 
     @Override
-    public boolean isVisualVoicemailSmsFilterEnabled(String packageName, int subId) {
-        return VisualVoicemailSmsFilterConfig
-                .isVisualVoicemailSmsFilterEnabled(mPhone.getContext(), packageName, subId);
-    }
-
-    @Override
-    public void setVisualVoicemailSmsFilterClientPrefix(int subId, String prefix) {
+    public void disableVisualVoicemailSmsFilter(String callingPackage, int subId) {
+        mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
         VisualVoicemailSmsFilterConfig
-                .setVisualVoicemailSmsFilterClientPrefix(mPhone.getContext(), subId, prefix);
+                .disableVisualVoicemailSmsFilter(mPhone.getContext(), callingPackage, subId);
     }
 
     @Override
-    public String getVisualVoicemailSmsFilterClientPrefix(String packageName, int subId) {
+    public VisualVoicemailSmsFilterSettings getVisualVoicemailSmsFilterSettings(
+            String callingPackage, int subId) {
+        mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
         return VisualVoicemailSmsFilterConfig
-                .getVisualVoicemailSmsFilterClientPrefix(mPhone.getContext(), packageName, subId);
+                .getVisualVoicemailSmsFilterSettings(mPhone.getContext(), callingPackage, subId);
     }
 
     @Override
-    public void setVisualVoicemailSmsFilterOriginatingNumbers(int subId, String[] numbers) {
-        VisualVoicemailSmsFilterConfig
-                .setVisualVoicemailSmsFilterOriginatingNumbers(mPhone.getContext(), subId, numbers);
-    }
-
-    @Override
-    public String[] getVisualVoicemailSmsFilterOriginatingNumbers(String packageName, int subId) {
+    public VisualVoicemailSmsFilterSettings getSystemVisualVoicemailSmsFilterSettings(
+            String packageName, int subId) {
+        enforceReadPrivilegedPermission();
         return VisualVoicemailSmsFilterConfig
-                .getVisualVoicemailSmsFilterOriginatingNumbers(mPhone.getContext(), packageName,
-                        subId);
+                .getVisualVoicemailSmsFilterSettings(mPhone.getContext(), packageName, subId);
     }
-
-    @Override
-    public void setVisualVoicemailSmsFilterDestinationPort(int subId, int port) {
-        VisualVoicemailSmsFilterConfig
-                .setVisualVoicemailSmsFilterDestinationPort(mPhone.getContext(), subId, port);
-    }
-
-    @Override
-    public int getVisualVoicemailSmsFilterDestinationPort(String packageName, int subId) {
-        return VisualVoicemailSmsFilterConfig
-                .getVisualVoicemailSmsFilterDestinationPort(mPhone.getContext(), packageName,
-                        subId);
-    }
-
     /**
      * Returns the unread count of voicemails
      */
diff --git a/src/com/android/phone/VisualVoicemailSmsFilterConfig.java b/src/com/android/phone/VisualVoicemailSmsFilterConfig.java
index e0139ee..2b2e2f5 100644
--- a/src/com/android/phone/VisualVoicemailSmsFilterConfig.java
+++ b/src/com/android/phone/VisualVoicemailSmsFilterConfig.java
@@ -15,13 +15,15 @@
  */
 package com.android.phone;
 
+import android.annotation.Nullable;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.preference.PreferenceManager;
-import android.telephony.TelephonyManager;
+import android.telephony.VisualVoicemailSmsFilterSettings;
 import android.util.ArraySet;
 
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -38,104 +40,126 @@
     private static final String ORIGINATING_NUMBERS_KEY = "_originating_numbers";
     private static final String DESTINATION_PORT_KEY = "_destination_port";
 
-    public static void setVisualVoicemailSmsFilterEnabled(Context context, int subId,
-            boolean value) {
-        setBoolean(context, subId, ENABLED_KEY, value);
+    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 boolean isVisualVoicemailSmsFilterEnabled(Context context, String packageName,
+    public static void disableVisualVoicemailSmsFilter(Context context, String callingPackage,
             int subId) {
-        return getBoolean(context, packageName, subId, ENABLED_KEY);
+        new Editor(context, callingPackage, subId)
+                .setBoolean(ENABLED_KEY, false)
+                .apply();
     }
 
-    public static void setVisualVoicemailSmsFilterClientPrefix(Context context, int subId,
-            String prefix) {
-        setString(context, subId, PREFIX_KEY, prefix);
-    }
-
-    public static String getVisualVoicemailSmsFilterClientPrefix(Context context,
+    @Nullable
+    public static VisualVoicemailSmsFilterSettings getVisualVoicemailSmsFilterSettings(
+            Context context,
             String packageName, int subId) {
-        return getString(context, packageName, subId, PREFIX_KEY);
+        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();
     }
-
-    public static void setVisualVoicemailSmsFilterOriginatingNumbers(Context context, int subId,
-            String[] numbers) {
-        ArraySet<String> set = new ArraySet<>();
-        set.addAll(Arrays.asList(numbers));
-        setStringSet(context, subId, ORIGINATING_NUMBERS_KEY, set);
-    }
-
-    public static String[] getVisualVoicemailSmsFilterOriginatingNumbers(Context context,
-            String packageName, int subId) {
-        Set<String> numbers = getStringSet(context, packageName, subId, ORIGINATING_NUMBERS_KEY);
-        return numbers.toArray(new String[numbers.size()]);
-    }
-
-    public static void setVisualVoicemailSmsFilterDestinationPort(Context context, int subId,
-            int port) {
-        setInt(context, subId, DESTINATION_PORT_KEY, port);
-    }
-
-    public static int getVisualVoicemailSmsFilterDestinationPort(Context context,
-            String packageName, int subId) {
-        return getInt(context, packageName, subId, DESTINATION_PORT_KEY,
-                TelephonyManager.VVM_SMS_FILTER_DESTINATION_PORT_ANY);
-    }
-
-    private static int getInt(Context context, String packageName, int subId, String key,
-            int defaultValue) {
-        SharedPreferences prefs = getSharedPreferences(context);
-        return prefs.getInt(makePerPhoneAccountKey(packageName, subId, key), defaultValue);
-    }
-
-    private static void setInt(Context context, int subId, String key, int value) {
-        SharedPreferences.Editor editor = getSharedPreferences(context).edit();
-        editor.putInt(makePerPhoneAccountKey(context.getOpPackageName(), subId, key), value);
-        editor.apply();
-    }
-
-    private static boolean getBoolean(Context context, String packageName, int subId, String key) {
-        SharedPreferences prefs = getSharedPreferences(context);
-        return prefs.getBoolean(makePerPhoneAccountKey(packageName, subId, key), false);
-    }
-
-    private static void setBoolean(Context context, int subId, String key, boolean value) {
-        SharedPreferences.Editor editor = getSharedPreferences(context).edit();
-        editor.putBoolean(makePerPhoneAccountKey(context.getOpPackageName(), subId, key), value);
-        editor.apply();
-    }
-
-    private static String getString(Context context, String packageName, int subId, String key) {
-        SharedPreferences prefs = getSharedPreferences(context);
-        return prefs.getString(makePerPhoneAccountKey(packageName, subId, key), null);
-    }
-
-    private static void setString(Context context, int subId, String key, String value) {
-        SharedPreferences.Editor editor = getSharedPreferences(context).edit();
-        editor.putString(makePerPhoneAccountKey(context.getOpPackageName(), subId, key), value);
-        editor.apply();
-    }
-
-    private static Set<String> getStringSet(Context context, String packageName, int subId,
-            String key) {
-        return getSharedPreferences(context)
-                .getStringSet(makePerPhoneAccountKey(packageName, subId, key), null);
-    }
-
-    private static void setStringSet(Context context, int subId, String key, Set<String> value) {
-        SharedPreferences.Editor editor = getSharedPreferences(context).edit();
-        editor.putStringSet(makePerPhoneAccountKey(context.getOpPackageName(), subId, key), value);
-        editor.apply();
-    }
-
     private static SharedPreferences getSharedPreferences(Context context) {
         return PreferenceManager
                 .getDefaultSharedPreferences(context.createDeviceProtectedStorageContext());
     }
 
-    private static String makePerPhoneAccountKey(String packageName, int subId, String key) {
-        // TODO: make sure subId is persistent enough to serve as a key
+    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 + key;
+                + 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;
+        }
     }
 }
diff --git a/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java b/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java
index df706d5..7abf299 100644
--- a/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java
+++ b/src/com/android/phone/vvm/omtp/OmtpVvmCarrierConfigHelper.java
@@ -23,6 +23,7 @@
 import android.telephony.SmsManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.VisualVoicemailSmsFilterSettings;
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.Log;
@@ -250,8 +251,9 @@
 
     public void startActivation() {
         TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
-        telephonyManager.setVisualVoicemailSmsFilterEnabled(mSubId, true);
-        telephonyManager.setVisualVoicemailSmsFilterClientPrefix(mSubId, getClientPrefix());
+        telephonyManager.enableVisualVoicemailSmsFilter(mSubId,
+                new VisualVoicemailSmsFilterSettings.Builder().setClientPrefix(getClientPrefix())
+                        .build());
 
         OmtpMessageSender messageSender = getMessageSender();
         if (messageSender != null) {
@@ -262,7 +264,7 @@
 
     public void startDeactivation() {
         mContext.getSystemService(TelephonyManager.class)
-                .setVisualVoicemailSmsFilterEnabled(mSubId, false);
+                .disableVisualVoicemailSmsFilter(mSubId);
         OmtpMessageSender messageSender = getMessageSender();
         if (messageSender != null) {
             Log.i(TAG, "Requesting VVM deactivation for subId: " + mSubId);