Merge "Update the uid correctly."
diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java
index af7a912..b0afe7c 100644
--- a/core/java/android/app/AlarmManager.java
+++ b/core/java/android/app/AlarmManager.java
@@ -104,8 +104,9 @@
      * Alarm time in {@link System#currentTimeMillis System.currentTimeMillis()}
      * (wall clock time in UTC), which will wake up the device when
      * it goes off. And it will power on the devices when it shuts down.
+     * Set as 5 to make it be compatible with android_alarm_type.
      */
-    public static final int RTC_POWEROFF_WAKEUP = 4;
+    public static final int RTC_POWEROFF_WAKEUP = 5;
 
     /**
      * Broadcast Action: Sent after the value returned by
diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl
index 961a3f4..0107d93 100644
--- a/core/java/android/nfc/INfcAdapter.aidl
+++ b/core/java/android/nfc/INfcAdapter.aidl
@@ -1,4 +1,7 @@
 /*
+ * Copyright (c) 2015, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
  * Copyright (C) 2010 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,6 +31,7 @@
 import android.nfc.INfcCardEmulation;
 import android.nfc.INfcUnlockHandler;
 import android.os.Bundle;
+import android.os.IBinder;
 
 /**
  * @hide
@@ -37,6 +41,7 @@
     INfcTag getNfcTagInterface();
     INfcCardEmulation getNfcCardEmulationInterface();
     INfcAdapterExtras getNfcAdapterExtrasInterface(in String pkg);
+    IBinder getNfcAdapterVendorInterface(in String vendor);
 
     int getState();
     boolean disable(boolean saveState);
diff --git a/core/java/android/nfc/cardemulation/AidGroup.java b/core/java/android/nfc/cardemulation/AidGroup.java
index 4407c9d..fcbf6ee 100644
--- a/core/java/android/nfc/cardemulation/AidGroup.java
+++ b/core/java/android/nfc/cardemulation/AidGroup.java
@@ -1,3 +1,22 @@
+/*
+ * Copyright (c) 2015, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
+ * 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.
+ */
+
 package android.nfc.cardemulation;
 
 import java.io.IOException;
@@ -21,7 +40,7 @@
  *
  * @hide
  */
-public final class AidGroup implements Parcelable {
+public class AidGroup implements Parcelable {
     /**
      * The maximum number of AIDs that can be present in any one group.
      */
@@ -29,9 +48,9 @@
 
     static final String TAG = "AidGroup";
 
-    final List<String> aids;
-    final String category;
-    final String description;
+    protected List<String> aids;
+    protected String category;
+    protected String description;
 
     /**
      * Creates a new AidGroup object.
diff --git a/core/java/android/nfc/tech/MifareClassic.java b/core/java/android/nfc/tech/MifareClassic.java
index 8c92288..302c02d 100644
--- a/core/java/android/nfc/tech/MifareClassic.java
+++ b/core/java/android/nfc/tech/MifareClassic.java
@@ -1,4 +1,6 @@
 /*
+ * Copyright (C) 2015 NXP Semiconductors
+ * The original Work has been changed by NXP Semiconductors.
  * Copyright (C) 2010 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -173,6 +175,10 @@
             mType = TYPE_CLASSIC;
             mSize = SIZE_4K;
             break;
+        case 0x19:
+            mType = TYPE_CLASSIC;
+            mSize = SIZE_2K;
+            break;
         case 0x28:
             mType = TYPE_CLASSIC;
             mSize = SIZE_1K;
diff --git a/core/java/android/nfc/tech/NfcA.java b/core/java/android/nfc/tech/NfcA.java
index 88730f9..b7fa455 100644
--- a/core/java/android/nfc/tech/NfcA.java
+++ b/core/java/android/nfc/tech/NfcA.java
@@ -1,4 +1,6 @@
 /*
+ * Copyright (C) 2015 NXP Semiconductors
+ * The original Work has been changed by NXP Semiconductors.
  * Copyright (C) 2010 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -66,8 +68,15 @@
     /** @hide */
     public NfcA(Tag tag) throws RemoteException {
         super(tag, TagTechnology.NFC_A);
-        Bundle extras = tag.getTechExtras(TagTechnology.NFC_A);
-        mSak = extras.getShort(EXTRA_SAK);
+        Bundle extras;
+        mSak = 0;
+        if(tag.hasTech(TagTechnology.MIFARE_CLASSIC))
+        {
+            extras = tag.getTechExtras(TagTechnology.MIFARE_CLASSIC);
+            mSak = extras.getShort(EXTRA_SAK);
+        }
+        extras = tag.getTechExtras(TagTechnology.NFC_A);
+        mSak |= extras.getShort(EXTRA_SAK);
         mAtqa = extras.getByteArray(EXTRA_ATQA);
     }
 
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index a10db45..817358d 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2744,6 +2744,15 @@
         private static final Validator TEXT_AUTO_CAPS_VALIDATOR = sBooleanValidator;
 
         /**
+         * Setting to show if system is in power off alarm mode. 1 = true, 0 = false
+         * @hide
+         */
+        public static final String POWER_OFF_ALARM_MODE = "power_off_alarm_mode";
+
+        /** Validator for POWER_OFF_ALARM_MODE */
+        private static final Validator POWER_OFF_ALARM_MODE_VALIDATOR = sBooleanValidator;
+
+        /**
          * Setting to enable Auto Punctuate in text editors. 1 = On, 0 = Off. This
          * feature converts two spaces to a "." and space.
          */
@@ -3355,6 +3364,7 @@
             PUBLIC_SETTINGS.add(SOUND_EFFECTS_ENABLED);
             PUBLIC_SETTINGS.add(HAPTIC_FEEDBACK_ENABLED);
             PUBLIC_SETTINGS.add(SHOW_WEB_SUGGESTIONS);
+            PUBLIC_SETTINGS.add(POWER_OFF_ALARM_MODE);
         }
 
         /**
@@ -3480,6 +3490,7 @@
             VALIDATORS.put(WIFI_STATIC_NETMASK, WIFI_STATIC_NETMASK_VALIDATOR);
             VALIDATORS.put(WIFI_STATIC_DNS1, WIFI_STATIC_DNS1_VALIDATOR);
             VALIDATORS.put(WIFI_STATIC_DNS2, WIFI_STATIC_DNS2_VALIDATOR);
+            VALIDATORS.put(POWER_OFF_ALARM_MODE, POWER_OFF_ALARM_MODE_VALIDATOR);
         }
 
         /**
diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml
index 444f0f0..de73538 100644
--- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml
+++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml
@@ -36,6 +36,15 @@
         android:textAppearance="?android:attr/textAppearanceSmall"
         android:accessibilityLiveRegion="polite" />
 
+    <include layout="@layout/keyguard_eca"
+        android:id="@+id/keyguard_selector_fade_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="36dp"
+        android:orientation="vertical"
+        android:layout_gravity="bottom|center_horizontal"
+        android:gravity="center_horizontal" />
+
     <FrameLayout
         android:id="@+id/preview_container"
         android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml
index 6ae5cf3..3d25f9f 100644
--- a/packages/SystemUI/res/layout/mobile_signal_group.xml
+++ b/packages/SystemUI/res/layout/mobile_signal_group.xml
@@ -1,5 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
+/*
+ * Copyright (c) 2015 The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+*/
 /* apps/common/assets/default/default/skins/StatusBar.xml
 **
 ** Copyright 2011, The Android Open Source Project
@@ -17,31 +21,73 @@
 ** limitations under the License.
 */
 -->
-<FrameLayout
+<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
     android:id="@+id/mobile_combo"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     >
-    <com.android.systemui.statusbar.AnimatedImageView
-        android:theme="@style/DualToneLightTheme"
-        android:id="@+id/mobile_signal"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        systemui:hasOverlappingRendering="false"
-        />
-    <com.android.systemui.statusbar.AnimatedImageView
-        android:theme="@style/DualToneDarkTheme"
-        android:id="@+id/mobile_signal_dark"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:alpha="0.0"
-        systemui:hasOverlappingRendering="false"
-        />
     <ImageView
-        android:id="@+id/mobile_type"
-        android:layout_height="wrap_content"
         android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="2dp"
+        android:id="@+id/data_inout"
+        android:visibility="gone"
         />
-</FrameLayout>
+    <FrameLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        >
+        <FrameLayout
+            android:id="@+id/mobile_signal_single"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            >
+            <com.android.systemui.statusbar.AnimatedImageView
+                android:theme="@style/DualToneLightTheme"
+                android:id="@+id/mobile_signal"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                systemui:hasOverlappingRendering="false"
+                />
+            <com.android.systemui.statusbar.AnimatedImageView
+                android:theme="@style/DualToneDarkTheme"
+                android:id="@+id/mobile_signal_dark"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:alpha="0.0"
+                systemui:hasOverlappingRendering="false"
+                />
+            <ImageView
+                android:id="@+id/mobile_type"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                />
+            <ImageView
+                android:id="@+id/mobile_inout"
+                android:layout_height="17dp"
+                android:layout_width="17dp"
+                android:layout_gravity="end|bottom"
+                />
+        </FrameLayout>
+        <LinearLayout
+            android:id="@+id/mobile_signal_stacked"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:visibility="gone"
+            >
+            <ImageView
+                android:id="@+id/mobile_signal_data"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                />
+            <ImageView
+                android:id="@+id/mobile_signal_voice"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                />
+        </LinearLayout>
+    </FrameLayout>
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml
index f8bd6fd..621a739 100644
--- a/packages/SystemUI/res/layout/signal_cluster_view.xml
+++ b/packages/SystemUI/res/layout/signal_cluster_view.xml
@@ -75,6 +75,14 @@
             android:alpha="0.0"
             systemui:hasOverlappingRendering="false"
             />
+        <com.android.systemui.statusbar.AlphaOptimizedImageView
+            android:theme="@style/DualToneLightTheme"
+            android:id="@+id/wifi_inout"
+            android:layout_height="17dp"
+            android:layout_width="18.41dp"
+            android:layout_gravity="center|bottom"
+            systemui:hasOverlappingRendering="false"
+            />
     </FrameLayout>
     <View
         android:id="@+id/wifi_signal_spacer"
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index a5b3a83..ea3f8b7 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -75,6 +75,20 @@
                     android:gravity="center_vertical"
                     android:orientation="horizontal"/>
             </com.android.keyguard.AlphaOptimizedLinearLayout>
+
+            <com.android.keyguard.CarrierText
+                android:id="@+id/status_carrier_text"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/match_parent"
+                android:layout_marginStart="@dimen/keyguard_carrier_text_margin"
+                android:layout_toStartOf="@id/notification_icon_area_inner"
+                android:gravity="center_vertical"
+                android:ellipsize="marquee"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textColor="#ffffff"
+                android:singleLine="true"
+                android:visibility="gone"/>
+
         </com.android.systemui.statusbar.AlphaOptimizedFrameLayout>
 
         <com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/system_icon_area"
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index f7bbce0..148212e 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -20,6 +20,7 @@
 
 <com.android.systemui.statusbar.phone.NotificationPanelView 
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/res-auto"
     xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
     android:id="@+id/notification_panel"
     android:layout_width="match_parent"
@@ -27,6 +28,19 @@
     android:background="@android:color/transparent"
     >
 
+    <com.android.keyguard.CarrierText
+        android:id="@+id/carrier_label"
+        android:layout_height="@dimen/carrier_label_height"
+        android:layout_width="match_parent"
+        android:layout_marginBottom="@dimen/close_handle_height"
+        android:layout_gravity="bottom"
+        android:gravity="center"
+        android:ellipsize="marquee"
+        android:singleLine="true"
+        android:visibility="invisible"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="#999999" />
+
     <include
         layout="@layout/keyguard_status_view"
         android:layout_height="wrap_content"
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 84e0eea..5637222 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -142,7 +142,7 @@
     <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
     <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
     <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
-    <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"漫游中"</string>
+    <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"数据漫游"</string>
     <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
     <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"WLAN"</string>
     <string name="accessibility_no_sim" msgid="8274017118472455155">"无 SIM 卡。"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index e0464b7..b39c088 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -142,7 +142,7 @@
     <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
     <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
     <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
-    <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"漫遊中"</string>
+    <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"數據漫遊"</string>
     <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
     <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="8274017118472455155">"沒有 SIM 卡。"</string>
diff --git a/packages/SystemUI/res/values/arrays.xml b/packages/SystemUI/res/values/arrays.xml
index 6102aa6..a0a3397 100644
--- a/packages/SystemUI/res/values/arrays.xml
+++ b/packages/SystemUI/res/values/arrays.xml
@@ -1,5 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
+/*
+ * Copyright (c) 2014, 2015 The Linux Foundation. All rights reserved.
+ * Not a Contribution.
 /* //device/apps/common/assets/res/any/colors.xml
 **
 ** Copyright 2012, The Android Open Source Project
@@ -37,4 +40,1092 @@
         <item>157</item><item>334</item>
         <item>0</item>  <item>334</item>
     </array>
+
+    <!--   added for customized status bar     -->
+    <!--data type-->
+    <!--Add three items to support TSTS-->
+    <string-array name="multi_data_type">
+        <item>array/telephony_data_type_sim1</item>
+        <item>array/telephony_data_type_sim1</item>
+        <item>array/telephony_data_type_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_data_type_sim1">
+        <!--NETWORK_TYPE_UNKNOWN-->
+        <item>0</item>
+        <!--NETWORK_TYPE_GPRS-->
+        <item>drawable/stat_sys_data_fully_connected_g</item>
+        <!--NETWORK_TYPE_EDGE-->
+        <item>drawable/stat_sys_data_fully_connected_e</item>
+        <!--NETWORK_TYPE_UMTS-->
+        <item>drawable/stat_sys_data_fully_connected_3g</item>
+        <!--NETWORK_TYPE_CDMA-->
+        <item>drawable/stat_sys_data_fully_connected_1x</item>
+        <!--NETWORK_TYPE_EVDO_0-->
+        <item>drawable/stat_sys_data_fully_connected_3g</item>
+        <!--NETWORK_TYPE_EVDO_A-->
+        <item>drawable/stat_sys_data_fully_connected_3g</item>
+        <!--NETWORK_TYPE_1xRTT-->
+        <item>drawable/stat_sys_data_fully_connected_1x</item>
+        <!--NETWORK_TYPE_HSDPA-->
+        <item>drawable/stat_sys_data_fully_connected_h</item>
+        <!--NETWORK_TYPE_HSUPA-->
+        <item>drawable/stat_sys_data_fully_connected_h</item>
+        <!--NETWORK_TYPE_HSPA-->
+        <item>drawable/stat_sys_data_fully_connected_h</item>
+        <!--NETWORK_TYPE_IDEN-->
+        <item>0</item>
+        <!--NETWORK_TYPE_EVDO_B-->
+        <item>drawable/stat_sys_data_fully_connected_3g</item>
+        <!--NETWORK_TYPE_LTE-->
+        <item>drawable/stat_sys_data_fully_connected_3g</item>
+        <!--NETWORK_TYPE_EHRPD-->
+        <item>drawable/stat_sys_data_fully_connected_3g</item>
+        <!--NETWORK_TYPE_HSPAP-->
+        <item>drawable/stat_sys_data_fully_connected_3g</item>
+        <!--NETWORK_TYPE_GSM-->
+        <item>drawable/stat_sys_data_fully_connected_g</item>
+        <!--NETWORK_TYPE_TD_SCDMA-->
+        <item>drawable/stat_sys_data_fully_connected_3g</item>
+        <!--NETWORK_TYPE_IWLAN-->
+        <item>0</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_type_sim2">
+    </string-array>
+
+     <!--reserved for overlay-->
+    <string-array name="telephony_data_type_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_type_generation">
+        <!--3G-->
+        <item>drawable/stat_sys_data_fully_connected_3g</item>
+        <!--4G-->
+        <item>drawable/stat_sys_data_fully_connected_4g</item>
+        <!--4G+-->
+        <item>drawable/stat_sys_data_fully_connected_4g_plus</item>
+    </string-array>
+
+    <!--data type description-->
+    <string-array name="telephony_data_type_description">
+        <!--NETWORK_TYPE_UNKNOWN-->
+        <item>0</item>
+        <!--NETWORK_TYPE_GPRS-->
+        <item>string/accessibility_data_connection_gprs</item>
+        <!--NETWORK_TYPE_EDGE-->
+        <item>string/accessibility_data_connection_edge</item>
+        <!--NETWORK_TYPE_UMTS-->
+        <item>string/accessibility_data_connection_3g</item>
+        <!--NETWORK_TYPE_CDMA-->
+        <item>string/accessibility_data_connection_cdma</item>
+        <!--NETWORK_TYPE_EVDO_0-->
+        <item>string/accessibility_data_connection_3g</item>
+        <!--NETWORK_TYPE_EVDO_A-->
+        <item>string/accessibility_data_connection_3g</item>
+        <!--NETWORK_TYPE_1xRTT-->
+        <item>string/accessibility_data_connection_cdma</item>
+        <!--NETWORK_TYPE_HSDPA-->
+        <item>string/accessibility_data_connection_3.5g</item>
+        <!--NETWORK_TYPE_HSUPA-->
+        <item>string/accessibility_data_connection_3.5g</item>
+        <!--NETWORK_TYPE_HSPA-->
+        <item>string/accessibility_data_connection_3.5g</item>
+        <!--NETWORK_TYPE_IDEN-->
+        <item>0</item>
+        <!--NETWORK_TYPE_EVDO_B-->
+        <item>string/accessibility_data_connection_3g</item>
+        <!--NETWORK_TYPE_LTE-->
+        <item>string/accessibility_data_connection_lte</item>
+        <!--NETWORK_TYPE_EHRPD-->
+        <item>string/accessibility_data_connection_3g</item>
+        <!--NETWORK_TYPE_HSPAP-->
+        <item>string/accessibility_data_connection_3.5g</item>
+        <!--NETWORK_TYPE_GSM-->
+        <item>string/accessibility_data_connection_gprs</item>
+        <!--NETWORK_TYPE_TD_SCDMA-->
+        <item>string/accessibility_data_connection_3g</item>
+        <!--NETWORK_TYPE_IWLAN-->
+        <item>0</item>
+    </string-array>
+
+    <string-array name="telephony_data_type_generation_description">
+        <!--3G-->
+        <item>string/accessibility_data_connection_3g</item>
+        <!--4G-->
+        <item>string/accessibility_data_connection_4g</item>
+    </string-array>
+
+    <!--data activity-->
+    <!--Add three items to support TSTS-->
+    <string-array name="multi_data_activity">
+        <item>array/data_activity_sim1</item>
+        <item>array/data_activity_sim1</item>
+        <item>array/data_activity_sim1</item>
+    </string-array>
+
+    <string-array name="data_activity_sim1">
+        <item>array/telephony_data_activity_unknown_sim1</item>
+        <item>array/telephony_data_activity_g_sim1</item>
+        <item>array/telephony_data_activity_e_sim1</item>
+        <item>array/telephony_data_activity_2g_sim1</item>
+        <item>array/telephony_data_activity_3g_sim1</item>
+        <item>array/telephony_data_activity_4g_sim1</item>
+        <item>array/telephony_data_activity_h_sim1</item>
+        <item>array/telephony_data_activity_hp_sim1</item>
+        <item>array/telephony_data_activity_1x_sim1</item>
+        <item>array/telephony_data_activity_lte_sim1</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="data_activity_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="data_activity_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_activity_unknown_sim1">
+        <item>0</item><!--none-->
+        <item>0</item><!--in-->
+        <item>0</item><!--out-->
+        <item>0</item><!--inout-->
+        <item>0</item><!--dormant-->
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_unknown_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_unknown_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_activity_g_sim1">
+        <item>0</item>
+        <item>drawable/stat_sys_signal_in_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_out_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_inout_auto_mirrored</item>
+        <item>0</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_g_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_g_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_activity_e_sim1">
+        <item>0</item>
+        <item>drawable/stat_sys_signal_in_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_out_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_inout_auto_mirrored</item>
+        <item>0</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_e_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_e_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_activity_2g_sim1">
+        <item>0</item>
+        <item>drawable/stat_sys_signal_in_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_out_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_inout_auto_mirrored</item>
+        <item>0</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_2g_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_2g_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_activity_3g_sim1">
+        <item>0</item>
+        <item>drawable/stat_sys_signal_in_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_out_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_inout_auto_mirrored</item>
+        <item>0</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_3g_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_3g_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_activity_4g_sim1">
+        <item>0</item>
+        <item>drawable/stat_sys_signal_in_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_out_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_inout_auto_mirrored</item>
+        <item>0</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_4g_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_4g_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_activity_h_sim1">
+        <item>0</item>
+        <item>drawable/stat_sys_signal_in_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_out_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_inout_auto_mirrored</item>
+        <item>0</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_h_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_h_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_activity_hp_sim1">
+        <item>0</item>
+        <item>drawable/stat_sys_signal_in_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_out_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_inout_auto_mirrored</item>
+        <item>0</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_hp_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_hp_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_activity_1x_sim1">
+        <item>0</item>
+        <item>drawable/stat_sys_signal_in_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_out_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_inout_auto_mirrored</item>
+        <item>0</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_1x_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_1x_sim3">
+    </string-array>
+
+    <string-array name="telephony_data_activity_lte_sim1">
+        <item>0</item>
+        <item>drawable/stat_sys_signal_in_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_out_auto_mirrored</item>
+        <item>drawable/stat_sys_signal_inout_auto_mirrored</item>
+        <item>0</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_lte_sim2">
+    </string-array>
+    <!--reserved for overlay-->
+    <string-array name="telephony_data_activity_lte_sim3">
+    </string-array>
+
+    <!--signal strength-->
+    <!--Add three items to support TSTS-->
+    <string-array name="multi_signal_strength">
+        <item>array/telephony_siganl_strength_sim1</item>
+        <item>array/telephony_siganl_strength_sim1</item>
+        <item>array/telephony_siganl_strength_sim1</item>
+    </string-array>
+
+    <!--Add three items to support TSTS-->
+     <string-array name="multi_signal_strength_roaming">
+        <item>array/telephony_siganl_strength_roaming_sim1</item>
+        <item>array/telephony_siganl_strength_roaming_sim1</item>
+        <item>array/telephony_siganl_strength_roaming_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_siganl_strength_sim1">
+        <item>array/telephony_signal_strength_g_sim1</item>
+        <item>array/telephony_signal_strength_e_sim1</item>
+        <item>array/telephony_signal_strength_3g_sim1</item>
+        <item>array/telephony_signal_strength_4g_sim1</item>
+        <item>array/telephony_signal_strength_h_sim1</item>
+        <item>array/telephony_signal_strength_hp_sim1</item>
+        <item>array/telephony_signal_strength_1x_sim1</item>
+        <item>array/telephony_signal_strength_cdma_sim1</item>
+        <item>array/telephony_signal_strength_umts_sim1</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_siganl_strength_sim2">
+    </string-array>
+    <string-array name="telephony_siganl_strength_sim3">
+    </string-array>
+
+    <string-array name="telephony_siganl_strength_roaming_sim1">
+        <item>array/telephony_signal_strength_g_roaming_sim1</item>
+        <item>array/telephony_signal_strength_e_roaming_sim1</item>
+        <item>array/telephony_signal_strength_3g_roaming_sim1</item>
+        <item>array/telephony_signal_strength_4g_roaming_sim1</item>
+        <item>array/telephony_signal_strength_h_roaming_sim1</item>
+        <item>array/telephony_signal_strength_hp_roaming_sim1</item>
+        <item>array/telephony_signal_strength_1x_roaming_sim1</item>
+        <item>array/telephony_signal_strength_cdma_roaming_sim1</item>
+        <item>array/telephony_signal_strength_umts_roaming_sim1</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_siganl_strength_roaming_sim2">
+    </string-array>
+    <string-array name="telephony_siganl_strength_roaming_sim3">
+    </string-array>
+
+    <string-array name="telephony_signal_strength_g_sim1">
+        <item>array/signal_strength_g_normal_sim1</item>
+        <item>array/signal_strength_g_fully_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_g_roaming_sim1">
+        <item>array/signal_strength_g_normal_roaming_sim1</item>
+        <item>array/signal_strength_g_fully_roaming_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_e_sim1">
+        <item>array/signal_strength_e_normal_sim1</item>
+        <item>array/signal_strength_e_fully_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_e_roaming_sim1">
+        <item>array/signal_strength_e_normal_roaming_sim1</item>
+        <item>array/signal_strength_e_fully_roaming_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_3g_sim1">
+        <item>array/signal_strength_3g_normal_sim1</item>
+        <item>array/signal_strength_3g_fully_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_3g_roaming_sim1">
+        <item>array/signal_strength_3g_normal_roaming_sim1</item>
+        <item>array/signal_strength_3g_fully_roaming_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_4g_sim1">
+        <item>array/signal_strength_4g_normal_sim1</item>
+        <item>array/signal_strength_4g_fully_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_4g_roaming_sim1">
+        <item>array/signal_strength_4g_normal_roaming_sim1</item>
+        <item>array/signal_strength_4g_fully_roaming_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_h_sim1">
+        <item>array/signal_strength_h_normal_sim1</item>
+        <item>array/signal_strength_h_fully_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_h_roaming_sim1">
+        <item>array/signal_strength_h_normal_roaming_sim1</item>
+        <item>array/signal_strength_h_fully_roaming_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_hp_sim1">
+        <item>array/signal_strength_hp_normal_sim1</item>
+        <item>array/signal_strength_hp_fully_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_hp_roaming_sim1">
+        <item>array/signal_strength_hp_normal_roaming_sim1</item>
+        <item>array/signal_strength_hp_fully_roaming_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_1x_sim1">
+        <item>array/signal_strength_1x_normal_sim1</item>
+        <item>array/signal_strength_1x_fully_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_1x_roaming_sim1">
+        <item>array/signal_strength_1x_normal_roaming_sim1</item>
+        <item>array/signal_strength_1x_fully_roaming_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_cdma_sim1">
+        <item>array/signal_strength_cdma_normal_sim1</item>
+        <item>array/signal_strength_cdma_fully_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_cdma_roaming_sim1">
+        <item>array/signal_strength_cdma_normal_roaming_sim1</item>
+        <item>array/signal_strength_cdma_fully_roaming_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_umts_sim1">
+        <item>array/signal_strength_umts_normal_sim1</item>
+        <item>array/signal_strength_umts_fully_sim1</item>
+    </string-array>
+
+    <string-array name="telephony_signal_strength_umts_roaming_sim1">
+        <item>array/signal_strength_umts_normal_roaming_sim1</item>
+        <item>array/signal_strength_umts_fully_roaming_sim1</item>
+    </string-array>
+
+    <string-array name="signal_strength_g_normal_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_g_fully_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+     <string-array name="signal_strength_g_normal_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_g_fully_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_e_normal_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_e_fully_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+     <string-array name="signal_strength_e_normal_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_e_fully_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_3g_normal_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_3g_fully_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+     <string-array name="signal_strength_3g_normal_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_3g_fully_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_4g_normal_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_4g_fully_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+     <string-array name="signal_strength_4g_normal_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_4g_fully_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_h_normal_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_h_fully_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+     <string-array name="signal_strength_h_normal_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_h_fully_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_hp_normal_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_hp_fully_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+     <string-array name="signal_strength_hp_normal_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_hp_fully_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_1x_normal_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_1x_fully_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+     <string-array name="signal_strength_1x_normal_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_1x_fully_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_cdma_normal_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_cdma_fully_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+     <string-array name="signal_strength_cdma_normal_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_cdma_fully_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_umts_normal_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_umts_fully_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+     <string-array name="signal_strength_umts_normal_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <string-array name="signal_strength_umts_fully_roaming_sim1">
+        <item>drawable/stat_sys_signal_0_fully</item>
+        <item>drawable/stat_sys_signal_1_fully</item>
+        <item>drawable/stat_sys_signal_2_fully</item>
+        <item>drawable/stat_sys_signal_3_fully</item>
+        <item>drawable/stat_sys_signal_4_fully</item>
+    </string-array>
+
+    <!--signal strength description-->
+    <string-array name="signal_strength_description">
+        <item>string/accessibility_no_phone</item>
+        <item>string/accessibility_phone_one_bar</item>
+        <item>string/accessibility_phone_two_bars</item>
+        <item>string/accessibility_phone_three_bars</item>
+        <item>string/accessibility_phone_signal_full</item>
+    </string-array>
+
+    <!--null signal-->
+    <!--Add three items to support TSTS-->
+    <string-array name="multi_signal_null">
+        <item>drawable/stat_sys_signal_null</item>
+        <item>drawable/stat_sys_signal_null</item>
+        <item>drawable/stat_sys_signal_null</item>
+    </string-array>
+
+    <!--no sim-->
+    <!--Add three items to support TSTS-->
+    <string-array name="multi_no_sim">
+        <item>drawable/stat_sys_no_sims</item>
+        <item>drawable/stat_sys_no_sims</item>
+        <item>drawable/stat_sys_no_sims</item>
+    </string-array>
+
+    <!--reserved for overlay-->
+    <string-array name="telephony_signal_strength_g_sim2">
+        <item>array/signal_strength_g_normal_sim2</item>
+        <item>array/signal_strength_g_fully_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_g_roaming_sim2">
+        <item>array/signal_strength_g_normal_roaming_sim2</item>
+        <item>array/signal_strength_g_fully_roaming_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_e_sim2">
+        <item>array/signal_strength_e_normal_sim2</item>
+        <item>array/signal_strength_e_fully_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_e_roaming_sim2">
+        <item>array/signal_strength_e_normal_roaming_sim2</item>
+        <item>array/signal_strength_e_fully_roaming_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_3g_sim2">
+        <item>array/signal_strength_3g_normal_sim2</item>
+        <item>array/signal_strength_3g_fully_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_3g_roaming_sim2">
+        <item>array/signal_strength_3g_normal_roaming_sim2</item>
+        <item>array/signal_strength_3g_fully_roaming_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_4g_sim2">
+        <item>array/signal_strength_4g_normal_sim2</item>
+        <item>array/signal_strength_4g_fully_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_4g_roaming_sim2">
+        <item>array/signal_strength_4g_normal_roaming_sim2</item>
+        <item>array/signal_strength_4g_fully_roaming_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_h_sim2">
+        <item>array/signal_strength_h_normal_sim2</item>
+        <item>array/signal_strength_h_fully_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_h_roaming_sim2">
+        <item>array/signal_strength_h_normal_roaming_sim2</item>
+        <item>array/signal_strength_h_fully_roaming_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_hp_sim2">
+        <item>array/signal_strength_hp_normal_sim2</item>
+        <item>array/signal_strength_hp_fully_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_hp_roaming_sim2">
+        <item>array/signal_strength_hp_normal_roaming_sim2</item>
+        <item>array/signal_strength_hp_fully_roaming_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_1x_sim2">
+        <item>array/signal_strength_1x_normal_sim2</item>
+        <item>array/signal_strength_1x_fully_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_1x_roaming_sim2">
+        <item>array/signal_strength_1x_normal_roaming_sim2</item>
+        <item>array/signal_strength_1x_fully_roaming_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_cdma_sim2">
+        <item>array/signal_strength_cdma_normal_sim2</item>
+        <item>array/signal_strength_cdma_fully_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_cdma_roaming_sim2">
+        <item>array/signal_strength_cdma_normal_roaming_sim2</item>
+        <item>array/signal_strength_cdma_fully_roaming_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_umts_sim2">
+        <item>array/signal_strength_umts_normal_sim2</item>
+        <item>array/signal_strength_umts_fully_sim2</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_umts_roaming_sim2">
+        <item>array/signal_strength_umts_normal_roaming_sim2</item>
+        <item>array/signal_strength_umts_fully_roaming_sim2</item>
+    </string-array>
+     <!--reserved for overlay-->
+    <string-array name="signal_strength_g_normal_sim2">
+    </string-array>
+    <string-array name="signal_strength_g_fully_sim2">
+    </string-array>
+    <string-array name="signal_strength_g_normal_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_g_fully_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_e_normal_sim2">
+    </string-array>
+    <string-array name="signal_strength_e_fully_sim2">
+    </string-array>
+    <string-array name="signal_strength_e_normal_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_e_fully_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_3g_normal_sim2">
+    </string-array>
+    <string-array name="signal_strength_3g_fully_sim2">
+    </string-array>
+    <string-array name="signal_strength_3g_normal_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_3g_fully_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_4g_normal_sim2">
+    </string-array>
+    <string-array name="signal_strength_4g_fully_sim2">
+    </string-array>
+    <string-array name="signal_strength_4g_normal_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_4g_fully_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_h_normal_sim2">
+    </string-array>
+    <string-array name="signal_strength_h_fully_sim2">
+    </string-array>
+    <string-array name="signal_strength_h_normal_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_h_fully_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_hp_normal_sim2">
+    </string-array>
+    <string-array name="signal_strength_hp_fully_sim2">
+    </string-array>
+    <string-array name="signal_strength_hp_normal_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_hp_fully_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_1x_normal_sim2">
+    </string-array>
+    <string-array name="signal_strength_1x_fully_sim2">
+    </string-array>
+    <string-array name="signal_strength_1x_normal_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_1x_fully_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_cdma_normal_sim2">
+    </string-array>
+    <string-array name="signal_strength_cdma_fully_sim2">
+    </string-array>
+    <string-array name="signal_strength_cdma_normal_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_cdma_fully_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_umts_normal_sim2">
+    </string-array>
+    <string-array name="signal_strength_umts_fully_sim2">
+    </string-array>
+    <string-array name="signal_strength_umts_normal_roaming_sim2">
+    </string-array>
+    <string-array name="signal_strength_umts_fully_roaming_sim2">
+    </string-array>
+
+    <string-array name="telephony_signal_strength_g_sim3">
+        <item>array/signal_strength_g_normal_sim3</item>
+        <item>array/signal_strength_g_fully_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_g_roaming_sim3">
+        <item>array/signal_strength_g_normal_roaming_sim3</item>
+        <item>array/signal_strength_g_fully_roaming_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_e_sim3">
+        <item>array/signal_strength_e_normal_sim3</item>
+        <item>array/signal_strength_e_fully_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_e_roaming_sim3">
+        <item>array/signal_strength_e_normal_roaming_sim3</item>
+        <item>array/signal_strength_e_fully_roaming_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_3g_sim3">
+        <item>array/signal_strength_3g_normal_sim3</item>
+        <item>array/signal_strength_3g_fully_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_3g_roaming_sim3">
+        <item>array/signal_strength_3g_normal_roaming_sim3</item>
+        <item>array/signal_strength_3g_fully_roaming_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_4g_sim3">
+        <item>array/signal_strength_4g_normal_sim3</item>
+        <item>array/signal_strength_4g_fully_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_4g_roaming_sim3">
+        <item>array/signal_strength_4g_normal_roaming_sim3</item>
+        <item>array/signal_strength_4g_fully_roaming_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_h_sim3">
+        <item>array/signal_strength_h_normal_sim3</item>
+        <item>array/signal_strength_h_fully_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_h_roaming_sim3">
+        <item>array/signal_strength_h_normal_roaming_sim3</item>
+        <item>array/signal_strength_h_fully_roaming_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_hp_sim3">
+        <item>array/signal_strength_hp_normal_sim3</item>
+        <item>array/signal_strength_hp_fully_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_hp_roaming_sim3">
+        <item>array/signal_strength_hp_normal_roaming_sim3</item>
+        <item>array/signal_strength_hp_fully_roaming_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_1x_sim3">
+        <item>array/signal_strength_1x_normal_sim3</item>
+        <item>array/signal_strength_1x_fully_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_1x_roaming_sim3">
+        <item>array/signal_strength_1x_normal_roaming_sim3</item>
+        <item>array/signal_strength_1x_fully_roaming_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_cdma_sim3">
+        <item>array/signal_strength_cdma_normal_sim3</item>
+        <item>array/signal_strength_cdma_fully_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_cdma_roaming_sim3">
+        <item>array/signal_strength_cdma_normal_roaming_sim3</item>
+        <item>array/signal_strength_cdma_fully_roaming_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_umts_sim3">
+        <item>array/signal_strength_umts_normal_sim3</item>
+        <item>array/signal_strength_umts_fully_sim3</item>
+    </string-array>
+    <string-array name="telephony_signal_strength_umts_roaming_sim3">
+        <item>array/signal_strength_umts_normal_roaming_sim3</item>
+        <item>array/signal_strength_umts_fully_roaming_sim3</item>
+    </string-array>
+     <!--reserved for overlay-->
+    <string-array name="signal_strength_g_normal_sim3">
+    </string-array>
+    <string-array name="signal_strength_g_fully_sim3">
+    </string-array>
+     <string-array name="signal_strength_g_normal_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_g_fully_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_e_normal_sim3">
+    </string-array>
+    <string-array name="signal_strength_e_fully_sim3">
+    </string-array>
+     <string-array name="signal_strength_e_normal_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_e_fully_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_3g_normal_sim3">
+    </string-array>
+    <string-array name="signal_strength_3g_fully_sim3">
+    </string-array>
+    <string-array name="signal_strength_3g_normal_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_3g_fully_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_4g_normal_sim3">
+    </string-array>
+    <string-array name="signal_strength_4g_fully_sim3">
+    </string-array>
+    <string-array name="signal_strength_4g_normal_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_4g_fully_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_h_normal_sim3">
+    </string-array>
+    <string-array name="signal_strength_h_fully_sim3">
+    </string-array>
+    <string-array name="signal_strength_h_normal_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_h_fully_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_hp_normal_sim3">
+    </string-array>
+    <string-array name="signal_strength_hp_fully_sim3">
+    </string-array>
+    <string-array name="signal_strength_hp_normal_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_hp_fully_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_1x_normal_sim3">
+    </string-array>
+    <string-array name="signal_strength_1x_fully_sim3">
+    </string-array>
+    <string-array name="signal_strength_1x_normal_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_1x_fully_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_cdma_normal_sim3">
+    </string-array>
+    <string-array name="signal_strength_cdma_fully_sim3">
+    </string-array>
+    <string-array name="signal_strength_cdma_normal_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_cdma_fully_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_umts_normal_sim3">
+    </string-array>
+    <string-array name="signal_strength_umts_fully_sim3">
+    </string-array>
+    <string-array name="signal_strength_umts_normal_roaming_sim3">
+    </string-array>
+    <string-array name="signal_strength_umts_fully_roaming_sim3">
+    </string-array>
+
+     <!--convert stacked icons to single icons-->
+    <array name="stacked_signal_icons">
+        <item>@drawable/stat_sys_signal_0_3g</item>
+        <item>@drawable/stat_sys_signal_0_4g</item>
+        <item>@drawable/stat_sys_signal_1_3g</item>
+        <item>@drawable/stat_sys_signal_1_4g</item>
+        <item>@drawable/stat_sys_signal_2_3g</item>
+        <item>@drawable/stat_sys_signal_2_4g</item>
+        <item>@drawable/stat_sys_signal_3_3g</item>
+        <item>@drawable/stat_sys_signal_3_4g</item>
+        <item>@drawable/stat_sys_signal_4_3g</item>
+        <item>@drawable/stat_sys_signal_4_4g</item>
+        <item>@drawable/stat_sys_signal_0_3g_fully</item>
+        <item>@drawable/stat_sys_signal_0_4g_fully</item>
+        <item>@drawable/stat_sys_signal_1_3g_fully</item>
+        <item>@drawable/stat_sys_signal_1_4g_fully</item>
+        <item>@drawable/stat_sys_signal_2_3g_fully</item>
+        <item>@drawable/stat_sys_signal_2_4g_fully</item>
+        <item>@drawable/stat_sys_signal_3_3g_fully</item>
+        <item>@drawable/stat_sys_signal_3_4g_fully</item>
+        <item>@drawable/stat_sys_signal_4_3g_fully</item>
+        <item>@drawable/stat_sys_signal_4_4g_fully</item>
+    </array>
+
+    <array name="single_signal_icons">
+        <item>@drawable/stat_sys_signal_0_3g_default</item>
+        <item>@drawable/stat_sys_signal_0_4g_default</item>
+        <item>@drawable/stat_sys_signal_1_3g_default</item>
+        <item>@drawable/stat_sys_signal_1_4g_default</item>
+        <item>@drawable/stat_sys_signal_2_3g_default</item>
+        <item>@drawable/stat_sys_signal_2_4g_default</item>
+        <item>@drawable/stat_sys_signal_3_3g_default</item>
+        <item>@drawable/stat_sys_signal_3_4g_default</item>
+        <item>@drawable/stat_sys_signal_4_3g_default</item>
+        <item>@drawable/stat_sys_signal_4_4g_default</item>
+        <item>@drawable/stat_sys_signal_0_3g_default_fully</item>
+        <item>@drawable/stat_sys_signal_0_4g_default_fully</item>
+        <item>@drawable/stat_sys_signal_1_3g_default_fully</item>
+        <item>@drawable/stat_sys_signal_1_4g_default_fully</item>
+        <item>@drawable/stat_sys_signal_2_3g_default_fully</item>
+        <item>@drawable/stat_sys_signal_2_4g_default_fully</item>
+        <item>@drawable/stat_sys_signal_3_3g_default_fully</item>
+        <item>@drawable/stat_sys_signal_3_4g_default_fully</item>
+        <item>@drawable/stat_sys_signal_4_3g_default_fully</item>
+        <item>@drawable/stat_sys_signal_4_4g_default_fully</item>
+    </array>
 </resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 3391b40..7379c56 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -138,6 +138,35 @@
     <!-- Should "4G" be shown instead of "LTE" when the network is NETWORK_TYPE_LTE? -->
     <bool name="config_show4GForLTE">true</bool>
 
+    <!-- Whether or not we also show rsrp level for LTE. -->
+    <bool name="config_showRsrpSignalLevelforLTE">false</bool>
+
+    <!-- Whether or not we show carrier label in notification panel. -->
+    <bool name="config_showCarrierLabel">false</bool>
+
+    <!-- Whether or not we also show wifi activity in status bar. -->
+    <bool name="config_showWifiActivity">false</bool>
+
+    <!-- Show indicator for Wifi on but not connected. -->
+    <bool name="config_showWifiIndicatorWhenEnabled">false</bool>
+
+    <!-- style of status bar:
+        0: Default Android style
+        1: Show data activity with data type at the left side of
+           signal icon, and signal icon may be two icons
+           stacked, the upper one is to show 3G, and the lower one
+           is to show 2G.
+        2: Do not show data activity besides signal icon, instead,
+           it shows data activity within signal view.
+        3: Show data activity with data type at the left side
+           of signal icon, and do not show two stacked icon on
+           one slot.
+    -->
+    <integer name="status_bar_style">0</integer>
+
+    <!-- Control whether status bar should fetch mobile signal icons from xml file dynamically -->
+    <bool name="config_read_icons_from_xml">false</bool>
+
     <!-- milliseconds before the heads up notification auto-dismisses. -->
     <integer name="heads_up_notification_decay">5000</integer>
 
@@ -290,6 +319,9 @@
     <!-- Enable the default volume dialog -->
     <bool name="enable_volume_ui">true</bool>
 
+    <!-- Enable operator name on status bar -->
+    <bool name="enable_operator_name">false</bool>
+
     <!-- Duration of the full carrier network change icon animation. -->
     <integer name="carrier_network_change_anim_time">3000</integer>
 
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 03ea73c..cb4bb02 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -484,7 +484,7 @@
     <dimen name="keyguard_affordance_icon_height">24dp</dimen>
     <dimen name="keyguard_affordance_icon_width">24dp</dimen>
 
-    <dimen name="keyguard_indication_margin_bottom">65dp</dimen>
+    <dimen name="keyguard_indication_margin_bottom">90dp</dimen>
 
     <!-- The text size for battery level -->
     <dimen name="battery_level_text_size">12sp</dimen>
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index f3ad9d8..fb46729 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -167,8 +167,9 @@
 
         @Override
         public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
-                int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
-                String description, boolean isWide, int subId) {
+                int qsType, boolean activityIn, boolean activityOut, int dataActivityId,
+                int mobileActivityId, int stackedDataIcon, int stackedVoiceIcon,
+                String typeContentDescription, String description, boolean isWide, int subId) {
             if (qsIcon == null) {
                 // Not data sim, don't display.
                 return;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index cc30882..787ec07 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.res.ColorStateList;
+import android.content.res.Resources;
 import android.graphics.Color;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Animatable;
@@ -67,8 +68,8 @@
     private int mEthernetIconId = 0;
     private int mLastEthernetIconId = -1;
     private boolean mWifiVisible = false;
-    private int mWifiStrengthId = 0;
-    private int mLastWifiStrengthId = -1;
+    private int mWifiStrengthId = 0, mWifiActivityId = 0;
+    private int mLastWifiStrengthId = -1, mLastWifiActivityId = -1;
     private boolean mIsAirplaneMode = false;
     private int mAirplaneIconId = 0;
     private int mLastAirplaneIconId = -1;
@@ -78,10 +79,12 @@
     private ArrayList<PhoneState> mPhoneStates = new ArrayList<PhoneState>();
     private int mIconTint = Color.WHITE;
     private float mDarkIntensity;
+    private int mNoSimsIcon;
 
     ViewGroup mEthernetGroup, mWifiGroup;
     View mNoSimsCombo;
     ImageView mVpn, mEthernet, mWifi, mAirplane, mNoSims, mEthernetDark, mWifiDark, mNoSimsDark;
+    ImageView mWifiActivity;
     View mWifiAirplaneSpacer;
     View mWifiSignalSpacer;
     LinearLayout mMobileSignalGroup;
@@ -167,6 +170,7 @@
         mWifiGroup      = (ViewGroup) findViewById(R.id.wifi_combo);
         mWifi           = (ImageView) findViewById(R.id.wifi_signal);
         mWifiDark       = (ImageView) findViewById(R.id.wifi_signal_dark);
+        mWifiActivity   = (ImageView) findViewById(R.id.wifi_inout);
         mAirplane       = (ImageView) findViewById(R.id.airplane);
         mNoSims         = (ImageView) findViewById(R.id.no_sims);
         mNoSimsDark     = (ImageView) findViewById(R.id.no_sims_dark);
@@ -190,6 +194,7 @@
         mEthernet       = null;
         mWifiGroup      = null;
         mWifi           = null;
+        mWifiActivity   = null;
         mAirplane       = null;
         mMobileSignalGroup.removeAllViews();
         mMobileSignalGroup = null;
@@ -215,6 +220,7 @@
             boolean activityIn, boolean activityOut, String description) {
         mWifiVisible = statusIcon.visible && !mBlockWifi;
         mWifiStrengthId = statusIcon.icon;
+        mWifiActivityId = getWifiActivityId(activityIn, activityOut);
         mWifiDescription = statusIcon.contentDescription;
 
         apply();
@@ -222,8 +228,9 @@
 
     @Override
     public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
-            int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
-            String description, boolean isWide, int subId) {
+            int qsType, boolean activityIn, boolean activityOut, int dataActivityId,
+            int mobileActivityId, int stackedDataId, int stackedVoiceId,
+            String typeContentDescription, String description, boolean isWide, int subId) {
         PhoneState state = getState(subId);
         if (state == null) {
             return;
@@ -234,6 +241,10 @@
         state.mMobileDescription = statusIcon.contentDescription;
         state.mMobileTypeDescription = typeContentDescription;
         state.mIsMobileTypeIconWide = statusType != 0 && isWide;
+        state.mDataActivityId = dataActivityId;
+        state.mMobileActivityId = mobileActivityId;
+        state.mStackedDataId = stackedDataId;
+        state.mStackedVoiceId = stackedVoiceId;
 
         apply();
     }
@@ -295,6 +306,43 @@
         return null;
     }
 
+
+    private int getWifiActivityId(boolean activityIn, boolean activityOut) {
+        if (!getContext().getResources().getBoolean(R.bool.config_showWifiActivity)) {
+            return 0;
+        }
+        int activityId = 0;
+        if (activityIn && activityOut) {
+            activityId = R.drawable.stat_sys_wifi_inout;
+        } else if (activityIn) {
+            activityId = R.drawable.stat_sys_wifi_in;
+        } else if (activityOut) {
+            activityId = R.drawable.stat_sys_wifi_out;
+        }
+        return activityId;
+    }
+
+    private int getNoSimIcon() {
+        int resId = 0;
+        final String[] noSimArray;
+        Resources res = getContext().getResources();
+
+        if (!res.getBoolean(R.bool.config_read_icons_from_xml)) return resId;
+
+        try {
+            noSimArray = res.getStringArray(R.array.multi_no_sim);
+        } catch (android.content.res.Resources.NotFoundException e) {
+            return resId;
+        }
+
+        if (noSimArray == null) return resId;
+
+        String resName = noSimArray[0];
+        resId = res.getIdentifier(resName, null, getContext().getPackageName());
+        if (DEBUG) Log.d(TAG, "getNoSimIcon resId = " + resId + " resName = " + resName);
+        return resId;
+    }
+
     private PhoneState inflatePhoneState(int subId) {
         PhoneState state = new PhoneState(subId, mContext);
         if (mMobileSignalGroup != null) {
@@ -349,6 +397,11 @@
             mLastWifiStrengthId = -1;
         }
 
+        if (mWifiActivity != null) {
+            mWifiActivity.setImageDrawable(null);
+            mLastWifiActivityId = -1;
+        }
+
         for (PhoneState state : mPhoneStates) {
             if (state.mMobile != null) {
                 state.mMobile.setImageDrawable(null);
@@ -401,6 +454,10 @@
                 mWifiDark.setImageResource(mWifiStrengthId);
                 mLastWifiStrengthId = mWifiStrengthId;
             }
+            if (mWifiActivityId != mLastWifiActivityId) {
+                mWifiActivity.setImageResource(mWifiActivityId);
+                mLastWifiActivityId = mWifiActivityId;
+            }
             mWifiGroup.setContentDescription(mWifiDescription);
             mWifiGroup.setVisibility(View.VISIBLE);
         } else {
@@ -408,9 +465,9 @@
         }
 
         if (DEBUG) Log.d(TAG,
-                String.format("wifi: %s sig=%d",
+                String.format("wifi: %s sig=%d act=%d",
                     (mWifiVisible ? "VISIBLE" : "GONE"),
-                    mWifiStrengthId));
+                    mWifiStrengthId, mWifiActivityId));
 
         boolean anyMobileVisible = false;
         int firstMobileTypeId = 0;
@@ -446,6 +503,13 @@
             mWifiSignalSpacer.setVisibility(View.GONE);
         }
 
+        if (mNoSimsVisible && mNoSims != null && mNoSimsDark != null) {
+            if (mNoSimsIcon == 0) mNoSimsIcon = getNoSimIcon();
+            if (mNoSimsIcon != 0) {
+                mNoSims.setImageResource(mNoSimsIcon);
+                mNoSimsDark.setImageResource(mNoSimsIcon);
+            }
+        }
         mNoSimsCombo.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE);
 
         boolean anythingVisible = mNoSimsVisible || mWifiVisible || mIsAirplaneMode
@@ -492,6 +556,11 @@
         private ViewGroup mMobileGroup;
         private ImageView mMobile, mMobileDark, mMobileType;
 
+        private int mDataActivityId = 0, mMobileActivityId = 0;
+        private int mStackedDataId = 0, mStackedVoiceId = 0;
+        private ImageView mDataActivity, mMobileActivity, mStackedData, mStackedVoice;
+        private ViewGroup mMobileSingleGroup, mMobileStackedGroup;
+
         public PhoneState(int subId, Context context) {
             ViewGroup root = (ViewGroup) LayoutInflater.from(context)
                     .inflate(R.layout.mobile_signal_group, null);
@@ -504,6 +573,14 @@
             mMobile         = (ImageView) root.findViewById(R.id.mobile_signal);
             mMobileDark     = (ImageView) root.findViewById(R.id.mobile_signal_dark);
             mMobileType     = (ImageView) root.findViewById(R.id.mobile_type);
+            mMobileActivity = (ImageView) root.findViewById(R.id.mobile_inout);
+
+            mDataActivity   = (ImageView) root.findViewById(R.id.data_inout);
+            mStackedData    = (ImageView) root.findViewById(R.id.mobile_signal_data);
+            mStackedVoice   = (ImageView) root.findViewById(R.id.mobile_signal_voice);
+
+            mMobileSingleGroup = (ViewGroup) root.findViewById(R.id.mobile_signal_single);
+            mMobileStackedGroup = (ViewGroup) root.findViewById(R.id.mobile_signal_stacked);
         }
 
         public boolean apply(boolean isSecondaryIcon) {
@@ -527,6 +604,37 @@
                 }
 
                 mMobileType.setImageResource(mMobileTypeId);
+
+                mDataActivity.setImageResource(mDataActivityId);
+                Drawable dataActivityDrawable = mDataActivity.getDrawable();
+                if (dataActivityDrawable instanceof Animatable) {
+                    Animatable ad = (Animatable) dataActivityDrawable;
+                    if (!ad.isRunning()) {
+                        ad.start();
+                    }
+                }
+
+                mMobileActivity.setImageResource(mMobileActivityId);
+                Drawable mobileActivityDrawable = mMobileActivity.getDrawable();
+                if (mobileActivityDrawable instanceof Animatable) {
+                    Animatable ad = (Animatable) mobileActivityDrawable;
+                    if (!ad.isRunning()) {
+                        ad.start();
+                    }
+                }
+
+                if (mStackedDataId != 0 && mStackedVoiceId != 0) {
+                    mStackedData.setImageResource(mStackedDataId);
+                    mStackedVoice.setImageResource(mStackedVoiceId);
+                    mMobileSingleGroup.setVisibility(View.GONE);
+                    mMobileStackedGroup.setVisibility(View.VISIBLE);
+                } else {
+                    mStackedData.setImageResource(0);
+                    mStackedVoice.setImageResource(0);
+                    mMobileSingleGroup.setVisibility(View.VISIBLE);
+                    mMobileStackedGroup.setVisibility(View.GONE);
+                }
+
                 mMobileGroup.setContentDescription(mMobileTypeDescription
                         + " " + mMobileDescription);
                 mMobileGroup.setVisibility(View.VISIBLE);
@@ -546,6 +654,8 @@
                         (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId));
 
             mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE);
+            mDataActivity.setVisibility(mDataActivityId != 0 ? View.VISIBLE : View.GONE);
+            mMobileActivity.setVisibility(mMobileActivityId != 0 ? View.VISIBLE : View.GONE);
 
             return mMobileVisible;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index a661ae6..0418dbd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -82,6 +82,7 @@
 import android.view.VelocityTracker;
 import android.view.View;
 import android.view.ViewGroup.LayoutParams;
+import android.view.ViewGroup.MarginLayoutParams;
 import android.view.ViewStub;
 import android.view.WindowManager;
 import android.view.WindowManagerGlobal;
@@ -290,6 +291,8 @@
 
     StatusBarIconController mIconController;
 
+    private View mCarrierText = null;
+
     // expanded notifications
     NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window
     View mExpandedContents;
@@ -312,6 +315,9 @@
 
     int mKeyguardMaxNotificationCount;
 
+    // carrier label
+    private TextView mCarrierLabel;
+    private boolean mShowCarrierInPanel = false;
     boolean mExpandedVisible;
 
     private int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
@@ -722,6 +728,10 @@
         // figure out which pixel-format to use for the status bar.
         mPixelFormat = PixelFormat.OPAQUE;
 
+        if (mContext.getResources().getBoolean(R.bool.enable_operator_name)) {
+            mCarrierText = mStatusBarView.findViewById(R.id.status_carrier_text);
+        }
+
         mStackScroller = (NotificationStackScrollLayout) mStatusBarWindow.findViewById(
                 R.id.notification_stack_scroller);
         mStackScroller.setLongPressListener(getNotificationLongClicker());
@@ -843,6 +853,23 @@
             mNetworkController.addEmergencyListener(mHeader);
         }
 
+        mCarrierLabel = (TextView)mStatusBarWindow.findViewById(R.id.carrier_label);
+        final boolean showCarrierLabel = mContext.getResources().getBoolean(
+                R.bool.config_showCarrierLabel);
+        mShowCarrierInPanel = showCarrierLabel && (mCarrierLabel != null);
+        if (DEBUG) Log.v(TAG, "carrierlabel=" + mCarrierLabel + " show=" + mShowCarrierInPanel);
+        if (mShowCarrierInPanel) {
+            mCarrierLabel.setVisibility(mShowCarrierInPanel ? View.VISIBLE : View.INVISIBLE);
+        }
+
+        // make sure carrier label is not covered by navigation bar
+        if (mCarrierLabel != null && mNavigationBarView != null) {
+            MarginLayoutParams mlp = (MarginLayoutParams) mCarrierLabel.getLayoutParams();
+            if (mlp != null && mlp.bottomMargin < mNavigationBarView.mBarSize) {
+                mlp.bottomMargin = mNavigationBarView.mBarSize;
+                mCarrierLabel.setLayoutParams(mlp);
+            }
+        }
         mFlashlightController = new FlashlightController(mContext);
         mKeyguardBottomArea.setFlashlightController(mFlashlightController);
         mKeyguardBottomArea.setPhoneStatusBar(this);
@@ -1461,6 +1488,21 @@
 
         updateNotificationShade();
         mIconController.updateNotificationIcons(mNotificationData);
+
+        if (mContext.getResources().getBoolean(R.bool.enable_operator_name)
+                && mCarrierText != null) {
+            if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
+                  mCarrierText.setVisibility(View.GONE);
+            } else {
+                ArrayList<Entry> activeNotifications = mNotificationData.getActiveNotifications();
+                final int N = activeNotifications.size();
+                if (N > 0) {
+                    mCarrierText.setVisibility(View.GONE);
+                } else {
+                    mCarrierText.setVisibility(View.VISIBLE);
+                }
+            }
+        }
     }
 
     @Override
@@ -1469,6 +1511,21 @@
         mNotificationPanel.notifyVisibleChildrenChanged();
     }
 
+    protected void updateCarrierLabelVisibility() {
+        if (!mShowCarrierInPanel) return;
+
+        final boolean makeVisible = mStackScroller.getVisibility() == View.VISIBLE
+                && mState != StatusBarState.KEYGUARD;
+
+        if ((mCarrierLabel.getVisibility() == View.VISIBLE) != makeVisible) {
+            if (DEBUG) {
+                Log.d(TAG, "making carrier label " + (makeVisible?"visible":"invisible"));
+            }
+
+            mCarrierLabel.setVisibility(makeVisible ? View.VISIBLE : View.INVISIBLE);
+        }
+    }
+
     @Override
     protected void setAreThereNotifications() {
 
@@ -3552,6 +3609,7 @@
         updateStackScrollerState(goingToFullShade);
         updateNotifications();
         checkBarModes();
+        updateCarrierLabelVisibility();
         updateMediaMetaData(false);
         mKeyguardMonitor.notifyKeyguardState(mStatusBarKeyguardViewManager.isShowing(),
                 mStatusBarKeyguardViewManager.isSecure());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
index e618cb8..69f8846 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
@@ -124,16 +124,19 @@
 
     @Override
     public void setMobileDataIndicators(final IconState statusIcon, final IconState qsIcon,
-            final int statusType, final int qsType,final boolean activityIn,
-            final boolean activityOut, final String typeContentDescription,
-            final String description, final boolean isWide, final int subId) {
+            final int statusType, final int qsType, final boolean activityIn,
+            final boolean activityOut, final int dataActivityId, final int mobileActivityId,
+            final int stackedDataIcon, final int stackedVoiceIcon,
+            final String typeContentDescription, final String description, final boolean isWide,
+            final int subId) {
         post(new Runnable() {
             @Override
             public void run() {
                 for (SignalCallback signalCluster : mSignalCallbacks) {
                     signalCluster.setMobileDataIndicators(statusIcon, qsIcon, statusType, qsType,
-                            activityIn, activityOut, typeContentDescription, description, isWide,
-                            subId);
+                            activityIn, activityOut, dataActivityId, mobileActivityId,
+                            stackedDataIcon, stackedVoiceIcon,
+                            typeContentDescription, description, isWide, subId);
                 }
             }
         });
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
index b0eaab0..62f1ec4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -17,6 +17,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.Resources;
 import android.net.NetworkCapabilities;
 import android.os.Looper;
 import android.telephony.PhoneStateListener;
@@ -66,6 +67,12 @@
     private MobileIconGroup mDefaultIcons;
     private Config mConfig;
 
+    private final int STATUS_BAR_STYLE_ANDROID_DEFAULT = 0;
+    private final int STATUS_BAR_STYLE_CDMA_1X_COMBINED = 1;
+    private final int STATUS_BAR_STYLE_DEFAULT_DATA = 2;
+    private final int STATUS_BAR_STYLE_DATA_VOICE = 3;
+    private int mStyle = STATUS_BAR_STYLE_ANDROID_DEFAULT;
+
     // TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't
     // need listener lists anymore.
     public MobileSignalController(Context context, Config config, boolean hasMobileData,
@@ -86,7 +93,14 @@
         mNetworkNameDefault = getStringIfExists(
                 com.android.internal.R.string.lockscreen_carrier_default);
 
-        mapIconSets();
+        if (config.readIconsFromXml) {
+            TelephonyIcons.readIconsFromXml(context);
+            mDefaultIcons = !mConfig.showAtLeast3G ? TelephonyIcons.G : TelephonyIcons.THREE_G;
+        } else {
+            mapIconSets();
+        }
+
+        mStyle = context.getResources().getInteger(R.integer.status_bar_style);
 
         String networkName = info.getCarrierName() != null ? info.getCarrierName().toString()
                 : mNetworkNameDefault;
@@ -100,7 +114,9 @@
 
     public void setConfiguration(Config config) {
         mConfig = config;
-        mapIconSets();
+        if (!config.readIconsFromXml) {
+            mapIconSets();
+        }
         updateTelephony();
     }
 
@@ -203,6 +219,9 @@
 
     @Override
     public void notifyListeners() {
+        if (mConfig.readIconsFromXml) {
+            generateIconGroup();
+        }
         MobileIconGroup icons = getIcons();
 
         String contentDescription = getStringIfExists(getContentDescription());
@@ -232,9 +251,14 @@
                         && mCurrentState.activityOut;
         showDataIcon &= mCurrentState.isDefault
                 || mCurrentState.iconGroup == TelephonyIcons.ROAMING;
+        showDataIcon &= mStyle == STATUS_BAR_STYLE_ANDROID_DEFAULT;
         int typeIcon = showDataIcon ? icons.mDataType : 0;
+        int dataActivityId = showMobileActivity() ? 0 : icons.mActivityId;
+        int mobileActivityId = showMobileActivity() ? icons.mActivityId : 0;
         mCallbackHandler.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon,
-                activityIn, activityOut, dataContentDescription, description, icons.mIsWide,
+                activityIn, activityOut, dataActivityId, mobileActivityId,
+                icons.mStackedDataIcon, icons.mStackedVoiceIcon,
+                dataContentDescription, description, icons.mIsWide,
                 mSubscriptionInfo.getSubscriptionId());
     }
 
@@ -243,6 +267,15 @@
         return new MobileState();
     }
 
+    @Override
+    public int getCurrentIconId() {
+        if (mConfig.readIconsFromXml && mCurrentState.connected) {
+            return getIcons().mSingleSignalIcon;
+        } else {
+            return super.getCurrentIconId();
+        }
+    }
+
     private boolean hasService() {
         if (mServiceState != null) {
             // Consider the device to be in service if either voice or data
@@ -366,7 +399,7 @@
      */
     private final void updateTelephony() {
         if (DEBUG) {
-            Log.d(mTag, "updateTelephonySignalStrength: hasService=" + hasService()
+            Log.d(mTag, "updateTelephony: hasService=" + hasService()
                     + " ss=" + mSignalStrength);
         }
         mCurrentState.connected = hasService() && mSignalStrength != null;
@@ -375,6 +408,13 @@
                 mCurrentState.level = mSignalStrength.getCdmaLevel();
             } else {
                 mCurrentState.level = mSignalStrength.getLevel();
+                if (mConfig.showRsrpSignalLevelforLTE) {
+                    int dataType = mServiceState.getDataNetworkType();
+                    if (dataType == TelephonyManager.NETWORK_TYPE_LTE ||
+                            dataType == TelephonyManager.NETWORK_TYPE_LTE_CA) {
+                        mCurrentState.level = getAlternateLteLevel(mSignalStrength);
+                    }
+                }
             }
         }
         if (mNetworkToIconLookup.indexOfKey(mDataNetType) >= 0) {
@@ -400,15 +440,225 @@
             mCurrentState.networkName = mServiceState.getOperatorAlphaShort();
         }
 
+        if (mConfig.readIconsFromXml) {
+            mCurrentState.voiceLevel = getVoiceSignalLevel();
+        }
+
         notifyListenersIfNecessary();
     }
 
+    private void generateIconGroup() {
+        final int level = mCurrentState.level;
+        final int voiceLevel = mCurrentState.voiceLevel;
+        final int inet = mCurrentState.inetCondition;
+        final boolean dataConnected = mCurrentState.dataConnected;
+        final boolean roaming = isRoaming();
+        final int voiceType = getVoiceNetworkType();
+        final int dataType =  getDataNetworkType();
+
+        int[][] sbIcons = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH;
+        int[][] qsIcons = TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH;
+        int[] contentDesc = AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH;
+        int sbDiscState = TelephonyIcons.TELEPHONY_NO_NETWORK;
+        int qsDiscState = TelephonyIcons.QS_TELEPHONY_NO_NETWORK;
+        int discContentDesc = AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0];
+        int dataContentDesc, dataTypeIcon, qsDataTypeIcon, dataActivityId;
+        int singleSignalIcon, stackedDataIcon = 0, stackedVoiceIcon = 0;
+
+        final int slotId = getSimSlotIndex();
+        if (slotId < 0 || slotId > mPhone.getPhoneCount()) {
+            Log.e(mTag, "generateIconGroup invalid slotId:" + slotId);
+            return;
+        }
+
+        if (DEBUG) Log.d(mTag, "generateIconGroup slot:" + slotId + " style:" + mStyle
+                + " connected:" + mCurrentState.connected + " inetCondition:" + inet
+                + " roaming:" + roaming + " level:" + level + " voiceLevel:" + voiceLevel
+                + " dataConnected:" + dataConnected
+                + " dataActivity:" + mCurrentState.dataActivity
+                + " CS:" + voiceType
+                + "/" + TelephonyManager.getNetworkTypeName(voiceType)
+                + ", PS:" + dataType
+                + "/" + TelephonyManager.getNetworkTypeName(dataType));
+
+        // Update data icon set
+        int chosenNetworkType = ((dataType == TelephonyManager.NETWORK_TYPE_UNKNOWN)
+                ? voiceType : dataType);
+        TelephonyIcons.updateDataType(slotId, chosenNetworkType, mConfig.showAtLeast3G,
+                mConfig.show4gForLte, mConfig.hspaDataDistinguishable, inet);
+
+        // Update signal strength icons
+        singleSignalIcon = TelephonyIcons.getSignalStrengthIcon(slotId, inet, level, roaming);
+        if (DEBUG) {
+            Log.d(mTag, "singleSignalIcon:" + getResourceName(singleSignalIcon));
+        }
+
+        dataActivityId = (mCurrentState.dataConnected && slotId >= 0) ?
+                TelephonyIcons.getDataActivity(slotId, mCurrentState.dataActivity) : 0;
+
+        // Convert the icon to unstacked if necessary.
+        int unstackedSignalIcon = TelephonyIcons.convertMobileStrengthIcon(singleSignalIcon);
+        if (DEBUG) {
+            Log.d(mTag, "unstackedSignalIcon:" + getResourceName(unstackedSignalIcon));
+        }
+        if (singleSignalIcon != unstackedSignalIcon) {
+            stackedDataIcon = singleSignalIcon;
+            singleSignalIcon = unstackedSignalIcon;
+        }
+
+        if (mStyle == STATUS_BAR_STYLE_CDMA_1X_COMBINED) {
+            if (!roaming && showDataAndVoice()) {
+                stackedVoiceIcon = TelephonyIcons.getStackedVoiceIcon(voiceLevel);
+            } else if (roaming && dataActivityId != 0) {
+                // Remove data type indicator if already shown in data activity icon.
+                singleSignalIcon = TelephonyIcons.getRoamingSignalIconId(level, inet);
+            }
+        }
+
+        // Clear satcked data icon if no satcked voice icon.
+        if (stackedVoiceIcon == 0) stackedDataIcon = 0;
+
+        contentDesc = TelephonyIcons.getSignalStrengthDes(slotId);
+        sbDiscState = TelephonyIcons.getSignalNullIcon(slotId);
+        if (DEBUG) {
+            Log.d(mTag, "singleSignalIcon=" + getResourceName(singleSignalIcon)
+                    + " dataActivityId=" + getResourceName(dataActivityId)
+                    + " stackedDataIcon=" + getResourceName(stackedDataIcon)
+                    + " stackedVoiceIcon=" + getResourceName(stackedVoiceIcon));
+        }
+
+        // Update data net type icons
+        if (dataType == TelephonyManager.NETWORK_TYPE_IWLAN) {
+            // wimax is a special 4g network not handled by telephony
+            dataTypeIcon = TelephonyIcons.ICON_4G;
+            qsDataTypeIcon = TelephonyIcons.QS_DATA_4G;
+            dataContentDesc = R.string.accessibility_data_connection_4g;
+        } else {
+            dataTypeIcon = TelephonyIcons.getDataTypeIcon(slotId);
+            dataContentDesc = TelephonyIcons.getDataTypeDesc(slotId);
+            qsDataTypeIcon = TelephonyIcons.getQSDataTypeIcon(slotId);
+        }
+        if (roaming) {
+            dataTypeIcon = TelephonyIcons.ROAMING_ICON;
+            qsDataTypeIcon = TelephonyIcons.QS_DATA_R;
+        }
+        if (DEBUG) {
+            Log.d(mTag, "updateDataNetType, dataTypeIcon=" + getResourceName(dataTypeIcon)
+                    + " qsDataTypeIcon=" + getResourceName(qsDataTypeIcon)
+                    + " dataContentDesc=" + dataContentDesc);
+        }
+        mCurrentState.iconGroup = new MobileIconGroup(
+                TelephonyManager.getNetworkTypeName(dataType),
+                sbIcons, qsIcons, contentDesc, 0, 0, sbDiscState, qsDiscState, discContentDesc,
+                dataContentDesc, dataTypeIcon, false, qsDataTypeIcon,
+                singleSignalIcon, stackedDataIcon, stackedVoiceIcon, dataActivityId);
+    }
+
+    private int getSimSlotIndex() {
+        int slotId = -1;
+        if (mSubscriptionInfo != null) {
+            slotId = mSubscriptionInfo.getSimSlotIndex();
+        }
+        if (DEBUG) Log.d(mTag, "getSimSlotIndex, slotId: " + slotId);
+        return slotId;
+    }
+
+    private boolean showMobileActivity() {
+        return (mStyle == STATUS_BAR_STYLE_DEFAULT_DATA)
+                || (mStyle == STATUS_BAR_STYLE_ANDROID_DEFAULT);
+    }
+
+    private int getVoiceNetworkType() {
+        if (mServiceState == null) {
+            return TelephonyManager.NETWORK_TYPE_UNKNOWN;
+        }
+        return mServiceState.getVoiceNetworkType();
+    }
+
+    private int getDataNetworkType() {
+        if (mServiceState == null) {
+            return TelephonyManager.NETWORK_TYPE_UNKNOWN;
+        }
+        return mServiceState.getDataNetworkType();
+    }
+
+    private int getVoiceSignalLevel() {
+        if (mSignalStrength == null) {
+            return SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+        }
+        boolean isCdma = TelephonyManager.PHONE_TYPE_CDMA == TelephonyManager.getDefault()
+                .getCurrentPhoneType(mSubscriptionInfo.getSubscriptionId());
+        return isCdma ? mSignalStrength.getCdmaLevel() : mSignalStrength.getGsmLevel();
+    }
+
+    private boolean showDataAndVoice() {
+        if (mStyle != STATUS_BAR_STYLE_CDMA_1X_COMBINED) {
+            return false;
+        }
+        int dataType = getDataNetworkType();
+        int voiceType = getVoiceNetworkType();
+        if ((dataType == TelephonyManager.NETWORK_TYPE_EVDO_0
+                || dataType == TelephonyManager.NETWORK_TYPE_EVDO_0
+                || dataType == TelephonyManager.NETWORK_TYPE_EVDO_A
+                || dataType == TelephonyManager.NETWORK_TYPE_EVDO_B
+                || dataType == TelephonyManager.NETWORK_TYPE_EHRPD
+                || dataType == TelephonyManager.NETWORK_TYPE_LTE
+                || dataType == TelephonyManager.NETWORK_TYPE_LTE_CA)
+                && (voiceType == TelephonyManager.NETWORK_TYPE_GSM
+                    || voiceType == TelephonyManager.NETWORK_TYPE_1xRTT
+                    || voiceType == TelephonyManager.NETWORK_TYPE_CDMA)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean show1xOnly() {
+        int dataType = getDataNetworkType();
+        int voiceType = getVoiceNetworkType();
+        if (dataType == TelephonyManager.NETWORK_TYPE_1xRTT
+                || dataType == TelephonyManager.NETWORK_TYPE_CDMA) {
+            return true;
+        }
+        return false;
+    }
+
+    private int getAlternateLteLevel(SignalStrength signalStrength) {
+        int lteRsrp = signalStrength.getLteDbm();
+        int rsrpLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+        if (lteRsrp > -44) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+        else if (lteRsrp >= -97) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_GREAT;
+        else if (lteRsrp >= -105) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_GOOD;
+        else if (lteRsrp >= -113) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE;
+        else if (lteRsrp >= -120) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_POOR;
+        else if (lteRsrp >= -140) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+        if (DEBUG) {
+            Log.d(mTag, "getAlternateLteLevel lteRsrp:" + lteRsrp + " rsrpLevel = " + rsrpLevel);
+        }
+        return rsrpLevel;
+    }
+
+    protected String getResourceName(int resId) {
+        if (resId != 0) {
+            final Resources res = mContext.getResources();
+            try {
+                return res.getResourceName(resId);
+            } catch (android.content.res.Resources.NotFoundException ex) {
+                return "(unknown)";
+            }
+        } else {
+            return "(null)";
+        }
+    }
+
     @VisibleForTesting
     void setActivity(int activity) {
         mCurrentState.activityIn = activity == TelephonyManager.DATA_ACTIVITY_INOUT
                 || activity == TelephonyManager.DATA_ACTIVITY_IN;
         mCurrentState.activityOut = activity == TelephonyManager.DATA_ACTIVITY_INOUT
                 || activity == TelephonyManager.DATA_ACTIVITY_OUT;
+        if (mConfig.readIconsFromXml) {
+            mCurrentState.dataActivity = activity;
+        }
         notifyListenersIfNecessary();
     }
 
@@ -482,17 +732,35 @@
         final int mDataType;
         final boolean mIsWide;
         final int mQsDataType;
+        final int mSingleSignalIcon;
+        final int mStackedDataIcon;
+        final int mStackedVoiceIcon;
+        final int mActivityId;
 
         public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc,
                 int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
                 int discContentDesc, int dataContentDesc, int dataType, boolean isWide,
                 int qsDataType) {
+                this(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState,
+                        qsDiscState, discContentDesc, dataContentDesc, dataType, isWide,
+                        qsDataType, 0, 0, 0, 0);
+        }
+
+        public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc,
+                int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
+                int discContentDesc, int dataContentDesc, int dataType, boolean isWide,
+                int qsDataType, int singleSignalIcon, int stackedDataIcon,
+                int stackedVoicelIcon, int activityId) {
             super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState,
                     qsDiscState, discContentDesc);
             mDataContentDescription = dataContentDesc;
             mDataType = dataType;
             mIsWide = isWide;
             mQsDataType = qsDataType;
