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

package org.chromium.chrome.browser.widget.accessibility;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;

import org.chromium.chrome.R;
import org.chromium.chrome.browser.Tab;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelAdapter.AccessibilityTabModelAdapterListener;

/**
 * A wrapper around the Android views in the Accessibility tab switcher. This
 * will show two {@link ListView}s, one for each
 * {@link org.chromium.chrome.browser.tabmodel.TabModel} to
 * represent.
 */
public class AccessibilityTabModelWrapper extends LinearLayout {
    private AccessibilityTabModelListView mAccessibilityView;
    private LinearLayout mStackButtonWrapper;
    private ImageButton mStandardButton;
    private ImageButton mIncognitoButton;

    private TabModelSelector mTabModelSelector;
    private TabModelSelectorObserver mTabModelSelectorObserver =
            new EmptyTabModelSelectorObserver() {
        @Override
        public void onChange() {
            getAdapter().notifyDataSetChanged();
        }

        @Override
        public void onNewTabCreated(Tab tab) {
            getAdapter().notifyDataSetChanged();
        }
    };

    // TODO(bauerb): Use View#isAttachedToWindow() as soon as we are guaranteed
    // to run against API version 19.
    private boolean mIsAttachedToWindow;

    private class ButtonOnClickListener implements View.OnClickListener {
        private final boolean mIncognito;

        public ButtonOnClickListener(boolean incognito) {
            mIncognito = incognito;
        }

        @Override
        public void onClick(View v) {
            if (mTabModelSelector != null) {
                if (mIncognito != mTabModelSelector.isIncognitoSelected()) {
                    mTabModelSelector.commitAllTabClosures();
                    mTabModelSelector.selectModel(mIncognito);
                    setStateBasedOnModel();
                }
            }
        }
    }

    public AccessibilityTabModelWrapper(Context context) {
        super(context);
    }

    public AccessibilityTabModelWrapper(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AccessibilityTabModelWrapper(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * Initialize android views after creation.
     *
     * @param listener A {@link AccessibilityTabModelAdapterListener} to pass tab events back to the
     *                 parent.
     */
    public void setup(AccessibilityTabModelAdapterListener listener) {
        mStackButtonWrapper = (LinearLayout) findViewById(R.id.button_wrapper);

        mStandardButton = (ImageButton) findViewById(R.id.standard_tabs_button);
        mStandardButton.setOnClickListener(new ButtonOnClickListener(false));

        mIncognitoButton = (ImageButton) findViewById(R.id.incognito_tabs_button);
        mIncognitoButton.setOnClickListener(new ButtonOnClickListener(true));

        mAccessibilityView = (AccessibilityTabModelListView) findViewById(R.id.list_view);

        AccessibilityTabModelAdapter adapter = getAdapter();

        adapter.setListener(listener);
    }

    /**
     * @param modelSelector A {@link TabModelSelector} to provide information
     *            about open tabs.
     */
    public void setTabModelSelector(TabModelSelector modelSelector) {
        if (mIsAttachedToWindow) {
            mTabModelSelector.removeObserver(mTabModelSelectorObserver);
        }
        mTabModelSelector = modelSelector;
        if (mIsAttachedToWindow) {
            modelSelector.addObserver(mTabModelSelectorObserver);
        }
        setStateBasedOnModel();
    }

    /**
     * Set the bottom model selector buttons and list view contents based on the
     * TabModelSelector.
     */
    public void setStateBasedOnModel() {
        if (mTabModelSelector == null) return;

        boolean incognitoEnabled =
                mTabModelSelector.getModel(true).getComprehensiveModel().getCount() > 0;

        boolean incognitoSelected = mTabModelSelector.isIncognitoSelected();

        if (incognitoEnabled) {
            mStackButtonWrapper.setVisibility(View.VISIBLE);
        } else {
            mStackButtonWrapper.setVisibility(View.GONE);
        }

        if (incognitoSelected) {
            mIncognitoButton.setBackgroundResource(R.drawable.btn_bg_holo_active);
            mStandardButton.setBackgroundResource(R.drawable.btn_bg_holo);
        } else {
            mIncognitoButton.setBackgroundResource(R.drawable.btn_bg_holo);
            mStandardButton.setBackgroundResource(R.drawable.btn_bg_holo_active);
        }

        getAdapter().setTabModel(mTabModelSelector.getModel(incognitoSelected));
    }

    private AccessibilityTabModelAdapter getAdapter() {
        return (AccessibilityTabModelAdapter) mAccessibilityView.getAdapter();
    }

    @Override
    protected void onAttachedToWindow() {
        mTabModelSelector.addObserver(mTabModelSelectorObserver);
        mIsAttachedToWindow = true;
        super.onAttachedToWindow();
    }

    @Override
    protected void onDetachedFromWindow() {
        mIsAttachedToWindow = false;
        super.onDetachedFromWindow();
    }
}

@@ -4988,32 +4988,184 @@
 e.btn_bg_holo);%0A
+            mAccessibilityView.setContentDescription(getContext().getString(%0A                    R.string.accessibility_tab_switcher_incognito_stack));%0A
         %7D else %7B
@@ -5315,32 +5315,183 @@
 g_holo_active);%0A
+            mAccessibilityView.setContentDescription(getContext().getString(%0A                    R.string.accessibility_tab_switcher_standard_stack));%0A
         %7D%0A%0A     

Update tab switcher content description correctly