Volume: Force focused state to disambig multiple sliders.

And fix volume policy so that a focused slider at the top
of the screen does not cause the window to pan.

Bug: 21476764
Change-Id: I4a52270ca5ecf9b9bd6e787ef580ecbd32e62625
This commit is contained in:
John Spurlock
2015-06-15 15:35:47 -04:00
parent 76ac323893
commit 67a0f850a4
2 changed files with 15 additions and 6 deletions

View File

@@ -155,6 +155,7 @@ public class VolumeDialog {
lp.y = res.getDimensionPixelSize(R.dimen.volume_offset_top);
lp.gravity = Gravity.TOP;
window.setAttributes(lp);
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
mActiveSliderTint = loadColorStateList(R.color.system_accent_color);
mInactiveSliderTint = loadColorStateList(R.color.volume_slider_inactive);
@@ -670,6 +671,14 @@ public class VolumeDialog {
}
private void updateVolumeRowSliderTintH(VolumeRow row, boolean isActive) {
if (isActive && mExpanded) {
row.slider.setFocusable(true);
row.slider.setFocusableInTouchMode(true);
row.slider.requestFocus();
} else {
row.slider.setFocusableInTouchMode(false);
row.slider.setFocusable(false);
}
final ColorStateList tint = isActive && row.slider.isEnabled() ? mActiveSliderTint
: mInactiveSliderTint;
if (tint == row.cachedSliderTint) return;

View File

@@ -3918,7 +3918,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// A window that has requested to fill the entire screen just
// gets everything, period.
if (attrs.type == TYPE_STATUS_BAR_PANEL
|| attrs.type == TYPE_STATUS_BAR_SUB_PANEL) {
|| attrs.type == TYPE_STATUS_BAR_SUB_PANEL
|| attrs.type == TYPE_VOLUME_OVERLAY) {
pf.left = df.left = of.left = cf.left = hasNavBar
? mDockLeft : mUnrestrictedScreenLeft;
pf.top = df.top = of.top = cf.top = mUnrestrictedScreenTop;
@@ -4033,9 +4034,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
"): normal window");
// Otherwise, a normal window must be placed inside the content
// of all screen decorations.
if (attrs.type == TYPE_STATUS_BAR_PANEL) {
// Status bar panels are the only windows who can go on top of
// the status bar. They are protected by the STATUS_BAR_SERVICE
if (attrs.type == TYPE_STATUS_BAR_PANEL || attrs.type == TYPE_VOLUME_OVERLAY) {
// Status bar panels and the volume dialog are the only windows who can go on
// top of the status bar. They are protected by the STATUS_BAR_SERVICE
// permission, so they have the same privileges as the status
// bar itself.
pf.left = df.left = of.left = cf.left = mRestrictedScreenLeft;
@@ -4044,8 +4045,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
+ mRestrictedScreenWidth;
pf.bottom = df.bottom = of.bottom = cf.bottom = mRestrictedScreenTop
+ mRestrictedScreenHeight;
} else if (attrs.type == TYPE_TOAST || attrs.type == TYPE_SYSTEM_ALERT
|| attrs.type == TYPE_VOLUME_OVERLAY) {
} else if (attrs.type == TYPE_TOAST || attrs.type == TYPE_SYSTEM_ALERT) {
// These dialogs are stable to interim decor changes.
pf.left = df.left = of.left = cf.left = mStableLeft;
pf.top = df.top = of.top = cf.top = mStableTop;