+            mSingleSignalIcon = singleSignalIcon;
+            mStackedDataIcon = stackedDataIcon;
+            mStackedVoiceIcon = stackedVoicelIcon;
+            mActivityId = activityId;
         }
     }
 
@@ -505,6 +773,8 @@
         boolean airplaneMode;
         boolean carrierNetworkChangeMode;
         boolean isDefault;
+        int dataActivity;
+        int voiceLevel;
 
         @Override
         public void copyFrom(State s) {
@@ -518,6 +788,8 @@
             isEmergency = state.isEmergency;
             airplaneMode = state.airplaneMode;
             carrierNetworkChangeMode = state.carrierNetworkChangeMode;
+            dataActivity = state.dataActivity;
+            voiceLevel = state.voiceLevel;
         }
 
         @Override
@@ -531,6 +803,7 @@
             builder.append("isDefault=").append(isDefault).append(',');
             builder.append("isEmergency=").append(isEmergency).append(',');
             builder.append("airplaneMode=").append(airplaneMode).append(',');
+            builder.append("voiceLevel=").append(voiceLevel).append(',');
             builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode);
         }
 
@@ -544,6 +817,7 @@
                     && ((MobileState) o).isEmergency == isEmergency
                     && ((MobileState) o).airplaneMode == airplaneMode
                     && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode
