DetailsFragment.java revision 1caf420879768ae8aebe8c27546707a28f3bb659
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.OnChildSelectedListener; 19c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.OnItemClickedListener; 20c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.OnItemSelectedListener; 21c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.Row; 22c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.VerticalGridView; 23c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.util.Log; 24c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.app.Fragment; 25c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.os.Bundle; 26c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.LayoutInflater; 27c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.View; 28c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.ViewGroup; 29c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 30c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn/** 31c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Wrapper fragment for leanback details screens. 32c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 33c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournpublic class DetailsFragment extends Fragment { 34c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private static final String TAG = "DetailsFragment"; 35c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private static boolean DEBUG = false; 36c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 37b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu private RowsFragment mRowsFragment; 38c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 39b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu private ObjectAdapter mAdapter; 40c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private int mContainerListAlignTop; 41c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private OnItemSelectedListener mExternalOnItemSelectedListener; 42b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu private OnItemClickedListener mOnItemClickedListener; 43c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private int mSelectedPosition = -1; 44c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 45c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 46c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets the list of rows for the fragment. 47c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 48c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void setAdapter(ObjectAdapter adapter) { 49b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mAdapter = adapter; 50b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu if (mRowsFragment != null) { 51b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment.setAdapter(adapter); 52b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu } 53c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 54c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 55c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 56c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Returns the list of rows. 57c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 58c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public ObjectAdapter getAdapter() { 59b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu return mAdapter; 60c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 61c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 62c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 63c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets an item selection listener. 64c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 65c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void setOnItemSelectedListener(OnItemSelectedListener listener) { 66c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mExternalOnItemSelectedListener = listener; 67c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 68c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 69c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 70c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets an item Clicked listener. 71c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 72c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void setOnItemClickedListener(OnItemClickedListener listener) { 73b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mOnItemClickedListener = listener; 74b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu if (mRowsFragment != null) { 75b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment.setOnItemClickedListener(listener); 76b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu } 77c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 78c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 79c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 80c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Returns the item Clicked listener. 81c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 82c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public OnItemClickedListener getOnItemClickedListener() { 83b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu return mOnItemClickedListener; 84c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 85c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 86c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 87c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onCreate(Bundle savedInstanceState) { 88c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onCreate(savedInstanceState); 89c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 90c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mContainerListAlignTop = 91c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top); 92c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 93c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 94c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 95c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public View onCreateView(LayoutInflater inflater, ViewGroup container, 96c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn Bundle savedInstanceState) { 97b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu View view = inflater.inflate(R.layout.lb_details_fragment, container, false); 981caf420879768ae8aebe8c27546707a28f3bb659Craig Stout mRowsFragment = (RowsFragment) getChildFragmentManager().findFragmentById( 991caf420879768ae8aebe8c27546707a28f3bb659Craig Stout R.id.fragment_dock); 1001caf420879768ae8aebe8c27546707a28f3bb659Craig Stout if (mRowsFragment == null) { 101b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment = new RowsFragment(); 102b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu getChildFragmentManager().beginTransaction() 1031caf420879768ae8aebe8c27546707a28f3bb659Craig Stout .replace(R.id.fragment_dock, mRowsFragment).commit(); 104b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu } 105b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment.setOnItemSelectedListener(mRowSelectedListener); 106b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment.setOnItemClickedListener(mOnItemClickedListener); 107b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu mRowsFragment.setAdapter(mAdapter); 108b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu return view; 109c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 110c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 111c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private OnItemSelectedListener mRowSelectedListener = new OnItemSelectedListener() { 112c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 113c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onItemSelected(Object item, Row row) { 114c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn if (mExternalOnItemSelectedListener != null) { 115c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mExternalOnItemSelectedListener.onItemSelected(item, row); 116c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 117c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 118c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn }; 119c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 120c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private void setVerticalGridViewLayout(VerticalGridView listview) { 121c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn // align the top edge of item to a fixed position 122c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setItemAlignmentOffset(0); 123c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 124c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignmentOffset(mContainerListAlignTop); 125c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 126c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 127c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 128c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 129c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 130c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Setup dimensions that are only meaningful when the child Fragments are inside 131c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * DetailsFragment. 132c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 133c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private void setupChildFragmentLayout() { 134c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn VerticalGridView containerList = mRowsFragment.getVerticalGridView(); 135c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn setVerticalGridViewLayout(containerList); 136c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 137c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 138c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 139c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onStart() { 140c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onStart(); 141c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn setupChildFragmentLayout(); 142c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mRowsFragment.getView().requestFocus(); 143c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 144c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn} 145