diff options
author | Selim Cinek <cinek@google.com> | 2014-08-25 15:03:48 +0200 |
---|---|---|
committer | Selim Cinek <cinek@google.com> | 2014-08-25 20:30:32 +0200 |
commit | 17a327ad059d92863d16334170c8391a5f7152eb (patch) | |
tree | 25238d30f7f34593c7383cea00dd7b7edabb4629 /packages | |
parent | f2a778683d602d9483bfaf8fdbc63e9fd19a7e5f (diff) | |
download | frameworks_base-17a327ad059d92863d16334170c8391a5f7152eb.zip frameworks_base-17a327ad059d92863d16334170c8391a5f7152eb.tar.gz frameworks_base-17a327ad059d92863d16334170c8391a5f7152eb.tar.bz2 |
Fixed the navigation bar for LTR languages.
The navigation bar now correctly mirrors it's children even in
landscape and the tablet layout is correctly applied for LTR languages.
Also fixes some bugs where the buttons were invisible in landscape
with certain configurations.
Bug: 15280748
Change-Id: I27304d9468211a0975824c17e031e2b04b44f9e0
Diffstat (limited to 'packages')
4 files changed, 58 insertions, 348 deletions
diff --git a/packages/SystemUI/res/layout-ldrtl/navigation_bar.xml b/packages/SystemUI/res/layout-ldrtl/navigation_bar.xml deleted file mode 100644 index 35414bc..0000000 --- a/packages/SystemUI/res/layout-ldrtl/navigation_bar.xml +++ /dev/null @@ -1,328 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* apps/common/assets/default/default/skins/StatusBar.xml -** -** Copyright 2011, 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. -*/ ---> - -<com.android.systemui.statusbar.phone.NavigationBarView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui" - android:layout_height="match_parent" - android:layout_width="match_parent" - android:background="@drawable/system_bar_background" - > - - <FrameLayout android:id="@+id/rot0" - android:layout_height="match_parent" - android:layout_width="match_parent" - > - - <LinearLayout - android:layout_height="match_parent" - android:layout_width="match_parent" - android:orientation="horizontal" - android:clipChildren="false" - android:clipToPadding="false" - android:id="@+id/nav_buttons" - android:animateLayoutChanges="true" - > - - <!-- navigation controls --> - <View - android:layout_width="@dimen/navigation_extra_key_width" - android:layout_height="match_parent" - android:layout_weight="0" - android:visibility="invisible" - /> - <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" - android:layout_width="@dimen/navigation_key_width" - android:layout_height="match_parent" - android:src="@drawable/ic_sysbar_back" - systemui:keyCode="4" - android:layout_weight="0" - android:scaleType="center" - android:background="@drawable/ripple_drawable" - android:contentDescription="@string/accessibility_back" - /> - <View - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_weight="1" - android:visibility="invisible" - /> - <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home" - android:layout_width="@dimen/navigation_key_width" - android:layout_height="match_parent" - android:src="@drawable/ic_sysbar_home" - systemui:keyCode="3" - systemui:keyRepeat="false" - android:layout_weight="0" - android:background="@drawable/ripple_drawable" - android:contentDescription="@string/accessibility_home" - /> - <View - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_weight="1" - android:visibility="invisible" - /> - <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps" - android:layout_width="@dimen/navigation_key_width" - android:layout_height="match_parent" - android:src="@drawable/ic_sysbar_recent" - android:layout_weight="0" - android:background="@drawable/ripple_drawable" - android:contentDescription="@string/accessibility_recent" - /> - <FrameLayout - android:layout_width="@dimen/navigation_extra_key_width" - android:layout_height="match_parent" - android:layout_weight="0" > - <com.android.systemui.statusbar.policy.KeyButtonView - android:id="@+id/menu" - android:layout_width="@dimen/navigation_extra_key_width" - android:layout_height="match_parent" - android:contentDescription="@string/accessibility_menu" - android:src="@drawable/ic_sysbar_menu" - android:visibility="invisible" - android:background="@drawable/ripple_drawable" - systemui:keyCode="82" /> - <com.android.systemui.statusbar.policy.KeyButtonView - android:id="@+id/ime_switcher" - android:layout_width="@dimen/navigation_extra_key_width" - android:layout_height="match_parent" - android:contentDescription="@string/accessibility_ime_switch_button" - android:scaleType="centerInside" - android:src="@drawable/ic_ime_switcher_default" - android:visibility="invisible" - android:background="@drawable/ripple_drawable" /> - </FrameLayout> - </LinearLayout> - - <!-- lights out layout to match exactly --> - <LinearLayout - android:layout_height="match_parent" - android:layout_width="match_parent" - android:orientation="horizontal" - android:id="@+id/lights_out" - android:visibility="gone" - > - <ImageView - android:layout_width="80dp" - android:layout_height="match_parent" - android:layout_marginStart="40dp" - android:src="@drawable/ic_sysbar_lights_out_dot_small" - android:scaleType="center" - android:layout_weight="0" - /> - <View - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_weight="1" - android:visibility="invisible" - /> - <ImageView - android:layout_width="80dp" - android:layout_height="match_parent" - android:src="@drawable/ic_sysbar_lights_out_dot_large" - android:scaleType="center" - android:layout_weight="0" - /> - <View - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_weight="1" - android:visibility="invisible" - /> - <ImageView - android:layout_width="80dp" - android:layout_marginEnd="40dp" - android:layout_height="match_parent" - android:src="@drawable/ic_sysbar_lights_out_dot_small" - android:scaleType="center" - android:layout_weight="0" - /> - </LinearLayout> - - <com.android.systemui.statusbar.policy.DeadZone - android:id="@+id/deadzone" - android:layout_height="match_parent" - android:layout_width="match_parent" - systemui:minSize="@dimen/navigation_bar_deadzone_size" - systemui:maxSize="@dimen/navigation_bar_deadzone_size_max" - systemui:holdTime="@integer/navigation_bar_deadzone_hold" - systemui:decayTime="@integer/navigation_bar_deadzone_decay" - systemui:orientation="horizontal" - android:layout_gravity="top" - /> - </FrameLayout> - - <FrameLayout android:id="@+id/rot90" - android:layout_height="match_parent" - android:layout_width="match_parent" - android:visibility="gone" - android:paddingTop="0dp" - > - - <LinearLayout - android:layout_height="match_parent" - android:layout_width="match_parent" - android:orientation="vertical" - android:clipChildren="false" - android:clipToPadding="false" - android:id="@+id/nav_buttons" - android:animateLayoutChanges="true" - > - - <!-- navigation controls --> - <FrameLayout - android:layout_width="@dimen/navigation_extra_key_width" - android:layout_height="40dp" - android:layout_weight="0" > - <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu" - android:layout_height="@dimen/navigation_extra_key_width" - android:layout_width="match_parent" - android:src="@drawable/ic_sysbar_menu_land" - systemui:keyCode="82" - android:layout_weight="0" - android:visibility="invisible" - android:contentDescription="@string/accessibility_menu" - android:background="@drawable/ripple_drawable" /> - <com.android.systemui.statusbar.policy.KeyButtonView - android:id="@+id/ime_switcher" - android:layout_height="@dimen/navigation_extra_key_width" - android:layout_width="match_parent" - android:contentDescription="@string/accessibility_ime_switch_button" - android:scaleType="centerInside" - android:src="@drawable/ic_ime_switcher_default" - android:visibility="invisible" - android:background="@drawable/ripple_drawable" /> - </FrameLayout> - <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" - android:layout_height="80dp" - android:layout_width="match_parent" - android:src="@drawable/ic_sysbar_back_land" - android:scaleType="center" - systemui:keyCode="4" - android:layout_weight="0" - android:contentDescription="@string/accessibility_back" - android:background="@drawable/ripple_drawable" - /> - <View - android:layout_height="match_parent" - android:layout_width="match_parent" - android:layout_weight="1" - android:visibility="invisible" - /> - <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home" - android:layout_height="80dp" - android:layout_width="match_parent" - android:src="@drawable/ic_sysbar_home_land" - systemui:keyCode="3" - systemui:keyRepeat="false" - android:layout_weight="0" - android:contentDescription="@string/accessibility_home" - android:background="@drawable/ripple_drawable" - /> - <View - android:layout_height="match_parent" - android:layout_width="match_parent" - android:layout_weight="1" - android:visibility="invisible" - /> - <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps" - android:layout_height="80dp" - android:layout_width="match_parent" - android:src="@drawable/ic_sysbar_recent_land" - android:layout_weight="0" - android:contentDescription="@string/accessibility_recent" - android:background="@drawable/ripple_drawable" - /> - <View - android:layout_height="40dp" - android:layout_width="match_parent" - android:layout_weight="0" - android:visibility="invisible" - /> - </LinearLayout> - - <!-- lights out layout to match exactly --> - <LinearLayout - android:layout_height="match_parent" - android:layout_width="match_parent" - android:orientation="vertical" - android:id="@+id/lights_out" - android:visibility="gone" - > - <ImageView - android:layout_height="80dp" - android:layout_marginTop="40dp" - android:layout_width="match_parent" - android:src="@drawable/ic_sysbar_lights_out_dot_small" - android:scaleType="center" - android:layout_weight="0" - /> - <View - android:layout_height="match_parent" - android:layout_width="match_parent" - android:layout_weight="1" - android:visibility="invisible" - /> - <ImageView - android:layout_height="80dp" - android:layout_width="match_parent" - android:src="@drawable/ic_sysbar_lights_out_dot_large" - android:scaleType="center" - android:layout_weight="0" - /> - <View - android:layout_height="match_parent" - android:layout_width="match_parent" - android:layout_weight="1" - android:visibility="invisible" - /> - <ImageView - android:layout_height="80dp" - android:layout_marginBottom="40dp" - android:layout_width="match_parent" - android:src="@drawable/ic_sysbar_lights_out_dot_small" - android:scaleType="center" - android:layout_weight="0" - /> - </LinearLayout> - - <com.android.systemui.statusbar.policy.DeadZone - android:id="@+id/deadzone" - android:layout_height="match_parent" - android:layout_width="match_parent" - systemui:minSize="@dimen/navigation_bar_deadzone_size" - systemui:maxSize="@dimen/navigation_bar_deadzone_size_max" - systemui:holdTime="@integer/navigation_bar_deadzone_hold" - systemui:decayTime="@integer/navigation_bar_deadzone_decay" - systemui:orientation="vertical" - android:layout_gravity="top" - /> - </FrameLayout> - - <!-- not used --> - <View android:id="@+id/rot270" - android:layout_height="match_parent" - android:layout_width="match_parent" - android:visibility="gone" - /> - -</com.android.systemui.statusbar.phone.NavigationBarView> diff --git a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml index f8b7bae..b5983bb 100644 --- a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml +++ b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml @@ -314,12 +314,4 @@ android:layout_gravity="top" /> </FrameLayout> - - <!-- not used --> - <View android:id="@+id/rot270" - android:layout_height="match_parent" - android:layout_width="match_parent" - android:visibility="gone" - /> - </com.android.systemui.statusbar.phone.NavigationBarView> diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml index 7616cb1..a165940 100644 --- a/packages/SystemUI/res/layout/navigation_bar.xml +++ b/packages/SystemUI/res/layout/navigation_bar.xml @@ -322,11 +322,4 @@ /> </FrameLayout> - <!-- not used --> - <View android:id="@+id/rot270" - android:layout_height="match_parent" - android:layout_width="match_parent" - android:visibility="gone" - /> - </com.android.systemui.statusbar.phone.NavigationBarView> 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 3592971..3bb403d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -23,6 +23,7 @@ import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.app.StatusBarManager; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; @@ -48,13 +49,12 @@ import com.android.systemui.statusbar.policy.KeyButtonView; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.ArrayList; public class NavigationBarView extends LinearLayout { final static boolean DEBUG = false; final static String TAG = "PhoneStatusBar/NavigationBarView"; - final static boolean NAVBAR_ALWAYS_AT_RIGHT = true; - // slippery nav bar when everything is disabled, e.g. during setup final static boolean SLIPPERY_WHEN_DISABLED = true; @@ -87,6 +87,7 @@ public class NavigationBarView extends LinearLayout { private final NavTransitionListener mTransitionListener = new NavTransitionListener(); private OnVerticalChangedListener mOnVerticalChangedListener; + private boolean mIsLtr; private class NavTransitionListener implements TransitionListener { private boolean mBackTransitioning; @@ -387,13 +388,13 @@ public class NavigationBarView extends LinearLayout { mRotatedViews[Surface.ROTATION_90] = findViewById(R.id.rot90); - mRotatedViews[Surface.ROTATION_270] = NAVBAR_ALWAYS_AT_RIGHT - ? findViewById(R.id.rot90) - : findViewById(R.id.rot270); + mRotatedViews[Surface.ROTATION_270] = mRotatedViews[Surface.ROTATION_90]; mCurrentView = mRotatedViews[Surface.ROTATION_0]; getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener); + + updateLTROrder(); } public boolean isVertical() { @@ -456,6 +457,58 @@ public class NavigationBarView extends LinearLayout { super.onSizeChanged(w, h, oldw, oldh); } + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + updateLTROrder(); + } + + /** + * In landscape, the LinearLayout is not auto mirrored since it is vertical. Therefore we + * have to do it manually + */ + private void updateLTROrder() { + boolean isLtr = getResources().getConfiguration() + .getLayoutDirection() == LAYOUT_DIRECTION_RTL; + if (mIsLtr != isLtr) { + + // We swap all children of the 90 and 270 degree layouts, since they are vertical + View rotation90 = mRotatedViews[Surface.ROTATION_90]; + swapChildrenOrderIfVertical(rotation90.findViewById(R.id.nav_buttons)); + + View rotation270 = mRotatedViews[Surface.ROTATION_270]; + if (rotation90 != rotation270) { + swapChildrenOrderIfVertical(rotation270.findViewById(R.id.nav_buttons)); + } + mIsLtr = isLtr; + } + } + + + /** + * Swaps the children order of a LinearLayout if it's orientation is Vertical + * + * @param group The LinearLayout to swap the children from. + */ + private void swapChildrenOrderIfVertical(View group) { + if (group instanceof LinearLayout) { + LinearLayout linearLayout = (LinearLayout) group; + if (linearLayout.getOrientation() == VERTICAL) { + int childCount = linearLayout.getChildCount(); + ArrayList<View> childList = new ArrayList<>(childCount); + for (int i = 0; i < childCount; i++) { + childList.add(linearLayout.getChildAt(i)); + } + linearLayout.removeAllViews(); + for (int i = childCount - 1; i >= 0; i--) { + linearLayout.addView(childList.get(i)); + } + } + } + } + + + /* @Override protected void onLayout (boolean changed, int left, int top, int right, int bottom) { |