+                    && ((MobileState) o).voiceLevel == voiceLevel
                     && ((MobileState) o).isDefault == isDefault;
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 38656ee..4b30eb1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -39,8 +39,10 @@
                 boolean activityIn, boolean activityOut, String description);
 
         void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
-                int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
-                String description, boolean isWide, int subId);
+                int qsType, boolean activityIn, boolean activityOut, int dataActivityId,
+                int mobileActivityId, int stackedDataIcon, int stackedVoiceIcon,
+                String typeContentDescription, String description,
+                boolean isWide, int subId);
         void setSubs(List<SubscriptionInfo> subs);
         void setNoSims(boolean show);
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 37c570e..9008e51 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -826,6 +826,8 @@
         boolean alwaysShowCdmaRssi = false;
         boolean show4gForLte = false;
         boolean hspaDataDistinguishable;
+        boolean readIconsFromXml;
+        boolean showRsrpSignalLevelforLTE;
 
         static Config readConfig(Context context) {
             Config config = new Config();
@@ -837,6 +839,9 @@
             config.show4gForLte = res.getBoolean(R.bool.config_show4GForLTE);
             config.hspaDataDistinguishable =
                     res.getBoolean(R.bool.config_hspa_data_distinguishable);
+            config.readIconsFromXml = res.getBoolean(R.bool.config_read_icons_from_xml);
+            config.showRsrpSignalLevelforLTE =
+                    res.getBoolean(R.bool.config_showRsrpSignalLevelforLTE);
             return config;
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java
index dce889f..511ad2b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java
@@ -36,8 +36,9 @@
 
     @Override
     public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
-            int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
-            String description, boolean isWide, int subId) {
+            int qsType, boolean activityIn, boolean activityOut, int dataActivity,
+            int mobileActivity, int stackedDataIcon, int stackedVoiceIcon,
+            String typeContentDescription, String description, boolean isWide, int subId) {
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index 68f8191..2c9f2b9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -1,4 +1,6 @@
 /*
+ * Copyright (c) 2015, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
  * Copyright (C) 2008 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +18,14 @@
 
 package com.android.systemui.statusbar.policy;
 
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.telephony.SignalStrength;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+import android.util.SparseArray;
+
 import com.android.systemui.R;
 import com.android.systemui.statusbar.policy.MobileSignalController.MobileIconGroup;
 
@@ -68,6 +78,20 @@
           R.drawable.stat_sys_signal_4_fully }
     };
 
+    //Default roaming icons with R indicator
+    static final int[][] TELEPHONY_SIGNAL_STRENGTH_ROAMING_R = {
+        { R.drawable.stat_sys_signal_0_default_roam,
+          R.drawable.stat_sys_signal_1_default_roam,
+          R.drawable.stat_sys_signal_2_default_roam,
+          R.drawable.stat_sys_signal_3_default_roam,
+          R.drawable.stat_sys_signal_4_default_roam },
+        { R.drawable.stat_sys_signal_0_default_fully_roam,
+          R.drawable.stat_sys_signal_1_default_fully_roam,
+          R.drawable.stat_sys_signal_2_default_fully_roam,
+          R.drawable.stat_sys_signal_3_default_fully_roam,
+          R.drawable.stat_sys_signal_4_default_fully_roam }
+    };
+
     //CarrierNetworkChange
     static final int[][] TELEPHONY_CARRIER_NETWORK_CHANGE = {
             { R.drawable.stat_sys_signal_carrier_network_change_animation,
@@ -229,6 +253,403 @@
     static final int QS_ICON_1X = R.drawable.ic_qs_signal_1x;
     static final int QS_ICON_CARRIER_NETWORK_CHANGE =
             R.drawable.ic_qs_signal_carrier_network_change_animation;
+    static final int DATA_TYPE_UNKNOWN = 0;
+    static final int DATA_TYPE_G = 1;
+    static final int DATA_TYPE_E = 2;
+    static final int DATA_TYPE_2G = 3;
+    static final int DATA_TYPE_3G = 4;
+    static final int DATA_TYPE_4G = 5;
+    static final int DATA_TYPE_H = 6;
+    static final int DATA_TYPE_HP = 7;
+    static final int DATA_TYPE_1X = 8;
+    static final int DATA_TYPE_LTE = 9;
+
+    static final int SIGNAL_STRENGTH_TYPE_G = 0;
+    static final int SIGNAL_STRENGTH_TYPE_E = 1;
+    static final int SIGNAL_STRENGTH_TYPE_3G = 2;
+    static final int SIGNAL_STRENGTH_TYPE_4G = 3;
+    static final int SIGNAL_STRENGTH_TYPE_H = 4;
+    static final int SIGNAL_STRENGTH_TYPE_HP = 5;
+    static final int SIGNAL_STRENGTH_TYPE_1X = 6;
+    static final int SIGNAL_STRENGTH_TYPE_CDMA = 7;
+    static final int SIGNAL_STRENGTH_TYPE_UMTS = 8;
+
+    static final boolean DEBUG = true;
+    static final int DEFAULT_SUB = 0;
+    static final int INET_TYPE_NUM = 2;
+    static final int SIGNAL_LEVEL_NUM = SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
+    static final String TAG = "TelephonyIcons";
+    static final String NS = "com.android.systemui";
+
+    static String[] mDataTypeArray, mDataTypeGenerationArray;
+    static String[] mDataTypeDescriptionArray, mDataTypeGenerationDescArray;
+    static String[] mDataActivityArray;
+    static String[] mSignalStrengthArray, mSignalStrengthRoamingArray;
+    static String[] mSignalNullArray;
+    static String[] mSignalStrengthDesc;
+
+    static int[] mSelectedDataTypeIcon;
+    static int[] mSelectedQSDataTypeIcon;
+    static String[] mSelectedDataTypeDesc;
+    static int[] mSelectedDataActivityIndex;
+    static int[] mSelectedSignalStreagthIndex;
+    static SparseArray<Integer> mStacked2SingleIconLookup;
+
+    private static Resources mRes;
+    private static boolean isInitiated = false;
+
+    static void readIconsFromXml(Context context) {
+        if (isInitiated) {
+            log(TAG, "readIconsFromXml, already read!");
+            return;
+        }
+
+        mRes = context.getResources();
+        try {
+            mDataTypeArray = mRes.getStringArray(R.array.multi_data_type);
+            mDataTypeDescriptionArray = mRes.getStringArray(
+                    R.array.telephony_data_type_description);
+            mDataTypeGenerationArray = mRes.getStringArray(
+                    R.array.telephony_data_type_generation);
+            mDataTypeGenerationDescArray = mRes.getStringArray(
+                    R.array.telephony_data_type_generation_description);
+            mDataActivityArray = mRes.getStringArray(R.array.multi_data_activity);
+            mSignalStrengthArray = mRes.getStringArray(R.array.multi_signal_strength);
+            mSignalStrengthRoamingArray = mRes.getStringArray(
+                    R.array.multi_signal_strength_roaming);
+            mSignalNullArray = mRes.getStringArray(R.array.multi_signal_null);
+            mSignalStrengthDesc = mRes.getStringArray(R.array.signal_strength_description);
+            initStacked2SingleIconLookup();
+        } catch (android.content.res.Resources.NotFoundException e) {
+            isInitiated = false;
+            log(TAG, "readIconsFromXml, exception happened: " + e);
+            return;
+        }
+
+        if (mSelectedDataTypeIcon == null
+            && mDataTypeArray.length != 0) {
+            mSelectedDataTypeIcon = new int[mDataTypeArray.length];
+        }
+        if (mSelectedQSDataTypeIcon == null
+            && mDataTypeArray.length != 0) {
+            mSelectedQSDataTypeIcon = new int[mDataTypeArray.length];
+        }
+        if (mSelectedDataTypeDesc == null
+            && mDataTypeArray.length != 0) {
+            mSelectedDataTypeDesc = new String[mDataTypeArray.length];
+        }
+        if (mSelectedDataActivityIndex == null
+            && mDataActivityArray.length != 0) {
+            mSelectedDataActivityIndex = new int[mDataActivityArray.length];
+        }
+        if (mSelectedSignalStreagthIndex == null
+            && mSignalStrengthArray.length != 0) {
+            mSelectedSignalStreagthIndex = new int[mSignalStrengthArray.length];
+        }
+        isInitiated = true;
+    }
+
+    static void initStacked2SingleIconLookup() {
+        mStacked2SingleIconLookup = new SparseArray<>();
+        TypedArray stackedIcons = mRes.obtainTypedArray(R.array.stacked_signal_icons);
+        TypedArray singleIcons = mRes.obtainTypedArray(R.array.single_signal_icons);
+
+        mStacked2SingleIconLookup.clear();
+        for (int i = 0; i < stackedIcons.length() && i < singleIcons.length(); i++) {
+            mStacked2SingleIconLookup.put(stackedIcons.getResourceId(i,0),
+                    singleIcons.getResourceId(i,0));
+        }
+        stackedIcons.recycle();
+        singleIcons.recycle();
+        log(TAG, "initStacked2SingleIconLookup: size=" + mStacked2SingleIconLookup.size());
+    }
+
+    static int getSignalNullIcon(int slot) {
+        if (mSignalNullArray == null) {
+            return 0;
+        }
+        String resName = mSignalNullArray[slot];
+        log(TAG, "null signal icon name: " + resName);
+        int resId = mRes.getIdentifier(resName, null, NS);
+        return resId;
+    }
+
+    static void updateDataType(int slot, int type, boolean showAtLeast3G,
+            boolean show4GforLte, boolean hspaDistinguishable, int inet) {
+        log(TAG, "updateDataType "
+                + String.format("slot=%d, type=%d, inetCondition=%d",
+                        slot, type, inet)
+                + " showAtLeast3G=" + String.valueOf(showAtLeast3G)
+                + " show4GforLte=" + String.valueOf(show4GforLte)
+                + " hspaDistinguishable=" + String.valueOf(hspaDistinguishable));
+
+        String resName = mDataTypeArray[slot];
+        int resId = mRes.getIdentifier(resName, null, NS);
+        String[] dataTypeArray = mRes.getStringArray(resId);
+
+        log(TAG, "data type item name: " + resName + " id:" + resId);
+
+        switch (type) {
+            case TelephonyManager.NETWORK_TYPE_UNKNOWN:
+                if (!showAtLeast3G) {
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            dataTypeArray[type], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = 0;
+                    mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type];
+                    mSelectedDataActivityIndex[slot] = 0;
+                    mSelectedSignalStreagthIndex[slot] = 0;
+                    break;
+                } else {
+                    // fall through
+                }
+            case TelephonyManager.NETWORK_TYPE_EDGE:
+                if (!showAtLeast3G) {
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            dataTypeArray[type], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_E;
+                    mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type];
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_E;
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_E;
+                    break;
+                } else {
+                    // fall through
+                }
+            case TelephonyManager.NETWORK_TYPE_UMTS:
+            case TelephonyManager.NETWORK_TYPE_TD_SCDMA:
+                mSelectedDataActivityIndex[slot] = DATA_TYPE_3G;
+                mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                        dataTypeArray[type], null, NS);
+                mSelectedQSDataTypeIcon[slot] = QS_DATA_3G;
+                mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type];
+                mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_UMTS;
+                break;
+            case TelephonyManager.NETWORK_TYPE_HSDPA:
+            case TelephonyManager.NETWORK_TYPE_HSUPA:
+            case TelephonyManager.NETWORK_TYPE_HSPA:
+                if (hspaDistinguishable) {
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_H;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            dataTypeArray[type], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_H;
+                    mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type];
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_H;
+                } else {
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_3G;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            mDataTypeGenerationArray[0], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_3G;
+                    mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[0];
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G;
+
+                }
+                break;
+            case TelephonyManager.NETWORK_TYPE_HSPAP:
+                if (hspaDistinguishable) {
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_HP;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            dataTypeArray[type], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_H;
+                    mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type];
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_HP;
+                } else {
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_3G;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            mDataTypeGenerationArray[0], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_3G;
+                    mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[0];
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G;
+                }
+                break;
+            case TelephonyManager.NETWORK_TYPE_CDMA:
+                if (!showAtLeast3G) {
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_1X;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            dataTypeArray[type], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_1X;
+                    mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type];
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_CDMA;
+                    break;
+                } else {
+                    // fall through
+                }
+            case TelephonyManager.NETWORK_TYPE_1xRTT:
+                if (!showAtLeast3G) {
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_1X;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            dataTypeArray[type], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_1X;
+                    mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type];
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_1X;
+                    break;
+                } else {
+                    // fall through
+                }
+            case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
+            case TelephonyManager.NETWORK_TYPE_EVDO_A:
+            case TelephonyManager.NETWORK_TYPE_EVDO_B:
+            case TelephonyManager.NETWORK_TYPE_EHRPD:
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_3G;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            dataTypeArray[type], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_3G;
+                    mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type];
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G;
+                break;
+            case TelephonyManager.NETWORK_TYPE_LTE:
+            case TelephonyManager.NETWORK_TYPE_LTE_CA:
+                if (show4GforLte) {
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_4G;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                        mDataTypeGenerationArray[1], null, NS);
+                    if ( type == TelephonyManager.NETWORK_TYPE_LTE_CA) {
+                        //Select 4G+ icon.
+                        mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                                mDataTypeGenerationArray[2], null, NS);
+                    }
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_4G;
+                    mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[1];
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_4G;
+                } else {
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_LTE;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            dataTypeArray[type], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_LTE;
+                    mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type];
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_4G;
+                }
+                break;
+            case TelephonyManager.NETWORK_TYPE_GPRS:
+            case TelephonyManager.NETWORK_TYPE_GSM:
+                if (!showAtLeast3G) {
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_G;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            dataTypeArray[type], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_G;
+                    mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type];
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_G;
+                } else {
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_3G;
+                    mSelectedDataTypeIcon[slot] = mRes.getIdentifier(
+                            mDataTypeGenerationArray[0], null, NS);
+                    mSelectedQSDataTypeIcon[slot] = QS_DATA_3G;
+                    mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[0];;
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G;
+                }
+                break;
+            default:
+                    mSelectedDataActivityIndex[slot] = DATA_TYPE_UNKNOWN;
+                    mSelectedDataTypeIcon[slot] = 0;
+                    mSelectedQSDataTypeIcon[slot] = 0;
+                    mSelectedDataTypeDesc[slot] = "";
+                    mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_G;
+                break;
+        }
+        log(TAG, "updateDataType " + String.format(
+                "mSelectedDataTypeIcon[%d]=%d, mSelectedDataActivityIndex=%d",
+                slot, mSelectedDataTypeIcon[slot], mSelectedDataActivityIndex[slot]));
+    }
+
+
+    static int getQSDataTypeIcon(int slot) {
+        return mSelectedQSDataTypeIcon[slot];
+    }
+
+    static int getDataTypeIcon(int slot) {
+        log(TAG, "getDataTypeIcon " + String.format("sub=%d", slot));
+        return mSelectedDataTypeIcon[slot];
+    }
+
+    static int getDataTypeDesc(int slot) {
+        return mRes.getIdentifier(mSelectedDataTypeDesc[slot], null, NS);
+    }
+
+    static int getDataActivity(int slot, int activity) {
+        log(TAG, String.format("getDataActivity, slot=%d, activity=%d",
+                slot, activity));
+
+        String[] dataActivityArray = mRes.getStringArray(
+                mRes.getIdentifier(mDataActivityArray[slot], null, NS));
+        String[] selectedTypeArray = mRes.getStringArray(mRes.getIdentifier(
+                dataActivityArray[mSelectedDataActivityIndex[slot]], null, NS));
+
+        return mRes.getIdentifier(selectedTypeArray[activity], null, NS);
+    }
+
+    static int getSignalStrengthIcon(int slot, int inet, int level, boolean roaming) {
+        log(TAG, "getSignalStrengthIcon: " + String.format(
+                "slot=%d, inetCondition=%d, level=%d, roaming=%b", slot, inet, level, roaming));
+
+        String[] signalStrengthArray, selectedTypeArray;
+
+        signalStrengthArray = mRes.getStringArray(mRes.getIdentifier(!roaming ?
+                mSignalStrengthArray[slot] : mSignalStrengthRoamingArray[slot], null, NS));
+        log(TAG, String.format("signalStrengthArray.length=%d", signalStrengthArray.length));
+
+        selectedTypeArray = mRes.getStringArray(mRes.getIdentifier(
+                signalStrengthArray[mSelectedSignalStreagthIndex[slot]], null, NS));
+        log(TAG, String.format("selectedTypeArray.length=%d", selectedTypeArray.length));
+
+        String[] inetArray = mRes.getStringArray(
+                mRes.getIdentifier(selectedTypeArray[inet], null, NS));
+        log(TAG, String.format("inetArray.length=%d", inetArray.length));
+
+        return mRes.getIdentifier(inetArray[level], null, NS);
+    }
+
+
+    static int convertMobileStrengthIcon(int stackedIcon) {
+        if (mStacked2SingleIconLookup == null) {
+            return stackedIcon;
+        }
+        int index = mStacked2SingleIconLookup.indexOfKey(stackedIcon);
+        if (index >= 0) {
+            return mStacked2SingleIconLookup.get(stackedIcon);
+        }
+        return stackedIcon;
+    }
+
+    static int getStackedVoiceIcon(int level) {
+        int retValue = 0;
+        switch(level){
+            case SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN:
+                retValue = R.drawable.stat_sys_signal_0_2g;
+                break;
+            case SignalStrength.SIGNAL_STRENGTH_POOR:
+                retValue = R.drawable.stat_sys_signal_1_2g;
+                break;
+            case SignalStrength.SIGNAL_STRENGTH_MODERATE:
+                retValue = R.drawable.stat_sys_signal_2_2g;
+                break;
+            case SignalStrength.SIGNAL_STRENGTH_GOOD:
+                retValue = R.drawable.stat_sys_signal_3_2g;
+                break;
+            case SignalStrength.SIGNAL_STRENGTH_GREAT:
+                retValue = R.drawable.stat_sys_signal_4_2g;
+                break;
+            default:
+                break;
+        }
+        return retValue;
+    }
+
+    static int getRoamingSignalIconId(int level, int inet){
+        return TELEPHONY_SIGNAL_STRENGTH_ROAMING_R[inet][level];
+    }
+
+    static int[]  getSignalStrengthDes(int slot) {
+        int[] resId = new int[SIGNAL_LEVEL_NUM];
+        for (int i = 0; i < SIGNAL_LEVEL_NUM; i++) {
+            resId[i] = mRes.getIdentifier(mSignalStrengthDesc[i], null, NS);
+        }
+        return resId;
+    }
+
+    private static void log(String tag, String str){
+        if (DEBUG) {
+            Log.d(tag, str);
+        }
+    }
+
 
     static final MobileIconGroup CARRIER_NETWORK_CHANGE = new MobileIconGroup(
             "CARRIER_NETWORK_CHANGE",
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
index 9b1e72a..29be2c9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
@@ -29,6 +29,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.AsyncChannel;
+import com.android.systemui.R;
 import com.android.systemui.statusbar.policy.NetworkController.IconState;
 
 import java.util.List;
@@ -75,8 +76,10 @@
     @Override
     public void notifyListeners() {
         // only show wifi in the cluster if connected or if wifi-only
+        boolean visibleWhenEnabled = mContext.getResources().getBoolean(
+                R.bool.config_showWifiIndicatorWhenEnabled);
         boolean wifiVisible = mCurrentState.enabled
-                && (mCurrentState.connected || !mHasMobileData);
+                && (mCurrentState.connected || !mHasMobileData || visibleWhenEnabled);
         String wifiDesc = wifiVisible ? mCurrentState.ssid : null;
         boolean ssidPresent = wifiVisible && mCurrentState.ssid != null;
         String contentDescription = getStringIfExists(getContentDescription());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
index 00b8de2..5e840f5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
@@ -104,8 +104,8 @@
         int qsType = R.drawable.ic_qs_signal_1x;
         boolean wide = true;
         int subId = 5;
-        mHandler.setMobileDataIndicators(status, qs, type, qsType, in, out, typeDescription,
-                description, wide, subId);
+        mHandler.setMobileDataIndicators(status, qs, type, qsType, in, out, 0, 0, 0, 0,
+                typeDescription, description, wide, subId);
         waitForCallbacks();
 
         ArgumentCaptor<IconState> statusArg = ArgumentCaptor.forClass(IconState.class);
@@ -120,7 +120,11 @@
         ArgumentCaptor<Integer> subIdArg = ArgumentCaptor.forClass(Integer.class);
         Mockito.verify(mSignalCallback).setMobileDataIndicators(statusArg.capture(),
                 qsArg.capture(), typeIconArg.capture(), qsTypeIconArg.capture(), inArg.capture(),
-                outArg.capture(), typeContentArg.capture(), descArg.capture(), wideArg.capture(),
+                outArg.capture(), ArgumentCaptor.forClass(Integer.class).capture(),
+                ArgumentCaptor.forClass(Integer.class).capture(),
+                ArgumentCaptor.forClass(Integer.class).capture(),
+                ArgumentCaptor.forClass(Integer.class).capture(),
+                typeContentArg.capture(), descArg.capture(), wideArg.capture(),
                 subIdArg.capture());
         assertEquals(status, statusArg.getValue());
         assertEquals(qs, qsArg.getValue());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index 30c08cd..58cb6ff 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -276,6 +276,10 @@
                     iconArg.capture(),
                     ArgumentCaptor.forClass(Integer.class).capture(),
                     typeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(),
+                    ArgumentCaptor.forClass(Integer.class).capture(),
+                    ArgumentCaptor.forClass(Integer.class).capture(),
+                    ArgumentCaptor.forClass(Integer.class).capture(),
+                    ArgumentCaptor.forClass(Integer.class).capture(),
                     ArgumentCaptor.forClass(String.class).capture(),
                     ArgumentCaptor.forClass(String.class).capture(),
                     ArgumentCaptor.forClass(Boolean.class).capture(),
@@ -302,6 +306,10 @@
                 ArgumentCaptor.forClass(Integer.class).capture(),
                 ArgumentCaptor.forClass(Boolean.class).capture(),
                 ArgumentCaptor.forClass(Boolean.class).capture(),
+                ArgumentCaptor.forClass(Integer.class).capture(),
+                ArgumentCaptor.forClass(Integer.class).capture(),
+                ArgumentCaptor.forClass(Integer.class).capture(),
+                ArgumentCaptor.forClass(Integer.class).capture(),
                 ArgumentCaptor.forClass(String.class).capture(),
                 ArgumentCaptor.forClass(String.class).capture(),
                 ArgumentCaptor.forClass(Boolean.class).capture(),
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index de1e0e7..3f918e7 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -34,6 +34,7 @@
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
 import android.database.ContentObserver;
 import android.os.Binder;
 import android.os.Handler;
@@ -46,6 +47,7 @@
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.Settings;
 import android.provider.Settings.SettingNotFoundException;
 import android.util.Log;
@@ -1373,16 +1375,21 @@
         int callingUser = UserHandle.getCallingUserId();
         int callingUid = Binder.getCallingUid();
         long callingIdentity = Binder.clearCallingIdentity();
+        UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+        UserInfo ui = um.getProfileParent(callingUser);
+        int parentUser = (ui != null) ? ui.id : UserHandle.USER_NULL;
         int callingAppId = UserHandle.getAppId(callingUid);
         boolean valid = false;
         try {
             foregroundUser = ActivityManager.getCurrentUser();
             valid = (callingUser == foregroundUser) ||
+                    parentUser == foregroundUser    ||
                     callingAppId == Process.NFC_UID ||
                     callingAppId == mSystemUiUid;
             if (DBG) {
                 Log.d(TAG, "checkIfCallerIsForegroundUser: valid=" + valid
                     + " callingUser=" + callingUser
+                    + " parentUser=" + parentUser
                     + " foregroundUser=" + foregroundUser);
             }
         } finally {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 02f5cfd..c60783d 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -296,6 +296,11 @@
     private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY;
     private static final String TAG_VISIBLE_BEHIND = TAG + POSTFIX_VISIBLE_BEHIND;
 
+    private static final String ACTION_POWER_OFF_ALARM =
+            "org.codeaurora.alarm.action.POWER_OFF_ALARM";
+
+    private static final String POWER_OFF_ALARM = "powerOffAlarm";
+
     /** Control over CPU and battery monitoring */
     // write battery stats every 30 minutes.
     static final long BATTERY_STATS_TIME = 30 * 60 * 1000;
@@ -3484,6 +3489,15 @@
         return true;
     }
 
