Import translations. DO NOT MERGE am: c692ada956 -s ours am: fb1d0c31cd -s ours
am: 67c6c0f56e -s ours
* commit '67c6c0f56ee55cc506c541e68c76f6a246f640d3':
Import translations. DO NOT MERGE
diff --git a/Android.mk b/Android.mk
index 7b63072..c824fff 100644
--- a/Android.mk
+++ b/Android.mk
@@ -5,7 +5,7 @@
LOCAL_PRIVILEGED_MODULE := true
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
+LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_PACKAGE_NAME := TelephonyProvider
LOCAL_CERTIFICATE := platform
@@ -14,3 +14,5 @@
LOCAL_STATIC_JAVA_LIBRARIES += android-common
include $(BUILD_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ff8370d..256c347 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -4,9 +4,9 @@
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.
@@ -24,12 +24,19 @@
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
+ <!-- This permission is only used to send the ACTION_EXTERNAL_PROVIDER_CHANGE intent. -->
+ <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
+
<application android:process="com.android.phone"
android:allowClearUserData="false"
- android:allowBackup="false"
+ android:fullBackupOnly="true"
+ android:backupAgent="TelephonyBackupAgent"
+ android:restoreAnyVersion="true"
android:label="@string/app_label"
android:icon="@mipmap/ic_launcher_phone"
- android:usesCleartextTraffic="true">
+ android:usesCleartextTraffic="true"
+ android:forceDeviceEncrypted="true"
+ android:encryptionAware="true">
<provider android:name="TelephonyProvider"
android:authorities="telephony"
diff --git a/res/values-af/config.xml b/res/values-af/config.xml
index 965199f..99877a6 100644
--- a/res/values-af/config.xml
+++ b/res/values-af/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 038d1b5..fd621e1 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Mobielnetwerk-opstelling"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Foon-/boodskapsberging"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Foon- en boodskapberging"</string>
</resources>
diff --git a/res/values-am/config.xml b/res/values-am/config.xml
index 965199f..99877a6 100644
--- a/res/values-am/config.xml
+++ b/res/values-am/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 91ede52..115d70e 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"የተንቀሳቃሽ ስልክ አውታረመረብ ማዋቀር"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"የስልክ/መልዕክት ማከማቻ"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"የስልክ እና የመልዕክት መላላኪያ ማከማቻ"</string>
</resources>
diff --git a/res/values-ar/config.xml b/res/values-ar/config.xml
index 965199f..99877a6 100644
--- a/res/values-ar/config.xml
+++ b/res/values-ar/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 6ac890b..1c53b15 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"تهيئة شبكة الجوال"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"السعة التخزينية للهاتف/المراسلات"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"سعة تخزينية للهاتف والرسائل"</string>
</resources>
diff --git a/res/values-az-rAZ/config.xml b/res/values-az-rAZ/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-az-rAZ/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string-array name="persist_apns_for_plmn">
+ <item msgid="6413072509259000954">"20404"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
+ </string-array>
+</resources>
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml
index 7a83a42..22cf902 100644
--- a/res/values-az-rAZ/strings.xml
+++ b/res/values-az-rAZ/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Mobil Şəbəkə Konfiqurasiyası"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefon/Mesajlaşma Yaddaşı"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Telefon və Mesajlaşma Yaddaşı"</string>
</resources>
diff --git a/res/values-b+sr+Latn/config.xml b/res/values-b+sr+Latn/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-b+sr+Latn/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string-array name="persist_apns_for_plmn">
+ <item msgid="6413072509259000954">"20404"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
+ </string-array>
+</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..08aa014
--- /dev/null
+++ b/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2008 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" product="tablet" msgid="9194799012395299737">"Konfiguracija mobilne mreže"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Memorija telefona i poruka"</string>
+</resources>
diff --git a/res/values-bg/config.xml b/res/values-bg/config.xml
index 965199f..99877a6 100644
--- a/res/values-bg/config.xml
+++ b/res/values-bg/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 646d4f1..40b755c 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Конфигурация на мобилната мрежа"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Хранилище: тел./съобщ."</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Хранил. за тел. и съобщ."</string>
</resources>
diff --git a/res/values-bn-rBD/config.xml b/res/values-bn-rBD/config.xml
index 2cdeb55..a0f404f 100644
--- a/res/values-bn-rBD/config.xml
+++ b/res/values-bn-rBD/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"২০৪০৪"</item>
- <item msgid="6382338691947744378">"৩১০১২০"</item>
- <item msgid="1479229073702631561">"৩১১৪৮০"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index 04fa2d8..5d6d556 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"মোবাইল নেটওয়ার্ক কনফিগারেশন"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"ফোন/বার্তা প্রেরণের সঞ্চয়স্থান"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ফোন এবং বার্তাপ্রেরণের সঞ্চয়স্থান"</string>
</resources>
diff --git a/res/values-ca/config.xml b/res/values-ca/config.xml
index 965199f..99877a6 100644
--- a/res/values-ca/config.xml
+++ b/res/values-ca/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 577bdf9..ec43c5c 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configuració de la xarxa mòbil"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Emmagatz. telèfon/missat."</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Emmagatz. telèfon/missat."</string>
</resources>
diff --git a/res/values-cs/config.xml b/res/values-cs/config.xml
index 965199f..99877a6 100644
--- a/res/values-cs/config.xml
+++ b/res/values-cs/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index c402cbf..3a4e053 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfigurace mobilní sítě"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefon a úložiště zpráv"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Telefon a úložiště zpráv"</string>
</resources>
diff --git a/res/values-da/config.xml b/res/values-da/config.xml
index 965199f..99877a6 100644
--- a/res/values-da/config.xml
+++ b/res/values-da/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 0586492..abffe9f 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfiguration af mobilnetværk"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefon- og beskedlager"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Telefon- og beskedlager"</string>
</resources>
diff --git a/res/values-de/config.xml b/res/values-de/config.xml
index 965199f..99877a6 100644
--- a/res/values-de/config.xml
+++ b/res/values-de/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index febd17c..27a576e 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfiguration des Mobilfunknetzes"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefon-/SMS-Speicher"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Telefon- und SMS-Speicher"</string>
</resources>
diff --git a/res/values-el/config.xml b/res/values-el/config.xml
index 965199f..99877a6 100644
--- a/res/values-el/config.xml
+++ b/res/values-el/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index fd0c903..b2489e8 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Ρύθμιση δικτύου κιν. τηλεφωνίας"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Αποθ. τηλ./μηνυμ."</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Αποθ. χώρος τηλεφ./μηνυμ."</string>
</resources>
diff --git a/res/values-en-rAU/config.xml b/res/values-en-rAU/config.xml
index 965199f..99877a6 100644
--- a/res/values-en-rAU/config.xml
+++ b/res/values-en-rAU/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 5252756..f11997b 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Mobile Network Configuration"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Phone/Messaging Storage"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Phone and Messaging Storage"</string>
</resources>
diff --git a/res/values-en-rGB/config.xml b/res/values-en-rGB/config.xml
index 965199f..99877a6 100644
--- a/res/values-en-rGB/config.xml
+++ b/res/values-en-rGB/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 5252756..f11997b 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Mobile Network Configuration"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Phone/Messaging Storage"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Phone and Messaging Storage"</string>
</resources>
diff --git a/res/values-en-rIN/config.xml b/res/values-en-rIN/config.xml
index 965199f..99877a6 100644
--- a/res/values-en-rIN/config.xml
+++ b/res/values-en-rIN/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 5252756..f11997b 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Mobile Network Configuration"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Phone/Messaging Storage"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Phone and Messaging Storage"</string>
</resources>
diff --git a/res/values-es-rUS/config.xml b/res/values-es-rUS/config.xml
index 965199f..99877a6 100644
--- a/res/values-es-rUS/config.xml
+++ b/res/values-es-rUS/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 6a5ac9a..3460450 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configuración de la red móvil"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Teléfono/Almacenamiento de mensajes"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Alm. mensajes y teléfono"</string>
</resources>
diff --git a/res/values-es/config.xml b/res/values-es/config.xml
index 965199f..99877a6 100644
--- a/res/values-es/config.xml
+++ b/res/values-es/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 18515a8..865f254 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configuración de red móvil"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Almacenamiento teléfono/mensajes"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Almac. Mensajes/Teléfono"</string>
</resources>
diff --git a/res/values-et-rEE/config.xml b/res/values-et-rEE/config.xml
index 965199f..99877a6 100644
--- a/res/values-et-rEE/config.xml
+++ b/res/values-et-rEE/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index d0b4936..4e92634 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Mobiilsidevõrgu konfigureerimine"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefoni/sõnumite salvestamine"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Kõnede ja sõnumite salv."</string>
</resources>
diff --git a/res/values-eu-rES/config.xml b/res/values-eu-rES/config.xml
index 965199f..99877a6 100644
--- a/res/values-eu-rES/config.xml
+++ b/res/values-eu-rES/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index f763008..ff1af4f 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Sare mugikorraren konfigurazioa"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefono- / Mezu-biltegia"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Operadorea eta mezuak"</string>
</resources>
diff --git a/res/values-fa/config.xml b/res/values-fa/config.xml
index a6e1687..8c2d094 100644
--- a/res/values-fa/config.xml
+++ b/res/values-fa/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"۲۰۴۰۴"</item>
- <item msgid="6382338691947744378">"۳۱۰۱۲۰"</item>
- <item msgid="1479229073702631561">"۳۱۱۴۸۰"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 87e5239..c587129 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"پیکربندی شبکهٔ تلفن همراه"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"حافظه تلفن/پیام رسانی"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"فضای ذخیره تلفن و پیامرسانی"</string>
</resources>
diff --git a/res/values-fi/config.xml b/res/values-fi/config.xml
index 965199f..99877a6 100644
--- a/res/values-fi/config.xml
+++ b/res/values-fi/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 35f6b61..8478884 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Matkapuhelinverkon määritykset"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Puhelimen/viestien tallennustila"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Puhelimen ja viestien tallennustila"</string>
</resources>
diff --git a/res/values-fr-rCA/config.xml b/res/values-fr-rCA/config.xml
index 965199f..99877a6 100644
--- a/res/values-fr-rCA/config.xml
+++ b/res/values-fr-rCA/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index bb9f974..862bb32 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configuration du réseau mobile"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Stockage téléphone+SMS/MMS"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Stockage tél. et messages"</string>
</resources>
diff --git a/res/values-fr/config.xml b/res/values-fr/config.xml
index 965199f..99877a6 100644
--- a/res/values-fr/config.xml
+++ b/res/values-fr/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index bb9f974..6cfcdfb 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configuration du réseau mobile"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Stockage téléphone+SMS/MMS"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Stockage tél. et SMS/MMS"</string>
</resources>
diff --git a/res/values-gl-rES/config.xml b/res/values-gl-rES/config.xml
index 965199f..99877a6 100644
--- a/res/values-gl-rES/config.xml
+++ b/res/values-gl-rES/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 6869a6e..317b3fb 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configuración da rede móbil"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Almacenam. tfno./mensaxe"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Almacenamento tel. e mens."</string>
</resources>
diff --git a/res/values-gu-rIN/config.xml b/res/values-gu-rIN/config.xml
index 965199f..99877a6 100644
--- a/res/values-gu-rIN/config.xml
+++ b/res/values-gu-rIN/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml
index 6dc1083..c35331d 100644
--- a/res/values-gu-rIN/strings.xml
+++ b/res/values-gu-rIN/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"મોબાઇલ નેટવર્ક ગોઠવણી"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"ફોન/મેસેજિંગ સંગ્રહ"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ફોન/મેસેજિંગ સંગ્રહ"</string>
</resources>
diff --git a/res/values-hi/config.xml b/res/values-hi/config.xml
index 965199f..99877a6 100644
--- a/res/values-hi/config.xml
+++ b/res/values-hi/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 4eedae0..34bb06b 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"मोबाइल नेटवर्क कॉन्फ़िगरेशन"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"फ़ोन/संदेश मेमोरी"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"फ़ोन और संदेश सेवा मेमोरी"</string>
</resources>
diff --git a/res/values-hr/config.xml b/res/values-hr/config.xml
index 965199f..99877a6 100644
--- a/res/values-hr/config.xml
+++ b/res/values-hr/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index e5a90dc..c65b5ec 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfiguracija mobilne mreže"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Pohrana za telefon/poruke"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Pohrana za telefon/poruke"</string>
</resources>
diff --git a/res/values-hu/config.xml b/res/values-hu/config.xml
index 965199f..99877a6 100644
--- a/res/values-hu/config.xml
+++ b/res/values-hu/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 0a04a79..f82c03b 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Mobilhálózat konfigurációja"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefonos/üzenet-tárhely"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Telefon- és üzenettár"</string>
</resources>
diff --git a/res/values-hy-rAM/config.xml b/res/values-hy-rAM/config.xml
index 965199f..99877a6 100644
--- a/res/values-hy-rAM/config.xml
+++ b/res/values-hy-rAM/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 5a29628..b3a5b20 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Բջջային ցանցի կարգավորում"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Հեռախոսի/հաղորդակցման պահոց"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Հեռախոսի և հաղորդակցումների հիշողություն"</string>
</resources>
diff --git a/res/values-in/config.xml b/res/values-in/config.xml
index 965199f..99877a6 100644
--- a/res/values-in/config.xml
+++ b/res/values-in/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index c67fa84..129a3da 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfigurasi Jaringan Seluler"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Penyimpanan Ponsel/Pesan"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Penyimpanan Ponsel dan Pesan"</string>
</resources>
diff --git a/res/values-is-rIS/config.xml b/res/values-is-rIS/config.xml
index 965199f..99877a6 100644
--- a/res/values-is-rIS/config.xml
+++ b/res/values-is-rIS/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index c0c04fe..b96a7ff 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Grunnstilling farsímakerfis"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Geymsla síma/skilaboða"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Geymsla síma og skilaboða"</string>
</resources>
diff --git a/res/values-it/config.xml b/res/values-it/config.xml
index 965199f..99877a6 100644
--- a/res/values-it/config.xml
+++ b/res/values-it/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 5d8d2d0..9802433 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configurazione rete mobile"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Archivio telefono/messaggi"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Memoria telefono/messaggi"</string>
</resources>
diff --git a/res/values-iw/config.xml b/res/values-iw/config.xml
index 965199f..99877a6 100644
--- a/res/values-iw/config.xml
+++ b/res/values-iw/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index b5aa2bb..6d2ef10 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"תצורת רשת לנייד"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"אחסון טלפון/הודעות"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"טלפון ואחסון הודעות"</string>
</resources>
diff --git a/res/values-ja/config.xml b/res/values-ja/config.xml
index 965199f..99877a6 100644
--- a/res/values-ja/config.xml
+++ b/res/values-ja/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index ee1a8e5..c9b80f4 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"モバイルネットワークの設定"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"電話/SMS用ストレージ"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"電話とSMS用ストレージ"</string>
</resources>
diff --git a/res/values-ka-rGE/config.xml b/res/values-ka-rGE/config.xml
index 965199f..99877a6 100644
--- a/res/values-ka-rGE/config.xml
+++ b/res/values-ka-rGE/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index e26d329..fa84173 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"მობილური ქსელის კონფიგურაცია"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"ტელეფონის/შეტყობინებების საცავი"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ტელ. & შეტყობ. მეხსიერება"</string>
</resources>
diff --git a/res/values-kk-rKZ/config.xml b/res/values-kk-rKZ/config.xml
index 965199f..99877a6 100644
--- a/res/values-kk-rKZ/config.xml
+++ b/res/values-kk-rKZ/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 56176f3..a0cb308 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Ұялы Желі Конфигурациясы"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Телефон/Хабар жіберу жады"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Телефон және хабар алмасу қоймасы"</string>
</resources>
diff --git a/res/values-km-rKH/config.xml b/res/values-km-rKH/config.xml
index 965199f..99877a6 100644
--- a/res/values-km-rKH/config.xml
+++ b/res/values-km-rKH/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 5ca6f61..c0e65ea 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"ការកំណត់រចនាសម្ព័ន្ធបណ្ដាញទូរស័ព្ទចល័ត"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"ឧបករណ៍ផ្ទុក ទូរស័ព្ទ/ការផ្ញើសារ"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ឧបករណ៍ផ្ទុកទូរស័ព្ទ និងសារ"</string>
</resources>
diff --git a/res/values-kn-rIN/config.xml b/res/values-kn-rIN/config.xml
index 965199f..99877a6 100644
--- a/res/values-kn-rIN/config.xml
+++ b/res/values-kn-rIN/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 84a9963..87e43b4 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"ಫೋನ್/ಸಂದೇಶಿಸುವಿಕೆ ಸಂಗ್ರಹಣೆ"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ಫೋನ್ ಮತ್ತು ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ ಸಂಗ್ರಹಣೆ"</string>
</resources>
diff --git a/res/values-ko/config.xml b/res/values-ko/config.xml
index 965199f..99877a6 100644
--- a/res/values-ko/config.xml
+++ b/res/values-ko/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index ccd9a51..9e0799b 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"모바일 네트워크 구성"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"휴대전화/메시지 저장공간"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"전화 및 메시지 저장소"</string>
</resources>
diff --git a/res/values-ky-rKG/config.xml b/res/values-ky-rKG/config.xml
index 965199f..99877a6 100644
--- a/res/values-ky-rKG/config.xml
+++ b/res/values-ky-rKG/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
new file mode 100644
index 0000000..4383ad3
--- /dev/null
+++ b/res/values-ky-rKG/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2008 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" product="tablet" msgid="9194799012395299737">"Мобилдик тармактын конфигурациясы"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Телфн ж-а SMS/MMS сактгч"</string>
+</resources>
diff --git a/res/values-lo-rLA/config.xml b/res/values-lo-rLA/config.xml
index 965199f..99877a6 100644
--- a/res/values-lo-rLA/config.xml
+++ b/res/values-lo-rLA/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index 9929161..80db46b 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"ການຕັ້ງຄ່າເຄືອຂ່າຍມືຖື"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"ບ່ອນເກັບຂໍ້ມູນໂທລະສັບ/ຂໍ້ຄວາມ"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ບ່ອນເກັບຂໍ້ມູນໃນໂທລະສັບ ແລະ ຂໍ້ຄວາມ"</string>
</resources>
diff --git a/res/values-lt/config.xml b/res/values-lt/config.xml
index 965199f..99877a6 100644
--- a/res/values-lt/config.xml
+++ b/res/values-lt/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 3c26fdb..f9091a3 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Tinklo mobiliesiems konfigūracija"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefono / pranešimų saugykla"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Telef. ir susir. saugykla"</string>
</resources>
diff --git a/res/values-lv/config.xml b/res/values-lv/config.xml
index 965199f..99877a6 100644
--- a/res/values-lv/config.xml
+++ b/res/values-lv/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 8518f3c..fc64c44 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Mobilā tīkla konfigurācija"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Tālr./ziņojumapm. krāt."</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Tālruņa un īsziņu krātuve"</string>
</resources>
diff --git a/res/values-mk-rMK/config.xml b/res/values-mk-rMK/config.xml
index 965199f..99877a6 100644
--- a/res/values-mk-rMK/config.xml
+++ b/res/values-mk-rMK/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index 2c1fd15..e1e6246 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Конфигурација на мобилна мрежа"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Меморија на телефон/пораки"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Меморија за телефонот и пораките"</string>
</resources>
diff --git a/res/values-ml-rIN/config.xml b/res/values-ml-rIN/config.xml
index 965199f..99877a6 100644
--- a/res/values-ml-rIN/config.xml
+++ b/res/values-ml-rIN/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index 8849a0c..609d40e 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"മൊബൈൽ നെറ്റ്വർക്ക് കോൺഫിഗറേഷൻ"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"ഫോൺ/സന്ദേശ സംഭരണം"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ഫോൺ, സന്ദേശമയക്കൽ സ്റ്റോറേജ്"</string>
</resources>
diff --git a/res/values-mn-rMN/config.xml b/res/values-mn-rMN/config.xml
index 965199f..99877a6 100644
--- a/res/values-mn-rMN/config.xml
+++ b/res/values-mn-rMN/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index adab8c5..1c1c927 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Мобайль Сүлжээний Тохируулга"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Утас/Зурвасын Сан"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Гар утас болон Зурвасын Санах ой"</string>
</resources>
diff --git a/res/values-mr-rIN/config.xml b/res/values-mr-rIN/config.xml
index 965199f..99877a6 100644
--- a/res/values-mr-rIN/config.xml
+++ b/res/values-mr-rIN/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index a354afc..2e2788d 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"मोबाइल नेटवर्क कॉन्फिगरेशन"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"फोन/संदेशन संचयन"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"फोन आणि संदेशन संचयन"</string>
</resources>
diff --git a/res/values-ms-rMY/config.xml b/res/values-ms-rMY/config.xml
index 965199f..99877a6 100644
--- a/res/values-ms-rMY/config.xml
+++ b/res/values-ms-rMY/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 45771ae..fdc24c7 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfigurasi Rangkaian Mudah Alih"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Storan Telefon/Pemesejan"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Storan Telefon & Pemesejn"</string>
</resources>
diff --git a/res/values-my-rMM/config.xml b/res/values-my-rMM/config.xml
index 965199f..99877a6 100644
--- a/res/values-my-rMM/config.xml
+++ b/res/values-my-rMM/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index fe6f377..e161f81 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"မိုဘိုင်း ကွန်ရက် အစီအစဉ်"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"ဖုန်း/စာပို့ခြင်း သိုလှောင်မှု"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ဖုန်းနှင့် စာပို့ခြင်း သိုလှောင်မှု"</string>
</resources>
diff --git a/res/values-nb/config.xml b/res/values-nb/config.xml
index 965199f..99877a6 100644
--- a/res/values-nb/config.xml
+++ b/res/values-nb/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index f74bc5d..bb28ae0 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfigurasjon av mobilnettverk"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Lagring for telefon/mld."</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Lagring for telefon og meldinger"</string>
</resources>
diff --git a/res/values-ne-rNP/config.xml b/res/values-ne-rNP/config.xml
index 8056af1..629af9c 100644
--- a/res/values-ne-rNP/config.xml
+++ b/res/values-ne-rNP/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"२०४०४"</item>
- <item msgid="6382338691947744378">"३१०१२०"</item>
- <item msgid="1479229073702631561">"३११४८०"</item>
+ <item msgid="5639159280778239123">"३१०००४"</item>
+ <item msgid="3860605521380788028">"३१०१२०"</item>
+ <item msgid="537693705785480198">"३११४८०"</item>
</string-array>
</resources>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index bf5b2b6..131d31a 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"मोबाइल नेटवर्क कन्फिगरेसन"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"फोन/सन्देश भण्डारण"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"फोन र सन्देश प्रवाह भण्डारण"</string>
</resources>
diff --git a/res/values-nl/config.xml b/res/values-nl/config.xml
index 965199f..99877a6 100644
--- a/res/values-nl/config.xml
+++ b/res/values-nl/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index ff7e2c5..041984f 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configuratie mobiel netwerk"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Opslag voor telefoon/berichten"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Opslag telefoon/berichten"</string>
</resources>
diff --git a/res/values-pa-rIN/config.xml b/res/values-pa-rIN/config.xml
index 965199f..99877a6 100644
--- a/res/values-pa-rIN/config.xml
+++ b/res/values-pa-rIN/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml
index e499a0a..2c063bc 100644
--- a/res/values-pa-rIN/strings.xml
+++ b/res/values-pa-rIN/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"ਮੋਬਾਈਲ ਨੈਟਵਰਕ ਕੌਂਫਿਗਰੇਸ਼ਨ"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"ਫੋਨ/ਮੈਸੇਜ਼ਿੰਗ ਸਟੋਰੇਜ"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ਫ਼ੋਨ ਅਤੇ ਮੈਸੇਜ਼ਿਗ ਸਟੋਰੇਜ"</string>
</resources>
diff --git a/res/values-pl/config.xml b/res/values-pl/config.xml
index 965199f..99877a6 100644
--- a/res/values-pl/config.xml
+++ b/res/values-pl/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 9c7c158..29ac057 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfiguracja sieci komórkowej"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefon/Pamięć wiadomości"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Pamięć telefonu i SMS-ów"</string>
</resources>
diff --git a/res/values-pt-rPT/config.xml b/res/values-pt-rPT/config.xml
index 965199f..99877a6 100644
--- a/res/values-pt-rPT/config.xml
+++ b/res/values-pt-rPT/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 35e728a..3ccf200 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configuração de rede móvel"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telef./armaz. de mensag."</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Tel. e armaz. de mensag."</string>
</resources>
diff --git a/res/values-pt/config.xml b/res/values-pt/config.xml
index 965199f..99877a6 100644
--- a/res/values-pt/config.xml
+++ b/res/values-pt/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index a581be6..713e580 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configuração da rede móvel"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Armazenamento de mensagens/telefone"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Armazenamento de mensagens/smartphone"</string>
</resources>
diff --git a/res/values-ro/config.xml b/res/values-ro/config.xml
index 965199f..99877a6 100644
--- a/res/values-ro/config.xml
+++ b/res/values-ro/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index a54811d..a2c590c 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -16,6 +16,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" product="tablet" msgid="9194799012395299737">"Configuraţia reţelei de telefonie mobilă"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Stocare telefon/mesaje"</string>
+ <string name="app_label" product="tablet" msgid="9194799012395299737">"Configurația reţelei de telefonie mobilă"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Stocare Telefon/Mesagerie"</string>
</resources>
diff --git a/res/values-ru/config.xml b/res/values-ru/config.xml
index 965199f..99877a6 100644
--- a/res/values-ru/config.xml
+++ b/res/values-ru/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 4bd8bc7..78e8670 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Настройки мобильной сети"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Память номеров/SMS/MMS"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Память – звонки и SMS/MMS"</string>
</resources>
diff --git a/res/values-si-rLK/config.xml b/res/values-si-rLK/config.xml
index 965199f..99877a6 100644
--- a/res/values-si-rLK/config.xml
+++ b/res/values-si-rLK/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 64d17b9..47ab731 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"ජංගම ජාල වින්යාස කිරීම"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"දුරකථන/පණිවිඩ යැවීමේ ආචයනය"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"දුරකථන හා පණිවිඩ ආචයනය"</string>
</resources>
diff --git a/res/values-sk/config.xml b/res/values-sk/config.xml
index 965199f..99877a6 100644
--- a/res/values-sk/config.xml
+++ b/res/values-sk/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 9b3a34a..65e91df 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfigurácia mobilnej siete"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefón / Ukladací priestor SMS"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Telefón a úložisko správ"</string>
</resources>
diff --git a/res/values-sl/config.xml b/res/values-sl/config.xml
index 965199f..99877a6 100644
--- a/res/values-sl/config.xml
+++ b/res/values-sl/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index c2971ea..35892ee 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Nastavitev mobilnega omrežja"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefon/pomnilnik za sporočila"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Shramba za telefon in sporočila"</string>
</resources>
diff --git a/res/values-sq-rAL/config.xml b/res/values-sq-rAL/config.xml
index 965199f..99877a6 100644
--- a/res/values-sq-rAL/config.xml
+++ b/res/values-sq-rAL/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml
index 17cf91d..dc23237 100644
--- a/res/values-sq-rAL/strings.xml
+++ b/res/values-sq-rAL/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfigurimi i rrjetit celular"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Hapësira ruajtëse e telefonit/mesazheve"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Hapësira ruajtëse e telefonit dhe mesazheve"</string>
</resources>
diff --git a/res/values-sr/config.xml b/res/values-sr/config.xml
index 965199f..99877a6 100644
--- a/res/values-sr/config.xml
+++ b/res/values-sr/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index ce1e035..e5cd5b9 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Конфигурација мобилне мреже"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Меморија телефона/порука"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Меморија телефона и порука"</string>
</resources>
diff --git a/res/values-sv/config.xml b/res/values-sv/config.xml
index 965199f..99877a6 100644
--- a/res/values-sv/config.xml
+++ b/res/values-sv/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 29c7de0..da530b3 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Konfiguration av mobilt nätverk"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefon-/meddelandelagr."</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Telefon-/meddelandelagr."</string>
</resources>
diff --git a/res/values-sw/config.xml b/res/values-sw/config.xml
index 965199f..99877a6 100644
--- a/res/values-sw/config.xml
+++ b/res/values-sw/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 772a496..97319a2 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Usanidi wa Mtandao wa Simu"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Simu/Hifadhi ya ujumbe"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Hifadhi ya Simu na Ujumbe"</string>
</resources>
diff --git a/res/values-ta-rIN/config.xml b/res/values-ta-rIN/config.xml
index 965199f..99877a6 100644
--- a/res/values-ta-rIN/config.xml
+++ b/res/values-ta-rIN/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index febf75f..b280259 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"மொபைல் நெட்வொர்க் உள்ளமைவு"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"மொபைல்/செய்தியிடலுக்கான சேமிப்பிடம்"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"போன் & செய்தி சேமிப்பிடம்"</string>
</resources>
diff --git a/res/values-te-rIN/config.xml b/res/values-te-rIN/config.xml
index 965199f..99877a6 100644
--- a/res/values-te-rIN/config.xml
+++ b/res/values-te-rIN/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index cea0749..0bbaa47 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"మొబైల్ నెట్వర్క్ కాన్ఫిగరేషన్"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"ఫోన్/సందేశ నిల్వ"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ఫోన్ మరియు సందేశ నిల్వ"</string>
</resources>
diff --git a/res/values-th/config.xml b/res/values-th/config.xml
index 965199f..99877a6 100644
--- a/res/values-th/config.xml
+++ b/res/values-th/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index eb804b2..97c6dc0 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"การกำหนดค่าเครือข่ายมือถือ"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"โทรศัพท์/ที่เก็บข้อความ"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"ที่จัดเก็บของโทรศัพท์/ข้อความ"</string>
</resources>
diff --git a/res/values-tl/config.xml b/res/values-tl/config.xml
index 965199f..99877a6 100644
--- a/res/values-tl/config.xml
+++ b/res/values-tl/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index c2e81a7..544721c 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Configuration ng Network ng Mobile"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Imbakan ng Telepono/Pagpapadala ng mensahe"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Storage Tel. at Messaging"</string>
</resources>
diff --git a/res/values-tr/config.xml b/res/values-tr/config.xml
index 965199f..99877a6 100644
--- a/res/values-tr/config.xml
+++ b/res/values-tr/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 5d385a2..164460b 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Mobil Ağ Yapılandırması"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Tlf/Mesajlaşma Deplm Brm"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Telefon ve Mesajlaşma Depolama Alanı"</string>
</resources>
diff --git a/res/values-uk/config.xml b/res/values-uk/config.xml
index 965199f..99877a6 100644
--- a/res/values-uk/config.xml
+++ b/res/values-uk/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index ea0392d..34cf5aa 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Налаштування мобільної мережі"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Пам’ять телеф./повідомл."</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Пам’ять телефона"</string>
</resources>
diff --git a/res/values-ur-rPK/config.xml b/res/values-ur-rPK/config.xml
index 965199f..99877a6 100644
--- a/res/values-ur-rPK/config.xml
+++ b/res/values-ur-rPK/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index d5d82e4..f1e21c7 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"موبائل نیٹ ورک کنفیگریشن"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"فون/پیغام رسانی اسٹوریج"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"فون اور پیغام رسانی اسٹوریج"</string>
</resources>
diff --git a/res/values-uz-rUZ/config.xml b/res/values-uz-rUZ/config.xml
index 965199f..99877a6 100644
--- a/res/values-uz-rUZ/config.xml
+++ b/res/values-uz-rUZ/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index b006ba8..279bab8 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Uyali tarmoqni moslash"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Telefon/Xabar xotirasi"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Xotira – telefon va SMS/MMS"</string>
</resources>
diff --git a/res/values-vi/config.xml b/res/values-vi/config.xml
index 965199f..99877a6 100644
--- a/res/values-vi/config.xml
+++ b/res/values-vi/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 62e2270..9865c8c 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Cấu hình mạng điện thoại di động"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Bộ nhớ điện thoại/tin nhắn"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Bộ nhớ đ.thoại+tin nhắn"</string>
</resources>
diff --git a/res/values-zh-rCN/config.xml b/res/values-zh-rCN/config.xml
index 965199f..99877a6 100644
--- a/res/values-zh-rCN/config.xml
+++ b/res/values-zh-rCN/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 24545e5..f9f5c27 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"移动网络配置"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"电话/短信存储"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"电话和短信存储"</string>
</resources>
diff --git a/res/values-zh-rHK/config.xml b/res/values-zh-rHK/config.xml
index 965199f..99877a6 100644
--- a/res/values-zh-rHK/config.xml
+++ b/res/values-zh-rHK/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 4881e17..fc96850 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"流動網絡設定"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"手機/簡訊儲存裝置"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"手機及短訊儲存服務"</string>
</resources>
diff --git a/res/values-zh-rTW/config.xml b/res/values-zh-rTW/config.xml
index 965199f..99877a6 100644
--- a/res/values-zh-rTW/config.xml
+++ b/res/values-zh-rTW/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index edb352f..7cbc2c7 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"行動網路設定"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"手機/簡訊儲存裝置"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"電話和簡訊儲存服務"</string>
</resources>
diff --git a/res/values-zu/config.xml b/res/values-zu/config.xml
index 965199f..99877a6 100644
--- a/res/values-zu/config.xml
+++ b/res/values-zu/config.xml
@@ -3,7 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="persist_apns_for_plmn">
<item msgid="6413072509259000954">"20404"</item>
- <item msgid="6382338691947744378">"310120"</item>
- <item msgid="1479229073702631561">"311480"</item>
+ <item msgid="5639159280778239123">"310004"</item>
+ <item msgid="3860605521380788028">"310120"</item>
+ <item msgid="537693705785480198">"311480"</item>
</string-array>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 702e971..e571505 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" product="tablet" msgid="9194799012395299737">"Ukucushwa Kohleloxhumano Lweselula"</string>
- <string name="app_label" product="default" msgid="4282451239358791628">"Ifoni/Isigcini Somlayezo"</string>
+ <string name="app_label" product="default" msgid="8338087656149558019">"Isitoreji sefoni nokulayeza"</string>
</resources>
diff --git a/src/com/android/providers/telephony/MmsProvider.java b/src/com/android/providers/telephony/MmsProvider.java
index bd31cc1..515ecad 100644
--- a/src/com/android/providers/telephony/MmsProvider.java
+++ b/src/com/android/providers/telephony/MmsProvider.java
@@ -547,7 +547,7 @@
}
if (notify) {
- notifyChange();
+ notifyChange(res);
}
return res;
}
@@ -643,7 +643,7 @@
}
if ((deletedRows > 0) && notify) {
- notifyChange();
+ notifyChange(uri);
}
return deletedRows;
}
@@ -816,7 +816,7 @@
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int count = db.update(table, finalValues, finalSelection, selectionArgs);
if (notify && (count > 0)) {
- notifyChange();
+ notifyChange(uri);
}
return count;
}
@@ -922,9 +922,11 @@
values.remove(Mms._ID);
}
- private void notifyChange() {
- getContext().getContentResolver().notifyChange(
+ private void notifyChange(final Uri uri) {
+ final Context context = getContext();
+ context.getContentResolver().notifyChange(
MmsSms.CONTENT_URI, null, true, UserHandle.USER_ALL);
+ ProviderUtil.notifyIfNotDefaultSmsApp(uri, getCallingPackage(), context);
}
private final static String TAG = "MmsProvider";
diff --git a/src/com/android/providers/telephony/ProviderUtil.java b/src/com/android/providers/telephony/ProviderUtil.java
index 9435409..34c6da9 100644
--- a/src/com/android/providers/telephony/ProviderUtil.java
+++ b/src/com/android/providers/telephony/ProviderUtil.java
@@ -16,10 +16,16 @@
package com.android.providers.telephony;
+import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
import android.os.Process;
import android.provider.Telephony;
+import android.provider.Telephony.Sms;
+import android.text.TextUtils;
+import android.util.Log;
import com.android.internal.telephony.SmsApplication;
@@ -27,6 +33,7 @@
* Helpers
*/
public class ProviderUtil {
+ private final static String TAG = "SmsProvider";
/**
* Check if a caller of the provider has restricted access,
@@ -68,4 +75,41 @@
(values.containsKey(Telephony.Sms.CREATOR) ||
values.containsKey(Telephony.Mms.CREATOR));
}
+
+ /**
+ * Notify the default SMS app of an SMS/MMS provider change if the change is being made
+ * by a package other than the default SMS app itself.
+ *
+ * @param uri The uri the provider change applies to
+ * @param callingPackage The package name of the provider caller
+ * @param Context
+ */
+ public static void notifyIfNotDefaultSmsApp(final Uri uri, final String callingPackage,
+ final Context context) {
+ if (TextUtils.equals(callingPackage, Telephony.Sms.getDefaultSmsPackage(context))) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.d(TAG, "notifyIfNotDefaultSmsApp - called from default sms app");
+ }
+ return;
+ }
+ // Direct the intent to only the default SMS app, and only if the SMS app has a receiver
+ // for the intent.
+ ComponentName componentName =
+ SmsApplication.getDefaultExternalTelephonyProviderChangedApplication(context, true);
+ if (componentName == null) {
+ return; // the default sms app doesn't have a receiver for this intent
+ }
+
+ final Intent intent =
+ new Intent(Telephony.Sms.Intents.ACTION_EXTERNAL_PROVIDER_CHANGE);
+ intent.setComponent(componentName);
+ if (uri != null) {
+ intent.setData(uri);
+ }
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.d(TAG, "notifyIfNotDefaultSmsApp - called from " + callingPackage + ", notifying");
+ }
+ context.sendBroadcast(intent);
+ }
+
}
diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
index d48f1c6..c282a7f 100644
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ b/src/com/android/providers/telephony/SmsProvider.java
@@ -17,9 +17,12 @@
package com.android.providers.telephony;
import android.app.AppOpsManager;
+import android.content.ComponentName;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.DatabaseUtils;
@@ -41,6 +44,8 @@
import android.text.TextUtils;
import android.util.Log;
+import com.android.internal.telephony.SmsApplication;
+
import java.util.ArrayList;
import java.util.HashMap;
@@ -402,6 +407,7 @@
int match = sURLMatcher.match(url);
String table = TABLE_SMS;
+ boolean notifyIfNotDefault = true;
switch (match) {
case SMS_ALL:
@@ -440,6 +446,10 @@
case SMS_RAW_MESSAGE:
table = "raw";
+ // The raw table is used by the telephony layer for storing an sms before
+ // sending out a notification that an sms has arrived. We don't want to notify
+ // the default sms app of changes to this table.
+ notifyIfNotDefault = false;
break;
case SMS_STATUS_PENDING:
@@ -575,7 +585,7 @@
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.d(TAG, "insert " + uri + " succeeded");
}
- notifyChange(uri);
+ notifyChange(notifyIfNotDefault, uri, callerPkg);
return uri;
} else {
Log.e(TAG,"insert: failed!");
@@ -589,6 +599,7 @@
int count;
int match = sURLMatcher.match(url);
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+ boolean notifyIfNotDefault = true;
switch (match) {
case SMS_ALL:
count = db.delete(TABLE_SMS, where, whereArgs);
@@ -627,6 +638,7 @@
case SMS_RAW_MESSAGE:
count = db.delete("raw", where, whereArgs);
+ notifyIfNotDefault = false;
break;
case SMS_STATUS_PENDING:
@@ -643,7 +655,7 @@
}
if (count > 0) {
- notifyChange(url);
+ notifyChange(notifyIfNotDefault, url, getCallingPackage());
}
return count;
}
@@ -678,11 +690,13 @@
int count = 0;
String table = TABLE_SMS;
String extraWhere = null;
+ boolean notifyIfNotDefault = true;
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
switch (sURLMatcher.match(url)) {
case SMS_RAW_MESSAGE:
table = TABLE_RAW;
+ notifyIfNotDefault = false;
break;
case SMS_STATUS_PENDING:
@@ -747,17 +761,21 @@
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.d(TAG, "update " + url + " succeeded");
}
- notifyChange(url);
+ notifyChange(notifyIfNotDefault, url, callerPkg);
}
return count;
}
- private void notifyChange(Uri uri) {
- ContentResolver cr = getContext().getContentResolver();
+ private void notifyChange(boolean notifyIfNotDefault, Uri uri, final String callingPackage) {
+ final Context context = getContext();
+ ContentResolver cr = context.getContentResolver();
cr.notifyChange(uri, null, true, UserHandle.USER_ALL);
cr.notifyChange(MmsSms.CONTENT_URI, null, true, UserHandle.USER_ALL);
cr.notifyChange(Uri.parse("content://mms-sms/conversations/"), null, true,
UserHandle.USER_ALL);
+ if (notifyIfNotDefault) {
+ ProviderUtil.notifyIfNotDefaultSmsApp(uri, callingPackage, context);
+ }
}
private SQLiteOpenHelper mOpenHelper;
diff --git a/src/com/android/providers/telephony/TelephonyBackupAgent.java b/src/com/android/providers/telephony/TelephonyBackupAgent.java
new file mode 100644
index 0000000..1e92966
--- /dev/null
+++ b/src/com/android/providers/telephony/TelephonyBackupAgent.java
@@ -0,0 +1,1101 @@
+/*
+ * Copyright (C) 2016 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 com.android.providers.telephony;
+
+import com.google.android.mms.ContentType;
+import com.google.android.mms.pdu.CharacterSets;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import android.annotation.TargetApi;
+import android.app.backup.BackupAgent;
+import android.app.backup.BackupDataInput;
+import android.app.backup.BackupDataOutput;
+import android.app.backup.FullBackupDataOutput;
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.DatabaseUtils;
+import android.net.Uri;
+import android.os.Build;
+import android.os.ParcelFileDescriptor;
+import android.provider.BaseColumns;
+import android.provider.Telephony;
+import android.telephony.PhoneNumberUtils;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.JsonReader;
+import android.util.JsonWriter;
+import android.util.Log;
+import android.util.SparseArray;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.DeflaterOutputStream;
+import java.util.zip.InflaterInputStream;
+
+/***
+ * Backup agent for backup and restore SMS's and text MMS's.
+ *
+ * This backup agent stores SMS's into "sms_backup" file as a JSON array. Example below.
+ * [{"self_phone":"+1234567891011","address":"+1234567891012","body":"Example sms",
+ * "date":"1450893518140","date_sent":"1450893514000","status":"-1","type":"1"},
+ * {"self_phone":"+1234567891011","address":"12345","body":"Example 2","date":"1451328022316",
+ * "date_sent":"1451328018000","status":"-1","type":"1"}]
+ *
+ * Text MMS's are stored into "mms_backup" file as a JSON array. Example below.
+ * [{"self_phone":"+1234567891011","date":"1451322716","date_sent":"0","m_type":"128","v":"18",
+ * "msg_box":"2","mms_addresses":[{"type":137,"address":"+1234567891011","charset":106},
+ * {"type":151,"address":"example@example.com","charset":106}],"mms_body":"Mms to email",
+ * "mms_charset":106},
+ * {"self_phone":"+1234567891011","sub":"MMS subject","date":"1451322955","date_sent":"0",
+ * "m_type":"132","v":"17","msg_box":"1","ct_l":"http://promms/servlets/NOK5BBqgUHAqugrQNM",
+ * "mms_addresses":[{"type":151,"address":"+1234567891011","charset":106}],
+ * "mms_body":"Mms\nBody\r\n",
+ * "mms_charset":106,"sub_cs":"106"}]
+ *
+ * It deflates the files on the flight.
+ * Every 1000 messages it backs up file, deletes it and creates a new one with the same name.
+ *
+ * It stores how many bytes we are over the quota and don't backup the oldest messages.
+ */
+
+@TargetApi(Build.VERSION_CODES.M)
+public class TelephonyBackupAgent extends BackupAgent {
+ private static final String TAG = "TelephonyBackupAgent";
+ private static final boolean DEBUG = false;
+
+
+ // Copied from packages/apps/Messaging/src/com/android/messaging/sms/MmsUtils.java.
+ private static final int DEFAULT_DURATION = 5000; //ms
+
+ // Copied from packages/apps/Messaging/src/com/android/messaging/sms/MmsUtils.java.
+ @VisibleForTesting
+ static final String sSmilTextOnly =
+ "<smil>" +
+ "<head>" +
+ "<layout>" +
+ "<root-layout/>" +
+ "<region id=\"Text\" top=\"0\" left=\"0\" "
+ + "height=\"100%%\" width=\"100%%\"/>" +
+ "</layout>" +
+ "</head>" +
+ "<body>" +
+ "%s" + // constructed body goes here
+ "</body>" +
+ "</smil>";
+
+ // Copied from packages/apps/Messaging/src/com/android/messaging/sms/MmsUtils.java.
+ @VisibleForTesting
+ static final String sSmilTextPart =
+ "<par dur=\"" + DEFAULT_DURATION + "ms\">" +
+ "<text src=\"%s\" region=\"Text\" />" +
+ "</par>";
+
+
+ // JSON key for phone number a message was sent from or received to.
+ private static final String SELF_PHONE_KEY = "self_phone";
+ // JSON key for list of addresses of MMS message.
+ private static final String MMS_ADDRESSES_KEY = "mms_addresses";
+ // JSON key for list of recipients of sms message.
+ private static final String SMS_RECIPIENTS = "sms_recipients";
+ // JSON key for MMS body.
+ private static final String MMS_BODY_KEY = "mms_body";
+ // JSON key for MMS charset.
+ private static final String MMS_BODY_CHARSET_KEY = "mms_charset";
+
+ // File names for backup/restore.
+ private static final String SMS_BACKUP_FILE = "sms_backup";
+ private static final String MMS_BACKUP_FILE = "mms_backup";
+
+ // Charset being used for reading/writing backup files.
+ private static final String CHARSET_UTF8 = "UTF-8";
+
+ // Order by ID entries from database.
+ private static final String ORDER_BY_ID = BaseColumns._ID + " ASC";
+
+ // Order by Date entries from database. We order it the oldest first in order to throw them if
+ // we are over quota.
+ private static final String ORDER_BY_DATE = "date ASC";
+
+ // Columns from SMS database for backup/restore.
+ @VisibleForTesting
+ static final String[] SMS_PROJECTION = new String[] {
+ Telephony.Sms._ID,
+ Telephony.Sms.SUBSCRIPTION_ID,
+ Telephony.Sms.ADDRESS,
+ Telephony.Sms.BODY,
+ Telephony.Sms.SUBJECT,
+ Telephony.Sms.DATE,
+ Telephony.Sms.DATE_SENT,
+ Telephony.Sms.STATUS,
+ Telephony.Sms.TYPE,
+ Telephony.Sms.THREAD_ID
+ };
+
+ // Columns to fetch recepients of SMS.
+ private static final String[] SMS_RECIPIENTS_PROJECTION = {
+ Telephony.Threads._ID,
+ Telephony.Threads.RECIPIENT_IDS
+ };
+
+ // Columns from MMS database for backup/restore.
+ @VisibleForTesting
+ static final String[] MMS_PROJECTION = new String[] {
+ Telephony.Mms._ID,
+ Telephony.Mms.SUBSCRIPTION_ID,
+ Telephony.Mms.SUBJECT,
+ Telephony.Mms.SUBJECT_CHARSET,
+ Telephony.Mms.DATE,
+ Telephony.Mms.DATE_SENT,
+ Telephony.Mms.MESSAGE_TYPE,
+ Telephony.Mms.MMS_VERSION,
+ Telephony.Mms.TEXT_ONLY,
+ Telephony.Mms.MESSAGE_BOX,
+ Telephony.Mms.CONTENT_LOCATION
+ };
+
+ // Columns from addr database for backup/restore. This database is used for fetching addresses
+ // for MMS message.
+ @VisibleForTesting
+ static final String[] MMS_ADDR_PROJECTION = new String[] {
+ Telephony.Mms.Addr.TYPE,
+ Telephony.Mms.Addr.ADDRESS,
+ Telephony.Mms.Addr.CHARSET
+ };
+
+ // Columns from part database for backup/restore. This database is used for fetching body text
+ // and charset for MMS message.
+ @VisibleForTesting
+ static final String[] MMS_TEXT_PROJECTION = new String[] {
+ Telephony.Mms.Part.CONTENT_TYPE,
+ Telephony.Mms.Part.TEXT,
+ Telephony.Mms.Part.CHARSET
+ };
+
+ // Maximum messages for one backup file. After reaching the limit the agent backs up the file,
+ // deletes it and creates a new one with the same name.
+ private static final int MAX_MSG_PER_FILE = 1000;
+
+
+ // Default values for SMS, MMS, Addresses restore.
+ private static final ContentValues defaultValuesSms = new ContentValues(3);
+ private static final ContentValues defaultValuesMms = new ContentValues(5);
+ private static final ContentValues defaultValuesAddr = new ContentValues(2);
+
+ // Shared preferences for the backup agent.
+ private static final String BACKUP_PREFS = "backup_shared_prefs";
+ // Key for storing bytes over.
+ private static final String BYTES_OVER_QUOTA_PREF_KEY = "bytes_over_quota";
+
+
+ static {
+ // Consider restored messages read and seen.
+ defaultValuesSms.put(Telephony.Sms.READ, 1);
+ defaultValuesSms.put(Telephony.Sms.SEEN, 1);
+ // If there is no sub_id with self phone number on restore set it to -1.
+ defaultValuesSms.put(Telephony.Sms.SUBSCRIPTION_ID, -1);
+
+ defaultValuesMms.put(Telephony.Mms.READ, 1);
+ defaultValuesMms.put(Telephony.Mms.SEEN, 1);
+ defaultValuesMms.put(Telephony.Mms.SUBSCRIPTION_ID, -1);
+ defaultValuesMms.put(Telephony.Mms.MESSAGE_BOX, Telephony.Mms.MESSAGE_BOX_ALL);
+ defaultValuesMms.put(Telephony.Mms.TEXT_ONLY, 1);
+
+ defaultValuesAddr.put(Telephony.Mms.Addr.TYPE, 0);
+ defaultValuesAddr.put(Telephony.Mms.Addr.CHARSET, CharacterSets.DEFAULT_CHARSET);
+ }
+
+
+ private SparseArray<String> subId2phone;
+ private Map<String, Integer> phone2subId;
+ private ContentProvider mSmsProvider;
+ private ContentProvider mMmsProvider;
+ private ContentProvider mMmsSmsProvider;
+
+ // How many bytes we have to skip to fit into quota.
+ private long mBytesOverQuota;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ subId2phone = new SparseArray<String>();
+ phone2subId = new ArrayMap<String, Integer>();
+ final SubscriptionManager subscriptionManager = SubscriptionManager.from(this);
+ if (subscriptionManager != null) {
+ final List<SubscriptionInfo> subInfo =
+ subscriptionManager.getActiveSubscriptionInfoList();
+ if (subInfo != null) {
+ for (SubscriptionInfo sub : subInfo) {
+ final String phoneNumber = getNormalizedNumber(sub);
+ subId2phone.append(sub.getSubscriptionId(), phoneNumber);
+ phone2subId.put(phoneNumber, sub.getSubscriptionId());
+ }
+ }
+ }
+
+ mSmsProvider = new SmsProvider();
+ mMmsProvider = new MmsProvider();
+ mMmsSmsProvider = new MmsSmsProvider();
+
+ attachAndCreateProviders();
+ }
+
+ private void attachAndCreateProviders() {
+ mSmsProvider.attachInfo(this, null);
+ mSmsProvider.onCreate();
+
+ mMmsProvider.attachInfo(this, null);
+ mMmsProvider.onCreate();
+
+ mMmsSmsProvider.attachInfo(this, null);
+ mMmsSmsProvider.onCreate();
+ }
+
+ @Override
+ public void onFullBackup(FullBackupDataOutput data) throws IOException {
+ mBytesOverQuota = getSharedPreferences(BACKUP_PREFS, MODE_PRIVATE).
+ getLong(BYTES_OVER_QUOTA_PREF_KEY, 0);
+
+ backupAllSms(data);
+ backupAllMms(data);
+ }
+
+ @Override
+ public void onQuotaExceeded(long backupDataBytes, long quotaBytes) {
+ mBytesOverQuota = (long)((backupDataBytes - quotaBytes)*1.1);
+ getSharedPreferences(BACKUP_PREFS, MODE_PRIVATE).edit()
+ .putLong(BYTES_OVER_QUOTA_PREF_KEY, mBytesOverQuota).apply();
+ }
+
+ private void backupAllSms(FullBackupDataOutput data) throws IOException {
+ try (Cursor cursor = mSmsProvider.query(Telephony.Sms.CONTENT_URI, SMS_PROJECTION, null,
+ null, ORDER_BY_DATE)) {
+ if (DEBUG) {
+ Log.i(TAG, "Backing up SMS");
+ }
+ if (cursor != null) {
+ while (!cursor.isLast() && !cursor.isAfterLast()) {
+ try (JsonWriter jsonWriter = getJsonWriter(SMS_BACKUP_FILE)) {
+ putSmsMessagesToJson(cursor, subId2phone, jsonWriter, mMmsSmsProvider,
+ MAX_MSG_PER_FILE);
+ }
+ backupFile(SMS_BACKUP_FILE, data);
+ }
+ }
+ }
+ }
+
+ private void backupAllMms(FullBackupDataOutput data) throws IOException {
+ try (Cursor cursor = mMmsProvider.query(Telephony.Mms.CONTENT_URI, MMS_PROJECTION, null,
+ null, ORDER_BY_DATE)) {
+ if (DEBUG) {
+ Log.i(TAG, "Backing up text MMS");
+ }
+ if (cursor != null) {
+ while (!cursor.isLast() && !cursor.isAfterLast()) {
+ try (JsonWriter jsonWriter = getJsonWriter(MMS_BACKUP_FILE)) {
+ putMmsMessagesToJson(cursor, mMmsProvider, subId2phone, jsonWriter,
+ MAX_MSG_PER_FILE);
+ }
+ backupFile(MMS_BACKUP_FILE, data);
+ }
+ }
+ }
+ }
+
+ @VisibleForTesting
+ static void putMmsMessagesToJson(Cursor cursor, ContentProvider mmsProvider,
+ SparseArray<String> subId2phone, JsonWriter jsonWriter,
+ int maxMsgPerFile) throws IOException {
+ jsonWriter.beginArray();
+ for (int msgCount=0; msgCount<maxMsgPerFile && cursor.moveToNext();) {
+ msgCount += writeMmsToWriter(jsonWriter, cursor, subId2phone, mmsProvider);
+ }
+ jsonWriter.endArray();
+ }
+
+ @VisibleForTesting
+ static void putSmsMessagesToJson(Cursor cursor, SparseArray<String> subId2phone,
+ JsonWriter jsonWriter, ContentProvider threadProvider,
+ int maxMsgPerFile) throws IOException {
+
+ jsonWriter.beginArray();
+ for (int msgCount=0; msgCount<maxMsgPerFile && cursor.moveToNext(); ++msgCount) {
+ writeSmsToWriter(jsonWriter, cursor, threadProvider, subId2phone);
+ }
+ jsonWriter.endArray();
+ }
+
+ private void backupFile(String fileName, FullBackupDataOutput data) {
+ final File file = new File(getFilesDir().getPath() + "/" + fileName);
+ try {
+ if (mBytesOverQuota > 0) {
+ mBytesOverQuota -= file.length();
+ return;
+ }
+ super.fullBackupFile(file, data);
+ } finally {
+ file.delete();
+ }
+ }
+
+ @Override
+ public void onRestoreFile(ParcelFileDescriptor data, long size, File destination, int type,
+ long mode, long mtime) throws IOException {
+ if (DEBUG) {
+ Log.i(TAG, "Restoring file " + destination.getName());
+ }
+
+ if (destination.getName().equals(SMS_BACKUP_FILE)) {
+ if (DEBUG) {
+ Log.i(TAG, "Restoring SMS");
+ }
+ try (JsonReader jsonReader = getJsonReader(data.getFileDescriptor())) {
+ putSmsMessagesToProvider(jsonReader, mSmsProvider, mMmsSmsProvider, phone2subId);
+ }
+ } else if (destination.getName().equals(MMS_BACKUP_FILE)) {
+ if (DEBUG) {
+ Log.i(TAG, "Restoring text MMS");
+ }
+ try (JsonReader jsonReader = getJsonReader(data.getFileDescriptor())) {
+ putMmsMessagesToProvider(jsonReader, mMmsProvider, mMmsSmsProvider, phone2subId);
+ }
+ } else {
+ super.onRestoreFile(data, size, destination, type, mode, mtime);
+ }
+ if (DEBUG) {
+ Log.i(TAG, "Finished restore");
+ }
+ }
+
+ @VisibleForTesting
+ static void putSmsMessagesToProvider(JsonReader jsonReader, ContentProvider smsProvider,
+ ContentProvider threadProvider,
+ Map<String, Integer> phone2subId) throws IOException {
+ jsonReader.beginArray();
+ while (jsonReader.hasNext()) {
+ ContentValues smsValues =
+ readSmsValuesFromReader(jsonReader, threadProvider, phone2subId);
+ if (doesSmsExist(smsProvider, smsValues)) {
+ if (DEBUG) {
+ Log.e(TAG, String.format("Sms: %s already exists", smsValues.toString()));
+ }
+ continue;
+ }
+ smsProvider.insert(Telephony.Sms.CONTENT_URI, smsValues);
+ }
+ jsonReader.endArray();
+ }
+
+ @VisibleForTesting
+ static void putMmsMessagesToProvider(JsonReader jsonReader, ContentProvider mmsProvider,
+ ContentProvider threadProvider,
+ Map<String, Integer> phone2subId) throws IOException {
+ jsonReader.beginArray();
+ while (jsonReader.hasNext()) {
+ final Mms mms = readMmsFromReader(jsonReader, threadProvider, phone2subId);
+ if (doesMmsExist(mmsProvider, mms)) {
+ if (DEBUG) {
+ Log.e(TAG, String.format("Mms: %s already exists", mms.toString()));
+ }
+ continue;
+ }
+ addMmsMessage(mmsProvider, mms);
+ }
+ }
+
+ @VisibleForTesting
+ static final String[] PROJECTION_ID = {BaseColumns._ID};
+
+ private static boolean doesSmsExist(ContentProvider smsProvider, ContentValues smsValues) {
+ final String where = String.format("%s = %d and %s = %s",
+ Telephony.Sms.DATE, smsValues.getAsLong(Telephony.Sms.DATE),
+ Telephony.Sms.BODY,
+ DatabaseUtils.sqlEscapeString(smsValues.getAsString(Telephony.Sms.BODY)));
+ try (Cursor cursor = smsProvider.query(Telephony.Sms.CONTENT_URI, PROJECTION_ID, where,
+ null, null)) {
+ return cursor != null && cursor.getCount() > 0;
+ }
+ }
+
+ private static boolean doesMmsExist(ContentProvider mmsProvider, Mms mms) {
+ final String where = String.format("%s = %d",
+ Telephony.Sms.DATE, mms.values.getAsLong(Telephony.Mms.DATE));
+ try (Cursor cursor = mmsProvider.query(Telephony.Mms.CONTENT_URI, PROJECTION_ID, where,
+ null, null)) {
+ if (cursor != null && cursor.moveToFirst()) {
+ do {
+ final int mmsId = cursor.getInt(0);
+ final MmsBody body = getMmsBody(mmsProvider, mmsId);
+ if (body != null && body.equals(mms.body)) {
+ return true;
+ }
+ } while (cursor.moveToNext());
+ }
+ }
+ return false;
+ }
+
+ private static String getNormalizedNumber(SubscriptionInfo subscriptionInfo) {
+ if (subscriptionInfo == null) {
+ return null;
+ }
+ return PhoneNumberUtils.formatNumberToE164(subscriptionInfo.getNumber(),
+ subscriptionInfo.getCountryIso().toUpperCase(Locale.US));
+ }
+
+ private static void writeSmsToWriter(JsonWriter jsonWriter, Cursor cursor,
+ ContentProvider threadProvider,
+ SparseArray<String> subId2phone) throws IOException {
+ jsonWriter.beginObject();
+
+ for (int i=0; i<cursor.getColumnCount(); ++i) {
+ final String name = cursor.getColumnName(i);
+ final String value = cursor.getString(i);
+ if (value == null) {
+ continue;
+ }
+ switch (name) {
+ case Telephony.Sms.SUBSCRIPTION_ID:
+ final int subId = cursor.getInt(i);
+ final String selfNumber = subId2phone.get(subId);
+ if (selfNumber != null) {
+ jsonWriter.name(SELF_PHONE_KEY).value(selfNumber);
+ }
+ break;
+ case Telephony.Sms.THREAD_ID:
+ final long threadId = cursor.getLong(i);
+ writeSmsRecipientsToWriter(jsonWriter.name(SMS_RECIPIENTS),
+ getRecipientsByThread(threadProvider, threadId));
+ break;
+ case Telephony.Sms._ID:
+ break;
+ default:
+ jsonWriter.name(name).value(value);
+ break;
+ }
+ }
+ jsonWriter.endObject();
+
+ }
+
+ private static void writeSmsRecipientsToWriter(JsonWriter jsonWriter, List<String> recipients)
+ throws IOException {
+ jsonWriter.beginArray();
+ if (recipients != null) {
+ for (String s : recipients) {
+ jsonWriter.value(s);
+ }
+ }
+ jsonWriter.endArray();
+ }
+
+ @VisibleForTesting
+ static ContentValues readSmsValuesFromReader(JsonReader jsonReader,
+ ContentProvider threadProvider,
+ Map<String, Integer> phone2id)
+ throws IOException {
+ ContentValues values = new ContentValues(8+defaultValuesSms.size());
+ values.putAll(defaultValuesSms);
+ jsonReader.beginObject();
+ while (jsonReader.hasNext()) {
+ String name = jsonReader.nextName();
+ switch (name) {
+ case Telephony.Sms.BODY:
+ case Telephony.Sms.DATE:
+ case Telephony.Sms.DATE_SENT:
+ case Telephony.Sms.STATUS:
+ case Telephony.Sms.TYPE:
+ case Telephony.Sms.SUBJECT:
+ case Telephony.Sms.ADDRESS:
+ values.put(name, jsonReader.nextString());
+ break;
+ case SMS_RECIPIENTS:
+ values.put(Telephony.Sms.THREAD_ID,
+ getOrCreateThreadId(threadProvider, getSmsRecipients(jsonReader)));
+ break;
+ case SELF_PHONE_KEY:
+ final String selfPhone = jsonReader.nextString();
+ if (phone2id.containsKey(selfPhone)) {
+ values.put(Telephony.Sms.SUBSCRIPTION_ID, phone2id.get(selfPhone));
+ }
+ break;
+ default:
+ if (DEBUG) {
+ Log.w(TAG, "Unknown name:" + name);
+ }
+ jsonReader.skipValue();
+ break;
+ }
+ }
+ jsonReader.endObject();
+ return values;
+ }
+
+ private static Set<String> getSmsRecipients(JsonReader jsonReader) throws IOException {
+ Set<String> recipients = new ArraySet<String>();
+ jsonReader.beginArray();
+ while (jsonReader.hasNext()) {
+ recipients.add(jsonReader.nextString());
+ }
+ jsonReader.endArray();
+ return recipients;
+ }
+
+ private static int writeMmsToWriter(JsonWriter jsonWriter, Cursor cursor,
+ SparseArray<String> subId2phone,
+ ContentProvider mmsProvider) throws IOException {
+ // Do not backup non text-only MMS's.
+ if (cursor.getInt(cursor.getColumnIndex(Telephony.Mms.TEXT_ONLY)) != 1) {
+ return 0;
+ }
+ final int mmsId = cursor.getInt(0);
+ final MmsBody body = getMmsBody(mmsProvider, mmsId);
+ if (body == null || body.text == null) {
+ return 0;
+ }
+
+ boolean subjectNull = true;
+ jsonWriter.beginObject();
+ for (int i=0; i<cursor.getColumnCount(); ++i) {
+ final String name = cursor.getColumnName(i);
+ final String value = cursor.getString(i);
+ if (value == null) {
+ continue;
+ }
+ switch (name) {
+ case Telephony.Sms.SUBSCRIPTION_ID:
+ final int subId = cursor.getInt(i);
+ final String selfNumber = subId2phone.get(subId);
+ if (selfNumber != null) {
+ jsonWriter.name(SELF_PHONE_KEY).value(selfNumber);
+ }
+ break;
+ case Telephony.Mms._ID:
+ case Telephony.Mms.TEXT_ONLY:
+ case Telephony.Mms.SUBJECT_CHARSET:
+ break;
+ case Telephony.Mms.SUBJECT:
+ subjectNull = false;
+ default:
+ jsonWriter.name(name).value(value);
+ break;
+ }
+ }
+ // Addresses.
+ writeMmsAddresses(jsonWriter.name(MMS_ADDRESSES_KEY), mmsProvider, mmsId);
+ // Body (text of the message).
+ jsonWriter.name(MMS_BODY_KEY).value(body.text);
+ // Charset of the body text.
+ jsonWriter.name(MMS_BODY_CHARSET_KEY).value(body.charSet);
+
+ if (!subjectNull) {
+ // Subject charset.
+ writeStringToWriter(jsonWriter, cursor, Telephony.Mms.SUBJECT_CHARSET);
+ }
+ jsonWriter.endObject();
+ return 1;
+ }
+
+ private static Mms readMmsFromReader(JsonReader jsonReader, ContentProvider threadProvider,
+ Map<String, Integer> phone2id) throws IOException {
+ Mms mms = new Mms();
+ mms.values = new ContentValues(6+defaultValuesMms.size());
+ mms.values.putAll(defaultValuesMms);
+ jsonReader.beginObject();
+ String selfPhone = null;
+ String bodyText = null;
+ int bodyCharset = CharacterSets.DEFAULT_CHARSET;
+ while (jsonReader.hasNext()) {
+ String name = jsonReader.nextName();
+ switch (name) {
+ case SELF_PHONE_KEY:
+ selfPhone = jsonReader.nextString();
+ if (phone2id.containsKey(selfPhone)) {
+ mms.values.put(Telephony.Mms.SUBSCRIPTION_ID, phone2id.get(selfPhone));
+ }
+ break;
+ case MMS_ADDRESSES_KEY:
+ getMmsAddressesFromReader(jsonReader, mms);
+ break;
+ case MMS_BODY_KEY:
+ bodyText = jsonReader.nextString();
+ break;
+ case MMS_BODY_CHARSET_KEY:
+ bodyCharset = jsonReader.nextInt();
+ break;
+ case Telephony.Mms.SUBJECT:
+ case Telephony.Mms.SUBJECT_CHARSET:
+ case Telephony.Mms.DATE:
+ case Telephony.Mms.DATE_SENT:
+ case Telephony.Mms.MESSAGE_TYPE:
+ case Telephony.Mms.MMS_VERSION:
+ case Telephony.Mms.MESSAGE_BOX:
+ case Telephony.Mms.CONTENT_LOCATION:
+ mms.values.put(name, jsonReader.nextString());
+ break;
+ default:
+ if (DEBUG) {
+ Log.w(TAG, "Unknown name:" + name);
+ }
+ jsonReader.skipValue();
+ break;
+ }
+ }
+ jsonReader.endObject();
+
+ if (bodyText != null) {
+ mms.body = new MmsBody(bodyText, bodyCharset);
+ }
+
+ { // Get ThreadId.
+ Set<String> recipients = new ArraySet<String>();
+ for (ContentValues mmsAddress : mms.addresses) {
+ String address = getDecodedString(
+ getStringBytes(mmsAddress.getAsString(Telephony.Mms.Addr.ADDRESS),
+ CharacterSets.ISO_8859_1),
+ mmsAddress.getAsInteger(Telephony.Mms.Addr.CHARSET));
+ if (selfPhone != null && selfPhone.equals(address))
+ continue;
+ recipients.add(address);
+ }
+ mms.values.put(Telephony.Mms.THREAD_ID,
+ getOrCreateThreadId(threadProvider, recipients));
+ }
+
+ // Set default charset for subject.
+ if (mms.values.get(Telephony.Mms.SUBJECT) != null &&
+ mms.values.get(Telephony.Mms.SUBJECT_CHARSET) == null) {
+ mms.values.put(Telephony.Mms.SUBJECT_CHARSET, CharacterSets.DEFAULT_CHARSET);
+ }
+
+ return mms;
+ }
+
+ private static MmsBody getMmsBody(ContentProvider mmsProvider, int mmsId) {
+ Uri MMS_PART_CONTENT_URI = Telephony.Mms.CONTENT_URI.buildUpon()
+ .appendPath(String.valueOf(mmsId)).appendPath("part").build();
+
+ String body = null;
+ int charSet = 0;
+
+ try (Cursor cursor = mmsProvider.query(MMS_PART_CONTENT_URI, MMS_TEXT_PROJECTION,
+ null, null/*selectionArgs*/, ORDER_BY_ID)) {
+ if (cursor != null && cursor.moveToFirst()) {
+ do {
+ if (ContentType.TEXT_PLAIN.equals(cursor.getString(0))) {
+ body = (body == null ? cursor.getString(1)
+ : body.concat(cursor.getString(1)));
+ charSet = cursor.getInt(2);
+ }
+ } while (cursor.moveToNext());
+ }
+ }
+ return (body == null ? null : new MmsBody(body, charSet));
+ }
+
+ private static void writeMmsAddresses(JsonWriter jsonWriter, ContentProvider mmsProvider,
+ int mmsId) throws IOException {
+ Uri.Builder builder = Telephony.Mms.CONTENT_URI.buildUpon();
+ builder.appendPath(String.valueOf(mmsId)).appendPath("addr");
+ Uri uriAddrPart = builder.build();
+
+ jsonWriter.beginArray();
+ try (Cursor cursor = mmsProvider.query(uriAddrPart, MMS_ADDR_PROJECTION,
+ null/*selection*/, null/*selectionArgs*/, ORDER_BY_ID)) {
+ if (cursor != null && cursor.moveToFirst()) {
+ do {
+ if (cursor.getString(cursor.getColumnIndex(Telephony.Mms.Addr.ADDRESS))
+ != null) {
+ jsonWriter.beginObject();
+ writeIntToWriter(jsonWriter, cursor, Telephony.Mms.Addr.TYPE);
+ writeStringToWriter(jsonWriter, cursor, Telephony.Mms.Addr.ADDRESS);
+ writeIntToWriter(jsonWriter, cursor, Telephony.Mms.Addr.CHARSET);
+ jsonWriter.endObject();
+ }
+ } while (cursor.moveToNext());
+ }
+ }
+ jsonWriter.endArray();
+ }
+
+ private static void getMmsAddressesFromReader(JsonReader jsonReader, Mms mms)
+ throws IOException {
+ mms.addresses = new ArrayList<ContentValues>();
+ jsonReader.beginArray();
+ while (jsonReader.hasNext()) {
+ jsonReader.beginObject();
+ ContentValues addrValues = new ContentValues(defaultValuesAddr);
+ while (jsonReader.hasNext()) {
+ final String name = jsonReader.nextName();
+ switch (name) {
+ case Telephony.Mms.Addr.TYPE:
+ case Telephony.Mms.Addr.CHARSET:
+ addrValues.put(name, jsonReader.nextInt());
+ break;
+ case Telephony.Mms.Addr.ADDRESS:
+ addrValues.put(name, jsonReader.nextString());
+ break;
+ default:
+ if (DEBUG) {
+ Log.w(TAG, "Unknown name:" + name);
+ }
+ jsonReader.skipValue();
+ break;
+ }
+ }
+ jsonReader.endObject();
+ if (addrValues.containsKey(Telephony.Mms.Addr.ADDRESS)) {
+ mms.addresses.add(addrValues);
+ }
+ }
+ jsonReader.endArray();
+ }
+
+ private static void addMmsMessage(ContentProvider mmsProvider, Mms mms) {
+ if (DEBUG) {
+ Log.e(TAG, "Add mms:\n" + mms.toString());
+ }
+ final long dummyId = System.currentTimeMillis(); // Dummy ID of the msg.
+ final Uri partUri = Telephony.Mms.CONTENT_URI.buildUpon()
+ .appendPath(String.valueOf(dummyId)).appendPath("part").build();
+
+ final String srcName = String.format("text.%06d.txt", 0);
+ { // Insert SMIL part.
+ final String smilBody = String.format(sSmilTextPart, srcName);
+ final String smil = String.format(sSmilTextOnly, smilBody);
+ final ContentValues values = new ContentValues(7);
+ values.put(Telephony.Mms.Part.MSG_ID, dummyId);
+ values.put(Telephony.Mms.Part.SEQ, -1);
+ values.put(Telephony.Mms.Part.CONTENT_TYPE, ContentType.APP_SMIL);
+ values.put(Telephony.Mms.Part.NAME, "smil.xml");
+ values.put(Telephony.Mms.Part.CONTENT_ID, "<smil>");
+ values.put(Telephony.Mms.Part.CONTENT_LOCATION, "smil.xml");
+ values.put(Telephony.Mms.Part.TEXT, smil);
+ if (mmsProvider.insert(partUri, values) == null) {
+ if (DEBUG) {
+ Log.e(TAG, "Could not insert SMIL part");
+ }
+ return;
+ }
+ }
+
+ { // Insert body part.
+ final ContentValues values = new ContentValues(8);
+ values.put(Telephony.Mms.Part.MSG_ID, dummyId);
+ values.put(Telephony.Mms.Part.SEQ, 0);
+ values.put(Telephony.Mms.Part.CONTENT_TYPE, ContentType.TEXT_PLAIN);
+ values.put(Telephony.Mms.Part.NAME, srcName);
+ values.put(Telephony.Mms.Part.CONTENT_ID, "<"+srcName+">");
+ values.put(Telephony.Mms.Part.CONTENT_LOCATION, srcName);
+ values.put(Telephony.Mms.Part.CHARSET, mms.body.charSet);
+ values.put(Telephony.Mms.Part.TEXT, mms.body.text);
+ if (mmsProvider.insert(partUri, values) == null) {
+ if (DEBUG) {
+ Log.e(TAG, "Could not insert body part");
+ }
+ return;
+ }
+ }
+
+ // Insert mms.
+ final Uri mmsUri = mmsProvider.insert(Telephony.Mms.CONTENT_URI, mms.values);
+ if (mmsUri == null) {
+ if (DEBUG) {
+ Log.e(TAG, "Could not insert mms");
+ }
+ return;
+ }
+
+ final long mmsId = ContentUris.parseId(mmsUri);
+ { // Update parts with the right mms id.
+ ContentValues values = new ContentValues(1);
+ values.put(Telephony.Mms.Part.MSG_ID, mmsId);
+ mmsProvider.update(partUri, values, null, null);
+ }
+
+ { // Insert adderesses into "addr".
+ final Uri addrUri = Uri.withAppendedPath(mmsUri, "addr");
+ for (ContentValues mmsAddress : mms.addresses) {
+ ContentValues values = new ContentValues(mmsAddress);
+ values.put(Telephony.Mms.Addr.MSG_ID, mmsId);
+ mmsProvider.insert(addrUri, values);
+ }
+ }
+ }
+
+ private static final class MmsBody {
+ public String text;
+ public int charSet;
+
+ public MmsBody(String text, int charSet) {
+ this.text = text;
+ this.charSet = charSet;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null || !(obj instanceof MmsBody)) {
+ return false;
+ }
+ MmsBody typedObj = (MmsBody) obj;
+ return this.text.equals(typedObj.text) && this.charSet == typedObj.charSet;
+ }
+
+ @Override
+ public String toString() {
+ return "Text:" + text + " charSet:" + charSet;
+ }
+ }
+
+ private static final class Mms {
+ public ContentValues values;
+ public List<ContentValues> addresses;
+ public MmsBody body;
+ @Override
+ public String toString() {
+ return "Values:" + values.toString() + "\nRecipients:"+addresses.toString()
+ + "\nBody:" + body;
+ }
+ }
+
+ private JsonWriter getJsonWriter(final String fileName) throws IOException {
+ return new JsonWriter(new OutputStreamWriter(new DeflaterOutputStream(
+ openFileOutput(fileName, MODE_PRIVATE)), CHARSET_UTF8));
+ }
+
+ private JsonReader getJsonReader(final FileDescriptor fileDescriptor) throws IOException {
+ return new JsonReader(new InputStreamReader(new InflaterInputStream(
+ new FileInputStream(fileDescriptor)), CHARSET_UTF8));
+ }
+
+ private static void writeStringToWriter(JsonWriter jsonWriter, Cursor cursor, String name)
+ throws IOException {
+ final String value = cursor.getString(cursor.getColumnIndex(name));
+ if (value != null) {
+ jsonWriter.name(name).value(value);
+ }
+ }
+
+ private static void writeIntToWriter(JsonWriter jsonWriter, Cursor cursor, String name)
+ throws IOException {
+ final int value = cursor.getInt(cursor.getColumnIndex(name));
+ if (value != 0) {
+ jsonWriter.name(name).value(value);
+ }
+ }
+
+ // Copied from packages/apps/Messaging/src/com/android/messaging/sms/DatabaseMessages.java.
+ /**
+ * Decoded string by character set
+ */
+ private static String getDecodedString(final byte[] data, final int charset) {
+ if (CharacterSets.ANY_CHARSET == charset) {
+ return new String(data); // system default encoding.
+ } else {
+ try {
+ final String name = CharacterSets.getMimeName(charset);
+ return new String(data, name);
+ } catch (final UnsupportedEncodingException e) {
+ try {
+ return new String(data, CharacterSets.MIMENAME_ISO_8859_1);
+ } catch (final UnsupportedEncodingException exception) {
+ return new String(data); // system default encoding.
+ }
+ }
+ }
+ }
+
+ // Copied from packages/apps/Messaging/src/com/android/messaging/sms/DatabaseMessages.java.
+ /**
+ * Unpack a given String into a byte[].
+ */
+ private static byte[] getStringBytes(final String data, final int charset) {
+ if (CharacterSets.ANY_CHARSET == charset) {
+ return data.getBytes();
+ } else {
+ try {
+ final String name = CharacterSets.getMimeName(charset);
+ return data.getBytes(name);
+ } catch (final UnsupportedEncodingException e) {
+ return data.getBytes();
+ }
+ }
+ }
+
+ private static final Uri THREAD_ID_CONTENT_URI = Uri.parse("content://mms-sms/threadID");
+ // Copied from frameworks/opt/telephony/src/java/android/provider/Telephony.java because we
+ // can't use ContentResolver during backup/restore.
+ private static long getOrCreateThreadId(
+ ContentProvider contentProvider, Set<String> recipients) {
+ Uri.Builder uriBuilder = THREAD_ID_CONTENT_URI.buildUpon();
+
+ for (String recipient : recipients) {
+ if (Telephony.Mms.isEmailAddress(recipient)) {
+ recipient = Telephony.Mms.extractAddrSpec(recipient);
+ }
+
+ uriBuilder.appendQueryParameter("recipient", recipient);
+ }
+
+ Uri uri = uriBuilder.build();
+
+ try (Cursor cursor = contentProvider.query(uri, PROJECTION_ID, null, null, null)) {
+ if (cursor != null) {
+ if (cursor.moveToFirst()) {
+ return cursor.getLong(0);
+ } else {
+ Log.e(TAG, "getOrCreateThreadId returned no rows!");
+ }
+ }
+ }
+
+ Log.e(TAG, "getOrCreateThreadId failed with " + recipients.size() + " recipients");
+ throw new IllegalArgumentException("Unable to find or allocate a thread ID.");
+ }
+
+ // Copied from packages/apps/Messaging/src/com/android/messaging/sms/MmsUtils.java.
+ private static List<String> getRecipientsByThread(final ContentProvider threadProvider,
+ final long threadId) {
+ final String spaceSepIds = getRawRecipientIdsForThread(threadProvider, threadId);
+ if (!TextUtils.isEmpty(spaceSepIds)) {
+ return getAddresses(threadProvider, spaceSepIds);
+ }
+ return null;
+ }
+
+ private static final Uri ALL_THREADS_URI =
+ Telephony.Threads.CONTENT_URI.buildUpon().
+ appendQueryParameter("simple", "true").build();
+ private static final int RECIPIENT_IDS = 1;
+
+ // Copied from packages/apps/Messaging/src/com/android/messaging/sms/MmsUtils.java.
+ // NOTE: There are phones on which you can't get the recipients from the thread id for SMS
+ // until you have a message in the conversation!
+ private static String getRawRecipientIdsForThread(final ContentProvider threadProvider,
+ final long threadId) {
+ if (threadId <= 0) {
+ return null;
+ }
+ final Cursor thread = threadProvider.query(
+ ALL_THREADS_URI,
+ SMS_RECIPIENTS_PROJECTION, "_id=?", new String[]{String.valueOf(threadId)}, null);
+ if (thread != null) {
+ try {
+ if (thread.moveToFirst()) {
+ // recipientIds will be a space-separated list of ids into the
+ // canonical addresses table.
+ return thread.getString(RECIPIENT_IDS);
+ }
+ } finally {
+ thread.close();
+ }
+ }
+ return null;
+ }
+
+ private static final Uri SINGLE_CANONICAL_ADDRESS_URI =
+ Uri.parse("content://mms-sms/canonical-address");
+
+ // Copied from packages/apps/Messaging/src/com/android/messaging/sms/MmsUtils.java.
+ private static List<String> getAddresses(final ContentProvider threadProvider,
+ final String spaceSepIds) {
+ final List<String> numbers = new ArrayList<String>();
+ final String[] ids = spaceSepIds.split(" ");
+ for (final String id : ids) {
+ long longId;
+
+ try {
+ longId = Long.parseLong(id);
+ if (longId < 0) {
+ if (DEBUG) {
+ Log.e(TAG, "getAddresses: invalid id " + longId);
+ }
+ continue;
+ }
+ } catch (final NumberFormatException ex) {
+ if (DEBUG) {
+ Log.e(TAG, "getAddresses: invalid id. " + ex, ex);
+ }
+ // skip this id
+ continue;
+ }
+
+ // TODO: build a single query where we get all the addresses at once.
+ Cursor c = null;
+ try {
+ c = threadProvider.query(
+ ContentUris.withAppendedId(SINGLE_CANONICAL_ADDRESS_URI, longId),
+ null, null, null, null);
+ } catch (final Exception e) {
+ if (DEBUG) {
+ Log.e(TAG, "getAddresses: query failed for id " + longId, e);
+ }
+ }
+ if (c != null) {
+ try {
+ if (c.moveToFirst()) {
+ final String number = c.getString(0);
+ if (!TextUtils.isEmpty(number)) {
+ numbers.add(number);
+ } else {
+ if (DEBUG) {
+ Log.w(TAG, "Canonical MMS/SMS address is empty for id: " + longId);
+ }
+ }
+ }
+ } finally {
+ c.close();
+ }
+ }
+ }
+ if (numbers.isEmpty()) {
+ if (DEBUG) {
+ Log.w(TAG, "No MMS addresses found from ids string [" + spaceSepIds + "]");
+ }
+ }
+ return numbers;
+ }
+
+ @Override
+ public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
+ ParcelFileDescriptor newState) throws IOException {
+ // Empty because is not used during full backup.
+ }
+
+ @Override
+ public void onRestore(BackupDataInput data, int appVersionCode,
+ ParcelFileDescriptor newState) throws IOException {
+ // Empty because is not used during full restore.
+ }
+}
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 0137237..0de0e79 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -1069,7 +1069,7 @@
static public ContentValues setDefaultValue(ContentValues values) {
if (!values.containsKey(Telephony.Carriers.SUBSCRIPTION_ID)) {
- int subId = SubscriptionManager.getDefaultSubId();
+ int subId = SubscriptionManager.getDefaultSubscriptionId();
values.put(Telephony.Carriers.SUBSCRIPTION_ID, subId);
}
@@ -1550,7 +1550,7 @@
+ selection + "selectionArgs=" + selectionArgs + ", sort=" + sort);
TelephonyManager mTelephonyManager =
(TelephonyManager)getContext().getSystemService(Context.TELEPHONY_SERVICE);
- int subId = SubscriptionManager.getDefaultSubId();
+ int subId = SubscriptionManager.getDefaultSubscriptionId();
String subIdString;
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setStrict(true); // a little protection from injection attacks
@@ -1701,7 +1701,7 @@
public synchronized Uri insert(Uri url, ContentValues initialValues)
{
Uri result = null;
- int subId = SubscriptionManager.getDefaultSubId();
+ int subId = SubscriptionManager.getDefaultSubscriptionId();
checkPermission();
@@ -1843,7 +1843,7 @@
public synchronized int delete(Uri url, String where, String[] whereArgs)
{
int count = 0;
- int subId = SubscriptionManager.getDefaultSubId();
+ int subId = SubscriptionManager.getDefaultSubscriptionId();
String userOrCarrierEdited = ") and (" +
Telephony.Carriers.EDITED + "=" + Telephony.Carriers.USER_EDITED + " or " +
Telephony.Carriers.EDITED + "=" + Telephony.Carriers.CARRIER_EDITED + ")";
@@ -1986,7 +1986,7 @@
{
int count = 0;
int uriType = URL_UNKNOWN;
- int subId = SubscriptionManager.getDefaultSubId();
+ int subId = SubscriptionManager.getDefaultSubscriptionId();
checkPermission();
diff --git a/tests/Android.mk b/tests/Android.mk
new file mode 100644
index 0000000..1041716
--- /dev/null
+++ b/tests/Android.mk
@@ -0,0 +1,19 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_STATIC_JAVA_LIBRARIES := mockito-target
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_SRC_FILES := $(call all-java-files-under,src)
+
+LOCAL_PACKAGE_NAME := TelephonyProviderTests
+LOCAL_CERTIFICATE := platform
+
+LOCAL_INSTRUMENTATION_FOR := TelephonyProvider
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
new file mode 100644
index 0000000..7a273fc
--- /dev/null
+++ b/tests/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.providers.telephony.tests">
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+ <instrumentation android:name="android.test.InstrumentationTestRunner"
+ android:targetPackage="com.android.providers.telephony"
+ android:label="Tests for TelephonyProvider">
+ </instrumentation>
+</manifest>
diff --git a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
new file mode 100644
index 0000000..4920c53
--- /dev/null
+++ b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
@@ -0,0 +1,705 @@
+/*
+ * Copyright (C) 2016 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 com.android.providers.telephony;
+
+import android.annotation.TargetApi;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build;
+import android.provider.BaseColumns;
+import android.provider.Telephony;
+import android.test.AndroidTestCase;
+import android.test.mock.MockContentProvider;
+import android.test.mock.MockCursor;
+import android.util.ArrayMap;
+import android.util.JsonReader;
+import android.util.JsonWriter;
+import android.util.SparseArray;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * Tests for testing backup/restore of SMS and text MMS messages.
+ * For backup it creates fake provider and checks resulting json array.
+ * For restore provides json array and checks inserts of the messages into provider.
+ */
+@TargetApi(Build.VERSION_CODES.M)
+public class TelephonyBackupAgentTest extends AndroidTestCase {
+ private SparseArray<String> mSubId2Phone;
+ private ArrayMap<String, Integer> mPhone2SubId;
+ private final List<ContentValues> mSmsTable = new ArrayList<>();
+ private final List<ContentValues> mMmsTable = new ArrayList<>();
+ private final List<ContentValues> mMmsAllContentValues = new ArrayList<>();
+ private FakeCursor mSmsCursor, mMmsCursor;
+ private ContentValues[] mSmsRows, mMmsRows;
+ private ContentValues mMmsNonText;
+ private String[] mSmsJson, mMmsJson;
+ private String mAllSmsJson, mAllMmsJson;
+
+
+ private StringWriter mStringWriter;
+ private Map<Uri, FakeCursor> mCursors;
+ private MockContentProvider mContentProvider;
+
+ private static final String EMPTY_JSON_ARRAY = "[]";
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mStringWriter = new StringWriter();
+ mSubId2Phone = new SparseArray<String>();
+ mSubId2Phone.append(1, "+111111111111111");
+ mSubId2Phone.append(3, "+333333333333333");
+
+ mPhone2SubId = new ArrayMap<>();
+ for (int i=0; i<mSubId2Phone.size(); ++i) {
+ mPhone2SubId.put(mSubId2Phone.valueAt(i), mSubId2Phone.keyAt(i));
+ }
+
+ mSmsCursor = new FakeCursor(mSmsTable, TelephonyBackupAgent.SMS_PROJECTION);
+ mMmsCursor = new FakeCursor(mMmsTable, TelephonyBackupAgent.MMS_PROJECTION);
+ mCursors = new HashMap<Uri, FakeCursor>();
+
+ mSmsRows = new ContentValues[3];
+ mSmsJson = new String[3];
+ mSmsRows[0] = createSmsRow(1, 1, "+1232132214124", "sms 1", "sms subject", 9087978987l,
+ 999999999, 3, 44, 1);
+ mSmsJson[0] = "{\"self_phone\":\"+111111111111111\",\"address\":" +
+ "\"+1232132214124\",\"body\":\"sms 1\",\"subject\":\"sms subject\",\"date\":" +
+ "\"9087978987\",\"date_sent\":\"999999999\",\"status\":\"3\",\"type\":\"44\"}";
+
+ mSmsRows[1] = createSmsRow(2, 2, "+1232132214124", "sms 2", null, 9087978987l, 999999999,
+ 0, 4, 1);
+ mSmsJson[1] = "{\"address\":\"+1232132214124\",\"body\":\"sms 2\",\"date\":" +
+ "\"9087978987\",\"date_sent\":\"999999999\",\"status\":\"0\",\"type\":\"4\"}";
+
+ mSmsRows[2] = createSmsRow(4, 3, "+1232221412433 +1232221412444", "sms 3", null,
+ 111111111111l, 999999999, 2, 3, 2);
+ mSmsJson[2] = "{\"self_phone\":\"+333333333333333\",\"address\":" +
+ "\"+1232221412433 +1232221412444\",\"body\":\"sms 3\",\"date\":\"111111111111\"," +
+ "\"date_sent\":" +
+ "\"999999999\",\"status\":\"2\",\"type\":\"3\"}";
+
+ mAllSmsJson = concatJson(mSmsJson);
+
+
+
+ mMmsRows = new ContentValues[3];
+ mMmsJson = new String[3];
+ mMmsRows[0] = createMmsRow(1 /*id*/, 1 /*subid*/, "Subject 1" /*subject*/,
+ 100 /*subcharset*/, 111111 /*date*/, 111112 /*datesent*/, 3 /*type*/,
+ 17 /*version*/, 1 /*textonly*/,
+ 11 /*msgBox*/, "location 1" /*contentLocation*/, "MMs body 1" /*body*/,
+ 111 /*body charset*/,
+ new String[]{"+11121212", "example@example.com", "+999999999"} /*addresses*/,
+ 1 /*threadId*/);
+
+ mMmsJson[0] = "{\"self_phone\":\"+111111111111111\",\"sub\":\"Subject 1\"," +
+ "\"date\":\"111111\",\"date_sent\":\"111112\",\"m_type\":\"3\",\"v\":\"17\"," +
+ "\"msg_box\":\"11\",\"ct_l\":\"location 1\",\"mms_addresses\":[{\"type\":10," +
+ "\"address\":\"+11121212\",\"charset\":100},{\"type\":11,\"address\":" +
+ "\"example@example.com\",\"charset\":101},{\"type\":12,\"address\":\"+999999999\"" +
+ ",\"charset\":102}],\"mms_body\":\"MMs body 1\",\"mms_charset\":111,\"" +
+ "sub_cs\":\"100\"}";
+
+ mMmsRows[1] = createMmsRow(2 /*id*/, 2 /*subid*/, null /*subject*/, 100 /*subcharset*/,
+ 111122 /*date*/, 1111112 /*datesent*/, 4 /*type*/, 18 /*version*/, 1 /*textonly*/,
+ 222 /*msgBox*/, "location 2" /*contentLocation*/, "MMs body 2" /*body*/,
+ 121 /*body charset*/,
+ new String[]{"example@example.com", "+999999999"} /*addresses*/, 2 /*threadId*/);
+
+ mMmsJson[1] = "{\"date\":\"111122\",\"date_sent\":\"1111112\",\"m_type\":\"4\"," +
+ "\"v\":\"18\",\"msg_box\":\"222\",\"ct_l\":\"location 2\",\"mms_addresses\":" +
+ "[{\"type\":10,\"address\":\"example@example.com\",\"charset\":100}," +
+ "{\"type\":11,\"address\":\"+999999999\",\"charset\":101}]," +
+ "\"mms_body\":\"MMs body 2\",\"mms_charset\":121}";
+
+ mMmsRows[2] = createMmsRow(10 /*id*/, 3 /*subid*/, "Subject 10" /*subject*/,
+ 10 /*subcharset*/, 111133 /*date*/, 1111132 /*datesent*/, 5 /*type*/,
+ 19 /*version*/, 1 /*textonly*/,
+ 333 /*msgBox*/, null /*contentLocation*/, "MMs body 3" /*body*/,
+ 131 /*body charset*/, new String[]{"+8888888888"} /*addresses*/, 3 /*threadId*/);
+
+ mMmsJson[2] = "{\"self_phone\":\"+333333333333333\",\"sub\":\"Subject 10\"," +
+ "\"date\":\"111133\",\"date_sent\":\"1111132\",\"m_type\":\"5\",\"v\":\"19\"," +
+ "\"msg_box\":\"333\",\"mms_addresses\":[{\"type\":10,\"address\":\"+8888888888\"," +
+ "\"charset\":100}],\"mms_body\":\"MMs body 3\",\"mms_charset\":131," +
+ "\"sub_cs\":\"10\"}";
+ mAllMmsJson = concatJson(mMmsJson);
+
+
+ // Should not be backed up. Cause flag text_only is false.
+ mMmsNonText = createMmsRow(10 /*id*/, 3 /*subid*/, "Subject 10" /*subject*/,
+ 10 /*subcharset*/,
+ 111133 /*date*/, 1111132 /*datesent*/, 5 /*type*/, 19 /*version*/, 0 /*textonly*/,
+ 333 /*msgBox*/, null /*contentLocation*/, "MMs body 3" /*body*/,
+ 131 /*body charset*/, new String[]{"+8888888888"} /*addresses*/, 3 /*threadId*/);
+
+ mContentProvider = new MockContentProvider() {
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection,
+ String[] selectionArgs, String sortOrder) {
+ if (mCursors.containsKey(uri)) {
+ FakeCursor fakeCursor = mCursors.get(uri);
+ if (projection != null) {
+ fakeCursor.setProjection(projection);
+ }
+ return fakeCursor;
+ }
+ return super.query(uri, projection, selection, selectionArgs, sortOrder);
+ }
+ };
+
+ }
+
+ private static String concatJson(String[] json) {
+ StringBuilder stringBuilder = new StringBuilder("[");
+ for (int i=0; i<json.length; ++i) {
+ if (i > 0) {
+ stringBuilder.append(",");
+ }
+ stringBuilder.append(json[i]);
+ }
+ stringBuilder.append("]");
+ return stringBuilder.toString();
+ }
+
+ private static ContentValues createSmsRow(int id, int subId, String address, String body,
+ String subj, long date, long dateSent,
+ int status, int type, long threadId) {
+ ContentValues smsRow = new ContentValues();
+ smsRow.put(Telephony.Sms._ID, id);
+ smsRow.put(Telephony.Sms.SUBSCRIPTION_ID, subId);
+ if (address != null) {
+ smsRow.put(Telephony.Sms.ADDRESS, address);
+ }
+ if (body != null) {
+ smsRow.put(Telephony.Sms.BODY, body);
+ }
+ if (subj != null) {
+ smsRow.put(Telephony.Sms.SUBJECT, subj);
+ }
+ smsRow.put(Telephony.Sms.DATE, String.valueOf(date));
+ smsRow.put(Telephony.Sms.DATE_SENT, String.valueOf(dateSent));
+ smsRow.put(Telephony.Sms.STATUS, String.valueOf(status));
+ smsRow.put(Telephony.Sms.TYPE, String.valueOf(type));
+ smsRow.put(Telephony.Sms.THREAD_ID, threadId);
+
+ return smsRow;
+ }
+
+ private ContentValues createMmsRow(int id, int subId, String subj, int subCharset,
+ long date, long dateSent, int type, int version,
+ int textOnly, int msgBox,
+ String contentLocation, String body,
+ int bodyCharset, String[] addresses, long threadId) {
+ ContentValues mmsRow = new ContentValues();
+ mmsRow.put(Telephony.Mms._ID, id);
+ mmsRow.put(Telephony.Mms.SUBSCRIPTION_ID, subId);
+ if (subj != null) {
+ mmsRow.put(Telephony.Mms.SUBJECT, subj);
+ mmsRow.put(Telephony.Mms.SUBJECT_CHARSET, String.valueOf(subCharset));
+ }
+ mmsRow.put(Telephony.Mms.DATE, String.valueOf(date));
+ mmsRow.put(Telephony.Mms.DATE_SENT, String.valueOf(dateSent));
+ mmsRow.put(Telephony.Mms.MESSAGE_TYPE, String.valueOf(type));
+ mmsRow.put(Telephony.Mms.MMS_VERSION, String.valueOf(version));
+ mmsRow.put(Telephony.Mms.TEXT_ONLY, textOnly);
+ mmsRow.put(Telephony.Mms.MESSAGE_BOX, String.valueOf(msgBox));
+ if (contentLocation != null) {
+ mmsRow.put(Telephony.Mms.CONTENT_LOCATION, contentLocation);
+ }
+ mmsRow.put(Telephony.Mms.THREAD_ID, threadId);
+
+ final Uri partUri = Telephony.Mms.CONTENT_URI.buildUpon().appendPath(String.valueOf(id)).
+ appendPath("part").build();
+ mCursors.put(partUri, createBodyCursor(body, bodyCharset));
+ mMmsAllContentValues.add(mmsRow);
+
+ final Uri addrUri = Telephony.Mms.CONTENT_URI.buildUpon().appendPath(String.valueOf(id)).
+ appendPath("addr").build();
+ mCursors.put(addrUri, createAddrCursor(addresses));
+
+ return mmsRow;
+ }
+
+ private static final String APP_SMIL = "application/smil";
+ private static final String TEXT_PLAIN = "text/plain";
+
+ // Cursor with parts of Mms.
+ private FakeCursor createBodyCursor(String body, int charset) {
+ List<ContentValues> table = new ArrayList<>();
+
+ final String srcName = String.format("text.%06d.txt", 0);
+ final String smilBody = String.format(TelephonyBackupAgent.sSmilTextPart, srcName);
+ final String smil = String.format(TelephonyBackupAgent.sSmilTextOnly, smilBody);
+
+ final ContentValues smilPart = new ContentValues();
+ smilPart.put(Telephony.Mms.Part.SEQ, -1);
+ smilPart.put(Telephony.Mms.Part.CONTENT_TYPE, APP_SMIL);
+ smilPart.put(Telephony.Mms.Part.NAME, "smil.xml");
+ smilPart.put(Telephony.Mms.Part.CONTENT_ID, "<smil>");
+ smilPart.put(Telephony.Mms.Part.CONTENT_LOCATION, "smil.xml");
+ smilPart.put(Telephony.Mms.Part.TEXT, smil);
+ table.add(smilPart); // This part should not be backed up.
+ mMmsAllContentValues.add(smilPart);
+
+ final ContentValues bodyPart = new ContentValues();
+ bodyPart.put(Telephony.Mms.Part.SEQ, 0);
+ bodyPart.put(Telephony.Mms.Part.CONTENT_TYPE, TEXT_PLAIN);
+ bodyPart.put(Telephony.Mms.Part.NAME, srcName);
+ bodyPart.put(Telephony.Mms.Part.CONTENT_ID, "<"+srcName+">");
+ bodyPart.put(Telephony.Mms.Part.CONTENT_LOCATION, srcName);
+ bodyPart.put(Telephony.Mms.Part.CHARSET, charset);
+ bodyPart.put(Telephony.Mms.Part.TEXT, body);
+ table.add(bodyPart);
+ mMmsAllContentValues.add(bodyPart);
+
+ return new FakeCursor(table, TelephonyBackupAgent.MMS_TEXT_PROJECTION);
+ }
+
+ // Cursor with addresses of Mms.
+ private FakeCursor createAddrCursor(String[] addresses) {
+ List<ContentValues> table = new ArrayList<>();
+ for (int i=0; i<addresses.length; ++i) {
+ ContentValues addr = new ContentValues();
+ addr.put(Telephony.Mms.Addr.TYPE, 10+i);
+ addr.put(Telephony.Mms.Addr.ADDRESS, addresses[i]);
+ addr.put(Telephony.Mms.Addr.CHARSET, 100+i);
+ mMmsAllContentValues.add(addr);
+ table.add(addr);
+ }
+ return new FakeCursor(table, TelephonyBackupAgent.MMS_ADDR_PROJECTION);
+ }
+
+ /**
+ * Test with no sms in the provider.
+ * @throws Exception
+ */
+ public void testBackupSms_NoSms() throws Exception {
+ TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
+ new JsonWriter(mStringWriter), new ThreadProvider(), 1);
+ assertEquals(EMPTY_JSON_ARRAY, mStringWriter.toString());
+ }
+
+ /**
+ * Test with 3 sms in the provider with the limit per file 4.
+ * @throws Exception
+ */
+
+ public void DISABLED_testBackupSms_AllSms() throws Exception {
+ mSmsTable.addAll(Arrays.asList(mSmsRows));
+ TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
+ new JsonWriter(mStringWriter), new ThreadProvider(), 4);
+ final String expected =
+ "[" + mSmsJson[0] + "," + mSmsJson[1] + "," + mSmsJson[2] + "]";
+ assertEquals(expected, mStringWriter.toString());
+ }
+
+ /**
+ * Test with 3 sms in the provider with the limit per file 3.
+ * @throws Exception
+ */
+ public void DISABLED_testBackupSms_AllSmsWithExactFileLimit() throws Exception {
+ mSmsTable.addAll(Arrays.asList(mSmsRows));
+ TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
+ new JsonWriter(mStringWriter), new ThreadProvider(), 3);
+ final String expected =
+ "[" + mSmsJson[0] + "," + mSmsJson[1] + "," + mSmsJson[2] + "]";
+ assertEquals(expected, mStringWriter.toString());
+ }
+
+ /**
+ * Test with 3 sms in the provider with the limit per file 1.
+ * @throws Exception
+ */
+ public void DISABLED_testBackupSms_AllSmsOneMessagePerFile() throws Exception {
+ mSmsTable.addAll(Arrays.asList(mSmsRows));
+ TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
+ new JsonWriter(mStringWriter), new ThreadProvider(), 1);
+ assertEquals("[" + mSmsJson[0] + "]", mStringWriter.toString());
+
+ mStringWriter = new StringWriter();
+ TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
+ new JsonWriter(mStringWriter), new ThreadProvider(), 1);
+ assertEquals("[" + mSmsJson[1] + "]", mStringWriter.toString());
+
+ mStringWriter = new StringWriter();
+ TelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, mSubId2Phone,
+ new JsonWriter(mStringWriter), new ThreadProvider(), 1);
+ assertEquals("[" + mSmsJson[2] + "]", mStringWriter.toString());
+ }
+
+ /**
+ * Test with no mms in the pvovider.
+ * @throws Exception
+ */
+ public void testBackupMms_NoMms() throws Exception {
+ TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
+ new JsonWriter(mStringWriter), 4);
+ assertEquals(EMPTY_JSON_ARRAY, mStringWriter.toString());
+ }
+
+ /**
+ * Test with all mms.
+ * @throws Exception
+ */
+ public void testBackupMms_AllMms() throws Exception {
+ mMmsTable.addAll(Arrays.asList(mMmsRows));
+ mMmsTable.add(mMmsNonText);
+ TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
+ new JsonWriter(mStringWriter), 4);
+ final String expected =
+ "[" + mMmsJson[0] + "," + mMmsJson[1] + "," + mMmsJson[2] + "]";
+ assertEquals(expected, mStringWriter.toString());
+ }
+
+ /**
+ * Test with 3 mms in the provider with the limit per file 1.
+ * @throws Exception
+ */
+ public void testBackupMms_OneMessagePerFile() throws Exception {
+ mMmsTable.addAll(Arrays.asList(mMmsRows));
+ TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
+ new JsonWriter(mStringWriter), 1);
+ assertEquals("[" + mMmsJson[0] + "]", mStringWriter.toString());
+
+ mStringWriter = new StringWriter();
+ TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
+ new JsonWriter(mStringWriter), 1);
+ assertEquals("[" + mMmsJson[1] + "]", mStringWriter.toString());
+
+ mStringWriter = new StringWriter();
+ TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
+ new JsonWriter(mStringWriter), 2);
+ assertEquals("[" + mMmsJson[2] + "]", mStringWriter.toString());
+ }
+
+ /**
+ * Test with 3 mms in the provider with the limit per file 3.
+ * @throws Exception
+ */
+ public void testBackupMms_WithExactFileLimit() throws Exception {
+ mMmsTable.addAll(Arrays.asList(mMmsRows));
+ TelephonyBackupAgent.putMmsMessagesToJson(mMmsCursor, mContentProvider, mSubId2Phone,
+ new JsonWriter(mStringWriter), 3);
+ final String expected =
+ "[" + mMmsJson[0] + "," + mMmsJson[1] + "," + mMmsJson[2] + "]";
+ assertEquals(expected, mStringWriter.toString());
+ }
+
+ /**
+ * Test restore sms with the empty json array "[]".
+ * @throws Exception
+ */
+ public void testRestoreSms_NoSms() throws Exception {
+ JsonReader jsonReader = new JsonReader(new StringReader(EMPTY_JSON_ARRAY));
+ FakeSmsProvider smsProvider = new FakeSmsProvider(null);
+ TelephonyBackupAgent.putSmsMessagesToProvider(jsonReader, smsProvider,
+ new ThreadProvider(), mPhone2SubId);
+ assertEquals(0, smsProvider.getRowsAdded());
+ }
+
+ /**
+ * Test restore sms with three sms json object in the array.
+ * @throws Exception
+ */
+ public void DISABLED_testRestoreSms_AllSms() throws Exception {
+ JsonReader jsonReader = new JsonReader(new StringReader(mAllSmsJson));
+ FakeSmsProvider smsProvider = new FakeSmsProvider(mSmsRows);
+ TelephonyBackupAgent.putSmsMessagesToProvider(jsonReader, smsProvider,
+ new ThreadProvider(), mPhone2SubId);
+ assertEquals(mSmsRows.length, smsProvider.getRowsAdded());
+ }
+
+ /**
+ * Test restore mms with the empty json array "[]".
+ * @throws Exception
+ */
+ public void testRestoreMms_NoMms() throws Exception {
+ JsonReader jsonReader = new JsonReader(new StringReader(EMPTY_JSON_ARRAY));
+ FakeMmsProvider mmsProvider = new FakeMmsProvider(null);
+ TelephonyBackupAgent.putMmsMessagesToProvider(jsonReader, mmsProvider,
+ new ThreadProvider(), mPhone2SubId);
+ assertEquals(0, mmsProvider.getRowsAdded());
+ }
+
+ /**
+ * Test restore sms with three mms json object in the array.
+ * @throws Exception
+ */
+ public void testRestoreMms_AllMms() throws Exception {
+ JsonReader jsonReader = new JsonReader(new StringReader(mAllMmsJson));
+ FakeMmsProvider mmsProvider = new FakeMmsProvider(mMmsAllContentValues);
+ TelephonyBackupAgent.putMmsMessagesToProvider(jsonReader, mmsProvider,
+ new ThreadProvider(), mPhone2SubId);
+ assertEquals(15, mmsProvider.getRowsAdded());
+ }
+
+ /**
+ * class for checking sms insertion into the provider on restore.
+ */
+ private class FakeSmsProvider extends MockContentProvider {
+ private int nextRow = 0;
+ private ContentValues[] mSms;
+
+ public FakeSmsProvider(ContentValues[] sms) {
+ this.mSms = sms;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ assertEquals(Telephony.Sms.CONTENT_URI, uri);
+ ContentValues modifiedValues = new ContentValues(mSms[nextRow++]);
+ modifiedValues.remove(Telephony.Sms._ID);
+ modifiedValues.put(Telephony.Sms.READ, 1);
+ modifiedValues.put(Telephony.Sms.SEEN, 1);
+ if (mSubId2Phone.get(modifiedValues.getAsInteger(Telephony.Sms.SUBSCRIPTION_ID))
+ == null) {
+ modifiedValues.put(Telephony.Sms.SUBSCRIPTION_ID, -1);
+ }
+
+ assertEquals(modifiedValues, values);
+ return null;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ public int getRowsAdded() {
+ return nextRow;
+ }
+ }
+
+ /**
+ * class for checking mms insertion into the provider on restore.
+ */
+ private class FakeMmsProvider extends MockContentProvider {
+ private int nextRow = 0;
+ private List<ContentValues> mValues;
+ private long mDummyMsgId = -1;
+ private long mMsgId = -1;
+
+ public FakeMmsProvider(List<ContentValues> values) {
+ this.mValues = values;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ Uri retUri = Uri.parse("dummy_uri");
+ ContentValues modifiedValues = new ContentValues(mValues.get(nextRow++));
+ if (APP_SMIL.equals(values.get(Telephony.Mms.Part.CONTENT_TYPE))) {
+ // Smil part.
+ assertEquals(-1, mDummyMsgId);
+ mDummyMsgId = values.getAsLong(Telephony.Mms.Part.MSG_ID);
+ }
+
+ if (values.get(Telephony.Mms.Part.SEQ) != null) {
+ // Part of mms.
+ final Uri expectedUri = Telephony.Mms.CONTENT_URI.buildUpon()
+ .appendPath(String.valueOf(mDummyMsgId))
+ .appendPath("part")
+ .build();
+ assertEquals(expectedUri, uri);
+ }
+
+ if (values.get(Telephony.Mms.Part.MSG_ID) != null) {
+ modifiedValues.put(Telephony.Mms.Part.MSG_ID, mDummyMsgId);
+ }
+
+
+ if (values.get(Telephony.Mms.SUBSCRIPTION_ID) != null) {
+ assertEquals(Telephony.Mms.CONTENT_URI, uri);
+ if (mSubId2Phone.get(modifiedValues.getAsInteger(Telephony.Sms.SUBSCRIPTION_ID))
+ == null) {
+ modifiedValues.put(Telephony.Sms.SUBSCRIPTION_ID, -1);
+ }
+ // Mms.
+ modifiedValues.put(Telephony.Mms.READ, 1);
+ modifiedValues.put(Telephony.Mms.SEEN, 1);
+ mMsgId = modifiedValues.getAsInteger(BaseColumns._ID);
+ retUri = Uri.withAppendedPath(Telephony.Mms.CONTENT_URI, String.valueOf(mMsgId));
+ modifiedValues.remove(BaseColumns._ID);
+ }
+
+ if (values.get(Telephony.Mms.Addr.ADDRESS) != null) {
+ // Address.
+ final Uri expectedUri = Telephony.Mms.CONTENT_URI.buildUpon()
+ .appendPath(String.valueOf(mMsgId))
+ .appendPath("addr")
+ .build();
+ assertEquals(expectedUri, uri);
+ assertNotSame(-1, mMsgId);
+ modifiedValues.put(Telephony.Mms.Addr.MSG_ID, mMsgId);
+ mDummyMsgId = -1;
+ }
+
+ for (String key : modifiedValues.keySet()) {
+ assertEquals(modifiedValues.get(key), values.get(key));
+ }
+ assertEquals(modifiedValues.size(), values.size());
+ return retUri;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ final Uri expectedUri = Telephony.Mms.CONTENT_URI.buildUpon()
+ .appendPath(String.valueOf(mDummyMsgId))
+ .appendPath("part")
+ .build();
+ assertEquals(expectedUri, uri);
+ ContentValues expected = new ContentValues();
+ expected.put(Telephony.Mms.Part.MSG_ID, mMsgId);
+ assertEquals(expected, values);
+ return 2;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ public int getRowsAdded() {
+ return nextRow;
+ }
+ }
+
+ /**
+ * class that implements MmsSms provider for thread ids.
+ */
+ private static class ThreadProvider extends MockContentProvider {
+
+ Map<List<String>, Integer> threadIds;
+
+ public ThreadProvider() {
+ threadIds = new ArrayMap<>();
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ List<String> recipients = uri.getQueryParameters("recipient");
+ int threadId = threadIds.size() + 1;
+ if (threadIds.containsKey(recipients)) {
+ threadId = threadIds.get(recipients);
+ } else {
+ threadIds.put(recipients, threadId);
+ }
+
+ List<ContentValues> table = new ArrayList<>();
+ ContentValues row = new ContentValues();
+ row.put(BaseColumns._ID, String.valueOf(threadId));
+ table.add(row);
+ return new FakeCursor(table, projection);
+ }
+ }
+
+ /**
+ * general cursor for serving queries.
+ */
+ private static class FakeCursor extends MockCursor {
+ String[] projection;
+ List<ContentValues> rows;
+ int nextRow = -1;
+
+ public FakeCursor(List<ContentValues> rows, String[] projection) {
+ this.projection = projection;
+ this.rows = rows;
+ }
+
+ public void setProjection(String[] projection) {
+ this.projection = projection;
+ }
+
+ @Override
+ public int getColumnCount() {
+ return projection.length;
+ }
+
+ @Override
+ public String getColumnName(int columnIndex) {
+ return projection[columnIndex];
+ }
+
+ @Override
+ public String getString(int columnIndex) {
+ return rows.get(nextRow).getAsString(projection[columnIndex]);
+ }
+
+ @Override
+ public int getInt(int columnIndex) {
+ return rows.get(nextRow).getAsInteger(projection[columnIndex]);
+ }
+
+ @Override
+ public long getLong(int columnIndex) {
+ return rows.get(nextRow).getAsLong(projection[columnIndex]);
+ }
+
+ @Override
+ public boolean isAfterLast() {
+ return nextRow >= getCount();
+ }
+
+ @Override
+ public boolean isLast() {
+ return nextRow == getCount() - 1;
+ }
+
+ @Override
+ public boolean moveToFirst() {
+ nextRow = 0;
+ return getCount() > 0;
+ }
+
+ @Override
+ public boolean moveToNext() {
+ return getCount() > ++nextRow;
+ }
+
+ @Override
+ public int getCount() {
+ return rows.size();
+ }
+
+ @Override
+ public int getColumnIndex(String columnName) {
+ for (int i=0; i<projection.length; ++i) {
+ if (columnName.equals(projection[i])) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ @Override
+ public void close() {
+ }
+ }
+}