From f77fb9176e59419519ed09e6cbd9d053d5506f30 Mon Sep 17 00:00:00 2001 From: Mike Digman Date: Mon, 21 May 2018 11:21:30 -0700 Subject: [PATCH] Fork navbar layout for quickstep Different navbar layouts are loaded via config.xml depending on if Quickstep is enabled. A contextual button frame is added to replace the right nav buttons so different styling can be applied. New back, rotate and keyboard icons are added. Maintains support for custom navbar layouts. Adds support for nested reversable elements, needed for contextual button frame. Fixes navbar gravity support by using RelativeLayout's gravity and top/bottom switching. Change-Id: I5e24b2392c377313d421c0f95c3a7a0b99f32590 Fixes: 79930722 Fixes: 79930974 Fixes: 80164476 Test: manual, crash sysui, test against a11y, gb menu, rotate --- .../res/drawable/ic_ime_switcher_default.xml | 10 +-- .../ic_sysbar_accessibility_button.xml | 4 +- .../drawable/ic_sysbar_back_quick_step.xml | 7 +- .../SystemUI/res/drawable/ic_sysbar_menu.xml | 4 +- .../res/drawable/ic_sysbar_rotate_button.xml | 6 +- packages/SystemUI/res/layout/contextual.xml | 72 +++++++++++++++++++ .../SystemUI/res/layout/navigation_layout.xml | 12 ++-- .../res/layout/navigation_layout_rot90.xml | 22 +++--- packages/SystemUI/res/values/config.xml | 1 + .../phone/NavigationBarInflaterView.java | 66 +++++++++++++---- .../statusbar/phone/NavigationBarView.java | 6 ++ .../statusbar/phone/ReverseLinearLayout.java | 57 +++++++++++---- 12 files changed, 210 insertions(+), 57 deletions(-) create mode 100644 packages/SystemUI/res/layout/contextual.xml 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 a907bdd325213..60117123297ef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -745,6 +745,12 @@ public class NavigationBarView extends FrameLayout implements PluginListener