Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79170064 authored by Xiaohui Chen's avatar Xiaohui Chen
Browse files

sysui: fix navbar button view orientation

Before navbar assumes rotation 0 means portrait and rotation 90
means landscape.  This is not necessarily true, in certain devices
the natural orientation (0) is landscape.  Here we removed that
assumption and make sure we use the right inflater at all times.

Bug: 32516898
Change-Id: I325b8f61877827b19aa5b7b5cda49cb3523d2ed6
Merged-in: I3db44dcb35d8511fb9d42b147b2bd137ff0750f7
parent 854bc8ea
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -104,9 +104,6 @@

    <dimen name="navigation_key_padding">0dp</dimen>

    <dimen name="navigation_key_width_sw600dp_land">162dp</dimen>
    <dimen name="navigation_key_padding_sw600dp_land">42dp</dimen>

    <!-- The width of the view containing the menu/ime navigation bar icons -->
    <dimen name="navigation_extra_key_width">36dp</dimen>

+9 −10
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ public class ButtonDispatcher {
    private int mImageResource = -1;
    private Drawable mImageDrawable;
    private View mCurrentView;
    private boolean mVertical;

    public ButtonDispatcher(int id) {
        mId = id;
@@ -49,13 +50,6 @@ public class ButtonDispatcher {
        mViews.clear();
    }

    void addView(View view, boolean landscape) {
        addView(view);
        if (view instanceof ButtonInterface) {
            ((ButtonInterface) view).setLandscape(landscape);
        }
    }

    void addView(View view) {
        mViews.add(view);
        view.setOnClickListener(mClickListener);
@@ -75,6 +69,10 @@ public class ButtonDispatcher {
        } else if (mImageDrawable != null) {
            ((ButtonInterface) view).setImageDrawable(mImageDrawable);
        }

        if (view instanceof  ButtonInterface) {
            ((ButtonInterface) view).setVertical(mVertical);
        }
    }

    public int getId() {
@@ -186,12 +184,13 @@ public class ButtonDispatcher {
        }
    }

    public void setLandscape(boolean landscape) {
    public void setVertical(boolean vertical) {
        mVertical = vertical;
        final int N = mViews.size();
        for (int i = 0; i < N; i++) {
            final View view = mViews.get(i);
            if (view instanceof ButtonInterface) {
                ((ButtonInterface) view).setLandscape(landscape);
                ((ButtonInterface) view).setVertical(vertical);
            }
        }
    }
@@ -206,7 +205,7 @@ public class ButtonDispatcher {

        void abortCurrentGesture();

        void setLandscape(boolean landscape);
        void setVertical(boolean vertical);

        void setCarMode(boolean carMode);
    }
+25 −43
Original line number Diff line number Diff line
@@ -17,12 +17,14 @@ package com.android.systemui.statusbar.phone;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.Display;
import android.view.Display.Mode;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Space;
@@ -63,12 +65,13 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi

    protected FrameLayout mRot0;
    protected FrameLayout mRot90;
    private boolean isRot0Landscape;

    private SparseArray<ButtonDispatcher> mButtonDispatchers;
    private String mCurrentLayout;

    private View mLastRot0;
    private View mLastRot90;
    private View mLastPortrait;
    private View mLastLandscape;

    private boolean mAlternativeOrder;

@@ -76,6 +79,10 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi
        super(context, attrs);
        mDensity = context.getResources().getConfiguration().densityDpi;
        createInflaters();
        Display display = ((WindowManager)
                context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        Mode displayMode = display.getMode();
        isRot0Landscape = displayMode.getPhysicalWidth() > displayMode.getPhysicalHeight();
    }

    private void createInflaters() {
@@ -204,17 +211,17 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi
        String[] center = sets[1].split(BUTTON_SEPARATOR);
        String[] end = sets[2].split(BUTTON_SEPARATOR);
        // Inflate these in start to end order or accessibility traversal will be messed up.
        inflateButtons(start, (ViewGroup) mRot0.findViewById(R.id.ends_group), false);
        inflateButtons(start, (ViewGroup) mRot90.findViewById(R.id.ends_group), true);
        inflateButtons(start, (ViewGroup) mRot0.findViewById(R.id.ends_group), isRot0Landscape);
        inflateButtons(start, (ViewGroup) mRot90.findViewById(R.id.ends_group), !isRot0Landscape);

        inflateButtons(center, (ViewGroup) mRot0.findViewById(R.id.center_group), false);
        inflateButtons(center, (ViewGroup) mRot90.findViewById(R.id.center_group), true);
        inflateButtons(center, (ViewGroup) mRot0.findViewById(R.id.center_group), isRot0Landscape);
        inflateButtons(center, (ViewGroup) mRot90.findViewById(R.id.center_group), !isRot0Landscape);

        addGravitySpacer((LinearLayout) mRot0.findViewById(R.id.ends_group));
        addGravitySpacer((LinearLayout) mRot90.findViewById(R.id.ends_group));

        inflateButtons(end, (ViewGroup) mRot0.findViewById(R.id.ends_group), false);
        inflateButtons(end, (ViewGroup) mRot90.findViewById(R.id.ends_group), true);
        inflateButtons(end, (ViewGroup) mRot0.findViewById(R.id.ends_group), isRot0Landscape);
        inflateButtons(end, (ViewGroup) mRot90.findViewById(R.id.ends_group), !isRot0Landscape);
    }

    private void addGravitySpacer(LinearLayout layout) {
@@ -223,7 +230,7 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi

    private void inflateButtons(String[] buttons, ViewGroup parent, boolean landscape) {
        for (int i = 0; i < buttons.length; i++) {
            inflateButton(buttons[i], parent, landscape, i);
            inflateButton(buttons[i], parent, landscape);
        }
    }

@@ -236,27 +243,17 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi
    }

    @Nullable
    protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape,
            int indexInParent) {
    protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape) {
        LayoutInflater inflater = landscape ? mLandscapeInflater : mLayoutInflater;
        float size = extractSize(buttonSpec);
        String button = extractButton(buttonSpec);
        View v = null;
        if (HOME.equals(button)) {
            v = inflater.inflate(R.layout.home, parent, false);
            if (landscape && isSw600Dp()) {
                setupLandButton(v);
            }
        } else if (BACK.equals(button)) {
            v = inflater.inflate(R.layout.back, parent, false);
            if (landscape && isSw600Dp()) {
                setupLandButton(v);
            }
        } else if (RECENT.equals(button)) {
            v = inflater.inflate(R.layout.recent_apps, parent, false);
            if (landscape && isSw600Dp()) {
                setupLandButton(v);
            }
        } else if (MENU_IME.equals(button)) {
            v = inflater.inflate(R.layout.menu_ime, parent, false);
        } else if (NAVSPACE.equals(button)) {
@@ -280,15 +277,15 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi
            params.width = (int) (params.width * size);
        }
        parent.addView(v);
        addToDispatchers(v, landscape);
        View lastView = landscape ? mLastRot90 : mLastRot0;
        addToDispatchers(v);
        View lastView = landscape ? mLastLandscape : mLastPortrait;
        if (lastView != null) {
            v.setAccessibilityTraversalAfter(lastView.getId());
        }
        if (landscape) {
            mLastRot90 = v;
            mLastLandscape = v;
        } else {
            mLastRot0 = v;
            mLastPortrait = v;
        }
        return v;
    }
@@ -327,37 +324,22 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi
        return buttonSpec.substring(0, buttonSpec.indexOf(SIZE_MOD_START));
    }

    private void addToDispatchers(View v, boolean landscape) {
    private void addToDispatchers(View v) {
        if (mButtonDispatchers != null) {
            final int indexOfKey = mButtonDispatchers.indexOfKey(v.getId());
            if (indexOfKey >= 0) {
                mButtonDispatchers.valueAt(indexOfKey).addView(v, landscape);
                mButtonDispatchers.valueAt(indexOfKey).addView(v);
            } else if (v instanceof ViewGroup) {
                final ViewGroup viewGroup = (ViewGroup)v;
                final int N = viewGroup.getChildCount();
                for (int i = 0; i < N; i++) {
                    addToDispatchers(viewGroup.getChildAt(i), landscape);
                    addToDispatchers(viewGroup.getChildAt(i));
                }
            }
        }
    }

    private boolean isSw600Dp() {
        Configuration configuration = mContext.getResources().getConfiguration();
        return (configuration.smallestScreenWidthDp >= 600);
    }

    /**
     * This manually sets the width of sw600dp landscape buttons because despite
     * overriding the configuration from the overridden resources aren't loaded currently.
     */
    private void setupLandButton(View v) {
        Resources res = mContext.getResources();
        v.getLayoutParams().width = res.getDimensionPixelOffset(
                R.dimen.navigation_key_width_sw600dp_land);
        int padding = res.getDimensionPixelOffset(R.dimen.navigation_key_padding_sw600dp_land);
        v.setPadding(padding, v.getPaddingTop(), padding, v.getPaddingBottom());
    }

    private void clearViews() {
        if (mButtonDispatchers != null) {
+1 −1
Original line number Diff line number Diff line
@@ -579,7 +579,7 @@ public class NavigationBarView extends LinearLayout {
        updateTaskSwitchHelper();
        setNavigationIconHints(mNavigationIconHints, true);

        getHomeButton().setLandscape(mVertical);
        getHomeButton().setVertical(mVertical);
    }

    private void updateTaskSwitchHelper() {
+1 −1
Original line number Diff line number Diff line
@@ -275,7 +275,7 @@ public class KeyButtonView extends ImageView implements ButtonDispatcher.ButtonI
    }

    @Override
    public void setLandscape(boolean landscape) {
    public void setVertical(boolean vertical) {
        //no op
    }