DetailsFragment.java revision d1adbdcb44a48e142d28a93189c57edfe62d93ce
1c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn/* 2c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Copyright (C) 2014 The Android Open Source Project 3c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * 4c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * in compliance with the License. You may obtain a copy of the License at 6c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * 7c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * http://www.apache.org/licenses/LICENSE-2.0 8c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * 9c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Unless required by applicable law or agreed to in writing, software distributed under the License 10c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * or implied. See the License for the specific language governing permissions and limitations under 12c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * the License. 13c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 14c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournpackage android.support.v17.leanback.app; 15c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 16c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.R; 17c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.ObjectAdapter; 18c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.OnItemClickedListener; 19c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.OnItemSelectedListener; 20dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.OnItemViewClickedListener; 21dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.OnItemViewSelectedListener; 22dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.Presenter; 23c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.Row; 24dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.RowPresenter; 25c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.VerticalGridView; 26c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.app.Fragment; 27c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.os.Bundle; 28c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.LayoutInflater; 29c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.View; 30c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.ViewGroup; 31c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 32c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn/** 33c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Wrapper fragment for leanback details screens. 34c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 35c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournpublic class DetailsFragment extends Fragment { 36c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private static final String TAG = "DetailsFragment"; 37c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private static boolean DEBUG = false; 38c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 39b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu private RowsFragment mRowsFragment; 40c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 41b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu private ObjectAdapter mAdapter; 42c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private int mContainerListAlignTop; 43c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private OnItemSelectedListener mExternalOnItemSelectedListener; 44b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu private OnItemClickedListener mOnItemClickedListener; 45dc9b5676ab337317154fa7702033ae174617525bDake Gu private OnItemViewSelectedListener mExternalOnItemViewSelectedListener; 46dc9b5676ab337317154fa7702033ae174617525bDake Gu private OnItemViewClickedListener mOnItemViewClickedListener; 47c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private int mSelectedPosition = -1; 48c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 49c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 50c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets the list of rows for the fragment. 51c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 52c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void setAdapter(ObjectAdapter adapter) { 53b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mAdapter = adapter; 54b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu if (mRowsFragment != null) { 55b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment.setAdapter(adapter); 56b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu } 57c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 58c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 59c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 60c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Returns the list of rows. 61c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 62c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public ObjectAdapter getAdapter() { 63b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu return mAdapter; 64c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 65c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 66c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 67c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets an item selection listener. 68dc9b5676ab337317154fa7702033ae174617525bDake Gu * @deprecated Use {@link #setOnItemViewSelectedListener(OnItemViewSelectedListener)} 69c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 70c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void setOnItemSelectedListener(OnItemSelectedListener listener) { 71c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mExternalOnItemSelectedListener = listener; 72c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 73c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 74c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 75c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets an item Clicked listener. 76dc9b5676ab337317154fa7702033ae174617525bDake Gu * @deprecated Use {@link #setOnItemViewClickedListener(OnItemViewClickedListener)} 77c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 78c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void setOnItemClickedListener(OnItemClickedListener listener) { 79b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mOnItemClickedListener = listener; 80b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu if (mRowsFragment != null) { 81b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment.setOnItemClickedListener(listener); 82b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu } 83c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 84c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 85c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 86dc9b5676ab337317154fa7702033ae174617525bDake Gu * Sets an item selection listener. 87dc9b5676ab337317154fa7702033ae174617525bDake Gu */ 88dc9b5676ab337317154fa7702033ae174617525bDake Gu public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) { 89dc9b5676ab337317154fa7702033ae174617525bDake Gu mExternalOnItemViewSelectedListener = listener; 90dc9b5676ab337317154fa7702033ae174617525bDake Gu } 91dc9b5676ab337317154fa7702033ae174617525bDake Gu 92dc9b5676ab337317154fa7702033ae174617525bDake Gu /** 93dc9b5676ab337317154fa7702033ae174617525bDake Gu * Sets an item Clicked listener. 94dc9b5676ab337317154fa7702033ae174617525bDake Gu */ 95dc9b5676ab337317154fa7702033ae174617525bDake Gu public void setOnItemViewClickedListener(OnItemViewClickedListener listener) { 96dc9b5676ab337317154fa7702033ae174617525bDake Gu mOnItemViewClickedListener = listener; 97dc9b5676ab337317154fa7702033ae174617525bDake Gu if (mRowsFragment != null) { 98dc9b5676ab337317154fa7702033ae174617525bDake Gu mRowsFragment.setOnItemViewClickedListener(listener); 99dc9b5676ab337317154fa7702033ae174617525bDake Gu } 100dc9b5676ab337317154fa7702033ae174617525bDake Gu } 101dc9b5676ab337317154fa7702033ae174617525bDake Gu 102dc9b5676ab337317154fa7702033ae174617525bDake Gu /** 103c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Returns the item Clicked listener. 104dc9b5676ab337317154fa7702033ae174617525bDake Gu * @deprecated Use {@link #getOnItemViewClickedListener()} 105c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 106c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public OnItemClickedListener getOnItemClickedListener() { 107b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu return mOnItemClickedListener; 108c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 109c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 110dc9b5676ab337317154fa7702033ae174617525bDake Gu /** 111dc9b5676ab337317154fa7702033ae174617525bDake Gu * Returns the item Clicked listener. 112dc9b5676ab337317154fa7702033ae174617525bDake Gu */ 113dc9b5676ab337317154fa7702033ae174617525bDake Gu public OnItemViewClickedListener getOnItemViewClickedListener() { 114dc9b5676ab337317154fa7702033ae174617525bDake Gu return mOnItemViewClickedListener; 115dc9b5676ab337317154fa7702033ae174617525bDake Gu } 116dc9b5676ab337317154fa7702033ae174617525bDake Gu 117c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 118c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onCreate(Bundle savedInstanceState) { 119c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onCreate(savedInstanceState); 120c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 121c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mContainerListAlignTop = 122c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top); 123c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 124c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 125c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 126c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public View onCreateView(LayoutInflater inflater, ViewGroup container, 127c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn Bundle savedInstanceState) { 128b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu View view = inflater.inflate(R.layout.lb_details_fragment, container, false); 1291caf420879768ae8aebe8c27546707a28f3bb659Craig Stout mRowsFragment = (RowsFragment) getChildFragmentManager().findFragmentById( 1301caf420879768ae8aebe8c27546707a28f3bb659Craig Stout R.id.fragment_dock); 1311caf420879768ae8aebe8c27546707a28f3bb659Craig Stout if (mRowsFragment == null) { 132b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment = new RowsFragment(); 133b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu getChildFragmentManager().beginTransaction() 1341caf420879768ae8aebe8c27546707a28f3bb659Craig Stout .replace(R.id.fragment_dock, mRowsFragment).commit(); 135b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu } 1366c3b0b3d19683ea8c4069ec761f14dc2c7b8c5dcCraig Stout mRowsFragment.setAdapter(mAdapter); 137dc9b5676ab337317154fa7702033ae174617525bDake Gu mRowsFragment.setOnItemViewSelectedListener(mRowSelectedListener); 138b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment.setOnItemClickedListener(mOnItemClickedListener); 139dc9b5676ab337317154fa7702033ae174617525bDake Gu mRowsFragment.setOnItemViewClickedListener(mOnItemViewClickedListener); 140b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu return view; 141c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 142c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 143dc9b5676ab337317154fa7702033ae174617525bDake Gu private OnItemViewSelectedListener mRowSelectedListener = new OnItemViewSelectedListener() { 144c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 145dc9b5676ab337317154fa7702033ae174617525bDake Gu public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 146dc9b5676ab337317154fa7702033ae174617525bDake Gu RowPresenter.ViewHolder rowViewHolder, Row row) { 147c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn if (mExternalOnItemSelectedListener != null) { 148c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mExternalOnItemSelectedListener.onItemSelected(item, row); 149c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 150dc9b5676ab337317154fa7702033ae174617525bDake Gu if (mExternalOnItemViewSelectedListener != null) { 151dc9b5676ab337317154fa7702033ae174617525bDake Gu mExternalOnItemViewSelectedListener.onItemSelected(itemViewHolder, item, 152dc9b5676ab337317154fa7702033ae174617525bDake Gu rowViewHolder, row); 153dc9b5676ab337317154fa7702033ae174617525bDake Gu } 154c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 155c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn }; 156c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 1577ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout void setVerticalGridViewLayout(VerticalGridView listview) { 158c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn // align the top edge of item to a fixed position 159c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setItemAlignmentOffset(0); 160c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 161c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignmentOffset(mContainerListAlignTop); 162c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 163c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 164c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 165c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 1667ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout VerticalGridView getVerticalGridView() { 1677ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout return mRowsFragment == null ? null : mRowsFragment.getVerticalGridView(); 1687ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout } 1697ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout 170d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout RowsFragment getRowsFragment() { 171d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout return mRowsFragment; 172d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 173d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 174c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 175c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Setup dimensions that are only meaningful when the child Fragments are inside 176c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * DetailsFragment. 177c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 178c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private void setupChildFragmentLayout() { 1797ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout setVerticalGridViewLayout(mRowsFragment.getVerticalGridView()); 180c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 181c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 182c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 183c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onStart() { 184c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onStart(); 185c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn setupChildFragmentLayout(); 186c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mRowsFragment.getView().requestFocus(); 187c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 188c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn} 189