Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b4da0c4 authored by Adam Powell's avatar Adam Powell Committed by Android (Google) Code Review
Browse files

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

parents 3f6680ad 6790b050
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
/*
 * 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
    }
}
+21 −17
Original line number Diff line number Diff line
@@ -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
+0 −23
Original line number Diff line number Diff line
@@ -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
        }
    }
}
+38 −7
Original line number Diff line number Diff line
@@ -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;
            }

    @Override
    public void setDropdownParams(SpinnerAdapter adapter,
            AdapterView.OnItemSelectedListener listener) {
            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) {
        ensureSpinner();
        mSpinner.setAdapter(adapter);
        mSpinner.setOnItemSelectedListener(listener);
    }