BaseRowFragment.java revision ac5fe7c617c66850fff75a9fce9979c6e5674b0f
1// CHECKSTYLE:OFF Generated code 2/* This file is auto-generated from BaseRowSupportFragment.java. DO NOT MODIFY. */ 3 4/* 5 * Copyright (C) 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 8 * in compliance with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software distributed under the License 13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 14 * or implied. See the License for the specific language governing permissions and limitations under 15 * the License. 16 */ 17package androidx.leanback.app; 18 19import android.os.Bundle; 20import androidx.annotation.NonNull; 21import androidx.annotation.Nullable; 22import androidx.leanback.widget.ItemBridgeAdapter; 23import androidx.leanback.widget.ListRow; 24import androidx.leanback.widget.ObjectAdapter; 25import androidx.leanback.widget.OnChildViewHolderSelectedListener; 26import androidx.leanback.widget.PresenterSelector; 27import androidx.leanback.widget.Row; 28import androidx.leanback.widget.VerticalGridView; 29import android.app.Fragment; 30import androidx.recyclerview.widget.RecyclerView; 31import android.view.LayoutInflater; 32import android.view.View; 33import android.view.ViewGroup; 34 35/** 36 * An internal base class for a fragment containing a list of rows. 37 * @deprecated use {@link BaseRowSupportFragment} 38 */ 39@Deprecated 40abstract class BaseRowFragment extends Fragment { 41 private static final String CURRENT_SELECTED_POSITION = "currentSelectedPosition"; 42 private ObjectAdapter mAdapter; 43 VerticalGridView mVerticalGridView; 44 private PresenterSelector mPresenterSelector; 45 final ItemBridgeAdapter mBridgeAdapter = new ItemBridgeAdapter(); 46 int mSelectedPosition = -1; 47 private boolean mPendingTransitionPrepare; 48 private LateSelectionObserver mLateSelectionObserver = new LateSelectionObserver(); 49 50 abstract int getLayoutResourceId(); 51 52 private final OnChildViewHolderSelectedListener mRowSelectedListener = 53 new OnChildViewHolderSelectedListener() { 54 @Override 55 public void onChildViewHolderSelected(RecyclerView parent, 56 RecyclerView.ViewHolder view, int position, int subposition) { 57 if (!mLateSelectionObserver.mIsLateSelection) { 58 mSelectedPosition = position; 59 onRowSelected(parent, view, position, subposition); 60 } 61 } 62 }; 63 64 void onRowSelected(RecyclerView parent, RecyclerView.ViewHolder view, 65 int position, int subposition) { 66 } 67 68 @Override 69 public View onCreateView(LayoutInflater inflater, ViewGroup container, 70 Bundle savedInstanceState) { 71 View view = inflater.inflate(getLayoutResourceId(), container, false); 72 mVerticalGridView = findGridViewFromRoot(view); 73 if (mPendingTransitionPrepare) { 74 mPendingTransitionPrepare = false; 75 onTransitionPrepare(); 76 } 77 return view; 78 } 79 80 VerticalGridView findGridViewFromRoot(View view) { 81 return (VerticalGridView) view; 82 } 83 84 @Override 85 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 86 if (savedInstanceState != null) { 87 mSelectedPosition = savedInstanceState.getInt(CURRENT_SELECTED_POSITION, -1); 88 } 89 setAdapterAndSelection(); 90 mVerticalGridView.setOnChildViewHolderSelectedListener(mRowSelectedListener); 91 } 92 93 /** 94 * This class waits for the adapter to be updated before setting the selected 95 * row. 96 */ 97 private class LateSelectionObserver extends RecyclerView.AdapterDataObserver { 98 boolean mIsLateSelection = false; 99 100 LateSelectionObserver() { 101 } 102 103 @Override 104 public void onChanged() { 105 performLateSelection(); 106 } 107 108 @Override 109 public void onItemRangeInserted(int positionStart, int itemCount) { 110 performLateSelection(); 111 } 112 113 void startLateSelection() { 114 mIsLateSelection = true; 115 mBridgeAdapter.registerAdapterDataObserver(this); 116 } 117 118 void performLateSelection() { 119 clear(); 120 if (mVerticalGridView != null) { 121 mVerticalGridView.setSelectedPosition(mSelectedPosition); 122 } 123 } 124 125 void clear() { 126 if (mIsLateSelection) { 127 mIsLateSelection = false; 128 mBridgeAdapter.unregisterAdapterDataObserver(this); 129 } 130 } 131 } 132 133 void setAdapterAndSelection() { 134 if (mAdapter == null) { 135 // delay until ItemBridgeAdapter has wrappedAdapter. Once we assign ItemBridgeAdapter 136 // to RecyclerView, it will not be allowed to change "hasStableId" to true. 137 return; 138 } 139 if (mVerticalGridView.getAdapter() != mBridgeAdapter) { 140 // avoid extra layout if ItemBridgeAdapter was already set. 141 mVerticalGridView.setAdapter(mBridgeAdapter); 142 } 143 // We don't set the selected position unless we've data in the adapter. 144 boolean lateSelection = mBridgeAdapter.getItemCount() == 0 && mSelectedPosition >= 0; 145 if (lateSelection) { 146 mLateSelectionObserver.startLateSelection(); 147 } else if (mSelectedPosition >= 0) { 148 mVerticalGridView.setSelectedPosition(mSelectedPosition); 149 } 150 } 151 152 @Override 153 public void onDestroyView() { 154 super.onDestroyView(); 155 mLateSelectionObserver.clear(); 156 mVerticalGridView = null; 157 } 158 159 @Override 160 public void onSaveInstanceState(Bundle outState) { 161 super.onSaveInstanceState(outState); 162 outState.putInt(CURRENT_SELECTED_POSITION, mSelectedPosition); 163 } 164 165 /** 166 * Set the presenter selector used to create and bind views. 167 */ 168 public final void setPresenterSelector(PresenterSelector presenterSelector) { 169 if (mPresenterSelector != presenterSelector) { 170 mPresenterSelector = presenterSelector; 171 updateAdapter(); 172 } 173 } 174 175 /** 176 * Get the presenter selector used to create and bind views. 177 */ 178 public final PresenterSelector getPresenterSelector() { 179 return mPresenterSelector; 180 } 181 182 /** 183 * Sets the adapter that represents a list of rows. 184 * @param rowsAdapter Adapter that represents list of rows. 185 */ 186 public final void setAdapter(ObjectAdapter rowsAdapter) { 187 if (mAdapter != rowsAdapter) { 188 mAdapter = rowsAdapter; 189 updateAdapter(); 190 } 191 } 192 193 /** 194 * Returns the Adapter that represents list of rows. 195 * @return Adapter that represents list of rows. 196 */ 197 public final ObjectAdapter getAdapter() { 198 return mAdapter; 199 } 200 201 /** 202 * Returns the RecyclerView.Adapter that wraps {@link #getAdapter()}. 203 * @return The RecyclerView.Adapter that wraps {@link #getAdapter()}. 204 */ 205 public final ItemBridgeAdapter getBridgeAdapter() { 206 return mBridgeAdapter; 207 } 208 209 /** 210 * Sets the selected row position with smooth animation. 211 */ 212 public void setSelectedPosition(int position) { 213 setSelectedPosition(position, true); 214 } 215 216 /** 217 * Gets position of currently selected row. 218 * @return Position of currently selected row. 219 */ 220 public int getSelectedPosition() { 221 return mSelectedPosition; 222 } 223 224 /** 225 * Sets the selected row position. 226 */ 227 public void setSelectedPosition(int position, boolean smooth) { 228 if (mSelectedPosition == position) { 229 return; 230 } 231 mSelectedPosition = position; 232 if (mVerticalGridView != null) { 233 if (mLateSelectionObserver.mIsLateSelection) { 234 return; 235 } 236 if (smooth) { 237 mVerticalGridView.setSelectedPositionSmooth(position); 238 } else { 239 mVerticalGridView.setSelectedPosition(position); 240 } 241 } 242 } 243 244 public final VerticalGridView getVerticalGridView() { 245 return mVerticalGridView; 246 } 247 248 void updateAdapter() { 249 mBridgeAdapter.setAdapter(mAdapter); 250 mBridgeAdapter.setPresenter(mPresenterSelector); 251 252 if (mVerticalGridView != null) { 253 setAdapterAndSelection(); 254 } 255 } 256 257 Object getItem(Row row, int position) { 258 if (row instanceof ListRow) { 259 return ((ListRow) row).getAdapter().get(position); 260 } else { 261 return null; 262 } 263 } 264 265 public boolean onTransitionPrepare() { 266 if (mVerticalGridView != null) { 267 mVerticalGridView.setAnimateChildLayout(false); 268 mVerticalGridView.setScrollEnabled(false); 269 return true; 270 } 271 mPendingTransitionPrepare = true; 272 return false; 273 } 274 275 public void onTransitionStart() { 276 if (mVerticalGridView != null) { 277 mVerticalGridView.setPruneChild(false); 278 mVerticalGridView.setLayoutFrozen(true); 279 mVerticalGridView.setFocusSearchDisabled(true); 280 } 281 } 282 283 public void onTransitionEnd() { 284 // be careful that fragment might be destroyed before header transition ends. 285 if (mVerticalGridView != null) { 286 mVerticalGridView.setLayoutFrozen(false); 287 mVerticalGridView.setAnimateChildLayout(true); 288 mVerticalGridView.setPruneChild(true); 289 mVerticalGridView.setFocusSearchDisabled(false); 290 mVerticalGridView.setScrollEnabled(true); 291 } 292 } 293 294 public void setAlignment(int windowAlignOffsetTop) { 295 if (mVerticalGridView != null) { 296 // align the top edge of item 297 mVerticalGridView.setItemAlignmentOffset(0); 298 mVerticalGridView.setItemAlignmentOffsetPercent( 299 VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED); 300 301 // align to a fixed position from top 302 mVerticalGridView.setWindowAlignmentOffset(windowAlignOffsetTop); 303 mVerticalGridView.setWindowAlignmentOffsetPercent( 304 VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); 305 mVerticalGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE); 306 } 307 } 308} 309