+    /**
+     * If system is power off alarm boot mode, we need to start alarm UI.
+     */
+    void startAlarmActivityLocked() {
+        Intent intent = new Intent(ACTION_POWER_OFF_ALARM);
+        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+        mContext.startActivityAsUser(intent, UserHandle.CURRENT);
+    }
+
     private ActivityInfo resolveActivityInfo(Intent intent, int flags, int userId) {
         ActivityInfo ai = null;
         ComponentName comp = intent.getComponent();
@@ -5088,10 +5102,6 @@
                     newTracesPath = tracesPath + "_" + app.processName;
 
                 traceRenameFile.renameTo(new File(newTracesPath));
-                Process.sendSignal(app.pid, 6);
-                SystemClock.sleep(1000);
-                Process.sendSignal(app.pid, 6);
-                SystemClock.sleep(1000);
             }
 
             // Bring up the infamous App Not Responding dialog
@@ -11870,6 +11880,12 @@
             mBooting = true;
             startHomeActivityLocked(mCurrentUserId, "systemReady");
 
+            // start the power off alarm by boot mode
+            boolean isAlarmBoot = SystemProperties.getBoolean("ro.alarm_boot", false);
+            if (isAlarmBoot) {
+                startAlarmActivityLocked();
+            }
+
             try {
                 if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
                     Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your"
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 08172ab..42e8c29 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -2662,6 +2662,19 @@
                     + " canceled=" + canceled);
         }
 
