Modify PhoneCapabilities for device capabilities

Support IRadioConfig getPhoneCapabilities_1_3
Created ModemFeatures LongDef and SlotType IntDef
Update old PhoneCapability methods to use new fields

Test: atest FrameworksTelephonyTests
Bug: 143238237
Bug: 143238191
Change-Id: Ic00bb3ba81d5460a04f08312fc9b90bf61cd4c6b
diff --git a/Android.bp b/Android.bp
index 21d4c0f..34c8a47 100644
--- a/Android.bp
+++ b/Android.bp
@@ -96,6 +96,7 @@
         "android.hardware.radio.config-V1.0-java-shallow",
         "android.hardware.radio.config-V1.1-java-shallow",
         "android.hardware.radio.config-V1.2-java-shallow",
+        "android.hardware.radio.config-V1.3-java-shallow",
         "android.hardware.radio.deprecated-V1.0-java-shallow",
         "ecc-protos-lite",
         "libphonenumber-nogeocoder",
diff --git a/src/java/com/android/internal/telephony/CellularNetworkValidator.java b/src/java/com/android/internal/telephony/CellularNetworkValidator.java
index 0530312..4b8e102 100644
--- a/src/java/com/android/internal/telephony/CellularNetworkValidator.java
+++ b/src/java/com/android/internal/telephony/CellularNetworkValidator.java
@@ -102,7 +102,7 @@
      */
     public boolean isValidationFeatureSupported() {
         return PhoneConfigurationManager.getInstance().getCurrentPhoneCapability()
-                .validationBeforeSwitchSupported;
+                .getPsDataConnectionLingerTimeMillis() > 0;
     }
 
     @VisibleForTesting
diff --git a/src/java/com/android/internal/telephony/PhoneConfigurationManager.java b/src/java/com/android/internal/telephony/PhoneConfigurationManager.java
index 86ab72b..7a0614c 100644
--- a/src/java/com/android/internal/telephony/PhoneConfigurationManager.java
+++ b/src/java/com/android/internal/telephony/PhoneConfigurationManager.java
@@ -28,12 +28,12 @@
 import android.os.RegistrantList;
 import android.sysprop.TelephonyProperties;
 import android.telephony.PhoneCapability;
