Add setAllowedCarriers, getAllowedCarriers to Phone and RIL

Bug: 28564314
Change-Id: I52be8bc7b2f74af9af2a1e3364d4ea33bb806681
diff --git a/src/java/com/android/internal/telephony/CommandsInterface.java b/src/java/com/android/internal/telephony/CommandsInterface.java
index 3819953..dc7cf64 100644
--- a/src/java/com/android/internal/telephony/CommandsInterface.java
+++ b/src/java/com/android/internal/telephony/CommandsInterface.java
@@ -24,6 +24,9 @@
 
 import android.os.Message;
 import android.os.Handler;
+import android.service.carrier.CarrierIdentifier;
+
+import java.util.List;
 
 
 /**
@@ -2017,4 +2020,19 @@
      * @param result Callback message contains the modem activity information
      */
     public void getModemActivityInfo(Message result);
+
+    /**
+     * Set allowed carriers
+     *
+     * @param carriers Allowed carriers
+     * @param result Callback message contains the number of carriers set successfully
+     */
+    public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message result);
+
+    /**
+     * Get allowed carriers
+     *
+     * @param result Callback message contains the allowed carriers
+     */
+    public void getAllowedCarriers(Message result);
 }
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index df9b988..79a054b 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -35,6 +35,7 @@
 import android.os.SystemProperties;
 import android.preference.PreferenceManager;
 import android.provider.Settings;
+import android.service.carrier.CarrierIdentifier;
 import android.telecom.VideoProfile;
 import android.telephony.CellIdentityCdma;
 import android.telephony.CellInfo;
@@ -3162,6 +3163,20 @@
     }
 
     /**
+     * Set allowed carriers
+     */
+    public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message response) {
+        mCi.setAllowedCarriers(carriers, response);
+    }
+
+    /**
+     * Get allowed carriers
+     */
+    public void getAllowedCarriers(Message response) {
+        mCi.getAllowedCarriers(response);
+    }
+
+    /**
      * Returns the locale based on the carrier properties (such as {@code ro.carrier}) and
      * SIM preferences.
      */
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index 46d486b..bc94a63 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -45,6 +45,7 @@
 import android.os.PowerManager.WakeLock;
 import android.os.SystemClock;
 import android.provider.Settings.SettingNotFoundException;
+import android.service.carrier.CarrierIdentifier;
 import android.telephony.CellInfo;
 import android.telephony.NeighboringCellInfo;
 import android.telephony.PhoneNumberUtils;
