summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Hugh <ahugh@google.com>2015-10-05 12:28:07 -0700
committerAnthony Hugh <ahugh@google.com>2015-10-05 15:15:48 -0700
commit6a5762884adc64ea95bd206c46d60031428e977c (patch)
tree8e6e1f047cdf15d26a9c2fb3950587038ae51220
parent12c698b4d2d75895c72bc900ed363acd03c94bfe (diff)
downloadandroid_packages_apps_PackageInstaller-6a5762884adc64ea95bd206c46d60031428e977c.tar.gz
android_packages_apps_PackageInstaller-6a5762884adc64ea95bd206c46d60031428e977c.tar.bz2
android_packages_apps_PackageInstaller-6a5762884adc64ea95bd206c46d60031428e977c.zip
Permissions redline fixes
This fixes the button bar animation to work on round devices and also fixes the max height animation to make sure the vertical button layout animates to max height when there are only two buttons. Also adjust some redlines like margins on the buttons and updated some files that were missing our licensing header. Change-Id: Ifad4d0f92605be04db2d3c991b4e8a26eadb4b14
-rw-r--r--res/drawable-watch/action_negative_bg.xml14
-rw-r--r--res/drawable-watch/action_positive_bg.xml14
-rw-r--r--res/drawable-watch/cancel_button.xml14
-rw-r--r--res/drawable-watch/confirm_button.xml14
-rw-r--r--res/drawable-watch/deny_button.xml14
-rw-r--r--res/layout-watch/confirmation_dialog.xml12
-rw-r--r--res/values-round/dimens.xml2
-rw-r--r--res/values-watch/dimens.xml4
-rw-r--r--res/values-watch/strings.xml4
-rw-r--r--src/com/android/packageinstaller/permission/ui/GrantPermissionsWatchViewHandler.java2
-rw-r--r--src/com/android/packageinstaller/permission/ui/wear/ConfirmationViewHandler.java147
11 files changed, 181 insertions, 60 deletions
diff --git a/res/drawable-watch/action_negative_bg.xml b/res/drawable-watch/action_negative_bg.xml
index f1c33b54..7b21ba6d 100644
--- a/res/drawable-watch/action_negative_bg.xml
+++ b/res/drawable-watch/action_negative_bg.xml
@@ -1,4 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false">
<shape android:shape="oval">
diff --git a/res/drawable-watch/action_positive_bg.xml b/res/drawable-watch/action_positive_bg.xml
index bc3e88ba..f3457c1a 100644
--- a/res/drawable-watch/action_positive_bg.xml
+++ b/res/drawable-watch/action_positive_bg.xml
@@ -1,4 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false">
<shape android:shape="oval">
diff --git a/res/drawable-watch/cancel_button.xml b/res/drawable-watch/cancel_button.xml
index 5b16f549..641526a5 100644
--- a/res/drawable-watch/cancel_button.xml
+++ b/res/drawable-watch/cancel_button.xml
@@ -1,4 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/action_negative_bg" />
<item>
diff --git a/res/drawable-watch/confirm_button.xml b/res/drawable-watch/confirm_button.xml
index 6a895ec6..2b53e42e 100644
--- a/res/drawable-watch/confirm_button.xml
+++ b/res/drawable-watch/confirm_button.xml
@@ -1,4 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/action_positive_bg" />
<item>
diff --git a/res/drawable-watch/deny_button.xml b/res/drawable-watch/deny_button.xml
index 70ea453f..1e7582bc 100644
--- a/res/drawable-watch/deny_button.xml
+++ b/res/drawable-watch/deny_button.xml
@@ -1,4 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/action_negative_bg" />
<item>
diff --git a/res/layout-watch/confirmation_dialog.xml b/res/layout-watch/confirmation_dialog.xml
index 783d4051..0b93579e 100644
--- a/res/layout-watch/confirmation_dialog.xml
+++ b/res/layout-watch/confirmation_dialog.xml
@@ -29,7 +29,6 @@
<LinearLayout
android:id="@+id/content"
android:orientation="vertical"
- android:paddingBottom="@dimen/conf_diag_button_container_height"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -89,13 +88,13 @@
android:layout_marginTop="@dimen/conf_diag_2button_margin_top"
android:background="@drawable/confirm_button"/>
</FrameLayout>
-
+
<FrameLayout
android:id="@+id/vertical_button_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="@dimen/conf_diag_3button_margin_left"
- android:layout_marginBottom="@dimen/conf_diag_3button_margin_bottom"
+ android:paddingLeft="@dimen/conf_diag_3button_padding_side"
+ android:paddingRight="@dimen/conf_diag_3button_padding_side"
android:visibility="gone">
<LinearLayout
android:id="@+id/buttonPanel"
@@ -113,6 +112,11 @@
<Button
android:id="@+id/vertical_button3"
style="@style/Widget.WearDiag.Button"/>
+
+ <!-- Adding padding to the bottom button causes rendering issues, so add
+ an empty view here instead -->
+ <Space android:layout_width="match_parent"
+ android:layout_height="@dimen/conf_diag_3button_padding_bottom"/>
</LinearLayout>
</FrameLayout>
</FrameLayout>
diff --git a/res/values-round/dimens.xml b/res/values-round/dimens.xml
index d9a522d4..5e7309b9 100644
--- a/res/values-round/dimens.xml
+++ b/res/values-round/dimens.xml
@@ -19,7 +19,5 @@
<dimen name="conf_diag_button_container_height">96dp</dimen>
<dimen name="conf_diag_2button_margin_side">32dp</dimen>
<dimen name="conf_diag_2button_margin_top">10dp</dimen>
- <dimen name="conf_diag_3button_margin_left">36dp</dimen>
- <dimen name="conf_diag_3button_margin_bottom">24dp</dimen>
</resources>
diff --git a/res/values-watch/dimens.xml b/res/values-watch/dimens.xml
index fa657c73..24d2a058 100644
--- a/res/values-watch/dimens.xml
+++ b/res/values-watch/dimens.xml
@@ -30,8 +30,8 @@
<dimen name="conf_diag_button_container_height">72dp</dimen>
<dimen name="conf_diag_2button_margin_side">16dp</dimen>
<dimen name="conf_diag_2button_margin_top">9dp</dimen>
- <dimen name="conf_diag_3button_margin_left">16dp</dimen>
- <dimen name="conf_diag_3button_margin_bottom">9dp</dimen>
+ <dimen name="conf_diag_3button_padding_side">32dp</dimen>
+ <dimen name="conf_diag_3button_padding_bottom">22dp</dimen>
<!-- START: Ported values -->
diff --git a/res/values-watch/strings.xml b/res/values-watch/strings.xml
index 2728da23..82fe4ae9 100644
--- a/res/values-watch/strings.xml
+++ b/res/values-watch/strings.xml
@@ -15,8 +15,8 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Title for the dialog button to deny a permission grant and never ask the user again. -->
- <string name="grant_dialog_button_deny_dont_ask_again">Deny and don\'t ask again</string>
+ <!-- Title for the dialog button to deny a permission grant and never ask the user again. [CHAR LIMIT=29]-->
+ <string name="grant_dialog_button_deny_dont_ask_again">Deny, don\'t ask again</string>
<!-- Template for the current permission from the total number of permissions. -->
<string name="current_permission_template">
diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsWatchViewHandler.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsWatchViewHandler.java
index 242d0bce..21042f00 100644
--- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsWatchViewHandler.java
+++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsWatchViewHandler.java
@@ -57,7 +57,7 @@ final class GrantPermissionsWatchViewHandler extends ConfirmationViewHandler
@Override
public void updateWindowAttributes(WindowManager.LayoutParams outLayoutParams) {
outLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
- outLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
+ outLayoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
outLayoutParams.format = PixelFormat.OPAQUE;
outLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
outLayoutParams.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
diff --git a/src/com/android/packageinstaller/permission/ui/wear/ConfirmationViewHandler.java b/src/com/android/packageinstaller/permission/ui/wear/ConfirmationViewHandler.java
index 277bada9..db3340f6 100644
--- a/src/com/android/packageinstaller/permission/ui/wear/ConfirmationViewHandler.java
+++ b/src/com/android/packageinstaller/permission/ui/wear/ConfirmationViewHandler.java
@@ -8,6 +8,7 @@ import android.graphics.drawable.Icon;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -24,11 +25,15 @@ import com.android.packageinstaller.R;
public abstract class ConfirmationViewHandler implements
Handler.Callback,
View.OnClickListener,
- ViewTreeObserver.OnScrollChangedListener {
+ ViewTreeObserver.OnScrollChangedListener,
+ ViewTreeObserver.OnGlobalLayoutListener {
+ private static final String TAG = "ConfirmationViewHandler";
+
public static final int MODE_HORIZONTAL_BUTTONS = 0;
public static final int MODE_VERTICAL_BUTTONS = 1;
- private static final int MSG_HIDE_BUTTON_BAR = 1001;
+ private static final int MSG_SHOW_BUTTON_BAR = 1001;
+ private static final int MSG_HIDE_BUTTON_BAR = 1002;
private static final long HIDE_ANIM_DURATION = 500;
private View mRoot;
@@ -103,6 +108,9 @@ public abstract class ConfirmationViewHandler implements
R.dimen.conf_diag_floating_height);
mHideHandler = new Handler(this);
+ mScrollingContainer.getViewTreeObserver().addOnScrollChangedListener(this);
+ mRoot.getViewTreeObserver().addOnGlobalLayoutListener(this);
+
return mRoot;
}
@@ -158,54 +166,41 @@ public abstract class ConfirmationViewHandler implements
mVerticalButton3.setCompoundDrawablesWithIntrinsicBounds(
getVerticalButton3Icon(), null, null, null);
}
-
break;
}
mScrollingContainer.scrollTo(0, 0);
- mScrollingContainer.getViewTreeObserver().addOnScrollChangedListener(this);
+ mHideHandler.removeMessages(MSG_HIDE_BUTTON_BAR);
+ mHideHandler.removeMessages(MSG_SHOW_BUTTON_BAR);
+ }
+
+ @Override
+ public void onGlobalLayout() {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "onGlobalLayout");
+ Log.d(TAG, " contentHeight: " + mContent.getHeight());
+ }
+
+ if (mButtonBarAnimator != null) {
+ mButtonBarAnimator.cancel();
+ }
+
+ // In order to fake the buttons peeking at the bottom, need to do set the
+ // padding properly.
+ if (mContent.getPaddingBottom() != mButtonBarContainer.getHeight()) {
+ mContent.setPadding(0, 0, 0, mButtonBarContainer.getHeight());
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, " set mContent.PaddingBottom: " + mButtonBarContainer.getHeight());
+ }
+ }
- mRoot.getViewTreeObserver().addOnGlobalLayoutListener(
- new ViewTreeObserver.OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- // Setup Button animation.
- // pop the button bar back to full height, stop all animation
- if (mButtonBarAnimator != null) {
- mButtonBarAnimator.cancel();
- }
-
- // In order to fake the buttons peeking at the bottom, need to do set the
- // padding properly.
- if (mContent.getPaddingBottom() != mButtonBarContainer.getHeight()) {
- mContent.setPadding(0, 0, 0, mButtonBarContainer.getHeight());
- }
-
- // stop any calls to hide the button bar in the future
- mHideHandler.removeMessages(MSG_HIDE_BUTTON_BAR);
- mHiddenBefore = false;
-
- // determine which mode the scrolling should work at.
- if (mContent.getHeight() > mScrollingContainer.getHeight()) {
- mButtonBarContainer.setTranslationZ(mButtonBarFloatingHeight);
- mHideHandler.sendEmptyMessageDelayed(MSG_HIDE_BUTTON_BAR, 3000);
- int maxButtonBarHeight = 0;
- if (mButtonBarContainer.getHeight() >= mRoot.getHeight() / 2) {
- // If the ButtonBar is bigger than half the screen, then don't
- // animate all the way.
- maxButtonBarHeight = mRoot.getHeight() / 2;
- }
- generateButtonBarAnimator(mButtonBarContainer.getHeight(),
- maxButtonBarHeight, 0, mButtonBarFloatingHeight, 1000);
- } else {
- mButtonBarContainer.setTranslationY(0);
- mButtonBarContainer.setTranslationZ(0);
- }
- mRoot.getViewTreeObserver().removeOnGlobalLayoutListener(this);
- }
- });
+ mButtonBarContainer.setTranslationY(mButtonBarContainer.getHeight());
+ // Give everything a chance to render
+ mHideHandler.removeMessages(MSG_HIDE_BUTTON_BAR);
+ mHideHandler.removeMessages(MSG_SHOW_BUTTON_BAR);
+ mHideHandler.sendEmptyMessageDelayed(MSG_SHOW_BUTTON_BAR, 50);
}
@Override
@@ -229,6 +224,9 @@ public abstract class ConfirmationViewHandler implements
@Override
public boolean handleMessage (Message msg) {
switch (msg.what) {
+ case MSG_SHOW_BUTTON_BAR:
+ showButtonBar();
+ return true;
case MSG_HIDE_BUTTON_BAR:
hideButtonBar();
return true;
@@ -237,21 +235,72 @@ public abstract class ConfirmationViewHandler implements
}
@Override
- public void onScrollChanged() {
+ public void onScrollChanged () {
mHideHandler.removeMessages(MSG_HIDE_BUTTON_BAR);
hideButtonBar();
}
+ private void showButtonBar() {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "showButtonBar");
+ }
+
+ // Setup Button animation.
+ // pop the button bar back to full height, stop all animation
+ if (mButtonBarAnimator != null) {
+ mButtonBarAnimator.cancel();
+ }
+
+ // stop any calls to hide the button bar in the future
+ mHideHandler.removeMessages(MSG_HIDE_BUTTON_BAR);
+ mHiddenBefore = false;
+
+ // Evaluate the max height the button bar can go
+ final int screenHeight = mRoot.getHeight();
+ final int buttonBarHeight = mButtonBarContainer.getHeight();
+ final int buttonBarMaxHeight =
+ Math.min(buttonBarHeight, screenHeight / 2);
+
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ final int contentHeight = mContent.getHeight() - buttonBarHeight;
+ Log.d(TAG, " screenHeight: " + screenHeight);
+ Log.d(TAG, " contentHeight: " + contentHeight);
+ Log.d(TAG, " buttonBarHeight: " + buttonBarHeight);
+ Log.d(TAG, " buttonBarMaxHeight: " + buttonBarMaxHeight);
+ }
+
+ mButtonBarContainer.setTranslationZ(mButtonBarFloatingHeight);
+ mHideHandler.sendEmptyMessageDelayed(MSG_HIDE_BUTTON_BAR, 3000);
+
+ generateButtonBarAnimator(buttonBarHeight,
+ buttonBarHeight - buttonBarMaxHeight, 0, mButtonBarFloatingHeight, 1000);
+ }
+
private void hideButtonBar() {
- // get the offset to the top of the button bar
- int offset = mScrollingContainer.getHeight() + mButtonBarContainer.getHeight() -
- mContent.getHeight() + Math.max(mScrollingContainer.getScrollY(), 0);
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "hideButtonBar");
+ }
+
// The desired margin space between the button bar and the bottom of the dialog text
- int topMargin = mContext.getResources().getDimensionPixelSize(
+ final int topMargin = mContext.getResources().getDimensionPixelSize(
R.dimen.conf_diag_button_container_top_margin);
- int translationY = topMargin + (offset > 0 ?
+ final int contentHeight = mContent.getHeight() + topMargin;
+ final int screenHeight = mRoot.getHeight();
+ final int buttonBarHeight = mButtonBarContainer.getHeight();
+
+ final int offset = screenHeight + buttonBarHeight
+ - contentHeight + Math.max(mScrollingContainer.getScrollY(), 0);
+ final int translationY = (offset > 0 ?
mButtonBarContainer.getHeight() - offset : mButtonBarContainer.getHeight());
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, " contentHeight: " + contentHeight);
+ Log.d(TAG, " buttonBarHeight: " + buttonBarHeight);
+ Log.d(TAG, " mContent.getPaddingBottom(): " + mContent.getPaddingBottom());
+ Log.d(TAG, " mScrollingContainer.getScrollY(): " + mScrollingContainer.getScrollY());
+ Log.d(TAG, " translationY: " + translationY);
+ }
+
if (!mHiddenBefore || mButtonBarAnimator == null) {
// hasn't hidden the bar yet, just hide now to the right height
generateButtonBarAnimator(