Clean up hidden dependencies

1) Remove imports that are not used
2) Remove hidden dependencies from RcsService. ucepresencelib
is next.

Bug: 111305845
Test: build; manual test of capability query.
Change-Id: I8377325709ca64ee0e0b9e881c54e69b4855200e
diff --git a/rcs/rcsservice/Android.bp b/rcs/rcsservice/Android.bp
index 24153a5..ba191e8 100644
--- a/rcs/rcsservice/Android.bp
+++ b/rcs/rcsservice/Android.bp
@@ -59,9 +59,6 @@
         "src/com/android/service/ims/RcsService.java",
         "src/com/android/service/ims/RcsServiceApp.java"
     ],
-    libs: [
-            "ims-common",
-        ],
     static_libs: [
         "ucepresencelib"
     ],
diff --git a/rcs/rcsservice/src/com/android/service/ims/LauncherUtils.java b/rcs/rcsservice/src/com/android/service/ims/LauncherUtils.java
index 407a5a7..00252bf 100644
--- a/rcs/rcsservice/src/com/android/service/ims/LauncherUtils.java
+++ b/rcs/rcsservice/src/com/android/service/ims/LauncherUtils.java
@@ -28,12 +28,11 @@
 
 package com.android.service.ims;
 
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.ComponentName;
 
 import com.android.ims.internal.Logger;
