am ab9906c0: Merge "Support list navigation mode for toolbar action bars" into lmp-preview-dev

* commit 'ab9906c0735fb22017f3d673207897347edeba92':
  Support list navigation mode for toolbar action bars
This commit is contained in:
Adam Powell
2014-06-04 18:44:02 +00:00
committed by Android Git Automerger
4 changed files with 105 additions and 47 deletions

View File

@@ -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
}
}

View File

@@ -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

View File

@@ -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
}
}
}

View File

@@ -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);
}