Skip to content
This repository was archived by the owner on Sep 10, 2025. It is now read-only.

Commit f4a5228

Browse files
Merge pull request #177 from Pocket/notes-add-menu
fix(notes): show url/notes menu on add button click
2 parents 8904031 + 408d6d2 commit f4a5228

File tree

8 files changed

+78
-51
lines changed

8 files changed

+78
-51
lines changed

Pocket/src/main/java/com/pocket/app/PocketUiPlaygroundActivity.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -110,18 +110,18 @@ private void bindExamples() {
110110
}
111111
new ThemedPopupMenu(v.getContext(),
112112
ThemedPopupMenu.Section.radio("Theme", themeSelected, Arrays.asList(
113-
new MenuItem(com.pocket.ui.R.string.light, 1, 0, view -> setThemeOverride(Theme.STATE_LIGHT, Theme.LIGHT)),
114-
new MenuItem(com.pocket.ui.R.string.dark, 1, 0, view -> setThemeOverride(Theme.STATE_DARK, Theme.DARK)))),
113+
new MenuItem(com.pocket.ui.R.string.light, 0, view -> setThemeOverride(Theme.STATE_LIGHT, Theme.LIGHT)),
114+
new MenuItem(com.pocket.ui.R.string.dark, 0, view -> setThemeOverride(Theme.STATE_DARK, Theme.DARK)))),
115115
ThemedPopupMenu.Section.radio("Interactions", isAllDisabled ? 1 : 0, Arrays.asList(
116-
new MenuItem(R.string.dev_enabled, 1, 0, view -> setEnabledOverride(true)),
117-
new MenuItem(R.string.dev_disabled, 1, 0, view -> setEnabledOverride(false)))),
116+
new MenuItem(R.string.dev_enabled, 0, view -> setEnabledOverride(true)),
117+
new MenuItem(R.string.dev_disabled, 0, view -> setEnabledOverride(false)))),
118118
ThemedPopupMenu.Section.radio("Item Images", itemImagesState, Arrays.asList(
119-
new MenuItem(R.string.dev_images, 1, 0, view -> setItemImagesState(0)),
120-
new MenuItem(R.string.dev_no_images, 1, 0, view -> setItemImagesState(1)),
121-
new MenuItem(R.string.dev_placeholders, 1, 0, view -> setItemImagesState(2)))),
119+
new MenuItem(R.string.dev_images, 0, view -> setItemImagesState(0)),
120+
new MenuItem(R.string.dev_no_images, 0, view -> setItemImagesState(1)),
121+
new MenuItem(R.string.dev_placeholders, 0, view -> setItemImagesState(2)))),
122122
ThemedPopupMenu.Section.radio("Item Mode", itemMode, Arrays.asList(
123-
new MenuItem(R.string.dev_normal, 1, 0, view -> setItemMode(0)),
124-
new MenuItem(R.string.dev_edit, 1, 0, view -> setItemMode(1))))
123+
new MenuItem(R.string.dev_normal, 0, view -> setItemMode(0)),
124+
new MenuItem(R.string.dev_edit, 0, view -> setItemMode(1))))
125125
).show(v);
126126
});
127127

Pocket/src/main/java/com/pocket/app/list/MyListFragment.kt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ import com.pocket.sdk.tts.Listen
4141
import com.pocket.sdk.util.AbsPocketFragment
4242
import com.pocket.sdk.util.dialog.AlertMessaging
4343
import com.pocket.sdk2.analytics.context.Interaction
44+
import com.pocket.ui.view.menu.MenuItem
45+
import com.pocket.ui.view.menu.ThemedPopupMenu
4446
import com.pocket.util.android.hideKeyboard
4547
import com.pocket.util.android.navigateSafely
4648
import com.pocket.util.android.repeatOnResumed
@@ -130,10 +132,30 @@ class MyListFragment : AbsPocketFragment() {
130132
return true
131133
}
132134

