chromium/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemAdapter.java

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.ui.listmenu;

import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import org.chromium.ui.listmenu.BasicListMenu.ListMenuItemType;
import org.chromium.ui.modelutil.ModelListAdapter;

/** Default adapter for use with {@link ListMenu}. */
public class ListMenuItemAdapter extends ModelListAdapter {
    public ListMenuItemAdapter(ModelList data) {
        super(data);
    }

    @Override
    public boolean areAllItemsEnabled() {
        for (int i = 0; i < getCount(); i++) {
            if (!isEnabled(i)) {
                return false;
            }
        }
        return true;
    }

    @Override
    public boolean isEnabled(int position) {
        return getItemViewType(position) != ListMenuItemType.DIVIDER
                && ((ListItem) getItem(position)).model.get(ListMenuItemProperties.ENABLED);
    }

    @Override
    public long getItemId(int position) {
        return ((ListItem) getItem(position)).model.get(ListMenuItemProperties.MENU_ITEM_ID);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);

        // https://crbug.copm/802284 Pre-Q only.
        // The view needs to have an OnClickListener for TalkBack to announce the disabled state. In
        // this case, we need to let the ListView handle the click.
        view.setOnClickListener(
                (v) -> {
                    long id =
                            ((ListItem) getItem(position))
                                    .model.get(ListMenuItemProperties.MENU_ITEM_ID);
                    ((ListView) parent).performItemClick(v, position, id);
                });
        // some items have styles specific for disabled state
        view.setEnabled(isEnabled(position));

        return view;
    }
}