1
+ package com .igalia .wolvic .ui .adapters ;
2
+
3
+ import android .annotation .SuppressLint ;
4
+ import android .view .LayoutInflater ;
5
+ import android .view .MotionEvent ;
6
+ import android .view .View ;
7
+ import android .view .ViewGroup ;
8
+ import android .widget .ImageView ;
9
+
10
+ import androidx .annotation .NonNull ;
11
+ import androidx .annotation .Nullable ;
12
+ import androidx .databinding .DataBindingUtil ;
13
+ import androidx .recyclerview .widget .RecyclerView ;
14
+
15
+ import com .igalia .wolvic .R ;
16
+ import com .igalia .wolvic .browser .engine .SessionStore ;
17
+ import com .igalia .wolvic .databinding .BookmarkItemInNewTabBinding ;
18
+ import com .igalia .wolvic .ui .callbacks .BookmarkItemCallback ;
19
+
20
+ import java .util .ArrayList ;
21
+ import java .util .Collections ;
22
+ import java .util .List ;
23
+
24
+ import mozilla .appservices .places .BookmarkRoot ;
25
+ import mozilla .components .browser .icons .IconRequest ;
26
+ import mozilla .components .concept .storage .BookmarkNode ;
27
+
28
+ // Initial implementation: show bookmarks in New Tab page.
29
+ // In later implementation, we'll ...
30
+ public class NewTabAdapter extends RecyclerView .Adapter <RecyclerView .ViewHolder > {
31
+
32
+ private List <Bookmark > bookmarkItems ;
33
+
34
+ @ Nullable
35
+ private final BookmarkItemCallback mBookmarkItemCallback ;
36
+
37
+ public NewTabAdapter (@ Nullable BookmarkItemCallback clickCallback ) {
38
+ mBookmarkItemCallback = clickCallback ;
39
+ }
40
+
41
+ public void setBookmarkListInNewTab (final List <BookmarkNode > bookmarkNodes ) {
42
+ if (bookmarkItems == null || bookmarkItems .isEmpty ()) {
43
+ //bookmarkItems = Bookmark.getBookmarkItems(bookmarkNodes);
44
+
45
+ List <Bookmark > newDisplayList ;
46
+ bookmarkItems = new ArrayList <>();
47
+ newDisplayList = Bookmark .getDisplayListTree (bookmarkNodes , Collections .singletonList (BookmarkRoot .Mobile .getId ()));
48
+ for (Bookmark node : newDisplayList ) {
49
+ if (node .getType () == Bookmark .Type .ITEM ) {
50
+ bookmarkItems .add (node );
51
+ }
52
+ }
53
+
54
+ notifyItemRangeInserted (0 , bookmarkItems .size ());
55
+ }
56
+ }
57
+
58
+ // Only delete the bookmarks shown in new tab.
59
+ // Not delete bookmarks in bookmark store.
60
+ public void deleteItem (Bookmark item ) {
61
+ bookmarkItems .remove (item );
62
+ }
63
+
64
+ public void addItem (String title , String url ) {
65
+ Bookmark item = new Bookmark (title , url );
66
+ bookmarkItems .add (item );
67
+ }
68
+
69
+ @ NonNull
70
+ @ Override
71
+ public RecyclerView .ViewHolder onCreateViewHolder (@ NonNull ViewGroup parent , int viewType ) {
72
+ BookmarkItemInNewTabBinding binding = DataBindingUtil
73
+ .inflate (LayoutInflater .from (parent .getContext ()), R .layout .bookmark_item_in_new_tab ,
74
+ parent , false );
75
+
76
+ binding .setCallback (mBookmarkItemCallback );
77
+ binding .setIsHovered (false );
78
+
79
+ return new BookmarkViewHolder (binding );
80
+ }
81
+
82
+ @ SuppressLint ("ClickableViewAccessibility" )
83
+ @ Override
84
+ public void onBindViewHolder (@ NonNull RecyclerView .ViewHolder holder , int position ) {
85
+ Bookmark item = bookmarkItems .get (position );
86
+
87
+ BookmarkViewHolder bookmarkHolder = (BookmarkViewHolder ) holder ;
88
+ BookmarkItemInNewTabBinding binding = bookmarkHolder .binding ;
89
+ binding .setItem (item );
90
+
91
+ SessionStore .get ().getBrowserIcons ().loadIntoView (binding .favicon , item .getUrl (), IconRequest .Size .DEFAULT );
92
+
93
+ binding .layout .setOnHoverListener ((view , motionEvent ) -> {
94
+ int ev = motionEvent .getActionMasked ();
95
+ switch (ev ) {
96
+ case MotionEvent .ACTION_HOVER_ENTER :
97
+ binding .setIsHovered (true );
98
+ view .getBackground ().setState (new int []{android .R .attr .state_hovered });
99
+ view .postInvalidate ();
100
+ return false ;
101
+
102
+ case MotionEvent .ACTION_CANCEL :
103
+ case MotionEvent .ACTION_HOVER_EXIT :
104
+ view .getBackground ().setState (new int []{android .R .attr .state_active });
105
+ binding .setIsHovered (false );
106
+ view .postInvalidate ();
107
+ return false ;
108
+ }
109
+
110
+ return false ;
111
+ });
112
+ binding .layout .setOnTouchListener ((view , motionEvent ) -> {
113
+ int ev = motionEvent .getActionMasked ();
114
+ switch (ev ) {
115
+ case MotionEvent .ACTION_UP :
116
+ return false ;
117
+
118
+ case MotionEvent .ACTION_DOWN :
119
+ binding .more .setImageState (new int []{android .R .attr .state_active },false );
120
+ binding .trash .setImageState (new int []{android .R .attr .state_active },false );
121
+ binding .setIsHovered (true );
122
+ return false ;
123
+
124
+ case MotionEvent .ACTION_CANCEL :
125
+ binding .setIsHovered (false );
126
+ return false ;
127
+ }
128
+ return false ;
129
+ });
130
+ binding .more .setOnHoverListener (mIconHoverListener );
131
+ binding .more .setOnTouchListener ((view , motionEvent ) -> {
132
+ binding .setIsHovered (true );
133
+ int ev = motionEvent .getActionMasked ();
134
+ switch (ev ) {
135
+ case MotionEvent .ACTION_UP :
136
+ if (mBookmarkItemCallback != null ) {
137
+ mBookmarkItemCallback .onMore (view , binding .getItem ());
138
+ }
139
+ binding .more .setImageState (new int []{android .R .attr .state_active },true );
140
+ return true ;
141
+
142
+ case MotionEvent .ACTION_DOWN :
143
+ binding .more .setImageState (new int []{android .R .attr .state_pressed },true );
144
+ return true ;
145
+
146
+ case MotionEvent .ACTION_CANCEL :
147
+ binding .setIsHovered (false );
148
+ binding .more .setImageState (new int []{android .R .attr .state_active },true );
149
+ return false ;
150
+ }
151
+ return false ;
152
+ });
153
+ binding .trash .setOnHoverListener (mIconHoverListener );
154
+ binding .trash .setOnTouchListener ((view , motionEvent ) -> {
155
+ binding .setIsHovered (true );
156
+ int ev = motionEvent .getActionMasked ();
157
+ switch (ev ) {
158
+ case MotionEvent .ACTION_UP :
159
+ if (mBookmarkItemCallback != null ) {
160
+ mBookmarkItemCallback .onDelete (view , binding .getItem ());
161
+ }
162
+ binding .trash .setImageState (new int []{android .R .attr .state_active },true );
163
+ return true ;
164
+
165
+ case MotionEvent .ACTION_DOWN :
166
+ binding .trash .setImageState (new int []{android .R .attr .state_pressed },true );
167
+ return true ;
168
+
169
+ case MotionEvent .ACTION_CANCEL :
170
+ binding .setIsHovered (false );
171
+ binding .trash .setImageState (new int []{android .R .attr .state_active },true );
172
+ return false ;
173
+ }
174
+ return false ;
175
+ });
176
+ }
177
+
178
+ @ Override
179
+ public int getItemCount () {
180
+ return bookmarkItems == null ? 0 : bookmarkItems .size ();
181
+ }
182
+
183
+ static class BookmarkViewHolder extends RecyclerView .ViewHolder {
184
+
185
+ final BookmarkItemInNewTabBinding binding ;
186
+
187
+ BookmarkViewHolder (@ NonNull BookmarkItemInNewTabBinding binding ) {
188
+ super (binding .getRoot ());
189
+ this .binding = binding ;
190
+ }
191
+ }
192
+
193
+ private View .OnHoverListener mIconHoverListener = (view , motionEvent ) -> {
194
+ ImageView icon = (ImageView ) view ;
195
+ int ev = motionEvent .getActionMasked ();
196
+ switch (ev ) {
197
+ case MotionEvent .ACTION_HOVER_ENTER :
198
+ icon .setImageState (new int []{android .R .attr .state_hovered }, true );
199
+ return false ;
200
+
201
+ case MotionEvent .ACTION_HOVER_EXIT :
202
+ icon .setImageState (new int []{android .R .attr .state_active }, true );
203
+ return false ;
204
+ }
205
+
206
+ return false ;
207
+ };
208
+ }
0 commit comments