/*
 * Copyright (C) 2015 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.tv.menu;

import android.content.Context;
import com.android.tv.common.customization.CustomAction;
import java.util.Collections;
import java.util.List;

public class PartnerOptionsRowAdapter extends CustomizableOptionsRowAdapter {
    public PartnerOptionsRowAdapter(Context context, List<CustomAction> customActions) {
        super(context, customActions);
    }

    @Override
    protected List<MenuAction> createBaseActions() {
        return Collections.emptyList();
    }

    @Override
    protected void executeBaseAction(int option) {}

    @Override
    protected void updateActions() {
        // TODO: Support adding description for custom actions.
    }
}
