Add new dialog for warning confirmations

This change updates the Wear warning dialog for when users try
to change permissions for system apps and apps that are targeting
old SDKs.

Because Wear does not have a common dialog yet, I needed to create
a new activity to hold our confirmation view.

Changes:
    - Update logic to show Wear confirmation screen instead of using
      AlertDialog
    - Added WarningConfirmationActivity
    - Change font size for confirmation dialog
    - Make ConfirmationViewHandler support hiding one of the 3 vertical
      buttons
    - rename grant_permissions.xml to more generic confirmation_dialog

BUG: 24132857

Change-Id: Id225e663f0a2cd7b99fb177f780a6a3d0da15214
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c6c0f30..3f1bb1d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -121,6 +121,10 @@
                   android:authorities="com.google.android.packageinstaller.wear.provider"
                   android:grantUriPermissions="true"
                   android:exported="true" />
+
+        <activity android:name=".permission.ui.wear.WarningConfirmationActivity"
+                  android:permission="android.permission.GRANT_RUNTIME_PERMISSIONS"
+                  android:theme="@style/Settings"/>
     </application>
 
 </manifest>
diff --git a/res/layout-watch/grant_permissions.xml b/res/layout-watch/confirmation_dialog.xml
similarity index 100%
rename from res/layout-watch/grant_permissions.xml
rename to res/layout-watch/confirmation_dialog.xml
diff --git a/res/values-watch/themes.xml b/res/values-watch/themes.xml
index e20e35c..882557e 100644
--- a/res/values-watch/themes.xml
+++ b/res/values-watch/themes.xml
@@ -35,7 +35,7 @@
 
     <style name="GrantPermissions.TitleText">
         <item name="android:fontFamily">sans-serif-condensed-light</item>
-        <item name="android:textSize">20sp</item>
+        <item name="android:textSize">18sp</item>
         <item name="android:textColor">@color/grant_permissions_title_color</item>
         <item name="android:lineSpacingMultiplier">1.221</item>
     </style>
diff --git a/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java b/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java
index 1969c20..6f1273b 100644
--- a/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java
+++ b/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java
@@ -18,10 +18,7 @@
 
 import android.annotation.Nullable;
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Fragment;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
@@ -51,11 +48,13 @@
 
     private static final String LOG_TAG = "ManagePermsFragment";
 
+    private static final int WARNING_CONFIRMATION_REQUEST = 252;
     private List<AppPermissionGroup> mToggledGroups;
     private AppPermissions mAppPermissions;
     private PermissionsSettingsAdapter mAdapter;
 
     private boolean mHasConfirmedRevoke;
+    private int mPendingPermGroupIndex = -1;
 
     public static AppPermissionsFragmentWear newInstance(String packageName) {
         return setPackageName(new AppPermissionsFragmentWear(), packageName);
@@ -216,23 +215,12 @@
         } else {
             final boolean grantedByDefault = group.hasGrantedByDefaultPermission();
             if (grantedByDefault || (!group.hasRuntimePermission() && !mHasConfirmedRevoke)) {
-                new AlertDialog.Builder(getContext())
-                        .setMessage(grantedByDefault ? R.string.system_warning
-                                : R.string.old_sdk_deny_warning)
-                        .setNegativeButton(R.string.cancel, null)
-                        .setPositiveButton(R.string.grant_dialog_button_deny,
-                                new OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialog, int which) {
-                                group.revokeRuntimePermissions(false);
-                                if (!grantedByDefault) {
-                                    mHasConfirmedRevoke = true;
-                                }
-
-                                updatePermissionGroupSetting(index);
-                            }
-                        })
-                        .show();
+                mPendingPermGroupIndex = index;
+                Intent intent = new Intent(getActivity(), WarningConfirmationActivity.class);
+                intent.putExtra(WarningConfirmationActivity.EXTRA_WARNING_MESSAGE,
+                        getString(grantedByDefault ?
+                                R.string.system_warning : R.string.old_sdk_deny_warning));
+                startActivityForResult(intent, WARNING_CONFIRMATION_REQUEST);
             } else {
                 group.revokeRuntimePermissions(false);
             }
