Skip to content

Commit bf3f824

Browse files
committed
Create New Tab page and add an option to set New Tab page as homepage
1 parent dd638d2 commit bf3f824

File tree

15 files changed

+755
-20
lines changed

15 files changed

+755
-20
lines changed

app/build.gradle

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -619,13 +619,16 @@ android {
619619
lint {
620620
disable 'ExtraTranslation'
621621
}
622-
androidResources {
622+
623+
aaptOptions {
624+
noCompress 'ja'
625+
noCompress 'dat'
626+
noCompress 'bin'
623627
noCompress 'pak'
624628
noCompress 'ja'
625629
noCompress 'dat'
626630
noCompress 'bin'
627631
}
628-
629632
}
630633

631634
configurations {

app/src/common/shared/com/igalia/wolvic/ui/adapters/Bookmark.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.igalia.wolvic.ui.adapters;
22

3+
import android.util.Log;
4+
35
import androidx.annotation.NonNull;
46

57
import java.util.ArrayList;
@@ -25,6 +27,11 @@ public enum Type {
2527
private Type mType;
2628
private boolean mHasChildren;
2729

30+
public Bookmark(String title, String url) {
31+
mTitle = title;
32+
mURL = url;
33+
}
34+
2835
public Bookmark(@NonNull BookmarkNode node, int level, boolean isExpanded) {
2936
mIsExpanded = isExpanded;
3037
mLevel = level;
@@ -131,6 +138,28 @@ private static List<Bookmark> getDisplayListTree(@NonNull List<BookmarkNode> boo
131138
return children;
132139
}
133140

141+
/*public static List<Bookmark> getBookmarkItems(@NonNull List<BookmarkNode> bookmarkNodes) {
142+
Log.e("New Tab", "Bookmark nodes size: " + bookmarkNodes.size());
143+
144+
ArrayList<Bookmark> bookmarkItems = new ArrayList<>();
145+
146+
for (BookmarkNode node : bookmarkNodes) {
147+
if (node.getType() == BookmarkNodeType.ITEM) {
148+
//if (node.getTitle() != null) {
149+
//if (node.getType() != BookmarkNodeType.FOLDER && node.getTitle() != null) {
150+
Log.e("New Tab", "Bookmark node's item type recognized");
151+
Bookmark bookmark = new Bookmark(node, 0, false);
152+
bookmarkItems.add(bookmark);
153+
} else {
154+
Log.e("New Tab", "Not item type. Real type: " + node.getType());
155+
}
156+
}
157+
158+
Log.e("New Tab", "Bookmark items size: " + bookmarkItems.size());
159+
160+
return bookmarkItems;
161+
}*/
162+
134163
/**
135164
* Traverses the current display list looking for opened folders
136165
* @param displayList

app/src/common/shared/com/igalia/wolvic/ui/adapters/BookmarkAdapter.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,6 @@ static class BookmarkViewHolder extends RecyclerView.ViewHolder {
339339
}
340340

341341
static class BookmarkFolderViewHolder extends RecyclerView.ViewHolder {
342-
343342
final BookmarkItemFolderBinding binding;
344343

345344
BookmarkFolderViewHolder(@NonNull BookmarkItemFolderBinding binding) {
Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
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

Comments
 (0)