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