1/* This file is auto-generated from BaseRowFragment.java. DO NOT MODIFY. */ 2 3/* 4 * Copyright (C) 2014 The Android Open Source Project 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 7 * in compliance with the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software distributed under the License 12 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 13 * or implied. See the License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16package android.support.v17.leanback.app; 17 18import android.support.v4.app.Fragment; 19import android.os.Bundle; 20import android.support.v17.leanback.widget.ObjectAdapter; 21import android.support.v17.leanback.widget.PresenterSelector; 22import android.support.v17.leanback.widget.ItemBridgeAdapter; 23import android.support.v17.leanback.widget.VerticalGridView; 24import android.support.v17.leanback.widget.Row; 25import android.support.v17.leanback.widget.ListRow; 26import android.support.v17.leanback.widget.OnChildViewHolderSelectedListener; 27import android.support.v7.widget.RecyclerView; 28import android.view.LayoutInflater; 29import android.view.View; 30import android.view.ViewGroup; 31 32/** 33 * An internal base class for a fragment containing a list of rows. 34 */ 35abstract class BaseRowSupportFragment extends Fragment { 36 private ObjectAdapter mAdapter; 37 private VerticalGridView mVerticalGridView; 38 private PresenterSelector mPresenterSelector; 39 private ItemBridgeAdapter mBridgeAdapter; 40 private int mSelectedPosition = -1; 41 private boolean mPendingTransitionPrepare; 42 43 abstract int getLayoutResourceId(); 44 45 private final OnChildViewHolderSelectedListener mRowSelectedListener = 46 new OnChildViewHolderSelectedListener() { 47 @Override 48 public void onChildViewHolderSelected(RecyclerView parent, 49 RecyclerView.ViewHolder view, int position, int subposition) { 50 onRowSelected(parent, view, position, subposition); 51 } 52 }; 53 54 void onRowSelected(RecyclerView parent, RecyclerView.ViewHolder view, 55 int position, int subposition) { 56 } 57 58 @Override 59 public View onCreateView(LayoutInflater inflater, ViewGroup container, 60 Bundle savedInstanceState) { 61 View view = inflater.inflate(getLayoutResourceId(), container, false); 62 mVerticalGridView = findGridViewFromRoot(view); 63 if (mPendingTransitionPrepare) { 64 mPendingTransitionPrepare = false; 65 onTransitionPrepare(); 66 } 67 return view; 68 } 69 70 VerticalGridView findGridViewFromRoot(View view) { 71 return (VerticalGridView) view; 72 } 73 74 @Override 75 public void onViewCreated(View view, Bundle savedInstanceState) { 76 if (mBridgeAdapter != null) { 77 mVerticalGridView.setAdapter(mBridgeAdapter); 78 if (mSelectedPosition != -1) { 79 mVerticalGridView.setSelectedPosition(mSelectedPosition); 80 } 81 } 82 mVerticalGridView.setOnChildViewHolderSelectedListener(mRowSelectedListener); 83 } 84 85 @Override 86 public void onDestroyView() { 87 super.onDestroyView(); 88 mVerticalGridView = null; 89 } 90 91 /** 92 * Set the presenter selector used to create and bind views. 93 */ 94 public final void setPresenterSelector(PresenterSelector presenterSelector) { 95 mPresenterSelector = presenterSelector; 96 updateAdapter(); 97 } 98 99 /** 100 * Get the presenter selector used to create and bind views. 101 */ 102 public final PresenterSelector getPresenterSelector() { 103 return mPresenterSelector; 104 } 105 106 /** 107 * Sets the adapter for the fragment. 108 */ 109 public final void setAdapter(ObjectAdapter rowsAdapter) { 110 mAdapter = rowsAdapter; 111 updateAdapter(); 112 } 113 114 /** 115 * Returns the list of rows. 116 */ 117 public final ObjectAdapter getAdapter() { 118 return mAdapter; 119 } 120 121 /** 122 * Returns the bridge adapter. 123 */ 124 final ItemBridgeAdapter getBridgeAdapter() { 125 return mBridgeAdapter; 126 } 127 128 /** 129 * Sets the selected row position with smooth animation. 130 */ 131 public void setSelectedPosition(int position) { 132 setSelectedPosition(position, true); 133 } 134 135 /** 136 * Sets the selected row position. 137 */ 138 public void setSelectedPosition(int position, boolean smooth) { 139 mSelectedPosition = position; 140 if(mVerticalGridView != null && mVerticalGridView.getAdapter() != null) { 141 if (smooth) { 142 mVerticalGridView.setSelectedPositionSmooth(position); 143 } else { 144 mVerticalGridView.setSelectedPosition(position); 145 } 146 } 147 } 148 149 final VerticalGridView getVerticalGridView() { 150 return mVerticalGridView; 151 } 152 153 void updateAdapter() { 154 if (mBridgeAdapter != null) { 155 // detach observer from ObjectAdapter 156 mBridgeAdapter.clear(); 157 mBridgeAdapter = null; 158 } 159 160 if (mAdapter != null) { 161 // If presenter selector is null, adapter ps will be used 162 mBridgeAdapter = new ItemBridgeAdapter(mAdapter, mPresenterSelector); 163 } 164 if (mVerticalGridView != null) { 165 mVerticalGridView.setAdapter(mBridgeAdapter); 166 if (mBridgeAdapter != null && mSelectedPosition != -1) { 167 mVerticalGridView.setSelectedPosition(mSelectedPosition); 168 } 169 } 170 } 171 172 Object getItem(Row row, int position) { 173 if (row instanceof ListRow) { 174 return ((ListRow) row).getAdapter().get(position); 175 } else { 176 return null; 177 } 178 } 179 180 boolean onTransitionPrepare() { 181 if (mVerticalGridView != null) { 182 mVerticalGridView.setAnimateChildLayout(false); 183 mVerticalGridView.setScrollEnabled(false); 184 return true; 185 } 186 mPendingTransitionPrepare = true; 187 return false; 188 } 189 190 void onTransitionStart() { 191 if (mVerticalGridView != null) { 192 mVerticalGridView.setPruneChild(false); 193 mVerticalGridView.setLayoutFrozen(true); 194 mVerticalGridView.setFocusSearchDisabled(true); 195 } 196 } 197 198 void onTransitionEnd() { 199 // be careful that fragment might be destroyed before header transition ends. 200 if (mVerticalGridView != null) { 201 mVerticalGridView.setLayoutFrozen(false); 202 mVerticalGridView.setAnimateChildLayout(true); 203 mVerticalGridView.setPruneChild(true); 204 mVerticalGridView.setFocusSearchDisabled(false); 205 mVerticalGridView.setScrollEnabled(true); 206 } 207 } 208 209 void setItemAlignment() { 210 if (mVerticalGridView != null) { 211 // align the top edge of item 212 mVerticalGridView.setItemAlignmentOffset(0); 213 mVerticalGridView.setItemAlignmentOffsetPercent( 214 VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 215 } 216 } 217 218 void setWindowAlignmentFromTop(int alignedTop) { 219 if (mVerticalGridView != null) { 220 // align to a fixed position from top 221 mVerticalGridView.setWindowAlignmentOffset(alignedTop); 222 mVerticalGridView.setWindowAlignmentOffsetPercent( 223 VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 224 mVerticalGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 225 } 226 } 227} 228