1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.chassis.car.ui.plugin.recyclerview; 17 18 import android.annotation.SuppressLint; 19 import android.view.ViewGroup; 20 21 import androidx.annotation.NonNull; 22 import androidx.annotation.Nullable; 23 import androidx.recyclerview.widget.RecyclerView; 24 25 import com.android.car.ui.plugin.oemapis.recyclerview.AdapterDataObserverOEMV1; 26 import com.android.car.ui.plugin.oemapis.recyclerview.AdapterOEMV1; 27 import com.android.car.ui.plugin.oemapis.recyclerview.ViewHolderOEMV1; 28 29 import com.chassis.car.ui.plugin.recyclerview.AdapterWrapper.ViewHolderWrapper; 30 31 /** 32 * Wrapper class that passes the data to car-ui via AdapterOEMV1 interface 33 */ 34 public final class AdapterWrapper extends RecyclerView.Adapter<ViewHolderWrapper> { 35 36 @NonNull 37 private final AdapterOEMV1 mAdapter; 38 39 @NonNull 40 private final AdapterDataObserverOEMV1 mAdapterDataObserver = new AdapterDataObserverOEMV1() { 41 @Override 42 @SuppressLint("NotifyDataSetChanged") 43 public void onChanged() { 44 AdapterWrapper.super.notifyDataSetChanged(); 45 } 46 47 @Override 48 public void onItemRangeChanged(int positionStart, int itemCount) { 49 AdapterWrapper.super.notifyItemRangeChanged(positionStart, itemCount); 50 } 51 52 @Override 53 public void onItemRangeChanged(int positionStart, int itemCount, 54 @Nullable Object payload) { 55 AdapterWrapper.super.notifyItemRangeChanged(positionStart, itemCount, payload); 56 } 57 58 @Override 59 public void onItemRangeInserted(int positionStart, int itemCount) { 60 AdapterWrapper.super.notifyItemRangeInserted(positionStart, itemCount); 61 } 62 63 @Override 64 public void onItemRangeRemoved(int positionStart, int itemCount) { 65 AdapterWrapper.super.notifyItemRangeRemoved(positionStart, itemCount); 66 } 67 68 @Override 69 public void onItemMoved(int fromPosition, int toPosition) { 70 AdapterWrapper.super.notifyItemMoved(fromPosition, toPosition); 71 } 72 73 @Override 74 public void onStateRestorationPolicyChanged() { 75 AdapterWrapper.this.updateStateRestorationPolicy(); 76 } 77 }; 78 AdapterWrapper(@onNull AdapterOEMV1<?> adapter)79 public AdapterWrapper(@NonNull AdapterOEMV1<?> adapter) { 80 this.mAdapter = adapter; 81 AdapterWrapper.super.setHasStableIds(adapter.hasStableIds()); 82 updateStateRestorationPolicy(); 83 } 84 updateStateRestorationPolicy()85 private void updateStateRestorationPolicy() { 86 switch (mAdapter.getStateRestorationPolicyInt()) { 87 case 2: 88 AdapterWrapper.super.setStateRestorationPolicy( 89 RecyclerView.Adapter.StateRestorationPolicy.PREVENT); 90 break; 91 case 1: 92 AdapterWrapper.super.setStateRestorationPolicy( 93 RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY); 94 break; 95 case 0: 96 default: 97 AdapterWrapper.super.setStateRestorationPolicy( 98 RecyclerView.Adapter.StateRestorationPolicy.ALLOW); 99 } 100 } 101 102 @Override getItemCount()103 public int getItemCount() { 104 return mAdapter.getItemCount(); 105 } 106 107 @Override getItemId(int position)108 public long getItemId(int position) { 109 return mAdapter.getItemId(position); 110 } 111 112 @Override getItemViewType(int position)113 public int getItemViewType(int position) { 114 return mAdapter.getItemViewType(position); 115 } 116 117 @Override onAttachedToRecyclerView(RecyclerView recyclerView)118 public void onAttachedToRecyclerView(RecyclerView recyclerView) { 119 mAdapter.onAttachedToRecyclerView(null); 120 } 121 122 @Override onBindViewHolder(ViewHolderWrapper holder, int position)123 public void onBindViewHolder(ViewHolderWrapper holder, int position) { 124 mAdapter.bindViewHolder(holder.getViewHolder(), position); 125 } 126 127 @Override onCreateViewHolder(ViewGroup parent, int viewType)128 public ViewHolderWrapper onCreateViewHolder(ViewGroup parent, int viewType) { 129 return new ViewHolderWrapper(mAdapter.createViewHolder(parent, viewType)); 130 } 131 132 @Override onDetachedFromRecyclerView(RecyclerView recyclerView)133 public void onDetachedFromRecyclerView(RecyclerView recyclerView) { 134 mAdapter.onDetachedFromRecyclerView(null); 135 } 136 137 @Override onFailedToRecycleView(ViewHolderWrapper holder)138 public boolean onFailedToRecycleView(ViewHolderWrapper holder) { 139 return mAdapter.onFailedToRecycleView(holder.getViewHolder()); 140 } 141 142 @Override onViewAttachedToWindow(ViewHolderWrapper holder)143 public void onViewAttachedToWindow(ViewHolderWrapper holder) { 144 mAdapter.onViewAttachedToWindow(holder.getViewHolder()); 145 } 146 147 @Override onViewDetachedFromWindow(ViewHolderWrapper holder)148 public void onViewDetachedFromWindow(ViewHolderWrapper holder) { 149 mAdapter.onViewDetachedFromWindow(holder.getViewHolder()); 150 } 151 152 @Override onViewRecycled(ViewHolderWrapper holder)153 public void onViewRecycled(ViewHolderWrapper holder) { 154 mAdapter.onViewRecycled(holder.getViewHolder()); 155 } 156 157 @Override registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer)158 public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) { 159 if (!super.hasObservers()) { 160 mAdapter.registerAdapterDataObserver(mAdapterDataObserver); 161 } 162 super.registerAdapterDataObserver(observer); 163 } 164 165 @Override unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer)166 public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) { 167 super.unregisterAdapterDataObserver(observer); 168 if (!super.hasObservers()) { 169 mAdapter.registerAdapterDataObserver(mAdapterDataObserver); 170 } 171 } 172 173 /** 174 * Holds views for each element in the list. 175 */ 176 public static class ViewHolderWrapper extends RecyclerView.ViewHolder { 177 @NonNull 178 private ViewHolderOEMV1 mViewHolder; 179 ViewHolderWrapper(@onNull ViewHolderOEMV1 viewHolder)180 ViewHolderWrapper(@NonNull ViewHolderOEMV1 viewHolder) { 181 super(viewHolder.getItemView()); 182 mViewHolder = viewHolder; 183 setIsRecyclable(viewHolder.isRecyclable()); 184 } 185 186 @NonNull getViewHolder()187 public ViewHolderOEMV1 getViewHolder() { 188 return mViewHolder; 189 } 190 } 191 192 /** 193 * returns the wrapped {@link AdapterOEMV1} 194 */ getOEMAdapter()195 public AdapterOEMV1<?> getOEMAdapter() { 196 return mAdapter; 197 } 198 } 199