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 +- .../frost/facebook/parsers/FbParseTest.kt | 7 +++- app/src/web/ts/header_badges.ts | 2 +- 5 files changed, 67 insertions(+), 28 deletions(-) create mode 100644 app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/BadgeParser.kt 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 = 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..a5955101 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 @@ -20,12 +20,12 @@ import com.pitchedapps.frost.internal.COOKIE import com.pitchedapps.frost.internal.assertComponentsNotEmpty import com.pitchedapps.frost.internal.assertDescending import com.pitchedapps.frost.internal.authDependent +import org.junit.BeforeClass +import org.junit.Test import kotlin.test.assertFalse import kotlin.test.assertNotNull import kotlin.test.assertTrue import kotlin.test.fail -import org.junit.BeforeClass -import org.junit.Test /** * Created by Allan Wang on 24/12/17. @@ -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); } -- cgit v1.2.3 From dc80e50e55fc94e3b9d3fbcca2720e84868ed1da Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Sun, 28 Jun 2020 23:10:52 -0700 Subject: Apply spotless --- .../pitchedapps/frost/activities/MainActivity.kt | 1 - .../frost/facebook/parsers/BadgeParser.kt | 26 +++++++++++++++++----- .../frost/facebook/parsers/FbParseTest.kt | 4 ++-- 3 files changed, 23 insertions(+), 8 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 97e828b6..755064cd 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt @@ -29,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() { 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 index db2bcfcb..b4fb54a6 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/BadgeParser.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/BadgeParser.kt @@ -1,3 +1,19 @@ +/* + * 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 . + */ package com.pitchedapps.frost.facebook.parsers import com.pitchedapps.frost.R @@ -13,10 +29,10 @@ data class FrostBadges( val notifications: String? ) : ParseData { override val isEmpty: Boolean - get() = feed.isNullOrEmpty() - && friends.isNullOrEmpty() - && messages.isNullOrEmpty() - && notifications.isNullOrEmpty() + get() = feed.isNullOrEmpty() && + friends.isNullOrEmpty() && + messages.isNullOrEmpty() && + notifications.isNullOrEmpty() } private class BadgeParserImpl : FrostParserBase(false) { @@ -45,4 +61,4 @@ private class BadgeParserImpl : FrostParserBase(false) { notifications = notifications ) } -} \ No newline at end of file +} 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 a5955101..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 @@ -20,12 +20,12 @@ import com.pitchedapps.frost.internal.COOKIE import com.pitchedapps.frost.internal.assertComponentsNotEmpty import com.pitchedapps.frost.internal.assertDescending import com.pitchedapps.frost.internal.authDependent -import org.junit.BeforeClass -import org.junit.Test import kotlin.test.assertFalse import kotlin.test.assertNotNull import kotlin.test.assertTrue import kotlin.test.fail +import org.junit.BeforeClass +import org.junit.Test /** * Created by Allan Wang on 24/12/17. -- cgit v1.2.3