+        // If the boot mode is power off alarm, we should not dispatch the several physical keys
+        // in power off alarm UI to avoid pausing power off alarm UI.
+        int isPowerOffAlarmMode = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.POWER_OFF_ALARM_MODE, 0);
+        if (DEBUG_INPUT) { Log.d(TAG, "intercept Dispatching isPowerOffAlarmMode = " +
+                isPowerOffAlarmMode); }
+
+        if (isPowerOffAlarmMode == 1 && (keyCode == KeyEvent.KEYCODE_HOME
+                || keyCode == KeyEvent.KEYCODE_SEARCH
+                || keyCode == KeyEvent.KEYCODE_MENU)) {
+            return -1;  // ignore the physical key here
+        }
+
         // If we think we might have a volume down & power key chord on the way
         // but we're not sure, then tell the dispatcher to wait a little while and
         // try again later before dispatching.
diff --git a/services/core/jni/com_android_server_AlarmManagerService.cpp b/services/core/jni/com_android_server_AlarmManagerService.cpp
index 7d34448..546e3e6 100644
--- a/services/core/jni/com_android_server_AlarmManagerService.cpp
+++ b/services/core/jni/com_android_server_AlarmManagerService.cpp
@@ -49,6 +49,7 @@
     CLOCK_BOOTTIME_ALARM,
     CLOCK_BOOTTIME,
     CLOCK_MONOTONIC,
