Merge "Telephony: post notifications permission"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index cb487e8..a2ee607 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -241,6 +241,10 @@
<uses-permission android:name="android.permission.ACCESS_TELEPHONY_SIMINFO_DB"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
+ <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/ImsRcsController.java b/src/com/android/phone/ImsRcsController.java
index 3618d58..bf55764 100644
--- a/src/com/android/phone/ImsRcsController.java
+++ b/src/com/android/phone/ImsRcsController.java
@@ -17,9 +17,13 @@
package com.android.phone;
import android.Manifest;
+import android.app.compat.CompatChanges;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledAfter;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.os.UserHandle;
@@ -73,6 +77,15 @@
private Boolean mSingleRegistrationOverride;
/**
+ * For apps targeting Android T and above, support the publishing state on APIs, such as
+ * {@code RcsUceAdapter#PUBLISH_STATE_PUBLISHING}
+ * @hide
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.S)
+ public static final long SUPPORT_PUBLISHING_STATE = 202894742;
+
+ /**
* Initialize the singleton ImsRcsController instance.
* This is only done once, at startup, from PhoneApp.onCreate().
*/
@@ -316,7 +329,9 @@
@Override
public @PublishState int getUcePublishState(int subId) {
enforceReadPrivilegedPermission("getUcePublishState");
+ final int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
+ boolean isSupportPublishingState = false;
try {
UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
UceControllerManager.class);
@@ -324,7 +339,10 @@
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
"This subscription does not support UCE.");
}
- return uceCtrlManager.getUcePublishState();
+ if (CompatChanges.isChangeEnabled(SUPPORT_PUBLISHING_STATE, uid)) {
+ isSupportPublishingState = true;
+ }
+ return uceCtrlManager.getUcePublishState(isSupportPublishingState);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode(), e.getMessage());
} finally {
@@ -466,7 +484,9 @@
@Override
public void registerUcePublishStateCallback(int subId, IRcsUcePublishStateCallback c) {
enforceReadPrivilegedPermission("registerUcePublishStateCallback");
+ final int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
+ boolean isSupportPublishingState = false;
try {
UceControllerManager uceCtrlManager = getRcsFeatureController(subId).getFeature(
UceControllerManager.class);
@@ -474,7 +494,11 @@
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
"This subscription does not support UCE.");
}
- uceCtrlManager.registerPublishStateCallback(c);
+
+ if (CompatChanges.isChangeEnabled(SUPPORT_PUBLISHING_STATE, uid)) {
+ isSupportPublishingState = true;
+ }
+ uceCtrlManager.registerPublishStateCallback(c, isSupportPublishingState);
} catch (ImsException e) {
throw new ServiceSpecificException(e.getCode(), e.getMessage());
} finally {
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index d605bdd..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;
@@ -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;
@@ -5261,41 +5263,43 @@
@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 iccOpenLogicalChannelByPort(
- int slotIndex, int portIndex, String callingPackage, String aid, int p2) {
- enforceModifyPermission();
- mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
- if (DBG) {
- log("iccOpenLogicalChannelByPort: slot=" + slotIndex + " port=" + portIndex + " 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(getPhoneFromSlotPortIndexOrThrowException(
- slotIndex, portIndex), 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.");
@@ -5303,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);
@@ -5313,31 +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 iccCloseLogicalChannelByPort(int slotIndex, int portIndex, int channel) {
- enforceModifyPermission();
- if (DBG) log("iccCloseLogicalChannelByPort: slotIndex=" + slotIndex + " portIndex="
- + portIndex + " chnl=" + channel);
- return iccCloseLogicalChannelWithPermission(
- getPhoneFromSlotPortIndexOrThrowException(slotIndex, portIndex), 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);
@@ -6344,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);
@@ -6383,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);
@@ -7909,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) {
@@ -11197,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/rcs/UceControllerManager.java b/src/com/android/services/telephony/rcs/UceControllerManager.java
index 995d685..02ae048 100644
--- a/src/com/android/services/telephony/rcs/UceControllerManager.java
+++ b/src/com/android/services/telephony/rcs/UceControllerManager.java
@@ -206,10 +206,11 @@
*
* @throws ImsException if the ImsService connected to this controller is currently down.
*/
- public @PublishState int getUcePublishState() throws ImsException {
+ public @PublishState int getUcePublishState(boolean isSupportPublishingState)
+ throws ImsException {
Future<Integer> future = mExecutorService.submit(() -> {
checkUceControllerState();
- return mUceController.getUcePublishState();
+ return mUceController.getUcePublishState(isSupportPublishingState);
});
try {
@@ -390,10 +391,11 @@
*
* @throws ImsException if the ImsService connected to this controller is currently down.
*/
- public void registerPublishStateCallback(IRcsUcePublishStateCallback c) throws ImsException {
+ public void registerPublishStateCallback(IRcsUcePublishStateCallback c,
+ boolean supportPublishingState) throws ImsException {
Future future = mExecutorService.submit(() -> {
checkUceControllerState();
- mUceController.registerPublishStateCallback(c);
+ mUceController.registerPublishStateCallback(c, supportPublishingState);
return true;
});
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/UceControllerManagerTest.java b/tests/src/com/android/services/telephony/rcs/UceControllerManagerTest.java
index 8d719fd..17decb9 100644
--- a/tests/src/com/android/services/telephony/rcs/UceControllerManagerTest.java
+++ b/tests/src/com/android/services/telephony/rcs/UceControllerManagerTest.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -199,9 +200,9 @@
doReturn(false).when(mUceController).isUnavailable();
uceCtrlManager.onRcsConnected(mRcsFeatureManager);
- uceCtrlManager.getUcePublishState();
+ uceCtrlManager.getUcePublishState(true);
- verify(mUceController).getUcePublishState();
+ verify(mUceController).getUcePublishState(eq(true));
}
@Test
@@ -211,7 +212,7 @@
uceCtrlManager.onRcsDisconnected();
try {
- uceCtrlManager.getUcePublishState();
+ uceCtrlManager.getUcePublishState(true);
fail();
} catch (ImsException e) {
assertEquals(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE, e.getCode());
@@ -225,9 +226,9 @@
UceControllerManager uceCtrlManager = getUceControllerManager();
IRcsUcePublishStateCallback callback = Mockito.mock(IRcsUcePublishStateCallback.class);
- uceCtrlManager.registerPublishStateCallback(callback);
+ uceCtrlManager.registerPublishStateCallback(callback, true);
- verify(mUceController).registerPublishStateCallback(callback);
+ verify(mUceController).registerPublishStateCallback(callback, true);
}
@Test
@@ -238,7 +239,7 @@
try {
IRcsUcePublishStateCallback callback = Mockito.mock(IRcsUcePublishStateCallback.class);
- uceCtrlManager.registerPublishStateCallback(callback);
+ uceCtrlManager.registerPublishStateCallback(callback, true);
fail();
} catch (ImsException e) {
assertEquals(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE, e.getCode());