1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/*
2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project
3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License.
6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at
7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software
11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and
14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License.
15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.menu;
18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.Context;
20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.res.Resources;
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.graphics.Rect;
22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.support.annotation.NonNull;
23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.AttributeSet;
24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.Log;
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.TypedValue;
26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.View;
27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.ViewGroup;
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.widget.LinearLayout;
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.widget.TextView;
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.R;
3107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport com.android.tv.menu.Menu.MenuShowReason;
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic abstract class MenuRowView extends LinearLayout {
3407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    private static final String TAG = "MenuRowView";
35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final boolean DEBUG = false;
36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private TextView mTitleView;
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private View mContentsView;
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
4007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    private final float mTitleViewAlphaDeselected;
4107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    private final float mTitleViewScaleSelected;
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * The lastly focused view. It is used to keep the focus while navigating the menu rows and
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * reset when the menu is popped up.
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private View mLastFocusView;
4895961816a768da387f0b5523cf4363ace2044089Nick Chalko
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private MenuRow mRow;
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
5195961816a768da387f0b5523cf4363ace2044089Nick Chalko    private final OnFocusChangeListener mOnFocusChangeListener =
5295961816a768da387f0b5523cf4363ace2044089Nick Chalko            new OnFocusChangeListener() {
5395961816a768da387f0b5523cf4363ace2044089Nick Chalko                @Override
5495961816a768da387f0b5523cf4363ace2044089Nick Chalko                public void onFocusChange(View v, boolean hasFocus) {
5595961816a768da387f0b5523cf4363ace2044089Nick Chalko                    onChildFocusChange(v, hasFocus);
5695961816a768da387f0b5523cf4363ace2044089Nick Chalko                }
5795961816a768da387f0b5523cf4363ace2044089Nick Chalko            };
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
5995961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Returns the alpha value of the title view when it's deselected. */
6007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    public float getTitleViewAlphaDeselected() {
6107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        return mTitleViewAlphaDeselected;
6207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    }
6307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
6495961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Returns the scale value of the title view when it's selected. */
6507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    public float getTitleViewScaleSelected() {
6607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        return mTitleViewScaleSelected;
6707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    }
6807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public MenuRowView(Context context) {
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        this(context, null);
71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public MenuRowView(Context context, AttributeSet attrs) {
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        this(context, attrs, 0);
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public MenuRowView(Context context, AttributeSet attrs, int defStyleAttr) {
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        this(context, attrs, defStyleAttr, 0);
79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public MenuRowView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        super(context, attrs, defStyleAttr, defStyleRes);
8307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        Resources res = context.getResources();
84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        TypedValue outValue = new TypedValue();
8507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        res.getValue(R.dimen.menu_row_title_alpha_deselected, outValue, true);
8607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        mTitleViewAlphaDeselected = outValue.getFloat();
8707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        float textSizeSelected =
88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                res.getDimensionPixelSize(R.dimen.menu_row_title_text_size_selected);
8907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        float textSizeDeselected =
90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                res.getDimensionPixelSize(R.dimen.menu_row_title_text_size_deselected);
9107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        mTitleViewScaleSelected = textSizeSelected / textSizeDeselected;
92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected void onFinishInflate() {
96ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        super.onFinishInflate();
97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mTitleView = (TextView) findViewById(R.id.title);
98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mContentsView = findViewById(getContentsViewId());
99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (mContentsView.isFocusable()) {
100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mContentsView.setOnFocusChangeListener(mOnFocusChangeListener);
101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (mContentsView instanceof ViewGroup) {
103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            setOnFocusChangeListenerToChildren((ViewGroup) mContentsView);
104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
10507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        // Make contents view invisible in order that the view participates in the initial layout.
10607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        // The visibility is set to GONE after the first layout finishes.
10707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        // If not, we can't see the contents view animation for the first time it is shown.
10807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        // TODO: Find a better way to resolve this issue.
10907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        mContentsView.setVisibility(INVISIBLE);
110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void setOnFocusChangeListenerToChildren(ViewGroup parent) {
113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        int childCount = parent.getChildCount();
114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        for (int i = 0; i < childCount; ++i) {
115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            View child = parent.getChildAt(i);
116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (child.isFocusable()) {
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                child.setOnFocusChangeListener(mOnFocusChangeListener);
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (child instanceof ViewGroup) {
120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                setOnFocusChangeListenerToChildren((ViewGroup) child);
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
12595961816a768da387f0b5523cf4363ace2044089Nick Chalko    protected abstract int getContentsViewId();
126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
12795961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Returns the title view. */
12807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    public final TextView getTitleView() {
12907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        return mTitleView;
130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
131816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
13295961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Returns the contents view. */
13307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    public final View getContentsView() {
13407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        return mContentsView;
135816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
136816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
13895961816a768da387f0b5523cf4363ace2044089Nick Chalko     * Initialize this view. e.g. Set the initial selection. This method is called when the main
13995961816a768da387f0b5523cf4363ace2044089Nick Chalko     * menu is visible. Subclass of {@link MenuRowView} should override this to set correct
14095961816a768da387f0b5523cf4363ace2044089Nick Chalko     * mLastFocusView.
141816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     *
142816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * @param reason A reason why this is initialized. See {@link MenuShowReason}
143816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
144816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void initialize(@MenuShowReason int reason) {
145816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mLastFocusView = null;
146816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
14807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    protected Menu getMenu() {
14907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        return mRow == null ? null : mRow.getMenu();
150816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onBind(MenuRow row) {
153816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (DEBUG) Log.d(TAG, "onBind: row=" + row);
154816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mRow = row;
155816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mTitleView.setText(row.getTitle());
156816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
157816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
158816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
159816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
160816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Expand view here so initial focused item can be shown.
161816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return getInitialFocusView().requestFocus();
162816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
163816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
164816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @NonNull
165816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private View getInitialFocusView() {
166816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (mLastFocusView == null) {
167816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            return mContentsView;
168816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
169816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mLastFocusView;
170816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
171816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
172816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
17395961816a768da387f0b5523cf4363ace2044089Nick Chalko     * Sets the view which needs to have focus when this row appears. Subclasses should call this in
17495961816a768da387f0b5523cf4363ace2044089Nick Chalko     * {@link #initialize} if needed.
175816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
176816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected void setInitialFocusView(@NonNull View v) {
177816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mLastFocusView = v;
178816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
179816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
180816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
18195961816a768da387f0b5523cf4363ace2044089Nick Chalko     * Called when the focus of a child view is changed. The inherited class should override this
18295961816a768da387f0b5523cf4363ace2044089Nick Chalko     * method instead of calling {@link
18395961816a768da387f0b5523cf4363ace2044089Nick Chalko     * android.view.View#setOnFocusChangeListener(android.view.View.OnFocusChangeListener)}.
184816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
185816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected void onChildFocusChange(View v, boolean hasFocus) {
186816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (hasFocus) {
187816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mLastFocusView = v;
188816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
189816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
190816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
19195961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Returns the ID of row object bound to this view. */
192816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public String getRowId() {
193816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mRow == null ? null : mRow.getId();
194816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
19507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
19607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    /**
19707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko     * Called when this row is selected.
19807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko     *
19907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko     * @param showTitle If {@code true}, the title is not hidden immediately after the row is
20095961816a768da387f0b5523cf4363ace2044089Nick Chalko     *     selected even though hideTitleWhenSelected() is {@code true}.
20107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko     */
20207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    public void onSelected(boolean showTitle) {
20307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        if (mRow.hideTitleWhenSelected() && !showTitle) {
20407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            // Title view should participate in the layout even though it is not visible.
20507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            mTitleView.setVisibility(INVISIBLE);
20607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        } else {
20707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            mTitleView.setVisibility(VISIBLE);
20807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            mTitleView.setAlpha(1.0f);
20907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            mTitleView.setScaleX(mTitleViewScaleSelected);
21007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            mTitleView.setScaleY(mTitleViewScaleSelected);
21107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        }
2127d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        // Making the content view visible will cause it to set a focus item
2137d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        // So we store mLastFocusView and reset it
2147d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        View lastFocusView = mLastFocusView;
21507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        mContentsView.setVisibility(VISIBLE);
2167d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        mLastFocusView = lastFocusView;
21707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    }
21807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
21995961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Called when this row is deselected. */
22007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    public void onDeselected() {
22107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        mTitleView.setVisibility(VISIBLE);
22207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        mTitleView.setAlpha(mTitleViewAlphaDeselected);
22307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        mTitleView.setScaleX(1.0f);
22407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        mTitleView.setScaleY(1.0f);
22507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        mContentsView.setVisibility(GONE);
22607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    }
22707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
22895961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Returns the preferred height of the contents view. The top/bottom padding is excluded. */
22907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    public int getPreferredContentsHeight() {
23007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        return mRow.getHeight();
23107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    }
232816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
233