From 89d34a1a712bef4fb2cf81ea9aaf6199effa112b Mon Sep 17 00:00:00 2001 From: Amine Date: Sun, 14 Oct 2018 15:38:06 +0200 Subject: [PATCH] Closes #1. May need some fine tuning. --- .../bou/readerforselfoss/HomeActivity.kt | 120 +++++++++++++----- .../settings/SettingsActivity.java | 22 ++++ ...ic_signal_wifi_statusbar_not_connected.png | Bin 0 -> 523 bytes ...ic_signal_wifi_statusbar_not_connected.png | Bin 0 -> 361 bytes ...ic_signal_wifi_statusbar_not_connected.png | Bin 0 -> 660 bytes ...ic_signal_wifi_statusbar_not_connected.png | Bin 0 -> 982 bytes ...ic_signal_wifi_statusbar_not_connected.png | Bin 0 -> 1250 bytes app/src/main/res/values/strings.xml | 4 + app/src/main/res/xml/pref_headers.xml | 6 + app/src/main/res/xml/pref_offline.xml | 8 ++ 10 files changed, 130 insertions(+), 30 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_signal_wifi_statusbar_not_connected.png create mode 100644 app/src/main/res/drawable-mdpi/ic_signal_wifi_statusbar_not_connected.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_signal_wifi_statusbar_not_connected.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_signal_wifi_statusbar_not_connected.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_signal_wifi_statusbar_not_connected.png create mode 100644 app/src/main/res/xml/pref_offline.xml diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/HomeActivity.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/HomeActivity.kt index 716324f..7973ce9 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/HomeActivity.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/HomeActivity.kt @@ -107,6 +107,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { private var displayAccountHeader: Boolean = false private var infiniteScroll: Boolean = false private var lastFetchDone: Boolean = false + private var itemsCaching: Boolean = false private var hiddenTags: List = emptyList() private lateinit var tabNewBadge: TextBadgeItem @@ -180,24 +181,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { handleSwipeRefreshLayout() } - private fun handleGDPRDialog(GDPRShown: Boolean) { - val sharedEditor = sharedPref.edit() - if (!GDPRShown) { - val alertDialog = AlertDialog.Builder(this).create() - alertDialog.setTitle(getString(R.string.gdpr_dialog_title)) - alertDialog.setMessage(getString(R.string.gdpr_dialog_message)) - alertDialog.setButton( - AlertDialog.BUTTON_NEUTRAL, - "OK" - ) { dialog, _ -> - sharedEditor.putBoolean("GDPR_shown", true) - sharedEditor.commit() - dialog.dismiss() - } - alertDialog.show() - } - } - private fun handleSwipeRefreshLayout() { swipeRefreshLayout.setColorSchemeResources( R.color.refresh_progress_1, @@ -350,9 +333,33 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { getElementsAccordingToTab() + handleGDPRDialog(sharedPref.getBoolean("GDPR_shown", false)) } + private fun getAndStoreAllItems() { + api.allItems().enqueue(object : Callback> { + override fun onFailure(call: Call>, t: Throwable) { + } + + override fun onResponse( + call: Call>, + response: Response> + ) { + thread { + if (response.body() != null) { + val apiItems = (response.body() as ArrayList).filter { + maybeTagFilter != null || filter(it.tags) + } as ArrayList + db.itemsDao().deleteAllItems() + db.itemsDao() + .insertAllItems(*(apiItems.map { it.toEntity() }).toTypedArray()) + } + } + } + }) + } + override fun onStop() { super.onStop() customTabActivityHelper.unbindCustomTabsService(this) @@ -371,6 +378,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { userIdentifier = sharedPref.getString("unique_id", "") displayAccountHeader = sharedPref.getBoolean("account_header_displaying", false) infiniteScroll = sharedPref.getBoolean("infinite_loading", false) + itemsCaching = sharedPref.getBoolean("items_caching", false) hiddenTags = if (sharedPref.getString("hidden_tags", "").isNotEmpty()) { sharedPref.getString("hidden_tags", "").replace("\\s".toRegex(), "").split(",") } else { @@ -729,8 +737,10 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { thread { var drawerData = DrawerData(db.drawerDataDao().tags().map { it.toView() }, db.drawerDataDao().sources().map { it.toView() }) - handleDrawerData(drawerData, loadedFromCache = true) - drawerApiCalls(drawerData) + runOnUiThread { + handleDrawerData(drawerData, loadedFromCache = true) + drawerApiCalls(drawerData) + } } } @@ -854,6 +864,15 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { appendResults: Boolean = false, offsetOverride: Int? = null ) { + fun doGetAccordingToTab() { + when (elementsShown) { + UNREAD_SHOWN -> getUnRead(appendResults) + READ_SHOWN -> getRead(appendResults) + FAV_SHOWN -> getStarred(appendResults) + else -> getUnRead(appendResults) + } + } + offset = if (appendResults && offsetOverride === null) { (offset + itemsNumber) } else { @@ -861,12 +880,35 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { } firstVisible = if (appendResults) firstVisible else 0 - when (elementsShown) { - UNREAD_SHOWN -> getUnRead(appendResults) - READ_SHOWN -> getRead(appendResults) - FAV_SHOWN -> getStarred(appendResults) - else -> getUnRead(appendResults) + if (itemsCaching) { + + if (!swipeRefreshLayout.isRefreshing) { + swipeRefreshLayout.post { swipeRefreshLayout.isRefreshing = true } + } + + thread { + val dbItems = db.itemsDao().items().map { it.toView() } + runOnUiThread { + if (dbItems.isNotEmpty()) { + items = when (elementsShown) { + UNREAD_SHOWN -> ArrayList(dbItems.filter { it.unread }) + READ_SHOWN -> ArrayList(dbItems.filter { !it.unread }) + FAV_SHOWN -> ArrayList(dbItems.filter { it.starred }) + else -> ArrayList(dbItems.filter { it.unread }) + } + handleListResult() + doGetAccordingToTab() + } else { + doGetAccordingToTab() + getAndStoreAllItems() + } + } + } + + } else { + doGetAccordingToTab() } + } private fun filter(tags: String): Boolean { @@ -880,9 +922,10 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { call: (String?, Long?, String?) -> Call> ) { fun handleItemsResponse(response: Response>) { - val shouldUpdate = (response.body() != items) + val shouldUpdate = (response.body()?.toSet() != items.toSet()) if (response.body() != null) { if (shouldUpdate) { + getAndStoreAllItems() items = response.body() as ArrayList items = items.filter { maybeTagFilter != null || filter(it.tags) @@ -902,9 +945,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { allItems = ArrayList() } } - if (shouldUpdate) { - handleListResult(appendResults) - } + + handleListResult(appendResults) if (!appendResults) mayBeEmpty() swipeRefreshLayout.isRefreshing = false @@ -1269,8 +1311,26 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { else -> badgeNew // if !elementsShown then unread are fetched. } - fun updateItems(adapterItems: ArrayList) { + private fun updateItems(adapterItems: ArrayList) { items = adapterItems } + + private fun handleGDPRDialog(GDPRShown: Boolean) { + val sharedEditor = sharedPref.edit() + if (!GDPRShown) { + val alertDialog = AlertDialog.Builder(this).create() + alertDialog.setTitle(getString(R.string.gdpr_dialog_title)) + alertDialog.setMessage(getString(R.string.gdpr_dialog_message)) + alertDialog.setButton( + AlertDialog.BUTTON_NEUTRAL, + "OK" + ) { dialog, _ -> + sharedEditor.putBoolean("GDPR_shown", true) + sharedEditor.commit() + dialog.dismiss() + } + alertDialog.show() + } + } } diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/settings/SettingsActivity.java b/app/src/main/java/apps/amine/bou/readerforselfoss/settings/SettingsActivity.java index ff1b573..69e8f48 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/settings/SettingsActivity.java +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/settings/SettingsActivity.java @@ -135,6 +135,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { return PreferenceFragment.class.getName().equals(fragmentName) || GeneralPreferenceFragment.class.getName().equals(fragmentName) || ArticleViewerPreferenceFragment.class.getName().equals(fragmentName) + || OfflinePreferenceFragment.class.getName().equals(fragmentName) || DebugPreferenceFragment.class.getName().equals(fragmentName) || LinksPreferenceFragment.class.getName().equals(fragmentName) || ThemePreferenceFragment.class.getName().equals(fragmentName); @@ -363,6 +364,27 @@ public class SettingsActivity extends AppCompatPreferenceActivity { } } + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public static class OfflinePreferenceFragment extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.pref_offline); + setHasOptionsMenu(true); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + getActivity().finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + } + + @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); diff --git a/app/src/main/res/drawable-hdpi/ic_signal_wifi_statusbar_not_connected.png b/app/src/main/res/drawable-hdpi/ic_signal_wifi_statusbar_not_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..f45bb361f7adcd32ee1578fb983711d15a3d0217 GIT binary patch literal 523 zcmV+m0`&cfP)#~6ko!ENJP32&jry$ycWWL zZfiQ`d8cN_Ihkbc^qgPkp8vgbF7R)(W~hi^0y9`Z23f3P8FL&Dp%*Rkm=HRUz#?+4 zzJy`Mh1^jM7+_#d+LsVzjsq&e3FUnID)UUp8uVkO3e>l+Fkhc|8%vz~wa+3_QZO3; ztTgSg28;)Ui+?YT$pB!JmFm?YT?HV^dZl=2#Y&T5u!v7()7%?MIafhnNd}{-K47D$ z_1<1FN!YlkQZIIJjSpVi=&|3e6B4jx)H8MpkNDL6ftfZYBS}mw{9A!J#x738-Ho++ znzedL($1(gf!Gw24q;1-^7a+%_P}W(>@)otjpd9mUO3)!k|gSi)81$V^Q>OQ?ua{d z{(vT3aE+GuX))Oi=Ot6ee|N&Err3U55%$ET>|!nK5B9i}33f@?8>2m}OXB^)I4A6# zyH>)SB#G(~c~P}>*{)_MNz%~24hVZilPpfLNHVW~M>IPk?$l57{wYbu)UZ|Rsrow& zbQ*A-K^!jz%CJGpFBd4H;2$_n*qF`pB5QZ=AEywe*gP)~cJ^lvg)GuROHjX8q`5Lz%;Gcdsdf|J1& zj}`|8K6sF!1idiM&~s&AXAoyt#_)yVGs6-FQPf~pz@bSVsObvBe}?M}H-O|N23AyU z`dBq_Fhl?qPY0`*1!RSyYGML<6H^ldFi|xCV+RD>ftsq(lM)A(gv5a)KNqOU3o``@ zVFZW*T&^9cWij@ID~}O+EMW0ipq913IK=_ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_signal_wifi_statusbar_not_connected.png b/app/src/main/res/drawable-xhdpi/ic_signal_wifi_statusbar_not_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..7b965c14c6b342a56d0c3b1b278a0288b237a3c4 GIT binary patch literal 660 zcmV;F0&D$=P)jd7b+&#xk}+pU%^^09$_^U%qnH>Qi4jQzoa_SR2}0~f+F;Hl!};6Sp}N(g~=k; zlhL*iWj#VFm{6MiAJO{;TLsOqLLtFTRza4Rj4JXuyqA7H~ zHe0x{VD91un@%V-Q>6K%nWJgo0H5)rHLB-MsEh(A$$ISb#5KM#XgK06dqJ5Z&U!TX zXta*~?I&+TFs3k02v;oWfh9+cwOzYeeOS^I_D7LJIS}wlVd_MOwONklG0S!Mn23Zn@f=))k! z5Jv(@EFgnL`bp7maU91GV)Tg!cKC%SZnGFc58YYe6;?H(G(}1Zs@PH( zrBSL?VpXA&9#X~?7H=7h(})Tlb_?yCv@$H-(zH36onnP(Gsiu_;w?_Igyg^~Y17Yn z4yIWGU7~;$v>*Hf(*dLQzTApw-@)`p++q$^L!n}En{C)Q&_rFvFjY2>y~P1`ED&It zjZkdOt9ct7z}`Wca&YZ|L(5vbwsyUNL+j&r-DsfDjuyteFlGXSHbXQ;Y6wUuNfC*G z+5!RBW|kuk_=b?A$a;vjeJ{O^QQ+0y@3qRUBR*t+e(WkKHX_uEq{%I9+7>Spf11`R zY&v(X#kIWZJ#&m{>~vq6?^f6^=r(S@E@IlR9Br}ytpR7TiVbX%ZQwD^7>5sk93#n9 zX(61$5Bw>zZ&()ZYQsvK80L{-tlbvhc|8iyPO{M^3NYT|0v5l&1F>cXdhb%N#e3p#|R+Hu*clSw67q z=jAfSJ{NFWXpQ4?-cB3N@shz^kxghrj^Qc=XV86iMHbGvW7G+ae~{aA3Hf56mNKN$ zvb&(zTw`e8^=@BA&5j(SUtr{$+`3(IT1s`h$`EF{!J)ko&#t99;sCG3a>VN#+9!0l zDMLdz;h+XK*EJ4pgPx2_IdP0VCSxsgXkV!QRv>xDn5RF#f&tAxto|2_Z-D5iWc3n8-VV z*uQ4@3I{ZjW2EU7L4*Sp+2UpPIzi>^8OkcFtbbg80X{5vhi88IaR2}S07*qoM6N<$ Ef=6x1KdS1hSFdY;K!E}U3KVGTD1>tC zMguy~gX2gegK|5Wd*`s#E4)gT5$v?FhvbF7Yaf5(O=i1 z)C(X<9H9TWVj81(oS?haxdT>7|ImV^o?aymrj~3r=YbfYme^Jud05Uvk){?|R+4Nq=fOzRf^1sV zG#PUqjv*wB!)&89Kj(w!MVXOYtkp#~GaIMSOfA+?!lScBe@1B-dKjIOQW@EyQ0`LD zPZb`sXY=_)T#d8ONApH|J|)+2%C-Q`T7nc?N7}O`fcB~fU8nDHy7~3zxUX^g3w^E> zqrSx%L$vs|I_pz2sM6jn_z`H2Uh>o7JDje~lG9^;H-kcR$ap44OVNl)(%dekOf!TC zC1`cjBO3|ysIeMe1*H-0`&Nt2Zl{7)ol|56mBu&UZo*8We)EAueUmV=1#fq8A1bL7 zeAJa$Q!lelnsI!Atc6rLYYs{goDligO)TIGRwzDW9yc&zV18+8w}U|ZU@O54-eI*! zyuq~f*JN#uSplmqyetZ{9?xlovZy{sjGA>e1xva(`S?k5&Z0StI6T}GnlGycV#O*_ zxny$~W2SkRf!^8ZC5r=Zm(+?~3u6VZ4CAcLC5!gZD$%ahIonJ@lRsdVGPfv2H!k2~ z!SAQNW)3N4-QkV;0b4+%;s1!c;;q$nDI%%vt)2y$0-RzyHXbQswU6RBDFG;{dcsX^ zu*Eepm`}`gx9q%a6>kpeJ;BnESMw`{*cUHW8WZDep~PMvi8Ti+r$l-foUitGN;?IbgO$@f zR~VqDA~t``!hp=5IoQsb$E=wBY_Eic)!3QI#|+N0owFq}%wfpnbMJG8a93Q-VH<7C zL?ov%6VJTI;k*}lN(#zW%Mgz~e z&fzR!SWfjWEa2GYNu4xjP3JhAUl^5FkQ8AKM>oj~mKmJin2=jz6=4p|I`^MvaQ@=7 z{KL)*5x2w*a=RRZ$=ZMaopKvvVs53xe8;3g6Ivao}SEoA*$5cjB)tbk} zb?(~F;QT=i98`@3b5LkAqNg(q&}%rX2BGej*Leo$F&tNqt=A}py2Jq8aURHwIiw9# z11>W_*WiMTn!_aJ7(P+8fsd{!lwbHr^_v1U!Dl+Ci*pFRQy4=!uTaA9p<=WbErv5; zb%7 M07*qoM6N<$f;~%2ivR!s literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8e56321..1ee6ad1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -148,4 +148,8 @@ Enable logging Hidden Tags Mark item as unread + Offline and cache + Articles won\'t be saved to the device memory, and the app won\'t be usable offline. + Articles will be saved to the device memory and will be used for offline use. + Save items for offline use diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml index 79c18aa..62fa491 100644 --- a/app/src/main/res/xml/pref_headers.xml +++ b/app/src/main/res/xml/pref_headers.xml @@ -11,6 +11,12 @@ android:icon="@drawable/ic_chrome_reader_mode_black_24" android:title="@string/pref_header_viewer"/> + +
+
+ +