BaseRowSupportFragment.java revision 50cf9ada93e50e906f20f5edf595234ada196d45
145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake// CHECKSTYLE:OFF Generated code 245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake/* This file is auto-generated from BaseRowFragment.java. DO NOT MODIFY. */ 345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake/* 5c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake * Copyright (C) 2014 The Android Open Source Project 645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * 745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 8c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake * in compliance with the License. You may obtain a copy of the License at 945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * 1045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * http://www.apache.org/licenses/LICENSE-2.0 1145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * 1245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * Unless required by applicable law or agreed to in writing, software distributed under the License 1345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 1445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * or implied. See the License for the specific language governing permissions and limitations under 154bb142b1b712d8e67c81687d396685fba55abf77Andrew Svetlov * the License. 1645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake */ 1745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakepackage android.support.v17.leanback.app; 18c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake 19c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drakeimport android.support.v4.app.Fragment; 2045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.os.Bundle; 2145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.support.v17.leanback.widget.ItemBridgeAdapter; 2245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.support.v17.leanback.widget.ListRow; 2345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.support.v17.leanback.widget.ObjectAdapter; 24711a5bdc44823fde2935343cc33b15b19f49930dMartin v. Löwisimport android.support.v17.leanback.widget.OnChildViewHolderSelectedListener; 2545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.support.v17.leanback.widget.PresenterSelector; 2645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.support.v17.leanback.widget.Row; 2704f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hyltonimport android.support.v17.leanback.widget.VerticalGridView; 2804f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hyltonimport android.support.v7.widget.RecyclerView; 2945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.view.LayoutInflater; 3045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.view.View; 3145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.view.ViewGroup; 3245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 3345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake/** 3445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * An internal base class for a fragment containing a list of rows. 3545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake */ 3645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeabstract class BaseRowSupportFragment extends Fragment { 3745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake private static final String CURRENT_SELECTED_POSITION = "currentSelectedPosition"; 3845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake private ObjectAdapter mAdapter; 3945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake VerticalGridView mVerticalGridView; 4045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake private PresenterSelector mPresenterSelector; 4144627016da509b2bc59c38d7bf0ba592fe56a7a3Fred Drake final ItemBridgeAdapter mBridgeAdapter = new ItemBridgeAdapter(); 4245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake int mSelectedPosition = -1; 43c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake private boolean mPendingTransitionPrepare; 4445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake private LateSelectionObserver mLateSelectionObserver = new LateSelectionObserver(); 4545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 4616f6329e6153c4b92f2175a5560e372a762befe6Fred Drake abstract int getLayoutResourceId(); 4745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 48c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake private final OnChildViewHolderSelectedListener mRowSelectedListener = 4945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake new OnChildViewHolderSelectedListener() { 5045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake @Override 5145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake public void onChildViewHolderSelected(RecyclerView parent, 5245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake RecyclerView.ViewHolder view, int position, int subposition) { 534bb142b1b712d8e67c81687d396685fba55abf77Andrew Svetlov mSelectedPosition = position; 5445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake onRowSelected(parent, view, position, subposition); 5545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake } 5645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake }; 5745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 58c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake void onRowSelected(RecyclerView parent, RecyclerView.ViewHolder view, 5945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake int position, int subposition) { 6045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake } 6145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 6245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake @Override 63c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake public View onCreateView(LayoutInflater inflater, ViewGroup container, 64b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis Bundle savedInstanceState) { 654bb142b1b712d8e67c81687d396685fba55abf77Andrew Svetlov View view = inflater.inflate(getLayoutResourceId(), container, false); 66b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis mVerticalGridView = findGridViewFromRoot(view); 67b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis if (mPendingTransitionPrepare) { 68b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis mPendingTransitionPrepare = false; 69b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis onTransitionPrepare(); 70b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis } 71b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis return view; 7245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake } 7304f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hylton 7416f6329e6153c4b92f2175a5560e372a762befe6Fred Drake VerticalGridView findGridViewFromRoot(View view) { 75b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis return (VerticalGridView) view; 7645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake } 7745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 7804f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hylton @Override 79b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis public void onViewCreated(View view, Bundle savedInstanceState) { 8045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake if (savedInstanceState != null) { 8145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake mSelectedPosition = savedInstanceState.getInt(CURRENT_SELECTED_POSITION, -1); 8204f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hylton } 8304f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hylton setAdapterAndSelection(); 8445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake mVerticalGridView.setOnChildViewHolderSelectedListener(mRowSelectedListener); 8545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake } 8604f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hylton 87b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis /** 8845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * This class waits for the adapter to be updated before setting the selected 8945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * row. 9045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake */ 9104f4943d132d0d5e9829923706a2cb07a2b0ae9fMartin v. Löwis private class LateSelectionObserver extends RecyclerView.AdapterDataObserver { 9204f4943d132d0d5e9829923706a2cb07a2b0ae9fMartin v. Löwis boolean mIsLateSelection = false; 9304f4943d132d0d5e9829923706a2cb07a2b0ae9fMartin v. Löwis 946fd0b0d5bacb38ac88e74a767f11df2bb73ae49bFred Drake LateSelectionObserver() { 956fd0b0d5bacb38ac88e74a767f11df2bb73ae49bFred Drake } 96182b5aca27d376b08a2904bed42b751496f932f3Tim Peters 976fd0b0d5bacb38ac88e74a767f11df2bb73ae49bFred Drake @Override 986fd0b0d5bacb38ac88e74a767f11df2bb73ae49bFred Drake public void onChanged() { 99182b5aca27d376b08a2904bed42b751496f932f3Tim Peters performLateSelection(); 1006fd0b0d5bacb38ac88e74a767f11df2bb73ae49bFred Drake } 10145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 102c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake @Override 10345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake public void onItemRangeInserted(int positionStart, int itemCount) { 10445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake performLateSelection(); 10545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake } 10645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 10745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake void startLateSelection() { 10845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake mIsLateSelection = true; 10945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake mBridgeAdapter.registerAdapterDataObserver(this); 11045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake } 11145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 112c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake void performLateSelection() { 11345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake clear(); 114c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake if (mVerticalGridView != null) { 11545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake mVerticalGridView.setSelectedPosition(mSelectedPosition); 11645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake } 11745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake } 11845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake 11945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake void clear() { 12045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake if (mIsLateSelection) { 12145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake mIsLateSelection = false; 122962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis mBridgeAdapter.unregisterAdapterDataObserver(this); 123962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis } 124962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis } 125962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis } 126962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis 127962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis void setAdapterAndSelection() { 128962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis mVerticalGridView.setAdapter(mBridgeAdapter); 129962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis // We don't set the selected position unless we've data in the adapter. 130962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis boolean lateSelection = mBridgeAdapter.getItemCount() == 0 && mSelectedPosition >= 0; 131962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis if (lateSelection) { 132 mLateSelectionObserver.startLateSelection(); 133 } else if (mSelectedPosition >= 0) { 134 mVerticalGridView.setSelectedPosition(mSelectedPosition); 135 } 136 } 137 138 @Override 139 public void onDestroyView() { 140 super.onDestroyView(); 141 mLateSelectionObserver.clear(); 142 mVerticalGridView = null; 143 } 144 145 @Override 146 public void onSaveInstanceState(Bundle outState) { 147 super.onSaveInstanceState(outState); 148 outState.putInt(CURRENT_SELECTED_POSITION, mSelectedPosition); 149 } 150 151 /** 152 * Set the presenter selector used to create and bind views. 153 */ 154 public final void setPresenterSelector(PresenterSelector presenterSelector) { 155 mPresenterSelector = presenterSelector; 156 updateAdapter(); 157 } 158 159 /** 160 * Get the presenter selector used to create and bind views. 161 */ 162 public final PresenterSelector getPresenterSelector() { 163 return mPresenterSelector; 164 } 165 166 /** 167 * Sets the adapter for the fragment. 168 */ 169 public final void setAdapter(ObjectAdapter rowsAdapter) { 170 mAdapter = rowsAdapter; 171 updateAdapter(); 172 } 173 174 /** 175 * Returns the list of rows. 176 */ 177 public final ObjectAdapter getAdapter() { 178 return mAdapter; 179 } 180 181 /** 182 * Returns the bridge adapter. 183 */ 184 final ItemBridgeAdapter getBridgeAdapter() { 185 return mBridgeAdapter; 186 } 187 188 /** 189 * Sets the selected row position with smooth animation. 190 */ 191 public void setSelectedPosition(int position) { 192 setSelectedPosition(position, true); 193 } 194 195 /** 196 * Gets position of currently selected row. 197 * @return Position of currently selected row. 198 */ 199 public int getSelectedPosition() { 200 return mSelectedPosition; 201 } 202 203 /** 204 * Sets the selected row position. 205 */ 206 public void setSelectedPosition(int position, boolean smooth) { 207 if (mSelectedPosition == position) { 208 return; 209 } 210 mSelectedPosition = position; 211 if (mVerticalGridView != null) { 212 if (mLateSelectionObserver.mIsLateSelection) { 213 return; 214 } 215 if (smooth) { 216 mVerticalGridView.setSelectedPositionSmooth(position); 217 } else { 218 mVerticalGridView.setSelectedPosition(position); 219 } 220 } 221 } 222 223 public final VerticalGridView getVerticalGridView() { 224 return mVerticalGridView; 225 } 226 227 void updateAdapter() { 228 mBridgeAdapter.setAdapter(mAdapter); 229 mBridgeAdapter.setPresenter(mPresenterSelector); 230 231 if (mVerticalGridView != null) { 232 setAdapterAndSelection(); 233 } 234 } 235 236 Object getItem(Row row, int position) { 237 if (row instanceof ListRow) { 238 return ((ListRow) row).getAdapter().get(position); 239 } else { 240 return null; 241 } 242 } 243 244 public boolean onTransitionPrepare() { 245 if (mVerticalGridView != null) { 246 mVerticalGridView.setAnimateChildLayout(false); 247 mVerticalGridView.setScrollEnabled(false); 248 return true; 249 } 250 mPendingTransitionPrepare = true; 251 return false; 252 } 253 254 public void onTransitionStart() { 255 if (mVerticalGridView != null) { 256 mVerticalGridView.setPruneChild(false); 257 mVerticalGridView.setLayoutFrozen(true); 258 mVerticalGridView.setFocusSearchDisabled(true); 259 } 260 } 261 262 public void onTransitionEnd() { 263 // be careful that fragment might be destroyed before header transition ends. 264 if (mVerticalGridView != null) { 265 mVerticalGridView.setLayoutFrozen(false); 266 mVerticalGridView.setAnimateChildLayout(true); 267 mVerticalGridView.setPruneChild(true); 268 mVerticalGridView.setFocusSearchDisabled(false); 269 mVerticalGridView.setScrollEnabled(true); 270 } 271 } 272 273 public void setAlignment(int windowAlignOffsetTop) { 274 if (mVerticalGridView != null) { 275 // align the top edge of item 276 mVerticalGridView.setItemAlignmentOffset(0); 277 mVerticalGridView.setItemAlignmentOffsetPercent( 278 VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 279 280 // align to a fixed position from top 281 mVerticalGridView.setWindowAlignmentOffset(windowAlignOffsetTop); 282 mVerticalGridView.setWindowAlignmentOffsetPercent( 283 VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 284 mVerticalGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 285 } 286 } 287} 288