aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2020-06-28 23:26:25 -0700
committerGitHub <noreply@github.com>2020-06-28 23:26:25 -0700
commitcf7962e6d285104fe3b3057e9fe4f5284c372459 (patch)
tree8c44274a8e1b825f397a6282c638311005ae87d8
parentaee8e7e00ceb476c6653d6f8328f1b376d747c0d (diff)
parentdc80e50e55fc94e3b9d3fbcca2720e84868ed1da (diff)
downloadfrost-cf7962e6d285104fe3b3057e9fe4f5284c372459.tar.gz
frost-cf7962e6d285104fe3b3057e9fe4f5284c372459.tar.bz2
frost-cf7962e6d285104fe3b3057e9fe4f5284c372459.zip
Merge pull request #1692 from AllanWang/badged-icon
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt37
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/BadgeParser.kt64
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/views/BadgedIcon.kt2
-rw-r--r--app/src/test/kotlin/com/pitchedapps/frost/facebook/parsers/FbParseTest.kt3
-rw-r--r--app/src/web/ts/header_badges.ts2
5 files changed, 81 insertions, 27 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt
index 6522721d..755064cd 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt
@@ -21,6 +21,7 @@ import androidx.viewpager.widget.ViewPager
import ca.allanwang.kau.utils.withMainContext
import com.google.android.material.tabs.TabLayout
import com.pitchedapps.frost.facebook.FbItem
+import com.pitchedapps.frost.facebook.parsers.BadgeParser
import com.pitchedapps.frost.kotlin.subscribeDuringJob
import com.pitchedapps.frost.utils.L
import com.pitchedapps.frost.views.BadgedIcon
@@ -28,7 +29,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.BroadcastChannel
import kotlinx.coroutines.channels.Channel
-import org.jsoup.Jsoup
@UseExperimental(ExperimentalCoroutinesApi::class)
class MainActivity : BaseMainActivity() {
@@ -91,32 +91,19 @@ class MainActivity : BaseMainActivity() {
}
})
headerBadgeChannel.subscribeDuringJob(this@MainActivity, Dispatchers.IO) { html ->
- try {
- val doc = Jsoup.parse(html)
- if (doc.select("[data-sigil=count]").isEmpty())
- return@subscribeDuringJob // Header doesn't exist
- val (feed, requests, messages, notifications) = listOf(
- "feed",
- "requests",
- "messages",
- "notifications"
- )
- .map { "[data-sigil*=$it] [data-sigil=count]" }
- .map { doc.select(it) }
- .map { e -> e?.getOrNull(0)?.ownText() }
- L.v { "Badges $feed $requests $messages $notifications" }
- withMainContext {
- tabsForEachView { _, view ->
- when (view.iicon) {
- FbItem.FEED.icon -> view.badgeText = feed
- FbItem.FRIENDS.icon -> view.badgeText = requests
- FbItem.MESSAGES.icon -> view.badgeText = messages
- FbItem.NOTIFICATIONS.icon -> view.badgeText = notifications
- }
+ val data =
+ BadgeParser.parseFromData(cookie = fbCookie.webCookie, text = html)?.data
+ ?: return@subscribeDuringJob
+ L.v { "Badges $data" }
+ withMainContext {
+ tabsForEachView { _, view ->
+ when (view.iicon) {
+ FbItem.FEED.icon -> view.badgeText = data.feed
+ FbItem.FRIENDS.icon -> view.badgeText = data.friends
+ FbItem.MESSAGES.icon -> view.badgeText = data.messages
+ FbItem.NOTIFICATIONS.icon -> view.badgeText = data.notifications
}
}
- } catch (e: Exception) {
- L.e(e) { "Header badge error" }
}
}
}
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/BadgeParser.kt b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/BadgeParser.kt
new file mode 100644
index 00000000..b4fb54a6
--- /dev/null
+++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/BadgeParser.kt
@@ -0,0 +1,64 @@
+/*
+ * 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.facebook.parsers
+
+import com.pitchedapps.frost.R
+import com.pitchedapps.frost.facebook.FB_URL_BASE
+import org.jsoup.nodes.Document
+
+object BadgeParser : FrostParser<FrostBadges> by BadgeParserImpl()
+
+data class FrostBadges(
+ val feed: String?,
+ val friends: String?,
+ val messages: String?,
+ val notifications: String?
+) : ParseData {
+ override val isEmpty: Boolean
+ get() = feed.isNullOrEmpty() &&
+ friends.isNullOrEmpty() &&
+ messages.isNullOrEmpty() &&
+ notifications.isNullOrEmpty()
+}
+
+private class BadgeParserImpl : FrostParserBase<FrostBadges>(false) {
+ // Not actually displayed
+ override var nameRes: Int = R.string.frost_name
+
+ override val url: String = FB_URL_BASE
+
+ override fun parseImpl(doc: Document): FrostBadges? {
+ val header = doc.getElementById("header") ?: return null
+ if (header.select("[data-sigil=count]").isEmpty())
+ return null
+ val (feed, requests, messages, notifications) = listOf(
+ "feed",
+ "requests",
+ "messages",
+ "notifications"
+ )
+ .map { "[data-sigil*=$it] [data-sigil=count]" }
+ .map { doc.select(it) }
+ .map { e -> e?.getOrNull(0)?.ownText() }
+ return FrostBadges(
+ feed = feed,
+ friends = requests,
+ messages = messages,
+ notifications = notifications
+ )
+ }
+}
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/views/BadgedIcon.kt b/app/src/main/kotlin/com/pitchedapps/frost/views/BadgedIcon.kt
index 462f09ae..fb56d4dc 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/views/BadgedIcon.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/views/BadgedIcon.kt
@@ -50,7 +50,7 @@ class BadgedIcon @JvmOverloads constructor(
binding.init()
}
- fun ViewBadgedIconBinding.init() {
+ private fun ViewBadgedIconBinding.init() {
val badgeColor =
prefs.mainActivityLayout.backgroundColor(prefs).withAlpha(255).colorToForeground(0.2f)
val badgeBackground =
diff --git a/app/src/test/kotlin/com/pitchedapps/frost/facebook/parsers/FbParseTest.kt b/app/src/test/kotlin/com/pitchedapps/frost/facebook/parsers/FbParseTest.kt
index 22fe7ef3..e3b449c0 100644
--- a/app/src/test/kotlin/com/pitchedapps/frost/facebook/parsers/FbParseTest.kt
+++ b/app/src/test/kotlin/com/pitchedapps/frost/facebook/parsers/FbParseTest.kt
@@ -91,4 +91,7 @@ class FbParseTest {
)
}
}
+
+ @Test
+ fun badge() = BadgeParser.test()
}
diff --git a/app/src/web/ts/header_badges.ts b/app/src/web/ts/header_badges.ts
index 473749f2..3f758859 100644
--- a/app/src/web/ts/header_badges.ts
+++ b/app/src/web/ts/header_badges.ts
@@ -1,6 +1,6 @@
// Fetches the header contents if it exists
(function() {
- const header = document.getElementById('mJewelNav');
+ const header = document.getElementById('header');
if (header) {
Frost.handleHeader(header.outerHTML);
}