Merge "Associate connected APN list with subscription"
diff --git a/core/java/android/util/Patterns.java b/core/java/android/util/Patterns.java
index 2cc91b9..6fc8ae5 100644
--- a/core/java/android/util/Patterns.java
+++ b/core/java/android/util/Patterns.java
@@ -125,15 +125,35 @@
             + "|[1-9][0-9]|[0-9]))");
 
     /**
+     * Match the characters without containing chinese characters
+     * @hide
+     */
+    private static final String GOOD_IRI_HOST_CHAR =
+        "a-zA-Z0-9\u00A0-\u2FFF\u3040-\u4DFF\u9FA6-\uD7FF"
+        + "\uF900-\uFDCF\uFDF0-\uFEFF";
+
+    /**
      * RFC 1035 Section 2.3.4 limits the labels to a maximum 63 octets.
      */
-    private static final String IRI
-        = "[" + GOOD_IRI_CHAR + "]([" + GOOD_IRI_CHAR + "\\-]{0,61}[" + GOOD_IRI_CHAR + "]){0,1}";
+    private static final String IRI =
+        "[" + GOOD_IRI_HOST_CHAR + "]([" + GOOD_IRI_HOST_CHAR + "\\-]{0,61}["
+        + GOOD_IRI_HOST_CHAR + "]){0,1}";
 
     private static final String GOOD_GTLD_CHAR =
-        "a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF";
+        "a-zA-Z\u00A0-\u2FFF\u3040-\u4DFF\u9FA6-\uD7FF"
+        + "\uF900-\uFDCF\uFDF0-\uFEFF";
     private static final String GTLD = "[" + GOOD_GTLD_CHAR + "]{2,63}";
     private static final String HOST_NAME = "(" + IRI + "\\.)+" + GTLD;
+    // Halfwidth and fullwidth forms
+    private static final String HALF_FULL_WIDTH_CHAR = "\uFF00-\uFFEF";
+    // Symbols and punctuation
+    private static final String SYMBOLS_PUNCTUATION_CHAR = "\u3000-\u303F";
+    // Chinese characters
+    private static final String CHINESE_CHAR = "\u4E00-\u9FA5";
+    // Forbidden characters, should remove from URL,
+    private static final String FORBIDDEN_CHAR =
+        "[" + SYMBOLS_PUNCTUATION_CHAR + CHINESE_CHAR
+        + HALF_FULL_WIDTH_CHAR + "]";
 
     public static final Pattern DOMAIN_NAME
         = Pattern.compile("(" + HOST_NAME + "|" + IP_ADDRESS + ")");
@@ -149,11 +169,15 @@
         + "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?"
         + "(?:" + DOMAIN_NAME + ")"
         + "(?:\\:\\d{1,5})?)" // plus option port number
-        + "(\\/(?:(?:[" + GOOD_IRI_CHAR + "\\;\\/\\?\\:\\@\\&\\=\\#\\~"  // plus option query params
-        + "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?"
-        + "(?:\\b|$)"); // and finally, a word boundary or end of
-                        // input.  This is to stop foo.sure from
-                        // matching as foo.su
+        + "(\\/(?:(?:[" + GOOD_IRI_HOST_CHAR
+        + "\\;\\/\\?\\:\\@\\&\\=\\#\\~"  // plus option query params
+        + "\\-\\.\\+\\!\\*\\'\\(\\)\\_])|(?:\\,[" + GOOD_IRI_HOST_CHAR
+        + "])|(?:\\%[a-fA-F0-9]{2}))*)?"
+        + "(?:(?=" + FORBIDDEN_CHAR
+        + ")|\\b|$)");
+        // and finally, a word boundary or end of input. This is to stop
+        // foo.sure from matching as foo.su
+        // also should remove forbidden characters from end of URL.
 
     public static final Pattern EMAIL_ADDRESS
         = Pattern.compile(
diff --git a/core/java/com/android/internal/app/ActivityTrigger.java b/core/java/com/android/internal/app/ActivityTrigger.java
index 6f6949a..770bba7 100644
--- a/core/java/com/android/internal/app/ActivityTrigger.java
+++ b/core/java/com/android/internal/app/ActivityTrigger.java
@@ -55,6 +55,11 @@
     }
 
     /** &hide */
+    public void activityStartProcessTrigger(String process, int pid) {
+        native_at_startProcessActivity(process, pid);
+    }
+
+    /** &hide */
     public void activityStartTrigger(Intent intent, ActivityInfo acInfo, ApplicationInfo appInfo) {
         ComponentName cn = intent.getComponent();
         int overrideFlags = 0;
@@ -86,4 +91,5 @@
     private native int native_at_startActivity(String activity, int flags);
     private native void native_at_resumeActivity(String activity);
     private native void native_at_deinit();
+    private native void native_at_startProcessActivity(String process, int pid);
 }
