diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index 7171564..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_JAVA_LIBRARIES := ext guava
-
-LOCAL_PACKAGE_NAME := ApplicationsProvider
-LOCAL_CERTIFICATE := shared
-LOCAL_PRIVILEGED_MODULE := true
-
-include $(BUILD_PACKAGE)
-
-# Also build our test apk
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
deleted file mode 100644
index b69f6d9..0000000
--- a/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.providers.applications"
-        android:sharedUserId="android.uid.shared">
-
-    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
-
-    <application android:process="android.process.acore" android:label="@string/app_label">
-
-        <provider android:name="ApplicationsProvider" android:authorities="applications"
-                android:exported="true"
-                android:syncable="false" android:multiprocess="false" />
-
-        <activity android:name="ApplicationLauncher"
-                android:label="@string/search_label"
-                android:icon="@android:drawable/sym_def_app_icon"
-                android:stateNotNeeded="true"
-                android:excludeFromRecents="true">
-
-            <intent-filter>
-                <action android:name="android.intent.action.SEARCH" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-
-            <meta-data android:name="android.app.searchable"
-                    android:resource="@xml/searchable" />
-        </activity>
-
-    </application>
-</manifest>
diff --git a/CleanSpec.mk b/CleanSpec.mk
deleted file mode 100644
index b84e1b6..0000000
--- a/CleanSpec.mk
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright (C) 2007 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.
-#
-
-# If you don't need to do a full clean build but would like to touch
-# a file or delete some intermediate files, add a clean step to the end
-# of the list.  These steps will only be run once, if they haven't been
-# run before.
-#
-# E.g.:
-#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
-#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
-#
-# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
-# files that are missing or have been moved.
-#
-# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
-# Use $(OUT_DIR) to refer to the "out" directory.
-#
-# If you need to re-do something that's already mentioned, just copy
-# the command and add it to the bottom of the list.  E.g., if a change
-# that you made last week required touching a file and a change you
-# made today requires touching the same file, just copy the old
-# touch step and add it to the end of the list.
-#
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
-
-# For example:
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
-#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
-#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
-
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-2008, The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   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.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/res/layout/application_list_item.xml b/res/layout/application_list_item.xml
deleted file mode 100644
index c8ac8f7..0000000
--- a/res/layout/application_list_item.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:paddingLeft="4dip"
-    android:paddingRight="4dip"
-    android:layout_width="match_parent"
-    android:layout_height="56dip" >
-
-    <ImageView android:id="@+id/icon1"
-        android:layout_width="48dip"
-        android:layout_height="48dip"
-        android:scaleType="centerInside"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:layout_alignParentBottom="true" />
-
-    <TextView android:id="@+id/text1"
-        android:textAppearance="?android:attr/textAppearanceLarge"
-        android:singleLine="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingLeft="4dip"
-        android:layout_centerVertical="true"
-        android:layout_toRightOf="@id/icon1" />
-
-</RelativeLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
deleted file mode 100644
index 88ff9f6..0000000
--- a/res/values-af/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Deursoek programverskaffer"</string>
-    <string name="search_label" msgid="6182832093760999173">"Apps"</string>
-    <string name="application_desc" msgid="888412554142684749">"Program"</string>
-    <string name="settings_description" msgid="966629744054022387">"Name van geïnstalleerde programme"</string>
-</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
deleted file mode 100644
index c6d4bbc..0000000
--- a/res/values-am/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"የትግበራዎች አቅራቢ ፈልግ"</string>
-    <string name="search_label" msgid="6182832093760999173">"ትግበራዎች"</string>
-    <string name="application_desc" msgid="888412554142684749">"ትግበራ"</string>
-    <string name="settings_description" msgid="966629744054022387">"የተጫኑ ትግበራዎች ስሞች"</string>
-</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
deleted file mode 100644
index 5814bbf..0000000
--- a/res/values-ar/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"مزودو تطبيقات البحث"</string>
-    <string name="search_label" msgid="6182832093760999173">"تطبيقات"</string>
-    <string name="application_desc" msgid="888412554142684749">"التطبيق"</string>
-    <string name="settings_description" msgid="966629744054022387">"أسماء التطبيقات المثبتة"</string>
-</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
deleted file mode 100644
index 6b7d1a1..0000000
--- a/res/values-be/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Пошук пастаўшчыка прыкладанняў"</string>
-    <string name="search_label" msgid="6182832093760999173">"Прыкладанні"</string>
-    <string name="application_desc" msgid="888412554142684749">"Прыкладанне"</string>
-    <string name="settings_description" msgid="966629744054022387">"Назвы усталяваных прыкладанняў"</string>
-</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
deleted file mode 100644
index b3117be..0000000
--- a/res/values-bg/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Търсене в приложенията"</string>
-    <string name="search_label" msgid="6182832093760999173">"Приложения"</string>
-    <string name="application_desc" msgid="888412554142684749">"Приложение"</string>
-    <string name="settings_description" msgid="966629744054022387">"Имена на инсталирани приложения"</string>
-</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
deleted file mode 100644
index 3fa4176..0000000
--- a/res/values-ca/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Proveïdor d\'aplicacions de cerca"</string>
-    <string name="search_label" msgid="6182832093760999173">"Aplicacions"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplicació"</string>
-    <string name="settings_description" msgid="966629744054022387">"Noms d\'aplicacions instal·lades"</string>
-</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
deleted file mode 100644
index c5808cc..0000000
--- a/res/values-cs/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Vyhledávací aplikace"</string>
-    <string name="search_label" msgid="6182832093760999173">"Aplikace"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplikace"</string>
-    <string name="settings_description" msgid="966629744054022387">"Názvy instalovaných aplikací"</string>
-</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
deleted file mode 100644
index d118fb3..0000000
--- a/res/values-da/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Udbyder af søgeprogram"</string>
-    <string name="search_label" msgid="6182832093760999173">"Applikationer"</string>
-    <string name="application_desc" msgid="888412554142684749">"Program"</string>
-    <string name="settings_description" msgid="966629744054022387">"Navne på installerede applikationer"</string>
-</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
deleted file mode 100644
index 2a9231a..0000000
--- a/res/values-de/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Suchanwendungsanbieter"</string>
-    <string name="search_label" msgid="6182832093760999173">"Apps"</string>
-    <string name="application_desc" msgid="888412554142684749">"App"</string>
-    <string name="settings_description" msgid="966629744054022387">"Namen der installierten Apps"</string>
-</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
deleted file mode 100644
index 1068c79..0000000
--- a/res/values-el/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Αναζήτηση παρόχου εφαρμ."</string>
-    <string name="search_label" msgid="6182832093760999173">"Εφαρμογές"</string>
-    <string name="application_desc" msgid="888412554142684749">"Εφαρμογή"</string>
-    <string name="settings_description" msgid="966629744054022387">"Ονόματα εγκατεστημένων εφαρμογών"</string>
-</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
deleted file mode 100644
index 7a29dca..0000000
--- a/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Search Applications Provider"</string>
-    <string name="search_label" msgid="6182832093760999173">"Apps"</string>
-    <string name="application_desc" msgid="888412554142684749">"Application"</string>
-    <string name="settings_description" msgid="966629744054022387">"Names of installed applications"</string>
-</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
deleted file mode 100644
index 5b2bdff..0000000
--- a/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Buscar el proveedor de aplicaciones"</string>
-    <string name="search_label" msgid="6182832093760999173">"Aplicaciones"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplicación"</string>
-    <string name="settings_description" msgid="966629744054022387">"Nombres de aplicaciones instaladas"</string>
-</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
deleted file mode 100644
index 2dbd88c..0000000
--- a/res/values-es/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Proveedor aplicaciones búsqueda"</string>
-    <string name="search_label" msgid="6182832093760999173">"Aplicaciones"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplicación"</string>
-    <string name="settings_description" msgid="966629744054022387">"Nombres de aplicaciones instaladas"</string>
-</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
deleted file mode 100644
index 754d96a..0000000
--- a/res/values-et/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Otsi rakendusepakkujat"</string>
-    <string name="search_label" msgid="6182832093760999173">"Rakendused"</string>
-    <string name="application_desc" msgid="888412554142684749">"Rakendus"</string>
-    <string name="settings_description" msgid="966629744054022387">"Installitud rakenduste nimed"</string>
-</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
deleted file mode 100644
index 775972a..0000000
--- a/res/values-fa/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"ارائه دهنده برنامه‌های جستجو"</string>
-    <string name="search_label" msgid="6182832093760999173">"برنامه‌های کاربردی"</string>
-    <string name="application_desc" msgid="888412554142684749">"برنامهٔ کاربردی"</string>
-    <string name="settings_description" msgid="966629744054022387">"نام‌های برنامه‌های نصب شده"</string>
-</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
deleted file mode 100644
index 7bb15d7..0000000
--- a/res/values-fi/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Hae sovellusten tarjoajaa"</string>
-    <string name="search_label" msgid="6182832093760999173">"Sovellukset"</string>
-    <string name="application_desc" msgid="888412554142684749">"Sovellus"</string>
-    <string name="settings_description" msgid="966629744054022387">"Asennettujen sovelluksien nimet"</string>
-</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
deleted file mode 100644
index 69c597d..0000000
--- a/res/values-fr/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Fourn. appl. recherche"</string>
-    <string name="search_label" msgid="6182832093760999173">"Applications"</string>
-    <string name="application_desc" msgid="888412554142684749">"Application"</string>
-    <string name="settings_description" msgid="966629744054022387">"Noms des applications installées"</string>
-</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
deleted file mode 100644
index 3c6eb89..0000000
--- a/res/values-hi/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"एप्‍लिकेशन प्रदाता खोजें"</string>
-    <string name="search_label" msgid="6182832093760999173">"Apps"</string>
-    <string name="application_desc" msgid="888412554142684749">"एप्लिकेशन"</string>
-    <string name="settings_description" msgid="966629744054022387">"इंस्टॉल किए गए एप्‍लिकेशन के नाम"</string>
-</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
deleted file mode 100644
index dc1712e..0000000
--- a/res/values-hr/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Pružatelj aplik. pretraž."</string>
-    <string name="search_label" msgid="6182832093760999173">"Aplikacije"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplikacija"</string>
-    <string name="settings_description" msgid="966629744054022387">"Nazivi instaliranih aplikacija"</string>
-</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
deleted file mode 100644
index 29f5d91..0000000
--- a/res/values-hu/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Alk. szolgáltató keresése"</string>
-    <string name="search_label" msgid="6182832093760999173">"Alkalmazások"</string>
-    <string name="application_desc" msgid="888412554142684749">"Alkalmazás"</string>
-    <string name="settings_description" msgid="966629744054022387">"A telepített alkalmazások nevei"</string>
-</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
deleted file mode 100644
index eb3af26..0000000
--- a/res/values-in/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Penyedia Aplikasi Penelusuran"</string>
-    <string name="search_label" msgid="6182832093760999173">"Apps"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplikasi"</string>
-    <string name="settings_description" msgid="966629744054022387">"Nama aplikasi yang terpasang"</string>
-</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
deleted file mode 100644
index e5d6a1f..0000000
--- a/res/values-it/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Search Applications Provider"</string>
-    <string name="search_label" msgid="6182832093760999173">"App"</string>
-    <string name="application_desc" msgid="888412554142684749">"Applicazione"</string>
-    <string name="settings_description" msgid="966629744054022387">"Nomi delle applicazioni installate"</string>
-</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
deleted file mode 100644
index 14141bf..0000000
--- a/res/values-iw/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"ספק יישומי חיפוש"</string>
-    <string name="search_label" msgid="6182832093760999173">"יישומים"</string>
-    <string name="application_desc" msgid="888412554142684749">"יישום"</string>
-    <string name="settings_description" msgid="966629744054022387">"שמות של יישומים מותקנים"</string>
-</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
deleted file mode 100644
index 40690f9..0000000
--- a/res/values-ja/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"検索アプリプロバイダ"</string>
-    <string name="search_label" msgid="6182832093760999173">"アプリケーション"</string>
-    <string name="application_desc" msgid="888412554142684749">"アプリケーション"</string>
-    <string name="settings_description" msgid="966629744054022387">"インストールされているアプリケーション名"</string>
-</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
deleted file mode 100644
index 332d0c7..0000000
--- a/res/values-ko/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"검색 애플리케이션 공급자"</string>
-    <string name="search_label" msgid="6182832093760999173">"애플리케이션"</string>
-    <string name="application_desc" msgid="888412554142684749">"애플리케이션"</string>
-    <string name="settings_description" msgid="966629744054022387">"설치된 애플리케이션의 이름"</string>
-</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
deleted file mode 100644
index 66d3df9..0000000
--- a/res/values-lt/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Ieškoti programų teikėjo"</string>
-    <string name="search_label" msgid="6182832093760999173">"Apps"</string>
-    <string name="application_desc" msgid="888412554142684749">"Programa"</string>
-    <string name="settings_description" msgid="966629744054022387">"Įdiegtų programų pavadinimai"</string>
-</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
deleted file mode 100644
index 77e4bfb..0000000
--- a/res/values-lv/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Mekl. liet. nodrošin."</string>
-    <string name="search_label" msgid="6182832093760999173">"Lietojumprogrammas"</string>
-    <string name="application_desc" msgid="888412554142684749">"Lietojumprogramma"</string>
-    <string name="settings_description" msgid="966629744054022387">"Instalēto lietojumprogrammu nosaukumi"</string>
-</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
deleted file mode 100644
index aa7cc2d..0000000
--- a/res/values-ms/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Pembekal Aplikasi Carian"</string>
-    <string name="search_label" msgid="6182832093760999173">"Apl"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplikasi"</string>
-    <string name="settings_description" msgid="966629744054022387">"Nama aplikasi yang dipasang"</string>
-</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
deleted file mode 100644
index ee066be..0000000
--- a/res/values-nb/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Leverandør av søkeprog."</string>
-    <string name="search_label" msgid="6182832093760999173">"Apps"</string>
-    <string name="application_desc" msgid="888412554142684749">"Applikasjon"</string>
-    <string name="settings_description" msgid="966629744054022387">"Navn på installerte apper"</string>
-</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
deleted file mode 100644
index b84382e..0000000
--- a/res/values-nl/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Provider zoektoepassingen"</string>
-    <string name="search_label" msgid="6182832093760999173">"Apps"</string>
-    <string name="application_desc" msgid="888412554142684749">"App"</string>
-    <string name="settings_description" msgid="966629744054022387">"Namen van geïnstalleerde apps"</string>
-</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
deleted file mode 100644
index 12c1d58..0000000
--- a/res/values-pl/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Dostawca aplikacji wyszukiwania"</string>
-    <string name="search_label" msgid="6182832093760999173">"Aplikacje"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplikacja"</string>
-    <string name="settings_description" msgid="966629744054022387">"Nazwy zainstalowanych aplikacji"</string>
-</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
deleted file mode 100644
index 34d021e..0000000
--- a/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Forn. pesquisa de aplic."</string>
-    <string name="search_label" msgid="6182832093760999173">"Aplicações"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplicação"</string>
-    <string name="settings_description" msgid="966629744054022387">"Nomes das aplicações instaladas"</string>
-</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
deleted file mode 100644
index a89a1c5..0000000
--- a/res/values-pt/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Search Applications Provider"</string>
-    <string name="search_label" msgid="6182832093760999173">"Aplicativos"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplicativo"</string>
-    <string name="settings_description" msgid="966629744054022387">"Nomes dos aplicativos instalados"</string>
-</resources>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
deleted file mode 100644
index 6097fff..0000000
--- a/res/values-rm/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (8842303127802367578) -->
-    <skip />
-    <string name="search_label" msgid="6182832093760999173">"Applicaziuns"</string>
-    <string name="application_desc" msgid="888412554142684749">"Applicaziun"</string>
-    <string name="settings_description" msgid="966629744054022387">"Nums da las applicaziuns installadas"</string>
-</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
deleted file mode 100644
index d2aa3cb..0000000
--- a/res/values-ro/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Furnizor aplic. căutare"</string>
-    <string name="search_label" msgid="6182832093760999173">"Aplicaţii"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplicaţie"</string>
-    <string name="settings_description" msgid="966629744054022387">"Numele aplicaţiilor instalate"</string>
-</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
deleted file mode 100644
index 0f25d2d..0000000
--- a/res/values-ru/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Поставщик средств поиска"</string>
-    <string name="search_label" msgid="6182832093760999173">"Приложения"</string>
-    <string name="application_desc" msgid="888412554142684749">"Приложение"</string>
-    <string name="settings_description" msgid="966629744054022387">"Названия установленных приложений"</string>
-</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
deleted file mode 100644
index d837fe3..0000000
--- a/res/values-sk/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Poskyt. vyhľad. aplikácií"</string>
-    <string name="search_label" msgid="6182832093760999173">"Aplikácie"</string>
-    <string name="application_desc" msgid="888412554142684749">"Aplikácia"</string>
-    <string name="settings_description" msgid="966629744054022387">"Názvy inštalovaných aplikácií"</string>
-</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
deleted file mode 100644
index 9ddde55..0000000
--- a/res/values-sl/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Iskanje ponudnika programov"</string>
-    <string name="search_label" msgid="6182832093760999173">"Google Aplikacije"</string>
-    <string name="application_desc" msgid="888412554142684749">"Program"</string>
-    <string name="settings_description" msgid="966629744054022387">"Imena nameščenih aplikacij"</string>
-</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
deleted file mode 100644
index 09060e9..0000000
--- a/res/values-sr/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Претрага добављача апликација"</string>
-    <string name="search_label" msgid="6182832093760999173">"Апликације"</string>
-    <string name="application_desc" msgid="888412554142684749">"Апликација"</string>
-    <string name="settings_description" msgid="966629744054022387">"Називи инсталираних апликација"</string>
-</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
deleted file mode 100644
index 706ed02..0000000
--- a/res/values-sv/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Sökprogramsleverantör"</string>
-    <string name="search_label" msgid="6182832093760999173">"Appar"</string>
-    <string name="application_desc" msgid="888412554142684749">"App"</string>
-    <string name="settings_description" msgid="966629744054022387">"Namn på installerade appar"</string>
-</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
deleted file mode 100644
index 4c3aad4..0000000
--- a/res/values-sw/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Mtoa huduma wa Programu za Utafutaji"</string>
-    <string name="search_label" msgid="6182832093760999173">"Apps"</string>
-    <string name="application_desc" msgid="888412554142684749">"Programu"</string>
-    <string name="settings_description" msgid="966629744054022387">"Majina ya programu za kompyuta zilizowekwa"</string>
-</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
deleted file mode 100644
index f2fe511..0000000
--- a/res/values-th/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"ผู้ให้บริการแอปพลิเคชันการค้นหา"</string>
-    <string name="search_label" msgid="6182832093760999173">"แอป"</string>
-    <string name="application_desc" msgid="888412554142684749">"แอปพลิเคชัน"</string>
-    <string name="settings_description" msgid="966629744054022387">"ชื่อแอปพลิเคชันที่ติดตั้ง"</string>
-</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
deleted file mode 100644
index e395d74..0000000
--- a/res/values-tl/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Search Applications Provider"</string>
-    <string name="search_label" msgid="6182832093760999173">"Apps"</string>
-    <string name="application_desc" msgid="888412554142684749">"Application"</string>
-    <string name="settings_description" msgid="966629744054022387">"Mga pangalan ng mga naka-install na application"</string>
-</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
deleted file mode 100644
index 8740223..0000000
--- a/res/values-tr/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Arama Uyglmlr Sağlayıcısı"</string>
-    <string name="search_label" msgid="6182832093760999173">"Uygulamalar"</string>
-    <string name="application_desc" msgid="888412554142684749">"Uygulama"</string>
-    <string name="settings_description" msgid="966629744054022387">"Yüklenen uygulamaların adları"</string>
-</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
deleted file mode 100644
index 498bb10..0000000
--- a/res/values-uk/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Search Applications Provider"</string>
-    <string name="search_label" msgid="6182832093760999173">"Програми"</string>
-    <string name="application_desc" msgid="888412554142684749">"Програма"</string>
-    <string name="settings_description" msgid="966629744054022387">"Назви встановлених програм"</string>
-</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
deleted file mode 100644
index 938ed32..0000000
--- a/res/values-vi/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"T.kiếm Nhà cung cấp ư.dụng"</string>
-    <string name="search_label" msgid="6182832093760999173">"Ứng dụng"</string>
-    <string name="application_desc" msgid="888412554142684749">"Ứng dụng"</string>
-    <string name="settings_description" msgid="966629744054022387">"Tên của các ứng dụng đã cài đặt"</string>
-</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
deleted file mode 100644
index dda1efd..0000000
--- a/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"搜索应用提供程序"</string>
-    <string name="search_label" msgid="6182832093760999173">"应用"</string>
-    <string name="application_desc" msgid="888412554142684749">"应用"</string>
-    <string name="settings_description" msgid="966629744054022387">"已安装的应用的名称"</string>
-</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 272fcbd..0000000
--- a/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"搜尋應用程式供應商"</string>
-    <string name="search_label" msgid="6182832093760999173">"應用程式"</string>
-    <string name="application_desc" msgid="888412554142684749">"應用程式"</string>
-    <string name="settings_description" msgid="966629744054022387">"已安裝的應用程式名稱"</string>
-</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
deleted file mode 100644
index 9e39744..0000000
--- a/res/values-zu/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="8842303127802367578">"Sesha Umhlinzeki Wezinhlelo Zokusebenza"</string>
-    <string name="search_label" msgid="6182832093760999173">"Izinhlelo zokusebenza"</string>
-    <string name="application_desc" msgid="888412554142684749">"Uhlelo lokusebenza"</string>
-    <string name="settings_description" msgid="966629744054022387">"Amagama ezinhlelo zokusebenza ezifakiwe"</string>
-</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
deleted file mode 100644
index 2c296ef..0000000
--- a/res/values/strings.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
-    <!-- [CHAR LIMIT=25] Label of this application. -->
-    <string name="app_label">Search Applications Provider</string>
-    
-    <!-- Search label for applications. -->
-    <string name="search_label">Apps</string>
-
-    <!-- Description line displayed for an application entry in the search suggest list. -->
-    <string name="application_desc">Application</string>
-    
-    <!-- Description line displayed for 'apps' as a searchable item within system search
-         settings. -->
-    <string name="settings_description">Names of installed applications</string>
-
-</resources>
diff --git a/res/xml/searchable.xml b/res/xml/searchable.xml
deleted file mode 100644
index e6df7cd..0000000
--- a/res/xml/searchable.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<searchable xmlns:android="http://schemas.android.com/apk/res/android"
-    android:label="@string/search_label"
-    android:includeInGlobalSearch="true"
-    android:searchSuggestAuthority="applications"
-    android:searchSuggestIntentAction="android.intent.action.MAIN"
-    android:searchSettingsDescription="@string/settings_description"
->
-</searchable>
diff --git a/src/com/android/providers/applications/ApplicationLauncher.java b/src/com/android/providers/applications/ApplicationLauncher.java
deleted file mode 100644
index 0b38dfe..0000000
--- a/src/com/android/providers/applications/ApplicationLauncher.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.providers.applications;
-
-import android.app.ListActivity;
-import android.app.SearchManager;
-import android.content.ActivityNotFoundException;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.Applications;
-import android.util.Log;
-import android.view.View;
-import android.widget.ListView;
-
-/**
- * This class is purely here to get launch intents.
- */
-public class ApplicationLauncher extends ListActivity {
-
-    private static final String TAG = "ApplicationLauncher";
-
-    private Cursor mCursor;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Intent intent = getIntent();
-        if (intent == null) {
-            finish();
-            return;
-        }
-        String action = intent.getAction();
-        if (Intent.ACTION_MAIN.equals(action)) {
-            Uri contentUri = intent.getData();
-            launchApplication(contentUri);
-            finish();
-        } else if (Intent.ACTION_SEARCH.equals(action)) {
-            String query = intent.getStringExtra(SearchManager.QUERY);
-            showSearchResults(query);
-        }
-    }
-
-    private void showSearchResults(String query) {
-        setTitle(query);
-
-        mCursor = Applications.search(getContentResolver(), query);
-        startManagingCursor(mCursor);
-
-        ApplicationsAdapter adapter = new ApplicationsAdapter(this, mCursor);
-        setListAdapter(adapter);
-    }
-
-    @Override
-    protected void onListItemClick(ListView l, View v, int position, long id) {
-        if (mCursor == null) {
-            Log.e(TAG, "Got click on position " + position + " but there is no cursor");
-            return;
-        }
-        if (mCursor.isClosed()) {
-            Log.e(TAG, "Got click on position " + position + " but the cursor is closed");
-            return;
-        }
-        if (!mCursor.moveToPosition(position)) {
-            Log.e(TAG, "Failed to move to position " + position);
-            return;
-        }
-        Uri uri = ApplicationsAdapter.getColumnUri(mCursor, Applications.ApplicationColumns.URI);
-        launchApplication(uri);
-    }
-
-    private void launchApplication(Uri uri) {
-        ComponentName componentName = Applications.uriToComponentName(uri);
-        Log.i(TAG, "Launching " + componentName);
-        if (componentName != null) {
-            Intent launchIntent = new Intent(Intent.ACTION_MAIN);
-            launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
-                    Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
-            launchIntent.setComponent(componentName);
-            try {
-                startActivity(launchIntent);
-            } catch (ActivityNotFoundException ex) {
-                Log.w(TAG, "Activity not found: " + componentName);
-            }
-        }
-    }
-}
diff --git a/src/com/android/providers/applications/ApplicationsAdapter.java b/src/com/android/providers/applications/ApplicationsAdapter.java
deleted file mode 100644
index 9cf3b31..0000000
--- a/src/com/android/providers/applications/ApplicationsAdapter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2010 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.applications;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.Applications;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.ResourceCursorAdapter;
-import android.widget.TextView;
-
-public class ApplicationsAdapter extends ResourceCursorAdapter {
-
-    private static final boolean DBG = false;
-    private static final String TAG = "ApplicationsAdapter";
-
-    public ApplicationsAdapter(Context context, Cursor c) {
-        super(context, R.layout.application_list_item, c);
-    }
-
-    @Override
-    public void bindView(View view, Context context, Cursor cursor) {
-        ImageView icon1 = (ImageView) view.findViewById(R.id.icon1);
-        TextView text1 = (TextView) view.findViewById(R.id.text1);
-        Uri iconUri = getColumnUri(cursor, Applications.ApplicationColumns.ICON);
-        String name = getColumnString(cursor, Applications.ApplicationColumns.NAME);
-        if (DBG) Log.d(TAG, "name=" + name + ",icon=" + iconUri);
-        icon1.setImageURI(iconUri);
-        text1.setText(name);
-    }
-
-    public static Uri getColumnUri(Cursor cursor, String columnName) {
-        String uriString = getColumnString(cursor, columnName);
-        if (TextUtils.isEmpty(uriString)) return null;
-        return Uri.parse(uriString);
-    }
-
-    public static String getColumnString(Cursor cursor, String columnName) {
-        int col = cursor.getColumnIndex(columnName);
-        return getStringOrNull(cursor, col);
-    }
-
-    private static String getStringOrNull(Cursor cursor, int col) {
-        if (col < 0) return null;
-        try {
-            return cursor.getString(col);
-        } catch (RuntimeException e) {
-            Log.e(TAG, "Failed to get column " + col + " from cursor", e);
-            return null;
-        }
-    }
-}
diff --git a/src/com/android/providers/applications/ApplicationsProvider.java b/src/com/android/providers/applications/ApplicationsProvider.java
deleted file mode 100644
index 128fe2f..0000000
--- a/src/com/android/providers/applications/ApplicationsProvider.java
+++ /dev/null
@@ -1,702 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.providers.applications;
-
-import com.android.internal.content.PackageMonitor;
-import com.android.internal.os.PkgUsageStats;
-
-import android.app.ActivityManager;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.app.SearchManager;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.ContentProvider;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.UriMatcher;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteQueryBuilder;
-import android.net.Uri;
-import android.os.CancellationSignal;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Message;
-import android.provider.Applications;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.lang.Runnable;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.annotations.VisibleForTesting;
-
-/**
- * Fetches the list of applications installed on the phone to provide search suggestions.
- * If the functionality of this provider changes, the documentation at
- * {@link android.provider.Applications} should be updated.
- *
- * TODO: this provider should be moved to the Launcher, which contains similar logic to keep an up
- * to date list of installed applications.  Alternatively, Launcher could be updated to use this
- * provider.
- */
-public class ApplicationsProvider extends ContentProvider {
-
-    private static final boolean DBG = false;
-
-    private static final String TAG = "ApplicationsProvider";
-
-    private static final int SEARCH_SUGGEST = 0;
-    private static final int SHORTCUT_REFRESH = 1;
-    private static final int SEARCH = 2;
-
-    private static final UriMatcher sURIMatcher = buildUriMatcher();
-
-    private static final int THREAD_PRIORITY = android.os.Process.THREAD_PRIORITY_BACKGROUND;
-
-    // Messages for mHandler
-    private static final int MSG_UPDATE_ALL = 0;
-    private static final int MSG_UPDATE_PACKAGE = 1;
-
-    public static final String _ID = "_id";
-    public static final String NAME = "name";
-    public static final String DESCRIPTION = "description";
-    public static final String PACKAGE = "package";
-    public static final String CLASS = "class";
-    public static final String ICON = "icon";
-    public static final String LAUNCH_COUNT = "launch_count";
-    public static final String LAST_RESUME_TIME = "last_resume_time";
-
-    // A query parameter to refresh application statistics. Used by QSB.
-    public static final String REFRESH_STATS = "refresh";
-
-    private static final String APPLICATIONS_TABLE = "applications";
-
-    private static final String APPLICATIONS_LOOKUP_JOIN =
-            "applicationsLookup JOIN " + APPLICATIONS_TABLE + " ON"
-            + " applicationsLookup.source = " + APPLICATIONS_TABLE + "." + _ID;
-
-    private static final HashMap<String, String> sSearchSuggestionsProjectionMap =
-            buildSuggestionsProjectionMap(false);
-    private static final HashMap<String, String> sGlobalSearchSuggestionsProjectionMap =
-            buildSuggestionsProjectionMap(true);
-    private static final HashMap<String, String> sSearchProjectionMap =
-            buildSearchProjectionMap();
-
-    /**
-     * An in-memory database storing the details of applications installed on
-     * the device. Populated when the ApplicationsProvider is launched.
-     */
-    private SQLiteDatabase mDb;
-
-    // Handler that runs DB updates.
-    private Handler mHandler;
-
-    /**
-     * We delay application updates by this many millis to avoid doing more than one update to the
-     * applications list within this window.
-     */
-    private static final long UPDATE_DELAY_MILLIS = 1000L;
-
-    private static UriMatcher buildUriMatcher() {
-        UriMatcher matcher =  new UriMatcher(UriMatcher.NO_MATCH);
-        matcher.addURI(Applications.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY,
-                SEARCH_SUGGEST);
-        matcher.addURI(Applications.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
-                SEARCH_SUGGEST);
-        matcher.addURI(Applications.AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT,
-                SHORTCUT_REFRESH);
-        matcher.addURI(Applications.AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*",
-                SHORTCUT_REFRESH);
-        matcher.addURI(Applications.AUTHORITY, Applications.SEARCH_PATH,
-                SEARCH);
-        matcher.addURI(Applications.AUTHORITY, Applications.SEARCH_PATH + "/*",
-                SEARCH);
-        return matcher;
-    }
-
-    /**
-     * Updates applications list when packages are added/removed.
-     *
-     * TODO: Maybe this should listen for changes to individual apps instead.
-     */
-    private class MyPackageMonitor extends PackageMonitor {
-        @Override
-        public void onSomePackagesChanged() {
-            postUpdateAll();
-        }
-
-        @Override
-        public void onPackageModified(String packageName) {
-            postUpdatePackage(packageName);
-        }
-    }
-
-    // Broadcast receiver for updating applications list when the locale changes.
-    private BroadcastReceiver mLocaleChangeReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {
-                if (DBG) Log.d(TAG, "locale changed");
-                postUpdateAll();
-            }
-        }
-    };
-
-    @Override
-    public boolean onCreate() {
-        createDatabase();
-        // Start thread that runs app updates
-        HandlerThread thread = new HandlerThread("ApplicationsProviderUpdater", THREAD_PRIORITY);
-        thread.start();
-        mHandler = createHandler(thread.getLooper());
-        // Kick off first apps update
-        postUpdateAll();
-        // Listen for package changes
-        new MyPackageMonitor().register(getContext(), null, true);
-        // Listen for locale changes
-        IntentFilter localeFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
-        getContext().registerReceiver(mLocaleChangeReceiver, localeFilter);
-        return true;
-    }
-
-    @VisibleForTesting
-    Handler createHandler(Looper looper) {
-        return new UpdateHandler(looper);
-    }
-
-    @VisibleForTesting
-    class UpdateHandler extends Handler {
-
-        public UpdateHandler(Looper looper) {
-            super(looper);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_UPDATE_ALL:
-                    updateApplicationsList(null);
-                    break;
-                case MSG_UPDATE_PACKAGE:
-                    updateApplicationsList((String) msg.obj);
-                    break;
-                default:
-                    Log.e(TAG, "Unknown message: " + msg.what);
-                    break;
-            }
-        }
-    }
-
-    /**
-     * Posts an update to run on the DB update thread.
-     */
-    private void postUpdateAll() {
-        // Clear pending updates
-        mHandler.removeMessages(MSG_UPDATE_ALL);
-        // Post a new update
-        Message msg = Message.obtain();
-        msg.what = MSG_UPDATE_ALL;
-        mHandler.sendMessageDelayed(msg, UPDATE_DELAY_MILLIS);
-    }
-
-    private void postUpdatePackage(String packageName) {
-        Message msg = Message.obtain();
-        msg.what = MSG_UPDATE_PACKAGE;
-        msg.obj = packageName;
-        mHandler.sendMessageDelayed(msg, UPDATE_DELAY_MILLIS);
-    }
-
-    // ----------
-    // END ASYC UPDATE CODE
-    // ----------
-
-    /**
-     * Creates an in-memory database for storing application info.
-     */
-    private void createDatabase() {
-        mDb = SQLiteDatabase.create(null);
-        mDb.execSQL("CREATE TABLE IF NOT EXISTS " + APPLICATIONS_TABLE + " (" +
-                _ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
-                NAME + " TEXT COLLATE LOCALIZED," +
-                DESCRIPTION + " description TEXT," +
-                PACKAGE + " TEXT," +
-                CLASS + " TEXT," +
-                ICON + " TEXT," +
-                LAUNCH_COUNT + " INTEGER DEFAULT 0," +
-                LAST_RESUME_TIME + " INTEGER DEFAULT 0" +
-                ");");
-        // Needed for efficient update and remove
-        mDb.execSQL("CREATE INDEX applicationsComponentIndex ON " + APPLICATIONS_TABLE + " ("
-                + PACKAGE + "," + CLASS + ");");
-        // Maps token from the app name to records in the applications table
-        mDb.execSQL("CREATE TABLE applicationsLookup (" +
-                "token TEXT," +
-                "source INTEGER REFERENCES " + APPLICATIONS_TABLE + "(" + _ID + ")," +
-                "token_index INTEGER" +
-                ");");
-        mDb.execSQL("CREATE INDEX applicationsLookupIndex ON applicationsLookup (" +
-                "token," +
-                "source" +
-                ");");
-        // Triggers to keep the applicationsLookup table up to date
-        mDb.execSQL("CREATE TRIGGER applicationsLookup_update UPDATE OF " + NAME + " ON " +
-                APPLICATIONS_TABLE + " " +
-                "BEGIN " +
-                "DELETE FROM applicationsLookup WHERE source = new." + _ID + ";" +
-                "SELECT _TOKENIZE('applicationsLookup', new." + _ID + ", new." + NAME + ", ' ', 1);"
-                + "END");
-        mDb.execSQL("CREATE TRIGGER applicationsLookup_insert AFTER INSERT ON " +
-                APPLICATIONS_TABLE + " " +
-                "BEGIN " +
-                "SELECT _TOKENIZE('applicationsLookup', new." + _ID + ", new." + NAME + ", ' ', 1);"
-                + "END");
-        mDb.execSQL("CREATE TRIGGER applicationsLookup_delete DELETE ON " +
-                APPLICATIONS_TABLE + " " +
-                "BEGIN " +
-                "DELETE FROM applicationsLookup WHERE source = old." + _ID + ";" +
-                "END");
-    }
-
-    /**
-     * This will always return {@link SearchManager#SUGGEST_MIME_TYPE} as this
-     * provider is purely to provide suggestions.
-     */
-    @Override
-    public String getType(Uri uri) {
-        switch (sURIMatcher.match(uri)) {
-            case SEARCH_SUGGEST:
-                return SearchManager.SUGGEST_MIME_TYPE;
-            case SHORTCUT_REFRESH:
-                return SearchManager.SHORTCUT_MIME_TYPE;
-            case SEARCH:
-                return Applications.APPLICATION_DIR_TYPE;
-            default:
-                throw new IllegalArgumentException("URL " + uri + " doesn't support querying.");
-        }
-    }
-
-    @Override
-    public Cursor query(Uri uri, String[] projectionIn, String selection,
-            String[] selectionArgs, String sortOrder) {
-        return query(uri, projectionIn, selection, selectionArgs, sortOrder, null);
-    }
-
-    /**
-     * Queries for a given search term and returns a cursor containing
-     * suggestions ordered by best match.
-     */
-    @Override
-    public Cursor query(Uri uri, String[] projectionIn, String selection,
-            String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal) {
-        if (DBG) Log.d(TAG, "query(" + uri + ")");
-
-        if (!TextUtils.isEmpty(selection)) {
-            throw new IllegalArgumentException("selection not allowed for " + uri);
-        }
-        if (selectionArgs != null && selectionArgs.length != 0) {
-            throw new IllegalArgumentException("selectionArgs not allowed for " + uri);
-        }
-        if (!TextUtils.isEmpty(sortOrder)) {
-            throw new IllegalArgumentException("sortOrder not allowed for " + uri);
-        }
-
-        switch (sURIMatcher.match(uri)) {
-            case SEARCH_SUGGEST: {
-                String query = null;
-                if (uri.getPathSegments().size() > 1) {
-                    query = uri.getLastPathSegment().toLowerCase();
-                }
-                if (uri.getQueryParameter(REFRESH_STATS) != null) {
-                    updateUsageStats();
-                }
-                return getSuggestions(query, projectionIn, cancellationSignal);
-            }
-            case SHORTCUT_REFRESH: {
-                String shortcutId = null;
-                if (uri.getPathSegments().size() > 1) {
-                    shortcutId = uri.getLastPathSegment();
-                }
-                return refreshShortcut(shortcutId, projectionIn);
-            }
-            case SEARCH: {
-                String query = null;
-                if (uri.getPathSegments().size() > 1) {
-                    query = uri.getLastPathSegment().toLowerCase();
-                }
-                return getSearchResults(query, projectionIn, cancellationSignal);
-            }
-            default:
-                throw new IllegalArgumentException("URL " + uri + " doesn't support querying.");
-        }
-    }
-
-    private Cursor getSuggestions(String query, String[] projectionIn,
-            CancellationSignal cancellationSignal) {
-        Map<String, String> projectionMap = sSearchSuggestionsProjectionMap;
-        // No zero-query suggestions or launch times except for global search,
-        // to avoid leaking info about apps that have been used.
-        if (hasGlobalSearchPermission()) {
-            projectionMap = sGlobalSearchSuggestionsProjectionMap;
-        } else if (TextUtils.isEmpty(query)) {
-            return null;
-        }
-        return searchApplications(query, projectionIn, projectionMap, cancellationSignal);
-    }
-
-    /**
-     * Refreshes the shortcut of an application.
-     *
-     * @param shortcutId Flattened component name of an activity.
-     */
-    private Cursor refreshShortcut(String shortcutId, String[] projectionIn) {
-        ComponentName component = ComponentName.unflattenFromString(shortcutId);
-        if (component == null) {
-            Log.w(TAG, "Bad shortcut id: " + shortcutId);
-            return null;
-        }
-        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-        qb.setTables(APPLICATIONS_TABLE);
-        qb.setProjectionMap(sSearchSuggestionsProjectionMap);
-        qb.appendWhere("package = ? AND class = ?");
-        String[] selectionArgs = { component.getPackageName(), component.getClassName() };
-        Cursor cursor = qb.query(mDb, projectionIn, null, selectionArgs, null, null, null);
-        if (DBG) Log.d(TAG, "Returning " + cursor.getCount() + " results for shortcut refresh.");
-        return cursor;
-    }
-
-    private Cursor getSearchResults(String query, String[] projectionIn,
-            CancellationSignal cancellationSignal) {
-        return searchApplications(query, projectionIn, sSearchProjectionMap, cancellationSignal);
-    }
-
-    private Cursor searchApplications(String query, String[] projectionIn,
-            Map<String, String> columnMap, CancellationSignal cancelationSignal) {
-        final boolean zeroQuery = TextUtils.isEmpty(query);
-        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-        qb.setTables(APPLICATIONS_LOOKUP_JOIN);
-        qb.setProjectionMap(columnMap);
-        String orderBy = null;
-        if (!zeroQuery) {
-            qb.appendWhere(buildTokenFilter(query));
-        } else {
-            if (hasGlobalSearchPermission()) {
-                qb.appendWhere(LAST_RESUME_TIME + " > 0");
-            }
-        }
-        if (!hasGlobalSearchPermission()) {
-            orderBy = getOrderBy(zeroQuery);
-        }
-        // don't return duplicates when there are two matching tokens for an app
-        String groupBy = APPLICATIONS_TABLE + "." + _ID;
-        Cursor cursor = qb.query(mDb, projectionIn, null, null, groupBy, null, orderBy, null,
-                cancelationSignal);
-        if (DBG) Log.d(TAG, "Returning " + cursor.getCount() + " results for " + query);
-        return cursor;
-    }
-
-    private String getOrderBy(boolean zeroQuery) {
-        // order first by whether it a full prefix match, then by launch
-        // count (if allowed, frequently used apps rank higher), then name
-        // MIN(token_index) != 0 is true for non-full prefix matches,
-        // and since false (0) < true(1), this expression makes sure
-        // that full prefix matches come first.
-        StringBuilder orderBy = new StringBuilder();
-        if (!zeroQuery) {
-            orderBy.append("MIN(token_index) != 0, ");
-        }
-
-        if (hasGlobalSearchPermission()) {
-            orderBy.append(LAST_RESUME_TIME + " DESC, ");
-        }
-
-        orderBy.append(NAME);
-
-        return orderBy.toString();
-    }
-
-    @SuppressWarnings("deprecation")
-    private String buildTokenFilter(String filterParam) {
-        StringBuilder filter = new StringBuilder("token GLOB ");
-        // NOTE: Query parameters won't work here since the SQL compiler
-        // needs to parse the actual string to know that it can use the
-        // index to do a prefix scan.
-        DatabaseUtils.appendEscapedSQLString(filter,
-                DatabaseUtils.getHexCollationKey(filterParam) + "*");
-        return filter.toString();
-    }
-
-    private static HashMap<String, String> buildSuggestionsProjectionMap(boolean forGlobalSearch) {
-        HashMap<String, String> map = new HashMap<String, String>();
-        addProjection(map, Applications.ApplicationColumns._ID, _ID);
-        addProjection(map, SearchManager.SUGGEST_COLUMN_TEXT_1, NAME);
-        addProjection(map, SearchManager.SUGGEST_COLUMN_TEXT_2, DESCRIPTION);
-        addProjection(map, SearchManager.SUGGEST_COLUMN_INTENT_DATA,
-                "'content://" + Applications.AUTHORITY + "/applications/'"
-                + " || " + PACKAGE + " || '/' || " + CLASS);
-        addProjection(map, SearchManager.SUGGEST_COLUMN_ICON_1, ICON);
-        addProjection(map, SearchManager.SUGGEST_COLUMN_ICON_2, "NULL");
-        addProjection(map, SearchManager.SUGGEST_COLUMN_SHORTCUT_ID,
-                PACKAGE + " || '/' || " + CLASS);
-        if (forGlobalSearch) {
-            addProjection(map, SearchManager.SUGGEST_COLUMN_LAST_ACCESS_HINT,
-                    LAST_RESUME_TIME);
-        }
-        return map;
-    }
-
-    private static HashMap<String, String> buildSearchProjectionMap() {
-        HashMap<String, String> map = new HashMap<String, String>();
-        addProjection(map, Applications.ApplicationColumns._ID, _ID);
-        addProjection(map, Applications.ApplicationColumns.NAME, NAME);
-        addProjection(map, Applications.ApplicationColumns.ICON, ICON);
-        addProjection(map, Applications.ApplicationColumns.URI,
-                "'content://" + Applications.AUTHORITY + "/applications/'"
-                + " || " + PACKAGE + " || '/' || " + CLASS);
-        return map;
-    }
-
-    private static void addProjection(HashMap<String, String> map, String name, String value) {
-        if (!value.equals(name)) {
-            value = value + " AS " + name;
-        }
-        map.put(name, value);
-    }
-
-    /**
-     * Updates the cached list of installed applications.
-     *
-     * @param packageName Name of package whose activities to update.
-     *        If {@code null}, all packages are updated.
-     */
-    private synchronized void updateApplicationsList(String packageName) {
-        if (DBG) Log.d(TAG, "Updating database (packageName = " + packageName + ")...");
-
-        DatabaseUtils.InsertHelper inserter =
-                new DatabaseUtils.InsertHelper(mDb, APPLICATIONS_TABLE);
-        int nameCol = inserter.getColumnIndex(NAME);
-        int descriptionCol = inserter.getColumnIndex(DESCRIPTION);
-        int packageCol = inserter.getColumnIndex(PACKAGE);
-        int classCol = inserter.getColumnIndex(CLASS);
-        int iconCol = inserter.getColumnIndex(ICON);
-        int launchCountCol = inserter.getColumnIndex(LAUNCH_COUNT);
-        int lastResumeTimeCol = inserter.getColumnIndex(LAST_RESUME_TIME);
-
-        Map<String, PkgUsageStats> usageStats = fetchUsageStats();
-
-        mDb.beginTransaction();
-        try {
-            removeApplications(packageName);
-            String description = getContext().getString(R.string.application_desc);
-            // Iterate and find all the activities which have the LAUNCHER category set.
-            Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
-            mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
-            if (packageName != null) {
-                // Limit to activities in the package, if given
-                mainIntent.setPackage(packageName);
-            }
-            final PackageManager manager = getPackageManager();
-            List<ResolveInfo> activities = manager.queryIntentActivities(mainIntent, 0);
-            int activityCount = activities == null ? 0 : activities.size();
-            for (int i = 0; i < activityCount; i++) {
-                ResolveInfo info = activities.get(i);
-                String title = info.loadLabel(manager).toString();
-                String activityClassName = info.activityInfo.name;
-                if (TextUtils.isEmpty(title)) {
-                    title = activityClassName;
-                }
-
-                String activityPackageName = info.activityInfo.applicationInfo.packageName;
-                if (DBG) Log.d(TAG, "activity " + activityPackageName + "/" + activityClassName);
-                PkgUsageStats stats = usageStats.get(activityPackageName);
-                int launchCount = 0;
-                long lastResumeTime = 0;
-                if (stats != null) {
-                    launchCount = stats.launchCount;
-                    if (stats.componentResumeTimes.containsKey(activityClassName)) {
-                        lastResumeTime = stats.componentResumeTimes.get(activityClassName);
-                    }
-                }
-
-                String icon = getActivityIconUri(info.activityInfo);
-                inserter.prepareForInsert();
-                inserter.bind(nameCol, title);
-                inserter.bind(descriptionCol, description);
-                inserter.bind(packageCol, activityPackageName);
-                inserter.bind(classCol, activityClassName);
-                inserter.bind(iconCol, icon);
-                inserter.bind(launchCountCol, launchCount);
-                inserter.bind(lastResumeTimeCol, lastResumeTime);
-                inserter.execute();
-            }
-            mDb.setTransactionSuccessful();
-        } finally {
-            mDb.endTransaction();
-            inserter.close();
-        }
-
-        if (DBG) Log.d(TAG, "Finished updating database.");
-    }
-
-    @VisibleForTesting
-    protected synchronized void updateUsageStats() {
-        if (DBG) Log.d(TAG, "Update application usage stats.");
-        Map<String, PkgUsageStats> usageStats = fetchUsageStats();
-
-        mDb.beginTransaction();
-        try {
-            for (Map.Entry<String, PkgUsageStats> statsEntry : usageStats.entrySet()) {
-                ContentValues updatedLaunchCount = new ContentValues();
-                String packageName = statsEntry.getKey();
-                PkgUsageStats stats = statsEntry.getValue();
-                updatedLaunchCount.put(LAUNCH_COUNT, stats.launchCount);
-
-                mDb.update(APPLICATIONS_TABLE, updatedLaunchCount,
-                        PACKAGE + " = ?", new String[] { packageName });
-
-                for (Map.Entry<String, Long> crtEntry: stats.componentResumeTimes.entrySet()) {
-                    ContentValues updatedLastResumeTime = new ContentValues();
-                    String componentName = crtEntry.getKey();
-                    updatedLastResumeTime.put(LAST_RESUME_TIME, crtEntry.getValue());
-
-                    mDb.update(APPLICATIONS_TABLE, updatedLastResumeTime,
-                            PACKAGE + " = ? AND " + CLASS + " = ?",
-                            new String[] { packageName, componentName });
-                }
-            }
-            mDb.setTransactionSuccessful();
-        } finally {
-            mDb.endTransaction();
-        }
-
-        if (DBG) Log.d(TAG, "Finished updating application usage stats in database.");
-    }
-
-    private String getActivityIconUri(ActivityInfo activityInfo) {
-        int icon = activityInfo.getIconResource();
-        if (icon == 0) return null;
-        Uri uri = getResourceUri(activityInfo.applicationInfo, icon);
-        return uri == null ? null : uri.toString();
-    }
-
-    private void removeApplications(String packageName) {
-        if (packageName == null) {
-            mDb.delete(APPLICATIONS_TABLE, null, null);
-        } else {
-            mDb.delete(APPLICATIONS_TABLE, PACKAGE + " = ?", new String[] { packageName });
-        }
-    }
-
-    @Override
-    public Uri insert(Uri uri, ContentValues values) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public int update(Uri uri, ContentValues values, String selection,
-            String[] selectionArgs) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public int delete(Uri uri, String selection, String[] selectionArgs) {
-        throw new UnsupportedOperationException();
-    }
-
-    private Uri getResourceUri(ApplicationInfo appInfo, int res) {
-        try {
-            Resources resources = getPackageManager().getResourcesForApplication(appInfo);
-            return getResourceUri(resources, appInfo.packageName, res);
-        } catch (PackageManager.NameNotFoundException e) {
-            return null;
-        } catch (Resources.NotFoundException e) {
-            return null;
-        }
-    }
-
-    private static Uri getResourceUri(Resources resources, String appPkg, int res)
-            throws Resources.NotFoundException {
-        String resPkg = resources.getResourcePackageName(res);
-        String type = resources.getResourceTypeName(res);
-        String name = resources.getResourceEntryName(res);
-        return makeResourceUri(appPkg, resPkg, type, name);
-    }
-
-    private static Uri makeResourceUri(String appPkg, String resPkg, String type, String name)
-            throws Resources.NotFoundException {
-        Uri.Builder uriBuilder = new Uri.Builder();
-        uriBuilder.scheme(ContentResolver.SCHEME_ANDROID_RESOURCE);
-        uriBuilder.encodedAuthority(appPkg);
-        uriBuilder.appendEncodedPath(type);
-        if (!appPkg.equals(resPkg)) {
-            uriBuilder.appendEncodedPath(resPkg + ":" + name);
-        } else {
-            uriBuilder.appendEncodedPath(name);
-        }
-        return uriBuilder.build();
-    }
-
-    @VisibleForTesting
-    protected Map<String, PkgUsageStats> fetchUsageStats() {
-        try {
-            ActivityManager activityManager = (ActivityManager)
-                    getContext().getSystemService(Context.ACTIVITY_SERVICE);
-
-            if (activityManager != null) {
-                Map<String, PkgUsageStats> stats = new HashMap<String, PkgUsageStats>();
-                PkgUsageStats[] pkgUsageStats = activityManager.getAllPackageUsageStats();
-                if (pkgUsageStats != null) {
-                    for (PkgUsageStats pus : pkgUsageStats) {
-                        stats.put(pus.packageName, pus);
-                    }
-                }
-                return stats;
-            }
-        } catch (Exception e) {
-            Log.w(TAG, "Could not fetch usage stats", e);
-        }
-        return new HashMap<String, PkgUsageStats>();
-    }
-
-    @VisibleForTesting
-    protected PackageManager getPackageManager() {
-        return getContext().getPackageManager();
-    }
-
-    @VisibleForTesting
-    protected boolean hasGlobalSearchPermission() {
-        // Only the global-search system is allowed to see the usage stats of
-        // applications. Without this restriction the ApplicationsProvider
-        // could leak information about the user's behavior to applications.
-        return (PackageManager.PERMISSION_GRANTED ==
-                getContext().checkCallingPermission(android.Manifest.permission.GLOBAL_SEARCH));
-    }
-}
diff --git a/tests/Android.mk b/tests/Android.mk
deleted file mode 100644
index 7d1fe34..0000000
--- a/tests/Android.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# We only want this apk build for tests.
-LOCAL_MODULE_TAGS := tests
-
-# Include all test java files.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_INSTRUMENTATION_FOR := ApplicationsProvider
-
-# framework is required to access android.provider.Applications
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-LOCAL_PACKAGE_NAME := ApplicationsProviderTests
-LOCAL_CERTIFICATE := shared
-
-include $(BUILD_PACKAGE)
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
deleted file mode 100644
index c614afc..0000000
--- a/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.providers.applications.tests">
-
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="com.android.providers.applications"
-        android:label="Tests for the ApplicationsProvider">
-    </instrumentation>
-</manifest>
diff --git a/tests/runtests b/tests/runtests
deleted file mode 100644
index be1c779..0000000
--- a/tests/runtests
+++ /dev/null
@@ -1,6 +0,0 @@
-mmm packages/providers/ApplicationsProvider || return
-mmm packages/providers/ApplicationsProvider/tests || return
-adb install -r ${OUT}/system/app/ApplicationsProvider.apk || return
-adb install -r ${OUT}/data/app/ApplicationsProviderTests.apk || return
-adb shell am instrument -w -e class com.android.providers.applications.ApplicationsProviderTest com.android.providers.applications.tests/android.test.InstrumentationTestRunner || return
-
diff --git a/tests/src/com/android/providers/applications/ApplicationsProviderForTesting.java b/tests/src/com/android/providers/applications/ApplicationsProviderForTesting.java
deleted file mode 100644
index 56a3d80..0000000
--- a/tests/src/com/android/providers/applications/ApplicationsProviderForTesting.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2010 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.applications;
-
-import android.content.pm.PackageManager;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-
-import com.android.internal.os.PkgUsageStats;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An extension of {@link ApplicationsProvider} that makes its testing easier.
- */
-public class ApplicationsProviderForTesting extends ApplicationsProvider {
-
-    private PackageManager mMockPackageManager;
-
-    private MockActivityManager mMockActivityManager;
-
-    private boolean mHasGlobalSearchPermission;
-
-    private MockUpdateHandler mMockUpdateHandler;
-
-    @Override
-    protected PackageManager getPackageManager() {
-        return mMockPackageManager;
-    }
-
-    protected void setMockPackageManager(PackageManager mockPackageManager) {
-        mMockPackageManager = mockPackageManager;
-    }
-
-    @Override
-    protected Map<String, PkgUsageStats> fetchUsageStats() {
-        Map<String, PkgUsageStats> stats = new HashMap<String, PkgUsageStats>();
-        for (PkgUsageStats pus : mMockActivityManager.getAllPackageUsageStats()) {
-            stats.put(pus.packageName, pus);
-        }
-        return stats;
-    }
-
-    protected void setMockActivityManager(MockActivityManager mockActivityManager) {
-        mMockActivityManager = mockActivityManager;
-    }
-
-    protected void setHasGlobalSearchPermission(boolean hasGlobalSearchPermission) {
-        mHasGlobalSearchPermission = hasGlobalSearchPermission;
-    }
-
-    @Override
-    protected boolean hasGlobalSearchPermission() {
-        return mHasGlobalSearchPermission;
-    }
-
-    @Override
-    Handler createHandler(Looper looper) {
-        mMockUpdateHandler = new MockUpdateHandler(looper);
-        return mMockUpdateHandler;
-    }
-
-    public boolean dispatchNextMessage() {
-        return mMockUpdateHandler.dispatchNextMessage();
-    }
-
-    private class MockUpdateHandler extends UpdateHandler {
-
-        List<Message> mMessages = new ArrayList<Message>();
-
-        MockUpdateHandler(Looper looper) {
-            super(looper);
-        }
-
-        @Override
-        public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
-            mMessages.add(msg);
-            return true;
-        }
-
-        public boolean dispatchNextMessage() {
-            if (!mMessages.isEmpty()) {
-                dispatchMessage(mMessages.remove(0));
-                return true;
-            } else {
-                return false;
-            }
-        }
-    }
-}
diff --git a/tests/src/com/android/providers/applications/ApplicationsProviderTest.java b/tests/src/com/android/providers/applications/ApplicationsProviderTest.java
deleted file mode 100644
index 99a8a2e..0000000
--- a/tests/src/com/android/providers/applications/ApplicationsProviderTest.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright (C) 2010 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.applications;
-
-import android.app.SearchManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.Applications;
-import android.test.ProviderTestCase2;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import java.util.concurrent.FutureTask;
-
-
-/**
- * Instrumentation test for the ApplicationsProvider.
- *
- * The tests use an IsolatedContext, and are not affected by the real list of
- * applications on the device. The ApplicationsProvider's persistent database
- * is also created in an isolated context so it doesn't interfere with the
- * database of the actual ApplicationsProvider installed on the device.
- */
-@SmallTest
-public class ApplicationsProviderTest extends ProviderTestCase2<ApplicationsProviderForTesting> {
-
-    private ApplicationsProviderForTesting mProvider;
-
-    private MockActivityManager mMockActivityManager;
-
-    public ApplicationsProviderTest() {
-        super(ApplicationsProviderForTesting.class, Applications.AUTHORITY);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mProvider = getProvider();
-        mMockActivityManager = new MockActivityManager();
-    }
-
-    /**
-     * Ensures that the ApplicationsProvider is in a ready-to-test state.
-     */
-    private void initProvider(ApplicationsProviderForTesting provider) throws Exception {
-        // Decouple the provider from Android's real list of applications.
-        MockPackageManager mockPackageManager = new MockPackageManager();
-        addDefaultTestPackages(mockPackageManager);
-
-        initProvider(provider, mockPackageManager);
-    }
-
-    private void initProvider(ApplicationsProviderForTesting provider,
-            MockPackageManager mockPackageManager) throws Exception {
-        provider.setMockPackageManager(mockPackageManager);
-        provider.setMockActivityManager(mMockActivityManager);
-
-        assertTrue(provider.dispatchNextMessage());
-    }
-
-    /**
-     * Register a few default applications with the ApplicationsProvider that
-     * tests can query.
-     */
-    private void addDefaultTestPackages(MockPackageManager mockPackageManager) {
-        mockPackageManager.addPackage(
-                "Email", new ComponentName("com.android.email", "com.android.email.MainView"));
-        mockPackageManager.addPackage(
-                "Ebay", new ComponentName("com.android.ebay", "com.android.ebay.Shopping"));
-        mockPackageManager.addPackage(
-                "Fakeapp", new ComponentName("com.android.fakeapp", "com.android.fakeapp.FakeView"));
-
-        // Apps that can be used to test ordering.
-        mockPackageManager.addPackage("AlphabeticA", new ComponentName("a", "a.AView"));
-        mockPackageManager.addPackage("AlphabeticB", new ComponentName("b", "b.BView"));
-        mockPackageManager.addPackage("AlphabeticC", new ComponentName("c", "c.CView"));
-        mockPackageManager.addPackage("AlphabeticD", new ComponentName("d", "d.DView"));
-        mockPackageManager.addPackage("AlphabeticD2", new ComponentName("d", "d.DView2"));
-    }
-
-    public void testSearch_singleResult() throws Exception {
-        initProvider(mProvider);
-        testSearch("ema", "Email");
-    }
-
-    public void testSearch_multipleResults() throws Exception {
-        initProvider(mProvider);
-        testSearch("e", "Ebay", "Email");
-    }
-
-    public void testSearch_noResults() throws Exception {
-        initProvider(mProvider);
-        testSearch("nosuchapp");
-    }
-
-    public void testSearch_orderingIsAlphabeticByDefault() throws Exception {
-        initProvider(mProvider);
-        testSearch("alphabetic", "AlphabeticA", "AlphabeticB", "AlphabeticC", "AlphabeticD",
-                "AlphabeticD2");
-    }
-
-    public void testSearch_emptySearchQueryReturnsEverything() throws Exception {
-        initProvider(mProvider);
-        testSearch("",
-                "AlphabeticA", "AlphabeticB", "AlphabeticC", "AlphabeticD", "AlphabeticD2",
-                "Ebay", "Email", "Fakeapp");
-    }
-
-    public void testSearch_appsAreRankedByUsageTimeOnStartup() throws Exception {
-        mMockActivityManager.addLastResumeTime("d", "d.DView", 3);
-        mMockActivityManager.addLastResumeTime("b", "b.BView", 1);
-        // Missing usage time for "a".
-        mMockActivityManager.addLastResumeTime("c", "c.CView", 0);
-
-        // Launch count database is populated on startup.
-        mProvider.setHasGlobalSearchPermission(true);
-
-        initProvider(mProvider);
-
-        // New ranking: D, B, A, C (first by launch count, then
-        // - if the launch counts of two apps are equal - alphabetically)
-        testSearch("alphabetic", "AlphabeticD", "AlphabeticB", "AlphabeticA", "AlphabeticC",
-                "AlphabeticD2");
-    }
-
-    public void testSearch_appsAreRankedByResumeTimeAfterUpdate() throws Exception {
-        initProvider(mProvider);
-        mProvider.setHasGlobalSearchPermission(true);
-
-        mMockActivityManager.addLastResumeTime("d", "d.DView", 3);
-        mMockActivityManager.addLastResumeTime("b", "b.BView", 1);
-        // Missing launch count for "a".
-        mMockActivityManager.addLastResumeTime("c", "c.CView", 0);
-
-        // Fetch new data from usage stat provider (in the real instance this
-        // is triggered by a zero-query from global search).
-        mProvider.updateUsageStats();
-
-        // New ranking: D, B, A, C (first by launch count, then
-        // - if the launch counts of two apps are equal - alphabetically)
-        testSearch("alphabetic", "AlphabeticD", "AlphabeticB", "AlphabeticA", "AlphabeticC",
-                "AlphabeticD2");
-    }
-
-    public void testSearch_noLastAccessTimesWithoutPermission() throws Exception {
-        initProvider(mProvider);
-        mProvider.setHasGlobalSearchPermission(false);
-        mMockActivityManager.addLastResumeTime("d", "d.DView", 1);
-        mMockActivityManager.addLastResumeTime("b", "b.BView", 2);
-        mMockActivityManager.addLastResumeTime("c", "c.CView", 3);
-
-        assertNull(getGlobalSearchCursor("", false));
-
-        Cursor cursor = getGlobalSearchCursor("alphabetic", false);
-        assertEquals(-1, cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_LAST_ACCESS_HINT));
-    }
-
-    public void testSearch_lastAccessTimes() throws Exception {
-        initProvider(mProvider);
-        mProvider.setHasGlobalSearchPermission(true);
-        mMockActivityManager.addLastResumeTime("d", "d.DView", 1);
-        mMockActivityManager.addLastResumeTime("b", "b.BView", 2);
-        mMockActivityManager.addLastResumeTime("c", "c.CView", 3);
-
-        testLastAccessTimes("", true, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0);
-
-        testLastAccessTimes("alphabetic", true, 3, 2, 1, 0, 0);
-
-        // Update the last resume time of "c".
-        mMockActivityManager.addLastResumeTime("c", "c.CView", 5);
-        // Without a refresh, we should see the same results as before.
-        testLastAccessTimes("alphabetic", false, 3, 2, 1, 0, 0);
-        // If we refresh, we should see the change.
-        testLastAccessTimes("alphabetic", true, 5, 2, 1, 0, 0);
-    }
-
-    /**
-     * The ApplicationsProvider must only rank by launch count if the caller
-     * is a privileged application - ordering apps by launch count when asked
-     * by a regular application would leak information about user behavior.
-     */
-    public void testSearch_notAllowedToRankByLaunchCount() throws Exception {
-        initProvider(mProvider);
-        // Simulate non-privileged calling application.
-        mProvider.setHasGlobalSearchPermission(false);
-
-        mMockActivityManager.addLastResumeTime("d", "d.DView", 3);
-        mMockActivityManager.addLastResumeTime("b", "b.BView", 1);
-        mMockActivityManager.addLastResumeTime("a", "a.AView", 0);
-        mMockActivityManager.addLastResumeTime("c", "c.CView", 0);
-
-        // Fetch new data from launch count provider.
-        mProvider.updateUsageStats();
-
-        // Launch count information mustn't be leaked - ranking is still
-        // alphabetic.
-        testSearch("alphabetic", "AlphabeticA", "AlphabeticB", "AlphabeticC", "AlphabeticD",
-                "AlphabeticD2");
-    }
-
-    public void testSearch_disabledPackage() throws Exception {
-        MockPackageManager mockPackageManager = new MockPackageManager();
-        mockPackageManager.addPackage("DisabledPackageApp1",
-                new ComponentName("dp", "dp.DisView1"));
-        mockPackageManager.addPackage("DisabledPackageApp2",
-                new ComponentName("dp", "dp.DisView2"),
-                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
-        initProvider(mProvider, mockPackageManager);
-
-        mProvider.setHasGlobalSearchPermission(true);
-        testSearch("dis");
-    }
-
-    public void testSearch_disabledComponent() throws Exception {
-        MockPackageManager mockPackageManager = new MockPackageManager();
-        mockPackageManager.addPackage("DisabledApp1", new ComponentName("da", "da.DaView1"),
-                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
-                PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
-        mockPackageManager.addPackage("DisabledApp2", new ComponentName("da", "da.DaView2"),
-                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
-                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
-        initProvider(mProvider, mockPackageManager);
-
-        mProvider.setHasGlobalSearchPermission(true);
-        testSearch("dis", "DisabledApp2");
-    }
-
-    private void testSearch(String searchQuery, String... expectedResultsInOrder) {
-        Cursor cursor = Applications.search(getMockContentResolver(), searchQuery);
-
-        assertNotNull(cursor);
-        assertFalse(cursor.isClosed());
-
-        verifySearchResults(cursor, expectedResultsInOrder);
-
-        cursor.close();
-    }
-
-    private void verifySearchResults(Cursor cursor, String... expectedResultsInOrder) {
-        int expectedResultCount = expectedResultsInOrder.length;
-        assertEquals("Wrong number of app search results.",
-                expectedResultCount, cursor.getCount());
-
-        if (expectedResultCount > 0) {
-            cursor.moveToFirst();
-            int nameIndex = cursor.getColumnIndex(ApplicationsProvider.NAME);
-            // Verify that the actual results match the expected ones.
-            for (int i = 0; i < cursor.getCount(); i++) {
-                assertEquals("Wrong search result at position " + i,
-                        expectedResultsInOrder[i], cursor.getString(nameIndex));
-                cursor.moveToNext();
-            }
-        }
-    }
-
-    private Cursor getGlobalSearchCursor(String searchQuery, boolean refresh) {
-        Uri.Builder uriBuilder = Applications.CONTENT_URI.buildUpon();
-        uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath(searchQuery);
-        if (refresh) {
-            uriBuilder.appendQueryParameter(ApplicationsProvider.REFRESH_STATS, "");
-        }
-        return getMockContentResolver().query(uriBuilder.build(), null, null, null, null);
-    }
-
-    private void testLastAccessTimes(String searchQuery, boolean refresh,
-            int... expectedLastAccessTimesInOrder) {
-        Cursor cursor = getGlobalSearchCursor(searchQuery, refresh);
-
-        assertNotNull(cursor);
-        assertFalse(cursor.isClosed());
-
-        verifyLastAccessTimes(cursor, expectedLastAccessTimesInOrder);
-
-        cursor.close();
-    }
-
-    private void verifyLastAccessTimes(Cursor cursor, int... expectedLastAccessTimesInOrder) {
-        cursor.moveToFirst();
-        int lastAccessTimeIndex = cursor.getColumnIndex(
-                SearchManager.SUGGEST_COLUMN_LAST_ACCESS_HINT);
-        // Verify that the actual results match the expected ones.
-        for (int i = 0; i < cursor.getCount(); i++) {
-            assertEquals("Wrong last-access time at position " + i,
-                    expectedLastAccessTimesInOrder[i], cursor.getInt(lastAccessTimeIndex));
-            cursor.moveToNext();
-        }
-    }
-}
diff --git a/tests/src/com/android/providers/applications/MockActivityManager.java b/tests/src/com/android/providers/applications/MockActivityManager.java
deleted file mode 100644
index 5ac5cf3..0000000
--- a/tests/src/com/android/providers/applications/MockActivityManager.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2011 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.applications;
-
-import com.android.internal.os.PkgUsageStats;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * The real ActivityManager is difficult to mock out (has a package visibility
- * constructor), so this doesn't extend it.
- */
-public class MockActivityManager {
-
-    private Map<String, PkgUsageStats> mPackageUsageStats = new HashMap<String, PkgUsageStats>();
-
-    public void addLastResumeTime(String packageName, String componentName, long lastResumeTime) {
-        if (!mPackageUsageStats.containsKey(packageName)) {
-            PkgUsageStats stats = new PkgUsageStats(packageName, 1, 0, new HashMap<String, Long>());
-            mPackageUsageStats.put(packageName, stats);
-        }
-        mPackageUsageStats.get(packageName).componentResumeTimes.put(componentName, lastResumeTime);
-    }
-
-    public PkgUsageStats[] getAllPackageUsageStats() {
-        return mPackageUsageStats.values().toArray(new PkgUsageStats[mPackageUsageStats.size()]);
-    }
-}
diff --git a/tests/src/com/android/providers/applications/MockPackageManager.java b/tests/src/com/android/providers/applications/MockPackageManager.java
deleted file mode 100644
index 9db7ee5..0000000
--- a/tests/src/com/android/providers/applications/MockPackageManager.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-// Copyright 2011 Google Inc. All Rights Reserved.
-
-package com.android.providers.applications;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class MockPackageManager extends android.test.mock.MockPackageManager {
-
-    private List<ResolveInfo> mPackages = new ArrayList<ResolveInfo>();
-
-    private Map<String, Integer> mApplicationEnabledSettings = new HashMap<String, Integer>();
-    private Map<String, Integer> mComponentEnabledSettings = new HashMap<String, Integer>();
-
-    /**
-     * Returns all packages registered with the mock package manager.
-     * ApplicationsProvider uses this method to query the list of applications.
-     */
-    @Override
-    public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
-        return mPackages;
-    }
-
-    @Override
-    public int getApplicationEnabledSetting(String packageName) {
-        return mApplicationEnabledSettings.get(packageName);
-    }
-
-    @Override
-    public int getComponentEnabledSetting(ComponentName componentName) {
-        return mComponentEnabledSettings.get(componentName.flattenToString());
-    }
-
-    /**
-     * Adds a new package to the mock package manager.
-     *
-     * Example:
-     * addPackage("Email", new ComponentName("com.android.email", "com.android.email.MainView"),
-     *            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
-     *            PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
-     *
-     * @param title the user-friendly title of the application (this is what
-     *         users will search for)
-     * @param componentName The full component name of the app.
-     * @param appEnabledSetting The setting which should be returned from
-     *        {@link #getApplicationEnabledSetting}, for this component's package.
-     * @param componentEnabledSetting The setting which should be returned from
-     *        {@link #getComponentEnabledSetting}, for this component.
-     */
-    public void addPackage(final String title, ComponentName componentName, int appEnabledSetting,
-            int componentEnabledSetting) {
-        // Set the application's title.
-        ResolveInfo packageInfo = new ResolveInfo() {
-            @Override
-            public CharSequence loadLabel(PackageManager pm) {
-                return title;
-            }
-        };
-
-        // Set the application's ComponentName.
-        packageInfo.activityInfo = new ActivityInfo();
-        packageInfo.activityInfo.name = componentName.getClassName();
-        packageInfo.activityInfo.applicationInfo = new ApplicationInfo();
-        packageInfo.activityInfo.applicationInfo.packageName = componentName.getPackageName();
-
-        mPackages.add(packageInfo);
-
-        mApplicationEnabledSettings.put(componentName.getPackageName(), appEnabledSetting);
-        mComponentEnabledSettings.put(componentName.flattenToString(), componentEnabledSetting);
-    }
-
-    public void addPackage(final String title, ComponentName componentName) {
-        addPackage(title, componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
-                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
-    }
-}
