diff --git a/packages/SystemUI/res/drawable/ic_ime_switcher_default.xml b/packages/SystemUI/res/drawable/ic_ime_switcher_default.xml
index 6a7f18b80b9f5..d5f8a2ad113d2 100644
--- a/packages/SystemUI/res/drawable/ic_ime_switcher_default.xml
+++ b/packages/SystemUI/res/drawable/ic_ime_switcher_default.xml
@@ -15,11 +15,11 @@
-->
+ android:width="20dp"
+ android:height="20dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_accessibility_button.xml b/packages/SystemUI/res/drawable/ic_sysbar_accessibility_button.xml
index 6fbc404d9905a..8d569b2ca6e44 100644
--- a/packages/SystemUI/res/drawable/ic_sysbar_accessibility_button.xml
+++ b/packages/SystemUI/res/drawable/ic_sysbar_accessibility_button.xml
@@ -15,8 +15,8 @@
limitations under the License.
-->
-
-
+ android:pathData="M16.78,10.03l-3.97,3.97l3.97,3.97l-1.06,1.06l-5.03,-5.03l5.03,-5.03z"
+ android:fillColor="?attr/singleToneColor" />
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_menu.xml b/packages/SystemUI/res/drawable/ic_sysbar_menu.xml
index 5cc17911f11ff..d53c95b1cb807 100644
--- a/packages/SystemUI/res/drawable/ic_sysbar_menu.xml
+++ b/packages/SystemUI/res/drawable/ic_sysbar_menu.xml
@@ -15,8 +15,8 @@
limitations under the License.
-->
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_rotate_button.xml b/packages/SystemUI/res/drawable/ic_sysbar_rotate_button.xml
index 6c1ae99940359..907be01be5083 100644
--- a/packages/SystemUI/res/drawable/ic_sysbar_rotate_button.xml
+++ b/packages/SystemUI/res/drawable/ic_sysbar_rotate_button.xml
@@ -17,14 +17,14 @@
+ android:pathData="M12,4c-0.06,0 -0.12,0.01 -0.18,0.01l1.09,-1.09L11.5,1.5L8,5l3.5,3.5l1.41,-1.41l-1.08,-1.08C11.89,6.01 11.95,6 12,6c3.31,0 6,2.69 6,6c0,1.7 -0.71,3.23 -1.85,4.32l1.41,1.41C19.06,16.28 20,14.25 20,12C20,7.59 16.41,4 12,4zM16,19l-3.5,3.5l-1.41,-1.41l1.1,-1.1C12.13,19.98 12.06,20 12,20c-4.41,0 -8,-3.59 -8,-8c0,-2.25 0.94,-4.28 2.43,-5.73l1.41,1.41C6.71,8.77 6,10.3 6,12c0,3.31 2.69,6 6,6c0.05,0 0.11,-0.01 0.16,-0.01l-1.07,-1.07l1.41,-1.41L16,19z"/>
diff --git a/packages/SystemUI/res/layout/contextual.xml b/packages/SystemUI/res/layout/contextual.xml
new file mode 100644
index 0000000000000..94591e932b5b5
--- /dev/null
+++ b/packages/SystemUI/res/layout/contextual.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/SystemUI/res/layout/navigation_layout.xml b/packages/SystemUI/res/layout/navigation_layout.xml
index d72021e27e0bc..baaf699c278ad 100644
--- a/packages/SystemUI/res/layout/navigation_layout.xml
+++ b/packages/SystemUI/res/layout/navigation_layout.xml
@@ -18,16 +18,14 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginStart="@dimen/rounded_corner_content_padding"
- android:layout_marginEnd="@dimen/rounded_corner_content_padding"
- android:paddingStart="@dimen/nav_content_padding"
- android:paddingEnd="@dimen/nav_content_padding">
+ android:layout_height="match_parent">
@@ -36,6 +34,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
+ android:paddingStart="@dimen/nav_content_padding"
+ android:paddingEnd="@dimen/nav_content_padding"
android:clipToPadding="false"
android:clipChildren="false" />
@@ -46,6 +46,8 @@
android:layout_gravity="center"
android:gravity="center"
android:orientation="horizontal"
+ android:paddingStart="@dimen/nav_content_padding"
+ android:paddingEnd="@dimen/nav_content_padding"
android:clipToPadding="false"
android:clipChildren="false" />
diff --git a/packages/SystemUI/res/layout/navigation_layout_rot90.xml b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
index 0e17e5b57caed..6d5b77885a09d 100644
--- a/packages/SystemUI/res/layout/navigation_layout_rot90.xml
+++ b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
@@ -18,23 +18,26 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginTop="@dimen/rounded_corner_content_padding"
- android:layout_marginBottom="@dimen/rounded_corner_content_padding"
- android:paddingTop="8dp"
- android:paddingBottom="8dp">
+ android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:paddingTop="@dimen/rounded_corner_content_padding"
+ android:paddingBottom="@dimen/rounded_corner_content_padding"
+ android:clipChildren="false"
+ android:clipToPadding="false">
+ android:paddingTop="@dimen/nav_content_padding"
+ android:paddingBottom="@dimen/nav_content_padding"
+ android:clipChildren="false"
+ android:clipToPadding="false" />
+ android:paddingTop="@dimen/nav_content_padding"
+ android:paddingBottom="@dimen/nav_content_padding"
+ android:clipChildren="false"
+ android:clipToPadding="false" />
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 251589ba17f6a..a68ba9b2b411b 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -364,6 +364,7 @@
left[.5W],back[1WC];home;recent[1WC],right[.5W]
+ back[1.7WC];home;contextual[1.7WC]
false
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
index 4885c2f796d96..e6f2c33c33d22 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
@@ -34,11 +34,12 @@ import android.widget.LinearLayout;
import android.widget.Space;
import com.android.systemui.Dependency;
+import com.android.systemui.OverviewProxyService;
import com.android.systemui.R;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.PluginManager;
import com.android.systemui.plugins.statusbar.phone.NavBarButtonProvider;
-import com.android.systemui.statusbar.phone.ReverseLinearLayout.ReverseFrameLayout;
+import com.android.systemui.statusbar.phone.ReverseLinearLayout.ReverseRelativeLayout;
import com.android.systemui.statusbar.policy.KeyButtonView;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -67,6 +68,7 @@ public class NavigationBarInflaterView extends FrameLayout
public static final String KEY = "key";
public static final String LEFT = "left";
public static final String RIGHT = "right";
+ public static final String CONTEXTUAL = "contextual";
public static final String GRAVITY_SEPARATOR = ";";
public static final String BUTTON_SEPARATOR = ",";
@@ -97,6 +99,9 @@ public class NavigationBarInflaterView extends FrameLayout
private View mLastLandscape;
private boolean mAlternativeOrder;
+ private boolean mUsingCustomLayout;
+
+ private OverviewProxyService mOverviewProxyService;
public NavigationBarInflaterView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -105,6 +110,7 @@ public class NavigationBarInflaterView extends FrameLayout
context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
Mode displayMode = mDisplay.getMode();
isRot0Landscape = displayMode.getPhysicalWidth() > displayMode.getPhysicalHeight();
+ mOverviewProxyService = Dependency.get(OverviewProxyService.class);
}
private void createInflaters() {
@@ -136,7 +142,10 @@ public class NavigationBarInflaterView extends FrameLayout
}
protected String getDefaultLayout() {
- return mContext.getString(R.string.config_navBarLayout);
+ final int defaultResource = mOverviewProxyService.shouldShowSwipeUpUI()
+ ? R.string.config_navBarLayoutQuickstep
+ : R.string.config_navBarLayout;
+ return mContext.getString(defaultResource);
}
@Override
@@ -159,6 +168,7 @@ public class NavigationBarInflaterView extends FrameLayout
public void onTuningChanged(String key, String newValue) {
if (NAV_BAR_VIEWS.equals(key)) {
if (!Objects.equals(mCurrentLayout, newValue)) {
+ mUsingCustomLayout = newValue != null;
clearViews();
inflateLayout(newValue);
}
@@ -168,6 +178,18 @@ public class NavigationBarInflaterView extends FrameLayout
}
}
+ public void onLikelyDefaultLayoutChange() {
+ // Don't override custom layouts
+ if (mUsingCustomLayout) return;
+
+ // Reevaluate new layout
+ final String newValue = getDefaultLayout();
+ if (!Objects.equals(mCurrentLayout, newValue)) {
+ clearViews();
+ inflateLayout(newValue);
+ }
+ }
+
public void setButtonDispatchers(SparseArray buttonDispatchers) {
mButtonDispatchers = buttonDispatchers;
for (int i = 0; i < buttonDispatchers.size(); i++) {
@@ -178,10 +200,12 @@ public class NavigationBarInflaterView extends FrameLayout
public void updateButtonDispatchersCurrentView() {
if (mButtonDispatchers != null) {
final int rotation = mDisplay.getRotation();
- final View view = rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180
- ? mRot0 : mRot90;
+ final boolean portrait = rotation == Surface.ROTATION_0
+ || rotation == Surface.ROTATION_180;
+ final View view = portrait ? mRot0 : mRot90;
for (int i = 0; i < mButtonDispatchers.size(); i++) {
- mButtonDispatchers.valueAt(i).setCurrentView(view);
+ final ButtonDispatcher dispatcher = mButtonDispatchers.valueAt(i);
+ dispatcher.setCurrentView(view);
}
}
}
@@ -288,8 +312,8 @@ public class NavigationBarInflaterView extends FrameLayout
addToDispatchers(v);
View lastView = landscape ? mLastLandscape : mLastPortrait;
View accessibilityView = v;
- if (v instanceof ReverseFrameLayout) {
- accessibilityView = ((ReverseFrameLayout) v).getChildAt(0);
+ if (v instanceof ReverseRelativeLayout) {
+ accessibilityView = ((ReverseRelativeLayout) v).getChildAt(0);
}
if (lastView != null) {
accessibilityView.setAccessibilityTraversalAfter(lastView.getId());
@@ -307,21 +331,33 @@ public class NavigationBarInflaterView extends FrameLayout
if (sizeStr == null) return v;
if (sizeStr.contains(WEIGHT_SUFFIX)) {
+ // To support gravity, wrap in RelativeLayout and apply gravity to it.
+ // Children wanting to use gravity must be smaller then the frame.
float weight = Float.parseFloat(sizeStr.substring(0, sizeStr.indexOf(WEIGHT_SUFFIX)));
- FrameLayout frame = new ReverseFrameLayout(mContext);
+ ReverseRelativeLayout frame = new ReverseRelativeLayout(mContext);
LayoutParams childParams = new LayoutParams(v.getLayoutParams());
- if (sizeStr.endsWith(WEIGHT_CENTERED_SUFFIX)) {
- childParams.gravity = Gravity.CENTER;
- } else {
- childParams.gravity = landscape ? (start ? Gravity.BOTTOM : Gravity.TOP)
- : (start ? Gravity.START : Gravity.END);
- }
+
+ // Compute gravity to apply
+ int gravity = (landscape) ? (start ? Gravity.TOP : Gravity.BOTTOM)
+ : (start ? Gravity.START : Gravity.END);
+ if (sizeStr.endsWith(WEIGHT_CENTERED_SUFFIX)) gravity = Gravity.CENTER;
+
+ // Set default gravity, flipped if needed in reversed layouts (270 RTL and 90 LTR)
+ frame.setDefaultGravity(gravity);
+ frame.setGravity(gravity); // Apply gravity to root
+
frame.addView(v, childParams);
+
+ // Use weighting to set the width of the frame
frame.setLayoutParams(new LinearLayout.LayoutParams(0, MATCH_PARENT, weight));
+
+ // Ensure ripples can be drawn outside bounds
frame.setClipChildren(false);
frame.setClipToPadding(false);
+
return frame;
}
+
float size = Float.parseFloat(sizeStr);
ViewGroup.LayoutParams params = v.getLayoutParams();
params.width = (int) (params.width * size);
@@ -355,6 +391,8 @@ public class NavigationBarInflaterView extends FrameLayout
v = inflater.inflate(R.layout.nav_key_space, parent, false);
} else if (CLIPBOARD.equals(button)) {
v = inflater.inflate(R.layout.clipboard, parent, false);
+ } else if (CONTEXTUAL.equals(button)) {
+ v = inflater.inflate(R.layout.contextual, parent, false);
} else if (button.startsWith(KEY)) {
String uri = extractImage(button);
int code = extractKeycode(button);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 49f9ee2b1c836..704e9634bb2a2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -746,6 +746,12 @@ public class NavigationBarView extends FrameLayout implements PluginListener