133-
@Suppress("LongMethod", "ComplexMethod")
134135
private fun setupNavigationEventListener() {
135136
viewModel.navigationEvents.collectWhenResumed(viewLifecycleOwner) { event ->
136137
when (event) {
138+
is MyListNavigationEvent.ShowAddMenu -> {
139+
val context = context ?: return@collectWhenResumed
140+
val actions = ThemedPopupMenu.Section.actions(
141+
null,
142+
listOf(
143+
MenuItem(
144+
R.string.add_url_title,
145+
0,
146+
{ viewModel.onAddUrlClicked() },
147+
null,
148+
),
149+
MenuItem(
150+
R.string.add_note_title,
151+
0,
152+
{ viewModel.onAddNoteClicked() },
153+
null,
154+
),
155+
),
156+
)
157+
ThemedPopupMenu(context, actions).show(binding.addButton)
158+
}
137159
is MyListNavigationEvent.ShowAddUrlBottomSheet -> {
138160
AddUrlBottomSheetFragment.newInstance().show(
139161
childFragmentManager,

Pocket/src/main/java/com/pocket/app/list/MyListViewModel.kt

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.pocket.analytics.ContentOpenTracker
88
import com.pocket.analytics.Tracker
99
import com.pocket.analytics.appevents.SavesEvents
1010
import com.pocket.analytics.appevents.SavesTab
11+
import com.pocket.app.list.MyListViewModel.OnAddClick.*
1112
import com.pocket.app.list.list.ListManager
1213
import com.pocket.app.list.list.ListStatus
1314
import com.pocket.app.notes.Notes
@@ -80,20 +81,28 @@ class MyListViewModel @Inject constructor(
8081
// to get the current search text the list is using, try listManager.sortFilterState.value.search
8182
private var delayedSearchText = ""
8283

84+
private enum class OnAddClick { JustOpenAddUrl, ShowChoiceBetweenAddUrlAndAddNote }
85+
private var onAddClick = JustOpenAddUrl
86+
8387
init {
8488
setupListSortObserver()
8589
setupListManagerStateObserver()
8690
setupListObserver()
8791
setupTagListener()
8892
setupRecentSearchesListener()
8993
viewModelScope.launch {
94+
val notesEnabled = notes.areEnabled()
9095
_uiState.update {
9196
it.copy(
9297
filterCarouselState = it.filterCarouselState.copy(
93-
notesFilterVisible = notes.areEnabled(),
98+
notesFilterVisible = notesEnabled,
9499
),
95100
)
96101
}
102+
onAddClick = when (notesEnabled) {
103+
true -> ShowChoiceBetweenAddUrlAndAddNote
104+
false -> JustOpenAddUrl
105+
}
97106
}
98107
}
99108

@@ -350,10 +359,27 @@ class MyListViewModel @Inject constructor(
350359
override fun onAddClicked() {
351360
tracker.track(SavesEvents.addButtonClicked())
352361
requireSignedIn {
353-
_navigationEvents.tryEmit(MyListNavigationEvent.ShowAddUrlBottomSheet)
362+
when (onAddClick) {
363+
JustOpenAddUrl -> {
364+
_navigationEvents.tryEmit(MyListNavigationEvent.ShowAddUrlBottomSheet)
365+
}
366+
ShowChoiceBetweenAddUrlAndAddNote -> {
367+
_navigationEvents.tryEmit(MyListNavigationEvent.ShowAddMenu)
368+
}
369+
}
354370
}
355371
}
356372

373+
override fun onAddUrlClicked() {
374+
// TODO(notes): tracker.track(…)
375+
_navigationEvents.tryEmit(MyListNavigationEvent.ShowAddUrlBottomSheet)
376+
}
377+
378+
override fun onAddNoteClicked() {
379+
// TODO(notes): tracker.track(…)
380+
// TODO(notes) POCKET-10881
381+
}
382+
357383
override fun onMyListChipClicked() {
358384
if (exitEditMode()) return
359385
tracker.track(SavesEvents.savesChipClicked())
@@ -434,7 +460,7 @@ class MyListViewModel @Inject constructor(
434460
}
435461
}
436462

437-
fun onNotesChipClicked() {
463+
override fun onNotesChipClicked() {
438464
if (exitEditMode()) return
439465
// TODO(notes): tracker.track(…)
440466
requireSignedIn {
@@ -954,9 +980,10 @@ enum class BadgeType {
954980
}
955981

956982
sealed class MyListNavigationEvent {
957-
data object ShowAddUrlBottomSheet: MyListNavigationEvent()
958-
object ShowTagBottomSheet: MyListNavigationEvent()
959-
object ShowFilterBottomSheet: MyListNavigationEvent()
983+
data object ShowAddMenu : MyListNavigationEvent()
984+
data object ShowAddUrlBottomSheet : MyListNavigationEvent()
985+
data object ShowTagBottomSheet : MyListNavigationEvent()
986+
data object ShowFilterBottomSheet : MyListNavigationEvent()
960987

961988
data class ShowBulkEditOverflowBottomSheet(
962989
val items: List<Item>
@@ -1001,12 +1028,15 @@ interface MyListInteractions {
10011028
fun onFilterChipClicked()
10021029
fun onBackButtonClicked(): Boolean
10031030
fun onAddClicked()
1031+
fun onAddUrlClicked()
1032+
fun onAddNoteClicked()
10041033
fun onMyListChipClicked()
10051034
fun onArchiveChipClicked()
10061035
fun onAllChipClicked()
10071036
fun onTaggedChipClicked()
10081037
fun onFavoritesChipClicked()
10091038
fun onHighlightsChipClicked()
1039+
fun onNotesChipClicked()
10101040
fun onEditChipClicked()
10111041
fun onSelectedTagChipClicked()
10121042
fun onSelectedFilterChipClicked()

Pocket/src/main/java/com/pocket/app/list/tags/TagBottomSheetFragment.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ class TagBottomSheetFragment : AbsPocketBottomSheetDialogFragment() {
7070
listOf(
7171
MenuItem(
7272
com.pocket.ui.R.string.ic_edit,
73-
R.menu.menu_tag_bottom_sheet_overflow,
7473
com.pocket.ui.R.drawable.ic_pkt_pencil_line
7574
) {
7675
viewModel.onEditClicked()

Pocket/src/main/java/com/pocket/app/reader/toolbar/OverflowBuilder.kt

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import com.pocket.ui.view.menu.ThemedPopupMenu
77

88
object OverflowBuilder {
99

10-
@Suppress("LongMethod", "KotlinConstantConditions")
1110
fun showOverflow(
1211
anchorView: View,
1312
overflowUiState: ReaderToolbar.ToolbarOverflowUiState,
@@ -18,7 +17,6 @@ object OverflowBuilder {
1817
if (overflowUiState.textSettingsVisible) menuItems.add(
1918
MenuItem(
2019
R.string.mu_display_settings,
21-
menuItems.size,
2220
com.pocket.ui.R.drawable.ic_pkt_text_style_solid
2321
) {
2422
toolbarInteractions.onTextSettingsClicked()
@@ -28,7 +26,6 @@ object OverflowBuilder {
2826
if (overflowUiState.viewOriginalVisible) menuItems.add(
2927
MenuItem(
3028
R.string.mu_view_original,
31-
menuItems.size,
3229
com.pocket.ui.R.drawable.ic_pkt_web_view_line
3330
) {
3431
toolbarInteractions.onViewOriginalClicked()
@@ -38,7 +35,6 @@ object OverflowBuilder {
3835
if (overflowUiState.refreshVisible) menuItems.add(
3936
MenuItem(
4037
R.string.mu_refresh,
41-
menuItems.size,
4238
com.pocket.ui.R.drawable.ic_pkt_refresh_line
4339
) {
4440
toolbarInteractions.onRefreshClicked()
@@ -48,7 +44,6 @@ object OverflowBuilder {
4844
if (overflowUiState.findInPageVisible) menuItems.add(
4945
MenuItem(
5046
R.string.mu_find_in_page,
51-
menuItems.size,
5247
com.pocket.ui.R.drawable.ic_pkt_search_line
5348
) {
5449
toolbarInteractions.onFindInPageClicked()
@@ -58,7 +53,6 @@ object OverflowBuilder {
5853
if (overflowUiState.favoriteVisible) menuItems.add(
5954
MenuItem(
6055
R.string.mu_favorite,
61-
menuItems.size,
6256
com.pocket.ui.R.drawable.ic_pkt_favorite_line
6357
) {
6458
toolbarInteractions.onFavoriteClicked()
@@ -68,7 +62,6 @@ object OverflowBuilder {
6862
if (overflowUiState.unfavoriteVisible) menuItems.add(
6963
MenuItem(
7064
R.string.mu_unfavorite,
71-
menuItems.size,
7265
com.pocket.ui.R.drawable.ic_pkt_favorite_solid
7366
) {
7467
toolbarInteractions.onUnfavoriteClicked()
@@ -78,7 +71,6 @@ object OverflowBuilder {
7871
if (overflowUiState.addTagsVisible) menuItems.add(
7972
MenuItem(
8073
R.string.mu_add_tags,
81-
menuItems.size,
8274
com.pocket.ui.R.drawable.ic_pkt_add_tags_line
8375
) {
8476
toolbarInteractions.onAddTagsClicked()
@@ -88,7 +80,6 @@ object OverflowBuilder {
8880
if (overflowUiState.highlightsVisible) menuItems.add(
8981
MenuItem(
9082
R.string.mu_annotations,
91-
menuItems.size,
9283
com.pocket.ui.R.drawable.ic_pkt_highlights_line
9384
) {
9485
toolbarInteractions.onHighlightsClicked()
@@ -98,7 +89,6 @@ object OverflowBuilder {
9889
if (overflowUiState.markAsNotViewedVisible) menuItems.add(
9990
MenuItem(
10091
com.pocket.ui.R.string.ic_mark_as_not_viewed,
101-
menuItems.size,
10292
com.pocket.ui.R.drawable.ic_viewed_not
10393
) {
10494
toolbarInteractions.onMarkAsNotViewedClicked()
@@ -108,7 +98,6 @@ object OverflowBuilder {
10898
if (overflowUiState.deleteVisible) menuItems.add(
10999
MenuItem(
110100
R.string.mu_delete,
111-
menuItems.size,
112101
com.pocket.ui.R.drawable.ic_pkt_delete_line
113102
) {
114103
toolbarInteractions.onDeleteClicked()
@@ -118,7 +107,6 @@ object OverflowBuilder {
118107
if (overflowUiState.reportArticleVisible) menuItems.add(
119108
MenuItem(
120109
R.string.mu_report_article_view,
121-
menuItems.size,
122110
com.pocket.ui.R.drawable.ic_pkt_error_line
123111
) {
124112
toolbarInteractions.onReportArticleClicked()

Pocket/src/main/res/menu/menu_tag_bottom_sheet_overflow.xml

Lines changed: 0 additions & 7 deletions
This file was deleted.

Pocket/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@
626626
<!-- All the remaining pieces of notes copy, for Smartling to translate in a single job. -->
627627
<!-- TODO(notes): remove unused ignores -->
628628
<string tools:ignore="UnusedResources" name="add_url_note_hint" comment="Hint for an input field where you can optionally add a note when add a URL to your saves">Note (optional)</string>
629-
<string tools:ignore="UnusedResources" name="add_note_title">Add Note</string>
629+
<string name="add_note_title">Add Note</string>
630630
<string tools:ignore="UnusedResources" name="add_note_title_hint" comment="Hint for an input field to optionally add a title for a note you're creating">Title (optional)</string>
631631
<string tools:ignore="UnusedResources" name="add_note_hint" comment="Hind for an input field where you put the body/content of a note you're creating">Note</string>
632632
<string tools:ignore="UnusedResources" name="edit_note_title">Edit Note</string>

pocket-ui/src/main/java/com/pocket/ui/view/menu/MenuItem.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,18 @@ public class MenuItem {
88

99
public final @StringRes int label;
1010
public final int icon;
11-
public final int id;
1211
public final int groupId;
1312
public final View.OnClickListener onClick;
1413
public final String uiEntityIdentifier;
1514

1615
private boolean mIsVisible = true;
1716
private boolean mIsEnabled = true;
1817

19-
public MenuItem(int label, int menuId, int icon, View.OnClickListener onClick) {
20-
this(label, menuId, icon, onClick, null);
18+
public MenuItem(int label, int icon, View.OnClickListener onClick) {
19+
this(label, icon, onClick, null);
2120
}
2221

23-
public MenuItem(int label, int menuId, int icon, View.OnClickListener onClick, String uiEntityIdentifier) {
24-
this.id = menuId;
22+
public MenuItem(int label, int icon, View.OnClickListener onClick, String uiEntityIdentifier) {
2523
this.groupId = 1;
2624
this.label = label;
2725
this.icon = icon;
@@ -44,23 +42,20 @@ public void onClick(View v) {
4442
}
4543

4644
/**
47-
* Invoked each time, right before the menu is displayed. Returns whether or
48-
* not this option should be visible in the menu.
49-
*
50-
* @return
45+
* Invoked each time, right before the menu is displayed.
46+
*
47+
* @return whether or not this option should be visible in the menu
5148
*/
5249
public boolean isVisible() {
5350
return mIsVisible;
5451
}
5552

5653
/**
57-
* Invoked each time, right before the menu is displayed. Returns whether or
58-
* not this option should be enabled in the menu.
54+
* Invoked each time, right before the menu is displayed.
5955
*
60-
* @return
56+
* @return whether or not this option should be enabled in the menu
6157
*/
6258
public boolean isEnabled() {
6359
return mIsEnabled;
6460
}
65-
66-
}
61+
}

0 commit comments

Comments
 (0)