DetailsFragment.java revision c3047aae5913bf0f79ed65e2d4b6b74ca38d53de
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 37c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private final RowsFragment mRowsFragment = new RowsFragment(); 38c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 39c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private int mContainerListMarginLeft; 40c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private int mContainerListWidth; 41c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private int mContainerListAlignTop; 42c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private OnItemSelectedListener mExternalOnItemSelectedListener; 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) { 49c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mRowsFragment.setAdapter(adapter); 50c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 51c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 52c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 53c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Returns the list of rows. 54c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 55c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public ObjectAdapter getAdapter() { 56c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn return mRowsFragment.getAdapter(); 57c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 58c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 59c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 60c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets an item selection listener. 61c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 62c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void setOnItemSelectedListener(OnItemSelectedListener listener) { 63c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mExternalOnItemSelectedListener = listener; 64c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 65c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 66c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 67c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Sets an item Clicked listener. 68c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 69c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void setOnItemClickedListener(OnItemClickedListener listener) { 70c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mRowsFragment.setOnItemClickedListener(listener); 71c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 72c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 73c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 74c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Returns the item Clicked listener. 75c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 76c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public OnItemClickedListener getOnItemClickedListener() { 77c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn return mRowsFragment.getOnItemClickedListener(); 78c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 79c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 80c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 81c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onCreate(Bundle savedInstanceState) { 82c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onCreate(savedInstanceState); 83c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 84c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mContainerListMarginLeft = (int) getResources().getDimension( 85c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn R.dimen.lb_details_rows_margin_left); 86c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mContainerListWidth = getResources().getDimensionPixelSize(R.dimen.lb_details_rows_width); 87c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mContainerListAlignTop = 88c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top); 89c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 90c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 91c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 92c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public View onCreateView(LayoutInflater inflater, ViewGroup container, 93c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn Bundle savedInstanceState) { 94c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn return inflater.inflate(R.layout.lb_details_fragment, container, false); 95c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 96c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 97c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private OnItemSelectedListener mRowSelectedListener = new OnItemSelectedListener() { 98c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 99c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onItemSelected(Object item, Row row) { 100c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn if (mExternalOnItemSelectedListener != null) { 101c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mExternalOnItemSelectedListener.onItemSelected(item, row); 102c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 103c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 104c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn }; 105c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 106c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 107c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onActivityCreated(Bundle savedInstanceState) { 108c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onActivityCreated(savedInstanceState); 109c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 110c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn if (getChildFragmentManager().findFragmentById(R.id.details_container_dock) == null) { 111c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn getChildFragmentManager().beginTransaction() 112c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn .replace(R.id.details_container_dock, mRowsFragment).commit(); 113c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mRowsFragment.setOnItemSelectedListener(mRowSelectedListener); 114c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 115c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 116c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 117c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private void setVerticalGridViewLayout(VerticalGridView listview) { 118c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn // align the top edge of item to a fixed position 119c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setItemAlignmentOffset(0); 120c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 121c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignmentOffset(mContainerListAlignTop); 122c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 123c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 124c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn } 125c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 126c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn /** 127c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Setup dimensions that are only meaningful when the child Fragments are inside 128c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * DetailsFragment. 129c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 130c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn private void setupChildFragmentLayout() { 131c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn VerticalGridView containerList = mRowsFragment.getVerticalGridView(); 132c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn setVerticalGridViewLayout(containerList); 133c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 134c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mRowsFragment.getVerticalGridView().getLayoutParams().width = mContainerListWidth; 135c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn mRowsFragment.getVerticalGridView().requestLayout(); 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