Send PhoneAccount register/unregistered intents to default dialer.
A few cleanups:
1. When sending the register/unregister phone account intents, previously
there was no attempt made to ensure the intents were only sent when a
new account was added, or an existing one was removed. Cleaned this up
so that we don't over-send the intents.
2. Minor fix to account diff string in PhoneAccountRegistrar which would
cause icon to always be shown as a diff; removed since bitmaps can't be
compared.
3. Also sending the intents to the default dialer app as an explicit
intent.
Test: Manual
Bug: 37106957
Merged-In: I7fdaa3e225df6fe3aaf292f9b0b93042f69ca469
Change-Id: I7fdaa3e225df6fe3aaf292f9b0b93042f69ca469
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index ff48242..e89075d 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -143,6 +143,9 @@
*/
private static final int CALL_FILTER_ALL = 3;
+ private static final String PERMISSION_PROCESS_PHONE_ACCOUNT_REGISTRATION =
+ "android.permission.PROCESS_PHONE_ACCOUNT_REGISTRATION";
+
private static final int HANDLER_WAIT_TIMEOUT = 10000;
private static final int MAXIMUM_LIVE_CALLS = 1;
private static final int MAXIMUM_HOLD_CALLS = 1;
@@ -261,6 +264,21 @@
private Runnable mStopTone;
/**
+ * Listener to PhoneAccountRegistrar events.
+ */
+ private PhoneAccountRegistrar.Listener mPhoneAccountListener =
+ new PhoneAccountRegistrar.Listener() {
+ public void onPhoneAccountRegistered(PhoneAccountRegistrar registrar,
+ PhoneAccountHandle handle) {
+ broadcastRegisterIntent(handle);
+ }
+ public void onPhoneAccountUnRegistered(PhoneAccountRegistrar registrar,
+ PhoneAccountHandle handle) {
+ broadcastUnregisterIntent(handle);
+ }
+ };
+
+ /**
* Initializes the required Telecom components.
*/
CallsManager(
@@ -288,6 +306,7 @@
mContactsAsyncHelper = contactsAsyncHelper;
mCallerInfoAsyncQueryFactory = callerInfoAsyncQueryFactory;
mPhoneAccountRegistrar = phoneAccountRegistrar;
+ mPhoneAccountRegistrar.addListener(mPhoneAccountListener);
mMissedCallNotifier = missedCallNotifier;
StatusBarNotifier statusBarNotifier = new StatusBarNotifier(context, this);
mWiredHeadsetManager = wiredHeadsetManager;
@@ -2737,4 +2756,48 @@
service.createConnectionFailed(call);
}
}
+
+ private void broadcastUnregisterIntent(PhoneAccountHandle accountHandle) {
+ Intent intent =
+ new Intent(TelecomManager.ACTION_PHONE_ACCOUNT_UNREGISTERED);
+ intent.putExtra(
+ TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle);
+ Log.i(this, "Sending phone-account %s unregistered intent as user", accountHandle);
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
+ PERMISSION_PROCESS_PHONE_ACCOUNT_REGISTRATION);
+
+ String dialerPackage = mDefaultDialerCache.getDefaultDialerApplication(
+ getCurrentUserHandle().getIdentifier());
+ if (!TextUtils.isEmpty(dialerPackage)) {
+ Intent directedIntent = new Intent(TelecomManager.ACTION_PHONE_ACCOUNT_UNREGISTERED)
+ .setPackage(dialerPackage);
+ directedIntent.putExtra(
+ TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle);
+ Log.i(this, "Sending phone-account unregistered intent to default dialer");
+ mContext.sendBroadcastAsUser(directedIntent, UserHandle.ALL, null);
+ }
+ return ;
+ }
+
+ private void broadcastRegisterIntent(PhoneAccountHandle accountHandle) {
+ Intent intent = new Intent(
+ TelecomManager.ACTION_PHONE_ACCOUNT_REGISTERED);
+ intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
+ accountHandle);
+ Log.i(this, "Sending phone-account %s registered intent as user", accountHandle);
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
+ PERMISSION_PROCESS_PHONE_ACCOUNT_REGISTRATION);
+
+ String dialerPackage = mDefaultDialerCache.getDefaultDialerApplication(
+ getCurrentUserHandle().getIdentifier());
+ if (!TextUtils.isEmpty(dialerPackage)) {
+ Intent directedIntent = new Intent(TelecomManager.ACTION_PHONE_ACCOUNT_REGISTERED)
+ .setPackage(dialerPackage);
+ directedIntent.putExtra(
+ TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle);
+ Log.i(this, "Sending phone-account registered intent to default dialer");
+ mContext.sendBroadcastAsUser(directedIntent, UserHandle.ALL, null);
+ }
+ return ;
+ }
}
diff --git a/src/com/android/server/telecom/PhoneAccountRegistrar.java b/src/com/android/server/telecom/PhoneAccountRegistrar.java
index af633fb..8cdec30 100644
--- a/src/com/android/server/telecom/PhoneAccountRegistrar.java
+++ b/src/com/android/server/telecom/PhoneAccountRegistrar.java
@@ -120,6 +120,10 @@
public void onAccountsChanged(PhoneAccountRegistrar registrar) {}
public void onDefaultOutgoingChanged(PhoneAccountRegistrar registrar) {}
public void onSimCallManagerChanged(PhoneAccountRegistrar registrar) {}
+ public void onPhoneAccountRegistered(PhoneAccountRegistrar registrar,
+ PhoneAccountHandle handle) {}
+ public void onPhoneAccountUnRegistered(PhoneAccountRegistrar registrar,
+ PhoneAccountHandle handle) {}
}
/**
@@ -652,14 +656,17 @@
// !!! IMPORTANT !!! It is important that we do not read the enabled state that the
// source app provides or else an third party app could enable itself.
boolean isEnabled = false;
+ boolean isNewAccount;
PhoneAccount oldAccount = getPhoneAccountUnchecked(account.getAccountHandle());
if (oldAccount != null) {
mState.accounts.remove(oldAccount);
isEnabled = oldAccount.isEnabled();
- Log.i(this, getAccountDiffString(account, oldAccount));
+ Log.i(this, "Modify account: %s", getAccountDiffString(account, oldAccount));
+ isNewAccount = false;
} else {
Log.i(this, "New phone account registered: " + account);
+ isNewAccount = true;
}
// When registering a self-managed PhoneAccount we enforce the rule that the label that the
@@ -695,6 +702,9 @@
write();
fireAccountsChanged();
+ if (isNewAccount) {
+ fireAccountRegistered(account.getAccountHandle());
+ }
}
public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) {
@@ -703,6 +713,7 @@
if (mState.accounts.remove(account)) {
write();
fireAccountsChanged();
+ fireAccountUnRegistered(accountHandle);
}
}
}
@@ -748,6 +759,18 @@
}
}
+ private void fireAccountRegistered(PhoneAccountHandle handle) {
+ for (Listener l : mListeners) {
+ l.onPhoneAccountRegistered(this, handle);
+ }
+ }
+
+ private void fireAccountUnRegistered(PhoneAccountHandle handle) {
+ for (Listener l : mListeners) {
+ l.onPhoneAccountUnRegistered(this, handle);
+ }
+ }
+
private void fireAccountsChanged() {
for (Listener l : mListeners) {
l.onAccountsChanged(this);
@@ -771,7 +794,6 @@
Log.piiHandle(account2.getAddress()));
appendDiff(sb, "cap", account1.getCapabilities(), account2.getCapabilities());
appendDiff(sb, "hl", account1.getHighlightColor(), account2.getHighlightColor());
- appendDiff(sb, "icon", account1.getIcon(), account2.getIcon());
appendDiff(sb, "lbl", account1.getLabel(), account2.getLabel());
appendDiff(sb, "desc", account1.getShortDescription(), account2.getShortDescription());
appendDiff(sb, "subAddr", Log.piiHandle(account1.getSubscriptionAddress()),
diff --git a/src/com/android/server/telecom/TelecomServiceImpl.java b/src/com/android/server/telecom/TelecomServiceImpl.java
index 6cfdcf3..d4e1096 100644
--- a/src/com/android/server/telecom/TelecomServiceImpl.java
+++ b/src/com/android/server/telecom/TelecomServiceImpl.java
@@ -48,6 +48,7 @@
import android.telecom.VideoProfile;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.text.TextUtils;
import android.util.EventLog;
// TODO: Needed for move to system service: import com.android.internal.R;
@@ -78,8 +79,6 @@
}
}
- private static final String PERMISSION_PROCESS_PHONE_ACCOUNT_REGISTRATION =
- "android.permission.PROCESS_PHONE_ACCOUNT_REGISTRATION";
private static final int DEFAULT_VIDEO_STATE = -1;
private final ITelecomService.Stub mBinderImpl = new ITelecomService.Stub() {
@@ -401,19 +400,6 @@
}
enforceUserHandleMatchesCaller(account.getAccountHandle());
mPhoneAccountRegistrar.registerPhoneAccount(account);
- // Broadcast an intent indicating the phone account which was registered.
- long token = Binder.clearCallingIdentity();
- try {
- Intent intent = new Intent(
- TelecomManager.ACTION_PHONE_ACCOUNT_REGISTERED);
- intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
- account.getAccountHandle());
- Log.i(this, "Sending phone-account registered intent as user");
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
- PERMISSION_PROCESS_PHONE_ACCOUNT_REGISTRATION);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
} catch (Exception e) {
Log.e(this, e, "registerPhoneAccount %s", account);
throw e;
@@ -433,20 +419,6 @@
accountHandle.getComponentName().getPackageName());
enforceUserHandleMatchesCaller(accountHandle);
mPhoneAccountRegistrar.unregisterPhoneAccount(accountHandle);
-
- // Broadcast an intent indicating the phone account which was unregistered.
- long token = Binder.clearCallingIdentity();
- try {
- Intent intent =
- new Intent(TelecomManager.ACTION_PHONE_ACCOUNT_UNREGISTERED);
- intent.putExtra(
- TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle);
- Log.i(this, "Sending phone-account unregistered intent as user");
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
- PERMISSION_PROCESS_PHONE_ACCOUNT_REGISTRATION);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
} catch (Exception e) {
Log.e(this, e, "unregisterPhoneAccount %s", accountHandle);
throw e;
diff --git a/testapps/AndroidManifest.xml b/testapps/AndroidManifest.xml
index ec49696..bfe8d0d 100644
--- a/testapps/AndroidManifest.xml
+++ b/testapps/AndroidManifest.xml
@@ -66,7 +66,8 @@
<intent-filter>
<action android:name="android.server.telecom.testapps.ACTION_SEND_UPDATE_REQUEST_FROM_TEST_INCALL_SERVICE"/>
<action android:name="android.server.telecom.testapps.ACTION_SEND_UPGRADE_RESPONSE"/>
- <data android:scheme="int" />
+ <action android:name="android.telecom.action.PHONE_ACCOUNT_REGISTERED"/>
+ <action android:name="android.telecom.action.PHONE_ACCOUNT_UNREGISTERED"/>
</intent-filter>
</receiver>
diff --git a/testapps/src/com/android/server/telecom/testapps/TestInCallServiceBroadcastReceiver.java b/testapps/src/com/android/server/telecom/testapps/TestInCallServiceBroadcastReceiver.java
index b6902bf..3371060 100644
--- a/testapps/src/com/android/server/telecom/testapps/TestInCallServiceBroadcastReceiver.java
+++ b/testapps/src/com/android/server/telecom/testapps/TestInCallServiceBroadcastReceiver.java
@@ -19,6 +19,7 @@
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.telecom.TelecomManager;
import android.util.Log;
/**
@@ -56,6 +57,12 @@
} else if (ACTION_SEND_UPGRADE_RESPONSE.equals(action)) {
final int videoState = Integer.parseInt(intent.getData().getSchemeSpecificPart());
TestCallList.getInstance().sendUpgradeToVideoResponse(videoState);
+ } else if (TelecomManager.ACTION_PHONE_ACCOUNT_REGISTERED.equals(action)) {
+ Log.i(TAG, "onReceive: registered " + intent.getExtras().get(
+ TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE));
+ } else if (TelecomManager.ACTION_PHONE_ACCOUNT_UNREGISTERED.equals(action)) {
+ Log.i(TAG, "onReceive: unregistered " + intent.getExtras().get(
+ TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE));
}
}
}