Add intent broadcast when a PhoneAccount is enabled or disabled. (2/3)
- Send intent from PhoneAccountRegistry.
Bug: 17408536
Change-Id: I3f29d7bdd96347ed51458f07b50fd8e06d44da1c
diff --git a/src/com/android/telecomm/PhoneAccountRegistrar.java b/src/com/android/telecomm/PhoneAccountRegistrar.java
index 7aa9261..ce8a1ea 100644
--- a/src/com/android/telecomm/PhoneAccountRegistrar.java
+++ b/src/com/android/telecomm/PhoneAccountRegistrar.java
@@ -18,6 +18,8 @@
import android.Manifest;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
@@ -352,11 +354,12 @@
}
}
-
PhoneAccount.Builder builder = existing.toBuilder().setEnabled(isEnabled);
PhoneAccount replacement = builder.build();
-
addOrReplacePhoneAccount(replacement);
+
+ // Notify the package which registered this PhoneAccount of its new enabled state.
+ notifyPhoneAccountEnabledStateChanged(replacement.getAccountHandle(), isEnabled);
}
// TODO: Should we implement an artificial limit for # of accounts associated with a single
@@ -527,6 +530,46 @@
}
/**
+ * Notifies the package which registered a {@link PhoneAccount} that it has been enabled.
+ * Only broadcasts the intent if the package has a {@link android.content.BroadcastReceiver}
+ * registered for the intent.
+ *
+ * @param phoneAccountHandle The {@link PhoneAccountHandle} which has been enabled or disabled.
+ * @param isEnabled {@code True} if the {@link PhoneAccount} is enabled, false otherwise.
+ */
+ private void notifyPhoneAccountEnabledStateChanged(PhoneAccountHandle phoneAccountHandle,
+ boolean isEnabled) {
+ Intent intent;
+
+ if (isEnabled) {
+ intent = new Intent(TelecommManager.ACTION_PHONE_ACCOUNT_ENABLED);
+ } else {
+ intent = new Intent(TelecommManager.ACTION_PHONE_ACCOUNT_DISABLED);
+ }
+ intent.setPackage(phoneAccountHandle.getComponentName().getPackageName());
+ intent.putExtra(TelecommManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
+
+ if (isReceiverListening(intent)) {
+ Log.i(this, "notifyPhoneAccountEnabledState %s %s", phoneAccountHandle,
+ (isEnabled ? "enabled" : "disabled"));
+ mContext.sendBroadcast(intent);
+ }
+ }
+
+ /**
+ * Determines there is a {@link android.content.BroadcastReceiver} listening for an
+ * {@link Intent}.
+ *
+ * @param intent The {@link Intent}.
+ * @return {@code True} if there is a listener.
+ */
+ private boolean isReceiverListening(Intent intent) {
+ PackageManager pm = mContext.getPackageManager();
+ final List<ResolveInfo> activities = pm.queryBroadcastReceivers(intent, 0);
+ return !(activities.isEmpty());
+ }
+
+ /**
* The state of this {@code PhoneAccountRegistrar}.
*/
@VisibleForTesting