@@ -89,6 +90,7 @@
 import java.util.Collections;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.List;
 import java.util.Random;
 
 /**
@@ -2798,6 +2800,8 @@
             case RIL_REQUEST_STOP_LCE: ret = responseLceStatus(p); break;
             case RIL_REQUEST_PULL_LCEDATA: ret = responseLceData(p); break;
             case RIL_REQUEST_GET_ACTIVITY_INFO: ret = responseActivityData(p); break;
+            case RIL_REQUEST_SET_ALLOWED_CARRIERS: ret = responseInts(p); break;
+            case RIL_REQUEST_GET_ALLOWED_CARRIERS: ret = responseCarrierIdentifiers(p); break;
             default:
                 throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest);
             //break;
@@ -4273,6 +4277,31 @@
                         idleModeTimeMs, txModeTimeMs, rxModeTimeMs, 0);
     }
 
+    private Object responseCarrierIdentifiers(Parcel p) {
+        List<CarrierIdentifier> retVal = new ArrayList<CarrierIdentifier>();
+        int len_allowed_carriers = p.readInt();
+        int len_excluded_carriers = p.readInt();
+        for (int i = 0; i < len_allowed_carriers; i++) {
+            String mcc = p.readString();
+            String mnc = p.readString();
+            String spn = null, imsi = null, gid1 = null, gid2 = null;
+            int matchType = p.readInt();
+            String matchData = p.readString();
+            if (matchType == CarrierIdentifier.MatchType.SPN) {
+                spn = matchData;
+            } else if (matchType == CarrierIdentifier.MatchType.IMSI_PREFIX) {
+                imsi = matchData;
+            } else if (matchType == CarrierIdentifier.MatchType.GID1) {
+                gid1 = matchData;
+            } else if (matchType == CarrierIdentifier.MatchType.GID2) {
+                gid2 = matchData;
+            }
+            retVal.add(new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2));
+        }
+        /* TODO: Handle excluded carriers */
+        return retVal;
+    }
+
     static String
     requestToString(int request) {
 /*
@@ -4416,6 +4445,8 @@
             case RIL_REQUEST_STOP_LCE: return "RIL_REQUEST_STOP_LCE";
             case RIL_REQUEST_PULL_LCEDATA: return "RIL_REQUEST_PULL_LCEDATA";
             case RIL_REQUEST_GET_ACTIVITY_INFO: return "RIL_REQUEST_GET_ACTIVITY_INFO";
+            case RIL_REQUEST_SET_ALLOWED_CARRIERS: return "RIL_REQUEST_SET_ALLOWED_CARRIERS";
+            case RIL_REQUEST_GET_ALLOWED_CARRIERS: return "RIL_REQUEST_GET_ALLOWED_CARRIERS";
             case RIL_RESPONSE_ACKNOWLEDGEMENT: return "RIL_RESPONSE_ACKNOWLEDGEMENT";
             default: return "<unknown request>";
         }
@@ -5072,4 +5103,47 @@
         msg.arg1 = rr.mSerial;
         mSender.sendMessageDelayed(msg, DEFAULT_BLOCKING_MESSAGE_RESPONSE_TIMEOUT_MS);
     }
+
+    @Override
+    public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message response) {
+        RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_ALLOWED_CARRIERS, response);
+        rr.mParcel.writeInt(carriers.size()); /* len_allowed_carriers */
+        rr.mParcel.writeInt(0); /* len_excluded_carriers */ /* TODO: add excluded carriers */
+        for (CarrierIdentifier ci : carriers) { /* allowed carriers */
+            rr.mParcel.writeString(ci.getMcc());
+            rr.mParcel.writeString(ci.getMnc());
+            int matchType = CarrierIdentifier.MatchType.ALL;
+            String matchData = null;
+            if (!TextUtils.isEmpty(ci.getSpn())) {
+                matchType = CarrierIdentifier.MatchType.SPN;
+                matchData = ci.getSpn();
+            } else if (!TextUtils.isEmpty(ci.getImsi())) {
+                matchType = CarrierIdentifier.MatchType.IMSI_PREFIX;
+                matchData = ci.getImsi();
+            } else if (!TextUtils.isEmpty(ci.getGid1())) {
+                matchType = CarrierIdentifier.MatchType.GID1;
+                matchData = ci.getGid1();
+            } else if (!TextUtils.isEmpty(ci.getGid2())) {
+                matchType = CarrierIdentifier.MatchType.GID2;
+                matchData = ci.getGid2();
+            }
+            rr.mParcel.writeInt(matchType);
+            rr.mParcel.writeString(matchData);
+        }
+        /* TODO: add excluded carriers */
+
+        if (RILJ_LOGD) {
+            riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+        }
+        send(rr);
+    }
+
+    @Override
+    public void getAllowedCarriers(Message response) {
+        RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_ALLOWED_CARRIERS, response);
+        if (RILJ_LOGD) {
+            riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+        }
+        send(rr);
+    }
 }
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
index bc3a1d8..7bfafc0 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.os.Handler;
 import android.os.Message;
+import android.service.carrier.CarrierIdentifier;
 
 import com.android.internal.telephony.BaseCommands;
 import com.android.internal.telephony.CommandsInterface;
@@ -28,6 +29,8 @@
 import com.android.internal.telephony.RadioCapability;
 import com.android.internal.telephony.UUSInfo;
 
