Merge "Identify MMI codes specific to some OEM devices via hard-coding."
diff --git a/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java b/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
index d88bac3..9929ddd 100644
--- a/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
+++ b/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
@@ -59,11 +59,10 @@
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.compat.telephony.TelephonyManagerCompat;
-import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.oem.MotorolaUtils;
+import com.android.dialer.oem.TranssionUtils;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.util.PermissionsUtil;
-import com.google.common.collect.ImmutableSet;
 import com.google.zxing.BarcodeFormat;
 import com.google.zxing.MultiFormatWriter;
 import com.google.zxing.WriterException;
@@ -73,15 +72,7 @@
 import java.util.Locale;
 
 /**
- * Helper class to listen for some magic character sequences that are handled specially by the
- * dialer.
- *
- * <p>Note the Phone app also handles these sequences too (in a couple of relatively obscure places
- * in the UI), so there's a separate version of this class under apps/Phone.
- *
- * <p>TODO: there's lots of duplicated code between this class and the corresponding class under
- * apps/Phone. Let's figure out a way to unify these two classes (in the framework? in a common
- * shared library?)
+ * Helper class to listen for some magic character sequences that are handled specially by Dialer.
  */
 public class SpecialCharSequenceMgr {
   private static final String TAG_SELECT_ACCT_FRAGMENT = "tag_select_acct_fragment";
@@ -94,9 +85,6 @@
   private static final String ADN_NAME_COLUMN_NAME = "name";
   private static final int ADN_QUERY_TOKEN = -1;
 
-  /** Comma separated MMI codes specific to OEM/device. */
-  @VisibleForTesting static final String CONFIG_OEM_MMI_CODES_CSV = "oem_mmi_codes_csv";
-
   /**
    * Remembers the previous {@link QueryHandler} and cancel the operation when needed, to prevent
    * possible crash.
@@ -158,6 +146,12 @@
    * @return true if a secret code was encountered and handled
    */
   static boolean handleSecretCode(Context context, String input) {
+    // Secret code specific to OEMs should be handled first.
+    if (TranssionUtils.isTranssionSecretCode(input)) {
+      TranssionUtils.handleTranssionSecretCode(context, input);
+      return true;
+    }
+
     // Secret codes are accessed by dialing *#*#<code>#*#* or "*#<code_starting_with_number>#"
     if (input.length() > 8 && input.startsWith("*#*#") && input.endsWith("#*#*")) {
       String secretCode = input.substring(4, input.length() - 4);
@@ -165,27 +159,10 @@
       return true;
     }
 
-    if (getOemSecretCodes(context).contains(input)) {
-      String secretCode = input.substring(2, input.length() - 1);
-      TelephonyManagerCompat.handleSecretCode(context, secretCode);
-      return true;
-    }
     return false;
   }
 
   /**
-   * Get the OEM codes from the config provider. The config provider should be aware of the device
-   * and manufacturer.
-   */
-  private static ImmutableSet<String> getOemSecretCodes(Context context) {
-    String csv = ConfigProviderBindings.get(context).getString(CONFIG_OEM_MMI_CODES_CSV, null);
-    if (TextUtils.isEmpty(csv)) {
-      return ImmutableSet.of();
-    }
-    return ImmutableSet.copyOf(csv.split(","));
-  }
-
-  /**
    * Handle ADN requests by filling in the SIM contact number into the requested EditText.
    *
    * <p>This code works alongside the Asynchronous query handler {@link QueryHandler} and query
diff --git a/java/com/android/dialer/oem/TranssionUtils.java b/java/com/android/dialer/oem/TranssionUtils.java
new file mode 100644
index 0000000..a0d3f2d
--- /dev/null
+++ b/java/com/android/dialer/oem/TranssionUtils.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2018 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.dialer.oem;
+
+import android.content.Context;
+import android.os.Build;
+import android.support.annotation.VisibleForTesting;
+import com.android.dialer.common.Assert;
+import com.android.dialer.compat.telephony.TelephonyManagerCompat;
+import com.google.common.collect.ImmutableSet;
+
+/** Utilities for Transsion devices. */
+public final class TranssionUtils {
+
+  @VisibleForTesting
+  public static final ImmutableSet<String> TRANSSION_DEVICE_MANUFACTURERS =
+      ImmutableSet.of("INFINIX MOBILITY LIMITED", "itel", "TECNO");
+
+  @VisibleForTesting
+  public static final ImmutableSet<String> TRANSSION_SECRET_CODES =
+      ImmutableSet.of("*#07#", "*#87#", "*#43#", "*#2727#", "*#88#");
+
+  private TranssionUtils() {}
+
+  /**
+   * Returns true if
+   *
+   * <ul>
+   *   <li>the device is a Transsion device, AND
+   *   <li>the input is a secret code for Transsion devices.
+   * </ul>
+   */
+  public static boolean isTranssionSecretCode(String input) {
+    return TRANSSION_DEVICE_MANUFACTURERS.contains(Build.MANUFACTURER)
+        && TRANSSION_SECRET_CODES.contains(input);
+  }
+
+  /**
+   * Handle a Transsion secret code by passing it to {@link
+   * TelephonyManagerCompat#handleSecretCode(Context, String)}.
+   *
+   * <p>Before calling this method, we must use {@link #isTranssionSecretCode(String)} to ensure the
+   * device is a Transsion device and the input is a valid Transsion secret code.
+   *
+   * <p>An exception will be thrown if either of the conditions above is not met.
+   */
+  public static void handleTranssionSecretCode(Context context, String input) {
+    Assert.checkState(isTranssionSecretCode(input));
+
+    TelephonyManagerCompat.handleSecretCode(context, getDigitsFromSecretCode(input));
+  }
+
+  private static String getDigitsFromSecretCode(String input) {
+    // We assume a valid secret code is of format "*#{[0-9]+}#".
+    Assert.checkArgument(input.length() > 3 && input.startsWith("*#") && input.endsWith("#"));
+
+    return input.substring(2, input.length() - 1);
+  }
+}