1616
1717import org .mozilla .vrbrowser .R ;
1818import org .mozilla .vrbrowser .databinding .HistoryItemBinding ;
19+ import org .mozilla .vrbrowser .databinding .HistoryItemHeaderBinding ;
1920import org .mozilla .vrbrowser .ui .callbacks .HistoryItemCallback ;
2021import org .mozilla .vrbrowser .ui .widgets .WidgetPlacement ;
2122import org .mozilla .vrbrowser .utils .AnimationHelper ;
2728import mozilla .components .concept .storage .VisitInfo ;
2829import mozilla .components .concept .storage .VisitType ;
2930
30- public class HistoryAdapter extends RecyclerView .Adapter <HistoryAdapter . HistoryItemViewHolder > {
31+ public class HistoryAdapter extends RecyclerView .Adapter <RecyclerView . ViewHolder > {
3132
3233 static final String LOGTAG = SystemUtils .createLogtag (HistoryAdapter .class );
3334
35+ private static final int TYPE_HEADER = 0 ;
36+ private static final int TYPE_ITEM = 1 ;
37+
3438 private static final int ICON_ANIMATION_DURATION = 200 ;
3539
3640 private List <? extends VisitInfo > mHistoryList ;
@@ -120,75 +124,99 @@ public int getItemPosition(long id) {
120124
121125 @ SuppressLint ("ClickableViewAccessibility" )
122126 @ Override
123- public HistoryItemViewHolder onCreateViewHolder (@ NonNull ViewGroup parent , int viewType ) {
124- HistoryItemBinding binding = DataBindingUtil
125- .inflate (LayoutInflater .from (parent .getContext ()), R .layout .history_item ,
126- parent , false );
127- binding .setCallback (mHistoryItemCallback );
128- binding .setIsHovered (false );
129- binding .layout .setOnHoverListener ((view , motionEvent ) -> {
130- int ev = motionEvent .getActionMasked ();
131- switch (ev ) {
132- case MotionEvent .ACTION_HOVER_ENTER :
133- binding .setIsHovered (true );
134- return false ;
135-
136- case MotionEvent .ACTION_HOVER_EXIT :
137- binding .setIsHovered (false );
138- return false ;
139- }
140-
141- return false ;
142- });
143- binding .layout .setOnTouchListener ((view , motionEvent ) -> {
144- int ev = motionEvent .getActionMasked ();
145- switch (ev ) {
146- case MotionEvent .ACTION_UP :
147- return false ;
148-
149- case MotionEvent .ACTION_DOWN :
150- binding .setIsHovered (true );
151- return false ;
152-
153- case MotionEvent .ACTION_CANCEL :
154- binding .setIsHovered (false );
155- return false ;
156- }
157- return false ;
158- });
159- binding .more .setOnHoverListener (mIconHoverListener );
160- binding .more .setOnTouchListener ((view , motionEvent ) -> {
161- int ev = motionEvent .getActionMasked ();
162- switch (ev ) {
163- case MotionEvent .ACTION_UP :
164- mHistoryItemCallback .onMore (view , binding .getItem ());
165- return true ;
166-
167- case MotionEvent .ACTION_DOWN :
168- return true ;
169- }
170- return false ;
171- });
172- binding .trash .setOnHoverListener (mIconHoverListener );
173- binding .trash .setOnTouchListener ((view , motionEvent ) -> {
174- int ev = motionEvent .getActionMasked ();
175- switch (ev ) {
176- case MotionEvent .ACTION_UP :
177- mHistoryItemCallback .onDelete (view , binding .getItem ());
178- return true ;
179-
180- case MotionEvent .ACTION_DOWN :
181- return true ;
182- }
183- return false ;
184- });
185- return new HistoryItemViewHolder (binding );
127+ public RecyclerView .ViewHolder onCreateViewHolder (@ NonNull ViewGroup parent , int viewType ) {
128+ if (viewType == TYPE_ITEM ) {
129+ HistoryItemBinding binding = DataBindingUtil
130+ .inflate (LayoutInflater .from (parent .getContext ()), R .layout .history_item ,
131+ parent , false );
132+ binding .setCallback (mHistoryItemCallback );
133+ binding .setIsHovered (false );
134+ binding .layout .setOnHoverListener ((view , motionEvent ) -> {
135+ int ev = motionEvent .getActionMasked ();
136+ switch (ev ) {
137+ case MotionEvent .ACTION_HOVER_ENTER :
138+ binding .setIsHovered (true );
139+ return false ;
140+
141+ case MotionEvent .ACTION_HOVER_EXIT :
142+ binding .setIsHovered (false );
143+ return false ;
144+ }
145+
146+ return false ;
147+ });
148+ binding .layout .setOnTouchListener ((view , motionEvent ) -> {
149+ int ev = motionEvent .getActionMasked ();
150+ switch (ev ) {
151+ case MotionEvent .ACTION_UP :
152+ return false ;
153+
154+ case MotionEvent .ACTION_DOWN :
155+ binding .setIsHovered (true );
156+ return false ;
157+
158+ case MotionEvent .ACTION_CANCEL :
159+ binding .setIsHovered (false );
160+ return false ;
161+ }
162+ return false ;
163+ });
164+ binding .more .setOnHoverListener (mIconHoverListener );
165+ binding .more .setOnTouchListener ((view , motionEvent ) -> {
166+ int ev = motionEvent .getActionMasked ();
167+ switch (ev ) {
168+ case MotionEvent .ACTION_UP :
169+ binding .setIsHovered (true );
170+ mHistoryItemCallback .onMore (view , binding .getItem ());
171+ return true ;
172+
173+ case MotionEvent .ACTION_DOWN :
174+ binding .setIsHovered (true );
175+ return true ;
176+ }
177+ return false ;
178+ });
179+ binding .trash .setOnHoverListener (mIconHoverListener );
180+ binding .trash .setOnTouchListener ((view , motionEvent ) -> {
181+ int ev = motionEvent .getActionMasked ();
182+ switch (ev ) {
183+ case MotionEvent .ACTION_UP :
184+ binding .setIsHovered (true );
185+ mHistoryItemCallback .onDelete (view , binding .getItem ());
186+ return true ;
187+
188+ case MotionEvent .ACTION_DOWN :
189+ binding .setIsHovered (true );
190+ return true ;
191+ }
192+ return false ;
193+ });
194+
195+ return new HistoryItemViewHolder (binding );
196+
197+ } else if (viewType == TYPE_HEADER ){
198+ HistoryItemHeaderBinding binding = DataBindingUtil
199+ .inflate (LayoutInflater .from (parent .getContext ()), R .layout .history_item_header ,
200+ parent , false );
201+
202+ return new HistoryItemViewHeaderHolder (binding );
203+ }
204+
205+ throw new RuntimeException ("there is no type that matches the type " + viewType + " + make sure your using types correctly" );
186206 }
187207
188208 @ Override
189- public void onBindViewHolder (@ NonNull HistoryItemViewHolder holder , int position ) {
190- holder .binding .setItem (mHistoryList .get (position ));
191- holder .binding .executePendingBindings ();
209+ public void onBindViewHolder (@ NonNull RecyclerView .ViewHolder holder , int position ) {
210+ if (holder instanceof HistoryItemViewHolder ) {
211+ HistoryItemViewHolder item = (HistoryItemViewHolder ) holder ;
212+ item .binding .setItem (mHistoryList .get (position ));
213+ item .binding .executePendingBindings ();
214+
215+ } else if (holder instanceof HistoryItemViewHeaderHolder ) {
216+ HistoryItemViewHeaderHolder item = (HistoryItemViewHeaderHolder ) holder ;
217+ item .binding .setTitle (mHistoryList .get (position ).getTitle ());
218+ item .binding .executePendingBindings ();
219+ }
192220 }
193221
194222 @ Override
@@ -202,14 +230,16 @@ public long getItemId(int position) {
202230 return historyItem .getVisitTime ();
203231 }
204232
205- static class HistoryItemViewHolder extends RecyclerView .ViewHolder {
233+ @ Override
234+ public int getItemViewType (int position ) {
235+ if (isPositionHeader (position ))
236+ return TYPE_HEADER ;
206237
207- final HistoryItemBinding binding ;
238+ return TYPE_ITEM ;
239+ }
208240
209- HistoryItemViewHolder (@ NonNull HistoryItemBinding binding ) {
210- super (binding .getRoot ());
211- this .binding = binding ;
212- }
241+ private boolean isPositionHeader (int position ) {
242+ return mHistoryList .get (position ).getVisitType () == VisitType .NOT_A_VISIT ;
213243 }
214244
215245 private View .OnHoverListener mIconHoverListener = (view , motionEvent ) -> {
@@ -236,4 +266,24 @@ static class HistoryItemViewHolder extends RecyclerView.ViewHolder {
236266 return false ;
237267 };
238268
269+ static class HistoryItemViewHolder extends RecyclerView .ViewHolder {
270+
271+ final HistoryItemBinding binding ;
272+
273+ HistoryItemViewHolder (@ NonNull HistoryItemBinding binding ) {
274+ super (binding .getRoot ());
275+ this .binding = binding ;
276+ }
277+ }
278+
279+ static class HistoryItemViewHeaderHolder extends RecyclerView .ViewHolder {
280+
281+ final HistoryItemHeaderBinding binding ;
282+
283+ HistoryItemViewHeaderHolder (@ NonNull HistoryItemHeaderBinding binding ) {
284+ super (binding .getRoot ());
285+ this .binding = binding ;
286+ }
287+ }
288+
239289}
0 commit comments