chromium/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsExpandableListView.java

// Copyright 2015 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.chrome.browser.ntp;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ExpandableListView;

import org.chromium.ui.base.DeviceFormFactor;

/**
 * Customized ExpandableListView for the recent tabs page. This class handles tablet-specific
 * layout implementation.
 */
public class RecentTabsExpandableListView extends ExpandableListView {
    private static final int MAX_LIST_VIEW_WIDTH_DP = 550;

    private int mMaxListViewWidth;
    private int mSavedListPosition;
    private int mSavedListTop;

    /** Constructor for inflating from XML. */
    public RecentTabsExpandableListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        float density = getResources().getDisplayMetrics().density;
        mMaxListViewWidth = Math.round(MAX_LIST_VIEW_WIDTH_DP * density);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (!DeviceFormFactor.isNonMultiDisplayContextOnTablet(getContext())) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            return;
        }

        // Increase padding if needed to ensure children are no wider than mMaxListViewWidth.
        int childWidth = MeasureSpec.getSize(widthMeasureSpec);
        int excessWidth = childWidth - mMaxListViewWidth;
        int horizontalPadding = 0;
        if (excessWidth > 0) {
            horizontalPadding += excessWidth / 2;
        }

        setPadding(horizontalPadding, 0, horizontalPadding, 0);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        setSelectionFromTop(mSavedListPosition, mSavedListTop);
    }

    @Override
    protected void onDetachedFromWindow() {
        mSavedListPosition = getFirstVisiblePosition();
        View v = getChildAt(0);
        mSavedListTop = (v == null) ? 0 : v.getTop();
        super.onDetachedFromWindow();
    }
}