Expose getUserSelectedOutgoingPhoneAccount for priv app or dialer.
am: 58a0a514ec
Change-Id: I31e9ad9defc2eb15f44d076713884a882e592963
diff --git a/src/com/android/server/telecom/PhoneAccountRegistrar.java b/src/com/android/server/telecom/PhoneAccountRegistrar.java
index 196b8ad..9010913 100644
--- a/src/com/android/server/telecom/PhoneAccountRegistrar.java
+++ b/src/com/android/server/telecom/PhoneAccountRegistrar.java
@@ -332,7 +332,7 @@
int subId = getSubscriptionIdForPhoneAccount(accountHandle);
mSubscriptionManager.setDefaultVoiceSubId(subId);
}
-
+ Log.i(this, "setUserSelectedOutgoingPhoneAccount: %s", accountHandle);
mState.defaultOutgoingAccountHandles
.put(userHandle, new DefaultPhoneAccountHandle(userHandle, accountHandle,
account.getGroupId()));
diff --git a/src/com/android/server/telecom/TelecomServiceImpl.java b/src/com/android/server/telecom/TelecomServiceImpl.java
index f57a0c6..f472421 100644
--- a/src/com/android/server/telecom/TelecomServiceImpl.java
+++ b/src/com/android/server/telecom/TelecomServiceImpl.java
@@ -137,10 +137,14 @@
}
@Override
- public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount() {
+ public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount(String callingPackage) {
synchronized (mLock) {
try {
Log.startSession("TSI.gUSOPA");
+ if (!isDialerOrPrivileged(callingPackage, "getDefaultOutgoingPhoneAccount")) {
+ throw new SecurityException("Only the default dialer, or caller with "
+ + "READ_PRIVILEGED_PHONE_STATE can call this method.");
+ }
final UserHandle callingUserHandle = Binder.getCallingUserHandle();
return mPhoneAccountRegistrar.getUserSelectedOutgoingPhoneAccount(
callingUserHandle);
@@ -1909,6 +1913,19 @@
}
}
+ private boolean isDialerOrPrivileged(String callingPackage, String message) {
+ // The system/default dialer can always read phone state - so that emergency calls will
+ // still work.
+ if (isPrivilegedDialerCalling(callingPackage)) {
+ return true;
+ }
+
+ mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, message);
+ // SKIP checking run-time OP_READ_PHONE_STATE since caller or self has PRIVILEGED
+ // permission
+ return true;
+ }
+
private boolean isSelfManagedConnectionService(PhoneAccountHandle phoneAccountHandle) {
if (phoneAccountHandle != null) {
PhoneAccount phoneAccount = mPhoneAccountRegistrar.getPhoneAccountUnchecked(
diff --git a/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java b/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java
index c11811d..b779ce2 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java
@@ -22,6 +22,8 @@
import static android.Manifest.permission.READ_PHONE_STATE;
import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
+import android.annotation.MainThread;
+import android.annotation.WorkerThread;
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.content.ComponentName;
@@ -271,7 +273,8 @@
makeMultiUserPhoneAccount(TEL_PA_HANDLE_16).build());
PhoneAccountHandle returnedHandle
- = mTSIBinder.getUserSelectedOutgoingPhoneAccount();
+ = mTSIBinder.getUserSelectedOutgoingPhoneAccount(
+ TEL_PA_HANDLE_16.getComponentName().getPackageName());
assertEquals(TEL_PA_HANDLE_16, returnedHandle);
}