Merge "IMS: Do not mute the Mic during add call" into atel.lnx.2.0-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 70493df..b87e31f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -61,6 +61,8 @@
     <uses-permission android:name="android.permission.BROADCAST_STICKY" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
+    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
     <!-- This tells the activity manager to not delay any of our activity
      start requests, even if they happen immediately after the user
      presses home. -->
diff --git a/InCallUI/src/com/android/incallui/InCallMessageController.java b/InCallUI/src/com/android/incallui/InCallMessageController.java
index d019f6b..aa5a57e 100644
--- a/InCallUI/src/com/android/incallui/InCallMessageController.java
+++ b/InCallUI/src/com/android/incallui/InCallMessageController.java
@@ -30,7 +30,16 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.net.ConnectivityManager;
+import android.net.IConnectivityManager;
+import android.net.INetworkStatsService;
+import android.net.LinkProperties;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkState;
 import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
 
 import com.android.incallui.InCallPresenter.InCallDetailsListener;
 import com.android.incallui.InCallVideoCallCallbackNotifier.VideoEventListener;
@@ -51,6 +60,11 @@
         CallList.Listener, SessionModificationListener, InCallSessionModificationCauseListener,
         InCallDetailsListener {
 
+    private INetworkStatsService mStatsService;
+    private IConnectivityManager mConnManager;
+    private long previousLteUsage;
+    private long previousWlanUsage;
+
     private static InCallMessageController sInCallMessageController;
 
     private PrimaryCallTracker mPrimaryCallTracker;
@@ -78,6 +92,10 @@
         InCallPresenter.getInstance().addListener(mPrimaryCallTracker);
         InCallVideoCallCallbackNotifier.getInstance().addSessionModificationListener(this);
         InCallPresenter.getInstance().addDetailsListener(this);
+        mStatsService = INetworkStatsService.Stub.asInterface(
+                ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
+        mConnManager = IConnectivityManager.Stub.asInterface(
+                ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
     }
 
     /**
@@ -95,6 +113,10 @@
         InCallVideoCallCallbackNotifier.getInstance().removeSessionModificationListener(this);
         InCallPresenter.getInstance().removeDetailsListener(this);
         mPrimaryCallTracker = null;
+        mStatsService = null;
+        mConnManager = null;
+        previousLteUsage = 0;
+        previousWlanUsage = 0;
     }
 
     /**
@@ -223,6 +245,12 @@
         Log.i(this, "onDetailsChanged LTE data value = " + lteUsage + " WiFi data value = " +
                 wlanUsage);
 
+        if (mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_video_call_datausage_enable)) {
+            recordDataUsage(lteUsage, wlanUsage);
+        }
+
+
         if (QtiImsExtUtils.isCarrierConfigEnabled(mContext,
                 QtiCarrierConfigs.SHOW_DATA_USAGE_TOAST)) {
             final String dataUsageChangedText = mContext.getResources().getString(
@@ -397,4 +425,97 @@
                 break;
         }
     }
+
+     /**
+      * This method is used to ignore the repeatly calling onDetailsChanged
+      */
+     private boolean hasDataUsageChanged(long lteUsage, long wlanUsage) {
+         boolean hasChanged = false;
+         if (previousLteUsage != lteUsage) {
+             hasChanged = true;
+             previousLteUsage = lteUsage;
+         }
+         if (previousWlanUsage != wlanUsage) {
+             hasChanged = true;
+             previousWlanUsage = wlanUsage;
+         }
+         return hasChanged;
+     }
+
+     private void recordDataUsage(long lteUsage, long wlanUsage) {
+         String wifiIface;
+         String imsIface;
+         if(!hasDataUsageChanged(lteUsage, wlanUsage)) {
+             return;
+         }
+
+         if (wlanUsage != 0) {
+             wifiIface = getWifiIface();
+             if (wifiIface != null)
+                 recordUsage(wifiIface, ConnectivityManager.TYPE_WIFI, wlanUsage, 0);
+         }
+
+         if (lteUsage != 0 ) {
+             imsIface = getImsIface();
+             if (imsIface != null)
+                 recordUsage(imsIface, ConnectivityManager.TYPE_MOBILE, lteUsage, 0);
+         }
+     }
+
+     private void recordUsage(String ifaces, int ifaceType, long rx, long tx) {
+         if (ifaces == null) {
+             Log.d(this, "recordDataUseage ifaces is null");
+             return;
+         }
+         Log.d(this,"recordDataUseage ifaces ="+ ifaces + "   ifaceType=" + ifaceType +
+                 "rx = " + rx + " tx =" + tx);
+
+         try {
+             mStatsService.recordVideoCallData(ifaces, ifaceType, rx, tx);
+         } catch (RuntimeException e) {
+             Log.e(this, "recordDataUseage RuntimeException" + e);
+         } catch (RemoteException e) {
+             Log.e(this, "recordDataUseage RemoteException" + e);
+         }
+     }
+
+    private String getImsIface() {
+        final NetworkState[] states;
+        try {
+            states = mConnManager.getAllNetworkState();
+        } catch (RemoteException e) {
+            Log.e(this, "getVoiceCallIfaces RemoteException" + e);
+            return null;
+        }
+
+        if (states != null) {
+            for (NetworkState state : states) {
+                if (state.networkInfo.isConnected() && state.networkCapabilities.hasCapability(
+                        NetworkCapabilities.NET_CAPABILITY_IMS)) {
+                    final boolean isMobile = ConnectivityManager.isNetworkTypeMobile(
+                            state.networkInfo.getType());
+                    final String baseIface = state.linkProperties.getInterfaceName();
+                    if (isMobile)
+                        return baseIface;
+                }
+            }
+        }
+        return null;
+    }
+
+    private String getWifiIface() {
+        final LinkProperties wifiLinkProperties;
+        try {
+            wifiLinkProperties =
+                    mConnManager.getLinkPropertiesForType(ConnectivityManager.TYPE_WIFI);
+            if (wifiLinkProperties != null) {
+                return wifiLinkProperties.getInterfaceName();
+            }
+        } catch (RemoteException e) {
+            Log.e(this, "get wifi Iface RemoteException" + e);
+        }
+        return null;
+    }
+
+
 }
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 48d49af..98d9dc6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1160,7 +1160,8 @@
     <string name="call_data_info_description">Voice call usage time and data usage time</string>
     <string name="alert_call_over_wifi">Calls will be made over Wi-Fi.</string>
     <string name="alert_call_no_cellular_coverage">No cellular network available. Connect to available Wi-Fi to make calls.</string>
-    <string name="alert_user_connect_to_wifi_for_call">Connect to Wi-Fi to make calls.</string>
+    <string name="alert_user_connect_to_wifi_for_call">Connect to Wi-Fi to make calls</string>
+    <string name="alert_user_connect_to_wifi_for_call_text">Tap here to view available networks</string>
     <string name="missing_account_type">(No type)</string>
     <string name="missing_account_name">(No name)</string>
 </resources>
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index 0e89101..78e4760 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -2033,6 +2033,7 @@
         } else {
             if(WifiCallUtils.shallShowWifiCallDialog(getActivity())) {
                  WifiCallUtils.showWifiCallDialog(getActivity());
+                 WifiCallUtils.showWifiCallNotification(getActivity());
              } else {
                  getView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
                  handleDialButtonPressed();
diff --git a/src/com/android/dialer/settings/VideoCallingSettingsFragment.java b/src/com/android/dialer/settings/VideoCallingSettingsFragment.java
index fa73ab7..7a25901 100644
--- a/src/com/android/dialer/settings/VideoCallingSettingsFragment.java
+++ b/src/com/android/dialer/settings/VideoCallingSettingsFragment.java
@@ -35,6 +35,7 @@
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
 import android.preference.SwitchPreference;
+import android.util.Log;
 
 import java.lang.Object;
 import java.lang.Override;
@@ -49,6 +50,7 @@
     private final static String KEY_VIDEO_CALL = "video_calling_preference";
     private SwitchPreference mVideoCallingPreference;
     private Context mContext;
+    private static final String TAG = "VideoCallingSettingsFragment";
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -74,8 +76,8 @@
         if (preference == mVideoCallingPreference) {
             boolean isCheck = mVideoCallingPreference.isChecked();
             CallUtil.createVideoCallingDialog(isCheck , mContext);
-            Settings.System.putInt(mContext.getContentResolver(), CallUtil.CONFIG_VIDEO_CALLING,
-                    isCheck ? CallUtil.ENABLE_VIDEO_CALLING : CallUtil.DISABLE_VIDEO_CALLING);
+            boolean isSaved = CallUtil.saveVideoCallConfig(mContext,isCheck);
+            Log.d(TAG, "onPreferenceChange isSaved = " + isSaved);
         }
         return true;
     }
diff --git a/src/com/android/dialer/util/WifiCallUtils.java b/src/com/android/dialer/util/WifiCallUtils.java
index 0aa9a43..5e789ed 100644
--- a/src/com/android/dialer/util/WifiCallUtils.java
+++ b/src/com/android/dialer/util/WifiCallUtils.java
@@ -149,16 +149,13 @@
 
     public static void showWifiCallDialog(final Context context) {
         String promptMessage = context.getString(com.android.dialer.R.string
-                .alert_call_no_cellular_coverage) +"\n"+ context.getString(com.android.dialer.R
-                        .string.alert_user_connect_to_wifi_for_call);
+                .alert_call_no_cellular_coverage);
         AlertDialog.Builder diaBuilder = new AlertDialog.Builder(context);
         diaBuilder.setMessage(promptMessage);
         diaBuilder.setPositiveButton(com.android.internal.R.string.ok, new OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int which) {
-                Intent intent = new Intent(Intent.ACTION_MAIN);
-                intent.setClassName("com.qualcomm.qti.extsettings",
-                        "com.qualcomm.qti.extsettings.wificall.WifiCallingEnhancedSettings");
+                Intent intent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS);
                 context.startActivity(intent);
             }
         });
@@ -211,16 +208,18 @@
             builder.setAutoCancel(true);
             builder.setSmallIcon(R.drawable.wifi_calling_on_notification);
             builder.setContentTitle(
-                    context.getResources().getString(R.string.alert_user_connect_to_wifi_for_call));
+                    context.getResources().getString(
+                        R.string.alert_user_connect_to_wifi_for_call));
             builder.setContentText(
-                    context.getResources().getString(R.string.alert_user_connect_to_wifi_for_call));
+                    context.getResources().getString(
+                        R.string.alert_user_connect_to_wifi_for_call_text));
             notiManager.notify(NOTIFICATION_WIFI_CALL_ID, builder.build());
             new Handler().postDelayed(new Runnable() {
                     @Override
                     public void run() {
                         notiManager.cancel(NOTIFICATION_WIFI_CALL_ID);
                     }
-           }, 2000);
+           }, 5000);
         }
     }
 }