diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..1362d03
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,11 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := user development
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := PackageInstaller
+LOCAL_CERTIFICATE := platform
+
+include $(BUILD_PACKAGE)
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
new file mode 100644
index 0000000..303897a
--- /dev/null
+++ b/AndroidManifest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.packageinstaller">
+    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
+    <uses-permission android:name="android.permission.DELETE_PACKAGES" />
+    <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <application android:label="@string/app_name"> 
+        <activity android:name=".PackageInstallerActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:scheme="content" />
+                <data android:scheme="file" />
+                <data android:mimeType="application/vnd.android.package-archive" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".InstallAppConfirmation">
+        </activity>
+        <activity android:name=".InstallAppProgress">
+        </activity>
+        <activity android:name=".InstallAppDone">
+        </activity>
+        <activity android:name=".UninstallerActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <action android:name="android.intent.action.DELETE" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:scheme="package" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".UninstallAppProgress">
+        </activity>
+        <activity android:name=".UninstallAppDone">
+        </activity>
+    </application>
+</manifest> 
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_APACHE2
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,190 @@
+
+   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/drawable/button_indicator_finish.png b/res/drawable/button_indicator_finish.png
new file mode 100755
index 0000000..5a01bcc
--- /dev/null
+++ b/res/drawable/button_indicator_finish.png
Binary files differ
diff --git a/res/layout/app_details.xml b/res/layout/app_details.xml
new file mode 100755
index 0000000..3ea8430
--- /dev/null
+++ b/res/layout/app_details.xml
@@ -0,0 +1,52 @@
+<?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.
+-->
+
+<!--
+Defines the layout of the application snippet that appears on top of the
+installation screens
+-->
+<!-- The snippet about the application - title, icon, description.  -->
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/app_snippet"
+    android:layout_width="fill_parent"
+    android:layout_height="65dip"
+    android:background="@color/title_background">
+    <ImageView android:id="@+id/app_icon"
+        android:paddingLeft="6dip"
+        android:layout_width="54dip"
+        android:layout_height="48dip"
+        android:background="@color/transparent"
+        android:layout_alignParentLeft="true"
+        android:gravity="center"
+        android:layout_centerInParent="true"
+        android:scaleType="centerCrop" />
+    <TextView android:id="@+id/app_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:textColor="?android:attr/textColorPrimary"
+        android:shadowColor="@color/shadow"
+        android:shadowRadius="2"
+        android:layout_toRightOf="@id/app_icon"
+        android:singleLine="true"
+        android:gravity="center"
+        android:layout_centerInParent="true"
+        android:paddingRight="6dip"
+        android:paddingLeft="6dip"
+        android:ellipsize="end"/>
+</RelativeLayout>
+
diff --git a/res/layout/install_confirm.xml b/res/layout/install_confirm.xml
new file mode 100755
index 0000000..bfda97d
--- /dev/null
+++ b/res/layout/install_confirm.xml
@@ -0,0 +1,108 @@
+<?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.
+-->
+
+<!--
+
+  Defines the layout of the splash screen that displays the security
+  settings required for an application and requests the confirmation of the
+  user before it is installed.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <include
+        layout="@layout/app_details"
+        android:id="@+id/app_snippet"/>
+    <TextView
+        android:id="@+id/install_confirm_question"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/install_confirm_question"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:paddingTop="20dip"
+        android:paddingLeft="20dip"
+        android:paddingBottom="20dip"/>
+
+    <ScrollView
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:fillViewport="true"
+        android:layout_weight="1">
+
+        <!-- Security settings description. -->
+        <LinearLayout
+            android:id="@+id/permissions_section"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginRight = "2dip"
+            android:orientation="vertical">
+            <TextView
+                android:id="@+id/security_settings_desc"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:paddingTop="20dip"
+                android:paddingLeft="20dip"
+                android:paddingBottom="20dip"/>
+
+            <LinearLayout
+                android:id="@+id/security_settings_list"
+                android:layout_width="fill_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1.0"
+                android:orientation="vertical"/>
+        </LinearLayout>
+    </ScrollView>
+
+    <!-- OK confirm and cancel buttons.  -->
+    <LinearLayout
+        android:background="@color/title_background"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:gravity="bottom"
+        android:paddingTop="4dip"
+        android:paddingLeft="2dip"
+        android:paddingRight="2dip"
+        android:orientation="horizontal">
+        <Button
+            android:id="@+id/ok_button"
+            android:text="@string/install"
+            android:layout_width="150dip"
+            android:paddingLeft="6dip"
+            android:layout_gravity="left"
+            android:layout_weight="0.4"
+            android:layout_height="wrap_content"/>
+        <!-- Spacer -->
+        <View
+            android:id="@+id/buttons_spacer_left"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:visibility="gone"
+            android:layout_weight="0.2" />
+        <Button
+            android:id="@+id/cancel_button"
+            android:layout_width="150dip"
+            android:paddingRight="6dip"
+            android:layout_gravity="right"
+            android:text="@string/cancel"
+            android:layout_weight="0.4"
+            android:layout_height="wrap_content"/>
+    </LinearLayout>
+</LinearLayout>
diff --git a/res/layout/install_done.xml b/res/layout/install_done.xml
new file mode 100755
index 0000000..e33f57b
--- /dev/null
+++ b/res/layout/install_done.xml
@@ -0,0 +1,71 @@
+<?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.
+-->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <include
+        layout="@layout/app_details"
+        android:gravity="top"
+        android:id="@+id/app_snippet" />
+    <TextView
+        android:id="@+id/center_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingLeft="20dip"
+        android:paddingTop="36dip"
+        android:drawablePadding="6dip"
+        android:layout_below="@id/app_snippet"
+        android:textColor="?android:attr/textColorSecondary"
+        android:textAppearance="?android:attr/textAppearanceMedium"/>
+
+        <!-- Launch and close buttons.  -->
+        <LinearLayout
+            android:background="@color/title_background"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:orientation="horizontal">
+            <Button
+                android:id="@+id/launch_button"
+                android:text="@string/launch"
+                android:layout_width="150dip"
+                android:paddingLeft="6dip"
+                android:layout_gravity="left"
+                android:layout_weight="0.4"
+                android:layout_height="wrap_content"/>
+            <!-- Spacer -->
+            <View
+                android:id="@+id/buttons_spacer_left"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:visibility="gone"
+                android:layout_weight="0.2" />
+            <Button
+                android:id="@+id/done_button"
+                android:layout_width="150dip"
+                android:paddingRight="6dip"
+                android:layout_gravity="right"
+                android:text="@string/done"
+                android:layout_weight="0.4"
+                android:layout_height="wrap_content"/>
+        </LinearLayout>
+
+</RelativeLayout>
+
+
diff --git a/res/layout/install_start.xml b/res/layout/install_start.xml
new file mode 100755
index 0000000..1ef0ab5
--- /dev/null
+++ b/res/layout/install_start.xml
@@ -0,0 +1,27 @@
+<?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.
+-->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <include
+        layout="@layout/app_details"
+        android:id="@+id/app_snippet"/>
+</RelativeLayout>
+
+
diff --git a/res/layout/op_progress.xml b/res/layout/op_progress.xml
new file mode 100755
index 0000000..b957fdf
--- /dev/null
+++ b/res/layout/op_progress.xml
@@ -0,0 +1,46 @@
+<?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.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content">
+
+    <include
+        layout="@layout/app_details"
+        android:id="@+id/app_snippet"/>
+    <ProgressBar
+        android:id="@+id/progress_bar"
+        style="?android:attr/progressBarStyleHorizontal"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:paddingTop="24dip"
+        android:paddingLeft="24dip"
+        android:paddingRight="24dip"
+        android:max="100" />
+    <TextView
+        android:id="@+id/center_text"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:paddingLeft="24dip"
+        android:paddingTop="16dip"
+        android:text="@string/installing"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textColor="?android:attr/textColorSecondary"/>
+</LinearLayout>
+
+
diff --git a/res/layout/uninstall_confirm.xml b/res/layout/uninstall_confirm.xml
new file mode 100755
index 0000000..3f7f18a
--- /dev/null
+++ b/res/layout/uninstall_confirm.xml
@@ -0,0 +1,94 @@
+<?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.
+-->
+
+<!--
+
+  Defines the layout of the confirmation screen that gets displayed when an
+  application is about to be uninstalled. Includes ok and cancel buttons
+  to let the uinstallation continue or abort.
+-->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:background="@color/view_background">
+
+    <!-- The snippet about the application - title, icon, description.  -->
+    <include
+        layout="@layout/app_details"
+        android:layout_alignParentTop="true"
+        android:id="@+id/app_snippet" />
+
+    <!-- uninstall application confirmation question -->
+    <TextView
+        android:id="@+id/uninstall_question"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/uninstall_application_question"
+        android:textStyle="bold"
+        android:paddingTop="16dip"
+        android:paddingLeft="16dip"
+        android:layout_below="@id/app_snippet"
+        android:textColor="?android:attr/textColorSecondary"
+        android:textAppearance="?android:attr/textAppearanceMedium"       
+        android:paddingBottom="36dip"/>
+
+    <!-- uninstall application confirmation text -->
+    <TextView
+        android:id="@+id/uninstall_confirm_text"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/uninstall_application_text"
+        android:textColor="?android:attr/textColorSecondary"
+        android:textAppearance="?android:attr/textAppearanceMedium"       
+        android:layout_below="@id/uninstall_question"
+        android:paddingLeft="16dip"/>
+    <!-- OK confirm and cancel buttons.  -->
+    <LinearLayout
+        android:background="@color/title_background"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:paddingTop="4dip"
+        android:paddingLeft="2dip"
+        android:paddingRight="2dip"
+        android:orientation="horizontal">
+        <Button
+            android:id="@+id/ok_button"
+            android:text="@string/ok"
+            android:layout_width="150dip"
+            android:paddingLeft="6dip"
+            android:layout_gravity="left"
+            android:layout_weight="0.4"
+            android:layout_height="wrap_content"/>
+        <!-- Spacer -->
+        <View
+            android:id="@+id/buttons_spacer_left"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:visibility="gone"
+            android:layout_weight="0.2" />
+        <Button
+            android:id="@+id/cancel_button"
+            android:layout_width="150dip"
+            android:paddingRight="6dip"
+            android:layout_gravity="right"
+            android:text="@string/cancel"
+            android:layout_weight="0.4"
+            android:layout_height="wrap_content"/>
+    </LinearLayout>
+</RelativeLayout>
diff --git a/res/layout/uninstall_done.xml b/res/layout/uninstall_done.xml
new file mode 100755
index 0000000..082d48b
--- /dev/null
+++ b/res/layout/uninstall_done.xml
@@ -0,0 +1,62 @@
+<?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.
+-->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+     
+    <LinearLayout
+        android:id="@+id/top_box"
+        android:background="@color/title_background"
+        android:layout_width="fill_parent"
+        android:layout_height="65dip"
+        android:layout_alignParentTop="true"/>
+
+    <TextView
+        android:id="@+id/center_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:paddingTop="60dip"
+        android:textColor="?android:attr/textColorSecondary"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:layout_below="@id/top_box"/>
+        <!-- OK confirm and cancel buttons.  -->
+        <!-- LinearLayout
+            android:background="@color/title_background"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:orientation="horizontal" -->
+          
+        <RelativeLayout
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:background="@color/title_background"
+            android:layout_alignParentBottom="true">
+
+            <Button
+                android:id="@+id/ok_button"
+                android:paddingRight="6dip"
+                android:layout_alignParentRight="true"
+                android:text="@string/ok"
+                android:layout_width="150dip"
+                android:layout_height="wrap_content"/>
+        </RelativeLayout>
+</RelativeLayout>
+
+
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
new file mode 100644
index 0000000..76247bb
--- /dev/null
+++ b/res/values-cs/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"Nástroj na instalaci balíčků"</string>
+    <string name="install">"Instalovat"</string>
+    <string name="done">"Hotovo"</string>
+    <string name="security_settings_desc">"Povolit této aplikaci:"</string>
+    <string name="cancel">"Zrušit"</string>
+    <string name="unknown">"Neznámé"</string>
+    <string name="installing">"Instalace..."</string>
+    <string name="install_done">"Aplikace byla nainstalována"</string>
+    <string name="install_confirm_question">"Chcete tuto aplikaci nainstalovat?"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"Otevřít"</string>
+    <string name="unknown_apps_dlg_title">"Instalace byla zablokována"</string>
+    <string name="unknown_apps_dlg_text">"Váš telefon je z důvodu zabezpečení nastaven tak, aby blokoval instalaci aplikací, které nepocházejí z webu Android Market."</string>
+    <string name="ok">"OK"</string>
+    <string name="settings">"Nastavení"</string>
+    <string name="manage_applications">"Správa aplikací"</string>
+    <string name="dlg_app_replacement_title">"Nahradit aplikaci"</string>
+    <string name="dlg_app_replacement_statement">"Aplikace, kterou instalujete, nahradí jinou aplikaci."\n\n"Všechna dříve zadaná data uživatelů budou uložena."</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"Nedostatek místa"</string>
+    <string name="out_of_space_dlg_text">"Aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> nebylo možné zobrazit. Uvolněte v telefonu nějaké místo a zkuste to znovu."</string>
+    <string name="dlg_ok">"OK"</string>
+    <string name="app_not_found_dlg_title">"Aplikace nebyla nalezena"</string>
+    <string name="app_not_found_dlg_text">"Aplikace nebyla nalezena na seznamu nainstalovaných aplikací."</string>
+    <string name="uninstall_application_question">"Odinstalovat aplikaci?"</string>
+    <string name="uninstall_application_text">"Tato aplikace bude odstraněna z vašeho telefonu."</string>
+    <string name="uninstalling">"Probíhá odinstalace..."</string>
+    <string name="uninstall_done">"Odinstalace byla dokončena."</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"Chyba analýzy"</string>
+    <string name="Parse_error_dlg_text">"Při analýze balíčku došlo k problému."</string>
+</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
new file mode 100644
index 0000000..85eb053
--- /dev/null
+++ b/res/values-de/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"Paket-Installer"</string>
+    <string name="install">"Installieren"</string>
+    <string name="done">"Fertig"</string>
+    <string name="security_settings_desc">"Folgendes auf dieser Anwendung zulassen:"</string>
+    <string name="cancel">"Abbrechen"</string>
+    <string name="unknown">"Unbekannt"</string>
+    <string name="installing">"Installation..."</string>
+    <string name="install_done">"Anwendung installiert"</string>
+    <string name="install_confirm_question">"Möchten Sie diese Anwendung installieren?"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"Öffnen"</string>
+    <string name="unknown_apps_dlg_title">"Installation gesperrt"</string>
+    <string name="unknown_apps_dlg_text">"Aus Sicherheitsgründen ist Ihr Telefon so eingestellt, dass die Installation von Nicht-Android Market-Anwendungen gesperrt ist."</string>
+    <string name="ok">"OK"</string>
+    <string name="settings">"Einstellungen"</string>
+    <string name="manage_applications">"Anwendungen verwalten"</string>
+    <string name="dlg_app_replacement_title">"Anwendung ersetzen"</string>
+    <string name="dlg_app_replacement_statement">"Die zu installierende Anwendung ersetzt eine andere Anwendung."\n\n"Alle vorhandenen Nutzerdaten werden gespeichert."</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"Kein freier Speicher vorhanden"</string>
+    <string name="out_of_space_dlg_text">"<xliff:g id="APP_NAME">%1$s</xliff:g> konnte nicht geprüft werden. Bereinigen Sie den Speicher Ihres Telefons und versuchen Sie es erneut."</string>
+    <string name="dlg_ok">"OK"</string>
+    <string name="app_not_found_dlg_title">"Anwendung nicht gefunden"</string>
+    <string name="app_not_found_dlg_text">"Diese Anwendung wurde in der Liste der installierten Anwendungen nicht gefunden."</string>
+    <string name="uninstall_application_question">"Anwendung deinstallieren?"</string>
+    <string name="uninstall_application_text">"Diese Anwendung wird von Ihrem Telefon entfernt."</string>
+    <string name="uninstalling">"Deinstallation..."</string>
+    <string name="uninstall_done">"Deinstallation abgeschlossen!"</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"Parsingfehler"</string>
+    <string name="Parse_error_dlg_text">"Beim Parsen des Pakets ist ein Problem aufgetreten."</string>
+</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
new file mode 100644
index 0000000..a75f36f
--- /dev/null
+++ b/res/values-es/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"Instalador de paquetes"</string>
+    <string name="install">"Instalar"</string>
+    <string name="done">"Hecho"</string>
+    <string name="security_settings_desc">"Permitir a esta aplicación:"</string>
+    <string name="cancel">"Cancelar"</string>
+    <string name="unknown">"Desconocida"</string>
+    <string name="installing">"Instalando…"</string>
+    <string name="install_done">"Aplicación instalada"</string>
+    <string name="install_confirm_question">"¿Quieres instalar esta aplicación?"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"Abierta"</string>
+    <string name="unknown_apps_dlg_title">"Instalación bloqueada"</string>
+    <string name="unknown_apps_dlg_text">"Por motivos de seguridad, tu teléfono se ha configurado para bloquear la instalación de aplicaciones que no pertenecen a Android Market."</string>
+    <string name="ok">"Aceptar"</string>
+    <string name="settings">"Configuración"</string>
+    <string name="manage_applications">"Administrar aplicaciones"</string>
+    <string name="dlg_app_replacement_title">"Sustituir aplicación"</string>
+    <string name="dlg_app_replacement_statement">"La aplicación que quieres instalar sustituirá a otra aplicación."\n\n"Se guardarán todos los datos de usuarios anteriores."</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"Sin espacio"</string>
+    <string name="out_of_space_dlg_text">"No se ha podido ver el archivo <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera espacio en el teléfono e inténtalo de nuevo."</string>
+    <string name="dlg_ok">"Aceptar"</string>
+    <string name="app_not_found_dlg_title">"No se ha encontrado la aplicación."</string>
+    <string name="app_not_found_dlg_text">"No se ha encontrado la aplicación en la lista de aplicaciones instaladas."</string>
+    <string name="uninstall_application_question">"Desinstalar aplicación?"</string>
+    <string name="uninstall_application_text">"Esta aplicación se eliminará de tu teléfono."</string>
+    <string name="uninstalling">"Desinstalando..."</string>
+    <string name="uninstall_done">"Desinstalación completada"</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"Error de análisis"</string>
+    <string name="Parse_error_dlg_text">"Se ha producido un problema al analizar el paquete."</string>
+</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
new file mode 100644
index 0000000..6ee6980
--- /dev/null
+++ b/res/values-fr/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"Programme d\'installation du kit"</string>
+    <string name="install">"Installer"</string>
+    <string name="done">"Terminé"</string>
+    <string name="security_settings_desc">"Autoriser cette application à :"</string>
+    <string name="cancel">"Annuler"</string>
+    <string name="unknown">"Inconnu"</string>
+    <string name="installing">"Installation..."</string>
+    <string name="install_done">"Application installée"</string>
+    <string name="install_confirm_question">"Voulez-vous installer cette application ?"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"Ouvrir"</string>
+    <string name="unknown_apps_dlg_title">"Installation bloquée"</string>
+    <string name="unknown_apps_dlg_text">"Pour plus de sécurité, votre téléphone est configuré de sorte à bloquer l\'installation des applications ne provenant pas d\'Android Market."</string>
+    <string name="ok">"OK"</string>
+    <string name="settings">"Paramètres"</string>
+    <string name="manage_applications">"Gérer les applications"</string>
+    <string name="dlg_app_replacement_title">"Remplacer l\'application"</string>
+    <string name="dlg_app_replacement_statement">"L\'application que vous installez actuellement remplacera l\'autre application."\n\n"Toutes les données d\'utilisateur existantes seront enregistrées."</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"Mémoire insuffisante"</string>
+    <string name="out_of_space_dlg_text">"Impossible d\'afficher <xliff:g id="APP_NAME">%1$s</xliff:g>. Libérez de l\'espace sur votre téléphone, puis réessayez."</string>
+    <string name="dlg_ok">"OK"</string>
+    <string name="app_not_found_dlg_title">"Application introuvable"</string>
+    <string name="app_not_found_dlg_text">"Cette application ne figure pas dans la liste des applications installées."</string>
+    <string name="uninstall_application_question">"Désinstaller l\'application ?"</string>
+    <string name="uninstall_application_text">"Cette application va être supprimée de votre téléphone."</string>
+    <string name="uninstalling">"Désinstallation..."</string>
+    <string name="uninstall_done">"Désinstallation terminée !"</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"Erreur d\'analyse"</string>
+    <string name="Parse_error_dlg_text">"Un problème est survenu lors de l\'analyse du kit."</string>
+</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
new file mode 100644
index 0000000..cb45126
--- /dev/null
+++ b/res/values-it/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"Installazione pacchetti"</string>
+    <string name="install">"Installa"</string>
+    <string name="done">"Fine"</string>
+    <string name="security_settings_desc">"Consenti all\'applicazione di:"</string>
+    <string name="cancel">"Annulla"</string>
+    <string name="unknown">"Sconosciuto"</string>
+    <string name="installing">"Installazione..."</string>
+    <string name="install_done">"Applicazione installata"</string>
+    <string name="install_confirm_question">"Installare questa applicazione?"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"Apri"</string>
+    <string name="unknown_apps_dlg_title">"Installazione bloccata"</string>
+    <string name="unknown_apps_dlg_text">"Per motivi di sicurezza, il telefono è impostato per bloccare l\'installazione di applicazioni non provenienti da Android Market."</string>
+    <string name="ok">"OK"</string>
+    <string name="settings">"Impostazioni"</string>
+    <string name="manage_applications">"Gestisci applicazioni"</string>
+    <string name="dlg_app_replacement_title">"Sostituisci applicazione"</string>
+    <string name="dlg_app_replacement_statement">"L\'applicazione da installare sostituirà un\'altra applicazione."\n\n"Tutti i dati utente precedenti verranno salvati."</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"Spazio esaurito"</string>
+    <string name="out_of_space_dlg_text">"Impossibile visualizzare <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera spazio sul telefono e riprova."</string>
+    <string name="dlg_ok">"OK"</string>
+    <string name="app_not_found_dlg_title">"Applicazione non trovata"</string>
+    <string name="app_not_found_dlg_text">"Impossibile trovare l\'applicazione \nnell\'elenco di applicazioni installate."</string>
+    <string name="uninstall_application_question">"Disinstallare l\'applicazione?"</string>
+    <string name="uninstall_application_text">"L\'applicazione verrà rimossa dal telefono."</string>
+    <string name="uninstalling">"Disinstallazione..."</string>
+    <string name="uninstall_done">"Disinstallazione completata"</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"Errore di analisi"</string>
+    <string name="Parse_error_dlg_text">"Errore durante l\'analisi del pacchetto."</string>
+</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
new file mode 100644
index 0000000..e27153d
--- /dev/null
+++ b/res/values-ja/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"パッケージインストーラ"</string>
+    <string name="install">"インストール"</string>
+    <string name="done">"完了"</string>
+    <string name="security_settings_desc">"このアプリケーションに許可する権限:"</string>
+    <string name="cancel">"キャンセル"</string>
+    <string name="unknown">"不明"</string>
+    <string name="installing">"インストール中..."</string>
+    <string name="install_done">"アプリケーションをインストールしました"</string>
+    <string name="install_confirm_question">"このアプリケーションをインストールしますか？"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"開く"</string>
+    <string name="unknown_apps_dlg_title">"インストールはブロックされました"</string>
+    <string name="unknown_apps_dlg_text">"セキュリティ保護のため、お使いの端末はAndroid Market以外から提供されたアプリケーションのインストールをブロックするよう設定されています。"</string>
+    <string name="ok">"OK"</string>
+    <string name="settings">"設定"</string>
+    <string name="manage_applications">"アプリケーションを管理"</string>
+    <string name="dlg_app_replacement_title">"アプリケーションを更新"</string>
+    <string name="dlg_app_replacement_statement">"このアプリケーションをインストールすると別のアプリケーションが上書きされます。"\n\n"過去のユーザーデータはすべて保存されます。"</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"容量不足です"</string>
+    <string name="out_of_space_dlg_text">"<xliff:g id="APP_NAME">%1$s</xliff:g>を表示できませんでした。端末の空き領域を増やしてもう一度試してください。"</string>
+    <string name="dlg_ok">"OK"</string>
+    <string name="app_not_found_dlg_title">"アプリケーションが見つかりません"</string>
+    <string name="app_not_found_dlg_text">"インストール済みアプリケーションのリストに、このアプリケーションはありません。"</string>
+    <string name="uninstall_application_question">"アプリケーションをアンインストールしますか？"</string>
+    <string name="uninstall_application_text">"このアプリケーションはお使いの端末から削除されます。"</string>
+    <string name="uninstalling">"アンインストール中..."</string>
+    <string name="uninstall_done">"アンインストールが完了しました。"</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"解析エラー"</string>
+    <string name="Parse_error_dlg_text">"パッケージの解析中に問題が発生しました。"</string>
+</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
new file mode 100644
index 0000000..b9a1738
--- /dev/null
+++ b/res/values-ko/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"패키지 설치 프로그램"</string>
+    <string name="install">"설치"</string>
+    <string name="done">"완료"</string>
+    <string name="security_settings_desc">"이 응용프로그램에 다음을 수행할 권한을 부여:"</string>
+    <string name="cancel">"취소"</string>
+    <string name="unknown">"알 수 없음"</string>
+    <string name="installing">"설치 중..."</string>
+    <string name="install_done">"응용프로그램이 설치되었습니다."</string>
+    <string name="install_confirm_question">"이 응용프로그램을 설치하시겠습니까?"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"열기"</string>
+    <string name="unknown_apps_dlg_title">"설치가 차단됨"</string>
+    <string name="unknown_apps_dlg_text">"보안을 위해 전화기가 Android Market에서 제공하지 않은 응용프로그램의 설치를 차단하도록 설정되어 있습니다."</string>
+    <string name="ok">"확인"</string>
+    <string name="settings">"설정"</string>
+    <string name="manage_applications">"응용프로그램 관리"</string>
+    <string name="dlg_app_replacement_title">"응용프로그램 교체"</string>
+    <string name="dlg_app_replacement_statement">"설치 중인 응용프로그램이 다른 응용프로그램을 대체합니다."\n\n"이전의 모든 사용자 데이터는 저장됩니다.\n."</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"여유 공간이 없음"</string>
+    <string name="out_of_space_dlg_text">"<xliff:g id="APP_NAME">%1$s</xliff:g>을(를) 볼 수 없습니다. 전화기에서 여유 공간을 늘린 후에 다시 시도하세요."</string>
+    <string name="dlg_ok">"확인"</string>
+    <string name="app_not_found_dlg_title">"응용프로그램을 찾지 못했습니다."</string>
+    <string name="app_not_found_dlg_text">"응용프로그램이 설치된 응용프로그램 목록에 없습니다."</string>
+    <string name="uninstall_application_question">"응용프로그램을 제거하시겠습니까?"</string>
+    <string name="uninstall_application_text">"전화기에서 이 응용프로그램이 삭제됩니다."</string>
+    <string name="uninstalling">"제거 중..."</string>
+    <string name="uninstall_done">"제거가 완료되었습니다."</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"구문 분석 오류"</string>
+    <string name="Parse_error_dlg_text">"패키지를 구문 분석하는 중 문제가 발생했습니다."</string>
+</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
new file mode 100644
index 0000000..06d9593
--- /dev/null
+++ b/res/values-nb/strings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"Pakkeinstallering"</string>
+    <string name="install">"Installer"</string>
+    <string name="done">"Ferdig"</string>
+    <string name="security_settings_desc">"La denne applikasjonen:"</string>
+    <string name="cancel">"Avbryt"</string>
+    <string name="unknown">"Ukjent"</string>
+    <string name="installing">"Installerer…"</string>
+    <string name="install_done">"Applikasjon installert"</string>
+    <string name="install_confirm_question">"Ønsker du å installere denne applikasjonen?"</string>
+    <string name="install_failed">"Installasjon vellykket"</string>
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"Åpne"</string>
+    <string name="unknown_apps_dlg_title">"Installasjonen ble blokkert"</string>
+    <string name="unknown_apps_dlg_text">"Av sikkerhetsgrunner er telefonen satt til å blokkere installasjon av applikasjoner som ikke kommer fra Android-markedet."</string>
+    <string name="ok">"OK"</string>
+    <string name="settings">"Innstillinger"</string>
+    <string name="manage_applications">"Administrer applikasjoner"</string>
+    <string name="dlg_app_replacement_title">"Erstatt applikasjon"</string>
+    <string name="dlg_app_replacement_statement">"Applikasjonen du installerer vil erstatte en annen applikasjon."\n\n"Alle eksisterende brukerdata vil bli lagret."</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"Tom for plass"</string>
+    <string name="out_of_space_dlg_text">"Kunne ikke vise <xliff:g id="APP_NAME">%1$s</xliff:g>. Frigjør plass på telefonen og prøv igjen."</string>
+    <string name="dlg_ok">"OK"</string>
+    <string name="app_not_found_dlg_title">"Fant ikke applikasjonen"</string>
+    <string name="app_not_found_dlg_text">"Fant ikke applikasjonen i listen over installerte applikasjoner."</string>
+    <string name="uninstall_application_question">"Avinstaller applikasjonen?"</string>
+    <string name="uninstall_application_text">"Applikasjonen vil bli fjernet fra telefonen."</string>
+    <string name="uninstalling">"Avinstallerer…"</string>
+    <string name="uninstall_done">"Avintallasjon fullført!"</string>
+    <string name="uninstall_failed">"Avinstallasjonen var mislykket"</string>
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"Parsefeil"</string>
+    <string name="Parse_error_dlg_text">"Det oppsto et problem under tolkningen av pakken."</string>
+</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
new file mode 100644
index 0000000..3835272
--- /dev/null
+++ b/res/values-nl/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"Installatieprogramma van pakket"</string>
+    <string name="install">"Installeren"</string>
+    <string name="done">"Gereed"</string>
+    <string name="security_settings_desc">"Deze toepassing toestaan het volgende te doen:"</string>
+    <string name="cancel">"Annuleren"</string>
+    <string name="unknown">"Onbekend"</string>
+    <string name="installing">"Installeren..."</string>
+    <string name="install_done">"Toepassing is geïnstalleerd"</string>
+    <string name="install_confirm_question">"Wilt u deze toepassing installeren?"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"Openen"</string>
+    <string name="unknown_apps_dlg_title">"De installatie is geblokkeerd"</string>
+    <string name="unknown_apps_dlg_text">"Voor de veiligheid is uw telefoon ingesteld op het blokkeren van de installatie van toepassingen die niet in Android Market zijn opgenomen."</string>
+    <string name="ok">"OK"</string>
+    <string name="settings">"Instellingen"</string>
+    <string name="manage_applications">"Toepassingen beheren"</string>
+    <string name="dlg_app_replacement_title">"Toepassing vervangen"</string>
+    <string name="dlg_app_replacement_statement">"De toepassing die u installeert, vervangt een andere toepassing."\n\n"Alle bestaande gebruikersgegevens worden opgeslagen."</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"Geen ruimte beschikbaar"</string>
+    <string name="out_of_space_dlg_text">"<xliff:g id="APP_NAME">%1$s</xliff:g> kan niet worden weergegeven. Maak ruimte vrij op uw telefoon en probeer het opnieuw."</string>
+    <string name="dlg_ok">"OK"</string>
+    <string name="app_not_found_dlg_title">"Toepassing niet gevonden"</string>
+    <string name="app_not_found_dlg_text">"De toepassing is niet gevonden in de lijst met geïnstalleerde toepassingen."</string>
+    <string name="uninstall_application_question">"Toepassing verwijderen?"</string>
+    <string name="uninstall_application_text">"Deze toepassing wordt verwijderd van uw telefoon."</string>
+    <string name="uninstalling">"Verwijderen..."</string>
+    <string name="uninstall_done">"Verwijdering voltooid."</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"Parseerfout"</string>
+    <string name="Parse_error_dlg_text">"Er is een probleem opgetreden bij het parseren van het pakket."</string>
+</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
new file mode 100644
index 0000000..2cb3d30
--- /dev/null
+++ b/res/values-pl/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"Instalator pakietu"</string>
+    <string name="install">"Instaluj"</string>
+    <string name="done">"Gotowe"</string>
+    <string name="security_settings_desc">"Zezwalaj tej aplikacji na:"</string>
+    <string name="cancel">"Anuluj"</string>
+    <string name="unknown">"Nieznane"</string>
+    <string name="installing">"Instalowanie..."</string>
+    <string name="install_done">"Aplikacja została zainstalowana"</string>
+    <string name="install_confirm_question">"Czy zainstalować tę aplikację?"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"Otwórz"</string>
+    <string name="unknown_apps_dlg_title">"Instalowanie zablokowane"</string>
+    <string name="unknown_apps_dlg_text">"Ze względów bezpieczeństwa telefon jest ustawiony tak, aby blokować instalowanie aplikacji niepochodzących z katalogu Android Market."</string>
+    <string name="ok">"OK"</string>
+    <string name="settings">"Ustawienia"</string>
+    <string name="manage_applications">"Zarządzaj aplikacjami"</string>
+    <string name="dlg_app_replacement_title">"Zastąp aplikację"</string>
+    <string name="dlg_app_replacement_statement">"Instalowana aplikacja zastąpi inną aplikację."\n\n"Wszystkie poprzednie dane użytkownika zostaną zachowane."</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"Brak miejsca"</string>
+    <string name="out_of_space_dlg_text">"Nie można wyświetlić <xliff:g id="APP_NAME">%1$s</xliff:g>. Zwolnij miejsce w telefonie i spróbuj ponownie."</string>
+    <string name="dlg_ok">"OK"</string>
+    <string name="app_not_found_dlg_title">"Nie znaleziono aplikacji"</string>
+    <string name="app_not_found_dlg_text">"Nie znaleziono aplikacji na liście zainstalowanych aplikacji."</string>
+    <string name="uninstall_application_question">"Czy zdeinstalować aplikację?"</string>
+    <string name="uninstall_application_text">"Ta aplikacja zostanie usunięta z telefonu."</string>
+    <string name="uninstalling">"Deinstalowanie..."</string>
+    <string name="uninstall_done">"Zakończono deinstalowanie."</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"Błąd parsowania"</string>
+    <string name="Parse_error_dlg_text">"Wystąpił problem podczas parsowania pakietu."</string>
+</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
new file mode 100644
index 0000000..89562d1
--- /dev/null
+++ b/res/values-ru/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"Программа установки пакета"</string>
+    <string name="install">"Установить"</string>
+    <string name="done">"Готово"</string>
+    <string name="security_settings_desc">"Разрешить этому приложению:"</string>
+    <string name="cancel">"Отмена"</string>
+    <string name="unknown">"Неизвестно"</string>
+    <string name="installing">"Установка..."</string>
+    <string name="install_done">"Приложение установлено"</string>
+    <string name="install_confirm_question">"Установить это приложение?"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"Открыть"</string>
+    <string name="unknown_apps_dlg_title">"Установка заблокирована"</string>
+    <string name="unknown_apps_dlg_text">"Из соображений безопасности на вашем телефоне заблокирована установка приложений, источником которых не является Android Маркет."</string>
+    <string name="ok">"ОК"</string>
+    <string name="settings">"Настройки"</string>
+    <string name="manage_applications">"Управлять приложениями"</string>
+    <string name="dlg_app_replacement_title">"Заменить приложение"</string>
+    <string name="dlg_app_replacement_statement">"Приложение, которое вы устанавливаете, заменит другое приложение."\n\n"Все пользовательские данные будут сохранены."</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"Недостаточно места"</string>
+    <string name="out_of_space_dlg_text">"Невозможно просмотреть <xliff:g id="APP_NAME">%1$s</xliff:g>. Освободите место в памяти телефона и повторите попытку."</string>
+    <string name="dlg_ok">"ОК"</string>
+    <string name="app_not_found_dlg_title">"Приложение не найдено"</string>
+    <string name="app_not_found_dlg_text">"Приложение не было найдено в списке установленных приложений."</string>
+    <string name="uninstall_application_question">"Удалить приложение?"</string>
+    <string name="uninstall_application_text">"Данное приложение будет удалено с вашего телефона."</string>
+    <string name="uninstalling">"Удаление..."</string>
+    <string name="uninstall_done">"Удаление завершено!"</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"Синтаксическая ошибка"</string>
+    <string name="Parse_error_dlg_text">"При анализе пакета возникла проблема."</string>
+</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..07ea62b
--- /dev/null
+++ b/res/values-zh-rCN/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"打包安装程序"</string>
+    <string name="install">"安装"</string>
+    <string name="done">"完成"</string>
+    <string name="security_settings_desc">"允许该应用程序："</string>
+    <string name="cancel">"取消"</string>
+    <string name="unknown">"未知"</string>
+    <string name="installing">"正在安装..."</string>
+    <string name="install_done">"应用程序已安装"</string>
+    <string name="install_confirm_question">"是否要安装该应用程序？"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"打开"</string>
+    <string name="unknown_apps_dlg_title">"禁止安装"</string>
+    <string name="unknown_apps_dlg_text">"为了安全起见，您的手机设置为禁止安装不是随 Android Market 提供的应用程序。"</string>
+    <string name="ok">"确定"</string>
+    <string name="settings">"设置"</string>
+    <string name="manage_applications">"管理应用程序"</string>
+    <string name="dlg_app_replacement_title">"替换应用程序"</string>
+    <string name="dlg_app_replacement_statement">"您正在安装的应用程序会替换其他应用程序。"\n\n"会保存所有以前的用户数据。"</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"空间不足"</string>
+    <string name="out_of_space_dlg_text">"无法查看<xliff:g id="APP_NAME">%1$s</xliff:g>。请释放部分手机空间，然后重试。"</string>
+    <string name="dlg_ok">"确定"</string>
+    <string name="app_not_found_dlg_title">"找不到应用程序"</string>
+    <string name="app_not_found_dlg_text">"在已安装应用程序的列表中找不到该应用程序。"</string>
+    <string name="uninstall_application_question">"是否卸载应用程序？"</string>
+    <string name="uninstall_application_text">"该应用程序会从您的手机中删除。"</string>
+    <string name="uninstalling">"正在卸载..."</string>
+    <string name="uninstall_done">"卸载完成！"</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"解析错误"</string>
+    <string name="Parse_error_dlg_text">"解析包时出现问题。"</string>
+</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..97a2b04
--- /dev/null
+++ b/res/values-zh-rTW/strings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">"程式安裝器"</string>
+    <string name="install">"安裝"</string>
+    <string name="done">"完成"</string>
+    <string name="security_settings_desc">"允許此應用程式："</string>
+    <string name="cancel">"取消"</string>
+    <string name="unknown">"未知"</string>
+    <string name="installing">"安裝中..."</string>
+    <string name="install_done">"已安裝的應用程式"</string>
+    <string name="install_confirm_question">"要安裝此應用程式嗎？"</string>
+    <!-- no translation found for install_failed (6644311739017660989) -->
+    <skip />
+    <!-- no translation found for install_failed_msg (5282789300118241924) -->
+    <skip />
+    <string name="launch">"開啟"</string>
+    <string name="unknown_apps_dlg_title">"安裝遭封鎖。"</string>
+    <string name="unknown_apps_dlg_text">"為維護安全，您的手機設定不會安裝非 Android Market 所提供的應用程式。"</string>
+    <string name="ok">"確定"</string>
+    <string name="settings">"設定"</string>
+    <string name="manage_applications">"管理應用程式"</string>
+    <string name="dlg_app_replacement_title">"取代應用程式"</string>
+    <string name="dlg_app_replacement_statement">"您所要安裝的應用程式將會取代其他的應用程式。"\n\n"將會儲存所有先前的使用者資料。"</string>
+    <!-- no translation found for dlg_sys_app_replacement_statement (8158736217122431465) -->
+    <skip />
+    <string name="out_of_space_dlg_title">"空間不足"</string>
+    <string name="out_of_space_dlg_text">"無法檢視 <xliff:g id="APP_NAME">%1$s</xliff:g>。請先釋放手機上的部分空間，然後再試一次。"</string>
+    <string name="dlg_ok">"確定"</string>
+    <string name="app_not_found_dlg_title">"找不到應用程式"</string>
+    <string name="app_not_found_dlg_text">"已安裝的應用程式清單中沒有此應用程式。"</string>
+    <string name="uninstall_application_question">"要解除安裝應用程式嗎？"</string>
+    <string name="uninstall_application_text">"此應用程式將從您的手機中移除。"</string>
+    <string name="uninstalling">"解除安裝中..."</string>
+    <string name="uninstall_done">"解除安裝完成！"</string>
+    <!-- no translation found for uninstall_failed (5725854598594371845) -->
+    <skip />
+    <!-- no translation found for uninstall_failed_msg (5480019148754200912) -->
+    <skip />
+    <string name="Parse_error_dlg_title">"剖析錯誤"</string>
+    <string name="Parse_error_dlg_text">"剖析程式時發生問題。"</string>
+</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
new file mode 100755
index 0000000..28e691b
--- /dev/null
+++ b/res/values/colors.xml
@@ -0,0 +1,23 @@
+<?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>
+    <color name="view_background">#1c1c1c</color>
+    <color name="title_background">#828282</color>
+    <color name="shadow">#cc222222</color>
+    <color name="transparent">#00000000</color>
+</resources>
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
new file mode 100644
index 0000000..f36660b
--- /dev/null
+++ b/res/values/strings.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">Package Installer</string>
+    <string name="install">Install</string>
+    <string name="done">Done</string>
+    <!-- TODO REMOVE LATER -->
+    <string name="security_settings_desc">Allow this application to:</string>
+    <string name="cancel">Cancel</string>
+    <string name="unknown">Unknown</string>
+    <string name="installing">Installing\u2026</string>
+    <string name="install_done">Application installed</string>
+    <string name="install_confirm_question">Do you want to install this application?</string>
+    <string name="install_failed">Application not installed</string>
+    <string name="install_failed_msg"><xliff:g id="app_name">%1$s</xliff:g> could not be installed on this phone.</string>
+    <string name="launch">Open</string>
+    <string name="unknown_apps_dlg_title">Install blocked</string>
+    <string name="unknown_apps_dlg_text">For security, your phone is set to block installation of applications not sourced in Android Market.</string>
+    <string name="ok">OK</string>
+    <string name="settings">Settings</string>
+    <string name="manage_applications">Manage applications</string>
+    <string name="dlg_app_replacement_title">Replace application</string>
+    <string name="dlg_app_replacement_statement">The application you are installing will replace another application.\n\nAll previous user data will be saved.</string>
+    <!-- Dialog attributes when replacing system app -->
+    <string name="dlg_sys_app_replacement_statement">This is a system application. Do you still want to replace it?\n\nAll previous user data will be saved.</string>
+    <string name="out_of_space_dlg_title">Out of space</string>
+    <string name="out_of_space_dlg_text"><xliff:g id="app_name">%1$s</xliff:g> could not be viewed. Free up some space on your phone and try again.</string>
+    <!-- strings related to uninstall activity -->
+    <string name="dlg_ok">OK</string>
+    <string name="app_not_found_dlg_title">Application not found</string>
+    <string name="app_not_found_dlg_text"> The application was not
+found in the list of installed applications.</string>
+    <string name="uninstall_application_question">Uninstall application?</string>
+    <string name="uninstall_application_text">This application will be removed from your phone.</string>
+    <string name="uninstalling">Uninstalling\u2026</string>
+    <string name="uninstall_done">Uninstall finished!</string>
+    <string name="uninstall_failed">Uninstall not successful</string>
+    <string name="uninstall_failed_msg"><xliff:g id="app_name">%1$s</xliff:g> could not be uninstalled!</string>
+
+    <!-- Dialog attributes to indicate parse errors -->
+    <string name="Parse_error_dlg_title">Parse Error</string>
+    <string name="Parse_error_dlg_text">There is a problem parsing the package.</string>
+</resources>
diff --git a/src/com/android/packageinstaller/InstallAppConfirmation.java b/src/com/android/packageinstaller/InstallAppConfirmation.java
new file mode 100755
index 0000000..fe7126b
--- /dev/null
+++ b/src/com/android/packageinstaller/InstallAppConfirmation.java
@@ -0,0 +1,126 @@
+/*
+**
+** Copyright 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.
+*/
+package com.android.packageinstaller;
+
+import com.android.packageinstaller.R;
+import java.util.ArrayList;
+import android.widget.AppSecurityPermissions;
+import android.app.Activity;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageParser;
+import android.content.pm.PermissionInfo;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+/**
+ * This activity corresponds to a confirmation screen that is displayed when the user tries
+ * to install an application bundled as an apk file.
+ * The intent that launches this activity should include the application information object
+ * of the application(to be installed) and a list of permission strings associated
+ * with the application. This information is displayed on the screen and installation is either
+ * continued or canceled based on the user response(click ok or cancel).
+ */
+public class InstallAppConfirmation extends Activity implements View.OnClickListener {
+    private final String TAG="InstallAppConfirmation";
+    private boolean localLOGV = false;
+    private Button mOk;
+    private Button mCancel;
+    private ApplicationInfo mAppInfo;
+    private Uri mPkgURI;
+    private View mContentView;
+    
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Intent intent = getIntent();
+        if(localLOGV) Log.i(TAG, "intent="+intent);
+        mAppInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
+        mPkgURI = intent.getData();        
+        if(localLOGV) Log.i(TAG, "mAppInfo = "+mAppInfo);
+        initView();
+    }
+    
+    public void initView() {
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        String unknown =  getString(R.string.unknown);
+        //set description
+        String desc = getString(R.string.security_settings_desc);
+        if(desc == null) {
+            desc = unknown;
+        }
+        LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mContentView = inflater.inflate(R.layout.install_confirm, null);
+        setContentView(mContentView);
+        //initialize views
+        PackageUtil.initAppSnippet(this, mAppInfo, R.id.app_snippet);
+        if(desc != null) {
+            ((TextView)findViewById(R.id.security_settings_desc)).setText(desc);
+        }
+        
+        
+        LinearLayout permsView = (LinearLayout) mContentView.findViewById(
+                R.id.permissions_section);
+        boolean permVisible = false;
+        PackageParser.Package pkg = PackageUtil.getPackageInfo(mPkgURI);
+        if(pkg != null) {
+            AppSecurityPermissions asp = new AppSecurityPermissions(this, pkg);
+            if(asp.getPermissionCount() > 0) {
+                permVisible = true;
+                permsView.setVisibility(View.VISIBLE);
+                LinearLayout securityList = (LinearLayout) permsView.findViewById(
+                        R.id.security_settings_list);
+                securityList.addView(asp.getPermissionsView());
+            } 
+        }
+        if(!permVisible){
+            permsView.setVisibility(View.GONE);
+        }
+        mOk = (Button)findViewById(R.id.ok_button);
+        mCancel = (Button)findViewById(R.id.cancel_button);
+        mOk.setOnClickListener(this);
+        mCancel.setOnClickListener(this);
+    }
+    
+    public void setResultAndReturn(int result) {
+        if(result == RESULT_CANCELED) Log.i(TAG, "Result has been canceled");
+        if(result == RESULT_OK) Log.i(TAG, "result ok");
+        setResult(result);
+        finish();
+    }
+    
+    public void onClick(View v) {
+        int result = RESULT_CANCELED;
+        if(v == mOk) {
+            result = RESULT_OK;
+            setResultAndReturn(result);
+        } else if(v == mCancel) {
+            result = RESULT_CANCELED;
+            setResultAndReturn(result);
+        }
+    }
+}
diff --git a/src/com/android/packageinstaller/InstallAppDone.java b/src/com/android/packageinstaller/InstallAppDone.java
new file mode 100755
index 0000000..5a3f7d6
--- /dev/null
+++ b/src/com/android/packageinstaller/InstallAppDone.java
@@ -0,0 +1,109 @@
+/*
+**
+** Copyright 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.
+*/
+package com.android.packageinstaller;
+
+import com.android.packageinstaller.R;
+import android.app.Activity;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.Window;
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * This activity corresponds to a install status  screen that is displayed 
+ * when the user tries
+ * to install an application bundled as an apk file. The screen
+ * has two buttons to either launch the newly installed application
+ * or close the screen. The installation result and the package uri are passed through the
+ * intent that launches the activity.
+ */
+public class InstallAppDone extends Activity  implements View.OnClickListener {
+    private final String TAG="InstallAppDone";
+    private boolean localLOGV = false;
+    private ApplicationInfo mAppInfo;
+    private Button mDoneButton;
+    private Button mLaunchButton;
+    private boolean installFlag;
+    private Intent mLaunchIntent;
+    
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Intent intent = getIntent();
+        mAppInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
+        installFlag = intent.getBooleanExtra(PackageUtil.INTENT_ATTR_INSTALL_STATUS, true);
+        if(localLOGV) Log.i(TAG, "installFlag="+installFlag);
+        initView();
+    }
+    
+    public void initView() {
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        String unknown =  getString(R.string.unknown);
+        setContentView(R.layout.install_done);
+        // Initialize views
+        PackageUtil.initAppSnippet(this, mAppInfo, R.id.app_snippet);
+        TextView centerText = (TextView)findViewById(R.id.center_text);
+        mDoneButton = (Button)findViewById(R.id.done_button);
+        mLaunchButton = (Button)findViewById(R.id.launch_button);
+        int centerTextDrawableId;
+        int centerTextLabel;
+        if(installFlag) {
+            mLaunchButton.setVisibility(View.VISIBLE);
+            centerTextDrawableId = R.drawable.button_indicator_finish;
+            centerTextLabel = R.string.install_done;
+            // Enable or disable launch button
+            try {
+                mLaunchIntent = getPackageManager().getLaunchIntentForPackage( 
+                        mAppInfo.packageName);
+            } catch (PackageManager.NameNotFoundException e) {
+            }
+            if(mLaunchIntent != null) {
+                mLaunchButton.setOnClickListener(this);
+            } else {
+                mLaunchButton.setEnabled(false);
+            }
+        } else {
+            centerTextDrawableId = com.android.internal.R.drawable.ic_bullet_key_permission;
+            centerTextLabel = R.string.install_failed;
+            mLaunchButton.setVisibility(View.INVISIBLE);
+        }
+        Drawable centerTextDrawable = getResources().getDrawable(centerTextDrawableId);
+        centerTextDrawable.setBounds(0, 0, 
+                centerTextDrawable.getIntrinsicWidth(),
+                centerTextDrawable.getIntrinsicHeight());
+        centerText.setCompoundDrawables(centerTextDrawable, null, null, null);
+        centerText.setText(getString(centerTextLabel));
+        mDoneButton.setOnClickListener(this);
+    }
+
+    public void onClick(View v) {
+        if(v == mDoneButton) {
+            Log.i(TAG, "Finished installing "+mAppInfo);
+            finish();
+        } else if(v == mLaunchButton) {
+                startActivity(mLaunchIntent);
+                finish();
+        }
+    }
+}
diff --git a/src/com/android/packageinstaller/InstallAppProgress.java b/src/com/android/packageinstaller/InstallAppProgress.java
new file mode 100755
index 0000000..da1044c
--- /dev/null
+++ b/src/com/android/packageinstaller/InstallAppProgress.java
@@ -0,0 +1,114 @@
+/*
+**
+** Copyright 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.
+*/
+package com.android.packageinstaller;
+
+import com.android.packageinstaller.R;
+import android.app.Activity;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageInstallObserver;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.Window;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+/**
+ * This activity corresponds to a download progress screen that is displayed 
+ * when the user tries
+ * to install an application bundled as an apk file. The result of the application install
+ * is indicated in the result code that gets set to the corresponding installation status
+ * codes defined in PackageManager. If the package being installed already exists,
+ * the existing package is replaced with the new one.
+ */
+public class InstallAppProgress extends Activity {
+    private final String TAG="InstallAppProgress";
+    private boolean localLOGV = false;
+    private ApplicationInfo mAppInfo;
+    private Uri mPackageURI;
+    private ProgressBar mProgressBar;
+    private final int INSTALL_COMPLETE = 1;
+    private Handler mHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case INSTALL_COMPLETE:
+                    //finish the activity posting result
+                    setResultAndFinish(msg.arg1);
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
+    
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Intent intent = getIntent();
+        mAppInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
+        mPackageURI = intent.getData();
+        initView();
+    }
+    
+    class PackageInstallObserver extends IPackageInstallObserver.Stub {
+        public void packageInstalled(String packageName, int returnCode) {
+            Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
+            msg.arg1 = returnCode;
+            mHandler.sendMessage(msg);
+        }
+    }
+    
+    void setResultAndFinish(int retCode) {
+        Intent data = new Intent();
+        setResult(retCode);
+        finish();
+    }
+    
+    public void initView() {
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        String unknown =  getString(R.string.unknown);
+        setContentView(R.layout.op_progress);
+        //initialize views
+        PackageUtil.initAppSnippet(this, mAppInfo, R.id.app_snippet);
+        TextView installTextView = (TextView)findViewById(R.id.center_text);
+        installTextView.setText(R.string.installing);
+        mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
+        mProgressBar.setIndeterminate(true);
+        // Set flag to replace package if already existing
+        int installFlags = 0;
+        PackageManager pm = getPackageManager();
+        try {
+            PackageInfo pi = pm.getPackageInfo(mAppInfo.packageName, 
+                    PackageManager.GET_UNINSTALLED_PACKAGES);
+            if(pi != null) {
+                installFlags |= PackageManager.REPLACE_EXISTING_PACKAGE;
+            }
+        } catch (NameNotFoundException e) {
+        }
+        if((installFlags & PackageManager.REPLACE_EXISTING_PACKAGE )!= 0) {
+            Log.w(TAG, "Replacing package:"+mAppInfo.packageName);
+        }
+        PackageInstallObserver observer = new PackageInstallObserver();
+        pm.installPackage(mPackageURI, observer, installFlags);
+    }
+}
diff --git a/src/com/android/packageinstaller/PackageInstallerActivity.java b/src/com/android/packageinstaller/PackageInstallerActivity.java
new file mode 100644
index 0000000..29f05b4
--- /dev/null
+++ b/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -0,0 +1,420 @@
+/*
+**
+** Copyright 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.
+*/
+package com.android.packageinstaller;
+
+import com.android.packageinstaller.R;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.DialogInterface.OnCancelListener;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageDataObserver;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageParser;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.FileUtils;
+import android.os.Handler;
+import android.os.Message;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.Window;
+
+/*
+ * This activity is launched when a new application is installed via side loading
+ * The package is first parsed and the user is notified of parse errors via a dialog.
+ * If the package is successfully parsed, the user is notified to turn on the install unknown
+ * applications setting. A memory check is made at this point and the user is notified of out
+ * of memory conditions if any. If the package is already existing on the device, 
+ * a confirmation dialog (to replace the existing package) is presented to the user.
+ * Based on the user response the package is then installed by launching InstallAppConfirm
+ * sub activity. All state transitions are handled in this activity
+ */
+public class PackageInstallerActivity extends Activity implements OnCancelListener {
+    private static final int INSTALL_INITIAL = 0;
+    private static final int INSTALL_CONFIRM = 1;
+    private static final int INSTALL_PROGRESS = 2;
+    private static final int INSTALL_DONE = 3;
+    private static final String TAG = "PackageInstaller";
+    private Uri mPackageURI;    
+    private boolean localLOGV = false;
+    private int mCurrentState = INSTALL_INITIAL;
+    PackageManager mPm;
+    private PackageParser.Package mPkgInfo;
+    private File mTmpFile;
+    private static final int SUCCEEDED = 1;
+    private static final int FAILED = 0;
+    // Broadcast receiver for clearing cache
+    ClearCacheReceiver mClearCacheReceiver;
+    private static final int HANDLER_BASE_MSG_IDX = 0;
+    private static final int FREE_SPACE = HANDLER_BASE_MSG_IDX + 1;
+
+    // ApplicationInfo object primarily used for already existing applications
+    private ApplicationInfo mAppInfo = null;
+
+    // Dialog identifiers used in showDialog
+    private static final int DLG_BASE = 0;
+    private static final int DLG_REPLACE_APP = DLG_BASE + 1;
+    private static final int DLG_UNKNOWN_APPS = DLG_BASE + 2;
+    private static final int DLG_PACKAGE_ERROR = DLG_BASE + 3;
+    private static final int DLG_OUT_OF_SPACE = DLG_BASE + 4;
+    private static final int DLG_INSTALL_ERROR = DLG_BASE + 5;
+
+    private Handler mHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case FREE_SPACE:
+                    unregisterReceiver(mClearCacheReceiver);
+                    if(msg.arg1 == SUCCEEDED) {
+                        makeTempCopyAndInstall();
+                    } else {
+                        showDialogInner(DLG_OUT_OF_SPACE);
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
+   
+    private void startInstallActivityClass(int requestCode, Class<?> cls) {
+        Intent newIntent = new Intent();
+        startInstallActivityClass(newIntent, requestCode, cls);
+    }
+
+    private void startInstallActivityClass(Intent newIntent, int requestCode, Class<?> cls) {
+        newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, 
+                                                  mPkgInfo.applicationInfo);
+        newIntent.setData(mPackageURI);
+        newIntent.setClass(this, cls);
+        if(localLOGV) Log.i(TAG, "downloaded app uri="+mPackageURI);
+        startActivityForResult(newIntent, requestCode);
+    }
+
+    private void startInstallConfirm() {
+        Intent newIntent = new Intent();
+        newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, 
+                mPkgInfo.applicationInfo);
+        newIntent.setData(mPackageURI);
+        newIntent.setClass(this, InstallAppConfirmation.class);
+        startActivityForResult(newIntent, INSTALL_CONFIRM);
+    }
+    
+    private void startInstallProgress() {
+        startInstallActivityClass(INSTALL_PROGRESS, InstallAppProgress.class);
+    }
+    
+    private void startInstallDone() {
+        Intent newIntent = new Intent(Intent.ACTION_VIEW);
+        newIntent.putExtra(PackageUtil.INTENT_ATTR_INSTALL_STATUS, true);
+        startInstallActivityClass(newIntent, INSTALL_DONE, InstallAppDone.class);
+    }
+    
+    private void showDialogInner(int id) {
+        // TODO better fix for this? Remove dialog so that it gets created again
+        removeDialog(id);
+        showDialog(id);
+    }
+
+    @Override
+    public Dialog onCreateDialog(int id) {
+        switch (id) {
+        case DLG_REPLACE_APP:
+            int msgId = R.string.dlg_app_replacement_statement;
+            // Customized text for system apps
+            if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+                msgId = R.string.dlg_sys_app_replacement_statement;
+            }
+            return new AlertDialog.Builder(this)
+                    .setTitle(R.string.dlg_app_replacement_title)
+                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            startInstallConfirm();
+                        }})
+                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            Log.i(TAG, "Canceling installation");
+                            finish();
+                        }})
+                    .setMessage(msgId)
+                    .setOnCancelListener(this)
+                    .create();
+        case DLG_UNKNOWN_APPS:
+            return new AlertDialog.Builder(this)
+                    .setTitle(R.string.unknown_apps_dlg_title)
+                    .setMessage(R.string.unknown_apps_dlg_text)
+                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            Log.i(TAG, "Finishing off activity so that user can navigate to settings manually");
+                            finish();
+                        }})
+                    .setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            Log.i(TAG, "Launching settings");
+                            launchSettingsAppAndFinish();
+                        }
+                    })
+                    .setOnCancelListener(this)
+                    .create(); 
+        case DLG_PACKAGE_ERROR :
+            return new AlertDialog.Builder(this)
+                    .setTitle(R.string.Parse_error_dlg_title)
+                    .setMessage(R.string.Parse_error_dlg_text)
+                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            finish();
+                        }
+                    })
+                    .setOnCancelListener(this)
+                    .create();
+        case DLG_OUT_OF_SPACE:
+            // Guaranteed not to be null. will default to package name if not set by app
+            CharSequence appTitle = mPm.getApplicationLabel(mPkgInfo.applicationInfo);
+            String dlgText = getString(R.string.out_of_space_dlg_text, 
+                    appTitle.toString());
+            return new AlertDialog.Builder(this)
+                    .setTitle(R.string.out_of_space_dlg_title)
+                    .setMessage(dlgText)
+                    .setPositiveButton(R.string.manage_applications, new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            //launch manage applications
+                            Intent intent = new Intent("android.intent.action.MANAGE_PACKAGE_STORAGE");
+                            startActivity(intent);   
+                            finish();
+                        }
+                    })
+                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            Log.i(TAG, "Canceling installation");
+                            finish();
+                        }
+                  })
+                  .setOnCancelListener(this)
+                  .create();
+        case DLG_INSTALL_ERROR :
+            // Guaranteed not to be null. will default to package name if not set by app
+            CharSequence appTitle1 = mPm.getApplicationLabel(mPkgInfo.applicationInfo);
+            String dlgText1 = getString(R.string.install_failed_msg,
+                    appTitle1.toString());
+            return new AlertDialog.Builder(this)
+                    .setTitle(R.string.install_failed)
+                    .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            finish();
+                        }
+                    })
+                    .setMessage(dlgText1)
+                    .setOnCancelListener(this)
+                    .create();
+       }
+       return null;
+   }
+
+    private class ClearCacheReceiver extends BroadcastReceiver {
+        public static final String INTENT_CLEAR_CACHE = 
+                "com.android.packageinstaller.CLEAR_CACHE";
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Message msg = mHandler.obtainMessage(FREE_SPACE);
+            msg.arg1 = (getResultCode() ==1) ? SUCCEEDED : FAILED;
+            mHandler.sendMessage(msg);
+        }
+    }
+    
+    private void checkOutOfSpace(long size) {
+        if(localLOGV) Log.i(TAG, "Checking for "+size+" number of bytes");
+        if (mClearCacheReceiver == null) {
+            mClearCacheReceiver = new ClearCacheReceiver();
+        }
+        registerReceiver(mClearCacheReceiver,
+                new IntentFilter(ClearCacheReceiver.INTENT_CLEAR_CACHE));
+        PendingIntent pi = PendingIntent.getBroadcast(this,
+                0,  new Intent(ClearCacheReceiver.INTENT_CLEAR_CACHE), 0);
+        mPm.freeStorage(size, pi);
+    }
+
+    private void launchSettingsAppAndFinish() {
+        //Create an intent to launch SettingsTwo activity
+        Intent launchSettingsIntent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);
+        startActivity(launchSettingsIntent);
+        finish();
+    }
+    
+    private boolean isInstallingUnknownAppsAllowed() {
+        return Settings.Secure.getInt(getContentResolver(), 
+            Settings.Secure.INSTALL_NON_MARKET_APPS, 0) > 0;
+    }
+    
+    private File createTempPackageFile(String filePath) {
+        File tmpPackageFile;
+        int i = filePath.lastIndexOf("/");
+        String tmpFileName;
+        if(i != -1) {
+            tmpFileName = filePath.substring(i+1);
+        } else {
+            tmpFileName = filePath;
+        }
+        FileOutputStream fos;
+        try {
+            fos=openFileOutput(tmpFileName, MODE_WORLD_READABLE);
+        } catch (FileNotFoundException e1) {
+            Log.e(TAG, "Error opening file "+tmpFileName);
+            return null;
+        }
+        try {
+            fos.close();
+        } catch (IOException e) {
+            Log.e(TAG, "Error opening file "+tmpFileName);
+            return null;
+        }
+        tmpPackageFile=getFileStreamPath(tmpFileName);
+        File srcPackageFile = new File(filePath);
+        if (!FileUtils.copyFile(srcPackageFile, tmpPackageFile)) {
+            return null;
+        }
+        return tmpPackageFile;
+    }
+    
+    private void makeTempCopyAndInstall() {
+        //copy file to tmp dir
+        mTmpFile = createTempPackageFile(mPackageURI.getPath());
+        if(mTmpFile == null) {
+            //display a dialog
+            Log.e(TAG, "Error copying file locally. Failed Installation");
+            showDialogInner(DLG_OUT_OF_SPACE);
+            return;
+        }
+        mPackageURI = Uri.parse("file://"+mTmpFile.getPath());
+        // Check if package is already installed. display confirmation dialog if replacing pkg
+        try {
+            mAppInfo = mPm.getApplicationInfo(mPkgInfo.packageName,
+                    PackageManager.GET_UNINSTALLED_PACKAGES);
+        } catch (NameNotFoundException e) {
+            mAppInfo = null;
+        }
+        if (mAppInfo == null) {
+            startInstallConfirm();
+        } else {
+            if(localLOGV) Log.i(TAG, "Replacing existing package:"+
+                    mPkgInfo.applicationInfo.packageName);
+            showDialogInner(DLG_REPLACE_APP);
+        }
+    }
+    
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        //get intent information
+        final Intent intent = getIntent();
+        mPackageURI = intent.getData();
+        mPm = getPackageManager();
+        mPkgInfo = PackageUtil.getPackageInfo(mPackageURI);
+        
+        // Check for parse errors
+        if(mPkgInfo == null) {
+            Log.w(TAG, "Parse error when parsing manifest. Discontinuing installation");
+            showDialogInner(DLG_PACKAGE_ERROR);
+            return;
+        }
+        
+        //set view
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        setContentView(R.layout.install_start);
+        PackageUtil.initAppSnippet(this, mPkgInfo.applicationInfo, R.id.app_snippet);
+       //check setting
+        if(!isInstallingUnknownAppsAllowed()) {
+            //ask user to enable setting first
+            showDialogInner(DLG_UNKNOWN_APPS);
+            return;
+        }
+        //compute the size of the application. just an estimate
+        long size;
+        String apkPath = mPackageURI.getPath();
+        File apkFile = new File(apkPath);
+        //TODO? DEVISE BETTER HEAURISTIC
+        size = 4*apkFile.length();
+        checkOutOfSpace(size);
+    }
+    
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        // Delete the temporary file if it still exists
+        if (mTmpFile != null) {
+            deleteFile(mTmpFile.getName());
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        boolean finish = true;
+        boolean removeTmpFile = false;
+        switch(requestCode) {
+        case INSTALL_CONFIRM:
+            if (resultCode == RESULT_OK) {
+                finish = false;
+                mCurrentState = INSTALL_PROGRESS;
+                startInstallProgress();
+            } else {
+                removeTmpFile = true;
+            }
+            break;
+        case INSTALL_PROGRESS:
+            finish = false;
+            mCurrentState = INSTALL_DONE;
+            if (resultCode == PackageManager.INSTALL_SUCCEEDED) {
+                //start the next screen to show final status of installation
+                startInstallDone();
+            } else {
+                showDialogInner(DLG_INSTALL_ERROR);
+            }
+            // Now that the package is installed just delete the temp file
+            removeTmpFile = true;
+            break;
+        case INSTALL_DONE:
+            //neednt check for result code here
+            break;
+        default:
+            break;
+        }
+        if ((removeTmpFile) && (mTmpFile != null)) {
+            deleteFile(mTmpFile.getName());
+        }
+        if (finish) {
+            //finish off this activity to return to the previous activity that launched it
+            if (localLOGV) Log.i(TAG, "Finishing off activity");
+            finish();
+        }
+    }
+    
+    // Generic handling when pressing back key
+    public void onCancel(DialogInterface dialog) {
+        finish();
+    }
+}
diff --git a/src/com/android/packageinstaller/PackageUtil.java b/src/com/android/packageinstaller/PackageUtil.java
new file mode 100644
index 0000000..b36bcf2
--- /dev/null
+++ b/src/com/android/packageinstaller/PackageUtil.java
@@ -0,0 +1,121 @@
+/*
+**
+** Copyright 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.
+*/
+package com.android.packageinstaller;
+
+import java.io.File;
+import java.util.List;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageParser;
+import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+/**
+ * This is a utility class for defining some utility methods and constants
+ * used in the package installer application.
+ */
+public class PackageUtil {
+    public static final String PREFIX="com.android.packageinstaller.";
+    public static final String INTENT_ATTR_INSTALL_STATUS = PREFIX+"installStatus";
+    public static final String INTENT_ATTR_APPLICATION_INFO=PREFIX+"applicationInfo";
+    public static final String INTENT_ATTR_PERMISSIONS_LIST=PREFIX+"PermissionsList";
+    //intent attribute strings related to uninstall
+    public static final String INTENT_ATTR_PACKAGE_NAME=PREFIX+"PackageName";
+    
+    /*
+     * Utility method to get application information for a given packageURI
+     */
+    public static  ApplicationInfo getApplicationInfo(Uri packageURI) {
+        final String archiveFilePath = packageURI.getPath();
+        PackageParser packageParser = new PackageParser(archiveFilePath);
+        File sourceFile = new File(archiveFilePath);
+        DisplayMetrics metrics = new DisplayMetrics();
+        metrics.setToDefaults();
+        PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0);
+        if (pkg == null) {
+            return null;
+        }
+        return pkg.applicationInfo;
+    }
+    
+    /*
+     * Utility method to get package information for a given packageURI
+     */
+    public static  PackageParser.Package getPackageInfo(Uri packageURI) {
+        final String archiveFilePath = packageURI.getPath();
+        PackageParser packageParser = new PackageParser(archiveFilePath);
+        File sourceFile = new File(archiveFilePath);
+        DisplayMetrics metrics = new DisplayMetrics();
+        metrics.setToDefaults();
+        return packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0);
+    }
+    
+    /*
+     * Utility method to get application label from package manager for a given context
+     */
+    public static CharSequence getApplicationLabel(Context context, ApplicationInfo appInfo) {
+        CharSequence appName = appInfo.loadLabel(context.getPackageManager());
+        if(appName == null) {
+            appName = context.getString(R.string.unknown);
+        }
+        return appName;
+    }
+    
+    /*
+     * Utility method to getApplicationIcon from package manager for a given context
+     */
+    public static Drawable getApplicationIcon(Context context, ApplicationInfo appInfo) {
+        return appInfo.loadIcon(context.getPackageManager());
+    }
+    
+    /*
+     * Utility method to display application snippet. make sure to setContentView on context
+     * before invoking this method
+     */
+    public static View initAppSnippet(Activity context, ApplicationInfo appInfo, int snippetId) {        
+        View appSnippet = context.findViewById(snippetId);        
+        ((ImageView)appSnippet.findViewById(R.id.app_icon)).setImageDrawable(
+                getApplicationIcon(context, appInfo));
+        ((TextView)appSnippet.findViewById(R.id.app_name)).setText(
+                getApplicationLabel(context, appInfo));
+        return appSnippet;
+    }
+    
+    public static boolean isPackageAlreadyInstalled(Activity context, String pkgName) {
+        List<PackageInfo> installedList = context.getPackageManager().getInstalledPackages(
+                PackageManager.GET_UNINSTALLED_PACKAGES);
+        int installedListSize = installedList.size();
+        for(int i = 0; i < installedListSize; i++) {
+            PackageInfo tmp = installedList.get(i);
+            if(pkgName.equalsIgnoreCase(tmp.packageName)) {
+                return true;
+            }
+            
+        }
+        return false;
+    }
+}
diff --git a/src/com/android/packageinstaller/UninstallAppDone.java b/src/com/android/packageinstaller/UninstallAppDone.java
new file mode 100755
index 0000000..73dffe3
--- /dev/null
+++ b/src/com/android/packageinstaller/UninstallAppDone.java
@@ -0,0 +1,72 @@
+/*
+**
+** Copyright 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.
+*/
+package com.android.packageinstaller;
+
+import com.android.packageinstaller.R;
+import android.app.Activity;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.Window;
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * This activity corresponds to a uninstall status  screen that is displayed 
+ * when an application gets uninstalled. The screen contains a single ok button at the
+ * bottom.
+ */
+public class UninstallAppDone extends Activity  implements View.OnClickListener {
+    private final String TAG="UninstallAppDone";
+    private boolean localLOGV = false;
+    private ApplicationInfo mAppInfo;
+    private Button mOkButton;
+    private boolean uninstallFlag;
+    
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Intent intent = getIntent();
+        mAppInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
+        //TODO set installFlag
+        uninstallFlag = intent.getBooleanExtra(PackageUtil.INTENT_ATTR_INSTALL_STATUS, true);
+        initView();
+    }
+    
+    public void initView() {
+        String unknown =  getString(R.string.unknown);
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        setContentView(R.layout.uninstall_done);
+        TextView centerText = (TextView)findViewById(R.id.center_text);
+        if(uninstallFlag) {
+            centerText.setText(getString(R.string.uninstall_done));
+        } else {
+            centerText.setText(R.string.uninstall_failed);
+        }
+        mOkButton = (Button)findViewById(R.id.ok_button);
+        mOkButton.setOnClickListener(this);
+    }
+
+    public void onClick(View v) {
+        if(v == mOkButton) {
+            Log.i(TAG, "Finished installing "+mAppInfo);
+            finish();
+        }
+    }
+}
diff --git a/src/com/android/packageinstaller/UninstallAppProgress.java b/src/com/android/packageinstaller/UninstallAppProgress.java
new file mode 100755
index 0000000..6b30118
--- /dev/null
+++ b/src/com/android/packageinstaller/UninstallAppProgress.java
@@ -0,0 +1,91 @@
+/*
+**
+** Copyright 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.
+*/
+package com.android.packageinstaller;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageDeleteObserver;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.Window;
+import android.view.ViewDebug;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+/**
+ * This activity corresponds to a download progress screen that is displayed 
+ * when an application is uninstalled. The result of the application uninstall
+ * is indicated in the result code that gets set to 0 or 1. The application gets launched
+ * by an intent with the intent's class name explicitly set to UninstallAppProgress and expects
+ * the application object of the application to uninstall.
+ */
+public class UninstallAppProgress extends Activity {
+    private final String TAG="UninstallAppProgress";
+    private boolean localLOGV = false;
+    private ApplicationInfo mAppInfo;
+    private final int UNINSTALL_COMPLETE = 1;
+    public final static int SUCCEEDED=1;
+    public final static int FAILED=0;
+    private Handler mHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case UNINSTALL_COMPLETE:
+                    //finish the activity posting result
+                    setResultAndFinish(msg.arg1);
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
+    
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Intent intent = getIntent();
+        mAppInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
+        initView();
+    }
+    
+    class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
+        public void packageDeleted(boolean succeeded) {
+            Message msg = mHandler.obtainMessage(UNINSTALL_COMPLETE);
+            msg.arg1 = succeeded?SUCCEEDED:FAILED;
+            mHandler.sendMessage(msg);
+        }
+    }
+    
+    void setResultAndFinish(int retCode) {
+        setResult(retCode);
+        finish();
+    }
+    
+    public void initView() {
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        setContentView(R.layout.op_progress);
+        //initialize views
+        PackageUtil.initAppSnippet(this, mAppInfo, R.id.app_snippet);
+        TextView installTextView = (TextView)findViewById(R.id.center_text);
+        installTextView.setText(R.string.uninstalling);
+        final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress_bar);
+        progressBar.setIndeterminate(true);
+        PackageDeleteObserver observer = new PackageDeleteObserver();
+        getPackageManager().deletePackage(mAppInfo.packageName, observer, 0);
+    }
+}
diff --git a/src/com/android/packageinstaller/UninstallerActivity.java b/src/com/android/packageinstaller/UninstallerActivity.java
new file mode 100755
index 0000000..f22cc28
--- /dev/null
+++ b/src/com/android/packageinstaller/UninstallerActivity.java
@@ -0,0 +1,189 @@
+/*
+**
+** Copyright 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.
+*/
+package com.android.packageinstaller;
+
+import com.android.packageinstaller.R;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.Window;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.content.pm.PackageManager.NameNotFoundException;
+
+/*
+ * This activity presents UI to uninstall an application. Usually launched with intent
+ * Intent.ACTION_UNINSTALL_PKG_COMMAND and attribute 
+ * com.android.packageinstaller.PackageName set to the application package name
+ */
+public class UninstallerActivity extends Activity implements OnClickListener {
+    private static final String TAG = "UninstallerActivity";
+    private boolean localLOGV = false;
+    // States indicating status of ui display when uninstalling application
+    private static final int UNINSTALL_CONFIRM = 1;
+    private static final int UNINSTALL_PROGRESS = 2;
+    private static final int UNINSTALL_DONE = 3;
+    private int mCurrentState = UNINSTALL_CONFIRM;
+    PackageManager mPm;
+    private ApplicationInfo mAppInfo;
+    private Button mOk;
+    private Button mCancel;
+
+    // Dialog identifiers used in showDialog
+    private static final int DLG_BASE = 0;
+    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 1;
+    private static final int DLG_UNINSTALL_FAILED = DLG_BASE + 2;
+    
+    private void showDialogInner(int id) {
+            showDialog(id);
+    }
+    
+    @Override
+    public Dialog onCreateDialog(int id) {
+        switch (id) {
+        case DLG_APP_NOT_FOUND :
+            return new AlertDialog.Builder(this)
+                    .setTitle(R.string.app_not_found_dlg_title)
+                    .setIcon(com.android.internal.R.drawable.ic_dialog_alert)
+                    .setMessage(R.string.app_not_found_dlg_text)
+                    .setNeutralButton(getString(R.string.dlg_ok), 
+                            new DialogInterface.OnClickListener() {
+                                public void onClick(DialogInterface dialog, int which) {
+                                    finish();
+                                }})
+                    .create();
+        case DLG_UNINSTALL_FAILED :
+            // Guaranteed not to be null. will default to package name if not set by app
+           CharSequence appTitle = mPm.getApplicationLabel(mAppInfo);
+           String dlgText = getString(R.string.uninstall_failed_msg,
+                    appTitle.toString());
+            // Display uninstall failed dialog
+            return new AlertDialog.Builder(this)
+                    .setTitle(R.string.uninstall_failed)
+                    .setIcon(com.android.internal.R.drawable.ic_dialog_alert)
+                    .setMessage(dlgText)
+                    .setNeutralButton(getString(R.string.dlg_ok), 
+                            new DialogInterface.OnClickListener() {
+                                public void onClick(DialogInterface dialog, int which) {
+                                    finish();
+                                }})
+                    .create();
+        }
+        return null;
+    }
+
+    private void startUninstallProgress() {
+        Intent newIntent = new Intent(Intent.ACTION_VIEW);
+        newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, 
+                                                  mAppInfo);
+        newIntent.setClass(this, UninstallAppProgress.class);
+        startActivityForResult(newIntent, UNINSTALL_PROGRESS);
+    }
+    
+    private void startUninstallDone() {
+        Intent newIntent = new Intent(Intent.ACTION_VIEW);
+        newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, 
+                                                  mAppInfo);
+        newIntent.putExtra(PackageUtil.INTENT_ATTR_INSTALL_STATUS, true);
+        newIntent.setClass(this, UninstallAppDone.class);
+        startActivityForResult(newIntent, UNINSTALL_DONE);
+    }
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        //get intent information
+        final Intent intent = getIntent();
+        Uri packageURI = intent.getData();
+        String packageName = packageURI.getEncodedSchemeSpecificPart();
+        if(packageName == null) {
+            Log.e(TAG, "Invalid package name:"+packageName);
+            showDialog(DLG_APP_NOT_FOUND);
+            return;
+        }
+        //initialize package manager
+        mPm = getPackageManager();
+        boolean errFlag = false;
+        try {
+            mAppInfo = mPm.getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
+        } catch (NameNotFoundException e) {
+            errFlag = true;
+        }
+        if(mAppInfo == null || errFlag) {
+            Log.e(TAG, "Invalid application:"+packageName);
+            showDialog(DLG_APP_NOT_FOUND);
+        } else {
+            requestWindowFeature(Window.FEATURE_NO_TITLE);
+            //set view
+            setContentView(R.layout.uninstall_confirm);
+            PackageUtil.initAppSnippet(this, mAppInfo, R.id.app_snippet);
+            //initialize ui elements
+            mOk = (Button)findViewById(R.id.ok_button);
+            mCancel = (Button)findViewById(R.id.cancel_button);
+            mOk.setOnClickListener(this);
+            mCancel.setOnClickListener(this);
+        }
+    }
+    
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        boolean finish = true;
+        switch(requestCode) {
+        case UNINSTALL_PROGRESS:
+            finish = false;
+            mCurrentState = UNINSTALL_DONE;
+            //start the next screen to show final status of installation
+            if (resultCode==UninstallAppProgress.SUCCEEDED) {
+                startUninstallDone();
+            } else {
+                showDialogInner(DLG_UNINSTALL_FAILED);
+            }
+            break;
+        case UNINSTALL_DONE:
+            //neednt check for result code here
+            break;
+        default:
+            break;
+        }
+        if(finish) {
+            //finish off this activity to return to the previous activity that launched it
+            Log.i(TAG, "Finishing off activity");
+            finish();
+        }
+    }
+    
+    private void finishAndReturn() {
+        finish();
+    }
+    
+    public void onClick(View v) {
+        if(v == mOk) {
+            //initiate next screen
+            startUninstallProgress();
+        } else if(v == mCancel) {
+            finishAndReturn();
+        }
+    }
+}