diff --git a/core/jni/com_android_internal_app_ActivityTrigger.cpp b/core/jni/com_android_internal_app_ActivityTrigger.cpp
index 8ba9e06d..a48cb40 100644
--- a/core/jni/com_android_internal_app_ActivityTrigger.cpp
+++ b/core/jni/com_android_internal_app_ActivityTrigger.cpp
@@ -56,6 +56,7 @@
     void (*resumeActivity)(const char *);
     void (*init)(void);
     void (*deinit)(void);
+    void (*startProcessActivity)(const char *, int);
     const char *dlname;
 }dlLibHandler;
 
@@ -64,11 +65,11 @@
  * library -both handlers for Start and Resume events.
  */
 static dlLibHandler mDlLibHandlers[] = {
-    {NULL, NULL, NULL, NULL, NULL,
+    {NULL, NULL, NULL, NULL, NULL, NULL,
      "ro.vendor.at_library"},
-    {NULL, NULL, NULL, NULL, NULL,
+    {NULL, NULL, NULL, NULL, NULL, NULL,
      "ro.vendor.gt_library"},
-     {NULL, NULL, NULL, NULL, NULL,
+     {NULL, NULL, NULL, NULL, NULL, NULL,
      "ro.vendor.wl_library"}
 };
 
@@ -122,10 +123,17 @@
                 errored = true;
             }
         }
+        if (!errored) {
+            *(void **) (&mDlLibHandlers[i].startProcessActivity) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_process_start");
+            if ((rc = dlerror()) != NULL) {
+                errored = true;
+            }
+        }
 
         if (errored) {
             mDlLibHandlers[i].startActivity  = NULL;
             mDlLibHandlers[i].resumeActivity = NULL;
+            mDlLibHandlers[i].startProcessActivity = NULL;
             if (mDlLibHandlers[i].dlhandle) {
                 dlclose(mDlLibHandlers[i].dlhandle);
                 mDlLibHandlers[i].dlhandle = NULL;
@@ -145,6 +153,7 @@
         if (mDlLibHandlers[i].dlhandle) {
             mDlLibHandlers[i].startActivity  = NULL;
             mDlLibHandlers[i].resumeActivity = NULL;
+            mDlLibHandlers[i].startProcessActivity = NULL;
 
             *(void **) (&mDlLibHandlers[i].deinit) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_deinit");
             if (mDlLibHandlers[i].deinit) {
@@ -157,6 +166,19 @@
     }
 }
 
+static void
+com_android_internal_app_ActivityTrigger_native_at_startProcessActivity(JNIEnv *env, jobject clazz, jstring process, jint pid)
+{
+    size_t numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers);
+    const char *actStr = env->GetStringUTFChars(process, NULL);
+    for(size_t i = 0; i < numlibs; i++){
+        if(mDlLibHandlers[i].startProcessActivity && process && actStr) {
+            (*mDlLibHandlers[i].startProcessActivity)(actStr, pid);
+        }
+    }
+    env->ReleaseStringUTFChars(process, actStr);
+}
+
 static jint
 com_android_internal_app_ActivityTrigger_native_at_startActivity(JNIEnv *env, jobject clazz, jstring activity, jint flags)
 {
@@ -196,6 +218,7 @@
     {"native_at_startActivity",  "(Ljava/lang/String;I)I", (void *)com_android_internal_app_ActivityTrigger_native_at_startActivity},
     {"native_at_resumeActivity", "(Ljava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_resumeActivity},
     {"native_at_deinit",         "()V",                   (void *)com_android_internal_app_ActivityTrigger_native_at_deinit},
+    {"native_at_startProcessActivity", "(Ljava/lang/String;I)V", (void *)com_android_internal_app_ActivityTrigger_native_at_startProcessActivity},
 };
 
 
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index dea913f..7e56424 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -233,11 +233,11 @@
     <string name="permgrouplab_contacts" msgid="3657758145679177612">"通讯录"</string>
     <string name="permgroupdesc_contacts" msgid="6951499528303668046">"使用您的通讯录"</string>
     <string name="permgrouplab_location" msgid="7275582855722310164">"位置信息"</string>
-    <string name="permgroupdesc_location" msgid="1346617465127855033">"使用此设备的位置信息"</string>
+    <string name="permgroupdesc_location" msgid="1346617465127855033">"获得设备所在位置信息"</string>
     <string name="permgrouplab_calendar" msgid="5863508437783683902">"日历"</string>
     <string name="permgroupdesc_calendar" msgid="3889615280211184106">"访问您的日历"</string>
     <string name="permgrouplab_sms" msgid="228308803364967808">"短信"</string>
-    <string name="permgroupdesc_sms" msgid="4656988620100940350">"发送和查看短信"</string>
+    <string name="permgroupdesc_sms" msgid="4656988620100940350">"短信"</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"存储空间"</string>
     <string name="permgroupdesc_storage" msgid="637758554581589203">"访问您设备上的照片、媒体内容和文件"</string>
     <string name="permgrouplab_microphone" msgid="171539900250043464">"麦克风"</string>
@@ -245,7 +245,7 @@
     <string name="permgrouplab_camera" msgid="4820372495894586615">"相机"</string>
     <string name="permgroupdesc_camera" msgid="3250611594678347720">"拍摄照片和录制视频"</string>
     <string name="permgrouplab_phone" msgid="5229115638567440675">"电话"</string>
-    <string name="permgroupdesc_phone" msgid="6234224354060641055">"拨打电话和管理通话"</string>
+    <string name="permgroupdesc_phone" msgid="6234224354060641055">"电话"</string>
     <string name="permgrouplab_sensors" msgid="416037179223226722">"身体传感器"</string>
     <string name="permgroupdesc_sensors" msgid="7147968539346634043">"访问与您的生命体征相关的传感器数据"</string>
     <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"检索窗口内容"</string>
@@ -276,7 +276,7 @@
     <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"允许应用读取您的设备收到的小区广播消息。小区广播消息是在某些地区发送的、用于发布紧急情况警告的提醒信息。恶意应用可能会在您收到小区紧急广播时干扰您设备的性能或操作。"</string>
     <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"读取订阅的供稿"</string>
     <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"允许应用获取有关当前同步的 Feed 的详情。"</string>
-    <string name="permlab_sendSms" msgid="7544599214260982981">"发送和查看短信"</string>
+    <string name="permlab_sendSms" msgid="7544599214260982981">"发送短信"</string>
     <string name="permdesc_sendSms" msgid="7094729298204937667">"允许该应用发送短信。此权限可能会导致意外收费。恶意应用可能会未经您的确认而发送短信,由此产生相关费用。"</string>
     <string name="permlab_readSms" msgid="8745086572213270480">"读取您的讯息(短信或彩信)"</string>
     <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"允许该应用读取您平板电脑或SIM卡上存储的短信。此权限可让该应用读取所有短信,而不考虑短信内容或机密性。"</string>
@@ -316,7 +316,7 @@
     <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"允许该应用读取您平板电脑上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定个人通信的频率。此权限可让应用保存您的联系人数据,而恶意应用可能会在您不知情的情况下分享联系人数据。"</string>
     <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"允许应用读取您的电视上存储的联系人相关数据,包括您与特定联系人通话、发送电子邮件或通过其他方式进行通信的频率。此权限可让应用保存您的联系人数据,而且恶意应用可能会在您不知情的情况下分享联系人数据。"</string>
     <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"允许该应用读取您手机上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定个人通信的频率。此权限可让应用保存您的联系人数据,而恶意应用可能会在您不知情的情况下分享联系人数据。"</string>
-    <string name="permlab_writeContacts" msgid="5107492086416793544">"修改您的通讯录"</string>
+    <string name="permlab_writeContacts" msgid="5107492086416793544">"修改/删除您的通讯录"</string>
     <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"允许该应用修改您平板电脑上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定联系人通信的频率。此权限可让应用删除联系人数据。"</string>
     <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"允许应用修改您的电视上存储的联系人相关数据,包括您与特定联系人通话、发送电子邮件或通过其他方式进行通信的频率。此权限可让应用删除联系人数据。"</string>
     <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"允许该应用修改您手机上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定联系人通信的频率。此权限可让应用删除联系人数据。"</string>
@@ -324,7 +324,7 @@
     <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"允许该应用读取平板电脑的通话记录,包括有关来电和外拨电话的数据。此权限可让应用保存您的通话记录数据,而恶意应用可能会在您不知情的情况下分享通话记录数据。"</string>
     <string name="permdesc_readCallLog" product="tv" msgid="5611770887047387926">"允许应用读取您的电视的通话记录,包括有关来电和外拨电话的数据。此权限可让应用保存您的通话记录数据,而恶意应用可能会在您不知情的情况下分享通话记录数据。"</string>
     <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"允许该应用读取手机的通话记录,包括有关来电和外拨电话的数据。此权限可让应用保存您的通话记录数据,而恶意应用可能会在您不知情的情况下分享通话记录数据。"</string>
-    <string name="permlab_writeCallLog" msgid="8552045664743499354">"写入通话记录"</string>
+    <string name="permlab_writeCallLog" msgid="8552045664743499354">"修改/删除通话记录"</string>
     <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"允许该应用修改平板电脑的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此清除或修改您的通话记录。"</string>
     <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"允许应用修改电视的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此清除或修改您的通话记录。"</string>
     <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"允许该应用修改手机的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此清除或修改您的通话记录。"</string>
@@ -356,7 +356,7 @@
     <string name="permdesc_vibrate" msgid="6284989245902300945">"允许应用控制振动器。"</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"控制闪光灯"</string>
     <string name="permdesc_flashlight" msgid="6522284794568368310">"允许应用控制闪光灯。"</string>
-    <string name="permlab_callPhone" msgid="3925836347681847954">"直接拨打电话号码"</string>
+    <string name="permlab_callPhone" msgid="3925836347681847954">"拨打电话"</string>
     <string name="permdesc_callPhone" msgid="3740797576113760827">"允许该应用在您未执行操作的情况下拨打电话号码。此权限可能会导致意外收费或呼叫。请注意,此权限不允许该应用拨打紧急电话号码。恶意应用可通过拨打电话产生相关费用,而无需您的确认。"</string>
     <string name="permlab_accessImsCallService" msgid="3574943847181793918">"使用即时通讯通话服务"</string>
     <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"允许应用自行使用即时通讯服务拨打电话。"</string>
@@ -394,13 +394,13 @@
     <string name="permdesc_changeTetherState" msgid="1524441344412319780">"允许应用更改绑定网络连接的状态。"</string>
     <string name="permlab_accessWifiState" msgid="5202012949247040011">"查看WLAN连接"</string>
     <string name="permdesc_accessWifiState" msgid="5002798077387803726">"允许该应用查看WLAN网络的相关信息,例如是否启用了WLAN以及连接的WLAN设备的名称。"</string>
-    <string name="permlab_changeWifiState" msgid="6550641188749128035">"连接WLAN网络和断开连接"</string>
+    <string name="permlab_changeWifiState" msgid="6550641188749128035">"打开WLAN"</string>
     <string name="permdesc_changeWifiState" msgid="7137950297386127533">"允许该应用与WLAN接入点建立和断开连接,以及更改WLAN网络的设备配置。"</string>
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"允许接收WLAN多播"</string>
     <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"允许该应用使用多播地址接收发送到WLAN网络上所有设备(而不仅仅是您的平板电脑)的数据包。该操作的耗电量比非多播模式要大。"</string>
     <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"允许应用使用多播地址接收发送到 WLAN 网络中所有设备(而不仅仅是您的电视)的数据包。该操作的耗电量比非多播模式要大。"</string>
     <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"允许该应用使用多播地址接收发送到WLAN网络上所有设备(而不仅仅是您的手机)的数据包。该操作的耗电量比非多播模式要大。"</string>
-    <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"访问蓝牙设置"</string>
+    <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"打开蓝牙"</string>
     <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"允许应用配置本地蓝牙平板电脑,并允许其查找远程设备且与之配对。"</string>
     <string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"允许应用配置本地蓝牙电视,并允许其查找远程设备且与之配对。"</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"允许应用配置本地蓝牙手机,并允许其查找远程设备且与之配对。"</string>
@@ -445,13 +445,13 @@
     <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"允许该应用修改某个帐户的同步设置。例如,此权限可用于在“联系人”应用与某个帐户之间启用同步。"</string>
     <string name="permlab_readSyncStats" msgid="7396577451360202448">"读取同步统计信息"</string>
     <string name="permdesc_readSyncStats" msgid="1510143761757606156">"允许该应用读取某个帐户的同步统计信息,包括同步活动历史记录和同步数据量。"</string>
-    <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"读取您的USB存储设备中的内容"</string>
+    <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"读取内部存储"</string>
     <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"读取您的SD卡中的内容"</string>
-    <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"允许应用读取您USB存储设备中的内容。"</string>
+    <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"允许应用读取存储设备。"</string>
     <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"允许应用读取您SD卡的内容。"</string>
-    <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"修改或删除您的USB存储设备中的内容"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"修改或删除内部存储"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"修改或删除您的SD卡中的内容"</string>
-    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"允许应用写入USB存储设备。"</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"允许应用写入存储设备。"</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"允许应用写入SD卡。"</string>
     <string name="permlab_use_sip" msgid="2052499390128979920">"拨打/接听SIP电话"</string>
     <string name="permdesc_use_sip" msgid="2297804849860225257">"允许该应用拨打和接听SIP电话。"</string>
@@ -1528,4 +1528,9 @@
     <string name="China_Mobile">中国移动</string>
     <string name="China_Unicom">中国联通</string>
     <string name="China_Telecom">中国电信</string>
+    <string name="other_permissions">其他权限</string>
+    <string name="permission_remember_choice">永远记住</string>
+    <string name="permission_title">权限</string>
+    <string name="allow_button">允许</string>
+    <string name="deny_button">拒绝</string>
 </resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 0d86374..1935b4c 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2427,4 +2427,10 @@
     <string name="config_rat_2g" translatable="false">2G</string>
     <string name="config_rat_3g" translatable="false">3G</string>
     <string name="config_rat_4g" translatable="false">4G</string>
+
+     <!-- Keypress Optimization -->
+    <bool name="config_enableKeypressOptimization">false</bool>
+    <integer-array name="keypress_param_value"/>
+
+    <bool name="config_enableDataSwitch">false</bool>
 </resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 25cee81..a9ddaa1 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2419,4 +2419,9 @@
   <java-symbol type="array" name="origin_carrier_names" />
   <java-symbol type="array" name="locale_carrier_names" />
 
+  <!-- keypress optimization -->
+  <java-symbol type="bool" name="config_enableKeypressOptimization" />
+  <java-symbol type="array" name="keypress_param_value" />
+
+  <java-symbol type="bool" name="config_enableDataSwitch" />
 </resources>
diff --git a/media/java/android/media/MediaFile.java b/media/java/android/media/MediaFile.java
index e91548c..c6de463 100644
--- a/media/java/android/media/MediaFile.java
+++ b/media/java/android/media/MediaFile.java
@@ -108,8 +108,9 @@
 
     // Drm file types
     public static final int FILE_TYPE_FL      = 51;
+    public static final int FILE_TYPE_SD      = 52;
     private static final int FIRST_DRM_FILE_TYPE = FILE_TYPE_FL;
-    private static final int LAST_DRM_FILE_TYPE = FILE_TYPE_FL;
+    private static final int LAST_DRM_FILE_TYPE = FILE_TYPE_SD;
 
     // Other popular file types
     public static final int FILE_TYPE_TEXT          = 100;
@@ -243,6 +244,7 @@
         addFileType("M3U8", FILE_TYPE_HTTPLIVE, "audio/x-mpegurl");
 
         addFileType("FL", FILE_TYPE_FL, "application/x-android-drm-fl");
+        addFileType("DCF", FILE_TYPE_SD, "application/vnd.oma.drm.content");
 
         addFileType("TXT", FILE_TYPE_TEXT, "text/plain", MtpConstants.FORMAT_TEXT);
         addFileType("HTM", FILE_TYPE_HTML, "text/html", MtpConstants.FORMAT_HTML);
diff --git a/packages/Keyguard/src/com/android/keyguard/CarrierText.java b/packages/Keyguard/src/com/android/keyguard/CarrierText.java
index 52a7c51..99c4035 100644
--- a/packages/Keyguard/src/com/android/keyguard/CarrierText.java
+++ b/packages/Keyguard/src/com/android/keyguard/CarrierText.java
@@ -66,6 +66,12 @@
         public void onStartedWakingUp() {
             setSelected(true);
         };
+
+        public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simState) {
+            if (getStatusForIccState(simState) == StatusMode.SimIoError) {
+                updateCarrierText();
+            }
+        };
     };
     /**
      * The status of this lock screen. Primarily used for widgets on LockScreen.
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java
index 1d10b57..04aaf72 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java
@@ -260,6 +260,7 @@
                                 KeyguardUpdateMonitor.getInstance(getContext())
                                         .reportSimUnlocked(mSubId);
                                 mRemainingAttempts = -1;
+                                mShowDefaultMessage = true;
                                 if (mCallback != null) {
                                     mCallback.dismiss(true);
                                 }
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 1ac9427..3033a60 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -124,6 +124,8 @@
 
     private Object mTag;
 
+    public boolean foundInScanResult = false;
+
     public AccessPoint(Context context, Bundle savedState) {
         mContext = context;
         mConfig = savedState.getParcelable(KEY_CONFIG);
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 4f51137..ed0371c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -319,7 +319,8 @@
                 if (config.selfAdded && config.numAssociation == 0) {
                     continue;
                 }
-                AccessPoint accessPoint = new AccessPoint(mContext, config);
+                AccessPoint accessPoint = getCachedOrCreate(config, cachedAccessPoints);
+                accessPoint.foundInScanResult = false;
                 if (mLastInfo != null && mLastNetworkInfo != null) {
                     if (config.isPasspoint() == false) {
                         accessPoint.update(connectionConfig, mLastInfo, mLastNetworkInfo);
@@ -352,6 +353,7 @@
                 boolean found = false;
                 for (AccessPoint accessPoint : apMap.getAll(result.SSID)) {
                     if (accessPoint.update(result)) {
+                        accessPoint.foundInScanResult = true;
                         found = true;
                         break;
                     }
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index ea3f8b7..dfb1766 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -62,6 +62,18 @@
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 >
+                <com.android.keyguard.CarrierText
+                    android:id="@+id/status_carrier_text"
+                    android:layout_width="wrap_content"
+                    android:layout_height="@dimen/match_parent"
+                    android:layout_marginStart="@dimen/keyguard_carrier_text_margin"
+                    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.StatusBarIconView android:id="@+id/moreIcon"
                     android:layout_width="@dimen/status_bar_icon_size"
                     android:layout_height="match_parent"
@@ -76,19 +88,6 @@
                     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/values/config.xml b/packages/SystemUI/res/values/config.xml
index d382080..fe664da 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -322,6 +322,9 @@
     <!-- Duration of the expansion animation in the volume dialog -->
     <item name="volume_expand_animation_duration" type="integer">300</item>
 
+    <!-- Whether or not to show operator name in Keyguard, true by Android original default -->
+    <bool name="config_showOperatorInKeyguard">true</bool>
+
     <!-- Whether or not to show battery level text. -->
     <bool name="config_showBatteryPercentage">false</bool>
 </resources>
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 055b5ef..9fb26a2 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -1497,7 +1497,9 @@
             // only play "unlock" noises if not on a call (since the incall UI
             // disables the keyguard)
             if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState)) {
-                playSounds(false);
+                if (mShowing && mDeviceInteractive) {
+                    playSounds(false);
+                }
             }
 
             setShowingLocked(false);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index 418fc92..ede0957 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -107,6 +107,8 @@
         boolean showBatteryLevel = getResources().getBoolean(R.bool.config_showBatteryPercentage);
         mBatteryLevel.setVisibility(
                 mBatteryCharging || showBatteryLevel ? View.VISIBLE : View.GONE);
+        boolean showCarrierText = getResources().getBoolean(R.bool.config_showOperatorInKeyguard);
+        mCarrierLabel.setVisibility(showCarrierText ? View.VISIBLE : View.GONE);
     }
 
     private void updateSystemIconsLayoutParams() {
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 1ae505f..d0bc802 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -1522,15 +1522,9 @@
         if (mContext.getResources().getBoolean(R.bool.enable_operator_name)
                 && mCarrierText != null) {
             if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
-                  mCarrierText.setVisibility(View.GONE);
+                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);
-                }
+                mCarrierText.setVisibility(View.VISIBLE);
             }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index fa9c4bb..4571e2b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -32,6 +32,7 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.provider.Settings;
 import android.provider.Settings.Global;
 import android.telecom.TelecomManager;
 import android.util.Log;
@@ -151,6 +152,9 @@
         // bluetooth status
         updateBluetooth();
 
+        //Update initial tty mode
+        updateTTYMode();
+
         // Alarm clock
         mService.setIcon(SLOT_ALARM_CLOCK, R.drawable.stat_sys_alarm, 0, null);
         mService.setIconVisibility(SLOT_ALARM_CLOCK, false);
@@ -326,6 +330,29 @@
         }
     }
 
+    private boolean isWiredHeadsetOn() {
+        AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        return audioManager.isWiredHeadsetOn();
+    }
+
+    private final void updateTTYMode() {
+        int ttyMode = Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.PREFERRED_TTY_MODE, TelecomManager.TTY_MODE_OFF);
+        boolean enabled = ttyMode != TelecomManager.TTY_MODE_OFF;
+        if (DEBUG) Log.v(TAG, "updateTTYMode: enabled: " + enabled);
+        if (enabled && isWiredHeadsetOn()) {
+            // TTY is on
+            if (DEBUG) Log.v(TAG, "updateTTYMode: set TTY on");
+            mService.setIcon(SLOT_TTY, R.drawable.stat_sys_tty_mode, 0,
+                    mContext.getString(R.string.accessibility_tty_enabled));
+            mService.setIconVisibility(SLOT_TTY, true);
+        } else {
+            // TTY is off
+            if (DEBUG) Log.v(TAG, "updateTTYMode: set TTY off");
+            mService.setIconVisibility(SLOT_TTY, false);
+        }
+    }
+
     private void updateCast() {
         boolean isCasting = false;
         for (CastDevice device : mCast.getCastDevices()) {
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 6d07a57..9c7773e 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -39,6 +39,7 @@
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlSerializer;
+import android.util.BoostFramework;
 
 import android.annotation.Nullable;
 import android.app.ActivityManagerNative;
@@ -417,6 +418,71 @@
      */
     boolean mIsInteractive = true;
 
+    class KeyboardDetect {
+        private BoostFramework mPerf = new BoostFramework();
+        private int keyboardState = 0;
+        private boolean enKeyOpt;
+        private int[] keyboardParams;
+
+        final int INACTIVE = 0;
+        final int FOREGROUND = 1;
+        final int BACKGROUND = 2;
+
+        synchronized void setKeyboardParams(Context context){
+             enKeyOpt = context.getResources().getBoolean(
+                com.android.internal.R.bool.config_enableKeypressOptimization);
+             if (enKeyOpt) {
+                keyboardParams = context.getResources().getIntArray(
+                   com.android.internal.R.array.keypress_param_value);
+             }
+             return;
+        }
+
+        synchronized void keyboardPerflockAcquire() {
+             if (mPerf != null) {
+                 try {
+                   if (keyboardParams == null)
+                      setKeyboardParams(mContext);
+                   if (keyboardParams != null) {
+                      mPerf.perfLockAcquire(0, keyboardParams);
+                      if (DEBUG) Slog.i(TAG, "Keyboard Perflock Acquired");
+                   }
+                 } catch (Exception e) {
+                     Slog.e(TAG, "Exception caught at perflock acquire", e);
+                     return;
+                 }
+             } else {
+                 Slog.e(TAG, "Perflock object null");
+                 return;
+             }
+        }
+
+        synchronized void keyboardPerflockRelease() {
+             if (mPerf != null) {
+                 try {
+                     mPerf.perfLockRelease();
+                     if (DEBUG) Slog.i(TAG, "Keyboard Perflock Released");
+                 } catch (Exception e) {
+                     Slog.e(TAG, "Exception caught at perflock release", e);
+                     return;
+                 }
+             } else {
+                 Slog.e(TAG, "Perflock object null");
+                 return;
+             }
+        }
+
+        synchronized int getKeyboardState() {
+             return keyboardState;
+        }
+
+        synchronized void setKeyboardState(int state) {
+             keyboardState = state;
+             if (DEBUG) Slog.i(TAG, "Keyboard state is " + keyboardState);
+        }
+    }
+    KeyboardDetect kb = new KeyboardDetect();
+
     int mCurUserActionNotificationSequenceNumber = 0;
 
     int mBackDisposition = InputMethodService.BACK_DISPOSITION_DEFAULT;
@@ -531,7 +597,21 @@
                             Intent.EXTRA_SETTING_NEW_VALUE);
                     restoreEnabledInputMethods(mContext, prevValue, newValue);
                 }
