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