Adding the ability for carrier app to override SPN and carrier name.

The change allows system apps (holding MODIFY_PHONE_STATE permission) or
carrier apps to override the "carrier branding" on a per ICCID basis. The
override affects the service provider name as well as the network operator
name. The override is also saved as a SharedPreference and will persist for
the iccId across reboots.

Change-Id: I985ba247e10e2501e3d0d21567ccadc46f365879
diff --git a/api/current.txt b/api/current.txt
index d35610b..d9e3308 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -29007,6 +29007,7 @@
     method public boolean setCdmaSubscription(int);
     method public void setLine1NumberForDisplay(java.lang.String, java.lang.String);
     method public void setLine1NumberForDisplay(long, java.lang.String, java.lang.String);
+    method public boolean setOperatorBrandOverride(java.lang.String, java.lang.String);
     method public boolean setPreferredNetworkType(int);
     field public static final java.lang.String ACTION_PHONE_STATE_CHANGED = "android.intent.action.PHONE_STATE";
     field public static final java.lang.String ACTION_RESPOND_VIA_MESSAGE = "android.intent.action.RESPOND_VIA_MESSAGE";
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 5e6cb14..4cefb81 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -2935,6 +2935,34 @@
     }
 
     /**
+     * Override the branding for the input ICCID.
+     *
+     * Once set, whenever the ICCID is inserted into the device, the service
+     * provider name (SPN) and the operator name will both be replaced by the
+     * brand value input. To unset the value, the same function should be
+     * called with a null brand value.
+     *
+     * <p>Requires Permission:
+     *   {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
+     *  or has to be carrier app - see #hasCarrierPrivileges.
+     *
+     * @param iccId The ICCID of that the branding applies to.
+     * @param brand The brand name to display/set.
+     * @return true if the operation was executed correctly.
+     */
+    public boolean setOperatorBrandOverride(String iccId, String brand) {
+        // TODO: Validate ICCID format.
+        try {
+            return getITelephony().setOperatorBrandOverride(iccId, brand);
+        } catch (RemoteException ex) {
+            Rlog.e(TAG, "setOperatorBrandOverride RemoteException", ex);
+        } catch (NullPointerException ex) {
+            Rlog.e(TAG, "setOperatorBrandOverride NPE", ex);
+        }
+        return false;
+    }
+
+    /**
      * Expose the rest of ITelephony to @SystemApi
      */
 
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index d41ceda..435c334 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -706,5 +706,23 @@
      *         not set.
      */
     String getLine1AlphaTagForDisplay(long subId);
+
+    /**
+     * Override the operator branding for the input ICCID.
+     *
+     * Once set, whenever the ICCID is inserted into the device, the service
+     * provider name (SPN) and the operator name will both be replaced by the
+     * brand value input. To unset the value, the same function should be
+     * called with a null brand value.
+     *
+     * <p>Requires Permission:
+     *   {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
+     *  or has to be carrier app - see #hasCarrierPrivileges.
+     *
+     * @param iccid The ICCID of that the branding applies to.
+     * @param brand The brand name to display/set.
+     * @return true if the operation was executed correctly.
+     */
+    boolean setOperatorBrandOverride(String iccId, String brand);
 }