From 3d3bc45fe11de69a9af3e6136eb190c3d099f888 Mon Sep 17 00:00:00 2001 From: Adrian Ulrich Date: Mon, 1 Jun 2015 18:02:27 +0200 Subject: [PATCH] change action bar expander --- .../android/vanilla/ActionBarControls.java | 67 +++++++------------ 1 file changed, 26 insertions(+), 41 deletions(-) diff --git a/src/ch/blinkenlights/android/vanilla/ActionBarControls.java b/src/ch/blinkenlights/android/vanilla/ActionBarControls.java index b580f0b1..3944c3ad 100644 --- a/src/ch/blinkenlights/android/vanilla/ActionBarControls.java +++ b/src/ch/blinkenlights/android/vanilla/ActionBarControls.java @@ -24,62 +24,47 @@ package ch.blinkenlights.android.vanilla; import android.content.Context; import android.util.AttributeSet; -import android.view.ViewGroup; -import android.view.View; import android.widget.LinearLayout; +import android.os.Build; +import android.util.DisplayMetrics; /** * LinearLayout that contains some hacks for sizing inside an ActionBar. */ public class ActionBarControls extends LinearLayout { - private final int dpiMaxWidth = 350; - private final int dpiCompatMax = 200; - private final int dpiElement = 50; - private final int slackElements = 2; + private final int dpiElementLp = 52; // Size of the ActionBarSearch icon in 5.x (50 + some slack) + private final int dpiElementHolo = 64; // Size of the ActionBarSearch icon in HOLO + private final int dpiMaxWidth = 350; // Never use more then 350 DPIs + private final int visibleElements = 2; // The ActionBarSearch + Menu icons are visible - public ActionBarControls(Context context, AttributeSet attrs) - { + public ActionBarControls(Context context, AttributeSet attrs) { super(context, attrs); } - @Override - public void onMeasure(int ws, int hs) - { - ViewGroup parent = (ViewGroup)this.getParent(); - int pxUsed = 0; // pixels used by child elements, excluding us - int pxTotal = 0; // pixels we can actually use - - // Measure how much space we got and how much is already used - // by other children - if (parent != null) { - // We are item 0, so we skip ourselfs - for (int i=1; i 0) { - int pxAvailable = (pxTotal - (int)(density * dpiElement * slackElements)); - int pxMaxWidth = (int)(dpiMaxWidth * density); + final float density = getResources().getDisplayMetrics().density; + final int dpiElement = ( android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? dpiElementLp : dpiElementHolo ); + int widthMode = MeasureSpec.getMode(ws); - if (pxAvailable <= 0 || pxAvailable > pxMaxWidth) { - pxAvailable = pxMaxWidth; + if (widthMode != MeasureSpec.EXACTLY) { + float dpiAvailable = (getSmallestAxisPx() / density) - (dpiElement * visibleElements); + if (dpiAvailable > dpiMaxWidth || dpiAvailable < 1) { + dpiAvailable = dpiMaxWidth; } - if (android.os.Build.VERSION.SDK_INT < 21) { - pxAvailable = (int)(dpiCompatMax * density); - } - setMeasuredDimension( pxAvailable, (int)(dpiElement * density)); + setMeasuredDimension((int)(dpiAvailable * density), (int)(dpiElement * density)); } - } + + /** + * Returns the smaller axis of the display dimensions + * @return The dimension of the smaller axis in pixels + */ + private final int getSmallestAxisPx() { + DisplayMetrics metrics = getResources().getDisplayMetrics(); + return (metrics.widthPixels > metrics.heightPixels ? metrics.heightPixels : metrics.widthPixels); + } + }