Merge "Add OWNERS in packages/providers/MediaProvider"
am: 9d168e54f9

Change-Id: I1ea49f1dc0b94571b5789ef3981980fe692b746f
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 1d8c46d..1ea883a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -3,7 +3,7 @@
         android:sharedUserId="android.media"
         android:sharedUserLabel="@string/uid_label"
         android:versionCode="800">
-        
+
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
@@ -28,6 +28,7 @@
 
         <provider
             android:name="MediaDocumentsProvider"
+            android:label="@string/storage_description"
             android:authorities="com.android.providers.media.documents"
             android:grantUriPermissions="true"
             android:exported="true"
diff --git a/res/drawable/ic_add.xml b/res/drawable/ic_add.xml
new file mode 100644
index 0000000..22b3fe9
--- /dev/null
+++ b/res/drawable/ic_add.xml
@@ -0,0 +1,24 @@
+<!--
+    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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:fillColor="?android:attr/colorAccent"
+        android:pathData="M38.0,26.0L26.0,26.0l0.0,12.0l-4.0,0.0L22.0,26.0L10.0,26.0l0.0,-4.0l12.0,0.0L22.0,10.0l4.0,0.0l0.0,12.0l12.0,0.0l0.0,4.0z"/>
+</vector>
\ No newline at end of file
diff --git a/res/layout/add_ringtone_item.xml b/res/layout/add_ringtone_item.xml
new file mode 100644
index 0000000..aea1a2b
--- /dev/null
+++ b/res/layout/add_ringtone_item.xml
@@ -0,0 +1,47 @@
+<?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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center_vertical"
+    android:background="?android:attr/selectableItemBackground">
+
+<ImageView
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:scaleType="centerCrop"
+        android:layout_marginRight="24dp"
+        android:layout_marginLeft="24dp"
+        android:src="@drawable/ic_add" />
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/add_ringtone_text"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="?android:attr/listPreferredItemHeightSmall"
+        android:text="@string/add_ringtone_text"
+        android:textColor="?android:attr/colorAccent"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:maxLines="3"
+        android:gravity="center_vertical"
+        android:paddingEnd="?android:attr/dialogPreferredPadding"
+        android:drawablePadding="20dp"
+        android:ellipsize="marquee" />
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/radio_with_work_badge.xml b/res/layout/radio_with_work_badge.xml
new file mode 100644
index 0000000..e7d37ea
--- /dev/null
+++ b/res/layout/radio_with_work_badge.xml
@@ -0,0 +1,48 @@
+<?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.
+-->
+
+<com.android.providers.media.CheckedListItem xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center_vertical"
+    android:background="?android:attr/selectableItemBackground"
+    >
+
+    <CheckedTextView
+        android:id="@+id/checked_text_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="?android:attr/listPreferredItemHeightSmall"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textColor="?android:attr/textColorAlertDialogListItem"
+        android:gravity="center_vertical"
+        android:paddingStart="20dp"
+        android:paddingEnd="?android:attr/dialogPreferredPadding"
+        android:drawableStart="?android:attr/listChoiceIndicatorSingle"
+        android:drawablePadding="20dp"
+        android:ellipsize="marquee"
+        android:layout_toLeftOf="@+id/work_icon"
+        android:maxLines="3" />
+
+    <ImageView
+        android:id="@id/work_icon"
+        android:layout_width="18dp"
+        android:layout_height="18dp"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:scaleType="centerCrop"
+        android:layout_marginRight="20dp" />
+</com.android.providers.media.CheckedListItem>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index edeb9dc..1523a83 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Plaaslike berging"</string>
     <string name="app_label" msgid="9035307001052716210">"Mediaberging"</string>
     <string name="artist_label" msgid="8105600993099120273">"Kunstenaar"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Verstekluitoon"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Opstaan"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Slinger"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Swaai"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Voeg luitoon by"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Vee uit"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Kan nie gepasmaakte luitoon byvoeg nie"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Kan nie gepasmaakte luitoon uitvee nie"</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 4632c85..8460f36 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"ማህደረመረጃ"</string>
+    <string name="storage_description" msgid="4081716890357580107">"አካባቢያዊ ማከማቻ"</string>
     <string name="app_label" msgid="9035307001052716210">"ማህደረ መረጃ ማከማቻ"</string>
     <string name="artist_label" msgid="8105600993099120273">"አርቲስት"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"ነባሪ የደወል ቅላጼ"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"ተነሳ"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"ተወዛወዝ"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"አወዛውዝ"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"የጥሪ ቅላጼ አክል"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"ሰርዝ"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"ብጁ የጥሪ ቅላጼን ማከል አልተቻለም"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"ብጁ የጥሪ ቅላጼን መሰረዝ አልተቻለም"</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index ea90bee..656c4d2 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.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.
@@ -17,10 +17,11 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"الوسائط"</string>
+    <string name="storage_description" msgid="4081716890357580107">"التخزين المحلي"</string>
     <string name="app_label" msgid="9035307001052716210">"تخزين الوسائط"</string>
     <string name="artist_label" msgid="8105600993099120273">"الفنان"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"نغمة الرنين الافتراضية"</string>
-    <string name="notification_sound_default" msgid="6541609166469990135">"صوت الإشعار الافتراضي"</string>
+    <string name="notification_sound_default" msgid="6541609166469990135">"صوت الإشعار التلقائي"</string>
     <string name="alarm_sound_default" msgid="5488847775252870314">"صوت التنبيه الافتراضي"</string>
     <string name="root_images" msgid="5861633549189045666">"الصور"</string>
     <string name="root_videos" msgid="8792703517064649453">"مقاطع الفيديو"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"ارتفاع"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"تأرجُح"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"اهتزاز"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"إضافة نغمة رنين"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"حذف"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"يتعذر إضافة نغمة رنين مخصصة"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"يتعذر حذف نغمة الرنين المخصصة"</string>
 </resources>
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az/strings.xml
similarity index 81%
rename from res/values-az-rAZ/strings.xml
rename to res/values-az/strings.xml
index e865602..27795d7 100644
--- a/res/values-az-rAZ/strings.xml
+++ b/res/values-az/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Yerli yaddaş"</string>
     <string name="app_label" msgid="9035307001052716210">"Media Yaddaşı"</string>
     <string name="artist_label" msgid="8105600993099120273">"Sənətçi"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Defolt rinqton"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Ucalan tempdə"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Yellənmə"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Fırlatma"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Zəng səsi daxil edin"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Silin"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Fərdi zəng səsi əlavə etmək mümkün deyil"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Fərdi zəng səsini silmək mümkün deyil"</string>
 </resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 9477acc..a222597 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.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.
@@ -16,13 +16,28 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="uid_label" msgid="999888504096344278">"Mediji"</string>
-    <string name="app_label" msgid="581696352855930028">"Skladište za medije"</string>
-    <string name="artist_label" msgid="1181678850424271227">"Izvođač"</string>
-    <string name="ringtone_default" msgid="3332469542084549546">"Podrazumevana melodija zvona"</string>
-    <string name="notification_sound_default" msgid="5309766396223094324">"Podrazumevani zvuk obaveštenja"</string>
-    <string name="alarm_sound_default" msgid="6854264112790616066">"Podrazumevani zvuk alarma"</string>
-    <string name="root_images" msgid="7098113056247445324">"Slike"</string>
-    <string name="root_videos" msgid="3304457332406057833">"Video snimci"</string>
-    <string name="root_audio" msgid="7177565505195715659">"Zvuk"</string>
+    <string name="uid_label" msgid="8421971615411294156">"Mediji"</string>
+    <!-- no translation found for storage_description (4081716890357580107) -->
+    <skip />
+    <string name="app_label" msgid="9035307001052716210">"Memorijski prostor za medije"</string>
+    <string name="artist_label" msgid="8105600993099120273">"Izvođač"</string>
+    <string name="ringtone_default" msgid="1744846699922263043">"Podrazumevana melodija zvona"</string>
+    <string name="notification_sound_default" msgid="6541609166469990135">"Podrazumevani zvuk obaveštenja"</string>
+    <string name="alarm_sound_default" msgid="5488847775252870314">"Podrazumevani zvuk alarma"</string>
+    <string name="root_images" msgid="5861633549189045666">"Slike"</string>
+    <string name="root_videos" msgid="8792703517064649453">"Video snimci"</string>
+    <string name="root_audio" msgid="3505830755201326018">"Zvuk"</string>
+    <string name="sound_name_awaken" msgid="5266892392848526147">"probuđen"</string>
+    <string name="sound_name_bounce" msgid="8771447635446665231">"skok"</string>
+    <string name="sound_name_drip" msgid="1744684469020662152">"kapanje"</string>
+    <string name="sound_name_gallop" msgid="2664454314532060876">"galop"</string>
+    <string name="sound_name_nudge" msgid="5445751598250698244">"gurkanje"</string>
+    <string name="sound_name_orbit" msgid="4623457897813255481">"kruženje"</string>
+    <string name="sound_name_rise" msgid="2200258555031675806">"uspon"</string>
+    <string name="sound_name_sway" msgid="348448316663085643">"njihanje"</string>
+    <string name="sound_name_wag" msgid="2730733083078126563">"mahanje"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Dodaj melodiju zvona"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Izbriši"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Dodavanje prilagođene melodije zvona nije uspelo"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Brisanje prilagođene melodije zvona nije uspelo"</string>
 </resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
new file mode 100644
index 0000000..df6f17e
--- /dev/null
+++ b/res/values-be/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2009 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="uid_label" msgid="8421971615411294156">"Медыя"</string>
+    <!-- no translation found for storage_description (4081716890357580107) -->
+    <skip />
+    <string name="app_label" msgid="9035307001052716210">"Медыясховішча"</string>
+    <string name="artist_label" msgid="8105600993099120273">"Выканаўца"</string>
+    <string name="ringtone_default" msgid="1744846699922263043">"Стандартны рынгтон"</string>
+    <string name="notification_sound_default" msgid="6541609166469990135">"Стандартны сігнал апавяшчэння"</string>
+    <string name="alarm_sound_default" msgid="5488847775252870314">"Стандартны сігнал будзільніка"</string>
+    <string name="root_images" msgid="5861633549189045666">"Відарысы"</string>
+    <string name="root_videos" msgid="8792703517064649453">"Відэа"</string>
+    <string name="root_audio" msgid="3505830755201326018">"Аўдыя"</string>
+    <string name="sound_name_awaken" msgid="5266892392848526147">"Абуджэнне"</string>
+    <string name="sound_name_bounce" msgid="8771447635446665231">"Адскок"</string>
+    <string name="sound_name_drip" msgid="1744684469020662152">"Кроплі"</string>
+    <string name="sound_name_gallop" msgid="2664454314532060876">"Галоп"</string>
+    <string name="sound_name_nudge" msgid="5445751598250698244">"Штуршок"</string>
+    <string name="sound_name_orbit" msgid="4623457897813255481">"Арбіта"</string>
+    <string name="sound_name_rise" msgid="2200258555031675806">"Уздым"</string>
+    <string name="sound_name_sway" msgid="348448316663085643">"Гайданне"</string>
+    <string name="sound_name_wag" msgid="2730733083078126563">"Маханне"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Дадаць рынгтон"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Выдаліць"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Немагчыма дадаць карыстальніцкі рынгтон"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Немагчыма выдаліць карыстальніцкі рынгтон"</string>
+</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 67a3898..90e0231 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Мултимедия"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Локално хранилище"</string>
     <string name="app_label" msgid="9035307001052716210">"Мултимедийно хранилище"</string>
     <string name="artist_label" msgid="8105600993099120273">"Изпълнител"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Стандартна мелодия"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Издигане"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Люлеене"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Поклащане"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Добавяне на мелодия"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Изтриване"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Персонализираната мелодия не може да се добави"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Персонализираната мелодия не може да се изтрие"</string>
 </resources>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn/strings.xml
similarity index 79%
rename from res/values-bn-rBD/strings.xml
rename to res/values-bn/strings.xml
index 877d10d..155e44f 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"মিডিয়া"</string>
+    <string name="storage_description" msgid="4081716890357580107">"স্থানীয় সঞ্চয়স্থান"</string>
     <string name="app_label" msgid="9035307001052716210">"মিডিয়া সঞ্চয়স্থান"</string>
     <string name="artist_label" msgid="8105600993099120273">"শিল্পী"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"ডিফল্ট রিংয়ের শব্দ"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"রাইজ"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"দোলা"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"ওয়াগ"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"রিংটোন যোগ করুন"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"মুছুন"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"কাস্টম রিংটোন যোগ করা গেল না"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"কাস্টম রিংয়ের শব্দ মোছা গেল না"</string>
 </resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
new file mode 100644
index 0000000..beed01f
--- /dev/null
+++ b/res/values-bs/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2009 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="uid_label" msgid="8421971615411294156">"Mediji"</string>
+    <!-- no translation found for storage_description (4081716890357580107) -->
+    <skip />
+    <string name="app_label" msgid="9035307001052716210">"Medijska pohrana"</string>
+    <string name="artist_label" msgid="8105600993099120273">"Umjetnik"</string>
+    <string name="ringtone_default" msgid="1744846699922263043">"Zadana melodija zvona"</string>
+    <string name="notification_sound_default" msgid="6541609166469990135">"Zadani zvuk obavještenja"</string>
+    <string name="alarm_sound_default" msgid="5488847775252870314">"Zadani zvuk alarma"</string>
+    <string name="root_images" msgid="5861633549189045666">"Slike"</string>
+    <string name="root_videos" msgid="8792703517064649453">"Videozapisi"</string>
+    <string name="root_audio" msgid="3505830755201326018">"Zvuk"</string>
+    <string name="sound_name_awaken" msgid="5266892392848526147">"Probuđen"</string>
+    <string name="sound_name_bounce" msgid="8771447635446665231">"Odskakanje"</string>
+    <string name="sound_name_drip" msgid="1744684469020662152">"Kapanje"</string>
+    <string name="sound_name_gallop" msgid="2664454314532060876">"Galop"</string>
+    <string name="sound_name_nudge" msgid="5445751598250698244">"Gurkanje"</string>
+    <string name="sound_name_orbit" msgid="4623457897813255481">"Kruženje"</string>
+    <string name="sound_name_rise" msgid="2200258555031675806">"Uspon"</string>
+    <string name="sound_name_sway" msgid="348448316663085643">"Njihanje"</string>
+    <string name="sound_name_wag" msgid="2730733083078126563">"Klaćenje"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Dodaj melodiju zvona"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Izbriši"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Nije moguće dodati prilagođenu melodiju zvona"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Nije moguće izbrisati prilagođenu melodiju zvona"</string>
+</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index fadb4e8..628b67d 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multimèdia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Emmagatzematge local"</string>
     <string name="app_label" msgid="9035307001052716210">"Emmagatzematge multimèdia"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artista"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"So de trucada predeterminat"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Afegeix un so de trucada"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Suprimeix"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"No es pot afegir el so de trucada personalitzat"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"No es pot suprimir el so de trucada personalitzat"</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index f5d613d..68389f4 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Média"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Místní úložiště"</string>
     <string name="app_label" msgid="9035307001052716210">"Úložiště médií"</string>
     <string name="artist_label" msgid="8105600993099120273">"Interpret"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Výchozí vyzváněcí tón"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Vzestup"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Rozhoupání"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Pochod"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Přidat vyzváněcí tón"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Smazat"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Vlastní vyzváněcí tón se nepodařilo přidat"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Vlastní vyzváněcí tón se nepodařilo smazat"</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 7b7129a..336f229 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Medier"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Lokalt lager"</string>
     <string name="app_label" msgid="9035307001052716210">"Medielagring"</string>
     <string name="artist_label" msgid="8105600993099120273">"Musiker"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Standardringetone"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Tilføj ringetone"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Slet"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Den tilpassede ringetone kunne ikke tilføjes"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Den tilpassede ringetone kunne ikke slettes"</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 54f71fd..5fbd904 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Medien"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Lokaler Speicher"</string>
     <string name="app_label" msgid="9035307001052716210">"Medienspeicher"</string>
     <string name="artist_label" msgid="8105600993099120273">"Interpret"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Standard-Klingelton"</string>
@@ -24,7 +25,7 @@
     <string name="alarm_sound_default" msgid="5488847775252870314">"Standard-Weckton"</string>
     <string name="root_images" msgid="5861633549189045666">"Bilder"</string>
     <string name="root_videos" msgid="8792703517064649453">"Videos"</string>
-    <string name="root_audio" msgid="3505830755201326018">"Audiodateien"</string>
+    <string name="root_audio" msgid="3505830755201326018">"Audio"</string>
     <string name="sound_name_awaken" msgid="5266892392848526147">"Awaken"</string>
     <string name="sound_name_bounce" msgid="8771447635446665231">"Bounce"</string>
     <string name="sound_name_drip" msgid="1744684469020662152">"Drip"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Klingelton hinzufügen"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Löschen"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Benutzerdefinierter Klingelton konnte nicht hinzugefügt werden"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Benutzerdefinierter Klingelton konnte nicht gelöscht werden"</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 6bc4770..2a0e141 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Μέσα"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Τοπικός χώρος αποθήκευσης"</string>
     <string name="app_label" msgid="9035307001052716210">"Αποθηκευτικός χώρος μέσων"</string>
     <string name="artist_label" msgid="8105600993099120273">"Καλλιτέχνης"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Προεπιλεγμένος ήχος κλήσης"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Σήκωμα"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Χαλάρωση"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Κούνημα"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Προσθήκη ήχου κλήσης"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Διαγραφή"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Δεν είναι δυνατή η προσθήκη προσαρμοσμένου ήχου κλήσης"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Δεν είναι δυνατή η διαγραφή προσαρμοσμένου ήχου κλήσης"</string>
 </resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 72a2563..f6104c8 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Local storage"</string>
     <string name="app_label" msgid="9035307001052716210">"Media Storage"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artist"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Default ringtone"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Add ringtone"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Delete"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Unable to add customised ringtone"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Unable to delete customised ringtone"</string>
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 72a2563..f6104c8 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Local storage"</string>
     <string name="app_label" msgid="9035307001052716210">"Media Storage"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artist"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Default ringtone"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Add ringtone"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Delete"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Unable to add customised ringtone"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Unable to delete customised ringtone"</string>
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 72a2563..f6104c8 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Local storage"</string>
     <string name="app_label" msgid="9035307001052716210">"Media Storage"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artist"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Default ringtone"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Add ringtone"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Delete"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Unable to add customised ringtone"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Unable to delete customised ringtone"</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 4933a9e..0586775 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multimedia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Almacenamiento local"</string>
     <string name="app_label" msgid="9035307001052716210">"Almacenamiento multimedia"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artista"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Tono predeterminado"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Agregar tono"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Borrar"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"No se puede agregar el tono personalizado"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"No se puede borrar el tono personalizado"</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index d5c1d40..6fa3d45 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multimedia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Almacenamiento local"</string>
     <string name="app_label" msgid="9035307001052716210">"Almacenamiento multimedia"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artista"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Tono de llamada predeterminado"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Añadir tono de llamada"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Eliminar"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"No se ha podido añadir un tono de llamada personalizado"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"No se ha podido eliminar un tono de llamada personalizado"</string>
 </resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et/strings.xml
similarity index 78%
rename from res/values-et-rEE/strings.xml
rename to res/values-et/strings.xml
index 9421959..5e2b984 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et/strings.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.
@@ -17,12 +17,13 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Meedia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Kohalik salvestusruum"</string>
     <string name="app_label" msgid="9035307001052716210">"Meediumi salvestusruum"</string>
     <string name="artist_label" msgid="8105600993099120273">"Esitaja"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Vaikehelin"</string>
     <string name="notification_sound_default" msgid="6541609166469990135">"Märguande vaikeheli"</string>
     <string name="alarm_sound_default" msgid="5488847775252870314">"Äratuse vaikeheli"</string>
-    <string name="root_images" msgid="5861633549189045666">"Kujutised"</string>
+    <string name="root_images" msgid="5861633549189045666">"Pildid"</string>
     <string name="root_videos" msgid="8792703517064649453">"Videod"</string>
     <string name="root_audio" msgid="3505830755201326018">"Heli"</string>
     <string name="sound_name_awaken" msgid="5266892392848526147">"Äratus"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Tõus"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Kõigutus"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Raputus"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Lisa helin"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Kustuta"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Kohandatud helinat ei õnnestu lisada"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Kohandatud helinat ei õnnestu kustutada"</string>
 </resources>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu/strings.xml
similarity index 80%
rename from res/values-eu-rES/strings.xml
rename to res/values-eu/strings.xml
index fb1770d..2e8033c 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu/strings.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.
@@ -17,10 +17,11 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multimedia-edukia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Biltegi lokala"</string>
     <string name="app_label" msgid="9035307001052716210">"Multimediaren memoria-unitatea"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artista"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Tonu lehenetsia"</string>
-    <string name="notification_sound_default" msgid="6541609166469990135">"Jakinarazpen-soinu lehenetsia"</string>
+    <string name="notification_sound_default" msgid="6541609166469990135">"Jakinarazpenen soinu lehenetsia"</string>
     <string name="alarm_sound_default" msgid="5488847775252870314">"Alarmaren soinu lehenetsia"</string>
     <string name="root_images" msgid="5861633549189045666">"Irudiak"</string>
     <string name="root_videos" msgid="8792703517064649453">"Bideoak"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Igoera"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Kulunka"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Mugimendua"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Gehitu tonua"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Ezabatu"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Ezin da gehitu tonu pertsonalizatua"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Ezin da ezabatu tonu pertsonalizatua"</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 023e6ba..69ac9ef 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"رسانه"</string>
+    <string name="storage_description" msgid="4081716890357580107">"فضای ذخیره‌سازی محلی"</string>
     <string name="app_label" msgid="9035307001052716210">"فضای ذخیره‌سازی رسانه"</string>
     <string name="artist_label" msgid="8105600993099120273">"هنرمند"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"آهنگ زنگ پیش‌فرض"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"طلوع"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"نوسان"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"تکان"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"افزودن آهنگ زنگ"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"حذف"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"افزودن آهنگ زنگ سفارشی ممکن نیست"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"حذف آهنگ زنگ سفارشی ممکن نیست"</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index aea6604..62f76ff 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Paikallinen tallennustila"</string>
     <string name="app_label" msgid="9035307001052716210">"Median tallennustila"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artisti"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Oletussoittoääni"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Nousu"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Keinunta"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Heilutus"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Lisää soittoääni"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Poista"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Muokatun soittoäänen lisääminen epäonnistui."</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Muokatun soittoäänen poistaminen epäonnistui."</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 856974b..f018e2d 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multimédia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Stockage local"</string>
     <string name="app_label" msgid="9035307001052716210">"Stockage multimédia"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artiste"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Sonnerie par défaut"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Accentuer"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Balancement"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Remuer"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Ajouter une sonnerie"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Supprimer"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Impossible d\'ajouter une sonnerie personnalisée"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Impossible de supprimer la sonnerie personnalisée"</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 565e1fe..339ee5b 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multimédia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Stockage local"</string>
     <string name="app_label" msgid="9035307001052716210">"Stockage multimédia"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artiste"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Sonnerie par défaut"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Ajouter une sonnerie"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Supprimer"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Impossible d\'ajouter une sonnerie personnalisée"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Impossible de supprimer la sonnerie personnalisée"</string>
 </resources>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl/strings.xml
