Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
4316139
initial configuration:
cmonfortep Jun 3, 2021
ca76749
Favorites widget created:
cmonfortep Jun 8, 2021
5bfdb41
Configuration screen layout
cmonfortep Jun 8, 2021
0fade54
sync methods to obtain favorites from database
cmonfortep Jun 8, 2021
d83c7c4
adapt ui when widget resized: calculate columns and change layout
cmonfortep Jun 11, 2021
d97d54d
update widgets layout to keep consistency between them
cmonfortep Jun 11, 2021
5342369
Showing empty view when no favorites
cmonfortep Jun 14, 2021
22ede94
day-night colors declaration
cmonfortep Jun 15, 2021
a5c4aa8
widget favorite items layout (light/dark/system)
cmonfortep Jun 15, 2021
d3edaeb
widget theme prefs datastore
cmonfortep Jun 15, 2021
3a2c027
widget configuration screen stores selected theme + ui updated
cmonfortep Jun 15, 2021
9fe7ef5
widget grid adapter using new layouts
cmonfortep Jun 15, 2021
f0a486f
Favorites items on widget themed
cmonfortep Jun 16, 2021
0904e53
added all layouts to cover all themes and sizes
cmonfortep Jun 16, 2021
843e1f3
widget search bar background color updated
cmonfortep Jun 16, 2021
c69b400
disable scrollbars from favorites in widget
cmonfortep Jun 16, 2021
53be0fb
Using dimens instead of harcoded values so logic in widget and xml sh…
cmonfortep Jun 16, 2021
5d5664e
fix loading item not honouring theme
cmonfortep Jun 16, 2021
6a951ef
restrict max size for col4 layout
cmonfortep Jun 16, 2021
2d9140d
calculate rows using dimens (tweaks to make widget fit in pixel 2)
cmonfortep Jun 16, 2021
ec252be
update widget ui when theme selected
cmonfortep Jun 16, 2021
f1ae016
remove empty favorites hint and reduce margins for col2 layouts
cmonfortep Jun 17, 2021
3f7e193
add min spacing between favorites in widgets
cmonfortep Jun 17, 2021
2907347
temp: notify when widget changes
cmonfortep Jun 17, 2021
f58cc78
Dirty: show favicons on widget
cmonfortep Jun 17, 2021
a47b7c7
fixes a bug when accessing list with less elements than columns to show
cmonfortep Jun 17, 2021
3eb265f
Store widget size in shared prefs to avoid sending args via Intent (f…
cmonfortep Jun 18, 2021
41547b8
inject only when class was not initialized
cmonfortep Jun 18, 2021
84a7377
notify widget when favorite database changes from global observer
cmonfortep Jun 18, 2021
0dcb708
apply code style
cmonfortep Jun 18, 2021
30c0835
Merge branch 'develop' into feature/cristian/favorites_widget
cmonfortep Jun 23, 2021
f341163
fix: pulse animation too small when view's bounding box not square
cmonfortep Jun 23, 2021
35a1bcd
Empty widget: Create a new tab for favorites onboarding
cmonfortep Jun 25, 2021
6458660
Dax CTA for favorites onboarding created
cmonfortep Jun 25, 2021
da4d5e4
Refactor: FireButton to HighlightableButton
cmonfortep Jun 25, 2021
89ccb5c
Return favorites CTA when favorites onboarding enabled
cmonfortep Jun 25, 2021
ca284d9
promote Add favorite when menu was highlighted
cmonfortep Jun 26, 2021
f0bbc92
apply codestyle
cmonfortep Jun 26, 2021
1b2c464
remove unnecessary line
cmonfortep Jun 27, 2021
cfe2321
removed unused code
cmonfortep Jun 27, 2021
f5f3a16
fix: intents from widget to BrowserActivity not working.
cmonfortep Jun 27, 2021
e7082b6
Widget search bar UI updates with new specs (both widgets affected)
cmonfortep Jun 28, 2021
db4bbe5
hide search bar hint if widget too small
cmonfortep Jun 28, 2021
dff6c69
remove unused imports
cmonfortep Jun 28, 2021
432da73
Merge branch 'develop' into feature/cristian/favorites_widget
cmonfortep Jun 28, 2021
757693d
fix: race condition (this should not happen according to docs) when g…
cmonfortep Jun 30, 2021
92e9618
update UI with new guidelines
cmonfortep Jun 30, 2021
a75e4df
hide system default option from widget configuration screen for api < 10
cmonfortep Jun 30, 2021
fd7e37e
block resize on tablets
cmonfortep Jun 30, 2021
cfc8a62
on widget take max items instead of mapping all favorites
cmonfortep Jun 30, 2021
3760104
take 5 columns if available
cmonfortep Jul 5, 2021
b8c90f3
add pixels to widget related code
cmonfortep Jul 5, 2021
992f9c2
update preview resources
cmonfortep Jul 7, 2021
b86c4bb
udpate quickacess items title colors
cmonfortep Jul 7, 2021
a937150
fix wrong bottom margins on widget CTA
cmonfortep Jul 7, 2021
e496006
fix: wrong font style on widget
cmonfortep Jul 7, 2021
f18449a
update min size for widget
cmonfortep Jul 7, 2021
07c5f34
fix: use correct width size depending on orientation
cmonfortep Jul 7, 2021
7ac3eff
fix: configuration screen ui specs
cmonfortep Jul 7, 2021
ad73c00
fix: wrong column calculation
cmonfortep Jul 8, 2021
c54551b
add method to check if user has favorites
cmonfortep Jul 8, 2021
4a40a21
Big refactor: show as many favorites as space available
cmonfortep Jul 8, 2021
4f8f720
new configuration values for widgets
cmonfortep Jul 8, 2021
f975316
check if favorites widget present before showing cta
cmonfortep Jul 8, 2021
285bcc9
update loupe icon
cmonfortep Jul 12, 2021
a170a4e
UI: new loupe icon and container size
cmonfortep Jul 13, 2021
11802fc
update naming to improve readability of widget options size
cmonfortep Jul 13, 2021
c1da62d
update margins on search bar
cmonfortep Jul 13, 2021
72c6a74
update default template for widget
cmonfortep Jul 13, 2021
874e355
remove old layouts where numcolumns was fixed
cmonfortep Jul 13, 2021
f60acdf
fix corner radius for favicon and use same dimen resource
cmonfortep Jul 13, 2021
3c22cbe
Merge branch 'develop' into feature/cristian/favorites_widget
cmonfortep Jul 13, 2021
9715dc9
Use system default as default theme for widget when no data available
cmonfortep Jul 13, 2021
91fdba2
update copy
cmonfortep Jul 15, 2021
fdfe3f3
product review UI feedback
cmonfortep Jul 15, 2021
3639fac
remove duplicated method after merging from develop
cmonfortep Jul 16, 2021
e2dad64
refactor how to send pixel when quick access item clicked
cmonfortep Jul 16, 2021
4dcd05d
use string from resources
cmonfortep Jul 16, 2021
39b4b2e
remove widget sharedprefs data when user deletes it
cmonfortep Jul 16, 2021
186d100
Merge branch 'develop' into feature/cristian/favorites_widget
cmonfortep Jul 18, 2021
74c5e9c
system theme default option on widget configuration
cmonfortep Jul 18, 2021
4f95f14
reuse tab if url matches
cmonfortep Jul 19, 2021
1d770cd
put strings on untranslated file
cmonfortep Jul 19, 2021
bcf75ef
code style
cmonfortep Jul 19, 2021
6ff0fe1
fixes failing tests
cmonfortep Jul 19, 2021
dc19837
unit test new repository method
cmonfortep Jul 19, 2021
85b105d
Add missing test for new logic
cmonfortep Jul 19, 2021
27b8e16
move logic inside faviconManager
cmonfortep Jul 20, 2021
32dac18
clean up empty methods
cmonfortep Jul 20, 2021
09974cd
fix: color white
cmonfortep Jul 20, 2021
acbe42c
remove unused logic
cmonfortep Jul 20, 2021
65b09ed
fixes: wrong pixel when search bar clicked
cmonfortep Jul 21, 2021
617ee70
Widget inject onReceive
cmonfortep Jul 21, 2021
b8cc075
add small margins to avoid shadow being cut
cmonfortep Jul 21, 2021
15bc5d5
Fixes Samsung widget issues: Use multiple layouts to change numColumn…
cmonfortep Jul 23, 2021
3b74a53
Use label to affect the order how widgets appear on the system widget…
cmonfortep Jul 23, 2021
0a90ee1
Use appCoroutineScope instead of GlobalScope
cmonfortep Jul 23, 2021
6b4ed0d
user cornerRadius instead of radius
cmonfortep Jul 23, 2021
9fc22ec
remove unused dimen
cmonfortep Jul 23, 2021
9074b34
send pixel if favorite clicked from SystemSearchActivity
cmonfortep Jul 23, 2021
ee8a0c6
comment to explain how it's used EmptyFavoritesWidgetService
cmonfortep Jul 23, 2021
9a02c36
user coerceAtLeast for consistency
cmonfortep Jul 23, 2021
3d9f68a
move widget render logic into smaller methods
cmonfortep Jul 23, 2021
2dafff9
add imports
cmonfortep Jul 23, 2021
c141e71
Use unicode for browser menu icon and override contentdescription
cmonfortep Jul 23, 2021
7b59957
extract methods into utility class and provide test cases
cmonfortep Jul 24, 2021
7333c25
code style
cmonfortep Jul 24, 2021
b0cc6f0
Merge branch 'develop' into feature/cristian/favorites_widget
cmonfortep Jul 24, 2021
d001842
use new loupe icon compatible with api < 23
cmonfortep Jul 24, 2021
0ab1d06
- improve comment
cmonfortep Aug 2, 2021
13f32ff
Merge branch 'develop' into feature/cristian/favorites_widget
cmonfortep Aug 2, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,14 @@ class FavoritesDataRepositoryTest {
verify(mockFaviconManager).deletePersistedFavicon(favorite.url)
}

@Test
fun whenUserHasFavoritesThenReturnTrue() = coroutineRule.runBlocking {
val favorite = Favorite(1, "Favorite", "http://favexample.com", 1)
givenFavorite(favorite)

assertTrue(repository.userHasFavorites())
}

private fun givenFavorite(vararg favorite: Favorite) {
favorite.forEach {
favoritesDao.insert(FavoriteEntity(it.id, it.title, it.url, it.position))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ import com.duckduckgo.app.bookmarks.model.FavoritesRepository
import com.duckduckgo.app.bookmarks.model.SavedSite
import com.duckduckgo.app.bookmarks.service.SavedSitesManager
import com.duckduckgo.app.browser.favicon.FaviconManager
import com.duckduckgo.app.pixels.AppPixelName
import com.duckduckgo.app.runBlocking
import com.duckduckgo.app.statistics.pixels.Pixel
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.whenever
Expand Down Expand Up @@ -65,13 +67,14 @@ class BookmarksViewModelTest {
private val favoritesRepository: FavoritesRepository = mock()
private val faviconManager: FaviconManager = mock()
private val savedSitesManager: SavedSitesManager = mock()
private val pixel: Pixel = mock()

private val bookmark = SavedSite.Bookmark(id = 0, title = "title", url = "www.example.com")
private val favorite = SavedSite.Favorite(id = 0, title = "title", url = "www.example.com", position = 0)
private val bookmarkEntity = BookmarkEntity(id = bookmark.id, title = bookmark.title, url = bookmark.url)

private val testee: BookmarksViewModel by lazy {
val model = BookmarksViewModel(favoritesRepository, bookmarksDao, faviconManager, savedSitesManager, coroutineRule.testDispatcherProvider)
val model = BookmarksViewModel(favoritesRepository, bookmarksDao, faviconManager, savedSitesManager, pixel, coroutineRule.testDispatcherProvider)
model.viewState.observeForever(viewStateObserver)
model.command.observeForever(commandObserver)
model
Expand Down Expand Up @@ -142,6 +145,13 @@ class BookmarksViewModelTest {
assertTrue(captor.value is BookmarksViewModel.Command.OpenSavedSite)
}

@Test
fun whenFavoriteSelectedThenPixelSent() {
testee.onSelected(favorite)

verify(pixel).fire(AppPixelName.FAVORITE_BOOKMARKS_ITEM_PRESSED)
}

@Test
fun whenDeleteRequestedThenConfirmCommand() {
testee.onDeleteSavedSiteRequested(bookmark)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ import com.duckduckgo.app.bookmarks.model.SavedSite
import com.duckduckgo.app.bookmarks.model.SavedSite.Favorite
import com.duckduckgo.app.browser.BrowserTabViewModel.Command
import com.duckduckgo.app.browser.BrowserTabViewModel.Command.Navigate
import com.duckduckgo.app.browser.BrowserTabViewModel.FireButton
import com.duckduckgo.app.browser.BrowserTabViewModel.HighlightableButton
import com.duckduckgo.app.browser.LongPressHandler.RequiredAction.DownloadFile
import com.duckduckgo.app.browser.LongPressHandler.RequiredAction.OpenInNewTab
import com.duckduckgo.app.browser.addtohome.AddToHomeCapabilityDetector
Expand Down Expand Up @@ -382,7 +382,7 @@ class BrowserTabViewModelTest {
temporaryTrackingWhitelistDao = mockTemporaryTrackingWhitelistDao
)

testee.loadData("abc", null, false)
testee.loadData("abc", null, false, false)
testee.command.observeForever(mockCommandObserver)
}

Expand Down Expand Up @@ -504,21 +504,21 @@ class BrowserTabViewModelTest {
fun whenBrowsingAndUrlPresentThenAddBookmarkFavoriteButtonsEnabled() {
loadUrl("www.example.com", isBrowserShowing = true)
assertTrue(browserViewState().canAddBookmarks)
assertTrue(browserViewState().canAddFavorite)
assertTrue(browserViewState().addFavorite.isEnabled())
}

@Test
fun whenBrowsingAndNoUrlThenAddBookmarkFavoriteButtonsDisabled() {
loadUrl(null, isBrowserShowing = true)
assertFalse(browserViewState().canAddBookmarks)
assertFalse(browserViewState().canAddFavorite)
assertFalse(browserViewState().addFavorite.isEnabled())
}

@Test
fun whenNotBrowsingAndUrlPresentThenAddBookmarkFavoriteButtonsDisabled() {
loadUrl("www.example.com", isBrowserShowing = false)
assertFalse(browserViewState().canAddBookmarks)
assertFalse(browserViewState().canAddFavorite)
assertFalse(browserViewState().addFavorite.isEnabled())
}

@Test
Expand Down Expand Up @@ -973,31 +973,31 @@ class BrowserTabViewModelTest {

@Test
fun whenInitialisedThenFireButtonIsShown() {
assertTrue(browserViewState().fireButton is FireButton.Visible)
assertTrue(browserViewState().fireButton is HighlightableButton.Visible)
}

@Test
fun whenOmnibarInputDoesNotHaveFocusAndHasQueryThenFireButtonIsShown() {
testee.onOmnibarInputStateChanged("query", false, hasQueryChanged = false)
assertTrue(browserViewState().fireButton is FireButton.Visible)
assertTrue(browserViewState().fireButton is HighlightableButton.Visible)
}

@Test
fun whenOmnibarInputDoesNotHaveFocusOrQueryThenFireButtonIsShown() {
testee.onOmnibarInputStateChanged("", false, hasQueryChanged = false)
assertTrue(browserViewState().fireButton is FireButton.Visible)
assertTrue(browserViewState().fireButton is HighlightableButton.Visible)
}

@Test
fun whenOmnibarInputHasFocusAndNoQueryThenFireButtonIsShown() {
testee.onOmnibarInputStateChanged("", true, hasQueryChanged = false)
assertTrue(browserViewState().fireButton is FireButton.Visible)
assertTrue(browserViewState().fireButton is HighlightableButton.Visible)
}

@Test
fun whenOmnibarInputHasFocusAndQueryThenFireButtonIsHidden() {
testee.onOmnibarInputStateChanged("query", true, hasQueryChanged = false)
assertTrue(browserViewState().fireButton is FireButton.Gone)
assertTrue(browserViewState().fireButton is HighlightableButton.Gone)
}

@Test
Expand Down Expand Up @@ -1031,31 +1031,31 @@ class BrowserTabViewModelTest {

@Test
fun whenInitialisedThenMenuButtonIsShown() {
assertTrue(browserViewState().showMenuButton)
assertTrue(browserViewState().showMenuButton.isEnabled())
}

@Test
fun whenOmnibarInputDoesNotHaveFocusOrQueryThenMenuButtonIsShown() {
testee.onOmnibarInputStateChanged("", false, hasQueryChanged = false)
assertTrue(browserViewState().showMenuButton)
assertTrue(browserViewState().showMenuButton.isEnabled())
}

@Test
fun whenOmnibarInputDoesNotHaveFocusAndHasQueryThenMenuButtonIsShown() {
testee.onOmnibarInputStateChanged("query", false, hasQueryChanged = false)
assertTrue(browserViewState().showMenuButton)
assertTrue(browserViewState().showMenuButton.isEnabled())
}

@Test
fun whenOmnibarInputHasFocusAndNoQueryThenMenuButtonIsShown() {
testee.onOmnibarInputStateChanged("", true, hasQueryChanged = false)
assertTrue(browserViewState().showMenuButton)
assertTrue(browserViewState().showMenuButton.isEnabled())
}

@Test
fun whenOmnibarInputHasFocusAndQueryThenMenuButtonIsHidden() {
testee.onOmnibarInputStateChanged("query", true, hasQueryChanged = false)
assertFalse(browserViewState().showMenuButton)
assertFalse(browserViewState().showMenuButton.isEnabled())
}

@Test
Expand Down Expand Up @@ -1569,25 +1569,64 @@ class BrowserTabViewModelTest {

@Test
fun whenUrlNullThenSetBrowserNotShowing() = coroutineRule.runBlocking {
testee.loadData("id", null, false)
testee.loadData("id", null, false, false)
testee.determineShowBrowser()
assertEquals(false, testee.browserViewState.value?.browserShowing)
}

@Test
fun whenUrlBlankThenSetBrowserNotShowing() = coroutineRule.runBlocking {
testee.loadData("id", " ", false)
testee.loadData("id", " ", false, false)
testee.determineShowBrowser()
assertEquals(false, testee.browserViewState.value?.browserShowing)
}

@Test
fun whenUrlPresentThenSetBrowserShowing() = coroutineRule.runBlocking {
testee.loadData("id", "https://example.com", false)
testee.loadData("id", "https://example.com", false, false)
testee.determineShowBrowser()
assertEquals(true, testee.browserViewState.value?.browserShowing)
}

@Test
fun whenFavoritesOnboardingAndSiteLoadedThenHighglightMenuButton() = coroutineRule.runBlocking {
testee.loadData("id", "https://example.com", false, true)
testee.determineShowBrowser()
assertEquals(true, testee.browserViewState.value?.showMenuButton?.isHighlighted())
}

@Test
fun whenFavoritesOnboardingAndUserOpensOptionsMenuThenHighglightAddFavoriteOption() = coroutineRule.runBlocking {
testee.loadData("id", "https://example.com", false, true)
testee.determineShowBrowser()

testee.onBrowserMenuClicked()

assertEquals(true, testee.browserViewState.value?.addFavorite?.isHighlighted())
}

@Test
fun whenFavoritesOnboardingAndUserClosesOptionsMenuThenMenuButtonNotHighlighted() = coroutineRule.runBlocking {
testee.loadData("id", "https://example.com", false, true)
testee.determineShowBrowser()

testee.onBrowserMenuClosed()

assertEquals(false, testee.browserViewState.value?.addFavorite?.isHighlighted())
}

@Test
fun whenFavoritesOnboardingAndUserClosesOptionsMenuThenLoadingNewSiteDoesNotHighlightMenuOption() = coroutineRule.runBlocking {
testee.loadData("id", "https://example.com", false, true)
testee.determineShowBrowser()
testee.onBrowserMenuClicked()
testee.onBrowserMenuClosed()

testee.determineShowBrowser()

assertEquals(false, testee.browserViewState.value?.addFavorite?.isHighlighted())
}

@Test
fun whenRecoveringFromProcessGoneThenShowErrorWithAction() {
testee.recoverFromRenderProcessGone()
Expand Down Expand Up @@ -2231,7 +2270,7 @@ class BrowserTabViewModelTest {
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
assertTrue(testee.onUserPressedBack())
assertFalse(browserViewState().canAddBookmarks)
assertFalse(browserViewState().canAddFavorite)
assertFalse(browserViewState().addFavorite.isEnabled())
}

@Test
Expand Down Expand Up @@ -2289,7 +2328,7 @@ class BrowserTabViewModelTest {
testee.onUserPressedBack()
testee.onUserPressedForward()
assertTrue(browserViewState().canAddBookmarks)
assertTrue(browserViewState().canAddFavorite)
assertTrue(browserViewState().addFavorite.isEnabled())
}

@Test
Expand Down Expand Up @@ -3345,7 +3384,7 @@ class BrowserTabViewModelTest {

private fun givenOneActiveTabSelected() {
selectedTabLiveData.value = TabEntity("TAB_ID", "https://example.com", "", skipHome = false, viewed = true, position = 0)
testee.loadData("TAB_ID", "https://example.com", false)
testee.loadData("TAB_ID", "https://example.com", false, false)
}

private fun givenFireproofWebsiteDomain(vararg fireproofWebsitesDomain: String) {
Expand All @@ -3363,7 +3402,7 @@ class BrowserTabViewModelTest {
val siteLiveData = MutableLiveData<Site>()
siteLiveData.value = site
whenever(mockTabRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
testee.loadData("TAB_ID", domain, false)
testee.loadData("TAB_ID", domain, false, false)
}

private fun setBrowserShowing(isBrowsing: Boolean) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,22 @@ class BrowserViewModelTest {
verify(mockPixel).fire(AppPixelName.SHORTCUT_OPENED)
}

@Test
fun whenOpenFavoriteThenSelectByUrlOrNewTab() = coroutinesTestRule.runBlocking {
val url = "example.com"
whenever(mockOmnibarEntryConverter.convertQueryToUrl(url)).thenReturn(url)
testee.onOpenFavoriteFromWidget(url)
verify(mockTabRepository).selectByUrlOrNewTab(url)
}

@Test
fun whenOpenFavoriteFromWidgetThenFirePixel() = coroutinesTestRule.runBlocking {
val url = "example.com"
whenever(mockOmnibarEntryConverter.convertQueryToUrl(url)).thenReturn(url)
testee.onOpenFavoriteFromWidget(url)
verify(mockPixel).fire(AppPixelName.APP_FAVORITES_ITEM_WIDGET_LAUNCH)
}

companion object {
const val TAB_ID = "TAB_ID"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,12 @@ class CtaViewModelTest {
assertNull(value)
}

@Test
fun whenRefreshCtaInHomeTabDuringFavoriteOnboardingThenReturnNull() = runBlockingTest {
val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false, favoritesOnboarding = true)
assertTrue(value is BubbleCta.DaxFavoritesOnboardingCta)
}

@Test
fun whenUserHidesAllTipsThenFireButtonAnimationShouldNotShow() = coroutineRule.runBlocking {
givenOnboardingActive()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,15 @@ class SystemSearchViewModelTest {
assertEquals(Command.LaunchBrowser(quickAccessItem.favorite.url), commandCaptor.lastValue)
}

@Test
fun whenQuickAccessItemClickedThenPixelSent() {
val quickAccessItem = QuickAccessFavorite(Favorite(1, "title", "http://example.com", 0))

testee.onQuickAccesItemClicked(quickAccessItem)

verify(mockPixel).fire(FAVORITE_SYSTEM_SEARCH_ITEM_PRESSED)
}

@Test
fun whenQuickAccessItemEditRequestedThenLaunchEditDialog() {
val quickAccessItem = QuickAccessFavorite(Favorite(1, "title", "http://example.com", 0))
Expand Down
Loading