-            } else {
+            } else if (Intent.ACTION_SCREEN_ON.equals(action) && mIsInteractive) {
+                 /* Acquire perflock if display is turning on and soft input is active in background */
+                 if ((kb.getKeyboardState() == kb.BACKGROUND)) {
+                    kb.keyboardPerflockAcquire();
+                    kb.setKeyboardState(kb.FOREGROUND);
+                    if (DEBUG) Slog.i(TAG, "Keyboard in foreground");
+                 }
+             } else if (Intent.ACTION_SCREEN_OFF.equals(action) && !mIsInteractive) {
+                  /* Release perflock if soft input was visible when display about to go off */
+                  if ((kb.getKeyboardState() == kb.FOREGROUND)) {
+                    kb.keyboardPerflockRelease();
+                    kb.setKeyboardState(kb.BACKGROUND);
+                    if (DEBUG) Slog.i(TAG, "Keyboard in background");
+                  }
+             } else {
                 Slog.w(TAG, "Unexpected intent " + intent);
             }
         }
@@ -822,6 +902,8 @@
         broadcastFilter.addAction(Intent.ACTION_USER_ADDED);
         broadcastFilter.addAction(Intent.ACTION_USER_REMOVED);
         broadcastFilter.addAction(Intent.ACTION_SETTING_RESTORED);
