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