Merge "Enforce FloatingToolbar themes." into mnc-dev

This commit is contained in:
Abodunrinwa Toki
2015-06-26 05:26:38 +00:00
committed by Android (Google) Code Review
5 changed files with 34 additions and 22 deletions

View File

@@ -23,6 +23,7 @@ import android.animation.ObjectAnimator;
import android.content.ComponentCallbacks; import android.content.ComponentCallbacks;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
@@ -30,6 +31,7 @@ import android.graphics.Region;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Size; import android.util.Size;
import android.view.ContextThemeWrapper;
import android.view.Gravity; import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
@@ -108,8 +110,10 @@ public final class FloatingToolbar {
* Initializes a floating toolbar. * Initializes a floating toolbar.
*/ */
public FloatingToolbar(Context context, Window window) { public FloatingToolbar(Context context, Window window) {
mContext = Preconditions.checkNotNull(context); Preconditions.checkNotNull(context);
mPopup = new FloatingToolbarPopup(window.getDecorView()); Preconditions.checkNotNull(window);
mContext = applyDefaultTheme(context);
mPopup = new FloatingToolbarPopup(mContext, window.getDecorView());
} }
/** /**
@@ -276,6 +280,7 @@ public final class FloatingToolbar {
public static final int OVERFLOW_DIRECTION_UP = 0; public static final int OVERFLOW_DIRECTION_UP = 0;
public static final int OVERFLOW_DIRECTION_DOWN = 1; public static final int OVERFLOW_DIRECTION_DOWN = 1;
private final Context mContext;
private final View mParent; private final View mParent;
private final PopupWindow mPopupWindow; private final PopupWindow mPopupWindow;
private final ViewGroup mContentContainer; private final ViewGroup mContentContainer;
@@ -375,9 +380,10 @@ public final class FloatingToolbar {
* @param parent A parent view to get the {@link android.view.View#getWindowToken()} token * @param parent A parent view to get the {@link android.view.View#getWindowToken()} token
* from. * from.
*/ */
public FloatingToolbarPopup(View parent) { public FloatingToolbarPopup(Context context, View parent) {
mParent = Preconditions.checkNotNull(parent); mParent = Preconditions.checkNotNull(parent);
mContentContainer = createContentContainer(parent.getContext()); mContext = Preconditions.checkNotNull(context);
mContentContainer = createContentContainer(context);
mPopupWindow = createPopupWindow(mContentContainer); mPopupWindow = createPopupWindow(mContentContainer);
mDismissAnimation = createExitAnimation( mDismissAnimation = createExitAnimation(
mContentContainer, mContentContainer,
@@ -415,7 +421,7 @@ public final class FloatingToolbar {
mContentContainer.removeAllViews(); mContentContainer.removeAllViews();
if (mMainPanel == null) { if (mMainPanel == null) {
mMainPanel = new FloatingToolbarMainPanel(mParent.getContext(), mOpenOverflow); mMainPanel = new FloatingToolbarMainPanel(mContext, mOpenOverflow);
} }
List<MenuItem> overflowMenuItems = List<MenuItem> overflowMenuItems =
mMainPanel.layoutMenuItems(menuItems, getToolbarWidth(suggestedWidth)); mMainPanel.layoutMenuItems(menuItems, getToolbarWidth(suggestedWidth));
@@ -423,7 +429,7 @@ public final class FloatingToolbar {
if (!overflowMenuItems.isEmpty()) { if (!overflowMenuItems.isEmpty()) {
if (mOverflowPanel == null) { if (mOverflowPanel == null) {
mOverflowPanel = mOverflowPanel =
new FloatingToolbarOverflowPanel(mParent.getContext(), mCloseOverflow); new FloatingToolbarOverflowPanel(mContext, mCloseOverflow);
} }
mOverflowPanel.setMenuItems(overflowMenuItems); mOverflowPanel.setMenuItems(overflowMenuItems);
mOverflowPanel.setOnMenuItemClickListener(menuItemClickListener); mOverflowPanel.setOnMenuItemClickListener(menuItemClickListener);
@@ -540,7 +546,7 @@ public final class FloatingToolbar {
* Returns the context this popup is running in. * Returns the context this popup is running in.
*/ */
public Context getContext() { public Context getContext() {
return mContentContainer.getContext(); return mContext;
} }
private void refreshCoordinatesAndOverflowDirection(Rect contentRect) { private void refreshCoordinatesAndOverflowDirection(Rect contentRect) {
@@ -562,7 +568,7 @@ public final class FloatingToolbar {
} else if (availableHeightBelowContent >= getToolbarHeightWithVerticalMargin()) { } else if (availableHeightBelowContent >= getToolbarHeightWithVerticalMargin()) {
// There is enough space at the bottom of the content. // There is enough space at the bottom of the content.
y = contentRect.bottom; y = contentRect.bottom;
} else if (availableHeightBelowContent >= getEstimatedToolbarHeight(getContext())) { } else if (availableHeightBelowContent >= getEstimatedToolbarHeight(mContext)) {
// Just enough space to fit the toolbar with no vertical margins. // Just enough space to fit the toolbar with no vertical margins.
y = contentRect.bottom - mMarginVertical; y = contentRect.bottom - mMarginVertical;
} else { } else {
@@ -621,7 +627,7 @@ public final class FloatingToolbar {
} }
private int getToolbarHeightWithVerticalMargin() { private int getToolbarHeightWithVerticalMargin() {
return getEstimatedToolbarHeight(mParent.getContext()) + mMarginVertical * 2; return getEstimatedToolbarHeight(mContext) + mMarginVertical * 2;
} }
/** /**
@@ -1477,6 +1483,17 @@ public final class FloatingToolbar {
return animation; return animation;
} }
/**
* Returns a re-themed context with controlled look and feel for views.
*/
private static Context applyDefaultTheme(Context originalContext) {
TypedArray a = originalContext.obtainStyledAttributes(new int[]{R.attr.isLightTheme});
boolean isLightTheme = a.getBoolean(0, true);
int themeId = isLightTheme ? R.style.Theme_Material_Light : R.style.Theme_Material;
a.recycle();
return new ContextThemeWrapper(originalContext, themeId);
}
private static int getEstimatedToolbarHeight(Context context) { private static int getEstimatedToolbarHeight(Context context) {
return context.getResources().getDimensionPixelSize(R.dimen.floating_toolbar_height); return context.getResources().getDimensionPixelSize(R.dimen.floating_toolbar_height);
} }
@@ -1486,18 +1503,6 @@ public final class FloatingToolbar {
.getDimensionPixelSize(R.dimen.floating_toolbar_menu_button_minimum_width); .getDimensionPixelSize(R.dimen.floating_toolbar_menu_button_minimum_width);
} }
private static int getAdjustedToolbarWidth(Context context, int width) {
int maximumWidth = getScreenWidth(context) - 2 * context.getResources()
.getDimensionPixelSize(R.dimen.floating_toolbar_horizontal_margin);
if (width <= 0 || width > maximumWidth) {
int defaultWidth = context.getResources()
.getDimensionPixelSize(R.dimen.floating_toolbar_preferred_width);
width = Math.min(defaultWidth, maximumWidth);
}
return width;
}
/** /**
* Returns the device's screen width. * Returns the device's screen width.
*/ */

View File

@@ -18,7 +18,8 @@
<Button xmlns:android="http://schemas.android.com/apk/res/android" <Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:minWidth="@dimen/floating_toolbar_menu_button_side_padding" android:minWidth="@dimen/floating_toolbar_menu_button_minimum_width"
android:minHeight="@dimen/floating_toolbar_height"
android:paddingStart="@dimen/floating_toolbar_menu_button_side_padding" android:paddingStart="@dimen/floating_toolbar_menu_button_side_padding"
android:paddingEnd="@dimen/floating_toolbar_menu_button_side_padding" android:paddingEnd="@dimen/floating_toolbar_menu_button_side_padding"
android:paddingTop="0dp" android:paddingTop="0dp"

View File

@@ -27,6 +27,9 @@
<!-- ============== --> <!-- ============== -->
<eat-comment /> <eat-comment />
<!-- Specifies that a theme has a light background with dark text on top. -->
<attr name="isLightTheme" format="boolean" />
<!-- Default color of foreground imagery. --> <!-- Default color of foreground imagery. -->
<attr name="colorForeground" format="color" /> <attr name="colorForeground" format="color" />
<!-- Default color of foreground imagery on an inverted background. --> <!-- Default color of foreground imagery on an inverted background. -->

View File

@@ -240,6 +240,7 @@
<java-symbol type="attr" name="windowFixedHeightMajor" /> <java-symbol type="attr" name="windowFixedHeightMajor" />
<java-symbol type="attr" name="windowFixedHeightMinor" /> <java-symbol type="attr" name="windowFixedHeightMinor" />
<java-symbol type="attr" name="accessibilityFocusedDrawable"/> <java-symbol type="attr" name="accessibilityFocusedDrawable"/>
<java-symbol type="attr" name="isLightTheme"/>
<java-symbol type="bool" name="action_bar_embed_tabs" /> <java-symbol type="bool" name="action_bar_embed_tabs" />
<java-symbol type="bool" name="action_bar_embed_tabs_pre_jb" /> <java-symbol type="bool" name="action_bar_embed_tabs_pre_jb" />

View File

@@ -42,6 +42,7 @@ please see themes_device_defaults.xml.
--> -->
<style name="Theme"> <style name="Theme">
<item name="isLightTheme">false</item>
<item name="colorForeground">@color/bright_foreground_dark</item> <item name="colorForeground">@color/bright_foreground_dark</item>
<item name="colorForegroundInverse">@color/bright_foreground_dark_inverse</item> <item name="colorForegroundInverse">@color/bright_foreground_dark_inverse</item>
<item name="colorBackground">@color/background_dark</item> <item name="colorBackground">@color/background_dark</item>
@@ -472,6 +473,7 @@ please see themes_device_defaults.xml.
background will be a light color. background will be a light color.
<p>This is designed for API level 10 and lower.</p>--> <p>This is designed for API level 10 and lower.</p>-->
<style name="Theme.Light"> <style name="Theme.Light">
<item name="isLightTheme">true</item>
<item name="windowBackground">@drawable/screen_background_selector_light</item> <item name="windowBackground">@drawable/screen_background_selector_light</item>
<item name="windowClipToOutline">false</item> <item name="windowClipToOutline">false</item>