Added 4g LTE option to Cellular Network Settings

- Data enabled removed.
+ Enchanced 4G LTE added.
+ Themed to Setting's Material.

Bug: 16213269
Change-Id: I36b21b0e7a5b1cab5f06b2ecb363cf94a9bf1986
diff --git a/res/drawable/preference_background.xml b/res/drawable/preference_background.xml
new file mode 100644
index 0000000..19ca432
--- /dev/null
+++ b/res/drawable/preference_background.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+        android:insetLeft="0dip"
+        android:insetTop="0dip"
+        android:insetRight="0dip"
+        android:insetBottom="0dip">
+
+    <shape android:shape="rectangle">
+        <solid android:color="@*android:color/background_material_light" />
+    </shape>
+
+</inset>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 7eec223..30da2f7 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -49,4 +49,6 @@
             <enum name="not_reachable" value="3" />
         </attr>
     </declare-styleable>
+
+    <attr name="preferenceBackgroundColor" format="color" />
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 70dcfc2..c343deb 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -134,6 +134,8 @@
     <string name="voicemail_abbreviated">VM:</string>
     <!-- Mobile network settings screen, setting option name -->
     <string name="networks">Network operators</string>
+    <!-- Cell Broadcast settings title.  [CHAR LIMIT=50] -->
+    <string name="cell_broadcast_settings">Emergency broadcasts</string>
     <!-- Call settings screen title -->
     <string name="call_settings">Call Settings</string>
     <!-- GSM Call settings screen, setting option name -->
@@ -369,6 +371,10 @@
         <item>"1"</item>
         <item>"0"</item>
     </string-array>
+    <!-- Cellular network 4G title [CHAR LIMIT=30] -->
+    <string name="enhanced_4g_lte_mode_title">Enhanced 4G LTE Mode</string>
+    <!-- Cellular network 4G summary [CHAR LIMIT=80] -->
+    <string name="enhanced_4g_lte_mode_summary">Use LTE services to improve voice and other communications (recommended)</string>
     <!-- Mobile network settings screen, data enabling checkbox name -->
     <string name="data_enabled">Data enabled</string>
     <!-- Mobile network settings screen, setting summary text when check box is not selected (explains what selecting it would do) [CHAR LIMITS=40] -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 426de7f..3a025e2 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -286,4 +286,9 @@
         <item name="android:windowIsFloating">true</item>
         <item name="android:backgroundDimEnabled">false</item>
     </style>
+
+    <style name="Theme.Material.Settings" parent="@android:style/Theme.Material.Settings">
+        <item name="@*android:actionBarSize">56dip</item>
+        <item name="preferenceBackgroundColor">@drawable/preference_background</item>
+    </style>
 </resources>
diff --git a/res/xml/network_setting.xml b/res/xml/network_setting.xml
index 00430e8..fcd4439 100644
--- a/res/xml/network_setting.xml
+++ b/res/xml/network_setting.xml
@@ -22,13 +22,7 @@
         android:title="@string/cdma_lte_data_service">
     </PreferenceScreen>
 
-    <CheckBoxPreference
-        android:key="button_data_enabled_key"
-        android:title="@string/data_enabled"
-        android:persistent="false"
-        android:summary="@string/data_enable_summary"/>
-
-    <CheckBoxPreference
+    <SwitchPreference
         android:key="button_roaming_key"
         android:title="@string/roaming"
         android:persistent="false"
@@ -51,4 +45,10 @@
         android:entryValues="@array/enabled_networks_values"
         android:dialogTitle="@string/preferred_network_mode_dialogtitle" />
 
+    <SwitchPreference
+        android:key="enhanced_4g_lte"
+        android:title="@string/enhanced_4g_lte_mode_title"
+        android:persistent="false"
+        android:summary="@string/enhanced_4g_lte_mode_summary"/>
+
 </PreferenceScreen>
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index 492ccc5..d077aa8 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -16,16 +16,22 @@
 
 package com.android.phone;
 
+import com.android.ims.ImsConfig;
+import com.android.ims.ImsManager;
+import com.android.ims.ImsException;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.TelephonyIntents;
 import com.android.internal.telephony.TelephonyProperties;
 
+import java.util.Map;
+
 import android.app.ActionBar;
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.net.Uri;
 import android.os.AsyncResult;
@@ -33,12 +39,15 @@
 import android.os.Handler;
 import android.os.Message;
 import android.os.SystemProperties;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