similarity index 80%
rename from res/values-gl-rES/strings.xml
rename to res/values-gl/strings.xml
index 66d02d7..eb52aed 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multimedia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Almacenamento local"</string>
     <string name="app_label" msgid="9035307001052716210">"Almacenamento multimedia"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artista"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Ton de chamada predeterminado"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Subir"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Oscilar"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Axitar"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Engadir ton de chamada"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Eliminar"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Non se pode engadir un ton de chamada personalizado"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Non se pode eliminar un ton de chamada personalizado"</string>
 </resources>
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu/strings.xml
similarity index 72%
rename from res/values-gu-rIN/strings.xml
rename to res/values-gu/strings.xml
index 049832e..d27ed29 100644
--- a/res/values-gu-rIN/strings.xml
+++ b/res/values-gu/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"મીડિયા"</string>
+    <string name="storage_description" msgid="4081716890357580107">"સ્થાનિક સ્ટોરેજ"</string>
     <string name="app_label" msgid="9035307001052716210">"મીડિયા સ્ટોરેજ"</string>
     <string name="artist_label" msgid="8105600993099120273">"કલાકાર"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"ડિફોલ્ટ રિંગટોન"</string>
@@ -29,9 +30,13 @@
     <string name="sound_name_bounce" msgid="8771447635446665231">"બાઉન્સ"</string>
     <string name="sound_name_drip" msgid="1744684469020662152">"ટીપાં"</string>
     <string name="sound_name_gallop" msgid="2664454314532060876">"ગૅલપ"</string>
-    <string name="sound_name_nudge" msgid="5445751598250698244">"નજ"</string>
-    <string name="sound_name_orbit" msgid="4623457897813255481">"ઓર્બિટ"</string>
-    <string name="sound_name_rise" msgid="2200258555031675806">"ઉદય"</string>
-    <string name="sound_name_sway" msgid="348448316663085643">"સ્વે"</string>
-    <string name="sound_name_wag" msgid="2730733083078126563">"વૅગ"</string>
+    <string name="sound_name_nudge" msgid="5445751598250698244">"Nudge"</string>
+    <string name="sound_name_orbit" msgid="4623457897813255481">"Orbit"</string>
+    <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
+    <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
+    <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"રિંગટોન ઉમેરો"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"કાઢી નાખો"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"કસ્ટમ રિંગટોન ઉમેરવામાં અસમર્થ"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"કસ્ટમ રિંગટોન કાઢી નાખવામાં અસમર્થ"</string>
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 3eff820..178a059 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"मीडिया"</string>
+    <string name="storage_description" msgid="4081716890357580107">"स्थानीय जगह"</string>
     <string name="app_label" msgid="9035307001052716210">"मीडिया मेमोरी"</string>
     <string name="artist_label" msgid="8105600993099120273">"कलाकार"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"डिफ़ॉल्ट रिंगटोन"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"राइज़"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"स्वे"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"वैग"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"रिंगटोन जोड़ेंं"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"हटाएं"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"कस्टम रिंगटोन जोड़ने में असमर्थ"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"कस्टम रिंगटोन हटाने में असमर्थ"</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index a3f6b1c..5c7e85e 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Mediji"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Lokalna pohrana"</string>
     <string name="app_label" msgid="9035307001052716210">"Pohranjivanje na mediju"</string>
     <string name="artist_label" msgid="8105600993099120273">"Izvođač"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Zadana melodija zvona"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Podizanje"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Lelujanje"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Mahanje"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Dodaj melodiju zvona"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Izbriši"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Dodavanje prilagođene melodije zvona nije moguće"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Brisanje prilagođene melodije zvona nije moguće"</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index d229fd9..b47d643 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Média"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Helyi tárhely"</string>
     <string name="app_label" msgid="9035307001052716210">"Médiatároló"</string>
     <string name="artist_label" msgid="8105600993099120273">"Előadó"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Alapértelmezett csengőhang"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Csengőhang hozzáadása"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Törlés"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Nem sikerült hozzáadni az egyéni csengőhangot"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Nem sikerült törölni az egyéni csengőhangot"</string>
 </resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy/strings.xml
similarity index 79%
rename from res/values-hy-rAM/strings.xml
rename to res/values-hy/strings.xml
index c23c1cd..e9374a9 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Մեդիա"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Սարքի հիշողություն"</string>
     <string name="app_label" msgid="9035307001052716210">"Մեդիա կրիչ"</string>
     <string name="artist_label" msgid="8105600993099120273">"Կատարող"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Կանխադրված զանգերանգը"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Ավելացնել զանգերանգ"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Ջնջել"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Հնարավոր չէ հատուկ զանգերանգ ավելացնել"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Հնարավոր չէ ջնջել հատուկ զանգերանգը"</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index afbf2e7..7d3d07d 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Penyimpanan lokal"</string>
     <string name="app_label" msgid="9035307001052716210">"Penyimpanan Media"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artis"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Nada dering default"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Tambahkan nada dering"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Hapus"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Tidak dapat menambahkan nada dering khusus"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Tidak dapat menghapus nada dering khusus"</string>
 </resources>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is/strings.xml
similarity index 81%
rename from res/values-is-rIS/strings.xml
rename to res/values-is/strings.xml
index d1cd87d..e54a772 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Margmiðlun"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Staðbundin vistun"</string>
     <string name="app_label" msgid="9035307001052716210">"Efnisgeymsla"</string>
     <string name="artist_label" msgid="8105600993099120273">"Flytjandi"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Sjálfgefinn hringitónn"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Ris"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sveifla"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Vagg"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Bæta hringitóni við"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Eyða"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Get ekki bætt sérsniðnum hringitóni við"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Get ekki eytt sérsniðnum hringitóni"</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index bd7d0c4..77c2028 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Supporti multimediali"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Archiviazione locale"</string>
     <string name="app_label" msgid="9035307001052716210">"Media Storage"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artista"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Suoneria predefinita"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Aggiungi suoneria"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Elimina"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Impossibile aggiungere suoneria personalizzata"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Impossibile eliminare suoneria personalizzata"</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index e609448..702c910 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"מדיה"</string>
+    <string name="storage_description" msgid="4081716890357580107">"אחסון מקומי"</string>
     <string name="app_label" msgid="9035307001052716210">"אחסון מדיה"</string>
     <string name="artist_label" msgid="8105600993099120273">"אמן"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"רינגטון ברירת מחדל"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"עלייה"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"התנודדות"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"כשכוש"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"רינגטון חדש"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"מחק"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"לא ניתן להוסיף רינגטון מותאם אישית"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"לא ניתן למחוק רינגטון מותאם אישית"</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 22de002..bb74988 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"メディア"</string>
+    <string name="storage_description" msgid="4081716890357580107">"ローカル ストレージ"</string>
     <string name="app_label" msgid="9035307001052716210">"メディア ストレージ"</string>
     <string name="artist_label" msgid="8105600993099120273">"アーティスト"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"デフォルトの着信音"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"着信音を追加"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"削除"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"カスタム着信音を追加できません"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"カスタム着信音を削除できません"</string>
 </resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka/strings.xml
similarity index 77%
rename from res/values-ka-rGE/strings.xml
rename to res/values-ka/strings.xml
index 41e1129..7973ed5 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"მედია"</string>
+    <string name="storage_description" msgid="4081716890357580107">"ადგილობრივი მეხსიერება"</string>
     <string name="app_label" msgid="9035307001052716210">"მედიის საცავი"</string>
     <string name="artist_label" msgid="8105600993099120273">"შემსრულებელი"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"ნაგულისხმევი ზარი"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"ზარის დამატება"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"წაშლა"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"მორგებული ზარის დამატება შეუძლებელია"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"მორგებული ზარის წაშლა შეუძლებელია"</string>
 </resources>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk/strings.xml
similarity index 80%
rename from res/values-kk-rKZ/strings.xml
rename to res/values-kk/strings.xml
index 64c6394..1865a16 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Мультимeдиа"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Жергілікті жад"</string>
     <string name="app_label" msgid="9035307001052716210">"Мультимедиа қоймасы"</string>
     <string name="artist_label" msgid="8105600993099120273">"Орындаушы"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Әдепкі қоңырау әуені"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Көтерілу"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Тербелу"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Шайқау"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Рингтон енгізу"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Жою"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Арнаулы рингтонды енгізу мүмкін емес"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Арнаулы рингтонды жою мүмкін емес"</string>
 </resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km/strings.xml
similarity index 77%
rename from res/values-km-rKH/strings.xml
rename to res/values-km/strings.xml
index c615042..3e1d801 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"មេឌៀ"</string>
+    <string name="storage_description" msgid="4081716890357580107">"ទំហំផ្ទុកមូលដ្ឋាន"</string>
     <string name="app_label" msgid="9035307001052716210">"ទំហំផ្ទុកមេឌៀ"</string>
     <string name="artist_label" msgid="8105600993099120273">"សិល្បករ"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"សំឡេង​រោទ៍​លំនាំដើម"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"រះ"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"យោល"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"គ្រវី"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"បន្ថែម​សំឡេង​រោទ៍"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"លុប"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"មិន​អាច​បន្ថែម​សំឡេង​រោទ៍​ផ្ទាល់ខ្លួន​បាន"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"មិន​អាច​លុប​សំឡេង​រោទ៍​ផ្ទាល់ខ្លួន​បាន​ទេ"</string>
 </resources>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn/strings.xml
similarity index 78%
rename from res/values-kn-rIN/strings.xml
rename to res/values-kn/strings.xml
index 46a0f79..bd26e3c 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"ಮಾಧ್ಯಮ"</string>
+    <string name="storage_description" msgid="4081716890357580107">"ಸ್ಥಳೀಯ ಸಂಗ್ರಹಣೆ"</string>
     <string name="app_label" msgid="9035307001052716210">"ಮಾಧ್ಯಮ ಸಂಗ್ರಹಣೆ"</string>
     <string name="artist_label" msgid="8105600993099120273">"ಕಲಾವಿದರು"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"ಡಿಫಾಲ್ಟ್ ರಿಂಗ್‌ಟೋನ್"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"ರೈಸ್"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"ಸ್ವೇ"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"ವಾಗ್"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"ರಿಂಗ್‌ಟೋನ್ ಸೇರಿಸಿ"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"ಅಳಿಸಿ"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"ಕಸ್ಟಮ್ ರಿಂಗ್‌ಟೋನ್ ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"ಕಸ್ಟಮ್ ರಿಂಗ್‌ಟೋನ್ ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index f666b6a..f76e711 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"미디어"</string>
+    <string name="storage_description" msgid="4081716890357580107">"로컬 저장소"</string>
     <string name="app_label" msgid="9035307001052716210">"미디어 저장소"</string>
     <string name="artist_label" msgid="8105600993099120273">"아티스트"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"기본 벨소리"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"점점 커지는 소리"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"천천히 흔들리는 소리"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"개가 꼬리를 흔드는 소리"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"벨소리 추가"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"삭제"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"맞춤 벨소리를 추가할 수 없습니다."</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"맞춤 벨소리를 삭제할 수 없습니다."</string>
 </resources>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky/strings.xml
similarity index 78%
rename from res/values-ky-rKG/strings.xml
rename to res/values-ky/strings.xml
index f2711a7..0146713 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky/strings.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.
@@ -17,11 +17,12 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Мультимедия"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Жергиликтүү сактагыч"</string>
     <string name="app_label" msgid="9035307001052716210">"Медиа сактагыч"</string>
     <string name="artist_label" msgid="8105600993099120273">"Аткаруучу"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Демейки шыңгыр"</string>
     <string name="notification_sound_default" msgid="6541609166469990135">"Демейки эскертме үнү"</string>
-    <string name="alarm_sound_default" msgid="5488847775252870314">"Демейки ойготкуч добушу"</string>
+    <string name="alarm_sound_default" msgid="5488847775252870314">"Ойготкучтун демейки үнү"</string>
     <string name="root_images" msgid="5861633549189045666">"Сүрөттөр"</string>
     <string name="root_videos" msgid="8792703517064649453">"Видеолор"</string>
     <string name="root_audio" msgid="3505830755201326018">"Аудио"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Шыңгыр кошуу"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Жок кылуу"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Жеке рингтон кошулбай жатат"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Жеке рингтон жок кылынбай жатат"</string>
 </resources>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo/strings.xml
similarity index 81%
rename from res/values-lo-rLA/strings.xml
rename to res/values-lo/strings.xml
index 1873219..d497471 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"ມີເດຍ"</string>
+    <string name="storage_description" msgid="4081716890357580107">"ບ່ອນຈັດເກັບຂໍ້ມູນໃນເຄື່ອງ"</string>
     <string name="app_label" msgid="9035307001052716210">"ພື້ນທີ່ຈັດເກັບຂໍ້ມູນມີເດຍ"</string>
     <string name="artist_label" msgid="8105600993099120273">"ສິນລະປິນ"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"ຣິງໂທນເລີ່ມຕົ້ນ"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"ເພີ່ມຣິງໂທນ"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"​ລຶບ"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Unable to add custom ringtone"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Unable to delete custom ringtone"</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 4c6dc28..0daa997 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Medija"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Vietinė saugykla"</string>
     <string name="app_label" msgid="9035307001052716210">"Medijos saugykla"</string>
     <string name="artist_label" msgid="8105600993099120273">"Atlikėjas"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Numatytasis skambėjimo tonas"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Pakilimas"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Supimas"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Mostai"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Pridėti skambėjimo toną"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Ištrinti"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Nepavyksta pridėti tinkinto skambėjimo tono"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Nepavyksta ištrinti tinkinto skambėjimo tono"</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 0ced55a..6582b3d 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multivide"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Lokālā krātuve"</string>
     <string name="app_label" msgid="9035307001052716210">"Multivides krātuve"</string>
     <string name="artist_label" msgid="8105600993099120273">"Izpildītājs"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Noklusējuma zvana signāls"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Pievienot zvana signālu"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Dzēst"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Nevar pievienot pielāgotu zvana signālu"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Nevar izdzēst pielāgotu zvana signālu"</string>
 </resources>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk/strings.xml
similarity index 80%
rename from res/values-mk-rMK/strings.xml
rename to res/values-mk/strings.xml
index 3b0fc47..cce1c96 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Аудио-визуелни содржини"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Локална меморија"</string>
     <string name="app_label" msgid="9035307001052716210">"Меморија за аудио-визуелни содржини"</string>
     <string name="artist_label" msgid="8105600993099120273">"Изведувач"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Стандардна мелодија"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Станување"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Бранување"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Нишање"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Додај мелодија"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Избриши"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Не може да се додаде приспособена мелодија"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Не може да се избрише приспособена мелодија"</string>
 </resources>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml/strings.xml
similarity index 77%
rename from res/values-ml-rIN/strings.xml
rename to res/values-ml/strings.xml
index 3939ea8..473df67 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"മീഡിയ"</string>
+    <string name="storage_description" msgid="4081716890357580107">"ലോക്കൽ സ്റ്റോറേജ്"</string>
     <string name="app_label" msgid="9035307001052716210">"മീഡിയ സ്റ്റോറേജ്"</string>
     <string name="artist_label" msgid="8105600993099120273">"ആർട്ടിസ്‌റ്റ്"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"ഡിഫോൾട്ട് റിംഗ്‌ടോൺ"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"റയ്സ്"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"സ്വേ"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"വാഗ്"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"റിംഗ്‌ടോൺ ചേർക്കുക"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"ഇല്ലാതാക്കുക"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"ഇഷ്ടാനുസൃത റിംഗ്‌ടോൺ ചേർക്കാനാവില്ല"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"ഇഷ്ടാനുസൃത റിംഗ്‌ടോൺ ഇല്ലാതാക്കാനാവില്ല"</string>
 </resources>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn/strings.xml
similarity index 79%
rename from res/values-mn-rMN/strings.xml
rename to res/values-mn/strings.xml
index 6474171..3ff4341 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Медиа"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Дотоод сан"</string>
     <string name="app_label" msgid="9035307001052716210">"Медиа санах ой"</string>
     <string name="artist_label" msgid="8105600993099120273">"Уран бүтээлч"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Үндсэн хонхны ая"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Хонхны ая нэмэх"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Устгах"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Захиалгат хонхны ая нэмэх боломжгүй"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Захиалгат хонхны ая устгах боломжгүй"</string>
 </resources>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr/strings.xml
similarity index 79%
rename from res/values-mr-rIN/strings.xml
rename to res/values-mr/strings.xml
index 765621c..1ec6ff9 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"मीडिया"</string>
+    <string name="storage_description" msgid="4081716890357580107">"स्थानिक संचय"</string>
     <string name="app_label" msgid="9035307001052716210">"मीडिया संचय"</string>
     <string name="artist_label" msgid="8105600993099120273">"कलाकार"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"डीफॉल्ट रिंगटोन"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"राइज"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"स्वे"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"वॉग"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"रिंगटोन जोडा"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"हटवा"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"सानुकूल रिंगटोन जोडण्यात अक्षम"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"सानुकूल रिंगटोन हटविण्यात अक्षम"</string>
 </resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms/strings.xml
similarity index 81%
rename from res/values-ms-rMY/strings.xml
rename to res/values-ms/strings.xml
index 064641e..11e2af5 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Storan setempat"</string>
     <string name="app_label" msgid="9035307001052716210">"Storan Media"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artis"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Nada dering lalai"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Bangkit"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Lenggok"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Goyang"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Tambah nada dering"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Padam"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Tidak dapat menambah nada dering tersuai"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Tidak dapat memadamkan nada dering tersuai"</string>
 </resources>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my/strings.xml
similarity index 78%
rename from res/values-my-rMM/strings.xml
rename to res/values-my/strings.xml
index e0e4d86..1626ace 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"မီဒီယာ"</string>
+    <string name="storage_description" msgid="4081716890357580107">"စက်တွင်း သိုလှောင်ခန်း"</string>
     <string name="app_label" msgid="9035307001052716210">"မီဒီယာ သိုလှောင်ခန်း"</string>
     <string name="artist_label" msgid="8105600993099120273">"အနုပညာရှင်"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"မူလဖုန်းမြည်သံ"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"စူးရှကျယ်လောင်သံ"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"ပုခက်လွှဲသံ"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"လှုပ်ခါသံ"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"ဖုန်းမြည်သံကို ထည့်ရန်"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"ဖျက်ရန်"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"စိတ်ကြိုက်ဖုန်းမြည်သံကို ထည့်သွင်း၍မရပါ"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"စိတ်ကြိုက်ဖုန်းမြည်သံကို ဖျက်၍မရပါ"</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 31c90c9..8e7eeaf 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Medier"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Lokal lagring"</string>
     <string name="app_label" msgid="9035307001052716210">"Medielagring"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artist"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Standard ringelyd"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Stå opp"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Svai"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Logre"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Legg til ringelyd"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Slett"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Kan ikke legge til egendefinert ringelyd"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Kan ikke slette egendefinert ringelyd"</string>
 </resources>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne/strings.xml
similarity index 78%
rename from res/values-ne-rNP/strings.xml
rename to res/values-ne/strings.xml
index 91f5f09..856f3ef 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"मिडिया"</string>
+    <string name="storage_description" msgid="4081716890357580107">"स्थानीय भण्डारण"</string>
     <string name="app_label" msgid="9035307001052716210">"मिडिया भण्डारण"</string>
     <string name="artist_label" msgid="8105600993099120273">"कलाकार"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"पूर्वनिर्धारित रिङटोन"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"रिङटोन थप्नुहोस्"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"मेट्नुहोस्"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"आफू अनुकूल रिङटोन थप्न सकिएन"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"आफू अनुकूल रिङटोनलाई मेट्न सकिएन"</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index df4e7f0..043c577 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Lokale opslag"</string>
     <string name="app_label" msgid="9035307001052716210">"Mediaopslag"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artiest"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Standaardbeltoon"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Beltoon toevoegen"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Verwijderen"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Toevoegen van aangepaste beltoon is mislukt"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Verwijderen van aangepaste beltoon is mislukt"</string>
 </resources>
diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa/strings.xml
similarity index 77%
rename from res/values-pa-rIN/strings.xml
rename to res/values-pa/strings.xml
index 19db4e4..b962f9a 100644
--- a/res/values-pa-rIN/strings.xml
+++ b/res/values-pa/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"ਮੀਡੀਆ"</string>
+    <string name="storage_description" msgid="4081716890357580107">"ਸਥਾਨਕ ਸਟੋਰੇਜ"</string>
     <string name="app_label" msgid="9035307001052716210">"ਮੀਡੀਆ ਸਟੋਰੇਜ"</string>
     <string name="artist_label" msgid="8105600993099120273">"ਕਲਾਕਾਰ"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰਿੰਗਟੋਨ"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"ਰਾਇਜ਼"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"ਸਵੇਅ"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"ਵੈਗ"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"ਰਿੰਗਟੋਨ ਸ਼ਾਮਲ ਕਰੋ"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"ਮਿਟਾਓ"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤੀ ਰਿੰਗਟੋਨ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਦੇ ਅਯੋਗ"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤੀ ਰਿੰਗਟੋਨ ਨੂੰ ਮਿਟਾਉਣ ਦੇ ਅਯੋਗ"</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 2387bc4..68aee64 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multimedia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Pamięć lokalna"</string>
     <string name="app_label" msgid="9035307001052716210">"Przechowywanie multimediów"</string>
     <string name="artist_label" msgid="8105600993099120273">"Wykonawca"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Dzwonek domyślny"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Wschód"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Kołysanie"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Machanie"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Dodaj dzwonek"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Usuń"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Nie można dodać dzwonka niestandardowego"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Nie można usunąć dzwonka niestandardowego"</string>
 </resources>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index abccf78..6ce0021 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Mídia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Armazenamento local"</string>
     <string name="app_label" msgid="9035307001052716210">"Armazenamento de mídia"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artista"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Toque padrão"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Adicionar toque"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Excluir"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Não foi possível adicionar o toque personalizado"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Não foi possível excluir o toque personalizado"</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 70c523d..e53c849 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multimédia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Armazenamento local"</string>
     <string name="app_label" msgid="9035307001052716210">"Armazenamento de multimédia"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artista"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Toque predefinido"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Subir"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Balançar"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Abanar"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Adicionar toque"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Eliminar"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Não foi possível adicionar o toque personalizado"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Não foi possível eliminar o toque personalizado"</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index abccf78..6ce0021 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Mídia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Armazenamento local"</string>
     <string name="app_label" msgid="9035307001052716210">"Armazenamento de mídia"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artista"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Toque padrão"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Adicionar toque"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Excluir"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Não foi possível adicionar o toque personalizado"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Não foi possível excluir o toque personalizado"</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index eba3f1d..37cf42a 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Conținut media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Stocare locală"</string>
     <string name="app_label" msgid="9035307001052716210">"Stocarea conținutului media"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artist"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Ton de sonerie prestabilit"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Adăugați un ton de sonerie"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Ștergeți"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Nu se poate adăuga tonul de sonerie personalizat"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Nu se poate șterge tonul de sonerie personalizat"</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 85f1ee0..6a43bb1 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Мультимедиа"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Локальное хранилище"</string>
     <string name="app_label" msgid="9035307001052716210">"Хранилище мультимедиа"</string>
     <string name="artist_label" msgid="8105600993099120273">"Исполнитель"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Рингтон по умолчанию"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Добавить рингтон"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Удалить"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Не удалось добавить рингтон"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Не удалось удалить рингтон"</string>
 </resources>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si/strings.xml
