Merge "IMS RCS UCE API Improvement"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 0d296b5..f12ac52 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -240,6 +240,10 @@
<!-- Needed to access TelephonyProvider SIMINFO table. -->
<uses-permission android:name="android.permission.ACCESS_TELEPHONY_SIMINFO_DB"/>
+ <permission android:name="com.android.phone.permission.ACCESS_LAST_KNOWN_CELL_ID"
+ android:label="Access last known cell identity."
+ android:protectionLevel="signature"/>
+
<application android:name="PhoneApp"
android:persistent="true"
android:label="@string/phoneAppLabel"
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 815f90e..7dbfea5 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -163,6 +163,7 @@
import com.android.internal.telephony.INumberVerificationCallback;
import com.android.internal.telephony.ITelephony;
import com.android.internal.telephony.IccCard;
+import com.android.internal.telephony.IccLogicalChannelRequest;
import com.android.internal.telephony.LocaleTracker;
import com.android.internal.telephony.NetworkScanRequestTracker;
import com.android.internal.telephony.OperatorInfo;
@@ -223,7 +224,7 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -706,7 +707,8 @@
case CMD_OPEN_CHANNEL:
request = (MainThreadRequest) msg.obj;
uiccPort = getUiccPortFromRequest(request);
- Pair<String, Integer> openChannelArgs = (Pair<String, Integer>) request.argument;
+ IccLogicalChannelRequest openChannelRequest =
+ (IccLogicalChannelRequest) request.argument;
if (uiccPort == null) {
loge("iccOpenLogicalChannel: No UICC");
request.result = new IccOpenLogicalChannelResponse(-1,
@@ -714,8 +716,8 @@
notifyRequester(request);
} else {
onCompleted = obtainMessage(EVENT_OPEN_CHANNEL_DONE, request);
- uiccPort.iccOpenLogicalChannel(openChannelArgs.first,
- openChannelArgs.second, onCompleted);
+ uiccPort.iccOpenLogicalChannel(openChannelRequest.aid,
+ openChannelRequest.p2, onCompleted);
}
break;
@@ -1510,9 +1512,9 @@
case CMD_SWITCH_SLOTS:
request = (MainThreadRequest) msg.obj;
- int[] physicalSlots = (int[]) request.argument;
+ List<UiccSlotMapping> slotMapping = (List<UiccSlotMapping>) request.argument;
onCompleted = obtainMessage(EVENT_SWITCH_SLOTS_DONE, request);
- UiccController.getInstance().switchSlots(physicalSlots, onCompleted);
+ UiccController.getInstance().switchSlots(slotMapping, onCompleted);
break;
case EVENT_SWITCH_SLOTS_DONE:
@@ -5081,10 +5083,13 @@
@Override
public int getDataNetworkTypeForSubscriber(int subId, String callingPackage,
String callingFeatureId) {
- if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
- mApp, subId, callingPackage, callingFeatureId,
- "getDataNetworkTypeForSubscriber")) {
- return TelephonyManager.NETWORK_TYPE_UNKNOWN;
+ String functionName = "getDataNetworkTypeForSubscriber";
+ if (!TelephonyPermissions.checkCallingOrSelfReadNonDangerousPhoneStateNoThrow(
+ mApp, functionName)) {
+ if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+ mApp, subId, callingPackage, callingFeatureId, functionName)) {
+ return TelephonyManager.NETWORK_TYPE_UNKNOWN;
+ }
}
final long identity = Binder.clearCallingIdentity();
@@ -5106,10 +5111,13 @@
@Override
public int getVoiceNetworkTypeForSubscriber(int subId, String callingPackage,
String callingFeatureId) {
- if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
- mApp, subId, callingPackage, callingFeatureId,
- "getDataNetworkTypeForSubscriber")) {
- return TelephonyManager.NETWORK_TYPE_UNKNOWN;
+ String functionName = "getVoiceNetworkTypeForSubscriber";
+ if (!TelephonyPermissions.checkCallingOrSelfReadNonDangerousPhoneStateNoThrow(
+ mApp, functionName)) {
+ if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+ mApp, subId, callingPackage, callingFeatureId, functionName)) {
+ return TelephonyManager.NETWORK_TYPE_UNKNOWN;
+ }
}
final long identity = Binder.clearCallingIdentity();
@@ -5243,51 +5251,55 @@
return TelephonyManager.WifiCallingChoices.ALWAYS_USE;
}
- private Phone getPhoneFromSlotIdOrThrowException(int slotIndex) {
- int phoneId = UiccController.getInstance().getPhoneIdFromSlotId(slotIndex);
+ private Phone getPhoneFromSlotPortIndexOrThrowException(int slotIndex, int portIndex) {
+ int phoneId = UiccController.getInstance().getPhoneIdFromSlotPortIndex(slotIndex,
+ portIndex);
if (phoneId == -1) {
- throw new IllegalArgumentException("Given slot index: " + slotIndex
- + " does not correspond to an active phone");
+ throw new IllegalArgumentException("Given slot index: " + slotIndex + " port index: "
+ + portIndex + " does not correspond to an active phone");
}
return PhoneFactory.getPhone(phoneId);
}
@Override
public IccOpenLogicalChannelResponse iccOpenLogicalChannel(
- int subId, String callingPackage, String aid, int p2) {
- TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
- mApp, subId, "iccOpenLogicalChannel");
- mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
- if (DBG) {
- log("iccOpenLogicalChannel: subId=" + subId + " aid=" + aid + " p2=" + p2);
- }
- return iccOpenLogicalChannelWithPermission(getPhoneFromSubId(subId), callingPackage, aid,
- p2);
+ @NonNull IccLogicalChannelRequest request) {
+ Phone phone = getPhoneFromValidIccLogicalChannelRequest(request,
+ /*message=*/ "iccOpenLogicalChannel");
+
+ if (DBG) log("iccOpenLogicalChannel: request=" + request);
+ // Verify that the callingPackage in the request belongs to the calling UID
+ mAppOps.checkPackage(Binder.getCallingUid(), request.callingPackage);
+
+ return iccOpenLogicalChannelWithPermission(phone, request);
}
-
- @Override
- public IccOpenLogicalChannelResponse iccOpenLogicalChannelBySlot(
- int slotIndex, String callingPackage, String aid, int p2) {
- enforceModifyPermission();
- mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
- if (DBG) {
- log("iccOpenLogicalChannelBySlot: slot=" + slotIndex + " aid=" + aid + " p2=" + p2);
+ private Phone getPhoneFromValidIccLogicalChannelRequest(
+ @NonNull IccLogicalChannelRequest request, String message) {
+ Phone phone;
+ if (request.subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+ mApp, request.subId, message);
+ phone = getPhoneFromSubId(request.subId);
+ } else if (request.slotIndex != SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
+ enforceModifyPermission();
+ phone = getPhoneFromSlotPortIndexOrThrowException(request.slotIndex, request.portIndex);
+ } else {
+ throw new IllegalArgumentException("Both subId and slotIndex in request are invalid.");
}
- return iccOpenLogicalChannelWithPermission(getPhoneFromSlotIdOrThrowException(slotIndex),
- callingPackage, aid, p2);
+ return phone;
}
private IccOpenLogicalChannelResponse iccOpenLogicalChannelWithPermission(Phone phone,
- String callingPackage, String aid, int p2) {
+ IccLogicalChannelRequest channelRequest) {
final long identity = Binder.clearCallingIdentity();
try {
- if (TextUtils.equals(ISDR_AID, aid)) {
+ if (TextUtils.equals(ISDR_AID, channelRequest.aid)) {
// Only allows LPA to open logical channel to ISD-R.
ComponentInfo bestComponent = EuiccConnector.findBestComponent(getDefaultPhone()
.getContext().getPackageManager());
- if (bestComponent == null
- || !TextUtils.equals(callingPackage, bestComponent.packageName)) {
+ if (bestComponent == null || !TextUtils.equals(channelRequest.callingPackage,
+ bestComponent.packageName)) {
loge("The calling package is not allowed to access ISD-R.");
throw new SecurityException(
"The calling package is not allowed to access ISD-R.");
@@ -5295,9 +5307,8 @@
}
IccOpenLogicalChannelResponse response = (IccOpenLogicalChannelResponse) sendRequest(
- CMD_OPEN_CHANNEL, new Pair<String, Integer>(aid, p2), phone,
- null /* workSource */);
- if (DBG) log("iccOpenLogicalChannelWithPermission: " + response);
+ CMD_OPEN_CHANNEL, channelRequest, phone, null /* workSource */);
+ if (DBG) log("iccOpenLogicalChannelWithPermission: response=" + response);
return response;
} finally {
Binder.restoreCallingIdentity(identity);
@@ -5305,30 +5316,25 @@
}
@Override
- public boolean iccCloseLogicalChannel(int subId, int channel) {
- TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
- mApp, subId, "iccCloseLogicalChannel");
- if (DBG) log("iccCloseLogicalChannel: subId=" + subId + " chnl=" + channel);
- return iccCloseLogicalChannelWithPermission(getPhoneFromSubId(subId), channel);
+ public boolean iccCloseLogicalChannel(@NonNull IccLogicalChannelRequest request) {
+ Phone phone = getPhoneFromValidIccLogicalChannelRequest(request,
+ /*message=*/"iccCloseLogicalChannel");
+
+ if (DBG) log("iccCloseLogicalChannel: request=" + request);
+
+ return iccCloseLogicalChannelWithPermission(phone, request);
}
- @Override
- public boolean iccCloseLogicalChannelBySlot(int slotIndex, int channel) {
- enforceModifyPermission();
- if (DBG) log("iccCloseLogicalChannelBySlot: slotIndex=" + slotIndex + " chnl=" + channel);
- return iccCloseLogicalChannelWithPermission(getPhoneFromSlotIdOrThrowException(slotIndex),
- channel);
- }
-
- private boolean iccCloseLogicalChannelWithPermission(Phone phone, int channel) {
+ private boolean iccCloseLogicalChannelWithPermission(Phone phone,
+ IccLogicalChannelRequest request) {
final long identity = Binder.clearCallingIdentity();
try {
- if (channel < 0) {
+ if (request.channel < 0) {
return false;
}
- Boolean success = (Boolean) sendRequest(CMD_CLOSE_CHANNEL, channel, phone,
+ Boolean success = (Boolean) sendRequest(CMD_CLOSE_CHANNEL, request.channel, phone,
null /* workSource */);
- if (DBG) log("iccCloseLogicalChannelWithPermission: " + success);
+ if (DBG) log("iccCloseLogicalChannelWithPermission: success=" + success);
return success;
} finally {
Binder.restoreCallingIdentity(identity);
@@ -5350,17 +5356,17 @@
}
@Override
- public String iccTransmitApduLogicalChannelBySlot(int slotIndex, int channel, int cla,
- int command, int p1, int p2, int p3, String data) {
+ public String iccTransmitApduLogicalChannelByPort(int slotIndex, int portIndex, int channel,
+ int cla, int command, int p1, int p2, int p3, String data) {
enforceModifyPermission();
if (DBG) {
- log("iccTransmitApduLogicalChannelBySlot: slotIndex=" + slotIndex + " chnl=" + channel
- + " cla=" + cla + " cmd=" + command + " p1=" + p1 + " p2=" + p2 + " p3="
- + p3 + " data=" + data);
+ log("iccTransmitApduLogicalChannelByPort: slotIndex=" + slotIndex + " portIndex="
+ + portIndex + " chnl=" + channel + " cla=" + cla + " cmd=" + command + " p1="
+ + p1 + " p2=" + p2 + " p3=" + p3 + " data=" + data);
}
return iccTransmitApduLogicalChannelWithPermission(
- getPhoneFromSlotIdOrThrowException(slotIndex), channel, cla, command, p1, p2, p3,
- data);
+ getPhoneFromSlotPortIndexOrThrowException(slotIndex, portIndex), channel, cla,
+ command, p1, p2, p3, data);
}
private String iccTransmitApduLogicalChannelWithPermission(Phone phone, int channel, int cla,
@@ -5403,19 +5409,19 @@
}
@Override
- public String iccTransmitApduBasicChannelBySlot(int slotIndex, String callingPackage, int cla,
- int command, int p1, int p2, int p3, String data) {
+ public String iccTransmitApduBasicChannelByPort(int slotIndex, int portIndex,
+ String callingPackage, int cla, int command, int p1, int p2, int p3, String data) {
enforceModifyPermission();
mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
if (DBG) {
- log("iccTransmitApduBasicChannelBySlot: slotIndex=" + slotIndex + " cla=" + cla
- + " cmd=" + command + " p1=" + p1 + " p2=" + p2 + " p3=" + p3
- + " data=" + data);
+ log("iccTransmitApduBasicChannelByPort: slotIndex=" + slotIndex + " portIndex="
+ + portIndex + " cla=" + cla + " cmd=" + command + " p1=" + p1 + " p2="
+ + p2 + " p3=" + p3 + " data=" + data);
}
return iccTransmitApduBasicChannelWithPermission(
- getPhoneFromSlotIdOrThrowException(slotIndex), callingPackage, cla, command, p1,
- p2, p3, data);
+ getPhoneFromSlotPortIndexOrThrowException(slotIndex, portIndex), callingPackage,
+ cla, command, p1, p2, p3, data);
}
// open APDU basic channel assuming the caller has sufficient permissions
@@ -6335,28 +6341,35 @@
* Starts a new network scan and returns the id of this scan.
*
* @param subId id of the subscription
+ * @param renounceFineLocationAccess Set this to true if the caller would not like to receive
+ * location related information which will be sent if the caller already possess
+ * {@android.Manifest.permission.ACCESS_FINE_LOCATION} and do not renounce the permission
* @param request contains the radio access networks with bands/channels to scan
* @param messenger callback messenger for scan results or errors
* @param binder for the purpose of auto clean when the user thread crashes
* @return the id of the requested scan which can be used to stop the scan.
*/
@Override
- public int requestNetworkScan(int subId, NetworkScanRequest request, Messenger messenger,
+ public int requestNetworkScan(int subId, boolean renounceFineLocationAccess,
+ NetworkScanRequest request, Messenger messenger,
IBinder binder, String callingPackage, String callingFeatureId) {
TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
mApp, subId, "requestNetworkScan");
LocationAccessPolicy.LocationPermissionResult locationResult =
- LocationAccessPolicy.checkLocationPermission(mApp,
- new LocationAccessPolicy.LocationPermissionQuery.Builder()
- .setCallingPackage(callingPackage)
- .setCallingFeatureId(callingFeatureId)
- .setCallingPid(Binder.getCallingPid())
- .setCallingUid(Binder.getCallingUid())
- .setMethod("requestNetworkScan")
- .setMinSdkVersionForFine(Build.VERSION_CODES.Q)
- .setMinSdkVersionForCoarse(Build.VERSION_CODES.Q)
- .setMinSdkVersionForEnforcement(Build.VERSION_CODES.Q)
- .build());
+ LocationAccessPolicy.LocationPermissionResult.DENIED_HARD;
+ if (!renounceFineLocationAccess) {
+ locationResult = LocationAccessPolicy.checkLocationPermission(mApp,
+ new LocationAccessPolicy.LocationPermissionQuery.Builder()
+ .setCallingPackage(callingPackage)
+ .setCallingFeatureId(callingFeatureId)
+ .setCallingPid(Binder.getCallingPid())
+ .setCallingUid(Binder.getCallingUid())
+ .setMethod("requestNetworkScan")
+ .setMinSdkVersionForFine(Build.VERSION_CODES.Q)
+ .setMinSdkVersionForCoarse(Build.VERSION_CODES.Q)
+ .setMinSdkVersionForEnforcement(Build.VERSION_CODES.Q)
+ .build());
+ }
if (locationResult != LocationAccessPolicy.LocationPermissionResult.ALLOWED) {
SecurityException e = checkNetworkRequestForSanitizedLocationAccess(
request, subId, callingPackage);
@@ -6374,7 +6387,7 @@
final long identity = Binder.clearCallingIdentity();
try {
return mNetworkScanRequestTracker.startNetworkScan(
- request, messenger, binder, getPhone(subId),
+ renounceFineLocationAccess, request, messenger, binder, getPhone(subId),
callingUid, callingPid, callingPackage);
} finally {
Binder.restoreCallingIdentity(identity);
@@ -6620,18 +6633,25 @@
* There are other factors deciding whether mobile data is actually enabled, but they are
* not considered here. See {@link #isDataEnabled(int)} for more details.
*
- * Accepts either ACCESS_NETWORK_STATE, MODIFY_PHONE_STATE or carrier privileges.
+ * Accepts either READ_BASIC_PHONE_STATE, ACCESS_NETWORK_STATE, MODIFY_PHONE_STATE
+ * or carrier privileges.
*
* @return {@code true} if data is enabled else {@code false}
*/
@Override
public boolean isUserDataEnabled(int subId) {
+ String functionName = "isUserDataEnabled";
try {
- mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE,
- null);
+ try {
+ mApp.enforceCallingOrSelfPermission(permission.READ_BASIC_PHONE_STATE,
+ functionName);
+ } catch (Exception e) {
+ mApp.enforceCallingOrSelfPermission(permission.ACCESS_NETWORK_STATE, functionName);
+ }
} catch (Exception e) {
TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
- mApp, subId, "isUserDataEnabled");
+ mApp, subId, functionName);
+
}
final long identity = Binder.clearCallingIdentity();
@@ -6661,27 +6681,39 @@
*/
@Override
public boolean isDataEnabled(int subId) {
+ String functionName = "isDataEnabled";
try {
try {
mApp.enforceCallingOrSelfPermission(
android.Manifest.permission.ACCESS_NETWORK_STATE,
- null);
+ functionName);
} catch (Exception e) {
- mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE,
- "isDataEnabled");
+ try {
+ mApp.enforceCallingOrSelfPermission(
+ android.Manifest.permission.READ_PHONE_STATE,
+ functionName);
+ } catch (Exception e2) {
+ mApp.enforceCallingOrSelfPermission(
+ permission.READ_BASIC_PHONE_STATE, functionName);
+ }
}
} catch (Exception e) {
- enforceReadPrivilegedPermission("isDataEnabled");
+ enforceReadPrivilegedPermission(functionName);
}
final long identity = Binder.clearCallingIdentity();
try {
int phoneId = mSubscriptionController.getPhoneId(subId);
- if (DBG) log("isDataEnabled: subId=" + subId + " phoneId=" + phoneId);
Phone phone = PhoneFactory.getPhone(phoneId);
if (phone != null) {
- boolean retVal = phone.getDataEnabledSettings().isDataEnabled();
- if (DBG) log("isDataEnabled: subId=" + subId + " retVal=" + retVal);
+ boolean retVal;
+ if (phone.isUsingNewDataStack()) {
+ retVal = phone.getDataNetworkController().getDataSettingsManager()
+ .isDataEnabled();
+ } else {
+ retVal = phone.getDataEnabledSettings().isDataEnabled();
+ }
+ if (DBG) log("isDataEnabled: " + retVal + ", subId=" + subId);
return retVal;
} else {
if (DBG) loge("isDataEnabled: no phone subId=" + subId + " retVal=false");
@@ -6701,12 +6733,24 @@
@Override
public boolean isDataEnabledForReason(int subId,
@TelephonyManager.DataEnabledReason int reason) {
+ String functionName = "isDataEnabledForReason";
try {
- mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE,
- null);
+ try {
+ mApp.enforceCallingOrSelfPermission(
+ android.Manifest.permission.ACCESS_NETWORK_STATE,
+ functionName);
+ } catch (Exception e) {
+ mApp.enforceCallingOrSelfPermission(permission.READ_BASIC_PHONE_STATE,
+ functionName);
+ }
} catch (Exception e) {
- mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE,
- "isDataEnabledForReason");
+ try {
+ mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE,
+ functionName);
+ } catch (Exception e2) {
+ TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+ mApp, subId, functionName);
+ }
}
@@ -7869,49 +7913,54 @@
}
/**
- * {@hide}
* Returns the service state information on specified subscription.
*/
@Override
- public ServiceState getServiceStateForSubscriber(int subId, String callingPackage,
- String callingFeatureId) {
+ public ServiceState getServiceStateForSubscriber(int subId,
+ boolean renounceFineLocationAccess, boolean renounceCoarseLocationAccess,
+ String callingPackage, String callingFeatureId) {
if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
mApp, subId, callingPackage, callingFeatureId, "getServiceStateForSubscriber")) {
return null;
}
- LocationAccessPolicy.LocationPermissionResult fineLocationResult =
- LocationAccessPolicy.checkLocationPermission(mApp,
- new LocationAccessPolicy.LocationPermissionQuery.Builder()
- .setCallingPackage(callingPackage)
- .setCallingFeatureId(callingFeatureId)
- .setCallingPid(Binder.getCallingPid())
- .setCallingUid(Binder.getCallingUid())
- .setMethod("getServiceStateForSubscriber")
- .setLogAsInfo(true)
- .setMinSdkVersionForFine(Build.VERSION_CODES.Q)
- .setMinSdkVersionForCoarse(Build.VERSION_CODES.Q)
- .setMinSdkVersionForEnforcement(Build.VERSION_CODES.Q)
- .build());
+ boolean hasFinePermission = false;
+ boolean hasCoarsePermission = false;
+ if (!renounceFineLocationAccess) {
+ LocationAccessPolicy.LocationPermissionResult fineLocationResult =
+ LocationAccessPolicy.checkLocationPermission(mApp,
+ new LocationAccessPolicy.LocationPermissionQuery.Builder()
+ .setCallingPackage(callingPackage)
+ .setCallingFeatureId(callingFeatureId)
+ .setCallingPid(Binder.getCallingPid())
+ .setCallingUid(Binder.getCallingUid())
+ .setMethod("getServiceStateForSubscriber")
+ .setLogAsInfo(true)
+ .setMinSdkVersionForFine(Build.VERSION_CODES.Q)
+ .setMinSdkVersionForCoarse(Build.VERSION_CODES.Q)
+ .setMinSdkVersionForEnforcement(Build.VERSION_CODES.Q)
+ .build());
+ hasFinePermission =
+ fineLocationResult == LocationAccessPolicy.LocationPermissionResult.ALLOWED;
+ }
- LocationAccessPolicy.LocationPermissionResult coarseLocationResult =
- LocationAccessPolicy.checkLocationPermission(mApp,
- new LocationAccessPolicy.LocationPermissionQuery.Builder()
- .setCallingPackage(callingPackage)
- .setCallingFeatureId(callingFeatureId)
- .setCallingPid(Binder.getCallingPid())
- .setCallingUid(Binder.getCallingUid())
- .setMethod("getServiceStateForSubscriber")
- .setLogAsInfo(true)
- .setMinSdkVersionForCoarse(Build.VERSION_CODES.Q)
- .setMinSdkVersionForFine(Integer.MAX_VALUE)
- .setMinSdkVersionForEnforcement(Build.VERSION_CODES.Q)
- .build());
- // We don't care about hard or soft here -- all we need to know is how much info to scrub.
- boolean hasFinePermission =
- fineLocationResult == LocationAccessPolicy.LocationPermissionResult.ALLOWED;
- boolean hasCoarsePermission =
- coarseLocationResult == LocationAccessPolicy.LocationPermissionResult.ALLOWED;
+ if (!renounceCoarseLocationAccess) {
+ LocationAccessPolicy.LocationPermissionResult coarseLocationResult =
+ LocationAccessPolicy.checkLocationPermission(mApp,
+ new LocationAccessPolicy.LocationPermissionQuery.Builder()
+ .setCallingPackage(callingPackage)
+ .setCallingFeatureId(callingFeatureId)
+ .setCallingPid(Binder.getCallingPid())
+ .setCallingUid(Binder.getCallingUid())
+ .setMethod("getServiceStateForSubscriber")
+ .setLogAsInfo(true)
+ .setMinSdkVersionForCoarse(Build.VERSION_CODES.Q)
+ .setMinSdkVersionForFine(Integer.MAX_VALUE)
+ .setMinSdkVersionForEnforcement(Build.VERSION_CODES.Q)
+ .build());
+ hasCoarsePermission =
+ coarseLocationResult == LocationAccessPolicy.LocationPermissionResult.ALLOWED;
+ }
final Phone phone = getPhone(subId);
if (phone == null) {
@@ -8633,6 +8682,7 @@
*
* <p>Requires one of the following permissions:
* {@link android.Manifest.permission#ACCESS_NETWORK_STATE},
+ * {@link android.Manifest.permission#READ_BASIC_PHONE_STATE},
* {@link android.Manifest.permission#READ_PHONE_STATE} or that the calling app has carrier
* privileges.
*
@@ -8642,12 +8692,19 @@
*/
@Override
public boolean isDataRoamingEnabled(int subId) {
+ String functionName = "isDataRoamingEnabled";
try {
- mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE,
- null);
+ try {
+ mApp.enforceCallingOrSelfPermission(
+ android.Manifest.permission.ACCESS_NETWORK_STATE,
+ functionName);
+ } catch (Exception e) {
+ mApp.enforceCallingOrSelfPermission(
+ permission.READ_BASIC_PHONE_STATE, functionName);
+ }
} catch (Exception e) {
TelephonyPermissions.enforceCallingOrSelfReadPhoneStatePermissionOrCarrierPrivilege(
- mApp, subId, "isDataRoamingEnabled");
+ mApp, subId, functionName);
}
boolean isEnabled = false;
@@ -8707,18 +8764,12 @@
return isAllowed;
}
- private boolean haveCarrierPrivilegeAccess(UiccCard card, String callingPackage) {
- // TODO once MEP API refactoring CL is merged, loop port list from UiccCardInfo,
- // and if find the matching UiccPort by UiccController.getUiccPortForSlot(slot, portIdx)
- // Update each UiccPort object based on privilege access
- UiccPort[] uiccPorts = card.getUiccPortList();
- for (UiccPort port : uiccPorts) {
- UiccProfile profile = port.getUiccProfile();
- if (profile == null ||
- profile.getCarrierPrivilegeStatus(mApp.getPackageManager(), callingPackage)
- != TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
- return false;
- }
+ private boolean haveCarrierPrivilegeAccess(UiccPort port, String callingPackage) {
+ UiccProfile profile = port.getUiccProfile();
+ if (profile == null ||
+ profile.getCarrierPrivilegeStatus(mApp.getPackageManager(), callingPackage)
+ != TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
+ return false;
}
return true;
}
@@ -8763,18 +8814,39 @@
// For an inactive eUICC, the UiccCard will be null even though the UiccCardInfo
// is available
UiccCard card = uiccController.getUiccCardForSlot(cardInfo.getPhysicalSlotIndex());
- // TODO remove card.getUiccPortList().length once MEP API refactoring CL is merged
- // Get UiccPortInfo from CardInfo and process further based on each UiccPort
- if (card == null || card.getUiccPortList().length == 0) {
- // assume no access if the card or ports are unavailable
+ if (card == null) {
+ // assume no access if the card is unavailable
filteredInfos.add(getUiccCardInfoUnPrivileged(cardInfo));
continue;
}
- if (haveCarrierPrivilegeAccess(card, callingPackage)) {
- filteredInfos.add(cardInfo);
- } else {
+ Collection<UiccPortInfo> portInfos = cardInfo.getPorts();
+ if (portInfos.isEmpty()) {
filteredInfos.add(getUiccCardInfoUnPrivileged(cardInfo));
+ continue;
}
+ List<UiccPortInfo> uiccPortInfos = new ArrayList<>();
+ for (UiccPortInfo portInfo : portInfos) {
+ UiccPort port = uiccController.getUiccPortForSlot(
+ cardInfo.getPhysicalSlotIndex(), portInfo.getPortIndex());
+ if (port == null) {
+ // assume no access if port is null
+ uiccPortInfos.add(getUiccPortInfoUnPrivileged(portInfo));
+ continue;
+ }
+ if (haveCarrierPrivilegeAccess(port, callingPackage)) {
+ uiccPortInfos.add(portInfo);
+ } else {
+ uiccPortInfos.add(getUiccPortInfoUnPrivileged(portInfo));
+ }
+ }
+ filteredInfos.add(new UiccCardInfo(
+ cardInfo.isEuicc(),
+ cardInfo.getCardId(),
+ null,
+ cardInfo.getPhysicalSlotIndex(),
+ cardInfo.isRemovable(),
+ cardInfo.isMultipleEnabledProfilesSupported(),
+ uiccPortInfos));
}
return filteredInfos;
} finally {
@@ -8827,7 +8899,6 @@
boolean hasReadPermission = false;
boolean isLogicalSlotAccessRestricted = false;
- String iccId;
try {
enforceReadPrivilegedPermission("getUiccSlotsInfo");
@@ -8862,28 +8933,16 @@
String cardId;
UiccCard card = slot.getUiccCard();
- //if has read permission
- if (hasReadPermission) {
- iccId = slot.getIccId();
- } else {
- if (card != null) {
- // if no read permission checking carrier
- if (haveCarrierPrivilegeAccess(card, callingPackage)) {
- iccId = slot.getIccId();
- } else {
- //if no carrier permission redact ICCID
- iccId = IccUtils.TEST_ICCID;
- }
- } else {
- iccId = null;
- }
- }
if (card != null) {
cardId = card.getCardId();
} else {
cardId = slot.getEid();
if (TextUtils.isEmpty(cardId)) {
- cardId = iccId;
+ // If cardId is null, use iccId of default port as cardId. Check if has
+ // read permission otherwise set to null.(card is null which means no
+ // carrier permission)
+ cardId = hasReadPermission ? slot.getIccId(
+ TelephonyManager.DEFAULT_PORT_INDEX) : null;
}
}
@@ -8911,17 +8970,25 @@
break;
}
+ List<UiccPortInfo> portInfos = new ArrayList<>();
+ int[] portIndexes = slot.getPortList();
+ for (int portIdx : portIndexes) {
+ String iccId = IccUtils.stripTrailingFs(getIccId(slot, portIdx,
+ callingPackage, hasReadPermission));
+ if (slot.isPortActive(portIdx)) {
+ UiccPort port = slot.getUiccCard().getUiccPort(portIdx);
+ portInfos.add(new UiccPortInfo(iccId, port.getPortIdx(),
+ port.getPhoneId(), true));
+ } else {
+ portInfos.add(new UiccPortInfo(iccId, portIdx, -1, false));
+ }
+ }
infos[i] = new UiccSlotInfo(
slot.isEuicc(),
cardId,
cardState,
slot.isExtendedApduSupported(),
- slot.isRemovable(), Collections.singletonList(
- new UiccPortInfo(
- iccId,
- 0 /* TODO: to use portList from UiccSlots */,
- slot.getPhoneId(),
- slot.isActive())));
+ slot.isRemovable(), portInfos);
//setting the value after compatibility check
infos[i].setLogicalSlotAccessRestricted(isLogicalSlotAccessRestricted);
}
@@ -8931,15 +8998,39 @@
}
}
+ /* Returns null if doesn't have read permission or carrier privilege access. */
+ private String getIccId(UiccSlot slot, int portIndex, String callingPackage,
+ boolean hasReadPermission) {
+ String iccId = slot.getIccId(portIndex);
+ if (hasReadPermission) { // if has read permission
+ return iccId;
+ } else {
+ if (slot.getUiccCard() != null && slot.getUiccCard().getUiccPort(portIndex) != null) {
+ UiccPort port = slot.getUiccCard().getUiccPort(portIndex);
+ // if no read permission, checking carrier privilege access
+ if (haveCarrierPrivilegeAccess(port, callingPackage)) {
+ return iccId;
+ }
+ }
+ }
+ // No read permission or carrier privilege access.
+ return UiccPortInfo.ICCID_REDACTED;
+ }
+
@Override
@Deprecated
- //TODO : once integrating with HAL Changes we can clean up this Internal API.
public boolean switchSlots(int[] physicalSlots) {
enforceModifyPermission();
final long identity = Binder.clearCallingIdentity();
try {
- return (Boolean) sendRequest(CMD_SWITCH_SLOTS, physicalSlots);
+ List<UiccSlotMapping> slotMappings = new ArrayList<>();
+ for (int i = 0; i < physicalSlots.length; i++) {
+ // Deprecated API, hence MEP is not supported. Adding default portIndex 0.
+ slotMappings.add(new UiccSlotMapping(TelephonyManager.DEFAULT_PORT_INDEX,
+ physicalSlots[i], i));
+ }
+ return (Boolean) sendRequest(CMD_SWITCH_SLOTS, slotMappings);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -8952,12 +9043,7 @@
final long identity = Binder.clearCallingIdentity();
try {
- //TODO: once integrating the HAL changes we can proceed with to work on the parsing side
- int[] physicalSlots = new int[slotMapping.size()];
- for (int i = 0; i < physicalSlots.length; i++) {
- physicalSlots[i] = slotMapping.get(i).getPhysicalSlotIndex();
- }
- return (Boolean) sendRequest(CMD_SWITCH_SLOTS, physicalSlots);
+ return (Boolean) sendRequest(CMD_SWITCH_SLOTS, slotMapping);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -11120,4 +11206,60 @@
Binder.restoreCallingIdentity(token);
}
}
+
+ /**
+ * @return {@CellIdentity} last known cell identity {@CellIdentity}.
+ *
+ * Require {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
+ * com.android.phone.permission.ACCESS_LAST_KNOWN_CELL_ID, otherwise throws
+ * SecurityException.
+ * If there is current registered network this value will be same as the registered cell
+ * identity. If the device goes out of service the previous cell identity is cached and
+ * will be returned. If the cache age of the Cell identity is more than 24 hours
+ * it will be cleared and null will be returned.
+ *
+ */
+ @Override
+ public @Nullable CellIdentity getLastKnownCellIdentity(int subId, String callingPackage,
+ String callingFeatureId) {
+ mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
+ LocationAccessPolicy.LocationPermissionResult fineLocationResult =
+ LocationAccessPolicy.checkLocationPermission(mApp,
+ new LocationAccessPolicy.LocationPermissionQuery.Builder()
+ .setCallingPackage(callingPackage)
+ .setCallingFeatureId(callingFeatureId)
+ .setCallingPid(Binder.getCallingPid())
+ .setCallingUid(Binder.getCallingUid())
+ .setMethod("getLastKnownCellIdentity")
+ .setLogAsInfo(true)
+ .setMinSdkVersionForFine(Build.VERSION_CODES.Q)
+ .setMinSdkVersionForCoarse(Build.VERSION_CODES.Q)
+ .setMinSdkVersionForEnforcement(Build.VERSION_CODES.Q)
+ .build());
+
+ boolean hasFinePermission =
+ fineLocationResult == LocationAccessPolicy.LocationPermissionResult.ALLOWED;
+ if (!hasFinePermission
+ || !TelephonyPermissions.checkLastKnownCellIdAccessPermission(mApp)) {
+ throw new SecurityException("getLastKnownCellIdentity need ACCESS_FINE_LOCATION "
+ + "and BIND_CONNECTION_SERVICE permission.");
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ Phone phone = getPhone(subId);
+ if (phone == null) return null;
+ ServiceStateTracker sst = phone.getServiceStateTracker();
+ if (sst == null) return null;
+ return sst.getLastKnownCellIdentity();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public boolean isUsingNewDataStack() {
+ TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(), "isUsingNewDataStack");
+ return getDefaultPhone().isUsingNewDataStack();
+ }
}
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index dbeb7ce..f6d7b94 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -30,6 +30,7 @@
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.provider.BlockedNumberContract;
+import android.provider.DeviceConfig;
import android.telephony.BarringInfo;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionInfo;
@@ -165,6 +166,8 @@
"get-allowed-network-types-for-users";
private static final String SET_ALLOWED_NETWORK_TYPES_FOR_USER =
"set-allowed-network-types-for-users";
+ // Check if telephony new data stack is enabled.
+ private static final String GET_DATA_MODE = "get-data-mode";
// Take advantage of existing methods that already contain permissions checks when possible.
private final ITelephony mInterface;
@@ -319,6 +322,8 @@
case GET_ALLOWED_NETWORK_TYPES_FOR_USER:
case SET_ALLOWED_NETWORK_TYPES_FOR_USER:
return handleAllowedNetworkTypesCommand(cmd);
+ case GET_DATA_MODE:
+ return handleGetDataMode();
default: {
return handleDefaultCommands(cmd);
}
@@ -2725,4 +2730,35 @@
return -1;
}
}
+
+ private int handleGetDataMode() {
+ if (!checkShellUid()) {
+ return -1;
+ }
+
+ boolean newDataStackEnabled = false;
+ try {
+ newDataStackEnabled = mInterface.isUsingNewDataStack();
+ } catch (RemoteException e) {
+ getOutPrintWriter().println("Something went wrong. " + e);
+ return -1;
+ }
+
+ getOutPrintWriter().println("Telephony new data stack is "
+ + (newDataStackEnabled ? "enabled." : "disabled."));
+
+ boolean configEnabled = Boolean.parseBoolean(DeviceConfig.getProperty(
+ DeviceConfig.NAMESPACE_TELEPHONY, "new_telephony_data_enabled"));
+ if (configEnabled != newDataStackEnabled) {
+ getOutPrintWriter().println("The config has been "
+ + (configEnabled ? "enabled" : "disabled") + ". Need to reboot the device.");
+ } else {
+ getOutPrintWriter().println("Run the following command to "
+ + (configEnabled ? "disable" : "enable") + " the new telephony data stack.");
+ getOutPrintWriter().println("adb root && adb shell device_config put telephony "
+ + "new_telephony_data_enabled " + (configEnabled ? "false" : "true")
+ + " && adb reboot");
+ }
+ return 0;
+ }
}
diff --git a/src/com/android/phone/settings/fdn/GetPin2Screen.java b/src/com/android/phone/settings/fdn/GetPin2Screen.java
index 2394a69..09cab46 100644
--- a/src/com/android/phone/settings/fdn/GetPin2Screen.java
+++ b/src/com/android/phone/settings/fdn/GetPin2Screen.java
@@ -56,6 +56,7 @@
mPin2Field.setOnEditorActionListener(this);
mPin2Field.setInputType(
InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
+ mPin2Field.requestFocus();
mOkButton = (Button) findViewById(R.id.ok);
mOkButton.setOnClickListener(mClicked);
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 55456f6..a392876 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -2086,8 +2086,7 @@
if (phone.getEmergencyNumberTracker() != null) {
if (phone.getEmergencyNumberTracker().isEmergencyNumber(
emergencyNumberAddress, true)) {
- if (phone.getHalVersion().greaterOrEqual(RIL.RADIO_HAL_VERSION_1_4)
- || isAvailableForEmergencyCalls(phone)) {
+ if (isAvailableForEmergencyCalls(phone)) {
// a)
if (phone.getPhoneId() == defaultVoicePhoneId) {
Log.i(this, "getPhoneForEmergencyCall, Phone Id that supports"
@@ -2210,12 +2209,6 @@
// Only sort if there are enough elements to do so.
if (phoneSlotStatus.size() > 1) {
Collections.sort(phoneSlotStatus, (o1, o2) -> {
- if (!o1.hasDialedEmergencyNumber && o2.hasDialedEmergencyNumber) {
- return -1;
- }
- if (o1.hasDialedEmergencyNumber && !o2.hasDialedEmergencyNumber) {
- return 1;
- }
// Sort by non-absent SIM.
if (o1.simState == TelephonyManager.SIM_STATE_ABSENT
&& o2.simState != TelephonyManager.SIM_STATE_ABSENT) {
@@ -2234,6 +2227,13 @@
if (o2.isLocked && !o1.isLocked) {
return 1;
}
+ // Prefer slots where the number is considered emergency.
+ if (!o1.hasDialedEmergencyNumber && o2.hasDialedEmergencyNumber) {
+ return -1;
+ }
+ if (o1.hasDialedEmergencyNumber && !o2.hasDialedEmergencyNumber) {
+ return 1;
+ }
// sort by number of RadioAccessFamily Capabilities.
int compare = RadioAccessFamily.compare(o1.capabilities, o2.capabilities);
if (compare == 0) {
diff --git a/src/com/android/services/telephony/rcs/DelegateStateTracker.java b/src/com/android/services/telephony/rcs/DelegateStateTracker.java
index 64090d5..29b8121 100644
--- a/src/com/android/services/telephony/rcs/DelegateStateTracker.java
+++ b/src/com/android/services/telephony/rcs/DelegateStateTracker.java
@@ -86,6 +86,17 @@
@VisibleForTesting
public static final long SUPPORT_REGISTERING_DELEGATE_STATE = 205194548;
+ /**
+ * For apps targeting Android T and above, support the DEREGISTERING_REASON_LOSING_PDN state
+ * on APIs, such as {@code DelegateRegistrationState#addDeregisteringFeatureTag} and
+ * {@code DelegateRegistrationState#getDeregisteringFeatureTags}
+ * @hide
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.S)
+ @VisibleForTesting
+ public static final long SUPPORT_DEREGISTERING_LOSING_PDN_STATE = 201522903;
+
public DelegateStateTracker(int subId, int uid,
ISipDelegateConnectionStateCallback appStateCallback,
ISipDelegate localDelegateImpl, RcsStats rcsStats) {
@@ -178,9 +189,13 @@
*/
@Override
public void onRegistrationStateChanged(DelegateRegistrationState registrationState) {
+ if (!mCompatChangesFactory.isChangeEnabled(SUPPORT_DEREGISTERING_LOSING_PDN_STATE, mUid)) {
+ registrationState = overrideDeregisteringStateForCompatibility(registrationState);
+ }
if (!mCompatChangesFactory.isChangeEnabled(SUPPORT_REGISTERING_DELEGATE_STATE, mUid)) {
registrationState = overrideRegistrationForCompatibility(registrationState);
}
+
if (mRegistrationStateOverride > DelegateRegistrationState.DEREGISTERED_REASON_UNKNOWN) {
logi("onRegistrationStateChanged: overriding registered state to "
+ mRegistrationStateOverride);
@@ -291,6 +306,43 @@
return overriddenState.build();
}
+ /**
+ * @param state The RegistrationState reported by the SipDelegate to be sent to the
+ * IMS application .
+ * @return DEREGISTERING_REASON_PDN_CHANGE instead of DEREGISTERING_REASON_LOSING_PDN
+ * if the SUPPORT_DEREGISTERING_LOSING_PDN_STATE compat key is not enabled for the application
+ * consuming the registration change events.
+ */
+ private DelegateRegistrationState overrideDeregisteringStateForCompatibility(
+ DelegateRegistrationState state) {
+ Set<String> registeredFeatures = state.getRegisteredFeatureTags();
+ Set<String> registeringFeatures = state.getRegisteringFeatureTags();
+ DelegateRegistrationState.Builder overriddenState = new DelegateRegistrationState.Builder();
+
+ // keep other registered/registering/deregistered tags the same.
+ for (FeatureTagState dereged : state.getDeregisteredFeatureTags()) {
+ overriddenState.addDeregisteredFeatureTag(dereged.getFeatureTag(),
+ dereged.getState());
+ }
+ overriddenState.addRegisteredFeatureTags(registeredFeatures);
+ overriddenState.addRegisteringFeatureTags(registeringFeatures);
+
+ // change DEREGISTERING_REASON_LOSING_PDN to DEREGISTERING_REASON_PDN_CHANGE
+ for (FeatureTagState dereging : state.getDeregisteringFeatureTags()) {
+ overriddenState.addDeregisteringFeatureTag(dereging.getFeatureTag(),
+ getDeregisteringReasonForCompatibility(dereging.getState()));
+ }
+
+ return overriddenState.build();
+ }
+
+ private int getDeregisteringReasonForCompatibility(int reason) {
+ if (reason == DelegateRegistrationState.DEREGISTERING_REASON_LOSING_PDN) {
+ reason = DelegateRegistrationState.DEREGISTERING_REASON_PDN_CHANGE;
+ }
+ return reason;
+ }
+
private void notifySipDelegateCreated() {
try {
mAppStateCallback.onCreated(mLocalDelegateImpl);
diff --git a/tests/AndroidTest.xml b/tests/AndroidTest.xml
index 4188ee2..f616872 100644
--- a/tests/AndroidTest.xml
+++ b/tests/AndroidTest.xml
@@ -14,6 +14,9 @@
limitations under the License.
-->
<configuration description="Run Phone application tests.">
+ <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer">
+ <option name="force-root" value="true" />
+ </target_preparer>
<option name="test-suite-tag" value="apct" />
<option name="test-suite-tag" value="apct-instrumentation" />
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
@@ -26,5 +29,6 @@
<option name="package" value="com.android.phone.tests" />
<option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
<option name="hidden-api-checks" value="false"/>
+ <option name="test-filter-dir" value="/data/data/com.android.phone" />
</test>
</configuration>
diff --git a/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java b/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java
index 0eb19e7..ffbe5ce 100644
--- a/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java
+++ b/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java
@@ -234,6 +234,9 @@
* When registration states are changed in a case that an application doesn't support the new
* 'registering' state the 'registering' state will be moved to the 'registered' state
* as the old behavior.
+ *
+ * This method tests the case where the application doesn't support consuming the
+ * DEREGISTERING_REASON_LOSING_PDN reason.
*/
@Test
public void testDelegateChangingRegisteredTagsRegisteringDisable() throws Exception {
@@ -250,7 +253,7 @@
.addRegisteredFeatureTag(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG)
.addRegisteringFeatureTags(registeringTags)
.addDeregisteringFeatureTag(ImsSignallingUtils.FILE_TRANSFER_HTTP_TAG,
- DelegateRegistrationState.DEREGISTERING_REASON_PROVISIONING_CHANGE)
+ DelegateRegistrationState.DEREGISTERING_REASON_LOSING_PDN)
.addDeregisteredFeatureTag(ImsSignallingUtils.GROUP_CHAT_TAG,
DelegateRegistrationState.DEREGISTERED_REASON_NOT_PROVISIONED)
.build();
@@ -259,7 +262,7 @@
DelegateRegistrationState.Builder builder = new DelegateRegistrationState.Builder()
.addRegisteredFeatureTag(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG)
.addDeregisteringFeatureTag(ImsSignallingUtils.FILE_TRANSFER_HTTP_TAG,
- DelegateRegistrationState.DEREGISTERING_REASON_PROVISIONING_CHANGE)
+ DelegateRegistrationState.DEREGISTERING_REASON_PDN_CHANGE)
.addDeregisteredFeatureTag(ImsSignallingUtils.GROUP_CHAT_TAG,
DelegateRegistrationState.DEREGISTERED_REASON_NOT_PROVISIONED);
for (String tag : registeringTags) {
@@ -283,6 +286,9 @@
/**
* When registration states are changed in a case that an application supports the new
* 'registering' state the state will be kept.
+ *
+ * This method tests the case where the application supports consuming the
+ * DEREGISTERING_REASON_LOSING_PDN reason.
*/
@Test
public void testDelegateChangingRegisteredTagsRegisteringEnable() throws Exception {
@@ -300,7 +306,7 @@
.addRegisteredFeatureTag(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG)
.addRegisteringFeatureTags(registeringTags)
.addDeregisteringFeatureTag(ImsSignallingUtils.FILE_TRANSFER_HTTP_TAG,
- DelegateRegistrationState.DEREGISTERING_REASON_PROVISIONING_CHANGE)
+ DelegateRegistrationState.DEREGISTERING_REASON_LOSING_PDN)
.addDeregisteredFeatureTag(ImsSignallingUtils.GROUP_CHAT_TAG,
DelegateRegistrationState.DEREGISTERED_REASON_NOT_PROVISIONED)
.build();