diff options
-rw-r--r-- | core/java/android/view/ViewGroup.java | 8 | ||||
-rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 2 | ||||
-rw-r--r-- | core/java/com/android/internal/widget/ButtonBarLayout.java | 91 | ||||
-rw-r--r-- | core/res/res/layout/alert_dialog_button_bar_material.xml | 56 | ||||
-rw-r--r-- | core/res/res/layout/alert_dialog_material.xml | 30 | ||||
-rw-r--r-- | core/res/res/values-h320dp/bools.xml | 21 | ||||
-rw-r--r-- | core/res/res/values/bools.xml | 4 | ||||
-rwxr-xr-x | core/res/res/values/symbols.xml | 3 |
8 files changed, 181 insertions, 34 deletions
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index e1cee1e..504a758 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -1208,7 +1208,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * {@inheritDoc} */ public void bringChildToFront(View child) { - int index = indexOfChild(child); + final int index = indexOfChild(child); if (index >= 0) { removeFromArray(index); addInArray(child, mChildrenCount); @@ -3771,7 +3771,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * {@link #dispatchDraw(android.graphics.Canvas)} or any related method.</p> * * @param child the child view to add - * @param index the position at which to add the child + * @param index the position at which to add the child or -1 to add last * @param params the layout parameters to set on the child */ public void addView(View child, int index, LayoutParams params) { @@ -3887,7 +3887,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * If index is negative, it means put it at the end of the list. * * @param child the view to add to the group - * @param index the index at which the child must be added + * @param index the index at which the child must be added or -1 to add last * @param params the layout parameters to associate with the child * @return true if the child was added, false otherwise */ @@ -3902,7 +3902,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * If index is negative, it means put it at the end of the list. * * @param child the view to add to the group - * @param index the index at which the child must be added + * @param index the index at which the child must be added or -1 to add last * @param params the layout parameters to associate with the child * @param preventRequestLayout if true, calling this method will not trigger a * layout request on child diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 8107985..2477d94 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -355,7 +355,7 @@ public class ZygoteInit { Log.v(TAG, "Preloading resource #" + Integer.toHexString(id)); } if (id != 0) { - if (mResources.getColorStateList(id) == null) { + if (mResources.getColorStateList(id, null) == null) { throw new IllegalArgumentException( "Unable to find preloaded color resource #0x" + Integer.toHexString(id) diff --git a/core/java/com/android/internal/widget/ButtonBarLayout.java b/core/java/com/android/internal/widget/ButtonBarLayout.java new file mode 100644 index 0000000..64e6c69 --- /dev/null +++ b/core/java/com/android/internal/widget/ButtonBarLayout.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2015 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. + */ + +package com.android.internal.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.widget.LinearLayout; + +import com.android.internal.R; + +/** + * An extension of LinearLayout that automatically switches to vertical + * orientation when it can't fit its child views horizontally. + */ +public class ButtonBarLayout extends LinearLayout { + /** Spacer used in horizontal orientation. */ + private final View mSpacer; + + /** Whether the current configuration allows stacking. */ + private final boolean mAllowStacked; + + /** Whether the layout is currently stacked. */ + private boolean mStacked; + + public ButtonBarLayout(Context context, AttributeSet attrs) { + super(context, attrs); + + mAllowStacked = context.getResources().getBoolean(R.bool.allow_stacked_button_bar); + mSpacer = findViewById(R.id.spacer); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + // Maybe we can fit the content now? + if (w > oldw && mStacked) { + setStacked(false); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + if (mAllowStacked && getOrientation() == LinearLayout.HORIZONTAL) { + final int measuredWidth = getMeasuredWidthAndState(); + final int measuredWidthState = measuredWidth & MEASURED_STATE_MASK; + if (measuredWidthState == MEASURED_STATE_TOO_SMALL) { + setStacked(true); + + // Measure again in the new orientation. + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + } + + private void setStacked(boolean stacked) { + setOrientation(stacked ? LinearLayout.VERTICAL : LinearLayout.HORIZONTAL); + setGravity(stacked ? Gravity.RIGHT : Gravity.BOTTOM); + + if (mSpacer != null) { + mSpacer.setVisibility(stacked ? View.GONE : View.INVISIBLE); + } + + // Reverse the child order. This is specific to the Material button + // bar's layout XML and will probably not generalize. + final int childCount = getChildCount(); + for (int i = childCount - 2; i >= 0; i--) { + bringChildToFront(getChildAt(i)); + } + + mStacked = stacked; + } +} diff --git a/core/res/res/layout/alert_dialog_button_bar_material.xml b/core/res/res/layout/alert_dialog_button_bar_material.xml new file mode 100644 index 0000000..891bcd5 --- /dev/null +++ b/core/res/res/layout/alert_dialog_button_bar_material.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2014 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.internal.widget.ButtonBarLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/buttonPanel" + style="?attr/buttonBarStyle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layoutDirection="locale" + android:orientation="horizontal" + android:paddingStart="12dp" + android:paddingEnd="12dp" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:gravity="bottom"> + + <Button + android:id="@+id/button3" + style="?attr/buttonBarNeutralButtonStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + + <Space + android:id="@+id/spacer" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_weight="1" + android:visibility="invisible" /> + + <Button + android:id="@+id/button2" + style="?attr/buttonBarNegativeButtonStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + + <Button + android:id="@+id/button1" + style="?attr/buttonBarPositiveButtonStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> +</com.android.internal.widget.ButtonBarLayout>
\ No newline at end of file diff --git a/core/res/res/layout/alert_dialog_material.xml b/core/res/res/layout/alert_dialog_material.xml index 29bfaa7..c8735b1 100644 --- a/core/res/res/layout/alert_dialog_material.xml +++ b/core/res/res/layout/alert_dialog_material.xml @@ -101,33 +101,5 @@ android:layout_height="wrap_content" /> </FrameLayout> - <LinearLayout android:id="@+id/buttonPanel" - style="?attr/buttonBarStyle" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layoutDirection="locale" - android:orientation="horizontal" - android:paddingStart="12dp" - android:paddingEnd="12dp" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:gravity="bottom"> - <Button android:id="@+id/button3" - style="?attr/buttonBarNeutralButtonStyle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" /> - <Space - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_weight="1" - android:visibility="invisible" /> - <Button android:id="@+id/button2" - style="?attr/buttonBarNegativeButtonStyle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" /> - <Button android:id="@+id/button1" - style="?attr/buttonBarPositiveButtonStyle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" /> - </LinearLayout> + <include layout="@layout/alert_dialog_button_bar_material" /> </LinearLayout> diff --git a/core/res/res/values-h320dp/bools.xml b/core/res/res/values-h320dp/bools.xml new file mode 100644 index 0000000..8dbc2e1 --- /dev/null +++ b/core/res/res/values-h320dp/bools.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2015, 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. +*/ +--> +<resources> + <bool name="allow_stacked_button_bar">true</bool> +</resources> diff --git a/core/res/res/values/bools.xml b/core/res/res/values/bools.xml index 457131a..7c63950 100644 --- a/core/res/res/values/bools.xml +++ b/core/res/res/values/bools.xml @@ -25,4 +25,8 @@ <bool name="show_ongoing_ime_switcher">true</bool> <bool name="action_bar_expanded_action_views_exclusive">true</bool> <bool name="target_honeycomb_needs_options_menu">true</bool> + + <!-- Whether to allow vertically stacked button bars. This is disabled for + configurations with a small (e.g. less than 320dp) screen height. --> + <bool name="allow_stacked_button_bar">false</bool> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 813de7c..1e784af 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2161,4 +2161,7 @@ <java-symbol type="string" name="usb_midi_peripheral_manufacturer_name" /> <java-symbol type="string" name="usb_midi_peripheral_model_name" /> + + <java-symbol type="bool" name="allow_stacked_button_bar" /> + <java-symbol type="id" name="spacer" /> </resources> |