@@ -241,6 +229,27 @@
         updatePermissionGroupSetting(index);
     }
 
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == WARNING_CONFIRMATION_REQUEST) {
+            if (resultCode == Activity.RESULT_OK) {
+                SettingsAdapter.Setting<AppPermissionGroup> setting =
+                        mAdapter.get(mPendingPermGroupIndex);
+                final AppPermissionGroup group = setting.data;
+                group.revokeRuntimePermissions(false);
+                if (!group.hasGrantedByDefaultPermission()) {
+                    mHasConfirmedRevoke = true;
+                }
+
+                updatePermissionGroupSetting(mPendingPermGroupIndex);
+            }
+
+            mPendingPermGroupIndex = -1;
+        } else {
+            super.onActivityResult(requestCode, resultCode, data);
+        }
+    }
+
     private void updatePermissionGroupSetting(int index) {
         SettingsAdapter.Setting<AppPermissionGroup> setting = mAdapter.get(index);
         AppPermissionGroup group = setting.data;
diff --git a/src/com/android/packageinstaller/permission/ui/wear/ConfirmationViewHandler.java b/src/com/android/packageinstaller/permission/ui/wear/ConfirmationViewHandler.java
index d28866e..7cfffa0 100644
--- a/src/com/android/packageinstaller/permission/ui/wear/ConfirmationViewHandler.java
+++ b/src/com/android/packageinstaller/permission/ui/wear/ConfirmationViewHandler.java
@@ -74,7 +74,7 @@
     }
 
     public View createView() {
-        mRoot = LayoutInflater.from(mContext).inflate(R.layout.grant_permissions, null);
+        mRoot = LayoutInflater.from(mContext).inflate(R.layout.confirmation_dialog, null);
 
         mMessage = (TextView) mRoot.findViewById(R.id.message);
         mCurrentPageText = (TextView) mRoot.findViewById(R.id.current_page_text);
@@ -141,16 +141,24 @@
             case MODE_VERTICAL_BUTTONS:
                 mHorizontalButtonBar.setVisibility(View.GONE);
                 mVerticalButtonBar.setVisibility(View.VISIBLE);
+
                 mVerticalButton1.setText(getVerticalButton1Text());
                 mVerticalButton2.setText(getVerticalButton2Text());
-                mVerticalButton3.setText(getVerticalButton3Text());
 
                 mVerticalButton1.setCompoundDrawablesWithIntrinsicBounds(
                         getVerticalButton1Icon(), null, null, null);
                 mVerticalButton2.setCompoundDrawablesWithIntrinsicBounds(
                         getVerticalButton2Icon(), null, null, null);
-                mVerticalButton3.setCompoundDrawablesWithIntrinsicBounds(
-                        getVerticalButton3Icon(), null, null, null);
+
+                CharSequence verticalButton3Text = getVerticalButton3Text();
+                if (TextUtils.isEmpty(verticalButton3Text)) {
+                    mVerticalButton3.setVisibility(View.GONE);
+                } else {
+                    mVerticalButton3.setText(getVerticalButton3Text());
+                    mVerticalButton3.setCompoundDrawablesWithIntrinsicBounds(
+                            getVerticalButton3Icon(), null, null, null);
+                }
+
                 break;
         }
 
diff --git a/src/com/android/packageinstaller/permission/ui/wear/WarningConfirmationActivity.java b/src/com/android/packageinstaller/permission/ui/wear/WarningConfirmationActivity.java
new file mode 100644
index 0000000..e26dabd
--- /dev/null
+++ b/src/com/android/packageinstaller/permission/ui/wear/WarningConfirmationActivity.java
@@ -0,0 +1,110 @@
+/*
+* Copyright (C) 2015 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.permission.ui.wear;
+
+import android.app.Activity;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.os.Bundle;
+
+import com.android.packageinstaller.R;
+
+public final class WarningConfirmationActivity extends Activity {
+    public final static String EXTRA_WARNING_MESSAGE = "EXTRA_WARNING_MESSAGE";
+
+    private ConfirmationViewHandler mViewHandler;
+    private String mMessage;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mMessage = getIntent().getStringExtra(EXTRA_WARNING_MESSAGE);
+
+        mViewHandler = new ConfirmationViewHandler(this) {
+            @Override // ConfirmationViewHandler
+            public int getButtonBarMode() {
+                return MODE_VERTICAL_BUTTONS;
+            }
+
+            @Override
+            public void onButton1() {
+                setResult(Activity.RESULT_CANCELED);
+                finish();
+            }
+
+            @Override
+            public void onButton2() {
+                setResult(Activity.RESULT_OK);
+                finish();
+            }
+
+            @Override
+            public void onButton3() {
+                // no-op
+            }
+
+            @Override
+            public CharSequence getVerticalButton1Text() {
+                return getString(R.string.cancel);
+            }
+
+            @Override
+            public CharSequence getVerticalButton2Text() {
+                return getString(R.string.grant_dialog_button_deny);
+            }
+
+            @Override
+            public CharSequence getVerticalButton3Text() {
+                return null;
+            }
+
+            @Override
+            public Drawable getVerticalButton1Icon() {
+                return getDrawable(R.drawable.cancel_button);
+            }
+
+            @Override
+            public Drawable getVerticalButton2Icon() {
+                return getDrawable(R.drawable.confirm_button);
+            }
+
+            @Override
+            public Drawable getVerticalButton3Icon() {
+                return null;
+            }
+
+            @Override
+            public CharSequence getCurrentPageText() {
+                return null;
+            }
+
+            @Override
+            public Icon getPermissionIcon() {
+                return null;
+            }
+
+            @Override
+            public CharSequence getMessage() {
+                return mMessage;
+            }
+        };
+
+        setContentView(mViewHandler.createView());
+        mViewHandler.invalidate();
+    }
+}