[Settings] WFC preference will be grey out after disconnecting the call

Bug: 186369342
Test: manual
Change-Id: I1e15b72110ee86d90e50a47026f11c19a2e15f85
diff --git a/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java b/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
index b4ab2a0..bc11600 100644
--- a/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
+++ b/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
@@ -29,6 +29,7 @@
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyManager;
 import android.util.ArrayMap;
 import android.util.Log;
@@ -66,7 +67,7 @@
     @VisibleForTesting
     protected CarrierConfigManager mCarrierConfigManager;
     private SubscriptionManager mSubscriptionManager;
-
+    private PhoneCallStateTelephonyCallback mTelephonyCallback;
     private String mPreferenceGroupKey;
     private PreferenceGroup mPreferenceGroup;
     private Map<Integer, TelephonyManager> mTelephonyManagerList = new HashMap<>();
@@ -79,10 +80,12 @@
         super(context);
         mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
         mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
-
         mPreferenceGroupKey = preferenceGroupKey;
         mWifiCallingForSubPreferences = new ArrayMap<>();
         setSubscriptionInfoList(context);
+        if (mTelephonyCallback == null) {
+            mTelephonyCallback = new PhoneCallStateTelephonyCallback();
+        }
         lifecycle.addObserver(this);
     }
 
@@ -134,9 +137,17 @@
 
     @OnLifecycleEvent(Event.ON_RESUME)
     public void onResume() {
+        updateListener();
         update();
     }
 
+    @OnLifecycleEvent(Event.ON_PAUSE)
+    public void onPause() {
+        if ((mTelephonyCallback != null)) {
+            mTelephonyCallback.unregister();
+        }
+    }
+
     @Override
     public boolean isAvailable() {
         if (mSubInfoListForWfc == null) {
@@ -168,8 +179,6 @@
             return;
         }
 
-        setSubscriptionInfoList(mContext);
-
         if (!isAvailable()) {
             for (Preference pref : mWifiCallingForSubPreferences.values()) {
                 mPreferenceGroup.removePreference(pref);
@@ -246,9 +255,40 @@
 
     @Override
     public void onSubscriptionsChanged() {
+        setSubscriptionInfoList(mContext);
+        updateListener();
         update();
     }
 
+    private void updateListener() {
+        for (SubscriptionInfo info : mSubInfoListForWfc) {
+            int subId = info.getSubscriptionId();
+            if ((mTelephonyCallback != null)) {
+                mTelephonyCallback.register(mContext, subId);
+            }
+        }
+    }
+
+    private class PhoneCallStateTelephonyCallback extends TelephonyCallback implements
+            TelephonyCallback.CallStateListener {
+
+        private TelephonyManager mTelephonyManager;
+
+        @Override
+        public void onCallStateChanged(int state) {
+            update();
+        }
+
+        public void register(Context context, int subId) {
+            mTelephonyManager = getTelephonyManagerForSubscriptionId(subId);
+            mTelephonyManager.registerTelephonyCallback(context.getMainExecutor(), this);
+        }
+
+        public void unregister() {
+            mTelephonyManager.unregisterTelephonyCallback(this);
+        }
+    }
+
     /**
      * To indicate that should show the Wi-Fi calling preference or not.
      *