1f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg/*
2f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg * Copyright (C) 2015 The Android Open Source Project
3f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg *
4f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg * Licensed under the Apache License, Version 2.0 (the "License");
5f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg * you may not use this file except in compliance with the License.
6f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg * You may obtain a copy of the License at
7f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg *
8f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg *      http://www.apache.org/licenses/LICENSE-2.0
9f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg *
10f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg * Unless required by applicable law or agreed to in writing, software
11f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg * distributed under the License is distributed on an "AS IS" BASIS,
12f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg * See the License for the specific language governing permissions and
14f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg * limitations under the License.
15f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg */
16f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasbergpackage com.android.internal.view.menu;
17f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
18f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasbergimport android.view.LayoutInflater;
19f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasbergimport android.view.View;
20f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasbergimport android.view.ViewGroup;
21f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasbergimport android.widget.BaseAdapter;
22f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
23f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasbergimport java.util.ArrayList;
24f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
25f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasbergpublic class MenuAdapter extends BaseAdapter {
26f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    static final int ITEM_LAYOUT = com.android.internal.R.layout.popup_menu_item_layout;
27f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
28f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    MenuBuilder mAdapterMenu;
29f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
30f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    private int mExpandedIndex = -1;
31f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
32f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    private boolean mForceShowIcon;
33f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    private final boolean mOverflowOnly;
34f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    private final LayoutInflater mInflater;
35f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
36f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    public MenuAdapter(MenuBuilder menu, LayoutInflater inflater, boolean overflowOnly) {
37f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        mOverflowOnly = overflowOnly;
38f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        mInflater = inflater;
39f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        mAdapterMenu = menu;
40f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        findExpandedIndex();
41f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    }
42f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
4323087be7792c2d22173cf022a72d0648aa430ab5Oren Blasberg    public boolean getForceShowIcon() {
4423087be7792c2d22173cf022a72d0648aa430ab5Oren Blasberg        return mForceShowIcon;
4523087be7792c2d22173cf022a72d0648aa430ab5Oren Blasberg    }
4623087be7792c2d22173cf022a72d0648aa430ab5Oren Blasberg
47f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    public void setForceShowIcon(boolean forceShow) {
48f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        mForceShowIcon = forceShow;
49f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    }
50f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
51f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    public int getCount() {
52f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        ArrayList<MenuItemImpl> items = mOverflowOnly ?
53f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg                mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems();
54f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        if (mExpandedIndex < 0) {
55f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg            return items.size();
56f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        }
57f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        return items.size() - 1;
58f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    }
59f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
60f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    public MenuBuilder getAdapterMenu() {
61f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        return mAdapterMenu;
62f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    }
63f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
64f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    public MenuItemImpl getItem(int position) {
65f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        ArrayList<MenuItemImpl> items = mOverflowOnly ?
66f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg                mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems();
67f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        if (mExpandedIndex >= 0 && position >= mExpandedIndex) {
68f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg            position++;
69f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        }
70f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        return items.get(position);
71f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    }
72f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
73f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    public long getItemId(int position) {
74f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        // Since a menu item's ID is optional, we'll use the position as an
75f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        // ID for the item in the AdapterView
76f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        return position;
77f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    }
78f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
79f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    public View getView(int position, View convertView, ViewGroup parent) {
80f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        if (convertView == null) {
81f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg            convertView = mInflater.inflate(ITEM_LAYOUT, parent, false);
82f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        }
83f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
84f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        MenuView.ItemView itemView = (MenuView.ItemView) convertView;
85f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        if (mForceShowIcon) {
86f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg            ((ListMenuItemView) convertView).setForceShowIcon(true);
87f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        }
88f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        itemView.initialize(getItem(position), 0);
89f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        return convertView;
90f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    }
91f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
92f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    void findExpandedIndex() {
93f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        final MenuItemImpl expandedItem = mAdapterMenu.getExpandedItem();
94f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        if (expandedItem != null) {
95f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg            final ArrayList<MenuItemImpl> items = mAdapterMenu.getNonActionItems();
96f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg            final int count = items.size();
97f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg            for (int i = 0; i < count; i++) {
98f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg                final MenuItemImpl item = items.get(i);
99f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg                if (item == expandedItem) {
100f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg                    mExpandedIndex = i;
101f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg                    return;
102f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg                }
103f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg            }
104f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        }
105f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        mExpandedIndex = -1;
106f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    }
107f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg
108f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    @Override
109f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    public void notifyDataSetChanged() {
110f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        findExpandedIndex();
111f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg        super.notifyDataSetChanged();
112f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg    }
113f44d90b5c247f0629201d1fa322b83fa55b20608Oren Blasberg}