diff options
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/injectors/CssHider.kt | 4 | ||||
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/injectors/CssSmallAssets.kt | 36 | ||||
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt | 10 | ||||
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/settings/Feed.kt | 7 | ||||
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt | 2 | ||||
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/web/DebugWebView.kt | 2 | ||||
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClients.kt | 6 | ||||
-rw-r--r-- | app/src/main/play/en-US/whatsnew | 7 | ||||
-rw-r--r-- | app/src/main/res/values-gr-rGR/strings_pref_feed.xml | 2 | ||||
-rw-r--r-- | app/src/main/res/values/strings_pref_feed.xml | 6 | ||||
-rw-r--r-- | app/src/main/res/xml/frost_changelog.xml | 9 | ||||
-rw-r--r-- | app/src/web/package-lock.json | 72 | ||||
-rw-r--r-- | app/src/web/package.json | 4 | ||||
-rw-r--r-- | app/src/web/ts/auto_resize_textarea.ts | 31 | ||||
-rw-r--r-- | docs/Changelog.md | 4 |
15 files changed, 146 insertions, 56 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssHider.kt b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssHider.kt index 94367853..9630117d 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssHider.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssHider.kt @@ -24,7 +24,7 @@ import com.pitchedapps.frost.utils.Prefs * * List of elements to hide */ -enum class CssHider(vararg val items: String) : InjectorContract { +enum class CssHider(private vararg val items: String) : InjectorContract { CORE("[data-sigil=m_login_upsell]", "[role=progressbar]"), HEADER( "#header:not(.mFuturePageHeader):not(.titled)", @@ -51,7 +51,7 @@ enum class CssHider(vararg val items: String) : InjectorContract { val injector: JsInjector by lazy { JsBuilder().css("${items.joinToString(separator = ",")}{display:none !important}") - .single(name).build() + .single("css-hider-$name").build() } override fun inject(webView: WebView, prefs: Prefs) = diff --git a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssSmallAssets.kt b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssSmallAssets.kt new file mode 100644 index 00000000..27b6e278 --- /dev/null +++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssSmallAssets.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2020 Allan Wang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.pitchedapps.frost.injectors + +import android.webkit.WebView +import com.pitchedapps.frost.utils.Prefs + +/** + * Small misc inline css assets + */ +enum class CssSmallAssets(private val content: String) : InjectorContract { + FullSizeImage("div._4prr[style*=\"max-width\"][style*=\"max-height\"]{max-width:none !important;max-height:none !important}") + ; + + val injector: JsInjector by lazy { + JsBuilder().css(content).single("css-small-assets-$name").build() + } + + override fun inject(webView: WebView, prefs: Prefs) { + injector.inject(webView, prefs) + } +} diff --git a/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt b/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt index 03ab6e96..b7c4bfb0 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt @@ -22,20 +22,20 @@ import androidx.annotation.VisibleForTesting import ca.allanwang.kau.kotlin.lazyContext import com.pitchedapps.frost.utils.L import com.pitchedapps.frost.utils.Prefs +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import java.io.BufferedReader import java.io.FileNotFoundException import java.util.Locale -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext /** * Created by Allan Wang on 2017-05-31. * Mapping of the available assets * The enum name must match the css file name */ -enum class JsAssets : InjectorContract { +enum class JsAssets(private val singleLoad: Boolean = true) : InjectorContract { MENU, CLICK_A, CONTEXT_A, MEDIA, HEADER_BADGES, TEXTAREA_LISTENER, NOTIF_MSG, - DOCUMENT_WATCHER, HORIZONTAL_SCROLLING + DOCUMENT_WATCHER, HORIZONTAL_SCROLLING, AUTO_RESIZE_TEXTAREA(singleLoad = false) ; @VisibleForTesting @@ -43,7 +43,7 @@ enum class JsAssets : InjectorContract { private val injector = lazyContext { try { val content = it.assets.open("js/$file").bufferedReader().use(BufferedReader::readText) - JsBuilder().js(content).single(name).build() + JsBuilder().js(content).run { if (singleLoad) single(name) else this }.build() } catch (e: FileNotFoundException) { L.e(e) { "JsAssets file not found" } JsInjector(JsActions.EMPTY.function) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/settings/Feed.kt b/app/src/main/kotlin/com/pitchedapps/frost/settings/Feed.kt index 15a0633b..22917106 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/settings/Feed.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/settings/Feed.kt @@ -97,4 +97,11 @@ fun SettingsActivity.getFeedPrefs(): KPrefAdapterBuilder.() -> Unit = { }) { descRes = R.string.facebook_ads_desc } + + checkbox(R.string.full_size_image, prefs::fullSizeImage, { + prefs.fullSizeImage = it + shouldRefreshMain() + }) { + descRes = R.string.full_size_image_desc + } } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt index 8b2b5067..1dfd6871 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt @@ -198,6 +198,8 @@ class Prefs(factory: KPrefFactory) : KPref("${BuildConfig.APPLICATION_ID}.prefs" var showCreateFab: Boolean by kpref("show_create_fab", true) + var fullSizeImage: Boolean by kpref("full_size_image", false) + inline val mainActivityLayout: MainActivityLayout get() = MainActivityLayout(mainActivityLayoutType) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/DebugWebView.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/DebugWebView.kt index 8d4deef8..199e9cfb 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/DebugWebView.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/DebugWebView.kt @@ -26,6 +26,7 @@ import android.webkit.WebView import ca.allanwang.kau.utils.withAlpha import com.pitchedapps.frost.facebook.USER_AGENT import com.pitchedapps.frost.injectors.CssHider +import com.pitchedapps.frost.injectors.CssSmallAssets import com.pitchedapps.frost.injectors.jsInject import com.pitchedapps.frost.utils.L import com.pitchedapps.frost.utils.Prefs @@ -116,6 +117,7 @@ class DebugWebView @JvmOverloads constructor( (url?.contains("?sk=h_chr") ?: false) && prefs.aggressiveRecents ), + CssSmallAssets.FullSizeImage.maybe(prefs.fullSizeImage), prefs = prefs ) } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClients.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClients.kt index 4d635547..9e0c64ab 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClients.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClients.kt @@ -29,6 +29,7 @@ import com.pitchedapps.frost.facebook.FbItem import com.pitchedapps.frost.facebook.WWW_FACEBOOK_COM import com.pitchedapps.frost.facebook.formattedFbUrl import com.pitchedapps.frost.injectors.CssHider +import com.pitchedapps.frost.injectors.CssSmallAssets import com.pitchedapps.frost.injectors.JsActions import com.pitchedapps.frost.injectors.JsAssets import com.pitchedapps.frost.injectors.jsInject @@ -80,6 +81,7 @@ open class FrostWebViewClient(val web: FrostWebView) : BaseWebViewClient() { super.doUpdateVisitedHistory(view, url, isReload) urlSupportsRefresh = urlSupportsRefresh(url) web.parent.swipeEnabled = urlSupportsRefresh + view.jsInject(JsAssets.AUTO_RESIZE_TEXTAREA, prefs = prefs) v { "History $url; refresh $urlSupportsRefresh" } } @@ -126,10 +128,12 @@ open class FrostWebViewClient(val web: FrostWebView) : BaseWebViewClient() { (web.url?.contains("?sk=h_chr") ?: false) && prefs.aggressiveRecents ), + CssHider.ADS.maybe(!prefs.showFacebookAds), + CssSmallAssets.FullSizeImage.maybe(prefs.fullSizeImage), JsAssets.DOCUMENT_WATCHER, JsAssets.HORIZONTAL_SCROLLING, + JsAssets.AUTO_RESIZE_TEXTAREA, JsAssets.CLICK_A, - CssHider.ADS.maybe(!prefs.showFacebookAds), JsAssets.CONTEXT_A, JsAssets.MEDIA, prefs = prefs diff --git a/app/src/main/play/en-US/whatsnew b/app/src/main/play/en-US/whatsnew index cd456c04..b63931c3 100644 --- a/app/src/main/play/en-US/whatsnew +++ b/app/src/main/play/en-US/whatsnew @@ -1,5 +1,4 @@ -v2.4.4 +v2.4.5 -* Lots of under the hood fixes -* Fixed sharing -* Fix photo downloads for Android Q+
\ No newline at end of file +* Fix url query encoding +* Add option to make images full screen (settings > news feed)
\ No newline at end of file diff --git a/app/src/main/res/values-gr-rGR/strings_pref_feed.xml b/app/src/main/res/values-gr-rGR/strings_pref_feed.xml index 218ccd7e..ea707524 100644 --- a/app/src/main/res/values-gr-rGR/strings_pref_feed.xml +++ b/app/src/main/res/values-gr-rGR/strings_pref_feed.xml @@ -9,7 +9,7 @@ <string name="composer_desc">Εμφάνιση Δημιουργίας Δημοσίευσης στο feed δημοσιεύσεων</string> <string name="suggested_friends">Προτεινόμενοι Φίλοι</string> - <string name="suggested_friends_desc">Εμφάνισε "Ανθρώπους που ίσως γνωρίζετε" στο feed δημοσιεύσεων</string> + <string name="suggested_friends_desc">Εμφάνισε \"Ανθρώπους που ίσως γνωρίζετε\" στο feed δημοσιεύσεων</string> <string name="suggested_groups">Προτεινόμενες ομάδες</string> <string name="suggested_groups_desc">Εμφάνισε "Προτεινόμενες ομάδες" στο feed</string> <string name="show_stories">Εμφάνιση Ιστοριών</string> diff --git a/app/src/main/res/values/strings_pref_feed.xml b/app/src/main/res/values/strings_pref_feed.xml index 96112059..330c900c 100644 --- a/app/src/main/res/values/strings_pref_feed.xml +++ b/app/src/main/res/values/strings_pref_feed.xml @@ -11,12 +11,14 @@ <string name="create_fab_desc">Show FAB in feed to create new post</string> <string name="suggested_friends">Suggested Friends</string> - <string name="suggested_friends_desc">Show "People You May Know" in the feed</string> + <string name="suggested_friends_desc">Show \"People You May Know\" in the feed</string> <string name="suggested_groups">Suggested Groups</string> - <string name="suggested_groups_desc">Show "Suggested Groups" in the feed</string> + <string name="suggested_groups_desc">Show \"Suggested Groups\" in the feed</string> <string name="show_stories">Show Stories</string> <string name="show_stories_desc">Show stories in the feed</string> <string name="facebook_ads">Facebook Ads</string> <string name="facebook_ads_desc">Show native Facebook ads</string> + <string name="full_size_image">Full Size Images</string> + <string name="full_size_image_desc">Force news feed images to be full width</string> </resources>
\ No newline at end of file diff --git a/app/src/main/res/xml/frost_changelog.xml b/app/src/main/res/xml/frost_changelog.xml index 2193ace9..2fae701b 100644 --- a/app/src/main/res/xml/frost_changelog.xml +++ b/app/src/main/res/xml/frost_changelog.xml @@ -6,6 +6,15 @@ <item text="" /> --> + <version title="v2.4.5" /> + <item text="Fix url query encoding" /> + <item text="Add option to make images full screen (settings > news feed)" /> + <item text="" /> + <item text="" /> + <item text="" /> + <item text="" /> + <item text="" /> + <version title="v2.4.4" /> <item text="Lots of under the hood fixes" /> <item text="Fixed sharing" /> diff --git a/app/src/web/package-lock.json b/app/src/web/package-lock.json index d27e49ef..9cad6fce 100644 --- a/app/src/web/package-lock.json +++ b/app/src/web/package-lock.json @@ -3,19 +3,14 @@ "lockfileVersion": 1, "dependencies": { "anymatch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.2.tgz", - "integrity": "sha512-rUe9SxpRQlVg4EM8It7JMNWWYHAirTPpbTuvaSKybb5IejNgWB3PGBBX9rrPKDx2pM/p3Wh+7+ASaWRyyAbxmQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -44,19 +39,18 @@ } }, "chokidar": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.1.tgz", - "integrity": "sha512-2ww34sJWehnbpV0Q4k4V5Hh7juo7po6z7LUWkcIQnSGN1lHOL8GGtLtfwabKvLFQw/hbSUQ0u6V7OgGYgBzlkQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", "requires": { - "anymatch": "^3.0.1", - "async-each": "^1.0.3", - "braces": "^3.0.2", - "fsevents": "^2.0.6", - "glob-parent": "^5.0.0", - "is-binary-path": "^2.1.0", - "is-glob": "^4.0.1", - "normalize-path": "^3.0.0", - "readdirp": "^3.0.2" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" } }, "compile": { @@ -78,15 +72,15 @@ } }, "fsevents": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", - "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "optional": true }, "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "requires": { "is-glob": "^4.0.1" } @@ -131,16 +125,16 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "picomatch": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", - "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" }, "readdirp": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.0.2.tgz", - "integrity": "sha512-LbyJYv48eywrhOlScq16H/VkCiGKGPC2TpOdZCJ7QXnYEjn3NN/Oblh8QEU3vqfSRBB7OGvh5x45NKiVeNujIQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "requires": { - "picomatch": "^2.0.4" + "picomatch": "^2.2.1" } }, "run": { @@ -152,9 +146,9 @@ } }, "sass": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.2.tgz", - "integrity": "sha512-enuQuy/CbfrZLA2vOy9tB7CK7pP5bZllnMbr5nPGWCFelwt0EMUVGC11gsv9rybkWc8pp/NKVY/c5+AKyjbnXg==", + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz", + "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==", "requires": { "chokidar": ">=2.0.0 <4.0.0" } @@ -168,9 +162,9 @@ } }, "typescript": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", - "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==" + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", + "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==" } } } diff --git a/app/src/web/package.json b/app/src/web/package.json index 3a9b6acc..c3c71b46 100644 --- a/app/src/web/package.json +++ b/app/src/web/package.json @@ -10,7 +10,7 @@ "dependencies": { "compile": "0.0.2", "run": "^1.4.0", - "sass": "^1.19.0", - "typescript": "^3.3.1" + "sass": "^1.26.5", + "typescript": "^3.9.3" } } diff --git a/app/src/web/ts/auto_resize_textarea.ts b/app/src/web/ts/auto_resize_textarea.ts new file mode 100644 index 00000000..e170d14e --- /dev/null +++ b/app/src/web/ts/auto_resize_textarea.ts @@ -0,0 +1,31 @@ +// Credits to https://codepen.io/tomhodgins/pen/KgazaE +(function () { + const textareas = <NodeListOf<HTMLTextAreaElement>>document.querySelectorAll('textarea:not(.frostAutoExpand)'); + + const dataAttribute = 'data-frost-minHeight'; + + const _frostAutoExpand = (el: HTMLElement) => { + if (!el.hasAttribute(dataAttribute)) { + el.setAttribute(dataAttribute, el.offsetHeight.toString()); + } + // If no height is defined, have min bound to current height; + // otherwise we will allow for height decreases in case user deletes text + const minHeight = parseInt(el.getAttribute(dataAttribute) ?? '0'); + el.style.height = 'inherit'; + el.style.height = `${Math.max(el.scrollHeight, minHeight)}px`; + }; + function _frostExpandAll() { + textareas.forEach(_frostAutoExpand); + } + textareas.forEach(el => { + el.classList.add('frostAutoExpand') + const __frostAutoExpand = () => { + _frostAutoExpand(el) + }; + el.addEventListener('paste', __frostAutoExpand) + el.addEventListener('input', __frostAutoExpand) + el.addEventListener('keyup', __frostAutoExpand) + }); + window.addEventListener('load', _frostExpandAll) + window.addEventListener('resize', _frostExpandAll) +}).call(undefined); diff --git a/docs/Changelog.md b/docs/Changelog.md index 51ef89f8..a0429697 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -1,5 +1,9 @@ # Changelog +## v2.4.5 +* Fix url query encoding +* Add option to make images full screen (settings > news feed) + ## v2.4.4 * Lots of under the hood fixes * Fixed sharing |