+import android.preference.SwitchPreference;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
@@ -63,14 +72,17 @@
     // debug data
     private static final String LOG_TAG = "NetworkSettings";
     private static final boolean DBG = true;
+    private static final String IMS_SHARED_PREFERENCES = "IMS_PREFERENCES";
+    private static final String KEY_IMS_ON = "IMS";
     public static final int REQUEST_CODE_EXIT_ECM = 17;
 
     //String keys for preference lookup
-    private static final String BUTTON_DATA_ENABLED_KEY = "button_data_enabled_key";
     private static final String BUTTON_PREFERED_NETWORK_MODE = "preferred_network_mode_key";
     private static final String BUTTON_ROAMING_KEY = "button_roaming_key";
     private static final String BUTTON_CDMA_LTE_DATA_SERVICE_KEY = "cdma_lte_data_service_key";
     private static final String BUTTON_ENABLED_NETWORKS_KEY = "enabled_networks_key";
+    private static final String BUTTON_4G_LTE_KEY = "enhanced_4g_lte";
+    private static final String BUTTON_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
 
     static final int preferredNetworkMode = Phone.PREFERRED_NT_MODE;
 
@@ -82,8 +94,8 @@
     //UI objects
     private ListPreference mButtonPreferredNetworkMode;
     private ListPreference mButtonEnabledNetworks;
-    private CheckBoxPreference mButtonDataRoam;
-    private CheckBoxPreference mButtonDataEnabled;
+    private SwitchPreference mButtonDataRoam;
+    private SwitchPreference mButton4glte;
     private Preference mLteDataServicePref;
 
     private static final String iface = "rmnet0"; //TODO: this will go away
@@ -114,6 +126,7 @@
         }
     }
 
+    @Override
     public void onDismiss(DialogInterface dialog) {
         // Assuming that onClick gets called first
         if (!mOkClicked) {
@@ -129,7 +142,9 @@
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         /** TODO: Refactor and get rid of the if's using subclasses */
-        if (mGsmUmtsOptions != null &&
+        if (preference.getKey().equals(BUTTON_4G_LTE_KEY)) {
+            return true;
+        } else if (mGsmUmtsOptions != null &&
                 mGsmUmtsOptions.preferenceTreeClick(preference) == true) {
             return true;
         } else if (mCdmaOptions != null &&
@@ -152,30 +167,6 @@
                     preferredNetworkMode);
             mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
             return true;
-        } else if (preference == mButtonDataRoam) {
-            if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");
-
-            //normally called on the toggle click
-            if (mButtonDataRoam.isChecked()) {
-                // First confirm with a warning dialog about charges
-                mOkClicked = false;
-                new AlertDialog.Builder(this).setMessage(
-                        getResources().getString(R.string.roaming_warning))
-                        .setTitle(android.R.string.dialog_alert_title)
-                        .setIconAttribute(android.R.attr.alertDialogIcon)
-                        .setPositiveButton(android.R.string.yes, this)
-                        .setNegativeButton(android.R.string.no, this)
-                        .show()
-                        .setOnDismissListener(this);
-            } else {
-                mPhone.setDataRoamingEnabled(false);
-            }
-            return true;
-        } else if (preference == mButtonDataEnabled) {
-            if (DBG) log("onPreferenceTreeClick: preference == mButtonDataEnabled.");
-
-            mPhone.setDataEnabled(mButtonDataEnabled.isChecked());
-            return true;
         } else if (preference == mLteDataServicePref) {
             String tmpl = android.provider.Settings.Global.getString(getContentResolver(),
                         android.provider.Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL);
@@ -210,8 +201,23 @@
         }
     }
 
+    public boolean isIMSOn() {
+        SharedPreferences imsPref =
+            getSharedPreferences(IMS_SHARED_PREFERENCES, Context.MODE_WORLD_READABLE);
+
+        return imsPref.getBoolean(KEY_IMS_ON, true);
+    }
+
+    private void setIMS(boolean turnOn) {
+        SharedPreferences imsPref =
+            getSharedPreferences(IMS_SHARED_PREFERENCES, Context.MODE_WORLD_READABLE);
+
+        imsPref.edit().putBoolean(KEY_IMS_ON, turnOn).commit();
+    }
+
     @Override
     protected void onCreate(Bundle icicle) {
+        setTheme(R.style.Theme_Material_Settings);
         super.onCreate(icicle);
 
         mPhone = PhoneGlobals.getPhone();
@@ -226,6 +232,11 @@
 
         addPreferencesFromResource(R.xml.network_setting);
 
+        mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY);
+
+        mButton4glte.setOnPreferenceChangeListener(this);
+        mButton4glte.setChecked(isIMSOn());
+
         try {
             Context con = createPackageContext("com.android.systemui", 0);
             int id = con.getResources().getIdentifier("config_show4GForLTE",
@@ -239,12 +250,12 @@
         //get UI object references
         PreferenceScreen prefSet = getPreferenceScreen();
 
-        mButtonDataEnabled = (CheckBoxPreference) prefSet.findPreference(BUTTON_DATA_ENABLED_KEY);
-        mButtonDataRoam = (CheckBoxPreference) prefSet.findPreference(BUTTON_ROAMING_KEY);
+        mButtonDataRoam = (SwitchPreference) prefSet.findPreference(BUTTON_ROAMING_KEY);
         mButtonPreferredNetworkMode = (ListPreference) prefSet.findPreference(
                 BUTTON_PREFERED_NETWORK_MODE);
         mButtonEnabledNetworks = (ListPreference) prefSet.findPreference(
                 BUTTON_ENABLED_NETWORKS_KEY);
+        mButtonDataRoam.setOnPreferenceChangeListener(this);
 
         mLteDataServicePref = prefSet.findPreference(BUTTON_CDMA_LTE_DATA_SERVICE_KEY);
 
@@ -337,6 +348,19 @@
             // android.R.id.home will be triggered in onOptionsItemSelected()
             actionBar.setDisplayHomeAsUpEnabled(true);
         }
+
+        final boolean isSecondaryUser = UserHandle.myUserId() != UserHandle.USER_OWNER;
+        // Enable link to CMAS app settings depending on the value in config.xml.
+        final boolean isCellBroadcastAppLinkEnabled = this.getResources().getBoolean(
+                com.android.internal.R.bool.config_cellBroadcastAppLinks);
+        if (isSecondaryUser || !isCellBroadcastAppLinkEnabled
+                || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS)) {
+            PreferenceScreen root = getPreferenceScreen();
+            Preference ps = findPreference(BUTTON_CELL_BROADCAST_SETTINGS);
+            if (ps != null) {
+                root.removePreference(ps);
+            }
+        }
     }
 
     @Override