-import com.android.service.ims.RcsService;
 
 /**
  * Launcher utility functions
diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsService.java b/rcs/rcsservice/src/com/android/service/ims/RcsService.java
index 953db2f..78708da 100644
--- a/rcs/rcsservice/src/com/android/service/ims/RcsService.java
+++ b/rcs/rcsservice/src/com/android/service/ims/RcsService.java
@@ -28,51 +28,60 @@
 
 package com.android.service.ims;
 
-import java.util.List;
-
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.content.Context;
 import android.app.Service;
-import android.os.ServiceManager;
-import android.os.Handler;
+import android.content.Intent;
 import android.database.ContentObserver;
-import android.content.BroadcastReceiver;
-import android.provider.Settings;
 import android.net.ConnectivityManager;
-import com.android.ims.ImsManager;
-import com.android.ims.ImsConnectionStateListener;
-import com.android.ims.ImsException;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.telephony.AccessNetworkConstants;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.ImsMmTelManager;
 import android.telephony.ims.ImsReasonInfo;
+import android.telephony.ims.RegistrationManager;
+import android.telephony.ims.feature.MmTelFeature;
 
-import com.android.ims.RcsManager.ResultCode;
-import com.android.ims.internal.IRcsService;
 import com.android.ims.IRcsPresenceListener;
+import com.android.ims.RcsManager.ResultCode;
 import com.android.ims.internal.IRcsPresence;
-
+import com.android.ims.internal.IRcsService;
 import com.android.ims.internal.Logger;
 import com.android.internal.telephony.IccCardConstants;
-import com.android.internal.telephony.TelephonyIntents;
-
+import com.android.service.ims.R;
 import com.android.service.ims.presence.PresencePublication;
 import com.android.service.ims.presence.PresenceSubscriber;
 
-import com.android.service.ims.R;
+import java.util.List;
 
-public class RcsService extends Service{
-    /**
-     * The logger
-     */
+public class RcsService extends Service {
+
+    private static final int IMS_SERVICE_RETRY_TIMEOUT_MS = 5000;
+
     private Logger logger = Logger.getLogger(this.getClass().getName());
 
     private RcsStackAdaptor mRcsStackAdaptor = null;
     private PresencePublication mPublication = null;
     private PresenceSubscriber mSubscriber = null;
 
-    private BroadcastReceiver mReceiver = null;
+    private Handler mRetryHandler;
+    private Runnable mRegisterCallbacks = this::registerImsCallbacksAndSetAssociatedSubscription;
+    private int mNetworkRegistrationType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID;
+
+    private int mAssociatedSubscription = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+    private SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangedListener
+            = new SubscriptionManager.OnSubscriptionsChangedListener() {
+        @Override
+        public void onSubscriptionsChanged() {
+            registerImsCallbacksAndSetAssociatedSubscription();
+        }
+    };
 
     @Override
     public void onCreate() {
@@ -118,54 +127,94 @@
         getContentResolver().registerContentObserver(
                 SubscriptionManager.CONTENT_URI, false, mSiminfoSettingObserver);
 
-        mReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                logger.print("onReceive intent=" + intent);
-                if(ImsManager.ACTION_IMS_SERVICE_UP.equalsIgnoreCase(
-                        intent.getAction())){
-                    handleImsServiceUp();
-                } else if(ImsManager.ACTION_IMS_SERVICE_DOWN.equalsIgnoreCase(
-                        intent.getAction())){
-                    handleImsServiceDown();
-                } else if(TelephonyIntents.ACTION_SIM_STATE_CHANGED.equalsIgnoreCase(
-                        intent.getAction())) {
-                    String stateExtra = intent.getStringExtra(
-                            IccCardConstants.INTENT_KEY_ICC_STATE);
-                    handleSimStateChanged(stateExtra);
+        mRetryHandler = new Handler(Looper.getMainLooper());
+        registerSubscriptionChangedListener();
+    }
+
+    private void registerSubscriptionChangedListener() {
+        SubscriptionManager subscriptionManager = getSystemService(SubscriptionManager.class);
+        if (subscriptionManager != null) {
+            // This will call back after the listener is added automatically.
+            subscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
+        } else {
+            logger.error("SubscriptionManager not available! Retrying...");
+            // Retry this again after some time.
+            mRetryHandler.postDelayed(this::registerSubscriptionChangedListener,
+                    IMS_SERVICE_RETRY_TIMEOUT_MS);
+        }
+    }
+
+    private void registerImsCallbacksAndSetAssociatedSubscription() {
+        SubscriptionManager sm = getSystemService(SubscriptionManager.class);
+        if (sm == null) {
+            logger.warn("handleSubscriptionsChanged: SubscriptionManager is null!");
+            return;
+        }
+        List<SubscriptionInfo> infos = sm.getActiveSubscriptionInfoList();
+        if (infos == null || infos.isEmpty()) {
+            // There are no active subscriptions right now.
+            handleImsServiceDown();
+        } else {
+            int defaultVoiceSub = SubscriptionManager.getDefaultVoiceSubscriptionId();
+            // Get default voice id and then try to register for IMS callbacks
+            if (defaultVoiceSub == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+                for (SubscriptionInfo info : infos) {
+                    if (!info.isOpportunistic()) {
+                        defaultVoiceSub = info.getSubscriptionId();
+                        break;
+                    }
                 }
             }
-        };
+            if (defaultVoiceSub == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+                handleImsServiceDown();
+                return;
+            }
 
-        IntentFilter statusFilter = new IntentFilter();
-        statusFilter.addAction(ImsManager.ACTION_IMS_SERVICE_UP);
-        statusFilter.addAction(ImsManager.ACTION_IMS_SERVICE_DOWN);
-        statusFilter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
-        registerReceiver(mReceiver, statusFilter);
+            ImsMmTelManager mIms = ImsMmTelManager.createForSubscriptionId(defaultVoiceSub);
+            try {
+                if (defaultVoiceSub == mAssociatedSubscription) {
+                    // Don't register duplicate callbacks for the same subscription.
+                    return;
+                }
+                if (mAssociatedSubscription != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+                    // Get rid of any existing registrations.
+                    ImsMmTelManager mOldIms = ImsMmTelManager.createForSubscriptionId(
+                            mAssociatedSubscription);
+                    mOldIms.unregisterImsRegistrationCallback(mImsRegistrationCallback);
+                    mOldIms.unregisterMmTelCapabilityCallback(mCapabilityCallback);
+                    logger.print("callbacks unregistered for sub " + mAssociatedSubscription);
+                }
+                // move over registrations.
+                mIms.registerImsRegistrationCallback(getMainExecutor(), mImsRegistrationCallback);
+                mIms.registerMmTelCapabilityCallback(getMainExecutor(), mCapabilityCallback);
+                mAssociatedSubscription = defaultVoiceSub;
+                logger.print("callbacks registered for sub " + mAssociatedSubscription);
+                handleImsServiceUp();
+            } catch (ImsException e) {
+                logger.info("Couldn't register callbacks for " + defaultVoiceSub + ": "
+                        + e.getMessage());
+                if (e.getCode() == ImsException.CODE_ERROR_SERVICE_UNAVAILABLE) {
+                    // IMS temporarily unavailable. Retry after a few seconds.
+                    mRetryHandler.removeCallbacks(mRegisterCallbacks);
+                    mRetryHandler.postDelayed(mRegisterCallbacks, IMS_SERVICE_RETRY_TIMEOUT_MS);
+                }
+            }
+        }
     }
 
     public void handleImsServiceUp() {
         if(mPublication != null) {
             mPublication.handleImsServiceUp();
         }
-
-        registerImsConnectionStateListener();
     }
 
     public void handleImsServiceDown() {
+        mAssociatedSubscription = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
         if(mPublication != null) {
             mPublication.handleImsServiceDown();
         }
     }
 
-    public void handleSimStateChanged(String state) {
-
-        if(IccCardConstants.INTENT_VALUE_ICC_LOADED.equalsIgnoreCase(state)) {
-            // ImsManager depends on a loaded SIM to get the default Voice Registration.
-            registerImsConnectionStateListener();
-        }
-    }
-
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
@@ -181,10 +230,8 @@
     public void onDestroy() {
         getContentResolver().unregisterContentObserver(mObserver);
         getContentResolver().unregisterContentObserver(mSiminfoSettingObserver);
-        if (mReceiver != null) {
-            unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
+        getSystemService(SubscriptionManager.class)
+                .removeOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
 
         mRcsStackAdaptor.finish();
         mPublication.finish();
@@ -199,11 +246,7 @@
         return mPublication;
     }
 
-    public PresenceSubscriber getPresenceSubscriber(){
-        return mSubscriber;
-    }
-
-    IRcsPresence.Stub mIRcsPresenceImpl = new IRcsPresence.Stub(){
+    IRcsPresence.Stub mIRcsPresenceImpl = new IRcsPresence.Stub() {
         /**
          * Asyncrhonously request the latest capability for a given contact list.
          * The result will be saved to DB directly if the contactNumber can be found in DB.
@@ -331,15 +374,18 @@
 
         @Override
         public void onChange(final boolean selfChange) {
-            ImsManager imsManager = ImsManager.getInstance(RcsService.this,
-                    SubscriptionManager.getDefaultVoicePhoneId());
-            if (imsManager == null) {
+            if (mAssociatedSubscription == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
                 return;
             }
-            boolean enabled = imsManager.isVtEnabledByUser();
-             logger.debug("vt enabled status: " + (enabled ? "ON" : "OFF"));
-
-            onVtEnabled(enabled);
+            ImsMmTelManager ims = ImsMmTelManager.createForSubscriptionId(mAssociatedSubscription);
+            try {
+                boolean enabled = ims.isVtSettingEnabled();
+                logger.debug("vt enabled status: " + (enabled ? "ON" : "OFF"));
+                onVtEnabled(enabled);
+            } catch (Exception e) {
+                logger.info("Exception getting VT status for sub:" + mAssociatedSubscription
+                        + ", Exception = " + e.getMessage());
+            }
         }
     }
 
@@ -372,45 +418,35 @@
         }
     };
 
-    void registerImsConnectionStateListener() {
-        try {
-            ImsManager imsManager = ImsManager.getInstance(this,
-                    SubscriptionManager.getDefaultVoicePhoneId());
-            if (imsManager != null) {
-                imsManager.addRegistrationListener(mImsConnectionStateListener);
+    private RegistrationManager.RegistrationCallback mImsRegistrationCallback
+            = new RegistrationManager.RegistrationCallback() {
+
+        @Override
+        public void onRegistered(int imsTransportType) {
+            logger.debug("onImsConnected imsTransportType=" + imsTransportType);
+            mNetworkRegistrationType = imsTransportType;
+            if(mPublication != null) {
+                mPublication.onImsConnected();
             }
-        } catch (ImsException e) {
-            logger.error("addRegistrationListener exception=", e);
         }
-    }
 
-    private ImsConnectionStateListener mImsConnectionStateListener =
-        new ImsConnectionStateListener() {
-            @Override
-            public void onImsConnected(int imsRadioTech) {
-                logger.debug("onImsConnected imsRadioTech=" + imsRadioTech);
-
-                if(mPublication != null) {
-                    mPublication.onImsConnected();
-                }
+        @Override
+        public void onUnregistered(ImsReasonInfo info) {
+            logger.debug("onImsDisconnected");
+            mNetworkRegistrationType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID;
+            if(mPublication != null) {
+                mPublication.onImsDisconnected();
             }
+        }
+    };
 
-            @Override
-            public void onImsDisconnected(ImsReasonInfo imsReasonInfo) {
-                logger.debug("onImsDisconnected");
-                if(mPublication != null) {
-                    mPublication.onImsDisconnected();
-                }
-            }
+    private ImsMmTelManager.CapabilityCallback mCapabilityCallback
+            = new ImsMmTelManager.CapabilityCallback() {
 
-            @Override
-            public void onFeatureCapabilityChanged(final int serviceClass,
-                    final int[] enabledFeatures, final int[] disabledFeatures) {
-                logger.debug("onFeatureCapabilityChanged");
-                if(mPublication != null) {
-                    mPublication.onFeatureCapabilityChanged(serviceClass, enabledFeatures, disabledFeatures);
-                }
-            }
-        };
+        @Override
+        public void onCapabilitiesStatusChanged(MmTelFeature.MmTelCapabilities capabilities) {
+            mPublication.onFeatureCapabilityChanged(mNetworkRegistrationType, capabilities);
+        }
+    };
 }
 
diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsServiceApp.java b/rcs/rcsservice/src/com/android/service/ims/RcsServiceApp.java
index c1f683d..c54668d 100644
--- a/rcs/rcsservice/src/com/android/service/ims/RcsServiceApp.java
+++ b/rcs/rcsservice/src/com/android/service/ims/RcsServiceApp.java
@@ -29,9 +29,8 @@
 package com.android.service.ims;
 
 import android.app.Application;
-import android.content.Context;
+
 import com.android.ims.internal.Logger;
-import android.os.SystemProperties;
 
 public class RcsServiceApp extends Application {
     private Logger logger = Logger.getLogger(this.getClass().getName());
diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java b/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java
index 40de8f7..40fb709 100644
--- a/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java
+++ b/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java
@@ -28,19 +28,13 @@
 
 package com.android.service.ims;
 
-import java.lang.String;
-
+import android.content.Context;
 import android.os.PersistableBundle;
 import android.telephony.CarrierConfigManager;
-import android.telephony.TelephonyManager;
-import android.content.Context;
+
 import com.android.ims.ImsConfig;
-import com.android.ims.ImsManager;
 import com.android.ims.ImsException;
-import android.os.SystemProperties;
-
-import com.android.ims.RcsManager.ResultCode;
-
+import com.android.ims.ImsManager;
 import com.android.ims.internal.Logger;
 
 public class RcsSettingUtils{
diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java b/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java
index 902f6c7..eb2edd7 100644
--- a/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java
+++ b/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java
@@ -28,58 +28,41 @@
 
 package com.android.service.ims;
 
-import java.util.List;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
+import android.app.AlarmManager;
+import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
 import android.content.Context;
 import android.content.Intent;
-import android.app.PendingIntent;
 import android.content.IntentFilter;
-import android.content.ServiceConnection;
 import android.os.Handler;
 import android.os.HandlerThread;
-import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
 import android.os.RemoteException;
-import android.telephony.TelephonyManager;
-import android.app.AlarmManager;
 import android.os.SystemClock;
 import android.os.SystemProperties;
-import com.android.ims.ImsConfig;
-import com.android.ims.ImsManager;
-import com.android.ims.ImsException;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
 
 import com.android.ims.IRcsPresenceListener;
-import com.android.ims.RcsPresence;
 import com.android.ims.RcsManager.ResultCode;
+import com.android.ims.RcsPresence;
 import com.android.ims.RcsPresence.PublishState;
-
-import com.android.ims.internal.Logger;
+import com.android.ims.RcsPresenceInfo;
 import com.android.ims.internal.ContactNumberUtils;
-import com.android.service.ims.presence.PresencePublication;
-
+import com.android.ims.internal.Logger;
+import com.android.ims.internal.uce.common.CapInfo;
+import com.android.ims.internal.uce.common.StatusCode;
+import com.android.ims.internal.uce.common.UceLong;
 import com.android.ims.internal.uce.presence.IPresenceService;
 import com.android.ims.internal.uce.presence.PresCapInfo;
-import com.android.ims.internal.uce.common.CapInfo;
 import com.android.ims.internal.uce.uceservice.IUceService;
 import com.android.ims.internal.uce.uceservice.ImsUceManager;
-import com.android.ims.internal.uce.common.UceLong;
-import com.android.ims.internal.uce.common.StatusCode;
-
-import com.android.ims.IRcsPresenceListener;
-import com.android.ims.RcsPresenceInfo;
-
-import com.android.service.ims.presence.StackListener;
-import com.android.service.ims.presence.PresenceInfoParser;
 import com.android.service.ims.presence.AlarmBroadcastReceiver;
+import com.android.service.ims.presence.PresenceInfoParser;
+import com.android.service.ims.presence.PresencePublication;
+import com.android.service.ims.presence.StackListener;
 
 public class RcsStackAdaptor{
     private static final boolean DEBUG = true;
diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsUtils.java b/rcs/rcsservice/src/com/android/service/ims/RcsUtils.java
index bbfacd2..22e156e 100644
--- a/rcs/rcsservice/src/com/android/service/ims/RcsUtils.java
+++ b/rcs/rcsservice/src/com/android/service/ims/RcsUtils.java
@@ -28,15 +28,9 @@
 
 package com.android.service.ims;
 
-import java.lang.String;
-import android.telephony.TelephonyManager;
-import android.content.Context;
-
-import com.android.ims.internal.uce.common.StatusCode;
-
 import com.android.ims.RcsManager.ResultCode;
-
 import com.android.ims.internal.Logger;
+import com.android.ims.internal.uce.common.StatusCode;
 
 public class RcsUtils{
     /*
diff --git a/rcs/rcsservice/src/com/android/service/ims/Task.java b/rcs/rcsservice/src/com/android/service/ims/Task.java
index a58aebf..eb36a5f 100644
--- a/rcs/rcsservice/src/com/android/service/ims/Task.java
+++ b/rcs/rcsservice/src/com/android/service/ims/Task.java
@@ -28,14 +28,8 @@
 
 package com.android.service.ims;
 
-import java.util.Set;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ArrayList;
-import android.os.RemoteException;
-
-import com.android.ims.internal.Logger;
 import com.android.ims.IRcsPresenceListener;
+import com.android.ims.internal.Logger;
 
 /**
  * Task
diff --git a/rcs/rcsservice/src/com/android/service/ims/TaskManager.java b/rcs/rcsservice/src/com/android/service/ims/TaskManager.java
index 74e11a6..a643861 100644
--- a/rcs/rcsservice/src/com/android/service/ims/TaskManager.java
+++ b/rcs/rcsservice/src/com/android/service/ims/TaskManager.java
@@ -28,30 +28,23 @@
 
 package com.android.service.ims;
 
-import java.util.Set;
+import android.content.Context;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.telephony.PhoneNumberUtils;
+
+import com.android.ims.IRcsPresenceListener;
+import com.android.ims.internal.Logger;
+import com.android.service.ims.presence.PresenceAvailabilityTask;
+import com.android.service.ims.presence.PresenceCapabilityTask;
+import com.android.service.ims.presence.PresenceTask;
+
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.List;
-import java.util.ArrayList;
-import android.os.RemoteException;
-import android.content.Context;
-import android.os.Handler;
-import android.os.Message;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.telephony.PhoneNumberUtils;
-
-import com.android.ims.internal.uce.presence.PresCmdStatus;
-
-import com.android.ims.internal.Logger;
-import com.android.ims.RcsManager.ResultCode;
-import com.android.ims.RcsPresenceInfo;
-import com.android.ims.IRcsPresenceListener;
-
-import com.android.service.ims.presence.PresenceTask;
-import com.android.service.ims.presence.PresenceCapabilityTask;
-import com.android.service.ims.presence.PresenceAvailabilityTask;
+import java.util.Set;
 
 /**
  * TaskManager
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/AlarmBroadcastReceiver.java b/rcs/rcsservice/src/com/android/service/ims/presence/AlarmBroadcastReceiver.java
index cd213a9..f191186 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/AlarmBroadcastReceiver.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/AlarmBroadcastReceiver.java
@@ -33,7 +33,6 @@
 import android.content.Intent;
 
 import com.android.ims.internal.Logger;
-
 import com.android.service.ims.RcsStackAdaptor;
 import com.android.service.ims.TaskManager;
 
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceAvailabilityTask.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceAvailabilityTask.java
index 99c698f..a008589 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceAvailabilityTask.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceAvailabilityTask.java
@@ -28,26 +28,8 @@
 
 package com.android.service.ims.presence;
 
-import java.util.Set;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ArrayList;
-import android.content.Context;
-import android.content.Intent;
-import android.app.PendingIntent;
-import android.content.IntentFilter;
-import android.os.RemoteException;
-import android.app.AlarmManager;
-import android.os.SystemClock;
-
-import com.android.ims.internal.uce.presence.PresCmdStatus;
-
-import com.android.ims.internal.Logger;
-import com.android.ims.RcsManager.ResultCode;
-import com.android.ims.RcsPresenceInfo;
 import com.android.ims.IRcsPresenceListener;
-
-import com.android.service.ims.TaskManager;
+import com.android.ims.internal.Logger;
 
 /**
  * PresenceAvailabilityTask
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java
index 290e650..abe6fd7 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java
@@ -28,26 +28,16 @@
 
 package com.android.service.ims.presence;
 
-import java.lang.String;
-import android.content.ContentResolver;
-import android.content.ContentValues;
 import android.content.Context;
 import android.os.RemoteException;
 import android.content.Intent;
-import com.android.internal.telephony.TelephonyIntents;
-import android.content.ComponentName;
 
-import com.android.ims.internal.uce.common.StatusCode;
-import com.android.ims.internal.uce.common.StatusCode;
 import com.android.ims.internal.uce.presence.PresCmdStatus;
-import com.android.ims.internal.uce.presence.PresResInfo;
 import com.android.ims.internal.uce.presence.PresSipResponse;
-
 import com.android.ims.RcsManager.ResultCode;
 import com.android.ims.RcsPresence.PublishState;
-import com.android.ims.RcsPresenceInfo;
-
 import com.android.ims.internal.Logger;
+import com.android.internal.telephony.TelephonyIntents;
 import com.android.service.ims.Task;
 import com.android.service.ims.RcsUtils;
 import com.android.service.ims.TaskManager;
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceCapabilityTask.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceCapabilityTask.java
index 8dbc120..ff69915 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceCapabilityTask.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceCapabilityTask.java
@@ -28,25 +28,15 @@
 
 package com.android.service.ims.presence;
 
-import java.util.Set;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ArrayList;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
-import android.app.PendingIntent;
-import android.content.IntentFilter;
 import android.os.RemoteException;
-import android.app.AlarmManager;
 import android.os.SystemClock;
 
-import com.android.ims.internal.uce.presence.PresCmdStatus;
-
-import com.android.ims.RcsManager.ResultCode;
-import com.android.ims.RcsPresenceInfo;
-import com.android.ims.IRcsPresenceListener;
-
 import com.android.ims.internal.Logger;
+import com.android.ims.IRcsPresenceListener;
 import com.android.service.ims.TaskManager;
 
 /**
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceInfoParser.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceInfoParser.java
index 6dabb28..1b3d795 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceInfoParser.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceInfoParser.java
@@ -30,21 +30,16 @@
 
 import java.lang.String;
 import java.util.ArrayList;
-import java.util.List;
-import android.text.TextUtils;
 
+import com.android.ims.internal.Logger;
 import com.android.ims.internal.uce.presence.PresTupleInfo;
 import com.android.ims.internal.uce.presence.PresRlmiInfo;
 import com.android.ims.internal.uce.presence.PresResInfo;
 import com.android.ims.internal.uce.presence.PresResInstanceInfo;
-
-import com.android.ims.RcsManager.ResultCode;
 import com.android.ims.RcsPresenceInfo;
 import com.android.ims.RcsPresenceInfo.ServiceType;
 import com.android.ims.RcsPresenceInfo.ServiceState;
 
-import com.android.ims.internal.Logger;
-
 public class PresenceInfoParser{
     /*
      * The logger
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java
index e7607ee..f827622 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java
@@ -28,7 +28,6 @@
 
 package com.android.service.ims.presence;
 
-import java.util.List;
 import java.util.Arrays;
 
 import android.content.Context;
@@ -37,10 +36,10 @@
 import android.provider.Settings;
 import android.os.SystemProperties;
 import android.content.BroadcastReceiver;
-import android.content.ComponentName;
+import android.telephony.AccessNetworkConstants;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
-import com.android.internal.telephony.IccCardConstants;
-import com.android.internal.telephony.TelephonyIntents;
+
 import android.telecom.TelecomManager;
 import android.content.IntentFilter;
 import android.app.PendingIntent;
@@ -48,33 +47,26 @@
 import android.os.SystemClock;
 import android.os.Message;
 import android.os.Handler;
+import android.telephony.ims.feature.MmTelFeature;
 
 
 import com.android.ims.ImsManager;
-import com.android.ims.ImsConnectionStateListener;
 import com.android.ims.ImsServiceClass;
-import com.android.ims.ImsException;
-import android.telephony.SubscriptionManager;
 import com.android.ims.ImsConfig;
-import com.android.ims.ImsConfig.FeatureConstants;
-import com.android.ims.ImsConfig.FeatureValueConstants;
-
-import com.android.service.ims.RcsSettingUtils;
+import com.android.ims.internal.Logger;
+import com.android.ims.internal.uce.presence.PresPublishTriggerType;
+import com.android.ims.internal.uce.presence.PresSipResponse;
+import com.android.ims.internal.uce.presence.PresCmdStatus;
 import com.android.ims.RcsPresenceInfo;
 import com.android.ims.IRcsPresenceListener;
 import com.android.ims.RcsManager.ResultCode;
 import com.android.ims.RcsPresence.PublishState;
-
-import com.android.ims.internal.Logger;
-import com.android.service.ims.TaskManager;
-import com.android.service.ims.Task;
-
-import com.android.ims.internal.uce.presence.PresPublishTriggerType;
-import com.android.ims.internal.uce.presence.PresSipResponse;
-import com.android.ims.internal.uce.common.StatusCode;
-import com.android.ims.internal.uce.presence.PresCmdStatus;
-
+import com.android.internal.telephony.IccCardConstants;
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.service.ims.RcsSettingUtils;
 import com.android.service.ims.RcsStackAdaptor;
+import com.android.service.ims.Task;
+import com.android.service.ims.TaskManager;
 
 public class PresencePublication extends PresenceBase {
     private Logger logger = Logger.getLogger(this.getClass().getName());
@@ -1108,101 +1100,65 @@
         finish();
     }
 
-    public void onFeatureCapabilityChanged(final int serviceClass,
-            final int[] enabledFeatures, final int[] disabledFeatures) {
-        logger.debug("onFeatureCapabilityChanged serviceClass="+serviceClass
-                +", enabledFeatures="+Arrays.toString(enabledFeatures)
-                +", disabledFeatures="+Arrays.toString(disabledFeatures));
+    public void onFeatureCapabilityChanged(int networkType,
+            MmTelFeature.MmTelCapabilities capabilities) {
+        logger.debug("onFeatureCapabilityChanged networkType=" + networkType
+                +", capabilities=" + capabilities);
 
-        Thread thread = new Thread(new Runnable() {
-            @Override
-            public void run() {
-                onFeatureCapabilityChangedInternal(serviceClass,
-                        enabledFeatures, disabledFeatures);
-            }
-        }, "onFeatureCapabilityChangedInternal thread");
+        Thread thread = new Thread(() -> onFeatureCapabilityChangedInternal(networkType,
+                capabilities), "onFeatureCapabilityChangedInternal thread");
 
         thread.start();
     }
 
-    synchronized private void onFeatureCapabilityChangedInternal(int serviceClass,
-            int[] enabledFeatures, int[] disabledFeatures) {
-        if (serviceClass == ImsServiceClass.MMTEL) {
-            boolean oldIsVolteAvailable = mIsVolteAvailable;
-            boolean oldIsVtAvailable = mIsVtAvailable;
-            boolean oldIsVoWifiAvailable = mIsVoWifiAvailable;
-            boolean oldIsViWifiAvailable = mIsViWifiAvailable;
+    synchronized private void onFeatureCapabilityChangedInternal(int networkType,
+            MmTelFeature.MmTelCapabilities capabilities) {
+        boolean oldIsVolteAvailable = mIsVolteAvailable;
+        boolean oldIsVtAvailable = mIsVtAvailable;
+        boolean oldIsVoWifiAvailable = mIsVoWifiAvailable;
+        boolean oldIsViWifiAvailable = mIsViWifiAvailable;
 
-            if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE] ==
-                    ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE) {
-                mIsVolteAvailable = true;
-            } else if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE] ==
-                    ImsConfig.FeatureConstants.FEATURE_TYPE_UNKNOWN) {
-                mIsVolteAvailable = false;
-            } else {
-                logger.print("invalid value for FEATURE_TYPE_VOICE_OVER_LTE");
-            }
+        mIsVolteAvailable = (networkType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) &&
+                capabilities.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE);
 
-            if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI] ==
-                    ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI) {
-                mIsVoWifiAvailable = true;
-            } else if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI] ==
-                    ImsConfig.FeatureConstants.FEATURE_TYPE_UNKNOWN) {
-                mIsVoWifiAvailable = false;
-            } else {
-                logger.print("invalid value for FEATURE_TYPE_VOICE_OVER_WIFI");
-            }
+        mIsVoWifiAvailable = (networkType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) &&
+                capabilities.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE);
 
-            if (enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE] ==
-                    ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE) {
-                mIsVtAvailable = true;
-            } else if (enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE] ==
-                    ImsConfig.FeatureConstants.FEATURE_TYPE_UNKNOWN) {
-                mIsVtAvailable = false;
-            } else {
-                logger.print("invalid value for FEATURE_TYPE_VIDEO_OVER_LTE");
-            }
+        mIsVtAvailable = (networkType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) &&
+                capabilities.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO);
 
-            if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI] ==
-                    ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI) {
-                mIsViWifiAvailable = true;
-            } else if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI] ==
-                    ImsConfig.FeatureConstants.FEATURE_TYPE_UNKNOWN) {
-                mIsViWifiAvailable = false;
-            } else {
-                logger.print("invalid value for FEATURE_TYPE_VIDEO_OVER_WIFI");
-            }
+        mIsViWifiAvailable = (networkType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) &&
+                capabilities.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO);
 
-            logger.print("mIsVolteAvailable=" + mIsVolteAvailable +
-                    " mIsVoWifiAvailable=" + mIsVoWifiAvailable +
-                    " mIsVtAvailable=" + mIsVtAvailable +
-                    " mIsViWifiAvailable=" + mIsViWifiAvailable +
-                    " oldIsVolteAvailable=" + oldIsVolteAvailable +
-                    " oldIsVoWifiAvailable=" + oldIsVoWifiAvailable +
-                    " oldIsVtAvailable=" + oldIsVtAvailable +
-                    " oldIsViWifiAvailable=" + oldIsViWifiAvailable);
+        logger.print("mIsVolteAvailable=" + mIsVolteAvailable +
+                " mIsVoWifiAvailable=" + mIsVoWifiAvailable +
+                " mIsVtAvailable=" + mIsVtAvailable +
+                " mIsViWifiAvailable=" + mIsViWifiAvailable +
+                " oldIsVolteAvailable=" + oldIsVolteAvailable +
+                " oldIsVoWifiAvailable=" + oldIsVoWifiAvailable +
+                " oldIsVtAvailable=" + oldIsVtAvailable +
+                " oldIsViWifiAvailable=" + oldIsViWifiAvailable);
 
-            if(oldIsVolteAvailable != mIsVolteAvailable ||
-                    oldIsVtAvailable != mIsVtAvailable ||
-                    oldIsVoWifiAvailable != mIsVoWifiAvailable ||
-                    oldIsViWifiAvailable != mIsViWifiAvailable) {
-                if(mGotTriggerFromStack) {
-                    if((Settings.Global.getInt(mContext.getContentResolver(),
-                            Settings.Global.AIRPLANE_MODE_ON, 0) != 0) && !mIsVoWifiAvailable &&
-                            !mIsViWifiAvailable) {
-                        logger.print("Airplane mode was on and no vowifi and viwifi." +
-                            " Don't need publish. Stack will unpublish");
-                        return;
-                    }
-
-                    if(isOnIWLAN()) {
-                        // will check duplicated PUBLISH in requestPublication by invokePublish
-                        invokePublish(PresencePublication.PublishType.
-                                PRES_PUBLISH_TRIGGER_FEATURE_AVAILABILITY_CHANGED);
-                    }
-                } else {
-                    mHasCachedTrigger = true;
+        if(oldIsVolteAvailable != mIsVolteAvailable ||
+                oldIsVtAvailable != mIsVtAvailable ||
+                oldIsVoWifiAvailable != mIsVoWifiAvailable ||
+                oldIsViWifiAvailable != mIsViWifiAvailable) {
+            if(mGotTriggerFromStack) {
+                if((Settings.Global.getInt(mContext.getContentResolver(),
+                        Settings.Global.AIRPLANE_MODE_ON, 0) != 0) && !mIsVoWifiAvailable &&
+                        !mIsViWifiAvailable) {
+                    logger.print("Airplane mode was on and no vowifi and viwifi." +
+                        " Don't need publish. Stack will unpublish");
+                    return;
                 }
+
+                if(isOnIWLAN()) {
+                    // will check duplicated PUBLISH in requestPublication by invokePublish
+                    invokePublish(PresencePublication.PublishType.
+                            PRES_PUBLISH_TRIGGER_FEATURE_AVAILABILITY_CHANGED);
+                }
+            } else {
+                mHasCachedTrigger = true;
             }
         }
     }
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublishTask.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublishTask.java
index 361488e..73ae4ca 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublishTask.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublishTask.java
@@ -28,27 +28,9 @@
 
 package com.android.service.ims.presence;
 
-import java.util.Set;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ArrayList;
-import android.content.Context;
-import android.content.Intent;
-import android.app.PendingIntent;
-import android.content.IntentFilter;
-import android.os.RemoteException;
-import android.app.AlarmManager;
-import android.os.SystemClock;
-
-import com.android.ims.internal.uce.presence.PresCmdStatus;
-
 import com.android.ims.internal.Logger;
-import com.android.ims.RcsManager.ResultCode;
-import com.android.ims.RcsPresenceInfo;
 import com.android.ims.IRcsPresenceListener;
 
-import com.android.service.ims.TaskManager;
-
 /**
  * PresencePublishTask
  */
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java
index daa2636..ccd4cae 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java
@@ -28,51 +28,33 @@
 
 package com.android.service.ims.presence;
 
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.Semaphore;
-import android.content.ContentValues;
-import android.text.TextUtils;
-
-import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
-import com.android.internal.telephony.TelephonyIntents;
-import android.os.HandlerThread;
-import android.os.RemoteException;
 import android.telephony.TelephonyManager;
-import android.database.Cursor;
+import android.text.TextUtils;
 
-import java.lang.String;
-import android.content.Context;
-import android.util.Log;
-
-import com.android.ims.internal.uce.presence.PresSipResponse;
-import com.android.ims.internal.uce.common.StatusCode;
-import com.android.ims.internal.uce.common.StatusCode;
-import com.android.ims.internal.uce.presence.PresSubscriptionState;
+import com.android.ims.IRcsPresenceListener;
+import com.android.ims.RcsManager.ResultCode;
+import com.android.ims.RcsPresence;
+import com.android.ims.RcsPresence.PublishState;
+import com.android.ims.RcsPresenceInfo;
+import com.android.ims.internal.ContactNumberUtils;
+import com.android.ims.internal.Logger;
 import com.android.ims.internal.uce.presence.PresCmdStatus;
 import com.android.ims.internal.uce.presence.PresResInfo;
 import com.android.ims.internal.uce.presence.PresRlmiInfo;
+import com.android.ims.internal.uce.presence.PresSipResponse;
+import com.android.ims.internal.uce.presence.PresSubscriptionState;
 import com.android.ims.internal.uce.presence.PresTupleInfo;
-
-import com.android.ims.RcsPresenceInfo;
-import com.android.ims.RcsPresence;
-import com.android.ims.IRcsPresenceListener;
-import com.android.ims.RcsManager.ResultCode;
-import com.android.ims.RcsPresence.PublishState;
-
-import com.android.ims.internal.Logger;
-import com.android.ims.internal.ContactNumberUtils;
-import com.android.service.ims.TaskManager;
-import com.android.service.ims.Task;
+import com.android.service.ims.RcsSettingUtils;
 import com.android.service.ims.RcsStackAdaptor;
 import com.android.service.ims.RcsUtils;
-import com.android.service.ims.RcsSettingUtils;
+import com.android.service.ims.Task;
+import com.android.service.ims.TaskManager;
+
+import java.util.ArrayList;
+import java.util.List;
 
 public class PresenceSubscriber extends PresenceBase{
     /*
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceTask.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceTask.java
index 8ff74cd..ed8afdf 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceTask.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceTask.java
@@ -28,21 +28,10 @@
 
 package com.android.service.ims.presence;
 
-import java.util.Set;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ArrayList;
-import android.os.RemoteException;
-
-import com.android.ims.internal.uce.presence.PresCmdStatus;
-
-import com.android.ims.internal.Logger;
-import com.android.ims.RcsManager.ResultCode;
-import com.android.ims.RcsPresenceInfo;
 import com.android.ims.IRcsPresenceListener;
-
-import com.android.service.ims.Task;
+import com.android.ims.internal.Logger;
 import com.android.service.ims.RcsUtils;
+import com.android.service.ims.Task;
 
 /**
  * PresenceTask
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/StackListener.java b/rcs/rcsservice/src/com/android/service/ims/presence/StackListener.java
index 9ca82fc..ae1d415 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/StackListener.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/StackListener.java
@@ -28,22 +28,18 @@
 
 package com.android.service.ims.presence;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import android.content.ServiceConnection;
-import android.annotation.SuppressLint;
-import android.content.Intent;
 import android.content.Context;
-import android.content.SharedPreferences;
+import android.content.Intent;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.os.RemoteException;
-import android.text.TextUtils;
-import android.util.Log;
 import android.os.Parcel;
+import android.os.RemoteException;
+import android.util.Log;
 
+import com.android.ims.RcsManager;
+import com.android.ims.internal.Logger;
+import com.android.ims.internal.uce.common.StatusCode;
 import com.android.ims.internal.uce.presence.IPresenceListener;
 import com.android.ims.internal.uce.presence.PresCmdId;
 import com.android.ims.internal.uce.presence.PresCmdStatus;
@@ -52,18 +48,6 @@
 import com.android.ims.internal.uce.presence.PresRlmiInfo;
 import com.android.ims.internal.uce.presence.PresSipResponse;
 import com.android.ims.internal.uce.presence.PresTupleInfo;
-import com.android.ims.internal.uce.common.StatusCode;
-import com.android.ims.internal.uce.common.StatusCode;
-
-import com.android.ims.RcsManager;
-import com.android.ims.RcsManager.ResultCode;
-import com.android.ims.RcsPresence;
-import com.android.ims.RcsPresenceInfo;
-import com.android.ims.IRcsPresenceListener;
-
-import com.android.ims.internal.Logger;
-import com.android.service.ims.TaskManager;
-import com.android.service.ims.Task;
 import com.android.service.ims.RcsStackAdaptor;
 
 public class StackListener extends Handler{