Skip to content

Commit

Permalink
Support for Import / Export bookmarks (duckduckgo#1211)
Browse files Browse the repository at this point in the history
* added html parser for bookmarks

* adding import tests

* added stream parsing

* added ability to store imported bookmarks

* we can now export bookmarks

* added missing text listener for the search view

* separating responsibilities when managing bookmarks

* adding missing tests for parsing

* created parser to deal with html

* added missing test

* improved messaging

* code cleanup before PR

* spotless changes

* the bookmarks fike now has today's date as a suffix

* alligning overlflow menus

* cleaning up code and tests

* improved algorithm

* improved algorithm to support folders when needed

* address PR comments

* added local test files instead of html

* fixed missing tests
  • Loading branch information
malmstein authored Apr 30, 2021
1 parent 4d47ef5 commit 2e32c84
Show file tree
Hide file tree
Showing 26 changed files with 931 additions and 19 deletions.
3 changes: 3 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,9 @@ dependencies {
// Play Store referrer library
playImplementation("com.android.installreferrer:installreferrer:_")

// HTML
implementation 'org.jsoup:jsoup:_'

// Testing dependencies
androidTestImplementation AndroidX.test.runner
androidTestImplementation AndroidX.test.rules
Expand Down
16 changes: 16 additions & 0 deletions app/src/androidTest/assets/bookmarks_chrome.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!-- This is an automatically generated file.
It will be read and overwritten.
DO NOT EDIT! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>
<DT><H3 ADD_DATE="1591951551" LAST_MODIFIED="1604574986" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks bar</H3>
<DL><p>
<DT><A HREF="https://jupyter.duckduckgo.com/notebooks/Mobile/Android%20Monday%20Health%20Check%20(DO%20NOT%20CHANGE).ipynb" ADD_DATE="1592401423" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABEUlEQVQ4jcWQvUoDURCFv3OjmFYLQUSwsAgi0cbCIr6AxFewNeAb6LJ3Kx/AxiJPkTQ2VlY2dvaCdkZEsFCEHYvsun9mt8zAbc7MOfPNhXmXyoJ5hhgnwMI/8zHiUp6LVHAFc8BujTmd3y4LWbXoJeahIpR/iP1k6sYCepUTzNPGuAe6M7aDMH7YYJFbeToUUGMOEF3EO2+s6YrvXLjDeMT4xLEKPKW9LMBxhAHGMit8WZj/nD+CEHEMjAp/YNNTzmaiZzXC0c8HTAkCDjGWaq3iGZhgSBEvBQJaRI27jTExfcQ4L7ukudNgnxBzXb4/OwFeEXvyGVoF4Jx1HFvyPFQDxADjzkI2ayg+EKcNpHOoXxoSRSLf8t9OAAAAAElFTkSuQmCC">Android Monday Health Check</A>
<DT><A HREF="https://play.google.com/apps/publish/?account=5949020878215944484#AppListPlace" ADD_DATE="1592401445" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACv0lEQVQ4jXWTz2vcVRTFP/e99/3Oj0yaTqXaUoXQRlqlrRvRXYypFBQVVKJSKLjxP6hL6YjQLkRcuKroRlurDkKpoaSSyNAqWnWhKRlroNJCC1asTOLMd74z8967LprEUMjZXs655557rwCMTrxW3L3VH2C59/358/V/ACZqNccGaBw9GhBRAAE48MIrz5bKlbPR+yu9bvvY3NkvT25EvhsCMPniocOFNPk4LVcob74HkAvF6pYZsUnPqApAFFFRVRFTIHHnPnzj9XlQcQAaJATv1ZUr3o1sNagfV+y4hkhc6aQa0RgpVYbpZZkB5idqb9n/51QVg0hlqCzeD4KIRCsiqooCQVU1akjTxEKxBdBYWFAHIE40xIC1Ru7bvkOCHxgxYvK+x1mDs5bUGq0UU7PUCwYjtwCmpqYwAN77O51UiRoRlDzvy2Nj98uOakVu3W7JxN5dMrl/TPM8l9s3ru0BqDebagF27nloX1R9aWhTVe99YFSW2l3ZVh3mqUcepJgmur26iU43Y+anBSPG+JuLzcnhkc2lGx99MGtWE1ZVVGDgI0/s28X4wzt5/6sL2up0Zf/oNmn8uoiPGkRMgrE2RgXAAYQAogqqKJGRUkEvX7tJRPjhynX99vKiLxYLiUsKLvt3+XfrkiOXZqen1wRERKOPqIimSaLnfv7NiKDlQhoGg4FzaSnJ2sut9lLr3e9mL743//UnndXlrTgIINDPMsk7bURDiCGYnh84P/D9bLl1+u+//nz783fevLqSvq3X62HtEh8/+PyrSSH9NIYQrHNY61yMERU5mQ6NHJ87daJ5h/iFrddfDutP2ayoWFUExMUQXd7tNrJO58mLZz47PHfqRLNWqxlA7iavOXj04HNPJ0k6TYzNoHrsx5kzp9fXAd3omRxA6w//zZYx80w/X7r0S6PRWucubkRcxX9dW1MuUy8+TgAAAABJRU5ErkJggg==">DDG - Google Play Console</A>
<DT><A HREF="https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/net/Uri.java#L457" ADD_DATE="1593088207" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABeklEQVQ4jY3Tv2qVQRAF8PPdP7k3itoE7SOIKFZiDAZsfBJFfBDRQjBFGkFiJ/gKerGwsRAsvaKFFhYWgo3GxEA0P4vMhTUk4sDy7c6cMztzZr9kn2EFD/Eem7Xele/yfnxLnMP9Isxst9bMfhRmriX2MMLE/9ukOL1ZktUKvMANvMIGpnhT+9e4jmeFvTcjL2ELv7BevjFOYYgBFjBfsbXCbuLiIMnNJPPV0Tb6XddtJ9luJPqKDv0kO0n6SY4kuZVSeBc/cabRpWt06mZnLJaYu5im+oPPGB06pr9Fn1aCjV6SYcWOJhm3Nx9A7pKMkywk6ZIMe0k+JJHkRJLlruugf0ALg67rJFlJcrI4H4NHVc53fMLZf1RwDm/xu9peD5brcBuPa/8cSw3xAp7gW8V3apSXZoC1quI87uApTjcJFptXuFXf1VbVPl7WSK+1txdmjC9Nkom9f6fXggZ40ICON7Fj1feOvWc/zGGGK9XGqPGNcBdX9+P/AO1cPr7g2LjWAAAAAElFTkSuQmCC">platform_frameworks_base/Uri.java at master · aosp-mirror/platform_frameworks_base</A>
<DT><A HREF="https://app.asana.com/0/414730916066338/598549668511654" ADD_DATE="1602158499" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACFElEQVQ4jZVTTWtTURA9c+97+XqWJvGjtI1tQNBapGBBIbuAEHcSkFhcFLNuwYUtXUeXRcSFZNt22UpA/AMGuq9QIeKiIAXTaih5afS9l/dxx4UGEk38OKs7zDnDzJ0zwBAwSmLQ+7/AmVSUM6nonzg0VHz/4ZpiLAEMobhMOy/W/1qAAUGA8hceF6Sh7wSBA4AgRRiB5dzTtp+87HK6mv7ZCgUCADVi3cZo0+dk3VFnPzmImz5G/Fwvpwvtt9YB8uLH+7jQ0YTbBAOAbmlSi+zzgJGpV0j4wedSOqISU1vCaN4FANVOVETr8AGVPjq/cvvwBlmNV4ozvJozAIAr5+a5Mj4PALyaM3ilOMMoyL4OutV4Ye1qEDuzRcn6NTF+WEfs6BEtvX0NAFy+fgfWxLPg6OKEOJl859ntYnh7/T0DpHV/n9EqS8RvuLYehDrRSyyNDX56+QoAcMfYoE4kGdhaIIV2U6JdZuAWANYIYM7OGkHQmhO26RHi5DVsV08giVBsGtBBVjjpN0ddOHGh7JbHvjmH7GyMqrWvggFCtWZJ8vaEdqqz7ZNuTYX8xmQDn2MH+HD+IGikGtq36RAsIiFPdQl3D9WaxQCJn6tQrq+WudPcleqLw5ZXQ2tskZ6/Mmlz02RzbJFtVZPq2OHOya6r1HKvmfp9kM+nB/mfM5ko5/PpgaLubvvj4dc4yFD/lByU+w7ITvEGWWOkEQAAAABJRU5ErkJggg==">Android App Development - Android Runtime Permissions Explanations - Asana</A>
</DL><p>
</DL><p>
20 changes: 20 additions & 0 deletions app/src/androidTest/assets/bookmarks_ddg.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!--This is an automatically generated file.
It will be read and overwritten.
Do Not Edit! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<Title>Bookmarks</Title>
<H1>Bookmarks</H1>
<DL><p>
<DT><H3 ADD_DATE="1618844074" LAST_MODIFIED="1618844074" PERSONAL_TOOLBAR_FOLDER="true">DuckDuckGo</H3>
<DL><p>
<DT><A HREF="https://as.com/" ADD_DATE="1618844074" LAST_MODIFIED="1618844074">AS.com - Diario online deportivo. Fútbol, motor y mucho más</A>
<DT><A HREF="https://duckduckgo.com/" ADD_DATE="1618844074" LAST_MODIFIED="1618844074">DuckDuckGo — Privacy, simplified.</A>
<DT><A HREF="https://www.marca.com/" ADD_DATE="1618844074" LAST_MODIFIED="1618844074">MARCA - Diario online líder en información deportiva</A>
<DT><A HREF="https://www.theguardian.com/international" ADD_DATE="1618844074" LAST_MODIFIED="1618844074">News, sport and opinion from the Guardian's global edition | The Guardian</A>
<DT><A HREF="https://techcrunch.com/?guccounter=1&guce_referrer=aHR0cHM6Ly9kdWNrZHVja2dvLmNvbS8&guce_referrer_sig=AQAAACdhXW_dqakygy4xUsVfjwIe8BBzLhYJl_hQTCHRtp1JKgSREnt73ekOXwJl7CRAfSxgRwJN9JomkpV7yC12x5C8Gu0LF4JXndNOebaS_AgcWrRbBubET328uCW9rmb_hsSoSzu10DGTxSBNgwmiQAkOBkjEHFpWKyj-SFmQVAZw" ADD_DATE="1618844074" LAST_MODIFIED="1618844074">TechCrunch – Startup and Technology News</A>
<DT><A HREF="https://venturebeat.com/" ADD_DATE="1618844074" LAST_MODIFIED="1618844074">VentureBeat | Transformative tech coverage that matters</A>
<DT><A HREF="https://spreadprivacy.com/" ADD_DATE="1618844074" LAST_MODIFIED="1618844074">Spread Privacy</A>
<DT><A HREF="https://strolen.com/viewing/30_Ways_to_hide_a_Body" ADD_DATE="1618844074" LAST_MODIFIED="1618844074">SC: 7 Ways to hide a Body</A>
</DL><p>
</DL><p>
23 changes: 23 additions & 0 deletions app/src/androidTest/assets/bookmarks_firefox.html

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions app/src/androidTest/assets/bookmarks_invalid.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
asdasdasdasdasdas
5 changes: 5 additions & 0 deletions app/src/androidTest/java/com/duckduckgo/app/FileUtilities.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.duckduckgo.app

import java.io.BufferedReader
import java.io.InputStream

object FileUtilities {

Expand All @@ -26,4 +27,8 @@ object FileUtilities {
return javaClass.classLoader!!.getResource(resourceName).openStream().bufferedReader()
}

fun loadResource(resourceName: String): InputStream {
return javaClass.classLoader!!.getResource(resourceName).openStream()
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -61,21 +61,21 @@ class BookmarksDaoTest {
val bookmark = BookmarkEntity(id = 1, title = "title", url = "www.example.com")
dao.insert(bookmark)
dao.delete(bookmark)
val list = dao.bookmarks().blockingObserve()
val list = dao.getBookmarks().blockingObserve()
assertTrue(list!!.isEmpty())
}

@Test
fun whenBookmarkAddedThenItIsInList() {
val bookmark = BookmarkEntity(id = 1, title = "title", url = "www.example.com")
dao.insert(bookmark)
val list = dao.bookmarks().blockingObserve()
val list = dao.getBookmarks().blockingObserve()
assertEquals(listOf(bookmark), list)
}

@Test
fun whenInInitialStateThenTheBookmarksAreEmpty() {
val list = dao.bookmarks().blockingObserve()
val list = dao.getBookmarks().blockingObserve()
assertNotNull(list)
assertTrue(list!!.isEmpty())
}
Expand Down
Loading

0 comments on commit 2e32c84

Please sign in to comment.