@@ -351,8 +375,6 @@
         // preferences.
         getPreferenceScreen().setEnabled(true);
 
-        mButtonDataEnabled.setChecked(mPhone.getDataEnabled());
-
         // Set UI state in onResume because a user could go home, launch some
         // app to change this setting's backend, and re-launch this settings app
         // and the UI state would be inconsistent with actual state
@@ -462,6 +484,46 @@
                 mPhone.setPreferredNetworkType(modemNetworkMode, mHandler
                         .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
             }
+        } else if (preference == mButton4glte) {
+            ImsManager imsMan = ImsManager.getInstance(getBaseContext(),
+                    SubscriptionManager.getDefaultVoiceSubId());
+            SwitchPreference ltePref = (SwitchPreference)preference;
+
+            if (imsMan != null) {
+                try {
+                    if (ltePref.isChecked()) {
+                        imsMan.turnOffIms();
+                    } else {
+                        imsMan.turnOnIms();
+                    }
+                } catch(ImsException ie) {
+                    ltePref.setChecked(ltePref.isChecked());
+                    return false;
+                }
+                ltePref.setChecked(!ltePref.isChecked());
+                setIMS(ltePref.isChecked());
+            } else {
+                ltePref.setChecked(false);
+            }
+        } else if (preference == mButtonDataRoam) {
+            if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");
+
+            //normally called on the toggle click
+            if (!mButtonDataRoam.isChecked()) {
+                // First confirm with a warning dialog about charges
+                mOkClicked = false;
+                new AlertDialog.Builder(this).setMessage(
+                        getResources().getString(R.string.roaming_warning))
+                        .setTitle(android.R.string.dialog_alert_title)
+                        .setIconAttribute(android.R.attr.alertDialogIcon)
+                        .setPositiveButton(android.R.string.yes, this)
+                        .setNegativeButton(android.R.string.no, this)
+                        .show()
+                        .setOnDismissListener(this);
+            } else {
+                mPhone.setDataRoamingEnabled(false);
+            }
+            return true;
         }
 
         // always let the preference setting proceed.