similarity index 79%
rename from res/values-si-rLK/strings.xml
rename to res/values-si/strings.xml
index fce0079..0f89f28 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"මාධ්‍ය"</string>
+    <string name="storage_description" msgid="4081716890357580107">"පෙදෙසි ආචයනය"</string>
     <string name="app_label" msgid="9035307001052716210">"මාධ්‍ය ගබඩාව"</string>
     <string name="artist_label" msgid="8105600993099120273">"කලාකරු"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"පෙරනිමි රිංග්ටෝනය"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"නැගීම"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"පැද්දීම"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"එහා මෙහා යාම"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"නාද රිද්මය එක් කරන්න"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"මකන්න"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"අභිරුචි නාද රිද්මය එක් කළ නොහැකිය"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"අභිරුචි නාද රිද්මය මැකිය නොහැකිය"</string>
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 0bd36c8..a011e60 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Médiá"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Miestne úložisko"</string>
     <string name="app_label" msgid="9035307001052716210">"Úložisko médií"</string>
     <string name="artist_label" msgid="8105600993099120273">"Interpret"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Predvolený tón zvonenia"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Pridať tón zvonenia"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Odstrániť"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Nepodarilo sa pridať vlastný tón zvonenia"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Nepodarilo sa odstrániť vlastný tón zvonenia"</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 4767d72..de566cf 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Predstavnost"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Lokalna shramba"</string>
     <string name="app_label" msgid="9035307001052716210">"Shramba za predstavnost"</string>
     <string name="artist_label" msgid="8105600993099120273">"Izvajalec"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Privzeti ton zvonjenja"</string>
@@ -24,7 +25,7 @@
     <string name="alarm_sound_default" msgid="5488847775252870314">"Privzeti zvok alarma"</string>
     <string name="root_images" msgid="5861633549189045666">"Slike"</string>
     <string name="root_videos" msgid="8792703517064649453">"Videoposnetki"</string>
-    <string name="root_audio" msgid="3505830755201326018">"Zvok"</string>
+    <string name="root_audio" msgid="3505830755201326018">"Zvočni posnetki"</string>
     <string name="sound_name_awaken" msgid="5266892392848526147">"Prebujanje"</string>
     <string name="sound_name_bounce" msgid="8771447635446665231">"Poskakovanje"</string>
     <string name="sound_name_drip" msgid="1744684469020662152">"Curljanje"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Pokonci"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Guganje"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Mahanje"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Dodaj ton zvonjenja"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Izbriši"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Tona zvonjenja po meri ni mogoče dodati"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Tona zvonjenja po meri ni mogoče izbrisati"</string>
 </resources>
diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq/strings.xml
similarity index 81%
rename from res/values-sq-rAL/strings.xml
rename to res/values-sq/strings.xml
index ce3ca01..e919dc4 100644
--- a/res/values-sq-rAL/strings.xml
+++ b/res/values-sq/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Hapësira ruajtëse lokale"</string>
     <string name="app_label" msgid="9035307001052716210">"Hapësira ruajtëse e medias"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artisti"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Zilja e parazgjedhur"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Ngritje"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Lëkundje"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Tundje"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Shto zile"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Fshi"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Nuk mund të shtojë ton zileje të personalizuar"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Nuk mund të fshijë ton zileje të personalizuar"</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index c359261..d6ac126 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Медији"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Локални меморијски простор"</string>
     <string name="app_label" msgid="9035307001052716210">"Меморијски простор за медије"</string>
     <string name="artist_label" msgid="8105600993099120273">"Извођач"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Подразумевана мелодија звона"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"успон"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"њихање"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"махање"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Додај мелодију звона"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Избриши"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Додавање прилагођене мелодије звона није успело"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Брисање прилагођене мелодије звона није успело"</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index d454f54..12bd0f3 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Lokal lagring"</string>
     <string name="app_label" msgid="9035307001052716210">"Medialagring"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artist"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Standardringsignal"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Lägg till ringsignal"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Radera"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Det gick inte att lägga till en egen ringsignal"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Det gick inte att radera den egna ringsignalen"</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 5315427..805930a 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Maudhui"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Hifadhi ya ndani"</string>
     <string name="app_label" msgid="9035307001052716210">"Hifadhi ya Maudhui"</string>
     <string name="artist_label" msgid="8105600993099120273">"Msanii"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Mlio chaguo-msingi wa simu"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Ongeza mlio wa simu"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Futa"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Imeshindwa kuongeza mlio maalum wa simu"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Imeshindwa kufuta mlio maalum wa simu"</string>
 </resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta/strings.xml
similarity index 77%
rename from res/values-ta-rIN/strings.xml
rename to res/values-ta/strings.xml
index b67fa5c..5a298f3 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"மீடியா"</string>
+    <string name="storage_description" msgid="4081716890357580107">"சாதனச் சேமிப்பகம்"</string>
     <string name="app_label" msgid="9035307001052716210">"மீடியா சேமிப்பிடம்"</string>
     <string name="artist_label" msgid="8105600993099120273">"கலைஞர்"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"இயல்பு ரிங்டோன்"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"ரைஸ்"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"ஸ்வே"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"வேக்"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"ரிங்டோனைச் சேர்"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"நீக்கு"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"தனிப்பயன் ரிங்டோனைச் சேர்க்க முடியவில்லை"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"தனிப்பயன் ரிங்டோனை நீக்க முடியவில்லை"</string>
 </resources>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te/strings.xml
similarity index 77%
rename from res/values-te-rIN/strings.xml
rename to res/values-te/strings.xml
index e30803a..e95a88d 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"మీడియా"</string>
+    <string name="storage_description" msgid="4081716890357580107">"స్థానిక నిల్వ"</string>
     <string name="app_label" msgid="9035307001052716210">"మీడియా నిల్వ"</string>
     <string name="artist_label" msgid="8105600993099120273">"కళాకారుడు"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"డిఫాల్ట్ రింగ్‌టోన్"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"రైస్"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"స్వే"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"వాగ్"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"రింగ్‌టోన్‌ను జోడించు"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"తొలగించు"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"అనుకూల రింగ్‌టోన్‌ను జోడించలేకపోయింది"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"అనుకూల రింగ్‌టోన్‌ను తొలగించలేకపోయింది"</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index e9d7f67..4337331 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"สื่อ"</string>
+    <string name="storage_description" msgid="4081716890357580107">"พื้นที่เก็บข้อมูลในเครื่อง"</string>
     <string name="app_label" msgid="9035307001052716210">"พื้นที่เก็บข้อมูลสื่อ"</string>
     <string name="artist_label" msgid="8105600993099120273">"ศิลปิน"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"เสียงเรียกเข้าเริ่มต้น"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"เพิ่มเสียงเรียกเข้า"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"ลบ"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"ไม่สามารถเพิ่มเสียงเรียกเข้าที่กำหนดเอง"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"ไม่สามารถลบเสียงเรียกเข้าที่กำหนดเอง"</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 86480e2..d708cc0 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Media"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Lokal na storage"</string>
     <string name="app_label" msgid="9035307001052716210">"Storage ng Media"</string>
     <string name="artist_label" msgid="8105600993099120273">"Artist"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Default na ringtone"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Magdagdag ng ringtone"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"I-delete"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Hindi maidagdag ang custom na ringtone"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Hindi ma-delete ang custom na ringtone"</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index a79f6ee..a7ea4b3 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Medya"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Yerel depolama"</string>
     <string name="app_label" msgid="9035307001052716210">"Medya Deposu"</string>
     <string name="artist_label" msgid="8105600993099120273">"Sanatçı"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Varsayılan zil sesi"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Zil sesi ekle"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Sil"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Özel zil sesi eklenemiyor"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Özel zil sesi silinemiyor"</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 625eca2..dc7e3fd 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Медіа-файли"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Локальна пам’ять"</string>
     <string name="app_label" msgid="9035307001052716210">"Сховище медіа-файлів"</string>
     <string name="artist_label" msgid="8105600993099120273">"Виконавець"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Сигнал дзвінка за умовчанням"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Додати сигнал дзвінка"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Видалити"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Не вдалося додати користувацький сигнал дзвінка"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Не вдалося видалити користувацький сигнал дзвінка"</string>
 </resources>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur/strings.xml
similarity index 79%
rename from res/values-ur-rPK/strings.xml
rename to res/values-ur/strings.xml
index e00e9df..1792d89 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"میڈیا"</string>
+    <string name="storage_description" msgid="4081716890357580107">"مقامی اسٹوریج"</string>
     <string name="app_label" msgid="9035307001052716210">"میڈیا اسٹوریج"</string>
     <string name="artist_label" msgid="8105600993099120273">"فنکار"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"ڈیفالٹ رنگ ٹون"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"طلوع"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"جھولن"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"جنبش"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"رنگ ٹون شامل کریں"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"حذف کریں"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"حسب ضرورت رنگ ٹون شامل کرنے سے قاصر ہے"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"حسب ضرورت رنگ ٹون حذف کرنے سے قاصر ہے"</string>
 </resources>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz/strings.xml
similarity index 81%
rename from res/values-uz-rUZ/strings.xml
rename to res/values-uz/strings.xml
index bb6d500..830b77e 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Multimedia"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Mahalliy xotira"</string>
     <string name="app_label" msgid="9035307001052716210">"Multimedia xotirasi"</string>
     <string name="artist_label" msgid="8105600993099120273">"Ijrochi"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Standart rington"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Ko‘tarilish"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Chayqalish"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Silkitish"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Rington qo‘shish"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"O‘chirish"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Maxsus rington qo‘shib bo‘lmadi"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Maxsus ringtonni o‘chirib bo‘lmadi"</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 91b15d6..df4085d 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Phương tiện"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Bộ nhớ cục bộ"</string>
     <string name="app_label" msgid="9035307001052716210">"Bộ nhớ phương tiện"</string>
     <string name="artist_label" msgid="8105600993099120273">"Nghệ sĩ"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Nhạc chuông mặc định"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Trỗi dậy"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Đu đưa"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Thoảng qua"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Thêm nhạc chuông"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Xóa"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Không thể thêm nhạc chuông tùy chỉnh"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Không thể xóa nhạc chuông tùy chỉnh"</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index b8ae08a..645d836 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"媒体"</string>
+    <string name="storage_description" msgid="4081716890357580107">"本地存储空间"</string>
     <string name="app_label" msgid="9035307001052716210">"媒体存储设备"</string>
     <string name="artist_label" msgid="8105600993099120273">"音乐人"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"默认铃声"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"添加铃声"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"删除"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"无法添加自定义铃声"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"无法删除自定义铃声"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 4a81d44..4b8149f 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"媒體"</string>
+    <string name="storage_description" msgid="4081716890357580107">"本機儲存空間"</string>
     <string name="app_label" msgid="9035307001052716210">"媒體儲存空間"</string>
     <string name="artist_label" msgid="8105600993099120273">"歌手"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"預設鈴聲"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"加入鈴聲"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"刪除"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"無法加入自訂鈴聲"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"無法刪除自訂鈴聲"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 392914f..68616ff 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"媒體"</string>
+    <string name="storage_description" msgid="4081716890357580107">"本機儲存空間"</string>
     <string name="app_label" msgid="9035307001052716210">"媒體儲存空間"</string>
     <string name="artist_label" msgid="8105600993099120273">"演出者"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"預設鈴聲"</string>
@@ -25,7 +26,7 @@
     <string name="root_images" msgid="5861633549189045666">"圖片"</string>
     <string name="root_videos" msgid="8792703517064649453">"影片"</string>
     <string name="root_audio" msgid="3505830755201326018">"音訊"</string>
-    <string name="sound_name_awaken" msgid="5266892392848526147">"Awaken"</string>
+    <string name="sound_name_awaken" msgid="5266892392848526147">"喚醒"</string>
     <string name="sound_name_bounce" msgid="8771447635446665231">"Bounce"</string>
     <string name="sound_name_drip" msgid="1744684469020662152">"Drip"</string>
     <string name="sound_name_gallop" msgid="2664454314532060876">"Gallop"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"新增鈴聲"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"刪除"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"無法新增自訂鈴聲"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"無法刪除自訂鈴聲"</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 33b33ba..ea4405e 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.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.
@@ -17,6 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="uid_label" msgid="8421971615411294156">"Abezind"</string>
+    <string name="storage_description" msgid="4081716890357580107">"Isitoreji sasendaweni"</string>
     <string name="app_label" msgid="9035307001052716210">"Isitoreji Semidiya"</string>
     <string name="artist_label" msgid="8105600993099120273">"Umculi"</string>
     <string name="ringtone_default" msgid="1744846699922263043">"Ithoni yokukhala ezenzakalelayo"</string>
@@ -34,4 +35,8 @@
     <string name="sound_name_rise" msgid="2200258555031675806">"I-Rise"</string>
     <string name="sound_name_sway" msgid="348448316663085643">"I-Sway"</string>
     <string name="sound_name_wag" msgid="2730733083078126563">"I-Wag"</string>
+    <string name="add_ringtone_text" msgid="8077717303037760418">"Engeza ithoni yokukhala"</string>
+    <string name="delete_ringtone_text" msgid="2963662097583300181">"Susa"</string>
+    <string name="unable_to_add_ringtone" msgid="6256097521165711269">"Ayikwazi ukwengeza ithoni yokukhala yangokwezifiso"</string>
+    <string name="unable_to_delete_ringtone" msgid="2258180073859253495">"Ayikwazi ukususa ithoni yokukhala yangokwezifiso"</string>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f90d2a3..3672f52 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.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.
@@ -18,6 +18,9 @@
     <!-- Label to show to user for all apps using this UID. -->
     <string name="uid_label">Media</string>
 
+    <!-- Label to show client applications a short description of storage location -->
+    <string name="storage_description">Local storage</string>
+
     <!-- Label to show to user for this package. -->
     <string name="app_label">Media Storage</string>
 
@@ -68,6 +71,15 @@
     <!-- Name of alarm in the alarm sound picker: theme:motion, style:sound design tempo:mid -->
     <string name="sound_name_wag">Wag</string>
 
+    <!-- Text for the RingtonePicker item that allows adding a new ringtone. -->
+    <string name="add_ringtone_text">Add ringtone</string>
+    <!-- Text for the RingtonePicker item ContextMenu that allows deleting a custom ringtone. -->
+    <string name="delete_ringtone_text">Delete</string>
+    <!-- Text for the Toast displayed when adding a custom ringtone fails. -->
+    <string name="unable_to_add_ringtone">Unable to add custom ringtone</string>
+    <!-- Text for the Toast displayed when deleting a custom ringtone fails. -->
+    <string name="unable_to_delete_ringtone">Unable to delete custom ringtone</string>
+
     <!--  When adding sounds as overlays, you can use the resources defined below.
           For the translation of the names to be picked up by the RingtonePicker:
           - in the sound files, set the "TITLE" tag as "alarm_XX" or "notification_XX"
