diff options
Diffstat (limited to 'rcs/presencepolling/src/com')
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(); } } - |