diff --git a/core/java/com/android/internal/app/NavItemSelectedListener.java b/core/java/com/android/internal/app/NavItemSelectedListener.java new file mode 100644 index 0000000000000..545f44be716b8 --- /dev/null +++ b/core/java/com/android/internal/app/NavItemSelectedListener.java @@ -0,0 +1,46 @@ +/* + * 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. + */ + + +package com.android.internal.app; + +import android.app.ActionBar; +import android.view.View; +import android.widget.AdapterView; + +/** + * Wrapper to adapt the ActionBar.OnNavigationListener in an AdapterView.OnItemSelectedListener + * for use in Spinner widgets. Used by action bar implementations. + */ +class NavItemSelectedListener implements AdapterView.OnItemSelectedListener { + private final ActionBar.OnNavigationListener mListener; + + public NavItemSelectedListener(ActionBar.OnNavigationListener listener) { + mListener = listener; + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (mListener != null) { + mListener.onNavigationItemSelected(position, id); + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + // Do nothing + } +} diff --git a/core/java/com/android/internal/app/ToolbarActionBar.java b/core/java/com/android/internal/app/ToolbarActionBar.java index 6056bf25f7fd8..5db09f4defd63 100644 --- a/core/java/com/android/internal/app/ToolbarActionBar.java +++ b/core/java/com/android/internal/app/ToolbarActionBar.java @@ -173,14 +173,19 @@ public class ToolbarActionBar extends ActionBar { @Override public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { - throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + mDecorToolbar.setDropdownParams(adapter, new NavItemSelectedListener(callback)); } @Override public void setSelectedNavigationItem(int position) { - throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + switch (mDecorToolbar.getNavigationMode()) { + case NAVIGATION_MODE_LIST: + mDecorToolbar.setDropdownSelectedPosition(position); + break; + default: + throw new IllegalStateException( + "setSelectedNavigationIndex not valid for current navigation mode"); + } } @Override @@ -276,8 +281,7 @@ public class ToolbarActionBar extends ActionBar { @Override public void setNavigationMode(@NavigationMode int mode) { - throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + mDecorToolbar.setNavigationMode(mode); } @Override @@ -288,67 +292,67 @@ public class ToolbarActionBar extends ActionBar { @Override public Tab newTab() { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override public void addTab(Tab tab) { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override public void addTab(Tab tab, boolean setSelected) { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override public void addTab(Tab tab, int position) { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override public void addTab(Tab tab, int position, boolean setSelected) { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override public void removeTab(Tab tab) { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override public void removeTabAt(int position) { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override public void removeAllTabs() { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override public void selectTab(Tab tab) { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override public Tab getSelectedTab() { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override public Tab getTabAt(int index) { throw new UnsupportedOperationException( - "Navigation modes are not supported in toolbar action bars"); + "Tabs are not supported in toolbar action bars"); } @Override diff --git a/core/java/com/android/internal/app/WindowDecorActionBar.java b/core/java/com/android/internal/app/WindowDecorActionBar.java index c0b5b97d18e1a..87a80ace347fb 100644 --- a/core/java/com/android/internal/app/WindowDecorActionBar.java +++ b/core/java/com/android/internal/app/WindowDecorActionBar.java @@ -18,9 +18,7 @@ package com.android.internal.app; import android.animation.ValueAnimator; import android.content.res.TypedArray; -import android.view.ViewGroup; import android.view.ViewParent; -import android.widget.AdapterView; import android.widget.Toolbar; import com.android.internal.R; import com.android.internal.view.ActionBarPolicy; @@ -30,7 +28,6 @@ import com.android.internal.view.menu.SubMenuBuilder; import com.android.internal.widget.ActionBarContainer; import com.android.internal.widget.ActionBarContextView; import com.android.internal.widget.ActionBarOverlayLayout; -import com.android.internal.widget.ActionBarView; import com.android.internal.widget.DecorToolbar; import com.android.internal.widget.ScrollingTabContainerView; @@ -59,7 +56,6 @@ import android.view.Window; import android.view.accessibility.AccessibilityEvent; import android.view.animation.AnimationUtils; import android.widget.SpinnerAdapter; -import com.android.internal.widget.ToolbarWidgetWrapper; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -1313,23 +1309,4 @@ public class WindowDecorActionBar extends ActionBar implements } } - static class NavItemSelectedListener implements AdapterView.OnItemSelectedListener { - private final OnNavigationListener mListener; - - public NavItemSelectedListener(OnNavigationListener listener) { - mListener = listener; - } - - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (mListener != null) { - mListener.onNavigationItemSelected(position, id); - } - } - - @Override - public void onNothingSelected(AdapterView parent) { - // Do nothing - } - } } diff --git a/core/java/com/android/internal/widget/ToolbarWidgetWrapper.java b/core/java/com/android/internal/widget/ToolbarWidgetWrapper.java index 3e15c323a2b33..ea39eed7c6e3c 100644 --- a/core/java/com/android/internal/widget/ToolbarWidgetWrapper.java +++ b/core/java/com/android/internal/widget/ToolbarWidgetWrapper.java @@ -27,6 +27,7 @@ import android.os.Parcelable; import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; @@ -78,6 +79,8 @@ public class ToolbarWidgetWrapper implements DecorToolbar { private boolean mMenuPrepared; private ActionMenuPresenter mActionMenuPresenter; + private int mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; + public ToolbarWidgetWrapper(Toolbar toolbar) { mToolbar = toolbar; @@ -420,23 +423,51 @@ public class ToolbarWidgetWrapper implements DecorToolbar { @Override public int getNavigationMode() { - return 0; + return mNavigationMode; } @Override public void setNavigationMode(int mode) { - if (mode != ActionBar.NAVIGATION_MODE_STANDARD) { - throw new IllegalArgumentException( - "Navigation modes not supported in this configuration"); + final int oldMode = mNavigationMode; + if (mode != oldMode) { + switch (oldMode) { + case ActionBar.NAVIGATION_MODE_LIST: + if (mSpinner != null && mSpinner.getParent() == mToolbar) { + mToolbar.removeView(mSpinner); + } + break; + } + + mNavigationMode = mode; + + switch (mode) { + case ActionBar.NAVIGATION_MODE_STANDARD: + break; + case ActionBar.NAVIGATION_MODE_LIST: + ensureSpinner(); + mToolbar.addView(mSpinner, 0); + break; + case ActionBar.NAVIGATION_MODE_TABS: + throw new IllegalStateException("Tabs not supported in this configuration"); + default: + throw new IllegalArgumentException("Invalid navigation mode " + mode); + } + } + } + + private void ensureSpinner() { + if (mSpinner == null) { + mSpinner = new Spinner(getContext()); + Toolbar.LayoutParams lp = new Toolbar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL); + mSpinner.setLayoutParams(lp); } } @Override public void setDropdownParams(SpinnerAdapter adapter, AdapterView.OnItemSelectedListener listener) { - if (mSpinner == null) { - mSpinner = new Spinner(getContext()); - } + ensureSpinner(); mSpinner.setAdapter(adapter); mSpinner.setOnItemSelectedListener(listener); }