+        broadcastFilter.addAction(Intent.ACTION_SCREEN_ON);
+        broadcastFilter.addAction(Intent.ACTION_SCREEN_OFF);
         mContext.registerReceiver(new ImmsBroadcastReceiver(), broadcastFilter);
 
         mNotificationShown = false;
@@ -2080,6 +2162,13 @@
                                 | Context.BIND_FOREGROUND_SERVICE);
                 mVisibleBound = true;
             }
+            /* Acquire perflock if - display is on, soft input is shown
+             * and perflock not yet acquired */
+            if (mIsInteractive && kb.getKeyboardState() == kb.INACTIVE) {
+               kb.keyboardPerflockAcquire();
+               kb.setKeyboardState(kb.FOREGROUND);
+               if (DEBUG) Slog.i(TAG, "Keyboard in foreground");
+            }
             res = true;
         } else if (mHaveConnection && SystemClock.uptimeMillis()
                 >= (mLastBindTime+TIME_TO_RECONNECT)) {
@@ -2178,6 +2267,23 @@
         mShowRequested = false;
         mShowExplicitlyRequested = false;
         mShowForced = false;
+       /* Release perflock if - display is on, soft input is hidden
+        * and perflock is still acquired */
+        if (mIsInteractive && kb.getKeyboardState() == kb.FOREGROUND) {
+            kb.keyboardPerflockRelease();
+            kb.setKeyboardState(kb.INACTIVE);
+            if (DEBUG) Slog.i(TAG, "Keyboard hidden by explicitly");
+        }
+       /* Change keyboard state - some apps can call hide input after
+        * SCREEN OFF intent, in which case if keyboard was in
+        * BACKGROUND state, it needs to be hidden so state has to
+        * change to INACTIVE. After display comes on, keyboard will
+        * not be visible in the app and perflock is in released state.
+        */
+        else if (!mIsInteractive && kb.getKeyboardState() == kb.BACKGROUND) {
+            kb.setKeyboardState(kb.INACTIVE);
+            if (DEBUG) Slog.i(TAG, "Keyboard hidden by implicitly");
+        }
         return res;
     }
 
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 3f2b17d..d8d9a60 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -82,6 +82,7 @@
 import com.android.internal.app.IVoiceInteractor;
 import com.android.internal.app.ProcessMap;
 import com.android.internal.app.ProcessStats;