-import com.android.telephony.Rlog;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.telephony.Rlog;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -311,7 +311,7 @@
     }
 
     public int getNumberOfModemsWithSimultaneousDataConnections() {
-        return mStaticCapability.maxActiveData;
+        return mStaticCapability.getMaxActivePsVoice();
     }
 
     private void notifyCapabilityChanged() {
@@ -326,7 +326,7 @@
      */
     public void switchMultiSimConfig(int numOfSims) {
         log("switchMultiSimConfig: with numOfSims = " + numOfSims);
-        if (getStaticPhoneCapability().logicalModemList.size() < numOfSims) {
+        if (getStaticPhoneCapability().getLogicalModemUuids().size() < numOfSims) {
             log("switchMultiSimConfig: Phone is not capable of enabling "
                     + numOfSims + " sims, exiting!");
             return;
diff --git a/src/java/com/android/internal/telephony/RadioConfig.java b/src/java/com/android/internal/telephony/RadioConfig.java
index 922aba7..24d79f2 100644
--- a/src/java/com/android/internal/telephony/RadioConfig.java
+++ b/src/java/com/android/internal/telephony/RadioConfig.java
@@ -38,15 +38,19 @@
 import android.os.Registrant;
 import android.os.RemoteException;
 import android.os.WorkSource;
-import com.android.telephony.Rlog;
+import android.telephony.PhoneCapability;
+import android.telephony.Rlog;
+import android.telephony.SimSlotCapability;
 import android.util.SparseArray;
 
 import com.android.internal.telephony.uicc.IccSlotStatus;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.Collectors;
 
 /**
  * This class provides wrapper APIs for IRadioConfig interface.
@@ -64,6 +68,8 @@
 
     private static final HalVersion RADIO_CONFIG_HAL_VERSION_1_1 = new HalVersion(1, 1);
 
+    private static final HalVersion RADIO_CONFIG_HAL_VERSION_1_3 = new HalVersion(1, 3);
+
     private final boolean mIsMobileNetworkSupported;
     private volatile IRadioConfig mRadioConfigProxy = null;
     // IRadioConfig version
@@ -340,11 +346,20 @@
             logd(rr.serialString() + "> " + requestToString(rr.mRequest));
         }
 
-        try {
-            ((android.hardware.radio.config.V1_1.IRadioConfig) mRadioConfigProxy)
-                    .getPhoneCapability(rr.mSerial);
-        } catch (RemoteException | RuntimeException e) {
-            resetProxyAndRequestList("getPhoneCapability", e);
+        if (mRadioConfigVersion.greaterOrEqual(RADIO_CONFIG_HAL_VERSION_1_3)) {
+            try {
+                ((android.hardware.radio.config.V1_3.IRadioConfig) mRadioConfigProxy)
+                        .getPhoneCapability_1_3(rr.mSerial);
+            } catch (RemoteException | RuntimeException e) {
+                resetProxyAndRequestList("getPhoneCapability_1_3", e);
+            }
+        } else {
+            try {
+                ((android.hardware.radio.config.V1_1.IRadioConfig) mRadioConfigProxy)
+                        .getPhoneCapability(rr.mSerial);
+            } catch (RemoteException | RuntimeException e) {
+                resetProxyAndRequestList("getPhoneCapability", e);
+            }
         }
     }
 
@@ -487,6 +502,49 @@
         return response;
     }
 
+    static PhoneCapability convertHalPhoneCapability(
+            android.hardware.radio.config.V1_1.PhoneCapability pc) {
+        long psDataConnectionLingerTimeMillis = pc.isInternetLingeringSupported ? 1 : 0;
+
+        List<String> logicalModemUuids = new ArrayList<>();
+        for (android.hardware.radio.config.V1_1.ModemInfo modemInfo : pc.logicalModemList) {
+            logicalModemUuids.add("com.xxxx.lm" + modemInfo.modemId);
+        }
+
+        List<List<Long>> features = new ArrayList<>();
+        for (int i = 0; i < pc.maxActiveData; i++) {
+            List<Long> feature = new ArrayList<>();
+            feature.add(PhoneCapability.MODEM_FEATURE_PS_VOICE_REG);
+            features.add(feature);
+        }
+
+        return new PhoneCapability(0, 0, 0, 0, psDataConnectionLingerTimeMillis, 0,
+                null, null, null, null, logicalModemUuids, null, features);
+    }
+
+    static PhoneCapability convertHalPhoneCapability_1_3(
+            android.hardware.radio.config.V1_3.PhoneCapability pc) {
+        List<SimSlotCapability> simSlotCapabilities = new ArrayList<>();
+        for (android.hardware.radio.config.V1_3.SimSlotCapability sc : pc.simSlotCapabilities) {
+            simSlotCapabilities.add(new SimSlotCapability(sc.physicalSlotId, sc.slotType));
+        }
+
+        List<List<Long>> features = new ArrayList<>();
+        for (android.hardware.radio.config.V1_3.ConcurrentModemFeatures cmf
+                : pc.concurrentFeatureSupport) {
+            features.add(cmf.modemFeatures
+                    .stream()
+                    .mapToLong(Integer::longValue)
+                    .boxed()
+                    .collect(Collectors.toList()));
+        }
+
+        return new PhoneCapability(pc.utranUeCategoryDl, pc.utranUeCategoryUl,
+                pc.eutranUeCategoryDl, pc.eutranUeCategoryUl, pc.psDataConnectionLingerTimeMillis,
+                pc.supportedRats, pc.geranBands, pc.utranBands, pc.eutranBands, pc.ngranBands,
+                pc.logicalModemUuids, simSlotCapabilities, features);
+    }
+
     private static void logd(String log) {
         Rlog.d(TAG, log);
     }
diff --git a/src/java/com/android/internal/telephony/RadioConfigResponse.java b/src/java/com/android/internal/telephony/RadioConfigResponse.java
index 8e509de..0f4a719 100644
--- a/src/java/com/android/internal/telephony/RadioConfigResponse.java
+++ b/src/java/com/android/internal/telephony/RadioConfigResponse.java
@@ -20,14 +20,12 @@
 import android.hardware.radio.V1_0.RadioResponseInfo;
 import android.hardware.radio.config.V1_1.ModemsConfig;
 import android.hardware.radio.config.V1_2.IRadioConfigResponse;
-import android.telephony.ModemInfo;
 import android.telephony.PhoneCapability;
-import com.android.telephony.Rlog;
 
 import com.android.internal.telephony.uicc.IccSlotStatus;
+import com.android.telephony.Rlog;
 
 import java.util.ArrayList;
-import java.util.List;
 
 /**
  * This class is the implementation of IRadioConfigResponse interface.
@@ -115,23 +113,6 @@
         }
     }
 
-    private PhoneCapability convertHalPhoneCapability(
-            android.hardware.radio.config.V1_1.PhoneCapability phoneCapability) {
-        // TODO b/121394331: clean up V1_1.PhoneCapability fields.
-        int maxActiveVoiceCalls = 0;
-        int maxActiveData = phoneCapability.maxActiveData;
-        int max5G = 0;
-        boolean validationBeforeSwitchSupported = phoneCapability.isInternetLingeringSupported;
-        List<ModemInfo> logicalModemList = new ArrayList();
-
-        for (android.hardware.radio.config.V1_1.ModemInfo
-                modemInfo : phoneCapability.logicalModemList) {
-            logicalModemList.add(new ModemInfo(modemInfo.modemId));
-        }
-
-        return new PhoneCapability(maxActiveVoiceCalls, maxActiveData, max5G, logicalModemList,
-                validationBeforeSwitchSupported);
-    }
     /**
      * Response function for IRadioConfig.getPhoneCapability().
      */
@@ -140,7 +121,7 @@
         RILRequest rr = mRadioConfig.processResponse(responseInfo);
 
         if (rr != null) {
-            PhoneCapability ret = convertHalPhoneCapability(phoneCapability);
+            PhoneCapability ret = RadioConfig.convertHalPhoneCapability(phoneCapability);
             if (responseInfo.error == RadioError.NONE) {
                 // send response
                 RadioResponse.sendMessageResponse(rr.mResult, ret);
@@ -158,6 +139,31 @@
     }
 
     /**
+     * Response function for IRadioConfig.getPhoneCapability_1_3().
+     */
+    public void getPhoneCapabilityResponse_1_3(RadioResponseInfo responseInfo,
+            android.hardware.radio.config.V1_3.PhoneCapability phoneCapability) {
+        RILRequest rr = mRadioConfig.processResponse(responseInfo);
+
+        if (rr != null) {
+            PhoneCapability ret = RadioConfig.convertHalPhoneCapability_1_3(phoneCapability);
+            if (responseInfo.error == RadioError.NONE) {
+                // send response
+                RadioResponse.sendMessageResponse(rr.mResult, ret);
+                Rlog.d(TAG, rr.serialString() + "< "
+                        + mRadioConfig.requestToString(rr.mRequest) + " " + ret.toString());
+            } else {
+                rr.onError(responseInfo.error, ret);
+                Rlog.e(TAG, rr.serialString() + "< "
+                        + mRadioConfig.requestToString(rr.mRequest) + " error "
+                        + responseInfo.error);
+            }
+        } else {
+            Rlog.e(TAG, "getPhoneCapabilityResponse_1_3: Error " + responseInfo.toString());
+        }
+    }
+
+    /**
      * Response function for IRadioConfig.setPreferredDataModem().
      */
     public void setPreferredDataModemResponse(RadioResponseInfo responseInfo) {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/CellularNetworkValidatorTest.java b/tests/telephonytests/src/com/android/internal/telephony/CellularNetworkValidatorTest.java
index 155e3ea..e564da5 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/CellularNetworkValidatorTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/CellularNetworkValidatorTest.java
@@ -46,9 +46,9 @@
     private CellularNetworkValidator mValidatorUT;
     private int mValidatedSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
     private static final PhoneCapability CAPABILITY_WITH_VALIDATION_SUPPORTED =
-            new PhoneCapability(1, 1, 0, null, true);
+            new PhoneCapability(0, 0, 0, 0, 1, 0, null, null, null, null, null, null, null);
     private static final PhoneCapability CAPABILITY_WITHOUT_VALIDATION_SUPPORTED =
-            new PhoneCapability(1, 1, 0, null, false);
+            new PhoneCapability(0, 0, 0, 0, 0, 0, null, null, null, null, null, null, null);
 
     CellularNetworkValidator.ValidationCallback mCallback = (validated, subId) -> {
         mValidated = validated;
@@ -75,7 +75,7 @@
      */
     @Test
     @SmallTest
-    public void testValidationSupported() throws Exception {
+    public void testValidationSupported() {
         doReturn(CAPABILITY_WITH_VALIDATION_SUPPORTED).when(mPhoneConfigurationManager)
                 .getCurrentPhoneCapability();
         assertTrue(mValidatorUT.isValidationFeatureSupported());
@@ -90,7 +90,7 @@
      */
     @Test
     @SmallTest
-    public void testValidateSuccess() throws Exception {
+    public void testValidateSuccess() {
         int subId = 1;
         int timeout = 1000;
         NetworkRequest expectedRequest = new NetworkRequest.Builder()
@@ -124,7 +124,7 @@
      */
     @Test
     @SmallTest
-    public void testValidateTimeout() throws Exception {
+    public void testValidateTimeout() {
         int subId = 1;
         int timeout = 100;
         NetworkRequest expectedRequest = new NetworkRequest.Builder()
@@ -159,7 +159,7 @@
      */
     @Test
     @SmallTest
-    public void testValidateFailure() throws Exception {
+    public void testValidateFailure() {
         int subId = 1;
         int timeout = 100;
         NetworkRequest expectedRequest = new NetworkRequest.Builder()
@@ -192,7 +192,7 @@
      */
     @Test
     @SmallTest
-    public void testNetworkAvailableNotValidated() throws Exception {
+    public void testNetworkAvailableNotValidated() {
         int subId = 1;
         int timeout = 100;
         NetworkRequest expectedRequest = new NetworkRequest.Builder()
diff --git a/tests/telephonytests/src/com/android/internal/telephony/PhoneCapabilityTest.java b/tests/telephonytests/src/com/android/internal/telephony/PhoneCapabilityTest.java
index a504dc1..53d80b2 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/PhoneCapabilityTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/PhoneCapabilityTest.java
@@ -20,9 +20,9 @@
 import static org.junit.Assert.assertNotEquals;
 
 import android.os.Parcel;
-import android.telephony.ModemInfo;
+import android.telephony.AccessNetworkConstants.AccessNetworkType;
 import android.telephony.PhoneCapability;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.telephony.SimSlotCapability;
 
 import org.junit.Test;
 
@@ -31,53 +31,108 @@
 
 public class PhoneCapabilityTest {
     @Test
-    @SmallTest
-    public void basicTests() throws Exception {
-        int maxActiveVoiceCalls = 1;
-        int maxActiveData = 2;
-        int max5G = 3;
-        ModemInfo modemInfo = new ModemInfo(1, 2, true, false);
-        List<ModemInfo> logicalModemList = new ArrayList<>();
-        logicalModemList.add(modemInfo);
+    public void basicTests() {
+        int utranUeCategoryDl = 1;
+        int utranUeCategoryUl = 2;
+        int eutranUeCategoryDl = 3;
+        int eutranUeCategoryUl = 4;
+        long lingerTime = 5;
+        long supportedRats = 6;
+        List<Integer> geranBands = new ArrayList<>();
+        geranBands.add(1);
+        List<Integer> utranBands = new ArrayList<>();
+        utranBands.add(2);
+        List<Integer> eutranBands = new ArrayList<>();
+        eutranBands.add(3);
+        List<Integer> ngranBands = new ArrayList<>();
+        ngranBands.add(4);
+        List<String> logicalModemUuids = new ArrayList<>();
+        logicalModemUuids.add("com.google.android.lm0");
+        List<SimSlotCapability> simSlotCapabilities = new ArrayList<>();
+        simSlotCapabilities.add(new SimSlotCapability(1, 2));
+        List<List<Long>> concurrentFeaturesSupport = new ArrayList<>();
+        List<Long> feature = new ArrayList<>();
+        feature.add(PhoneCapability.MODEM_FEATURE_CDMA2000_EHRPD_REG);
+        concurrentFeaturesSupport.add(feature);
 
-        PhoneCapability capability = new PhoneCapability(maxActiveVoiceCalls, maxActiveData, max5G,
-                logicalModemList, false);
+        PhoneCapability capability = new PhoneCapability(utranUeCategoryDl, utranUeCategoryUl,
+                eutranUeCategoryDl, eutranUeCategoryUl, lingerTime,
+                supportedRats, geranBands, utranBands, eutranBands, ngranBands, logicalModemUuids,
+                simSlotCapabilities, concurrentFeaturesSupport);
 
-        assertEquals(maxActiveVoiceCalls, capability.maxActiveVoiceCalls);
-        assertEquals(maxActiveData, capability.maxActiveData);
-        assertEquals(max5G, capability.max5G);
-        assertEquals(1, capability.logicalModemList.size());
-        assertEquals(modemInfo, capability.logicalModemList.get(0));
-        PhoneCapability toCompare = new PhoneCapability(
-                maxActiveVoiceCalls + 1, maxActiveData - 1, max5G, logicalModemList, false);
-        assertEquals(capability, new PhoneCapability(
-                maxActiveVoiceCalls, maxActiveData, max5G, logicalModemList, false));
+        assertEquals(utranUeCategoryDl, capability.getUeCategory(false, AccessNetworkType.UTRAN));
+        assertEquals(utranUeCategoryUl, capability.getUeCategory(true, AccessNetworkType.UTRAN));
+        assertEquals(eutranUeCategoryDl, capability.getUeCategory(false, AccessNetworkType.EUTRAN));
+        assertEquals(eutranUeCategoryUl, capability.getUeCategory(true, AccessNetworkType.EUTRAN));
+        assertEquals(lingerTime, capability.getPsDataConnectionLingerTimeMillis());
+        assertEquals(supportedRats, capability.getSupportedRats());
+        assertEquals(geranBands, capability.getBands(AccessNetworkType.GERAN));
+        assertEquals(utranBands, capability.getBands(AccessNetworkType.UTRAN));
+        assertEquals(eutranBands, capability.getBands(AccessNetworkType.EUTRAN));
+        assertEquals(ngranBands, capability.getBands(AccessNetworkType.NGRAN));
+        assertEquals(logicalModemUuids, capability.getLogicalModemUuids());
+        assertEquals(simSlotCapabilities, capability.getSimSlotCapabilities());
+        assertEquals(concurrentFeaturesSupport, capability.getConcurrentFeaturesSupport());
+
+        PhoneCapability toCompare = new PhoneCapability(utranUeCategoryDl + 1,
+                utranUeCategoryUl + 1, eutranUeCategoryDl + 1, eutranUeCategoryUl + 1,
+                lingerTime + 1, supportedRats + 1, geranBands, utranBands, eutranBands, ngranBands,
+                logicalModemUuids, simSlotCapabilities, concurrentFeaturesSupport);
+        assertEquals(capability, new PhoneCapability(utranUeCategoryDl, utranUeCategoryUl,
+                eutranUeCategoryDl, eutranUeCategoryUl, lingerTime,
+                supportedRats, geranBands, utranBands, eutranBands, ngranBands, logicalModemUuids,
+                simSlotCapabilities, concurrentFeaturesSupport));
         assertNotEquals(capability, toCompare);
     }
 
     @Test
-    @SmallTest
-    public void parcelReadWrite() throws Exception {
-        int maxActiveVoiceCalls = 1;
-        int maxActiveData = 2;
-        int max5G = 3;
-        ModemInfo modemInfo = new ModemInfo(1, 2, true, false);
-        List<ModemInfo> logicalModemList = new ArrayList<>();
-        logicalModemList.add(modemInfo);
+    public void parcelReadWrite() {
+        int utranUeCategoryDl = 1;
+        int utranUeCategoryUl = 2;
+        int eutranUeCategoryDl = 3;
+        int eutranUeCategoryUl = 4;
+        long lingerTime = 5;
+        long supportedRats = 6;
+        List<Integer> geranBands = new ArrayList<>();
+        geranBands.add(1);
+        List<Integer> utranBands = new ArrayList<>();
+        utranBands.add(2);
+        List<Integer> eutranBands = new ArrayList<>();
+        eutranBands.add(3);
+        List<Integer> ngranBands = new ArrayList<>();
+        ngranBands.add(4);
+        List<String> logicalModemUuids = new ArrayList<>();
+        logicalModemUuids.add("com.google.android.lm0");
+        List<SimSlotCapability> simSlotCapabilities = new ArrayList<>();
+        simSlotCapabilities.add(new SimSlotCapability(1, 2));
+        List<List<Long>> concurrentFeaturesSupport = new ArrayList<>();
+        List<Long> feature = new ArrayList<>();
+        feature.add(PhoneCapability.MODEM_FEATURE_NETWORK_SCAN);
+        concurrentFeaturesSupport.add(feature);
 
-        PhoneCapability capability = new PhoneCapability(maxActiveVoiceCalls, maxActiveData, max5G,
-                logicalModemList, false);
+        PhoneCapability capability = new PhoneCapability(utranUeCategoryDl, utranUeCategoryUl,
+                eutranUeCategoryDl, eutranUeCategoryUl, lingerTime,
+                supportedRats, geranBands, utranBands, eutranBands, ngranBands, logicalModemUuids,
+                simSlotCapabilities, concurrentFeaturesSupport);
 
         Parcel parcel = Parcel.obtain();
         capability.writeToParcel(parcel, 0);
         parcel.setDataPosition(0);
         PhoneCapability toCompare = PhoneCapability.CREATOR.createFromParcel(parcel);
 
-        assertEquals(maxActiveVoiceCalls, toCompare.maxActiveVoiceCalls);
-        assertEquals(maxActiveData, toCompare.maxActiveData);
-        assertEquals(max5G, toCompare.max5G);
-        assertEquals(1, toCompare.logicalModemList.size());
-        assertEquals(modemInfo, toCompare.logicalModemList.get(0));
+        assertEquals(utranUeCategoryDl, capability.getUeCategory(false, AccessNetworkType.UTRAN));
+        assertEquals(utranUeCategoryUl, capability.getUeCategory(true, AccessNetworkType.UTRAN));
+        assertEquals(eutranUeCategoryDl, capability.getUeCategory(false, AccessNetworkType.EUTRAN));
+        assertEquals(eutranUeCategoryUl, capability.getUeCategory(true, AccessNetworkType.EUTRAN));
+        assertEquals(lingerTime, capability.getPsDataConnectionLingerTimeMillis());
+        assertEquals(supportedRats, capability.getSupportedRats());
+        assertEquals(geranBands, capability.getBands(AccessNetworkType.GERAN));
+        assertEquals(utranBands, capability.getBands(AccessNetworkType.UTRAN));
+        assertEquals(eutranBands, capability.getBands(AccessNetworkType.EUTRAN));
+        assertEquals(ngranBands, capability.getBands(AccessNetworkType.NGRAN));
+        assertEquals(logicalModemUuids, capability.getLogicalModemUuids());
+        assertEquals(simSlotCapabilities, capability.getSimSlotCapabilities());
+        assertEquals(concurrentFeaturesSupport, capability.getConcurrentFeaturesSupport());
         assertEquals(capability, toCompare);
     }
 }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/PhoneSwitcherTest.java b/tests/telephonytests/src/com/android/internal/telephony/PhoneSwitcherTest.java
index 443eb4d..04d0c89 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/PhoneSwitcherTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/PhoneSwitcherTest.java
@@ -123,8 +123,8 @@
     @Before
     public void setUp() throws Exception {
         super.setUp(getClass().getSimpleName());
-
-        PhoneCapability phoneCapability = new PhoneCapability(1, 1, 0, null, false);
+        PhoneCapability phoneCapability = new PhoneCapability(0, 0, 0, 0, 0, 0,
+                null, null, null, null, null, null, null);
         doReturn(phoneCapability).when(mPhoneConfigurationManager).getCurrentPhoneCapability();
 
         doReturn(Call.State.ACTIVE).when(mActiveCall).getState();
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SimSlotCapabilityTest.java b/tests/telephonytests/src/com/android/internal/telephony/SimSlotCapabilityTest.java
new file mode 100644
index 0000000..8763c82
--- /dev/null
+++ b/tests/telephonytests/src/com/android/internal/telephony/SimSlotCapabilityTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2019 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.internal.telephony;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.os.Parcel;
+import android.telephony.SimSlotCapability;
+
+import org.junit.Test;
+
+public class SimSlotCapabilityTest {
+    @Test
+    public void basicTests() {
+        int physicalSlotId = 0;
+        int slotType = SimSlotCapability.SLOT_TYPE_UICC;
+
+        SimSlotCapability capability = new SimSlotCapability(physicalSlotId, slotType);
+        assertEquals(physicalSlotId, capability.getPhysicalSlotIndex());
+        assertEquals(slotType, capability.getSlotType());
+
+        SimSlotCapability toCompare = new SimSlotCapability(physicalSlotId + 1,
+                SimSlotCapability.SLOT_TYPE_IUICC);
+        assertEquals(capability, new SimSlotCapability(physicalSlotId, slotType));
+        assertNotEquals(capability, toCompare);
+    }
+
+    @Test
+    public void parcelReadWrite() {
+        int physicalSlotId = 0;
+        int slotType = SimSlotCapability.SLOT_TYPE_EUICC;
+
+        SimSlotCapability capability = new SimSlotCapability(physicalSlotId, slotType);
+
+        Parcel parcel = Parcel.obtain();
+        capability.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        SimSlotCapability toCompare = SimSlotCapability.CREATOR.createFromParcel(parcel);
+
+        assertEquals(physicalSlotId, capability.getPhysicalSlotIndex());
+        assertEquals(slotType, capability.getSlotType());
+        assertEquals(capability, toCompare);
+    }
+}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/TelephonyRegistryTest.java b/tests/telephonytests/src/com/android/internal/telephony/TelephonyRegistryTest.java
index 0a40be4..9b2344c 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/TelephonyRegistryTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/TelephonyRegistryTest.java
@@ -129,16 +129,17 @@
         doReturn(mMockSubInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(anyInt());
         doReturn(0/*slotIndex*/).when(mMockSubInfo).getSimSlotIndex();
         // mTelephonyRegistry.listen with notifyNow = true should trigger callback immediately.
-        PhoneCapability phoneCapability = new PhoneCapability(1, 2, 3, null, false);
+        PhoneCapability phoneCapability = new PhoneCapability(1, 2, 3, 4, 5, 6,
+                null, null, null, null, null, null, null);
         mTelephonyRegistry.notifyPhoneCapabilityChanged(phoneCapability);
         mTelephonyRegistry.listenWithFeature(mContext.getOpPackageName(), mContext.getFeatureId(),
-                mPhoneStateListener.callback,
-                LISTEN_PHONE_CAPABILITY_CHANGE, true);
+                mPhoneStateListener.callback, LISTEN_PHONE_CAPABILITY_CHANGE, true);
         processAllMessages();
         assertEquals(phoneCapability, mPhoneCapability);
 
         // notifyPhoneCapabilityChanged with a new capability. Callback should be triggered.
-        phoneCapability = new PhoneCapability(3, 2, 2, null, false);
+        phoneCapability = new PhoneCapability(6, 5, 4, 3, 2, 1,
+                null, null, null, null, null, null, null);
         mTelephonyRegistry.notifyPhoneCapabilityChanged(phoneCapability);
         processAllMessages();
         assertEquals(phoneCapability, mPhoneCapability);