merge in nyc-mr1-release history after reset to nyc-mr1-dev
diff --git a/res/layout/grant_permissions.xml b/res/layout/grant_permissions.xml
index abb219a..8ed9c5d 100644
--- a/res/layout/grant_permissions.xml
+++ b/res/layout/grant_permissions.xml
@@ -25,6 +25,9 @@
     android:paddingBottom="32dp"
     android:clipToPadding="false">
 
+    <ScrollView android:layout_width="wrap_content"
+            android:layout_height="wrap_content">
+
     <LinearLayout
         android:id="@+id/dialog_container"
         android:layout_width="wrap_content"
@@ -116,4 +119,6 @@
 
     </LinearLayout>
 
+    </ScrollView>
+
 </com.android.packageinstaller.permission.ui.ManualLayoutFrame>
diff --git a/src/com/android/packageinstaller/permission/ui/ManualLayoutFrame.java b/src/com/android/packageinstaller/permission/ui/ManualLayoutFrame.java
index a20c952..0b07c80 100644
--- a/src/com/android/packageinstaller/permission/ui/ManualLayoutFrame.java
+++ b/src/com/android/packageinstaller/permission/ui/ManualLayoutFrame.java
@@ -61,8 +61,13 @@
 
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        // We want to keep the content bottom at the same place to avoid movement of the "Allow"
+        // button.
+        // Try to keep the content bottom at the same height. If this would move the dialog out of
+        // the top of the screen move it down as much as possible, then keep it at that position for
+        // the rest of the sequence of permission dialogs.
         View content = getChildAt(0);
-        if (mContentBottom == 0) {
+        if (mContentBottom == 0 || content.getMeasuredHeight() > mContentBottom) {
             mContentBottom = (getMeasuredHeight() + content.getMeasuredHeight()) / 2;
         }
         final int contentLeft = (getMeasuredWidth() - content.getMeasuredWidth()) / 2;