From 5eeff862c8f537f3781ce5ee92341e677f9f89c0 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Sun, 28 Jun 2020 23:03:54 -0700 Subject: Create badge parser and add test --- .../pitchedapps/frost/activities/MainActivity.kt | 36 ++++++---------- .../frost/facebook/parsers/BadgeParser.kt | 48 ++++++++++++++++++++++ .../com/pitchedapps/frost/views/BadgedIcon.kt | 2 +- 3 files changed, 61 insertions(+), 25 deletions(-) create mode 100644 app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/BadgeParser.kt (limited to 'app/src/main/kotlin/com/pitchedapps/frost') 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..97e828b6 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 @@ -91,32 +92,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..db2bcfcb --- /dev/null +++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/BadgeParser.kt @@ -0,0 +1,48 @@ +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 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(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 + ) + } +} \ No newline at end of file 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 = -- cgit v1.2.3