summaryrefslogtreecommitdiff
path: root/rcs/presencepolling/src/com
diff options
context:
space:
mode:
Diffstat (limited to 'rcs/presencepolling/src/com')
-rw-r--r--rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java63
-rw-r--r--rcs/presencepolling/src/com/android/service/ims/presence/PollingService.java1
-rw-r--r--rcs/presencepolling/src/com/android/service/ims/presence/PollingTask.java3
3 files changed, 62 insertions, 5 deletions
diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java b/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java
index d2e2178..5002b60 100644
--- a/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java
+++ b/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java
@@ -31,6 +31,7 @@ package com.android.service.ims.presence;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -44,7 +45,9 @@ import android.telephony.PhoneNumberUtils;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsException;
+import android.telephony.ims.ImsManager;
import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.RcsUceAdapter;
import android.text.format.TimeMigrationUtils;
import android.text.TextUtils;
@@ -62,6 +65,10 @@ public class CapabilityPolling {
private Logger logger = Logger.getLogger(this.getClass().getName());
private final Context mContext;
+ private static final String PERSIST_SERVICE_NAME =
+ "com.android.service.ims.presence.PersistService";
+ private static final String PERSIST_SERVICE_PACKAGE = "com.android.service.ims.presence";
+
public static final String ACTION_PERIODICAL_DISCOVERY_ALARM =
"com.android.service.ims.presence.periodical_capability_discovery";
private PendingIntent mDiscoveryAlarmIntent = null;
@@ -83,6 +90,7 @@ public class CapabilityPolling {
private int mPublished = -1;
private int mProvisioned = -1;
private int mDefaultSubId;
+ private boolean isInitializing = false;
private HandlerThread mDiscoveryThread;
private Handler mDiscoveryHandler;
@@ -126,6 +134,25 @@ public class CapabilityPolling {
}
};
+ private RcsUceAdapter.OnPublishStateChangedListener mPublishStateCallback =
+ new RcsUceAdapter.OnPublishStateChangedListener() {
+ @Override
+ public void onPublishStateChange(int publishState) {
+ logger.info("publish state changed: " + publishState);
+ Intent intent = new Intent(RcsPresence.ACTION_PUBLISH_STATE_CHANGED);
+ intent.putExtra(RcsPresence.EXTRA_PUBLISH_STATE, publishState);
+ mContext.sendStickyBroadcast(intent);
+ launchPersistService(intent);
+ }
+ };
+
+ private void launchPersistService(Intent intent) {
+ ComponentName component = new ComponentName(PERSIST_SERVICE_PACKAGE,
+ PERSIST_SERVICE_NAME);
+ intent.setComponent(component);
+ mContext.startService(intent);
+ }
+
private Runnable mRegisterCallbackRunnable = this::tryProvisioningManagerRegistration;
private static CapabilityPolling sInstance = null;
@@ -234,6 +261,7 @@ public class CapabilityPolling {
cancelDiscoveryAlarm();
clearPollingTasks();
mContext.unregisterReceiver(mReceiver);
+ unregisterPublishStateChangedCallback();
mDiscoveryThread.quit();
if (SubscriptionManager.isValidSubscriptionId(mDefaultSubId)) {
@@ -253,6 +281,29 @@ public class CapabilityPolling {
mContext.registerReceiver(mReceiver, intentFilter);
}
+ private void registerPublishStateChangedCallback() {
+ try {
+ ImsManager imsManager =
+ (ImsManager) mContext.getSystemService(Context.TELEPHONY_IMS_SERVICE);
+ RcsUceAdapter uceAdapter = imsManager.getImsRcsManager(mDefaultSubId).getUceAdapter();
+ uceAdapter.addOnPublishStateChangedListener(mContext.getMainExecutor(),
+ mPublishStateCallback);
+ } catch (Exception ex) {
+ logger.warn("register publish state callback failed, exception: " + ex);
+ }
+ }
+
+ private void unregisterPublishStateChangedCallback() {
+ try {
+ ImsManager imsManager =
+ (ImsManager) mContext.getSystemService(Context.TELEPHONY_IMS_SERVICE);
+ RcsUceAdapter uceAdapter = imsManager.getImsRcsManager(mDefaultSubId).getUceAdapter();
+ uceAdapter.removeOnPublishStateChangedListener(mPublishStateCallback);
+ } catch (Exception ex) {
+ logger.warn("unregister publish state callback failed, exception: " + ex);
+ }
+ }
+
private boolean isPollingReady() {
RcsManager rcsManager = RcsManager.getInstance(mContext, 0);
if (rcsManager != null) {
@@ -423,7 +474,7 @@ public class CapabilityPolling {
intent.putExtra("pollingType", type);
mDiscoveryAlarmIntent = PendingIntent.getBroadcast(mContext, 0, intent,
- PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + msec, mDiscoveryAlarmIntent);
@@ -755,18 +806,23 @@ public class CapabilityPolling {
// Track the default subscription (the closest we can get to MSIM).
// call from main thread only.
public void handleDefaultSubscriptionChanged(int newDefaultSubId) {
- logger.print("registerImsCallbacksAndSetAssociatedSubscription: new default= "
+ logger.print("handleDefaultSubscriptionChanged: new default= "
+ newDefaultSubId);
+
if (!SubscriptionManager.isValidSubscriptionId(newDefaultSubId)) {
return;
}
- if (mDefaultSubId == newDefaultSubId) {
+ if (isInitializing && (mDefaultSubId == newDefaultSubId)) {
return;
+ } else {
+ isInitializing = true;
}
// unregister old default first
if (SubscriptionManager.isValidSubscriptionId(mDefaultSubId)) {
ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(mDefaultSubId);
pm.unregisterProvisioningChangedCallback(mProvisioningManagerCallback);
+
+ unregisterPublishStateChangedCallback();
}
// register new default and clear old cached values in EAB only if we are changing the
// default sub ID.
@@ -783,6 +839,7 @@ public class CapabilityPolling {
enqueueSettingsChanged();
// load settings for new default.
enqueueProvisionStateChanged();
+ registerPublishStateChangedCallback();
}
public void tryProvisioningManagerRegistration() {
diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PollingService.java b/rcs/presencepolling/src/com/android/service/ims/presence/PollingService.java
index ed511e7..8bfd8d1 100644
--- a/rcs/presencepolling/src/com/android/service/ims/presence/PollingService.java
+++ b/rcs/presencepolling/src/com/android/service/ims/presence/PollingService.java
@@ -209,6 +209,7 @@ public class PollingService extends Service {
logger.info("Starting CapabilityPolling...");
mCapabilityPolling = CapabilityPolling.getInstance(this);
mCapabilityPolling.start();
+ mCapabilityPolling.handleDefaultSubscriptionChanged(mDefaultSubId);
}
}
diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PollingTask.java b/rcs/presencepolling/src/com/android/service/ims/presence/PollingTask.java
index f3b17dd..b9835bb 100644
--- a/rcs/presencepolling/src/com/android/service/ims/presence/PollingTask.java
+++ b/rcs/presencepolling/src/com/android/service/ims/presence/PollingTask.java
@@ -201,7 +201,7 @@ public class PollingTask {
intent.putExtra("pollingTaskId", mId);
mRetryAlarmIntent = PendingIntent.getBroadcast(mContext, 0, intent,
- PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)
mContext.getSystemService(Context.ALARM_SERVICE);
@@ -254,4 +254,3 @@ public class PollingTask {
return sb.toString();
}
}
-