diff --git a/src/com/android/providers/media/CheckedListItem.java b/src/com/android/providers/media/CheckedListItem.java
new file mode 100644
index 0000000..90e09f7
--- /dev/null
+++ b/src/com/android/providers/media/CheckedListItem.java
@@ -0,0 +1,67 @@
+/*
+ * 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.media;
+
+import android.content.Context;
+import android.widget.Checkable;
+import android.widget.CheckedTextView;
+import android.widget.RelativeLayout;
+import android.util.AttributeSet;
+
+/**
+ * The {@link CheckedListItem} is a layout item that represents a ringtone, and is used in
+ * {@link RingtonePickerActivity}. It contains the ringtone's name, and a work badge to right of the
+ * name if the ringtone belongs to a work profile.
+ */
+public class CheckedListItem extends RelativeLayout implements Checkable {
+
+    public CheckedListItem(Context context) {
+        super(context);
+    }
+
+    public CheckedListItem(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public CheckedListItem(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public CheckedListItem(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    @Override
+    public void setChecked(boolean checked) {
+        getCheckedTextView().setChecked(checked);
+    }
+
+    @Override
+    public boolean isChecked() {
+        return getCheckedTextView().isChecked();
+    }
+
+    @Override
+    public void toggle() {
+        getCheckedTextView().toggle();
+    }
+
+    private CheckedTextView getCheckedTextView() {
+        return (CheckedTextView) findViewById(R.id.checked_text_view);
+    }
+
+}
diff --git a/src/com/android/providers/media/MediaDocumentsProvider.java b/src/com/android/providers/media/MediaDocumentsProvider.java
index 7c3d773..65a6769 100644
--- a/src/com/android/providers/media/MediaDocumentsProvider.java
+++ b/src/com/android/providers/media/MediaDocumentsProvider.java
@@ -230,6 +230,7 @@
         final ContentResolver resolver = getContext().getContentResolver();
         final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
         final Ident ident = getIdentForDocId(docId);
+        final String[] queryArgs = new String[] { Long.toString(ident.id) } ;
 
         final long token = Binder.clearCallingIdentity();
         Cursor cursor = null;
@@ -240,8 +241,8 @@
             } else if (TYPE_IMAGES_BUCKET.equals(ident.type)) {
                 // single bucket
                 cursor = resolver.query(Images.Media.EXTERNAL_CONTENT_URI,
-                        ImagesBucketQuery.PROJECTION, ImageColumns.BUCKET_ID + "=" + ident.id,
-                        null, ImagesBucketQuery.SORT_ORDER);
+                        ImagesBucketQuery.PROJECTION, ImageColumns.BUCKET_ID + "=?",
+                        queryArgs, ImagesBucketQuery.SORT_ORDER);
                 copyNotificationUri(result, cursor);
                 if (cursor.moveToFirst()) {
                     includeImagesBucket(result, cursor);
@@ -249,7 +250,7 @@
             } else if (TYPE_IMAGE.equals(ident.type)) {
                 // single image
                 cursor = resolver.query(Images.Media.EXTERNAL_CONTENT_URI,
-                        ImageQuery.PROJECTION, BaseColumns._ID + "=" + ident.id, null,
+                        ImageQuery.PROJECTION, BaseColumns._ID + "=?", queryArgs,
                         null);
                 copyNotificationUri(result, cursor);
                 if (cursor.moveToFirst()) {
@@ -261,8 +262,8 @@
             } else if (TYPE_VIDEOS_BUCKET.equals(ident.type)) {
                 // single bucket
                 cursor = resolver.query(Video.Media.EXTERNAL_CONTENT_URI,
-                        VideosBucketQuery.PROJECTION, VideoColumns.BUCKET_ID + "=" + ident.id,
-                        null, VideosBucketQuery.SORT_ORDER);
+                        VideosBucketQuery.PROJECTION, VideoColumns.BUCKET_ID + "=?",
+                        queryArgs, VideosBucketQuery.SORT_ORDER);
                 copyNotificationUri(result, cursor);
                 if (cursor.moveToFirst()) {
                     includeVideosBucket(result, cursor);
@@ -270,7 +271,7 @@
             } else if (TYPE_VIDEO.equals(ident.type)) {
                 // single video
                 cursor = resolver.query(Video.Media.EXTERNAL_CONTENT_URI,
-                        VideoQuery.PROJECTION, BaseColumns._ID + "=" + ident.id, null,
+                        VideoQuery.PROJECTION, BaseColumns._ID + "=?", queryArgs,
                         null);
                 copyNotificationUri(result, cursor);
                 if (cursor.moveToFirst()) {
@@ -282,7 +283,7 @@
             } else if (TYPE_ARTIST.equals(ident.type)) {
                 // single artist
                 cursor = resolver.query(Artists.EXTERNAL_CONTENT_URI,
-                        ArtistQuery.PROJECTION, BaseColumns._ID + "=" + ident.id, null,
+                        ArtistQuery.PROJECTION, BaseColumns._ID + "=?", queryArgs,
                         null);
                 copyNotificationUri(result, cursor);
                 if (cursor.moveToFirst()) {
@@ -291,7 +292,7 @@
             } else if (TYPE_ALBUM.equals(ident.type)) {
                 // single album
                 cursor = resolver.query(Albums.EXTERNAL_CONTENT_URI,
-                        AlbumQuery.PROJECTION, BaseColumns._ID + "=" + ident.id, null,
+                        AlbumQuery.PROJECTION, BaseColumns._ID + "=?", queryArgs,
                         null);
                 copyNotificationUri(result, cursor);
                 if (cursor.moveToFirst()) {
@@ -300,7 +301,7 @@
             } else if (TYPE_AUDIO.equals(ident.type)) {
                 // single song
                 cursor = resolver.query(Audio.Media.EXTERNAL_CONTENT_URI,
-                        SongQuery.PROJECTION, BaseColumns._ID + "=" + ident.id, null,
+                        SongQuery.PROJECTION, BaseColumns._ID + "=?", queryArgs,
                         null);
                 copyNotificationUri(result, cursor);
                 if (cursor.moveToFirst()) {
@@ -322,6 +323,7 @@
         final ContentResolver resolver = getContext().getContentResolver();
         final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
         final Ident ident = getIdentForDocId(docId);
+        final String[] queryArgs = new String[] { Long.toString(ident.id) } ;
 
         final long token = Binder.clearCallingIdentity();
         Cursor cursor = null;
@@ -343,8 +345,8 @@
             } else if (TYPE_IMAGES_BUCKET.equals(ident.type)) {
                 // include images under bucket
                 cursor = resolver.query(Images.Media.EXTERNAL_CONTENT_URI,
-                        ImageQuery.PROJECTION, ImageColumns.BUCKET_ID + "=" + ident.id,
-                        null, null);
+                        ImageQuery.PROJECTION, ImageColumns.BUCKET_ID + "=?",
+                        queryArgs, null);
                 copyNotificationUri(result, cursor);
                 while (cursor.moveToNext()) {
                     includeImage(result, cursor);
@@ -365,8 +367,8 @@
             } else if (TYPE_VIDEOS_BUCKET.equals(ident.type)) {
                 // include videos under bucket
                 cursor = resolver.query(Video.Media.EXTERNAL_CONTENT_URI,
-                        VideoQuery.PROJECTION, VideoColumns.BUCKET_ID + "=" + ident.id,
-                        null, null);
+                        VideoQuery.PROJECTION, VideoColumns.BUCKET_ID + "=?",
+                        queryArgs, null);
                 copyNotificationUri(result, cursor);
                 while (cursor.moveToNext()) {
                     includeVideo(result, cursor);
@@ -390,8 +392,8 @@
             } else if (TYPE_ALBUM.equals(ident.type)) {
                 // include all songs under album
                 cursor = resolver.query(Audio.Media.EXTERNAL_CONTENT_URI,
-                        SongQuery.PROJECTION, AudioColumns.ALBUM_ID + "=" + ident.id,
-                        null, null);
+                        SongQuery.PROJECTION, AudioColumns.ALBUM_ID + "=?",
+                        queryArgs, null);
                 copyNotificationUri(result, cursor);
                 while (cursor.moveToNext()) {
                     includeAudio(result, cursor);
@@ -442,6 +444,50 @@
     }
 
     @Override
+    public Cursor querySearchDocuments(String rootId, String query, String[] projection)
+            throws FileNotFoundException {
+        final ContentResolver resolver = getContext().getContentResolver();
+        final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
+
+        final long token = Binder.clearCallingIdentity();
+        final String[] queryArgs = new String[] { "%" + query + "%" };
+        Cursor cursor = null;
+        try {
+            if (TYPE_IMAGES_ROOT.equals(rootId)) {
+                cursor = resolver.query(Images.Media.EXTERNAL_CONTENT_URI, ImageQuery.PROJECTION,
+                        ImageColumns.DISPLAY_NAME + " LIKE ?", queryArgs,
+                        ImageColumns.DATE_MODIFIED + " DESC");
+                copyNotificationUri(result, cursor);
+                while (cursor.moveToNext()) {
+                    includeImage(result, cursor);
+                }
+            } else if (TYPE_VIDEOS_ROOT.equals(rootId)) {
+                cursor = resolver.query(Video.Media.EXTERNAL_CONTENT_URI, VideoQuery.PROJECTION,
+                        VideoColumns.DISPLAY_NAME + " LIKE ?", queryArgs,
+                        VideoColumns.DATE_MODIFIED + " DESC");
+                copyNotificationUri(result, cursor);
+                while (cursor.moveToNext()) {
+                    includeVideo(result, cursor);
+                }
+            } else if (TYPE_AUDIO_ROOT.equals(rootId)) {
+                cursor = resolver.query(Audio.Media.EXTERNAL_CONTENT_URI, SongQuery.PROJECTION,
+                        AudioColumns.TITLE + " LIKE ?", queryArgs,
+                        AudioColumns.DATE_MODIFIED + " DESC");
+                copyNotificationUri(result, cursor);
+                while (cursor.moveToNext()) {
+                    includeAudio(result, cursor);
+                }
+            } else {
+                throw new UnsupportedOperationException("Unsupported root " + rootId);
+            }
+        } finally {
+            IoUtils.closeQuietly(cursor);
+            Binder.restoreCallingIdentity(token);
+        }
+        return result;
+    }
+
+    @Override
     public ParcelFileDescriptor openDocument(String docId, String mode, CancellationSignal signal)
             throws FileNotFoundException {
         final Uri target = getUriForDocumentId(docId);
@@ -462,7 +508,6 @@
     @Override
     public AssetFileDescriptor openDocumentThumbnail(
             String docId, Point sizeHint, CancellationSignal signal) throws FileNotFoundException {
-        final ContentResolver resolver = getContext().getContentResolver();
         final Ident ident = getIdentForDocId(docId);
 
         final long token = Binder.clearCallingIdentity();
@@ -500,7 +545,7 @@
     }
 
     private void includeImagesRoot(MatrixCursor result) {
-        int flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_RECENTS;
+        int flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_RECENTS | Root.FLAG_SUPPORTS_SEARCH;
         if (isEmpty(Images.Media.EXTERNAL_CONTENT_URI)) {
             flags |= Root.FLAG_EMPTY;
             sReturnedImagesEmpty = true;
@@ -515,7 +560,7 @@
     }
 
     private void includeVideosRoot(MatrixCursor result) {
-        int flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_RECENTS;
+        int flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_RECENTS | Root.FLAG_SUPPORTS_SEARCH;
         if (isEmpty(Video.Media.EXTERNAL_CONTENT_URI)) {
             flags |= Root.FLAG_EMPTY;
             sReturnedVideosEmpty = true;
@@ -530,7 +575,7 @@
     }
 
     private void includeAudioRoot(MatrixCursor result) {
-        int flags = Root.FLAG_LOCAL_ONLY;
+        int flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_SEARCH;
         if (isEmpty(Audio.Media.EXTERNAL_CONTENT_URI)) {
             flags |= Root.FLAG_EMPTY;
             sReturnedAudioEmpty = true;
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index e181e59..a3a0c71 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -17,6 +17,7 @@
 package com.android.providers.media;
 
 import static android.Manifest.permission.ACCESS_CACHE_FILESYSTEM;
+import static android.Manifest.permission.INTERACT_ACROSS_USERS;
 import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
 import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
 import static android.Manifest.permission.WRITE_MEDIA_STORAGE;
@@ -62,6 +63,7 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
+import android.os.FileUtils;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Message;
@@ -73,7 +75,6 @@
 import android.os.storage.StorageVolume;
 import android.os.storage.VolumeInfo;
 import android.preference.PreferenceManager;
-import android.provider.BaseColumns;
 import android.provider.MediaStore;
 import android.provider.MediaStore.Audio;
 import android.provider.MediaStore.Audio.Playlists;
@@ -135,7 +136,6 @@
 
     private void updateStoragePaths() {
         mExternalStoragePaths = mStorageManager.getVolumePaths();
-
         try {
             mExternalPath =
                     Environment.getExternalStorageDirectory().getCanonicalPath() + File.separator;
@@ -759,11 +759,176 @@
 
     private static final String PLAYLIST_COLUMNS = "_data,name,date_added,date_modified";
 
+    // restore the database to a clean slate
+    private static void makePristine(SQLiteDatabase db) {
+        // drop all triggers
+        Cursor c = db.query("sqlite_master", new String[] {"name"}, "type is 'trigger'",
+                null, null, null, null);
+        while (c.moveToNext()) {
+            db.execSQL("DROP TRIGGER IF EXISTS " + c.getString(0));
+        }
+        c.close();
+
+        // drop all views
+        c = db.query("sqlite_master", new String[] {"name"}, "type is 'view'",
+                null, null, null, null);
+        while (c.moveToNext()) {
+            db.execSQL("DROP VIEW IF EXISTS " + c.getString(0));
+        }
+        c.close();
+
+        // drop all indexes
+        c = db.query("sqlite_master", new String[] {"name"}, "type is 'index'",
+                null, null, null, null);
+        while (c.moveToNext()) {
+            db.execSQL("DROP INDEX IF EXISTS " + c.getString(0));
+        }
+        c.close();
+
+        // drop all tables
+        c = db.query("sqlite_master", new String[] {"name"}, "type is 'table'",
+                null, null, null, null);
+        while (c.moveToNext()) {
+            db.execSQL("DROP TABLE IF EXISTS " + c.getString(0));
+        }
+        c.close();
+    }
+
+    private static void createLatestSchema(SQLiteDatabase db, boolean internal) {
+        makePristine(db);
+
+        db.execSQL("CREATE TABLE android_metadata (locale TEXT)");
+        db.execSQL("CREATE TABLE thumbnails (_id INTEGER PRIMARY KEY,_data TEXT,image_id INTEGER,"
+                + "kind INTEGER,width INTEGER,height INTEGER)");
+        db.execSQL("CREATE TABLE artists (artist_id INTEGER PRIMARY KEY,"
+                + "artist_key TEXT NOT NULL UNIQUE,artist TEXT NOT NULL)");
+        db.execSQL("CREATE TABLE albums (album_id INTEGER PRIMARY KEY,"
+                + "album_key TEXT NOT NULL UNIQUE,album TEXT NOT NULL)");
+        db.execSQL("CREATE TABLE album_art (album_id INTEGER PRIMARY KEY,_data TEXT)");
+        db.execSQL("CREATE TABLE videothumbnails (_id INTEGER PRIMARY KEY,_data TEXT,"
+                + "video_id INTEGER,kind INTEGER,width INTEGER,height INTEGER)");
+        db.execSQL("CREATE TABLE files (_id INTEGER PRIMARY KEY AUTOINCREMENT,"
+                + "_data TEXT UNIQUE COLLATE NOCASE,_size INTEGER,format INTEGER,parent INTEGER,"
+                + "date_added INTEGER,date_modified INTEGER,mime_type TEXT,title TEXT,"
+                + "description TEXT,_display_name TEXT,picasa_id TEXT,orientation INTEGER,"
+                + "latitude DOUBLE,longitude DOUBLE,datetaken INTEGER,mini_thumb_magic INTEGER,"
+                + "bucket_id TEXT,bucket_display_name TEXT,isprivate INTEGER,title_key TEXT,"
+                + "artist_id INTEGER,album_id INTEGER,composer TEXT,track INTEGER,"
+                + "year INTEGER CHECK(year!=0),is_ringtone INTEGER,is_music INTEGER,"
+                + "is_alarm INTEGER,is_notification INTEGER,is_podcast INTEGER,album_artist TEXT,"
+                + "duration INTEGER,bookmark INTEGER,artist TEXT,album TEXT,resolution TEXT,"
+                + "tags TEXT,category TEXT,language TEXT,mini_thumb_data TEXT,name TEXT,"
+                + "media_type INTEGER,old_id INTEGER,storage_id INTEGER,is_drm INTEGER,"
+                + "width INTEGER, height INTEGER)");
+        db.execSQL("CREATE TABLE log (time DATETIME, message TEXT)");
+        if (!internal) {
+            db.execSQL("CREATE TABLE audio_genres (_id INTEGER PRIMARY KEY,name TEXT NOT NULL)");
+            db.execSQL("CREATE TABLE audio_genres_map (_id INTEGER PRIMARY KEY,"
+                    + "audio_id INTEGER NOT NULL,genre_id INTEGER NOT NULL,"
+                    + "UNIQUE (audio_id,genre_id) ON CONFLICT IGNORE)");
+            db.execSQL("CREATE TABLE audio_playlists_map (_id INTEGER PRIMARY KEY,"
+                    + "audio_id INTEGER NOT NULL,playlist_id INTEGER NOT NULL,"
+                    + "play_order INTEGER NOT NULL)");
+            db.execSQL("CREATE TRIGGER audio_genres_cleanup DELETE ON audio_genres BEGIN DELETE"
+                    + " FROM audio_genres_map WHERE genre_id = old._id;END");
+            db.execSQL("CREATE TRIGGER audio_playlists_cleanup DELETE ON files"
+                    + " WHEN old.media_type=4"
+                    + " BEGIN DELETE FROM audio_playlists_map WHERE playlist_id = old._id;"
+                    + "SELECT _DELETE_FILE(old._data);END");
+            db.execSQL("CREATE TRIGGER files_cleanup DELETE ON files"
+                    + " BEGIN SELECT _OBJECT_REMOVED(old._id);END");
+            db.execSQL("CREATE VIEW audio_playlists AS SELECT _id,_data,name,date_added,date_modified"
+                    + " FROM files WHERE media_type=4");
+        }
+
+        db.execSQL("CREATE INDEX image_id_index on thumbnails(image_id)");
+        db.execSQL("CREATE INDEX album_idx on albums(album)");
+        db.execSQL("CREATE INDEX albumkey_index on albums(album_key)");
+        db.execSQL("CREATE INDEX artist_idx on artists(artist)");
+        db.execSQL("CREATE INDEX artistkey_index on artists(artist_key)");
+        db.execSQL("CREATE INDEX video_id_index on videothumbnails(video_id)");
+        db.execSQL("CREATE INDEX album_id_idx ON files(album_id)");
+        db.execSQL("CREATE INDEX artist_id_idx ON files(artist_id)");
+        db.execSQL("CREATE INDEX bucket_index on files(bucket_id,media_type,datetaken, _id)");
+        db.execSQL("CREATE INDEX bucket_name on files(bucket_id,media_type,bucket_display_name)");
+        db.execSQL("CREATE INDEX format_index ON files(format)");
+        db.execSQL("CREATE INDEX media_type_index ON files(media_type)");
+        db.execSQL("CREATE INDEX parent_index ON files(parent)");
+        db.execSQL("CREATE INDEX path_index ON files(_data)");
+        db.execSQL("CREATE INDEX sort_index ON files(datetaken ASC, _id ASC)");
+        db.execSQL("CREATE INDEX title_idx ON files(title)");
+        db.execSQL("CREATE INDEX titlekey_index ON files(title_key)");
+
+        db.execSQL("CREATE VIEW audio_meta AS SELECT _id,_data,_display_name,_size,mime_type,"
+                + "date_added,is_drm,date_modified,title,title_key,duration,artist_id,composer,"
+                + "album_id,track,year,is_ringtone,is_music,is_alarm,is_notification,is_podcast,"
+                + "bookmark,album_artist FROM files WHERE media_type=2");
+        db.execSQL("CREATE VIEW artists_albums_map AS SELECT DISTINCT artist_id, album_id"
+                + " FROM audio_meta");
+        db.execSQL("CREATE VIEW audio as SELECT * FROM audio_meta LEFT OUTER JOIN artists"
+                + " ON audio_meta.artist_id=artists.artist_id LEFT OUTER JOIN albums"
+                + " ON audio_meta.album_id=albums.album_id");
+        db.execSQL("CREATE VIEW album_info AS SELECT audio.album_id AS _id, album, album_key,"
+                + " MIN(year) AS minyear, MAX(year) AS maxyear, artist, artist_id, artist_key,"
+                + " count(*) AS numsongs,album_art._data AS album_art FROM audio"
+                + " LEFT OUTER JOIN album_art ON audio.album_id=album_art.album_id WHERE is_music=1"
+                + " GROUP BY audio.album_id");
+        db.execSQL("CREATE VIEW searchhelpertitle AS SELECT * FROM audio ORDER BY title_key");
+        db.execSQL("CREATE VIEW artist_info AS SELECT artist_id AS _id, artist, artist_key,"
+                + " COUNT(DISTINCT album_key) AS number_of_albums, COUNT(*) AS number_of_tracks"
+                + " FROM audio"
+                + " WHERE is_music=1 GROUP BY artist_key");
+        db.execSQL("CREATE VIEW search AS SELECT _id,'artist' AS mime_type,artist,NULL AS album,"
+                + "NULL AS title,artist AS text1,NULL AS text2,number_of_albums AS data1,"
+                + "number_of_tracks AS data2,artist_key AS match,"
+                + "'content://media/external/audio/artists/'||_id AS suggest_intent_data,"
+                + "1 AS grouporder FROM artist_info WHERE (artist!='<unknown>')"
+                + " UNION ALL SELECT _id,'album' AS mime_type,artist,album,"
+                + "NULL AS title,album AS text1,artist AS text2,NULL AS data1,"
+                + "NULL AS data2,artist_key||' '||album_key AS match,"
+                + "'content://media/external/audio/albums/'||_id AS suggest_intent_data,"
+                + "2 AS grouporder FROM album_info"
+                + " WHERE (album!='<unknown>')"
+                + " UNION ALL SELECT searchhelpertitle._id AS _id,mime_type,artist,album,title,"
+                + "title AS text1,artist AS text2,NULL AS data1,"
+                + "NULL AS data2,artist_key||' '||album_key||' '||title_key AS match,"
+                + "'content://media/external/audio/media/'||searchhelpertitle._id"
+                + " AS suggest_intent_data,"
+                + "3 AS grouporder FROM searchhelpertitle WHERE (title != '')");
+        db.execSQL("CREATE VIEW audio_genres_map_noid AS SELECT audio_id,genre_id"
+                + " FROM audio_genres_map");
+        db.execSQL("CREATE VIEW images AS SELECT _id,_data,_size,_display_name,mime_type,title,"
+                + "date_added,date_modified,description,picasa_id,isprivate,latitude,longitude,"
+                + "datetaken,orientation,mini_thumb_magic,bucket_id,bucket_display_name,width,"
+                + "height FROM files WHERE media_type=1");
+        db.execSQL("CREATE VIEW video AS SELECT _id,_data,_display_name,_size,mime_type,"
+                + "date_added,date_modified,title,duration,artist,album,resolution,description,"
+                + "isprivate,tags,category,language,mini_thumb_data,latitude,longitude,datetaken,"
+                + "mini_thumb_magic,bucket_id,bucket_display_name,bookmark,width,height"
+                + " FROM files WHERE media_type=3");
+
+        db.execSQL("CREATE TRIGGER albumart_cleanup1 DELETE ON albums BEGIN DELETE FROM album_art"
+                + " WHERE album_id = old.album_id;END");
+        db.execSQL("CREATE TRIGGER albumart_cleanup2 DELETE ON album_art"
+                + " BEGIN SELECT _DELETE_FILE(old._data);END");
+    }
+
+    private static void updateFromKKSchema(SQLiteDatabase db, boolean internal, int fromVersion) {
+        // Delete albums and artists, then clear the modification time on songs, which
+        // will cause the media scanner to rescan everything, rebuilding the artist and
+        // album tables along the way, while preserving playlists.
+        // We need this rescan because ICU also changed, and now generates different
+        // collation keys
+        db.execSQL("DELETE from albums");
+        db.execSQL("DELETE from artists");
+        db.execSQL("UPDATE files SET date_modified=0;");
+    }
+
     /**
      * This method takes care of updating all the tables in the database to the
      * current version, creating them if necessary.
-     * This method can only update databases at schema 63 or higher, which was
-     * created August 1, 2008. Older database will be cleared and recreated.
+     * This method can only update databases at schema 700 or higher, which was
+     * used by the KitKat release. Older database will be cleared and recreated.
      * @param db Database
      * @param internal True if this is the internal media database
      */
@@ -782,1133 +947,11 @@
         }
         long startTime = SystemClock.currentTimeMicro();
 
-        // Revisions 84-86 were a failed attempt at supporting the "album artist" id3 tag.
-        // We can't downgrade from those revisions, so start over.
-        // (the initial change to do this was wrong, so now we actually need to start over
-        // if the database version is 84-89)
-        // Post-gingerbread, revisions 91-94 were broken in a way that is not easy to repair.
-        // However version 91 was reused in a divergent development path for gingerbread,
-        // so we need to support upgrades from 91.
-        // Therefore we will only force a reset for versions 92 - 94.
-        if (fromVersion < 63 || (fromVersion >= 84 && fromVersion <= 89) ||
-                    (fromVersion >= 92 && fromVersion <= 94)) {
-            // Drop everything and start over.
-            Log.i(TAG, "Upgrading media database from version " +
-                    fromVersion + " to " + toVersion + ", which will destroy all old data");
-            fromVersion = 63;
-            db.execSQL("DROP TABLE IF EXISTS images");
-            db.execSQL("DROP TRIGGER IF EXISTS images_cleanup");
-            db.execSQL("DROP TABLE IF EXISTS thumbnails");
-            db.execSQL("DROP TRIGGER IF EXISTS thumbnails_cleanup");
-            db.execSQL("DROP TABLE IF EXISTS audio_meta");
-            db.execSQL("DROP TABLE IF EXISTS artists");
-            db.execSQL("DROP TABLE IF EXISTS albums");
-            db.execSQL("DROP TABLE IF EXISTS album_art");
-            db.execSQL("DROP VIEW IF EXISTS artist_info");
-            db.execSQL("DROP VIEW IF EXISTS album_info");
-            db.execSQL("DROP VIEW IF EXISTS artists_albums_map");
-            db.execSQL("DROP TRIGGER IF EXISTS audio_meta_cleanup");
-            db.execSQL("DROP TABLE IF EXISTS audio_genres");
-            db.execSQL("DROP TABLE IF EXISTS audio_genres_map");
-            db.execSQL("DROP TRIGGER IF EXISTS audio_genres_cleanup");
-            db.execSQL("DROP TABLE IF EXISTS audio_playlists");
-            db.execSQL("DROP TABLE IF EXISTS audio_playlists_map");
-            db.execSQL("DROP TRIGGER IF EXISTS audio_playlists_cleanup");
-            db.execSQL("DROP TRIGGER IF EXISTS albumart_cleanup1");
-            db.execSQL("DROP TRIGGER IF EXISTS albumart_cleanup2");
-            db.execSQL("DROP TABLE IF EXISTS video");
-            db.execSQL("DROP TRIGGER IF EXISTS video_cleanup");
-            db.execSQL("DROP TABLE IF EXISTS objects");
-            db.execSQL("DROP TRIGGER IF EXISTS images_objects_cleanup");
-            db.execSQL("DROP TRIGGER IF EXISTS audio_objects_cleanup");
-            db.execSQL("DROP TRIGGER IF EXISTS video_objects_cleanup");
-            db.execSQL("DROP TRIGGER IF EXISTS playlists_objects_cleanup");
-
-            db.execSQL("CREATE TABLE IF NOT EXISTS images (" +
-                    "_id INTEGER PRIMARY KEY," +
-                    "_data TEXT," +
-                    "_size INTEGER," +
-                    "_display_name TEXT," +
-                    "mime_type TEXT," +
-                    "title TEXT," +
-                    "date_added INTEGER," +
-                    "date_modified INTEGER," +
-                    "description TEXT," +
-                    "picasa_id TEXT," +
-                    "isprivate INTEGER," +
-                    "latitude DOUBLE," +
-                    "longitude DOUBLE," +
-                    "datetaken INTEGER," +
-                    "orientation INTEGER," +
-                    "mini_thumb_magic INTEGER," +
-                    "bucket_id TEXT," +
-                    "bucket_display_name TEXT" +
-                   ");");
-
-            db.execSQL("CREATE INDEX IF NOT EXISTS mini_thumb_magic_index on images(mini_thumb_magic);");
-
-            db.execSQL("CREATE TRIGGER IF NOT EXISTS images_cleanup DELETE ON images " +
-                    "BEGIN " +
-                        "DELETE FROM thumbnails WHERE image_id = old._id;" +
-                        "SELECT _DELETE_FILE(old._data);" +
-                    "END");
-
-            // create image thumbnail table
-            db.execSQL("CREATE TABLE IF NOT EXISTS thumbnails (" +
-                       "_id INTEGER PRIMARY KEY," +
-                       "_data TEXT," +
-                       "image_id INTEGER," +
-                       "kind INTEGER," +
-                       "width INTEGER," +
-                       "height INTEGER" +
-                       ");");
-
-            db.execSQL("CREATE INDEX IF NOT EXISTS image_id_index on thumbnails(image_id);");
-
-            db.execSQL("CREATE TRIGGER IF NOT EXISTS thumbnails_cleanup DELETE ON thumbnails " +
-                    "BEGIN " +
-                        "SELECT _DELETE_FILE(old._data);" +
-                    "END");
-
-            // Contains meta data about audio files
-            db.execSQL("CREATE TABLE IF NOT EXISTS audio_meta (" +
-                       "_id INTEGER PRIMARY KEY," +
-                       "_data TEXT UNIQUE NOT NULL," +
-                       "_display_name TEXT," +
-                       "_size INTEGER," +
-                       "mime_type TEXT," +
-                       "date_added INTEGER," +
-                       "date_modified INTEGER," +
-                       "title TEXT NOT NULL," +
-                       "title_key TEXT NOT NULL," +
-                       "duration INTEGER," +
-                       "artist_id INTEGER," +
-                       "composer TEXT," +
-                       "album_id INTEGER," +
-                       "track INTEGER," +    // track is an integer to allow proper sorting
-                       "year INTEGER CHECK(year!=0)," +
-                       "is_ringtone INTEGER," +
-                       "is_music INTEGER," +
-                       "is_alarm INTEGER," +
-                       "is_notification INTEGER" +
-                       ");");
-
-            // Contains a sort/group "key" and the preferred display name for artists
-            db.execSQL("CREATE TABLE IF NOT EXISTS artists (" +
-                        "artist_id INTEGER PRIMARY KEY," +
-                        "artist_key TEXT NOT NULL UNIQUE," +
-                        "artist TEXT NOT NULL" +
-                       ");");
-
-            // Contains a sort/group "key" and the preferred display name for albums
-            db.execSQL("CREATE TABLE IF NOT EXISTS albums (" +
-                        "album_id INTEGER PRIMARY KEY," +
-                        "album_key TEXT NOT NULL UNIQUE," +
-                        "album TEXT NOT NULL" +
-                       ");");
-
-            db.execSQL("CREATE TABLE IF NOT EXISTS album_art (" +
-                    "album_id INTEGER PRIMARY KEY," +
-                    "_data TEXT" +
-                   ");");
-
-            recreateAudioView(db);
-
-
-            // Provides some extra info about artists, like the number of tracks
-            // and albums for this artist
-            db.execSQL("CREATE VIEW IF NOT EXISTS artist_info AS " +
-                        "SELECT artist_id AS _id, artist, artist_key, " +
-                        "COUNT(DISTINCT album) AS number_of_albums, " +
-                        "COUNT(*) AS number_of_tracks FROM audio WHERE is_music=1 "+
-                        "GROUP BY artist_key;");
-
-            // Provides extra info albums, such as the number of tracks
-            db.execSQL("CREATE VIEW IF NOT EXISTS album_info AS " +
-                    "SELECT audio.album_id AS _id, album, album_key, " +
-                    "MIN(year) AS minyear, " +
-                    "MAX(year) AS maxyear, artist, artist_id, artist_key, " +
-                    "count(*) AS " + MediaStore.Audio.Albums.NUMBER_OF_SONGS +
-                    ",album_art._data AS album_art" +
-                    " FROM audio LEFT OUTER JOIN album_art ON audio.album_id=album_art.album_id" +
-                    " WHERE is_music=1 GROUP BY audio.album_id;");
-
-            // For a given artist_id, provides the album_id for albums on
-            // which the artist appears.
-            db.execSQL("CREATE VIEW IF NOT EXISTS artists_albums_map AS " +
-                    "SELECT DISTINCT artist_id, album_id FROM audio_meta;");
-
-            /*
-             * Only external media volumes can handle genres, playlists, etc.
-             */
-            if (!internal) {
-                // Cleans up when an audio file is deleted
-                db.execSQL("CREATE TRIGGER IF NOT EXISTS audio_meta_cleanup DELETE ON audio_meta " +
-                           "BEGIN " +
-                               "DELETE FROM audio_genres_map WHERE audio_id = old._id;" +
-                               "DELETE FROM audio_playlists_map WHERE audio_id = old._id;" +
-                           "END");
-
-                // Contains audio genre definitions
-                db.execSQL("CREATE TABLE IF NOT EXISTS audio_genres (" +
-                           "_id INTEGER PRIMARY KEY," +
-                           "name TEXT NOT NULL" +
-                           ");");
-
-                // Contains mappings between audio genres and audio files
-                db.execSQL("CREATE TABLE IF NOT EXISTS audio_genres_map (" +
-                           "_id INTEGER PRIMARY KEY," +
-                           "audio_id INTEGER NOT NULL," +
-                           "genre_id INTEGER NOT NULL" +
-                           ");");
-
-                // Cleans up when an audio genre is delete
-                db.execSQL("CREATE TRIGGER IF NOT EXISTS audio_genres_cleanup DELETE ON audio_genres " +
-                           "BEGIN " +
-                               "DELETE FROM audio_genres_map WHERE genre_id = old._id;" +
-                           "END");
-
-                // Contains audio playlist definitions
-                db.execSQL("CREATE TABLE IF NOT EXISTS audio_playlists (" +
-                           "_id INTEGER PRIMARY KEY," +
-                           "_data TEXT," +  // _data is path for file based playlists, or null
-                           "name TEXT NOT NULL," +
-                           "date_added INTEGER," +
-                           "date_modified INTEGER" +
-                           ");");
-
-                // Contains mappings between audio playlists and audio files
-                db.execSQL("CREATE TABLE IF NOT EXISTS audio_playlists_map (" +
-                           "_id INTEGER PRIMARY KEY," +
-                           "audio_id INTEGER NOT NULL," +
-                           "playlist_id INTEGER NOT NULL," +
-                           "play_order INTEGER NOT NULL" +
-                           ");");
-
-                // Cleans up when an audio playlist is deleted
-                db.execSQL("CREATE TRIGGER IF NOT EXISTS audio_playlists_cleanup DELETE ON audio_playlists " +
-                           "BEGIN " +
-                               "DELETE FROM audio_playlists_map WHERE playlist_id = old._id;" +
-                               "SELECT _DELETE_FILE(old._data);" +
-                           "END");
-
-                // Cleans up album_art table entry when an album is deleted
-                db.execSQL("CREATE TRIGGER IF NOT EXISTS albumart_cleanup1 DELETE ON albums " +
-                        "BEGIN " +
-                            "DELETE FROM album_art WHERE album_id = old.album_id;" +
-                        "END");
-
-                // Cleans up album_art when an album is deleted
-                db.execSQL("CREATE TRIGGER IF NOT EXISTS albumart_cleanup2 DELETE ON album_art " +
-                        "BEGIN " +
-                            "SELECT _DELETE_FILE(old._data);" +
-                        "END");
-            }
-
-            // Contains meta data about video files
-            db.execSQL("CREATE TABLE IF NOT EXISTS video (" +
-                       "_id INTEGER PRIMARY KEY," +
-                       "_data TEXT NOT NULL," +
-                       "_display_name TEXT," +
-                       "_size INTEGER," +
-                       "mime_type TEXT," +
-                       "date_added INTEGER," +
-                       "date_modified INTEGER," +
-                       "title TEXT," +
-                       "duration INTEGER," +
-                       "artist TEXT," +
-                       "album TEXT," +
-                       "resolution TEXT," +
-                       "description TEXT," +
-                       "isprivate INTEGER," +   // for YouTube videos
-                       "tags TEXT," +           // for YouTube videos
-                       "category TEXT," +       // for YouTube videos
-                       "language TEXT," +       // for YouTube videos
-                       "mini_thumb_data TEXT," +
-                       "latitude DOUBLE," +
-                       "longitude DOUBLE," +
-                       "datetaken INTEGER," +
-                       "mini_thumb_magic INTEGER" +
-                       ");");
-
-            db.execSQL("CREATE TRIGGER IF NOT EXISTS video_cleanup DELETE ON video " +
-                    "BEGIN " +
-                        "SELECT _DELETE_FILE(old._data);" +
-                    "END");
-        }
-
-        // At this point the database is at least at schema version 63 (it was
-        // either created at version 63 by the code above, or was already at
-        // version 63 or later)
-
-        if (fromVersion < 64) {
-            // create the index that updates the database to schema version 64
-            db.execSQL("CREATE INDEX IF NOT EXISTS sort_index on images(datetaken ASC, _id ASC);");
-        }
-
-        /*
-         *  Android 1.0 shipped with database version 64
-         */
-
-        if (fromVersion < 65) {
-            // create the index that updates the database to schema version 65
-            db.execSQL("CREATE INDEX IF NOT EXISTS titlekey_index on audio_meta(title_key);");
-        }
-
-        // In version 66, originally we updateBucketNames(db, "images"),
-        // but we need to do it in version 89 and therefore save the update here.
-
-        if (fromVersion < 67) {
-            // create the indices that update the database to schema version 67
-            db.execSQL("CREATE INDEX IF NOT EXISTS albumkey_index on albums(album_key);");
-            db.execSQL("CREATE INDEX IF NOT EXISTS artistkey_index on artists(artist_key);");
-        }
-
-        if (fromVersion < 68) {
-            // Create bucket_id and bucket_display_name columns for the video table.
-            db.execSQL("ALTER TABLE video ADD COLUMN bucket_id TEXT;");
-            db.execSQL("ALTER TABLE video ADD COLUMN bucket_display_name TEXT");
-
-            // In version 68, originally we updateBucketNames(db, "video"),
-            // but we need to do it in version 89 and therefore save the update here.
-        }
-
-        if (fromVersion < 69) {
-            updateDisplayName(db, "images");
-        }
-
-        if (fromVersion < 70) {
-            // Create bookmark column for the video table.
-            db.execSQL("ALTER TABLE video ADD COLUMN bookmark INTEGER;");
-        }
-
-        if (fromVersion < 71) {
-            // There is no change to the database schema, however a code change
-            // fixed parsing of metadata for certain files bought from the
-            // iTunes music store, so we want to rescan files that might need it.
-            // We do this by clearing the modification date in the database for
-            // those files, so that the media scanner will see them as updated
-            // and rescan them.
-            db.execSQL("UPDATE audio_meta SET date_modified=0 WHERE _id IN (" +
-                    "SELECT _id FROM audio where mime_type='audio/mp4' AND " +
-                    "artist='" + MediaStore.UNKNOWN_STRING + "' AND " +
-                    "album='" + MediaStore.UNKNOWN_STRING + "'" +
-                    ");");
-        }
-
-        if (fromVersion < 72) {
-            // Create is_podcast and bookmark columns for the audio table.
-            db.execSQL("ALTER TABLE audio_meta ADD COLUMN is_podcast INTEGER;");
-            db.execSQL("UPDATE audio_meta SET is_podcast=1 WHERE _data LIKE '%/podcasts/%';");
-            db.execSQL("UPDATE audio_meta SET is_music=0 WHERE is_podcast=1" +
-                    " AND _data NOT LIKE '%/music/%';");
-            db.execSQL("ALTER TABLE audio_meta ADD COLUMN bookmark INTEGER;");
-
-            // New columns added to tables aren't visible in views on those tables
-            // without opening and closing the database (or using the 'vacuum' command,
-            // which we can't do here because all this code runs inside a transaction).
-            // To work around this, we drop and recreate the affected view and trigger.
-            recreateAudioView(db);
-        }
-
-        /*
-         *  Android 1.5 shipped with database version 72
-         */
-
-        if (fromVersion < 73) {
-            // There is no change to the database schema, but we now do case insensitive
-            // matching of folder names when determining whether something is music, a
-            // ringtone, podcast, etc, so we might need to reclassify some files.
-            db.execSQL("UPDATE audio_meta SET is_music=1 WHERE is_music=0 AND " +
-                    "_data LIKE '%/music/%';");
-            db.execSQL("UPDATE audio_meta SET is_ringtone=1 WHERE is_ringtone=0 AND " +
-                    "_data LIKE '%/ringtones/%';");
-            db.execSQL("UPDATE audio_meta SET is_notification=1 WHERE is_notification=0 AND " +
-                    "_data LIKE '%/notifications/%';");
-            db.execSQL("UPDATE audio_meta SET is_alarm=1 WHERE is_alarm=0 AND " +
-                    "_data LIKE '%/alarms/%';");
-            db.execSQL("UPDATE audio_meta SET is_podcast=1 WHERE is_podcast=0 AND " +
-                    "_data LIKE '%/podcasts/%';");
-        }
-
-        if (fromVersion < 74) {
-            // This view is used instead of the audio view by the union below, to force
-            // sqlite to use the title_key index. This greatly reduces memory usage
-            // (no separate copy pass needed for sorting, which could cause errors on
-            // large datasets) and improves speed (by about 35% on a large dataset)
-            db.execSQL("CREATE VIEW IF NOT EXISTS searchhelpertitle AS SELECT * FROM audio " +
-                    "ORDER BY title_key;");
-
-            db.execSQL("CREATE VIEW IF NOT EXISTS search AS " +
-                    "SELECT _id," +
-                    "'artist' AS mime_type," +
-                    "artist," +
-                    "NULL AS album," +
-                    "NULL AS title," +
-                    "artist AS text1," +
-                    "NULL AS text2," +
-                    "number_of_albums AS data1," +
-                    "number_of_tracks AS data2," +
-                    "artist_key AS match," +
-                    "'content://media/external/audio/artists/'||_id AS suggest_intent_data," +
-                    "1 AS grouporder " +
-                    "FROM artist_info WHERE (artist!='" + MediaStore.UNKNOWN_STRING + "') " +
-                "UNION ALL " +
-                    "SELECT _id," +
-                    "'album' AS mime_type," +
-                    "artist," +
-                    "album," +
-                    "NULL AS title," +
-                    "album AS text1," +
-                    "artist AS text2," +
-                    "NULL AS data1," +
-                    "NULL AS data2," +
-                    "artist_key||' '||album_key AS match," +
-                    "'content://media/external/audio/albums/'||_id AS suggest_intent_data," +
-                    "2 AS grouporder " +
-                    "FROM album_info WHERE (album!='" + MediaStore.UNKNOWN_STRING + "') " +
-                "UNION ALL " +
-                    "SELECT searchhelpertitle._id AS _id," +
-                    "mime_type," +
-                    "artist," +
-                    "album," +
-                    "title," +
-                    "title AS text1," +
-                    "artist AS text2," +
-                    "NULL AS data1," +
-                    "NULL AS data2," +
-                    "artist_key||' '||album_key||' '||title_key AS match," +
-                    "'content://media/external/audio/media/'||searchhelpertitle._id AS " +
-                    "suggest_intent_data," +
-                    "3 AS grouporder " +
-                    "FROM searchhelpertitle WHERE (title != '') "
-                    );
-        }
-
-        if (fromVersion < 75) {
-            // Force a rescan of the audio entries so we can apply the new logic to
-            // distinguish same-named albums.
-            db.execSQL("UPDATE audio_meta SET date_modified=0;");
-            db.execSQL("DELETE FROM albums");
-        }
-
-        if (fromVersion < 76) {
-            // We now ignore double quotes when building the key, so we have to remove all of them
-            // from existing keys.
-            db.execSQL("UPDATE audio_meta SET title_key=" +
-                    "REPLACE(title_key,x'081D08C29F081D',x'081D') " +
-                    "WHERE title_key LIKE '%'||x'081D08C29F081D'||'%';");
-            db.execSQL("UPDATE albums SET album_key=" +
-                    "REPLACE(album_key,x'081D08C29F081D',x'081D') " +
-                    "WHERE album_key LIKE '%'||x'081D08C29F081D'||'%';");
-            db.execSQL("UPDATE artists SET artist_key=" +
-                    "REPLACE(artist_key,x'081D08C29F081D',x'081D') " +
-                    "WHERE artist_key LIKE '%'||x'081D08C29F081D'||'%';");
-        }
-
-        /*
-         *  Android 1.6 shipped with database version 76
-         */
-
-        if (fromVersion < 77) {
-            // create video thumbnail table
-            db.execSQL("CREATE TABLE IF NOT EXISTS videothumbnails (" +
-                    "_id INTEGER PRIMARY KEY," +
-                    "_data TEXT," +
-                    "video_id INTEGER," +
-                    "kind INTEGER," +
-                    "width INTEGER," +
-                    "height INTEGER" +
-                    ");");
-
-            db.execSQL("CREATE INDEX IF NOT EXISTS video_id_index on videothumbnails(video_id);");
-
-            db.execSQL("CREATE TRIGGER IF NOT EXISTS videothumbnails_cleanup DELETE ON videothumbnails " +
-                    "BEGIN " +
-                        "SELECT _DELETE_FILE(old._data);" +
-                    "END");
-        }
-
-        /*
-         *  Android 2.0 and 2.0.1 shipped with database version 77
-         */
-
-        if (fromVersion < 78) {
-            // Force a rescan of the video entries so we can update
-            // latest changed DATE_TAKEN units (in milliseconds).
-            db.execSQL("UPDATE video SET date_modified=0;");
-        }
-
-        /*
-         *  Android 2.1 shipped with database version 78
-         */
-
-        if (fromVersion < 79) {
-            // move /sdcard/albumthumbs to
-            // /sdcard/Android/data/com.android.providers.media/albumthumbs,
-            // and update the database accordingly
-
-            final StorageManager sm = context.getSystemService(StorageManager.class);
-            final StorageVolume vol = sm.getPrimaryVolume();
-
-            String oldthumbspath = vol.getPath() + "/albumthumbs";
-            String newthumbspath = vol.getPath() + "/" + ALBUM_THUMB_FOLDER;
-            File thumbsfolder = new File(oldthumbspath);
-            if (thumbsfolder.exists()) {
-                // move folder to its new location
-                File newthumbsfolder = new File(newthumbspath);
-                newthumbsfolder.getParentFile().mkdirs();
-                if(thumbsfolder.renameTo(newthumbsfolder)) {
-                    // update the database
-                    db.execSQL("UPDATE album_art SET _data=REPLACE(_data, '" +
-                            oldthumbspath + "','" + newthumbspath + "');");
-                }
-            }
-        }
-
-        if (fromVersion < 80) {
-            // Force rescan of image entries to update DATE_TAKEN as UTC timestamp.
-            db.execSQL("UPDATE images SET date_modified=0;");
-        }
-
-        if (fromVersion < 81 && !internal) {
-            // Delete entries starting with /mnt/sdcard. This is for the benefit
-            // of users running builds between 2.0.1 and 2.1 final only, since
-            // users updating from 2.0 or earlier will not have such entries.
-
-            // First we need to update the _data fields in the affected tables, since
-            // otherwise deleting the entries will also delete the underlying files
-            // (via a trigger), and we want to keep them.
-            db.execSQL("UPDATE audio_playlists SET _data='////' WHERE _data LIKE '/mnt/sdcard/%';");
-            db.execSQL("UPDATE images SET _data='////' WHERE _data LIKE '/mnt/sdcard/%';");
-            db.execSQL("UPDATE video SET _data='////' WHERE _data LIKE '/mnt/sdcard/%';");
-            db.execSQL("UPDATE videothumbnails SET _data='////' WHERE _data LIKE '/mnt/sdcard/%';");
-            db.execSQL("UPDATE thumbnails SET _data='////' WHERE _data LIKE '/mnt/sdcard/%';");
-            db.execSQL("UPDATE album_art SET _data='////' WHERE _data LIKE '/mnt/sdcard/%';");
-            db.execSQL("UPDATE audio_meta SET _data='////' WHERE _data LIKE '/mnt/sdcard/%';");
-            // Once the paths have been renamed, we can safely delete the entries
-            db.execSQL("DELETE FROM audio_playlists WHERE _data IS '////';");
-            db.execSQL("DELETE FROM images WHERE _data IS '////';");
-            db.execSQL("DELETE FROM video WHERE _data IS '////';");
-            db.execSQL("DELETE FROM videothumbnails WHERE _data IS '////';");
-            db.execSQL("DELETE FROM thumbnails WHERE _data IS '////';");
-            db.execSQL("DELETE FROM audio_meta WHERE _data  IS '////';");
-            db.execSQL("DELETE FROM album_art WHERE _data  IS '////';");
-
-            // rename existing entries starting with /sdcard to /mnt/sdcard
-            db.execSQL("UPDATE audio_meta" +
-                    " SET _data='/mnt/sdcard'||SUBSTR(_data,8) WHERE _data LIKE '/sdcard/%';");
-            db.execSQL("UPDATE audio_playlists" +
-                    " SET _data='/mnt/sdcard'||SUBSTR(_data,8) WHERE _data LIKE '/sdcard/%';");
-            db.execSQL("UPDATE images" +
-                    " SET _data='/mnt/sdcard'||SUBSTR(_data,8) WHERE _data LIKE '/sdcard/%';");
-            db.execSQL("UPDATE video" +
-                    " SET _data='/mnt/sdcard'||SUBSTR(_data,8) WHERE _data LIKE '/sdcard/%';");
-            db.execSQL("UPDATE videothumbnails" +
-                    " SET _data='/mnt/sdcard'||SUBSTR(_data,8) WHERE _data LIKE '/sdcard/%';");
-            db.execSQL("UPDATE thumbnails" +
-                    " SET _data='/mnt/sdcard'||SUBSTR(_data,8) WHERE _data LIKE '/sdcard/%';");
-            db.execSQL("UPDATE album_art" +
-                    " SET _data='/mnt/sdcard'||SUBSTR(_data,8) WHERE _data LIKE '/sdcard/%';");
-
-            // Delete albums and artists, then clear the modification time on songs, which
-            // will cause the media scanner to rescan everything, rebuilding the artist and
-            // album tables along the way, while preserving playlists.
-            // We need this rescan because ICU also changed, and now generates different
-            // collation keys
-            db.execSQL("DELETE from albums");
-            db.execSQL("DELETE from artists");
-            db.execSQL("UPDATE audio_meta SET date_modified=0;");
-        }
-
-        if (fromVersion < 82) {
-            // recreate this view with the correct "group by" specifier
-            db.execSQL("DROP VIEW IF EXISTS artist_info");
-            db.execSQL("CREATE VIEW IF NOT EXISTS artist_info AS " +
-                        "SELECT artist_id AS _id, artist, artist_key, " +
-                        "COUNT(DISTINCT album_key) AS number_of_albums, " +
-                        "COUNT(*) AS number_of_tracks FROM audio WHERE is_music=1 "+
-                        "GROUP BY artist_key;");
-        }
-
-        /* we skipped over version 83, and reverted versions 84, 85 and 86 */
-
-        if (fromVersion < 87) {
-            // The fastscroll thumb needs an index on the strings being displayed,
-            // otherwise the queries it does to determine the correct position
-            // becomes really inefficient
-            db.execSQL("CREATE INDEX IF NOT EXISTS title_idx on audio_meta(title);");
-            db.execSQL("CREATE INDEX IF NOT EXISTS artist_idx on artists(artist);");
-            db.execSQL("CREATE INDEX IF NOT EXISTS album_idx on albums(album);");
-        }
-
-        if (fromVersion < 88) {
-            // Clean up a few more things from versions 84/85/86, and recreate
-            // the few things worth keeping from those changes.
-            db.execSQL("DROP TRIGGER IF EXISTS albums_update1;");
-            db.execSQL("DROP TRIGGER IF EXISTS albums_update2;");
-            db.execSQL("DROP TRIGGER IF EXISTS albums_update3;");
-            db.execSQL("DROP TRIGGER IF EXISTS albums_update4;");
-            db.execSQL("DROP TRIGGER IF EXISTS artist_update1;");
-            db.execSQL("DROP TRIGGER IF EXISTS artist_update2;");
-            db.execSQL("DROP TRIGGER IF EXISTS artist_update3;");
-            db.execSQL("DROP TRIGGER IF EXISTS artist_update4;");
-            db.execSQL("DROP VIEW IF EXISTS album_artists;");
-            db.execSQL("CREATE INDEX IF NOT EXISTS album_id_idx on audio_meta(album_id);");
-            db.execSQL("CREATE INDEX IF NOT EXISTS artist_id_idx on audio_meta(artist_id);");
-            // For a given artist_id, provides the album_id for albums on
-            // which the artist appears.
-            db.execSQL("CREATE VIEW IF NOT EXISTS artists_albums_map AS " +
-                    "SELECT DISTINCT artist_id, album_id FROM audio_meta;");
-        }
-
-        // In version 89, originally we updateBucketNames(db, "images") and
-        // updateBucketNames(db, "video"), but in version 101 we now updateBucketNames
-        //  for all files and therefore can save the update here.
-
-        if (fromVersion < 91) {
-            // Never query by mini_thumb_magic_index
-            db.execSQL("DROP INDEX IF EXISTS mini_thumb_magic_index");
-
-            // sort the items by taken date in each bucket
-            db.execSQL("CREATE INDEX IF NOT EXISTS image_bucket_index ON images(bucket_id, datetaken)");
-            db.execSQL("CREATE INDEX IF NOT EXISTS video_bucket_index ON video(bucket_id, datetaken)");
-        }
-
-
-        // Gingerbread ended up going to version 100, but didn't yet have the "files"
-        // table, so we need to create that if we're at 100 or lower. This means
-        // we won't be able to upgrade pre-release Honeycomb.
-        if (fromVersion <= 100) {
-            // Remove various stages of work in progress for MTP support
-            db.execSQL("DROP TABLE IF EXISTS objects");
-            db.execSQL("DROP TABLE IF EXISTS files");
-            db.execSQL("DROP TRIGGER IF EXISTS images_objects_cleanup;");
-            db.execSQL("DROP TRIGGER IF EXISTS audio_objects_cleanup;");
-            db.execSQL("DROP TRIGGER IF EXISTS video_objects_cleanup;");
-            db.execSQL("DROP TRIGGER IF EXISTS playlists_objects_cleanup;");
-            db.execSQL("DROP TRIGGER IF EXISTS files_cleanup_images;");
-            db.execSQL("DROP TRIGGER IF EXISTS files_cleanup_audio;");
-            db.execSQL("DROP TRIGGER IF EXISTS files_cleanup_video;");
-            db.execSQL("DROP TRIGGER IF EXISTS files_cleanup_playlists;");
-            db.execSQL("DROP TRIGGER IF EXISTS media_cleanup;");
-
-            // Create a new table to manage all files in our storage.
-            // This contains a union of all the columns from the old
-            // images, audio_meta, videos and audio_playlist tables.
-            db.execSQL("CREATE TABLE files (" +
-                        "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
-                        "_data TEXT," +     // this can be null for playlists
-                        "_size INTEGER," +
-                        "format INTEGER," +
-                        "parent INTEGER," +
-                        "date_added INTEGER," +
-                        "date_modified INTEGER," +
-                        "mime_type TEXT," +
-                        "title TEXT," +
-                        "description TEXT," +
-                        "_display_name TEXT," +
-
-                        // for images
-                        "picasa_id TEXT," +
-                        "orientation INTEGER," +
-
-                        // for images and video
-                        "latitude DOUBLE," +
-                        "longitude DOUBLE," +
-                        "datetaken INTEGER," +
-                        "mini_thumb_magic INTEGER," +
-                        "bucket_id TEXT," +
-                        "bucket_display_name TEXT," +
-                        "isprivate INTEGER," +
-
-                        // for audio
-                        "title_key TEXT," +
-                        "artist_id INTEGER," +
-                        "album_id INTEGER," +
-                        "composer TEXT," +
-                        "track INTEGER," +
-                        "year INTEGER CHECK(year!=0)," +
-                        "is_ringtone INTEGER," +
-                        "is_music INTEGER," +
-                        "is_alarm INTEGER," +
-                        "is_notification INTEGER," +
-                        "is_podcast INTEGER," +
-                        "album_artist TEXT," +
-
-                        // for audio and video
-                        "duration INTEGER," +
-                        "bookmark INTEGER," +
-
-                        // for video
-                        "artist TEXT," +
-                        "album TEXT," +
-                        "resolution TEXT," +
-                        "tags TEXT," +
-                        "category TEXT," +
-                        "language TEXT," +
-                        "mini_thumb_data TEXT," +
-
-                        // for playlists
-                        "name TEXT," +
-
-                        // media_type is used by the views to emulate the old
-                        // images, audio_meta, videos and audio_playlist tables.
-                        "media_type INTEGER," +
-
-                        // Value of _id from the old media table.
-                        // Used only for updating other tables during database upgrade.
-                        "old_id INTEGER" +
-                       ");");
-
-            db.execSQL("CREATE INDEX path_index ON files(_data);");
-            db.execSQL("CREATE INDEX media_type_index ON files(media_type);");
-
-            // Copy all data from our obsolete tables to the new files table
-
-            // Copy audio records first, preserving the _id column.
-            // We do this to maintain compatibility for content Uris for ringtones.
-            // Unfortunately we cannot do this for images and videos as well.
-            // We choose to do this for the audio table because the fragility of Uris
-            // for ringtones are the most common problem we need to avoid.
-            db.execSQL("INSERT INTO files (_id," + AUDIO_COLUMNSv99 + ",old_id,media_type)" +
-                    " SELECT _id," + AUDIO_COLUMNSv99 + ",_id," + FileColumns.MEDIA_TYPE_AUDIO +
-                    " FROM audio_meta;");
-
-            db.execSQL("INSERT INTO files (" + IMAGE_COLUMNSv407 + ",old_id,media_type) SELECT "
-                    + IMAGE_COLUMNSv407 + ",_id," + FileColumns.MEDIA_TYPE_IMAGE + " FROM images;");
-            db.execSQL("INSERT INTO files (" + VIDEO_COLUMNSv407 + ",old_id,media_type) SELECT "
-                    + VIDEO_COLUMNSv407 + ",_id," + FileColumns.MEDIA_TYPE_VIDEO + " FROM video;");
-            if (!internal) {
-                db.execSQL("INSERT INTO files (" + PLAYLIST_COLUMNS + ",old_id,media_type) SELECT "
-                        + PLAYLIST_COLUMNS + ",_id," + FileColumns.MEDIA_TYPE_PLAYLIST
-                        + " FROM audio_playlists;");
-            }
-
-            // Delete the old tables
-            db.execSQL("DROP TABLE IF EXISTS images");
-            db.execSQL("DROP TABLE IF EXISTS audio_meta");
-            db.execSQL("DROP TABLE IF EXISTS video");
-            db.execSQL("DROP TABLE IF EXISTS audio_playlists");
-
-            // Create views to replace our old tables
-            db.execSQL("CREATE VIEW images AS SELECT _id," + IMAGE_COLUMNSv407 +
-                        " FROM files WHERE " + FileColumns.MEDIA_TYPE + "="
-                        + FileColumns.MEDIA_TYPE_IMAGE + ";");
-            db.execSQL("CREATE VIEW audio_meta AS SELECT _id," + AUDIO_COLUMNSv100 +
-                        " FROM files WHERE " + FileColumns.MEDIA_TYPE + "="
-                        + FileColumns.MEDIA_TYPE_AUDIO + ";");
-            db.execSQL("CREATE VIEW video AS SELECT _id," + VIDEO_COLUMNSv407 +
-                        " FROM files WHERE " + FileColumns.MEDIA_TYPE + "="
-                        + FileColumns.MEDIA_TYPE_VIDEO + ";");
-            if (!internal) {
-                db.execSQL("CREATE VIEW audio_playlists AS SELECT _id," + PLAYLIST_COLUMNS +
-                        " FROM files WHERE " + FileColumns.MEDIA_TYPE + "="
-                        + FileColumns.MEDIA_TYPE_PLAYLIST + ";");
-            }
-
-            // create temporary index to make the updates go faster
-            db.execSQL("CREATE INDEX tmp ON files(old_id);");
-
-            // update the image_id column in the thumbnails table.
-            db.execSQL("UPDATE thumbnails SET image_id = (SELECT _id FROM files "
-                        + "WHERE files.old_id = thumbnails.image_id AND files.media_type = "
-                        + FileColumns.MEDIA_TYPE_IMAGE + ");");
-
-            if (!internal) {
-                // update audio_id in the audio_genres_map table, and
-                // audio_playlists_map tables and playlist_id in the audio_playlists_map table
-                db.execSQL("UPDATE audio_genres_map SET audio_id = (SELECT _id FROM files "
-                        + "WHERE files.old_id = audio_genres_map.audio_id AND files.media_type = "
-                        + FileColumns.MEDIA_TYPE_AUDIO + ");");
-                db.execSQL("UPDATE audio_playlists_map SET audio_id = (SELECT _id FROM files "
-                        + "WHERE files.old_id = audio_playlists_map.audio_id "
-                        + "AND files.media_type = " + FileColumns.MEDIA_TYPE_AUDIO + ");");
-                db.execSQL("UPDATE audio_playlists_map SET playlist_id = (SELECT _id FROM files "
-                        + "WHERE files.old_id = audio_playlists_map.playlist_id "
-                        + "AND files.media_type = " + FileColumns.MEDIA_TYPE_PLAYLIST + ");");
-            }
-
-            // update video_id in the videothumbnails table.
-            db.execSQL("UPDATE videothumbnails SET video_id = (SELECT _id FROM files "
-                        + "WHERE files.old_id = videothumbnails.video_id AND files.media_type = "
-                        + FileColumns.MEDIA_TYPE_VIDEO + ");");
-
-            // we don't need this index anymore now
-            db.execSQL("DROP INDEX tmp;");
-
-            // update indices to work on the files table
-            db.execSQL("DROP INDEX IF EXISTS title_idx");
-            db.execSQL("DROP INDEX IF EXISTS album_id_idx");
-            db.execSQL("DROP INDEX IF EXISTS image_bucket_index");
-            db.execSQL("DROP INDEX IF EXISTS video_bucket_index");
-            db.execSQL("DROP INDEX IF EXISTS sort_index");
-            db.execSQL("DROP INDEX IF EXISTS titlekey_index");
-            db.execSQL("DROP INDEX IF EXISTS artist_id_idx");
-            db.execSQL("CREATE INDEX title_idx ON files(title);");
-            db.execSQL("CREATE INDEX album_id_idx ON files(album_id);");
-            db.execSQL("CREATE INDEX bucket_index ON files(bucket_id, datetaken);");
-            db.execSQL("CREATE INDEX sort_index ON files(datetaken ASC, _id ASC);");
-            db.execSQL("CREATE INDEX titlekey_index ON files(title_key);");
-            db.execSQL("CREATE INDEX artist_id_idx ON files(artist_id);");
-
-            // Recreate triggers for our obsolete tables on the new files table
-            db.execSQL("DROP TRIGGER IF EXISTS images_cleanup");
-            db.execSQL("DROP TRIGGER IF EXISTS audio_meta_cleanup");
-            db.execSQL("DROP TRIGGER IF EXISTS video_cleanup");
-            db.execSQL("DROP TRIGGER IF EXISTS audio_playlists_cleanup");
-            db.execSQL("DROP TRIGGER IF EXISTS audio_delete");
-
-            db.execSQL("CREATE TRIGGER IF NOT EXISTS images_cleanup DELETE ON files " +
-                    "WHEN old.media_type = " + FileColumns.MEDIA_TYPE_IMAGE + " " +
-                    "BEGIN " +
-                        "DELETE FROM thumbnails WHERE image_id = old._id;" +
-                        "SELECT _DELETE_FILE(old._data);" +
-                    "END");
-
-            db.execSQL("CREATE TRIGGER IF NOT EXISTS video_cleanup DELETE ON files " +
-                    "WHEN old.media_type = " + FileColumns.MEDIA_TYPE_VIDEO + " " +
-                    "BEGIN " +
-                        "SELECT _DELETE_FILE(old._data);" +
-                    "END");
-
-            if (!internal) {
-                db.execSQL("CREATE TRIGGER IF NOT EXISTS audio_meta_cleanup DELETE ON files " +
-                       "WHEN old.media_type = " + FileColumns.MEDIA_TYPE_AUDIO + " " +
-                       "BEGIN " +
-                           "DELETE FROM audio_genres_map WHERE audio_id = old._id;" +
-                           "DELETE FROM audio_playlists_map WHERE audio_id = old._id;" +
-                       "END");
-
-                db.execSQL("CREATE TRIGGER IF NOT EXISTS audio_playlists_cleanup DELETE ON files " +
-                       "WHEN old.media_type = " + FileColumns.MEDIA_TYPE_PLAYLIST + " " +
-                       "BEGIN " +
-                           "DELETE FROM audio_playlists_map WHERE playlist_id = old._id;" +
-                           "SELECT _DELETE_FILE(old._data);" +
-                       "END");
-
-                db.execSQL("CREATE TRIGGER IF NOT EXISTS audio_delete INSTEAD OF DELETE ON audio " +
-                        "BEGIN " +
-                            "DELETE from files where _id=old._id;" +
-                            "DELETE from audio_playlists_map where audio_id=old._id;" +
-                            "DELETE from audio_genres_map where audio_id=old._id;" +
-                        "END");
-            }
-        }
-
-        if (fromVersion < 301) {
-            db.execSQL("DROP INDEX IF EXISTS bucket_index");
-            db.execSQL("CREATE INDEX bucket_index on files(bucket_id, media_type, datetaken, _id)");
-            db.execSQL("CREATE INDEX bucket_name on files(bucket_id, media_type, bucket_display_name)");
-        }
-
-        if (fromVersion < 302) {
-            db.execSQL("CREATE INDEX parent_index ON files(parent);");
-            db.execSQL("CREATE INDEX format_index ON files(format);");
-        }
-
-        if (fromVersion < 303) {
-            // the album disambiguator hash changed, so rescan songs and force
-            // albums to be updated. Artists are unaffected.
-            db.execSQL("DELETE from albums");
-            db.execSQL("UPDATE files SET date_modified=0 WHERE " + FileColumns.MEDIA_TYPE + "="
-                    + FileColumns.MEDIA_TYPE_AUDIO + ";");
-        }
-
-        if (fromVersion < 304 && !internal) {
-            // notifies host when files are deleted
-            db.execSQL("CREATE TRIGGER IF NOT EXISTS files_cleanup DELETE ON files " +
-                    "BEGIN " +
-                        "SELECT _OBJECT_REMOVED(old._id);" +
-                    "END");
-
-        }
-
-        if (fromVersion < 305 && internal) {
-            // version 304 erroneously added this trigger to the internal database
-            db.execSQL("DROP TRIGGER IF EXISTS files_cleanup");
-        }
-
-        if (fromVersion < 306 && !internal) {
-            // The genre list was expanded and genre string parsing was tweaked, so
-            // rebuild the genre list
-            db.execSQL("UPDATE files SET date_modified=0 WHERE " + FileColumns.MEDIA_TYPE + "="
-                    + FileColumns.MEDIA_TYPE_AUDIO + ";");
-            db.execSQL("DELETE FROM audio_genres_map");
-            db.execSQL("DELETE FROM audio_genres");
-        }
-
-        if (fromVersion < 307 && !internal) {
-            // Force rescan of image entries to update DATE_TAKEN by either GPSTimeStamp or
-            // EXIF local time.
-            db.execSQL("UPDATE files SET date_modified=0 WHERE " + FileColumns.MEDIA_TYPE + "="
-                    + FileColumns.MEDIA_TYPE_IMAGE + ";");
-        }
-
-        // Honeycomb went up to version 307, ICS started at 401
-
-        // Database version 401 did not add storage_id to the internal database.
-        // We need it there too, so add it in version 402
-        if (fromVersion < 401 || (fromVersion == 401 && internal)) {
-            // Add column for MTP storage ID
-            db.execSQL("ALTER TABLE files ADD COLUMN storage_id INTEGER;");
-            // Anything in the database before this upgrade step will be in the primary storage
-            db.execSQL("UPDATE files SET storage_id=" + StorageVolume.STORAGE_ID_PRIMARY + ";");
-        }
-
-        if (fromVersion < 403 && !internal) {
-            db.execSQL("CREATE VIEW audio_genres_map_noid AS " +
-                    "SELECT audio_id,genre_id from audio_genres_map;");
-        }
-
-        if (fromVersion < 404) {
-            // There was a bug that could cause distinct same-named albums to be
-            // combined again. Delete albums and force a rescan.
-            db.execSQL("DELETE from albums");
-            db.execSQL("UPDATE files SET date_modified=0 WHERE " + FileColumns.MEDIA_TYPE + "="
-                    + FileColumns.MEDIA_TYPE_AUDIO + ";");
-        }
-
-        if (fromVersion < 405) {
-            // Add is_drm column.
-            db.execSQL("ALTER TABLE files ADD COLUMN is_drm INTEGER;");
-
-            db.execSQL("DROP VIEW IF EXISTS audio_meta");
-            db.execSQL("CREATE VIEW audio_meta AS SELECT _id," + AUDIO_COLUMNSv405 +
-                        " FROM files WHERE " + FileColumns.MEDIA_TYPE + "="
-                        + FileColumns.MEDIA_TYPE_AUDIO + ";");
-
-            recreateAudioView(db);
-        }
-
-        if (fromVersion < 407) {
-            // Rescan files in the media database because a new column has been added
-            // in table files in version 405 and to recover from problems populating
-            // the genre tables
-            db.execSQL("UPDATE files SET date_modified=0;");
-        }
-
-        if (fromVersion < 408) {
-            // Add the width/height columns for images and video
-            db.execSQL("ALTER TABLE files ADD COLUMN width INTEGER;");
-            db.execSQL("ALTER TABLE files ADD COLUMN height INTEGER;");
-
-            // Rescan files to fill the columns
-            db.execSQL("UPDATE files SET date_modified=0;");
-
-            // Update images and video views to contain the width/height columns
-            db.execSQL("DROP VIEW IF EXISTS images");
-            db.execSQL("DROP VIEW IF EXISTS video");
-            db.execSQL("CREATE VIEW images AS SELECT _id," + IMAGE_COLUMNS +
-                        " FROM files WHERE " + FileColumns.MEDIA_TYPE + "="
-                        + FileColumns.MEDIA_TYPE_IMAGE + ";");
-            db.execSQL("CREATE VIEW video AS SELECT _id," + VIDEO_COLUMNS +
-                        " FROM files WHERE " + FileColumns.MEDIA_TYPE + "="
-                        + FileColumns.MEDIA_TYPE_VIDEO + ";");
-        }
-
-        if (fromVersion < 409 && !internal) {
-            // A bug that prevented numeric genres from being parsed was fixed, so
-            // rebuild the genre list
-            db.execSQL("UPDATE files SET date_modified=0 WHERE " + FileColumns.MEDIA_TYPE + "="
-                    + FileColumns.MEDIA_TYPE_AUDIO + ";");
-            db.execSQL("DELETE FROM audio_genres_map");
-            db.execSQL("DELETE FROM audio_genres");
-        }
-
-        // ICS went out with database version 409, JB started at 500
-
-        if (fromVersion < 500) {
-            // we're now deleting the file in mediaprovider code, rather than via a trigger
-            db.execSQL("DROP TRIGGER IF EXISTS videothumbnails_cleanup;");
-        }
-        if (fromVersion < 501) {
-            // we're now deleting the file in mediaprovider code, rather than via a trigger
-            // the images_cleanup trigger would delete the image file and the entry
-            // in the thumbnail table, which in turn would trigger thumbnails_cleanup
-            // to delete the thumbnail image
-            db.execSQL("DROP TRIGGER IF EXISTS images_cleanup;");
-            db.execSQL("DROP TRIGGER IF EXISTS thumbnails_cleanup;");
-        }
-        if (fromVersion < 502) {
-            // we're now deleting the file in mediaprovider code, rather than via a trigger
-            db.execSQL("DROP TRIGGER IF EXISTS video_cleanup;");
-        }
-        if (fromVersion < 503) {
-            // genre and playlist cleanup now done in mediaprovider code, instead of in a trigger
-            db.execSQL("DROP TRIGGER IF EXISTS audio_delete");
-            db.execSQL("DROP TRIGGER IF EXISTS audio_meta_cleanup");
-        }
-        if (fromVersion < 504) {
-            // add an index to help with case-insensitive matching of paths
-            db.execSQL(
-                    "CREATE INDEX IF NOT EXISTS path_index_lower ON files(_data COLLATE NOCASE);");
-        }
-        if (fromVersion < 505) {
-            // Starting with schema 505 we fill in the width/height/resolution columns for videos,
-            // so force a rescan of videos to fill in the blanks
-            db.execSQL("UPDATE files SET date_modified=0 WHERE " + FileColumns.MEDIA_TYPE + "="
-                    + FileColumns.MEDIA_TYPE_VIDEO + ";");
-        }
-        if (fromVersion < 506) {
-            // sd card storage got moved to /storage/sdcard0
-            // first delete everything that already got scanned in /storage before this
-            // update step was added
-            db.execSQL("DROP TRIGGER IF EXISTS files_cleanup");
-            db.execSQL("DELETE FROM files WHERE _data LIKE '/storage/%';");
-            db.execSQL("DELETE FROM album_art WHERE _data LIKE '/storage/%';");
-            db.execSQL("DELETE FROM thumbnails WHERE _data LIKE '/storage/%';");
-            db.execSQL("DELETE FROM videothumbnails WHERE _data LIKE '/storage/%';");
-            // then rename everything from /mnt/sdcard/ to /storage/sdcard0,
-            // and from /mnt/external1 to /storage/sdcard1
-            db.execSQL("UPDATE files SET " +
-                "_data='/storage/sdcard0'||SUBSTR(_data,12) WHERE _data LIKE '/mnt/sdcard/%';");
-            db.execSQL("UPDATE files SET " +
-                "_data='/storage/sdcard1'||SUBSTR(_data,15) WHERE _data LIKE '/mnt/external1/%';");
-            db.execSQL("UPDATE album_art SET " +
-                "_data='/storage/sdcard0'||SUBSTR(_data,12) WHERE _data LIKE '/mnt/sdcard/%';");
-            db.execSQL("UPDATE album_art SET " +
-                "_data='/storage/sdcard1'||SUBSTR(_data,15) WHERE _data LIKE '/mnt/external1/%';");
-            db.execSQL("UPDATE thumbnails SET " +
-                "_data='/storage/sdcard0'||SUBSTR(_data,12) WHERE _data LIKE '/mnt/sdcard/%';");
-            db.execSQL("UPDATE thumbnails SET " +
-                "_data='/storage/sdcard1'||SUBSTR(_data,15) WHERE _data LIKE '/mnt/external1/%';");
-            db.execSQL("UPDATE videothumbnails SET " +
-                "_data='/storage/sdcard0'||SUBSTR(_data,12) WHERE _data LIKE '/mnt/sdcard/%';");
-            db.execSQL("UPDATE videothumbnails SET " +
-                "_data='/storage/sdcard1'||SUBSTR(_data,15) WHERE _data LIKE '/mnt/external1/%';");
-
-            if (!internal) {
-                db.execSQL("CREATE TRIGGER IF NOT EXISTS files_cleanup DELETE ON files " +
-                    "BEGIN " +
-                        "SELECT _OBJECT_REMOVED(old._id);" +
-                    "END");
-            }
-        }
-        if (fromVersion < 507) {
-            // we update _data in version 506, we need to update the bucket_id as well
-            updateBucketNames(db);
-        }
-        if (fromVersion < 508 && !internal) {
-            // ensure we don't get duplicate entries in the genre map
-            db.execSQL("CREATE TABLE IF NOT EXISTS audio_genres_map_tmp (" +
-                    "_id INTEGER PRIMARY KEY," +
-                    "audio_id INTEGER NOT NULL," +
-                    "genre_id INTEGER NOT NULL," +
-                    "UNIQUE (audio_id,genre_id) ON CONFLICT IGNORE" +
-                    ");");
-            db.execSQL("INSERT INTO audio_genres_map_tmp (audio_id,genre_id)" +
-                    " SELECT DISTINCT audio_id,genre_id FROM audio_genres_map;");
-            db.execSQL("DROP TABLE audio_genres_map;");
-            db.execSQL("ALTER TABLE audio_genres_map_tmp RENAME TO audio_genres_map;");
-        }
-
-        if (fromVersion < 509) {
-            db.execSQL("CREATE TABLE IF NOT EXISTS log (time DATETIME PRIMARY KEY, message TEXT);");
-        }
-
-        // Emulated external storage moved to user-specific paths
-        if (fromVersion < 510 && Environment.isExternalStorageEmulated()) {
-            // File.fixSlashes() removes any trailing slashes
-            final String externalStorage = Environment.getExternalStorageDirectory().toString();
-            Log.d(TAG, "Adjusting external storage paths to: " + externalStorage);
-
-            final String[] tables = {
-                    TABLE_FILES, TABLE_ALBUM_ART, TABLE_THUMBNAILS, TABLE_VIDEO_THUMBNAILS };
-            for (String table : tables) {
-                db.execSQL("UPDATE " + table + " SET " + "_data='" + externalStorage
-                        + "'||SUBSTR(_data,17) WHERE _data LIKE '/storage/sdcard0/%';");
-            }
-        }
-        if (fromVersion < 511) {
-            // we update _data in version 510, we need to update the bucket_id as well
-            updateBucketNames(db);
-        }
-
-        // JB 4.2 went out with database version 511, starting next release with 600
-
-        if (fromVersion < 600) {
-            // modify _data column to be unique and collate nocase. Because this drops the original
-            // table and replaces it with a new one by the same name, we need to also recreate all
-            // indices and triggers that refer to the files table.
-            // Views don't need to be recreated.
-
-            db.execSQL("CREATE TABLE files2 (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
-                    "_data TEXT UNIQUE" +
-                    // the internal filesystem is case-sensitive
-                    (internal ? "," : " COLLATE NOCASE,") +
-                    "_size INTEGER,format INTEGER,parent INTEGER,date_added INTEGER," +
-                    "date_modified INTEGER,mime_type TEXT,title TEXT,description TEXT," +
-                    "_display_name TEXT,picasa_id TEXT,orientation INTEGER,latitude DOUBLE," +
-                    "longitude DOUBLE,datetaken INTEGER,mini_thumb_magic INTEGER,bucket_id TEXT," +
-                    "bucket_display_name TEXT,isprivate INTEGER,title_key TEXT,artist_id INTEGER," +
-                    "album_id INTEGER,composer TEXT,track INTEGER,year INTEGER CHECK(year!=0)," +
-                    "is_ringtone INTEGER,is_music INTEGER,is_alarm INTEGER," +
-                    "is_notification INTEGER,is_podcast INTEGER,album_artist TEXT," +
-                    "duration INTEGER,bookmark INTEGER,artist TEXT,album TEXT,resolution TEXT," +
-                    "tags TEXT,category TEXT,language TEXT,mini_thumb_data TEXT,name TEXT," +
-                    "media_type INTEGER,old_id INTEGER,storage_id INTEGER,is_drm INTEGER," +
-                    "width INTEGER, height INTEGER);");
-
-            // copy data from old table, squashing entries with duplicate _data
-            db.execSQL("INSERT OR REPLACE INTO files2 SELECT * FROM files;");
-            db.execSQL("DROP TABLE files;");
-            db.execSQL("ALTER TABLE files2 RENAME TO files;");
-
-            // recreate indices and triggers
-            db.execSQL("CREATE INDEX album_id_idx ON files(album_id);");
-            db.execSQL("CREATE INDEX artist_id_idx ON files(artist_id);");
-            db.execSQL("CREATE INDEX bucket_index on files(bucket_id,media_type," +
-                    "datetaken, _id);");
-            db.execSQL("CREATE INDEX bucket_name on files(bucket_id,media_type," +
-                    "bucket_display_name);");
-            db.execSQL("CREATE INDEX format_index ON files(format);");
-            db.execSQL("CREATE INDEX media_type_index ON files(media_type);");
-            db.execSQL("CREATE INDEX parent_index ON files(parent);");
-            db.execSQL("CREATE INDEX path_index ON files(_data);");
-            db.execSQL("CREATE INDEX sort_index ON files(datetaken ASC, _id ASC);");
-            db.execSQL("CREATE INDEX title_idx ON files(title);");
-            db.execSQL("CREATE INDEX titlekey_index ON files(title_key);");
-            if (!internal) {
-                db.execSQL("CREATE TRIGGER audio_playlists_cleanup DELETE ON files" +
-                        " WHEN old.media_type=4" +
-                        " BEGIN DELETE FROM audio_playlists_map WHERE playlist_id = old._id;" +
-                        "SELECT _DELETE_FILE(old._data);END;");
-                db.execSQL("CREATE TRIGGER files_cleanup DELETE ON files" +
-                        " BEGIN SELECT _OBJECT_REMOVED(old._id);END;");
-            }
-        }
-
-        if (fromVersion < 601) {
-            // remove primary key constraint because column time is not necessarily unique
-            db.execSQL("CREATE TABLE IF NOT EXISTS log_tmp (time DATETIME, message TEXT);");
-            db.execSQL("DELETE FROM log_tmp;");
-            db.execSQL("INSERT INTO log_tmp SELECT time, message FROM log order by rowid;");
-            db.execSQL("DROP TABLE log;");
-            db.execSQL("ALTER TABLE log_tmp RENAME TO log;");
-        }
-
         if (fromVersion < 700) {
-            // fix datetaken fields that were added with an incorrect timestamp
-            // datetaken needs to be in milliseconds, so should generally be a few orders of
-            // magnitude larger than date_modified. If it's within the same order of magnitude, it
-            // is probably wrong.
-            // (this could do the wrong thing if your picture was actually taken before ~3/21/1970)
-            db.execSQL("UPDATE files set datetaken=date_modified*1000"
-                    + " WHERE date_modified IS NOT NULL"
-                    + " AND datetaken IS NOT NULL"
-                    + " AND datetaken<date_modified*5;");
-        }
-
-       if (fromVersion < 800) {
-            // Delete albums and artists, then clear the modification time on songs, which
-            // will cause the media scanner to rescan everything, rebuilding the artist and
-            // album tables along the way, while preserving playlists.
-            // We need this rescan because ICU also changed, and now generates different
-            // collation keys
-            db.execSQL("DELETE from albums");
-            db.execSQL("DELETE from artists");
-            db.execSQL("UPDATE files SET date_modified=0;");
+            // Anything older than KK is recreated from scratch
+            createLatestSchema(db, internal);
+        } else if (fromVersion < 800) {
+            updateFromKKSchema(db, internal, fromVersion);
         }
 
         sanityCheck(db, fromVersion);
@@ -1957,88 +1000,6 @@
         }
     }
 
-    private static void recreateAudioView(SQLiteDatabase db) {
-        // Provides a unified audio/artist/album info view.
-        db.execSQL("DROP VIEW IF EXISTS audio");
-        db.execSQL("CREATE VIEW IF NOT EXISTS audio as SELECT * FROM audio_meta " +
-                    "LEFT OUTER JOIN artists ON audio_meta.artist_id=artists.artist_id " +
-                    "LEFT OUTER JOIN albums ON audio_meta.album_id=albums.album_id;");
-    }
-
-    /**
-     * Update the bucket_id and bucket_display_name columns for images and videos
-     * @param db
-     * @param tableName
-     */
-    private static void updateBucketNames(SQLiteDatabase db) {
-        // Rebuild the bucket_display_name column using the natural case rather than lower case.
-        db.beginTransaction();
-        try {
-            String[] columns = {BaseColumns._ID, MediaColumns.DATA};
-            // update only images and videos
-            Cursor cursor = db.query("files", columns, "media_type=1 OR media_type=3",
-                    null, null, null, null);
-            try {
-                final int idColumnIndex = cursor.getColumnIndex(BaseColumns._ID);
-                final int dataColumnIndex = cursor.getColumnIndex(MediaColumns.DATA);
-                String [] rowId = new String[1];
-                ContentValues values = new ContentValues();
-                while (cursor.moveToNext()) {
-                    String data = cursor.getString(dataColumnIndex);
-                    rowId[0] = cursor.getString(idColumnIndex);
-                    if (data != null) {
-                        values.clear();
-                        computeBucketValues(data, values);
-                        db.update("files", values, "_id=?", rowId);
-                    } else {
-                        Log.w(TAG, "null data at id " + rowId);
-                    }
-                }
-            } finally {
-                IoUtils.closeQuietly(cursor);
-            }
-            db.setTransactionSuccessful();
-        } finally {
-            db.endTransaction();
-        }
-    }
-
-    /**
-     * Iterate through the rows of a table in a database, ensuring that the
-     * display name column has a value.
-     * @param db
-     * @param tableName
-     */
-    private static void updateDisplayName(SQLiteDatabase db, String tableName) {
-        // Fill in default values for null displayName values
-        db.beginTransaction();
-        try {
-            String[] columns = {BaseColumns._ID, MediaColumns.DATA, MediaColumns.DISPLAY_NAME};
-            Cursor cursor = db.query(tableName, columns, null, null, null, null, null);
-            try {
-                final int idColumnIndex = cursor.getColumnIndex(BaseColumns._ID);
-                final int dataColumnIndex = cursor.getColumnIndex(MediaColumns.DATA);
-                final int displayNameIndex = cursor.getColumnIndex(MediaColumns.DISPLAY_NAME);
-                ContentValues values = new ContentValues();
-                while (cursor.moveToNext()) {
-                    String displayName = cursor.getString(displayNameIndex);
-                    if (displayName == null) {
-                        String data = cursor.getString(dataColumnIndex);
-                        values.clear();
-                        computeDisplayName(data, values);
-                        int rowId = cursor.getInt(idColumnIndex);
-                        db.update(tableName, values, "_id=" + rowId, null);
-                    }
-                }
-            } finally {
-                IoUtils.closeQuietly(cursor);
-            }
-            db.setTransactionSuccessful();
-        } finally {
-            db.endTransaction();
-        }
-    }
-
     /**
      * @param data The input path
      * @param values the content values, where the bucked id name and bucket display name are updated.
@@ -2892,21 +1853,24 @@
             return setObjectReferences(helper, db, handle, values);
         }
 
-
-        db.beginTransaction();
         ArrayList<Long> notifyRowIds = new ArrayList<Long>();
         int numInserted = 0;
-        try {
-            int len = values.length;
-            for (int i = 0; i < len; i++) {
-                if (values[i] != null) {
-                    insertInternal(uri, match, values[i], notifyRowIds);
+        // insert may need to call getParent(), which in turn may need to update the database,
+        // so synchronize on mDirectoryCache to avoid deadlocks
+        synchronized (mDirectoryCache) {
+            db.beginTransaction();
+            try {
+                int len = values.length;
+                for (int i = 0; i < len; i++) {
+                    if (values[i] != null) {
+                        insertInternal(uri, match, values[i], notifyRowIds);
+                    }
                 }
+                numInserted = len;
+                db.setTransactionSuccessful();
+            } finally {
+                db.endTransaction();
             }
-            numInserted = len;
-            db.setTransactionSuccessful();
-        } finally {
-            db.endTransaction();
         }
 
         // Notify MTP (outside of successful transaction)
@@ -3688,6 +2652,14 @@
                 }
                 break;
 
+            case FILES_DIRECTORY:
+                rowId = insertDirectory(helper, helper.getWritableDatabase(),
+                        initialValues.getAsString(FileColumns.DATA));
+                if (rowId > 0) {
+                    newUri = Files.getContentUri(volumeName, rowId);
+                }
+                break;
+
             default:
                 throw new UnsupportedOperationException("Invalid URI " + uri);
         }
@@ -3877,33 +2849,42 @@
     public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
                 throws OperationApplicationException {
 
-        // The operations array provides no overall information about the URI(s) being operated
-        // on, so begin a transaction for ALL of the databases.
-        DatabaseHelper ihelper = getDatabaseForUri(MediaStore.Audio.Media.INTERNAL_CONTENT_URI);
-        DatabaseHelper ehelper = getDatabaseForUri(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
-        SQLiteDatabase idb = ihelper.getWritableDatabase();
-        idb.beginTransaction();
-        SQLiteDatabase edb = null;
-        if (ehelper != null) {
-            edb = ehelper.getWritableDatabase();
-            edb.beginTransaction();
-        }
-        try {
-            ContentProviderResult[] result = super.applyBatch(operations);
-            idb.setTransactionSuccessful();
-            if (edb != null) {
-                edb.setTransactionSuccessful();
-            }
-            // Rather than sending targeted change notifications for every Uri
-            // affected by the batch operation, just invalidate the entire internal
-            // and external name space.
-            ContentResolver res = getContext().getContentResolver();
-            res.notifyChange(Uri.parse("content://media/"), null);
-            return result;
-        } finally {
-            idb.endTransaction();
-            if (edb != null) {
-                edb.endTransaction();
+        // batched operations are likely to need to call getParent(), which in turn may need to
+        // update the database, so synchronize on mDirectoryCache to avoid deadlocks
+        synchronized (mDirectoryCache) {
+            // The operations array provides no overall information about the URI(s) being operated
+            // on, so begin a transaction for ALL of the databases.
+            DatabaseHelper ihelper = getDatabaseForUri(MediaStore.Audio.Media.INTERNAL_CONTENT_URI);
+            DatabaseHelper ehelper = getDatabaseForUri(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
+            SQLiteDatabase idb = ihelper.getWritableDatabase();
+            idb.beginTransaction();
+            SQLiteDatabase edb = null;
+            try {
+                if (ehelper != null) {
+                    edb = ehelper.getWritableDatabase();
+                }
+                if (edb != null) {
+                    edb.beginTransaction();
+                }
+                ContentProviderResult[] result = super.applyBatch(operations);
+                idb.setTransactionSuccessful();
+                if (edb != null) {
+                    edb.setTransactionSuccessful();
+                }
+                // Rather than sending targeted change notifications for every Uri
+                // affected by the batch operation, just invalidate the entire internal
+                // and external name space.
+                ContentResolver res = getContext().getContentResolver();
+                res.notifyChange(Uri.parse("content://media/"), null);
+                return result;
+            } finally {
+                try {
+                    idb.endTransaction();
+                } finally {
+                    if (edb != null) {
+                        edb.endTransaction();
+                    }
+                }
             }
         }
     }
@@ -4091,6 +3072,7 @@
             case MTP_OBJECTS_ID:
                 where = "_id=" + uri.getPathSegments().get(2);
             case FILES:
+            case FILES_DIRECTORY:
             case MTP_OBJECTS:
                 out.table = "files";
                 break;
@@ -4354,10 +3336,10 @@
         synchronized (sGetTableAndWhereParam) {
             getTableAndWhere(uri, match, userWhere, sGetTableAndWhereParam);
 
-            // special case renaming directories via MTP.
+            // special case renaming directories via MTP and ESP.
             // in this case we must update all paths in the database with
             // the directory name as a prefix
-            if ((match == MTP_OBJECTS || match == MTP_OBJECTS_ID)
+            if ((match == MTP_OBJECTS || match == MTP_OBJECTS_ID || match == FILES_DIRECTORY)
                     && initialValues != null && initialValues.size() == 1) {
                 String oldPath = null;
                 String newPath = initialValues.getAsString(MediaStore.MediaColumns.DATA);
@@ -4875,10 +3857,34 @@
             // don't write to non-cache, non-sdcard files.
             throw new FileNotFoundException("Can't access " + file);
         } else {
+            boolean hasWriteMediaStorage = c.checkCallingOrSelfPermission(WRITE_MEDIA_STORAGE)
+                    == PackageManager.PERMISSION_GRANTED;
+            boolean hasInteractAcrossUsers = c.checkCallingOrSelfPermission(INTERACT_ACROSS_USERS)
+                    == PackageManager.PERMISSION_GRANTED;
+            if (!hasWriteMediaStorage && !hasInteractAcrossUsers && isOtherUserExternalDir(path)) {
+                throw new FileNotFoundException("Can't access across users " + file);
+            }
             checkWorldReadAccess(path);
         }
     }
 
+    private boolean isOtherUserExternalDir(String path) {
+        List<VolumeInfo> volumes = mStorageManager.getVolumes();
+        for (VolumeInfo volume : volumes) {
+            if (FileUtils.contains(volume.path, path)) {
+                // If any of mExternalStoragePaths belongs to this volume and doesn't include
+                // the path, then we consider the path to be from another user
+                for (String externalStoragePath : mExternalStoragePaths) {
+                    if (FileUtils.contains(volume.path, externalStoragePath)
+                            && !FileUtils.contains(externalStoragePath, path)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
     private boolean isSecondaryExternalPath(String path) {
         for (int i = 1; i < mExternalStoragePaths.length; i++) {
             if (path.startsWith(mExternalStoragePaths[i])) {
@@ -5748,6 +4754,9 @@
     // when MTP is connected and disconnected
     private static final int MTP_CONNECTED = 705;
 
+    // Used only to invoke special logic for directories
+    private static final int FILES_DIRECTORY = 706;
+
     private static final UriMatcher URI_MATCHER =
             new UriMatcher(UriMatcher.NO_MATCH);
 
@@ -5828,6 +4837,9 @@
         URI_MATCHER.addURI("media", "*/object/#", MTP_OBJECTS_ID);
         URI_MATCHER.addURI("media", "*/object/#/references", MTP_OBJECT_REFERENCES);
 
+        // Used only to trigger special logic for directories
+        URI_MATCHER.addURI("media", "*/dir", FILES_DIRECTORY);
+
         /**
          * @deprecated use the 'basic' or 'fancy' search Uris instead
          */
diff --git a/src/com/android/providers/media/MediaUpgradeReceiver.java b/src/com/android/providers/media/MediaUpgradeReceiver.java
index 58a6ab8..c3a22d2 100644
--- a/src/com/android/providers/media/MediaUpgradeReceiver.java
+++ b/src/com/android/providers/media/MediaUpgradeReceiver.java
@@ -18,7 +18,6 @@
 
 import java.io.File;
 
-import android.app.ActivityManagerNative;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
diff --git a/src/com/android/providers/media/MtpReceiver.java b/src/com/android/providers/media/MtpReceiver.java
index 00f460c..0895c5e 100644
--- a/src/com/android/providers/media/MtpReceiver.java
+++ b/src/com/android/providers/media/MtpReceiver.java
@@ -56,7 +56,7 @@
         boolean configChanged = extras.getBoolean(UsbManager.USB_CONFIG_CHANGED);
         boolean isCurrentUser = UserHandle.myUserId() == ActivityManager.getCurrentUser();
 
-        if (configChanged && (mtpEnabled || ptpEnabled)) {
+        if ((configChanged || (connected && !configured)) && (mtpEnabled || ptpEnabled)) {
             if (!isCurrentUser)
                 return;
             MtpServer.configure(ptpEnabled);
diff --git a/src/com/android/providers/media/MtpService.java b/src/com/android/providers/media/MtpService.java
index b178c6f..b9ea3ed 100644
--- a/src/com/android/providers/media/MtpService.java
+++ b/src/com/android/providers/media/MtpService.java
@@ -16,6 +16,7 @@
 
 package com.android.providers.media;
 
+import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.app.Service;
 import android.content.Intent;
@@ -32,6 +33,9 @@
 import android.os.storage.StorageVolume;
 import android.util.Log;
 
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.Preconditions;
+
 import java.io.File;
 import java.util.HashMap;
 
@@ -66,7 +70,7 @@
     private final StorageEventListener mStorageEventListener = new StorageEventListener() {
         @Override
         public void onStorageStateChanged(String path, String oldState, String newState) {
-            synchronized (mBinder) {
+            synchronized (MtpService.this) {
                 Log.d(TAG, "onStorageStateChanged " + path + " " + oldState + " -> " + newState);
                 if (Environment.MEDIA_MOUNTED.equals(newState)) {
                     volumeMountedLocked(path);
@@ -80,21 +84,38 @@
         }
     };
 
-    private MtpDatabase mDatabase;
-    private MtpServer mServer;
+    /**
+     * Static state of MtpServer. MtpServer opens FD for MTP driver internally and we cannot open
+     * multiple MtpServer at the same time. The static field used to handle the case where MtpServer
+     * lives beyond the lifetime of MtpService.
+     *
+     * Lock MtpService.this before locking MtpService.class if needed. Otherwise it goes to
+     * deadlock.
+     */
+    @GuardedBy("MtpService.class")
+    private static ServerHolder sServerHolder;
+
     private StorageManager mStorageManager;
+
     /** Flag indicating if MTP is disabled due to keyguard */
+    @GuardedBy("this")
     private boolean mMtpDisabled;
+    @GuardedBy("this")
     private boolean mUnlocked;
+    @GuardedBy("this")
     private boolean mPtpMode;
+
+    @GuardedBy("this")
     private final HashMap<String, StorageVolume> mVolumeMap = new HashMap<String, StorageVolume>();
+    @GuardedBy("this")
     private final HashMap<String, MtpStorage> mStorageMap = new HashMap<String, MtpStorage>();
+    @GuardedBy("this")
     private StorageVolume[] mVolumes;
 
     @Override
     public void onCreate() {
         mStorageManager = StorageManager.from(this);
-        synchronized (mBinder) {
+        synchronized (this) {
             updateDisabledStateLocked();
             mStorageManager.registerListener(mStorageEventListener);
             StorageVolume[] volumes = mStorageManager.getVolumeList();
@@ -111,9 +132,9 @@
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
-        mUnlocked = intent.getBooleanExtra(UsbManager.USB_DATA_UNLOCKED, false);
-        if (LOGD) { Log.d(TAG, "onStartCommand intent=" + intent + " mUnlocked=" + mUnlocked); }
-        synchronized (mBinder) {
+        synchronized (this) {
+            mUnlocked = intent.getBooleanExtra(UsbManager.USB_DATA_UNLOCKED, false);
+            if (LOGD) { Log.d(TAG, "onStartCommand intent=" + intent + " mUnlocked=" + mUnlocked); }
             updateDisabledStateLocked();
             mPtpMode = (intent == null ? false
                     : intent.getBooleanExtra(UsbManager.USB_FUNCTION_PTP, false));
@@ -130,9 +151,6 @@
                 }
             }
             final StorageVolume primary = StorageManager.getPrimaryVolume(mVolumes);
-            if (mDatabase != null) {
-                mDatabase.setServer(null);
-            }
             manageServiceLocked(primary, subdirs);
         }
 
@@ -153,59 +171,71 @@
      */
     private void manageServiceLocked(StorageVolume primary, String[] subdirs) {
         final boolean isCurrentUser = UserHandle.myUserId() == ActivityManager.getCurrentUser();
-        if (mServer == null && isCurrentUser) {
+
+        synchronized (MtpService.class) {
+            if (sServerHolder != null) {
+                if (LOGD) {
+                    Log.d(TAG, "Cannot launch second MTP server.");
+                }
+                // Previously executed MtpServer is still running. It will be terminated
+                // because MTP device FD will become invalid soon. Also MtpService will get new
+                // intent after that when UsbDeviceManager configures USB with new state.
+                return;
+            }
+            if (!isCurrentUser) {
+                return;
+            }
+
             Log.d(TAG, "starting MTP server in " + (mPtpMode ? "PTP mode" : "MTP mode"));
-            mDatabase = new MtpDatabase(this, MediaProvider.EXTERNAL_VOLUME,
+            final MtpDatabase database = new MtpDatabase(this, MediaProvider.EXTERNAL_VOLUME,
                     primary.getPath(), subdirs);
             String deviceSerialNumber = Build.SERIAL;
             if (Build.UNKNOWN.equals(deviceSerialNumber)) {
                 deviceSerialNumber = "????????";
             }
-            mServer =
+            final MtpServer server =
                     new MtpServer(
-                            mDatabase,
+                            database,
                             mPtpMode,
+                            new OnServerTerminated(),
                             Build.MANUFACTURER, // MTP DeviceInfo: Manufacturer
                             Build.MODEL,        // MTP DeviceInfo: Model
                             "1.0",              // MTP DeviceInfo: Device Version
                             deviceSerialNumber  // MTP DeviceInfo: Serial Number
                             );
-            mDatabase.setServer(mServer);
+            database.setServer(server);
+            sServerHolder = new ServerHolder(server, database);
+
+            // Need to run addStorageDevicesLocked after sServerHolder is set since it accesses
+            // sServerHolder.
             if (!mMtpDisabled) {
                 addStorageDevicesLocked();
             }
-            mServer.start();
-        } else if (mServer != null && !isCurrentUser) {
-            Log.d(TAG, "no longer current user; shutting down MTP server");
-            // Internally, kernel will close our FD, and server thread will
-            // handle cleanup.
-            mServer = null;
-            mDatabase.setServer(null);
+            server.start();
         }
     }
 
     @Override
     public void onDestroy() {
         mStorageManager.unregisterListener(mStorageEventListener);
-        if (mDatabase != null) {
-            mDatabase.setServer(null);
-        }
     }
 
     private final IMtpService.Stub mBinder =
             new IMtpService.Stub() {
+        @Override
         public void sendObjectAdded(int objectHandle) {
-            synchronized (mBinder) {
-                if (mServer != null) {
-                    mServer.sendObjectAdded(objectHandle);
+            synchronized (MtpService.class) {
+                if (sServerHolder != null) {
+                    sServerHolder.server.sendObjectAdded(objectHandle);
                 }
             }
         }
 
+        @Override
         public void sendObjectRemoved(int objectHandle) {
-            synchronized (mBinder) {
-                if (mServer != null) {
-                    mServer.sendObjectRemoved(objectHandle);
+            synchronized (MtpService.class) {
+                if (sServerHolder != null) {
+                    sServerHolder.server.sendObjectRemoved(objectHandle);
                 }
             }
         }
@@ -244,11 +274,11 @@
                     + " at " + storage.getPath());
         }
 
-        if (mDatabase != null) {
-            mDatabase.addStorage(storage);
-        }
-        if (mServer != null) {
-            mServer.addStorage(storage);
+        synchronized (MtpService.class) {
+            if (sServerHolder != null) {
+                sServerHolder.database.addStorage(storage);
+                sServerHolder.server.addStorage(storage);
+            }
         }
     }
 
@@ -261,11 +291,42 @@
 
         Log.d(TAG, "Removing MTP storage " + Integer.toHexString(storage.getStorageId()) + " at "
                 + storage.getPath());
-        if (mDatabase != null) {
-            mDatabase.removeStorage(storage);
+
+        synchronized (MtpService.class) {
+            if (sServerHolder != null) {
+                sServerHolder.database.removeStorage(storage);
+                sServerHolder.server.removeStorage(storage);
+            }
         }
-        if (mServer != null) {
-            mServer.removeStorage(storage);
+    }
+
+    private static class ServerHolder {
+        @NonNull final MtpServer server;
+        @NonNull final MtpDatabase database;
+
+        ServerHolder(@NonNull MtpServer server, @NonNull MtpDatabase database) {
+            Preconditions.checkNotNull(server);
+            Preconditions.checkNotNull(database);
+            this.server = server;
+            this.database = database;
+        }
+
+        void close() {
+            this.database.setServer(null);
+        }
+    }
+
+    private class OnServerTerminated implements Runnable {
+        @Override
+        public void run() {
+            synchronized (MtpService.class) {
+                if (sServerHolder == null) {
+                    Log.e(TAG, "sServerHolder is unexpectedly null.");
+                    return;
+                }
+                sServerHolder.close();
+                sServerHolder = null;
+            }
         }
     }
 }
diff --git a/src/com/android/providers/media/RingtonePickerActivity.java b/src/com/android/providers/media/RingtonePickerActivity.java
index 710787a..7d91b6b 100644
--- a/src/com/android/providers/media/RingtonePickerActivity.java
+++ b/src/com/android/providers/media/RingtonePickerActivity.java
@@ -16,6 +16,8 @@
 
 package com.android.providers.media;
 
+import android.content.ContentProvider;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -26,20 +28,30 @@
 import android.media.Ringtone;
 import android.media.RingtoneManager;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.Environment;
 import android.os.Handler;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.MediaStore;
 import android.provider.Settings;
 import android.util.Log;
 import android.util.TypedValue;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.AdapterView;
+import android.widget.CursorAdapter;
+import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import com.android.internal.app.AlertActivity;
 import com.android.internal.app.AlertController;
 
+import java.io.IOException;
 import java.util.Objects;
 import java.util.regex.Pattern;
 
@@ -65,11 +77,14 @@
 
     private static final String SOUND_NAME_RES_PREFIX = "sound_name_";
 
+    private static final int ADD_FILE_REQUEST_CODE = 300;
+
     private RingtoneManager mRingtoneManager;
     private int mType;
 
     private Cursor mCursor;
     private Handler mHandler;
+    private BadgedRingtoneAdapter mAdapter;
 
     /** The position in the list of the 'Silent' item. */
     private int mSilentPos = POS_UNKNOWN;
@@ -77,9 +92,6 @@
     /** The position in the list of the 'Default' item. */
     private int mDefaultRingtonePos = POS_UNKNOWN;
 
-    /** The position in the list of the last clicked item. */
-    private int mClickedPos = POS_UNKNOWN;
-
     /** The position in the list of the ringtone to sample. */
     private int mSampleRingtonePos = POS_UNKNOWN;
 
@@ -98,6 +110,12 @@
     /** The Uri to play when the 'Default' item is clicked. */
     private Uri mUriForDefaultItem;
 
+    /** Id of the user to which the ringtone picker should list the ringtones */
+    private int mPickerUserId;
+
+    /** Context of the user specified by mPickerUserId */
+    private Context mTargetContext;
+
     /**
      * A Ringtone for the default ringtone. In most cases, the RingtoneManager
      * will stop the previous ringtone. However, the RingtoneManager doesn't
@@ -111,6 +129,11 @@
      */
     private Ringtone mCurrentRingtone;
 
+    /**
+     * Stable ID for the ringtone that is currently checked (may be -1 if no ringtone is checked).
+     */
+    private long mCheckedItemId = -1;
+
     private int mAttributesFlags;
 
     private boolean mShowOkCancelButtons;
@@ -128,8 +151,19 @@
          * On item clicked
          */
         public void onClick(DialogInterface dialog, int which) {
+            if (which == mCursor.getCount() + mStaticItemCount) {
+                // The "Add new ringtone" item was clicked. Start a file picker intent to select
+                // only audio files (MIME type "audio/*")
+                final Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
+                chooseFile.setType("audio/*");
+                chooseFile.putExtra(Intent.EXTRA_MIME_TYPES,
+                        new String[] { "audio/*", "application/ogg" });
+                startActivityForResult(chooseFile, ADD_FILE_REQUEST_CODE);
+                return;
+            }
+
             // Save the position of most recently clicked item
-            mClickedPos = which;
+            setCheckedItem(which);
 
             // In the buttonless (watch-only) version, preemptively set our result since we won't
             // have another chance to do so before the activity closes.
@@ -150,15 +184,12 @@
         mHandler = new Handler();
 
         Intent intent = getIntent();
-
-        // Give the Activity so it can do managed queries
-        mRingtoneManager = new RingtoneManager(this);
+        mPickerUserId = UserHandle.myUserId();
+        mTargetContext = this;
 
         // Get the types of ringtones to show
         mType = intent.getIntExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, -1);
-        if (mType != -1) {
-            mRingtoneManager.setType(mType);
-        }
+        initRingtoneManager();
 
         /*
          * Get whether to show the 'Default' item, and the URI to play when the
@@ -179,9 +210,6 @@
             }
         }
 
-        if (savedInstanceState != null) {
-            mClickedPos = savedInstanceState.getInt(SAVE_CLICKED_POS, POS_UNKNOWN);
-        }
         // Get whether to show the 'Silent' item
         mHasSilentItem = intent.getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
         // AudioAttributes flags
@@ -191,9 +219,6 @@
 
         mShowOkCancelButtons = getResources().getBoolean(R.bool.config_showOkCancelButtons);
 
-
-        mCursor = new LocalizedCursor(mRingtoneManager.getCursor(), getResources(), COLUMN_LABEL);
-
         // The volume keys will control the stream that we are choosing a ringtone for
         setVolumeControlStream(mRingtoneManager.inferStreamType());
 
@@ -201,8 +226,15 @@
         mExistingUri = intent
                 .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI);
 
+        // Create the list of ringtones and hold on to it so we can update later.
+        mAdapter = new BadgedRingtoneAdapter(this, mCursor,
+                /* isManagedProfile = */ UserManager.get(this).isManagedProfile(mPickerUserId));
+        if (savedInstanceState != null) {
+            setCheckedItem(savedInstanceState.getInt(SAVE_CLICKED_POS, POS_UNKNOWN));
+        }
+
         final AlertController.AlertParams p = mAlertParams;
-        p.mCursor = mCursor;
+        p.mAdapter = mAdapter;
         p.mOnClickListener = mRingtoneClickListener;
         p.mLabelColumn = COLUMN_LABEL;
         p.mIsSingleChoice = true;
@@ -217,7 +249,14 @@
 
         p.mTitle = intent.getCharSequenceExtra(RingtoneManager.EXTRA_RINGTONE_TITLE);
         if (p.mTitle == null) {
-            p.mTitle = getString(com.android.internal.R.string.ringtone_picker_title);
+          if (mType == RingtoneManager.TYPE_ALARM) {
+              p.mTitle = getString(com.android.internal.R.string.ringtone_picker_title_alarm);
+          } else if (mType == RingtoneManager.TYPE_NOTIFICATION) {
+              p.mTitle =
+                  getString(com.android.internal.R.string.ringtone_picker_title_notification);
+          } else {
+              p.mTitle = getString(com.android.internal.R.string.ringtone_picker_title);
+          }
         }
 
         setupAlert();
@@ -225,16 +264,95 @@
     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
-        outState.putInt(SAVE_CLICKED_POS, mClickedPos);
+        outState.putInt(SAVE_CLICKED_POS, getCheckedItem());
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+        if (requestCode == ADD_FILE_REQUEST_CODE && resultCode == RESULT_OK) {
+            // Add the custom ringtone in a separate thread
+            final AsyncTask<Uri, Void, Uri> installTask = new AsyncTask<Uri, Void, Uri>() {
+                @Override
+                protected Uri doInBackground(Uri... params) {
+                    try {
+                        return mRingtoneManager.addCustomExternalRingtone(params[0], mType);
+                    } catch (IOException | IllegalArgumentException e) {
+                        Log.e(TAG, "Unable to add new ringtone", e);
+                    }
+                    return null;
+                }
+
+                @Override
+                protected void onPostExecute(Uri ringtoneUri) {
+                    if (ringtoneUri != null) {
+                        requeryForAdapter();
+                    } else {
+                        // Ringtone was not added, display error Toast
+                        Toast.makeText(RingtonePickerActivity.this, R.string.unable_to_add_ringtone,
+                                Toast.LENGTH_SHORT).show();
+                    }
+                }
+            };
+            installTask.execute(data.getData());
+        }
+    }
+
+    // Disabled because context menus aren't Material Design :(
+    /*
+    @Override
+    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
+        int position = ((AdapterContextMenuInfo) menuInfo).position;
+
+        Ringtone ringtone = getRingtone(getRingtoneManagerPosition(position));
+        if (ringtone != null && mRingtoneManager.isCustomRingtone(ringtone.getUri())) {
+            // It's a custom ringtone so we display the context menu
+            menu.setHeaderTitle(ringtone.getTitle(this));
+            menu.add(Menu.NONE, Menu.FIRST, Menu.NONE, R.string.delete_ringtone_text);
+        }
+    }
+
+    @Override
+    public boolean onContextItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case Menu.FIRST: {
+                int deletedRingtonePos = ((AdapterContextMenuInfo) item.getMenuInfo()).position;
+                Uri deletedRingtoneUri = getRingtone(
+                        getRingtoneManagerPosition(deletedRingtonePos)).getUri();
+                if(mRingtoneManager.deleteExternalRingtone(deletedRingtoneUri)) {
+                    requeryForAdapter();
+                } else {
+                    Toast.makeText(this, R.string.unable_to_delete_ringtone, Toast.LENGTH_SHORT)
+                            .show();
+                }
+                return true;
+            }
+            default: {
+                return false;
+            }
+        }
+    }
+    */
+
+    @Override
+    public void onDestroy() {
+        if (mCursor != null) {
+            mCursor.close();
+            mCursor = null;
+        }
+        super.onDestroy();
     }
 
     public void onPrepareListView(ListView listView) {
+        // Reset the static item count, as this method can be called multiple times
+        mStaticItemCount = 0;
 
         if (mHasDefaultItem) {
             mDefaultRingtonePos = addDefaultRingtoneItem(listView);
 
-            if (mClickedPos == POS_UNKNOWN && RingtoneManager.isDefault(mExistingUri)) {
-                mClickedPos = mDefaultRingtonePos;
+            if (getCheckedItem() == POS_UNKNOWN && RingtoneManager.isDefault(mExistingUri)) {
+                setCheckedItem(mDefaultRingtonePos);
             }
         }
 
@@ -242,13 +360,13 @@
             mSilentPos = addSilentItem(listView);
 
             // The 'Silent' item should use a null Uri
-            if (mClickedPos == POS_UNKNOWN && mExistingUri == null) {
-                mClickedPos = mSilentPos;
+            if (getCheckedItem() == POS_UNKNOWN && mExistingUri == null) {
+                setCheckedItem(mSilentPos);
             }
         }
 
-        if (mClickedPos == POS_UNKNOWN) {
-            mClickedPos = getListPosition(mRingtoneManager.getRingtonePosition(mExistingUri));
+        if (getCheckedItem() == POS_UNKNOWN) {
+            setCheckedItem(getListPosition(mRingtoneManager.getRingtonePosition(mExistingUri)));
         }
 
         // In the buttonless (watch-only) version, preemptively set our result since we won't
@@ -256,8 +374,39 @@
         if (!mShowOkCancelButtons) {
             setResultFromSelection();
         }
-        // Put a checkmark next to an item.
-        mAlertParams.mCheckedItem = mClickedPos;
+        // If external storage is available, add a button to install sounds from storage.
+        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+            addNewRingtoneItem(listView);
+        }
+
+        // Enable context menu in ringtone items
+        registerForContextMenu(listView);
+    }
+
+    /**
+     * Re-query RingtoneManager for the most recent set of installed ringtones. May move the
+     * selected item position to match the new position of the chosen sound.
+     *
+     * This should only need to happen after adding or removing a ringtone.
+     */
+    private void requeryForAdapter() {
+        // Refresh and set a new cursor, closing the old one.
+        initRingtoneManager();
+        mAdapter.changeCursor(mCursor);
+
+        // Update checked item location.
+        int checkedPosition = POS_UNKNOWN;
+        for (int i = 0; i < mAdapter.getCount(); i++) {
+            if (mAdapter.getItemId(i) == mCheckedItemId) {
+                checkedPosition = getListPosition(i);
+                break;
+            }
+        }
+        if (mHasSilentItem && checkedPosition == POS_UNKNOWN) {
+            checkedPosition = mSilentPos;
+        }
+        setCheckedItem(checkedPosition);
+        setupAlert();
     }
 
     /**
@@ -291,6 +440,37 @@
         return addStaticItem(listView, com.android.internal.R.string.ringtone_silent);
     }
 
+    private void addNewRingtoneItem(ListView listView) {
+        listView.addFooterView(getLayoutInflater().inflate(R.layout.add_ringtone_item, listView,
+                false /* attachToRoot */));
+    }
+
+    private void initRingtoneManager() {
+        // Reinstantiate the RingtoneManager. Cursor.requery() was deprecated and calling it
+        // causes unexpected behavior.
+        mRingtoneManager = new RingtoneManager(mTargetContext, /* includeParentRingtones */ true);
+        if (mType != -1) {
+            mRingtoneManager.setType(mType);
+        }
+        mCursor = new LocalizedCursor(mRingtoneManager.getCursor(), getResources(), COLUMN_LABEL);
+    }
+
+    private Ringtone getRingtone(int ringtoneManagerPosition) {
+        if (ringtoneManagerPosition < 0) {
+            return null;
+        }
+        return mRingtoneManager.getRingtone(ringtoneManagerPosition);
+    }
+
+    private int getCheckedItem() {
+        return mAlertParams.mCheckedItem;
+    }
+
+    private void setCheckedItem(int pos) {
+        mAlertParams.mCheckedItem = pos;
+        mCheckedItemId = mAdapter.getItemId(getRingtoneManagerPosition(pos));
+    }
+
     /*
      * On click of Ok/Cancel buttons
      */
@@ -313,7 +493,6 @@
      * On item selected via keys
      */
     public void onItemSelected(AdapterView parent, View view, int position, long id) {
-        mClickedPos = position;
         playRingtone(position, DELAY_MS_SELECTION_PLAYED);
 
         // In the buttonless (watch-only) version, preemptively set our result since we won't
@@ -371,7 +550,6 @@
     @Override
     protected void onStop() {
         super.onStop();
-        mCursor.deactivate();
 
         if (!isChangingConfigurations()) {
             stopAnyPlayingRingtone();
@@ -391,14 +569,14 @@
     private void setResultFromSelection() {
         // Obtain the currently selected ringtone
         Uri uri = null;
-        if (mClickedPos == mDefaultRingtonePos) {
+        if (getCheckedItem() == mDefaultRingtonePos) {
             // Set it to the default Uri that they originally gave us
             uri = mUriForDefaultItem;
-        } else if (mClickedPos == mSilentPos) {
+        } else if (getCheckedItem() == mSilentPos) {
             // A null Uri is for the 'Silent' item
             uri = null;
         } else {
-            uri = mRingtoneManager.getRingtoneUri(getRingtoneManagerPosition(mClickedPos));
+            uri = mRingtoneManager.getRingtoneUri(getRingtoneManagerPosition(getCheckedItem()));
         }
 
         // Return new URI if another ringtone was selected, as there's no ok/cancel button
@@ -515,4 +693,61 @@
             }
         }
     }
+
+    private class BadgedRingtoneAdapter extends CursorAdapter {
+        private final boolean mIsManagedProfile;
+
+        public BadgedRingtoneAdapter(Context context, Cursor cursor, boolean isManagedProfile) {
+            super(context, cursor);
+            mIsManagedProfile = isManagedProfile;
+        }
+
+        @Override
+        public long getItemId(int position) {
+            if (position < 0) {
+                return position;
+            }
+            return super.getItemId(position);
+        }
+
+        @Override
+        public View newView(Context context, Cursor cursor, ViewGroup parent) {
+            LayoutInflater inflater = LayoutInflater.from(context);
+            return inflater.inflate(R.layout.radio_with_work_badge, parent, false);
+        }
+
+        @Override
+        public void bindView(View view, Context context, Cursor cursor) {
+            // Set text as the title of the ringtone
+            ((TextView) view.findViewById(R.id.checked_text_view))
+                    .setText(cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX));
+
+            boolean isWorkRingtone = false;
+            if (mIsManagedProfile) {
+                /*
+                 * Display the work icon if the ringtone belongs to a work profile. We can tell that
+                 * a ringtone belongs to a work profile if the picker user is a managed profile, the
+                 * ringtone Uri is in external storage, and either the uri has no user id or has the
+                 * id of the picker user
+                 */
+                Uri currentUri = mRingtoneManager.getRingtoneUri(cursor.getPosition());
+                int uriUserId = ContentProvider.getUserIdFromUri(currentUri, mPickerUserId);
+                Uri uriWithoutUserId = ContentProvider.getUriWithoutUserId(currentUri);
+
+                if (uriUserId == mPickerUserId && uriWithoutUserId.toString()
+                        .startsWith(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI.toString())) {
+                    isWorkRingtone = true;
+                }
+            }
+
+            ImageView workIcon = (ImageView) view.findViewById(R.id.work_icon);
+            if(isWorkRingtone) {
+                workIcon.setImageDrawable(getPackageManager().getUserBadgeForDensityNoBackground(
+                        UserHandle.of(mPickerUserId), -1 /* density */));
+                workIcon.setVisibility(View.VISIBLE);
+            } else {
+                workIcon.setVisibility(View.GONE);
+            }
+        }
+    }
 }