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.
*