+import com.android.internal.app.ActivityTrigger;
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.os.BatteryStatsImpl;
 import com.android.internal.os.IResultReceiver;
@@ -1395,6 +1396,8 @@
     static final int FIRST_COMPAT_MODE_MSG = 300;
     static final int FIRST_SUPERVISOR_STACK_MSG = 100;
 
+    static final ActivityTrigger mActivityTrigger = new ActivityTrigger();
+
     CompatModeDialog mCompatModeDialog;
     long mLastMemUsageReportTime = 0;
 
@@ -3467,6 +3470,9 @@
                 }
             }
             checkTime(startTime, "startProcess: done updating pids map");
+            if ("activity".equals(hostingType) || "service".equals(hostingType)) {
+                mActivityTrigger.activityStartProcessTrigger(app.processName, startResult.pid);
+            }
         } catch (RuntimeException e) {
             // XXX do better error recovery.
             app.setPid(0);
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index b37477d..901f13b 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -4930,7 +4930,7 @@
                         0,
                         null,
                         0);
-                delay = 1000;
+                delay = 700;
             }
         }
 
diff --git a/telephony/java/com/android/internal/telephony/IExtTelephony.aidl b/telephony/java/com/android/internal/telephony/IExtTelephony.aidl
index 063308d..f98a0d8 100644
--- a/telephony/java/com/android/internal/telephony/IExtTelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/IExtTelephony.aidl
@@ -116,4 +116,11 @@
     * @return phone id
     */
     int getPhoneIdForECall();
+
+    /**
+    * Check is FDN is enabled or not.
+    * @param - void
+    * @return true or false
+    */
+    boolean isFdnEnabled();
 }
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 0478fcc..c0685f3 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -184,6 +184,14 @@
     public static final int WIFI_STATE_UNKNOWN = 4;
 
     /**
+     * Wi-Fi is in failed state. This state will occur when load driver failed or start
+     * supplicant failed.
+     *
+     * @hide
+     */
+    public static final int WIFI_STATE_FAILED = 5;
+
+    /**
      * Broadcast intent action indicating that Wi-Fi AP has been enabled, disabled,
      * enabling, disabling, or failed.
      *