+import java.util.List;
+
 /**
  * Volte doesn't need CommandsInterface. The class does nothing but made to work
  * with Phone's constructor.
@@ -624,4 +627,12 @@
     @Override
     public void getModemActivityInfo(Message result) {
     }
+
+    @Override
+    public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message result) {
+    }
+
+    @Override
+    public void getAllowedCarriers(Message result) {
+    }
 }
diff --git a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
index b68054c..934583c 100644
--- a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
+++ b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.os.Handler;
 import android.os.Message;
+import android.service.carrier.CarrierIdentifier;
 
 import com.android.internal.telephony.BaseCommands;
 import com.android.internal.telephony.CommandsInterface;
@@ -27,6 +28,8 @@
 import com.android.internal.telephony.dataconnection.DataProfile;
 import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
 
+import java.util.List;
+
 /**
  * SIP doesn't need CommandsInterface. The class does nothing but made to work
  * with Phone's constructor.
@@ -627,4 +630,12 @@
     public void getModemActivityInfo(Message result) {
     }
 
+    @Override
+    public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message result) {
+    }
+
+    @Override
+    public void getAllowedCarriers(Message result) {
+    }
+
 }
diff --git a/src/java/com/android/internal/telephony/test/SimulatedCommands.java b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
index 2b928ac..5f32ca1 100644
--- a/src/java/com/android/internal/telephony/test/SimulatedCommands.java
+++ b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
@@ -23,6 +23,7 @@
 import android.os.Message;
 import android.os.Parcel;
 import android.os.Registrant;
+import android.service.carrier.CarrierIdentifier;
 import android.telephony.CellInfo;
 import android.telephony.CellInfoGsm;
 import android.telephony.Rlog;
@@ -1947,6 +1948,16 @@
     }
 
     @Override
+    public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message result) {
+        unimplemented(result);
+    }
+
+    @Override
+    public void getAllowedCarriers(Message result) {
+        unimplemented(result);
+    }
+
+    @Override
     public void getRadioCapability(Message result) {
         SimulatedCommandsVerifier.getInstance().getRadioCapability(result);
         resultSuccess(result, new RadioCapability(0, 0, 0, 0xFFFF, null, 0));
diff --git a/src/java/com/android/internal/telephony/test/SimulatedCommandsVerifier.java b/src/java/com/android/internal/telephony/test/SimulatedCommandsVerifier.java
index 11f6d4a..20e6de8 100644
--- a/src/java/com/android/internal/telephony/test/SimulatedCommandsVerifier.java
+++ b/src/java/com/android/internal/telephony/test/SimulatedCommandsVerifier.java
@@ -18,6 +18,7 @@
 
 import android.os.Handler;
 import android.os.Message;
+import android.service.carrier.CarrierIdentifier;
 
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.RadioCapability;
@@ -26,6 +27,8 @@
 import com.android.internal.telephony.dataconnection.DataProfile;
 import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
 
+import java.util.List;
+
 public class SimulatedCommandsVerifier implements CommandsInterface {
     private static SimulatedCommandsVerifier sInstance;
 
@@ -1350,4 +1353,14 @@
     public void getModemActivityInfo(Message result) {
 
     }
+
+    @Override
+    public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message result) {
+
+    }
+
+    @Override
+    public void getAllowedCarriers(Message result) {
+
+    }
 }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/mocks/PhoneMock.java b/tests/telephonytests/src/com/android/internal/telephony/mocks/PhoneMock.java
index f1e54b2..2f9d581 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/mocks/PhoneMock.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/mocks/PhoneMock.java
@@ -26,6 +26,7 @@
 import android.os.RegistrantList;
 import android.net.LinkProperties;
 import android.net.NetworkCapabilities;
+import android.service.carrier.CarrierIdentifier;
 import android.telephony.CellInfo;
 import android.telephony.CellLocation;
 import android.telephony.DataConnectionRealTimeInfo;
@@ -993,6 +994,14 @@
         throw new RuntimeException("not implemented");
     }
 
+    public void setAllowedCarriers(List<CarrierIdentifier> carrierList, Message response) {
+        throw new RuntimeException("not implemented");
+    }
+
+    public void getAllowedCarriers(Message response) {
+        throw new RuntimeException("not implemented");
+    }
+
     public void startLceAfterRadioIsAvailable() {
         throw new RuntimeException("not implemented");
     }