+    CLOCK_POWEROFF_ALARM,
     CLOCK_REALTIME,
 };
 /* to match the legacy alarm driver implementation, we need an extra
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index bd72860..93f735f 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -438,6 +438,7 @@
         boolean disableNetwork = SystemProperties.getBoolean("config.disable_network", false);
         boolean disableNetworkTime = SystemProperties.getBoolean("config.disable_networktime", false);
         boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1");
+	boolean disableAtlas = SystemProperties.getBoolean("config.disable_atlas", true);
 
         try {
             Slog.i(TAG, "Reading configuration...");
@@ -927,7 +928,7 @@
                 mSystemServiceManager.startService(DreamManagerService.class);
             }
 
-            if (!disableNonCoreServices) {
+            if (!disableNonCoreServices && !disableAtlas) {
                 try {
                     Slog.i(TAG, "Assets Atlas Service");
                     atlas = new AssetAtlasService(context);
diff --git a/telephony/java/com/android/ims/ImsReasonInfo.java b/telephony/java/com/android/ims/ImsReasonInfo.java
index 3ab415c..85ec162 100644
--- a/telephony/java/com/android/ims/ImsReasonInfo.java
+++ b/telephony/java/com/android/ims/ImsReasonInfo.java
@@ -251,6 +251,14 @@
     public static final int CODE_CALL_END_CAUSE_CALL_PULL = 1016;
 
     /**
+     * Supplementary services (HOLD/RESUME) failure error codes.
+     * Values for Supplemetary services failure - Failed, Cancelled and Re-Invite collision.
+     */
+    public static final int CODE_SUPP_SVC_FAILED = 1201;
+    public static final int CODE_SUPP_SVC_CANCELLED = 1202;
+    public static final int CODE_SUPP_SVC_REINVITE_COLLISION = 1203;
+
+    /**
      * Network string error messages.
      * mExtraMessage may have these values.
      */