aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt36
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/BadgeParser.kt48
-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.kt7
-rw-r--r--app/src/web/ts/header_badges.ts2
5 files changed, 67 insertions, 28 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..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<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
+ )
+ }
+} \ 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);
}