Loading src/java/com/android/internal/telephony/uicc/UiccCarrierPrivilegeRules.java +11 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import com.android.internal.telephony.CommandException; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; Loading Loading @@ -249,6 +250,16 @@ public class UiccCarrierPrivilegeRules extends Handler { return pkgNames; } /** * Returns list of access rules. */ public List<UiccAccessRule> getAccessRules() { if (mAccessRules == null) { return Collections.emptyList(); } return Collections.unmodifiableList(mAccessRules); } /** * Returns the status of the carrier privileges for the input certificate and package name. * Loading src/java/com/android/internal/telephony/uicc/UiccProfile.java +44 −9 Original line number Diff line number Diff line Loading @@ -42,10 +42,13 @@ import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.UiccAccessRule; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.LocalLog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.IccCardConstants; Loading @@ -64,8 +67,8 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** Loading Loading @@ -1038,28 +1041,60 @@ public class UiccProfile extends Handler implements IccCard { } private Set<String> getUninstalledCarrierPackages() { String whitelistSetting = Settings.Global.getString(mContext.getContentResolver(), String whitelistSetting = Settings.Global.getString( mContext.getContentResolver(), Settings.Global.CARRIER_APP_WHITELIST); if (TextUtils.isEmpty(whitelistSetting)) { return Collections.emptySet(); } HashSet<String> carrierAppSet = new HashSet<String>( Arrays.asList(whitelistSetting.split("\\s*;\\s*"))); if (carrierAppSet.isEmpty()) { Map<String, String> certPackageMap = parseToCertificateToPackageMap(whitelistSetting); if (certPackageMap.isEmpty()) { return Collections.emptySet(); } Set<String> uninstalledCarrierPackages = new ArraySet<>(); List<String> pkgNames = mCarrierPrivilegeRules.getPackageNames(); for (String pkgName : pkgNames) { if (!TextUtils.isEmpty(pkgName) && carrierAppSet.contains(pkgName) && !isPackageInstalled(mContext, pkgName)) { List<UiccAccessRule> accessRules = mCarrierPrivilegeRules.getAccessRules(); for (UiccAccessRule accessRule : accessRules) { String certHexString = accessRule.getCertificateHexString().toUpperCase(); String pkgName = certPackageMap.get(certHexString); if (!TextUtils.isEmpty(pkgName) && !isPackageInstalled(mContext, pkgName)) { uninstalledCarrierPackages.add(pkgName); } } return uninstalledCarrierPackages; } /** * Converts a string in the format: key1:value1;key2:value2... into a map where the keys are * hex representations of app certificates - all upper case - and the values are package names * @hide */ @VisibleForTesting public static Map<String, String> parseToCertificateToPackageMap(String whitelistSetting) { final String pairDelim = "\\s*;\\s*"; final String keyValueDelim = "\\s*:\\s*"; List<String> keyValuePairList = Arrays.asList(whitelistSetting.split(pairDelim)); if (keyValuePairList.isEmpty()) { return Collections.emptyMap(); } Map<String, String> map = new ArrayMap<>(keyValuePairList.size()); for (String keyValueString: keyValuePairList) { String[] keyValue = keyValueString.split(keyValueDelim); if (keyValue.length == 2) { map.put(keyValue[0].toUpperCase(), keyValue[1]); } else { loge("Incorrect length of key-value pair in carrier app whitelist map. " + "Length should be exactly 2"); } } return map; } /** * Check whether the specified type of application exists in the profile. * Loading tests/telephonytests/src/com/android/internal/telephony/uicc/UiccProfileTest.java +24 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.internal.telephony.uicc; import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; Loading @@ -42,6 +43,8 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import java.util.Map; public class UiccProfileTest extends TelephonyTest { private UiccProfile mUiccProfile; Loading Loading @@ -171,6 +174,27 @@ public class UiccProfileTest extends TelephonyTest { } } @Test public void testParseWhitelistMapFromString() { String whitelist = ""; Map<String, String> parsedMap = UiccProfile.parseToCertificateToPackageMap(whitelist); assertTrue(parsedMap.isEmpty()); whitelist = "nokey;value;separation"; parsedMap = UiccProfile.parseToCertificateToPackageMap(whitelist); assertTrue(parsedMap.isEmpty()); whitelist = "KEY1:value1"; parsedMap = UiccProfile.parseToCertificateToPackageMap(whitelist); assertEquals("value1", parsedMap.get("KEY1")); whitelist = "KEY1:value1; KEY2:value2 ;KEY3:value3"; parsedMap = UiccProfile.parseToCertificateToPackageMap(whitelist); assertEquals("value1", parsedMap.get("KEY1")); assertEquals("value2", parsedMap.get("KEY2")); assertEquals("value3", parsedMap.get("KEY3")); } @Test @SmallTest public void testUpdateUiccProfileApplication() { Loading Loading
src/java/com/android/internal/telephony/uicc/UiccCarrierPrivilegeRules.java +11 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import com.android.internal.telephony.CommandException; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; Loading Loading @@ -249,6 +250,16 @@ public class UiccCarrierPrivilegeRules extends Handler { return pkgNames; } /** * Returns list of access rules. */ public List<UiccAccessRule> getAccessRules() { if (mAccessRules == null) { return Collections.emptyList(); } return Collections.unmodifiableList(mAccessRules); } /** * Returns the status of the carrier privileges for the input certificate and package name. * Loading
src/java/com/android/internal/telephony/uicc/UiccProfile.java +44 −9 Original line number Diff line number Diff line Loading @@ -42,10 +42,13 @@ import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.UiccAccessRule; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.LocalLog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.IccCardConstants; Loading @@ -64,8 +67,8 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** Loading Loading @@ -1038,28 +1041,60 @@ public class UiccProfile extends Handler implements IccCard { } private Set<String> getUninstalledCarrierPackages() { String whitelistSetting = Settings.Global.getString(mContext.getContentResolver(), String whitelistSetting = Settings.Global.getString( mContext.getContentResolver(), Settings.Global.CARRIER_APP_WHITELIST); if (TextUtils.isEmpty(whitelistSetting)) { return Collections.emptySet(); } HashSet<String> carrierAppSet = new HashSet<String>( Arrays.asList(whitelistSetting.split("\\s*;\\s*"))); if (carrierAppSet.isEmpty()) { Map<String, String> certPackageMap = parseToCertificateToPackageMap(whitelistSetting); if (certPackageMap.isEmpty()) { return Collections.emptySet(); } Set<String> uninstalledCarrierPackages = new ArraySet<>(); List<String> pkgNames = mCarrierPrivilegeRules.getPackageNames(); for (String pkgName : pkgNames) { if (!TextUtils.isEmpty(pkgName) && carrierAppSet.contains(pkgName) && !isPackageInstalled(mContext, pkgName)) { List<UiccAccessRule> accessRules = mCarrierPrivilegeRules.getAccessRules(); for (UiccAccessRule accessRule : accessRules) { String certHexString = accessRule.getCertificateHexString().toUpperCase(); String pkgName = certPackageMap.get(certHexString); if (!TextUtils.isEmpty(pkgName) && !isPackageInstalled(mContext, pkgName)) { uninstalledCarrierPackages.add(pkgName); } } return uninstalledCarrierPackages; } /** * Converts a string in the format: key1:value1;key2:value2... into a map where the keys are * hex representations of app certificates - all upper case - and the values are package names * @hide */ @VisibleForTesting public static Map<String, String> parseToCertificateToPackageMap(String whitelistSetting) { final String pairDelim = "\\s*;\\s*"; final String keyValueDelim = "\\s*:\\s*"; List<String> keyValuePairList = Arrays.asList(whitelistSetting.split(pairDelim)); if (keyValuePairList.isEmpty()) { return Collections.emptyMap(); } Map<String, String> map = new ArrayMap<>(keyValuePairList.size()); for (String keyValueString: keyValuePairList) { String[] keyValue = keyValueString.split(keyValueDelim); if (keyValue.length == 2) { map.put(keyValue[0].toUpperCase(), keyValue[1]); } else { loge("Incorrect length of key-value pair in carrier app whitelist map. " + "Length should be exactly 2"); } } return map; } /** * Check whether the specified type of application exists in the profile. * Loading
tests/telephonytests/src/com/android/internal/telephony/uicc/UiccProfileTest.java +24 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.internal.telephony.uicc; import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; Loading @@ -42,6 +43,8 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import java.util.Map; public class UiccProfileTest extends TelephonyTest { private UiccProfile mUiccProfile; Loading Loading @@ -171,6 +174,27 @@ public class UiccProfileTest extends TelephonyTest { } } @Test public void testParseWhitelistMapFromString() { String whitelist = ""; Map<String, String> parsedMap = UiccProfile.parseToCertificateToPackageMap(whitelist); assertTrue(parsedMap.isEmpty()); whitelist = "nokey;value;separation"; parsedMap = UiccProfile.parseToCertificateToPackageMap(whitelist); assertTrue(parsedMap.isEmpty()); whitelist = "KEY1:value1"; parsedMap = UiccProfile.parseToCertificateToPackageMap(whitelist); assertEquals("value1", parsedMap.get("KEY1")); whitelist = "KEY1:value1; KEY2:value2 ;KEY3:value3"; parsedMap = UiccProfile.parseToCertificateToPackageMap(whitelist); assertEquals("value1", parsedMap.get("KEY1")); assertEquals("value2", parsedMap.get("KEY2")); assertEquals("value3", parsedMap.get("KEY3")); } @Test @SmallTest public void testUpdateUiccProfileApplication() { Loading