auto import from //depot/cupcake/@135843
diff --git a/PermissionController/Android.mk b/PermissionController/Android.mk
new file mode 100644
index 0000000..1362d03
--- /dev/null
+++ b/PermissionController/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/PermissionController/AndroidManifest.xml b/PermissionController/AndroidManifest.xml
new file mode 100644
index 0000000..303897a
--- /dev/null
+++ b/PermissionController/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/PermissionController/MODULE_LICENSE_APACHE2 b/PermissionController/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/PermissionController/MODULE_LICENSE_APACHE2
diff --git a/PermissionController/NOTICE b/PermissionController/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/drawable/button_indicator_finish.png b/PermissionController/res/drawable/button_indicator_finish.png
new file mode 100755
index 0000000..5a01bcc
--- /dev/null
+++ b/PermissionController/res/drawable/button_indicator_finish.png
Binary files differ
diff --git a/PermissionController/res/layout/app_details.xml b/PermissionController/res/layout/app_details.xml
new file mode 100755
index 0000000..3ea8430
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/layout/install_confirm.xml b/PermissionController/res/layout/install_confirm.xml
new file mode 100755
index 0000000..bfda97d
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/layout/install_done.xml b/PermissionController/res/layout/install_done.xml
new file mode 100755
index 0000000..e33f57b
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/layout/install_start.xml b/PermissionController/res/layout/install_start.xml
new file mode 100755
index 0000000..1ef0ab5
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/layout/op_progress.xml b/PermissionController/res/layout/op_progress.xml
new file mode 100755
index 0000000..b957fdf
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/layout/uninstall_confirm.xml b/PermissionController/res/layout/uninstall_confirm.xml
new file mode 100755
index 0000000..3f7f18a
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/layout/uninstall_done.xml b/PermissionController/res/layout/uninstall_done.xml
new file mode 100755
index 0000000..082d48b
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-cs/strings.xml b/PermissionController/res/values-cs/strings.xml
new file mode 100644
index 0000000..76247bb
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-de/strings.xml b/PermissionController/res/values-de/strings.xml
new file mode 100644
index 0000000..85eb053
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-es/strings.xml b/PermissionController/res/values-es/strings.xml
new file mode 100644
index 0000000..a75f36f
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-fr/strings.xml b/PermissionController/res/values-fr/strings.xml
new file mode 100644
index 0000000..6ee6980
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-it/strings.xml b/PermissionController/res/values-it/strings.xml
new file mode 100644
index 0000000..cb45126
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-ja/strings.xml b/PermissionController/res/values-ja/strings.xml
new file mode 100644
index 0000000..e27153d
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-ko/strings.xml b/PermissionController/res/values-ko/strings.xml
new file mode 100644
index 0000000..b9a1738
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-nb/strings.xml b/PermissionController/res/values-nb/strings.xml
new file mode 100644
index 0000000..06d9593
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-nl/strings.xml b/PermissionController/res/values-nl/strings.xml
new file mode 100644
index 0000000..3835272
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-pl/strings.xml b/PermissionController/res/values-pl/strings.xml
new file mode 100644
index 0000000..2cb3d30
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-ru/strings.xml b/PermissionController/res/values-ru/strings.xml
new file mode 100644
index 0000000..89562d1
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-zh-rCN/strings.xml b/PermissionController/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..07ea62b
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values-zh-rTW/strings.xml b/PermissionController/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..97a2b04
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values/colors.xml b/PermissionController/res/values/colors.xml
new file mode 100755
index 0000000..28e691b
--- /dev/null
+++ b/PermissionController/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/PermissionController/res/values/strings.xml b/PermissionController/res/values/strings.xml
new file mode 100644
index 0000000..f36660b
--- /dev/null
+++ b/PermissionController/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/PermissionController/src/com/android/packageinstaller/InstallAppConfirmation.java b/PermissionController/src/com/android/packageinstaller/InstallAppConfirmation.java
new file mode 100755
index 0000000..fe7126b
--- /dev/null
+++ b/PermissionController/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/PermissionController/src/com/android/packageinstaller/InstallAppDone.java b/PermissionController/src/com/android/packageinstaller/InstallAppDone.java
new file mode 100755
index 0000000..5a3f7d6
--- /dev/null
+++ b/PermissionController/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/PermissionController/src/com/android/packageinstaller/InstallAppProgress.java b/PermissionController/src/com/android/packageinstaller/InstallAppProgress.java
new file mode 100755
index 0000000..da1044c
--- /dev/null
+++ b/PermissionController/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/PermissionController/src/com/android/packageinstaller/PackageInstallerActivity.java b/PermissionController/src/com/android/packageinstaller/PackageInstallerActivity.java
new file mode 100644
index 0000000..29f05b4
--- /dev/null
+++ b/PermissionController/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/PermissionController/src/com/android/packageinstaller/PackageUtil.java b/PermissionController/src/com/android/packageinstaller/PackageUtil.java
new file mode 100644
index 0000000..b36bcf2
--- /dev/null
+++ b/PermissionController/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/PermissionController/src/com/android/packageinstaller/UninstallAppDone.java b/PermissionController/src/com/android/packageinstaller/UninstallAppDone.java
new file mode 100755
index 0000000..73dffe3
--- /dev/null
+++ b/PermissionController/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/PermissionController/src/com/android/packageinstaller/UninstallAppProgress.java b/PermissionController/src/com/android/packageinstaller/UninstallAppProgress.java
new file mode 100755
index 0000000..6b30118
--- /dev/null
+++ b/PermissionController/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/PermissionController/src/com/android/packageinstaller/UninstallerActivity.java b/PermissionController/src/com/android/packageinstaller/UninstallerActivity.java
new file mode 100755
index 0000000..f22cc28
--- /dev/null
+++ b/PermissionController/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();
+        }
+    }
+}