aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2019-04-25 15:53:47 -0700
committerGitHub <noreply@github.com>2019-04-25 15:53:47 -0700
commitcc40f240665871342ea09e64add39a87f2875fc8 (patch)
tree65bab97f88766629ed155c55043e9240ba9e8dae
parent00f25fee8c1b1f002a92d6c9b16088b1b8b33ba4 (diff)
parentb8ab09e645333a76aee19637bda3c4e76f51f5e1 (diff)
downloadfrost-cc40f240665871342ea09e64add39a87f2875fc8.tar.gz
frost-cc40f240665871342ea09e64add39a87f2875fc8.tar.bz2
frost-cc40f240665871342ea09e64add39a87f2875fc8.zip
Merge pull request #1376 from AllanWang/fix-search
Fix search
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/activities/BaseMainActivity.kt6
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/facebook/FbItem.kt3
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/FrostParser.kt12
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/MessageParser.kt4
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/NotifParser.kt4
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/SearchParser.kt5
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/fragments/RecyclerFragmentBase.kt3
-rw-r--r--app/src/test/kotlin/com/pitchedapps/frost/facebook/parsers/FbParseTest.kt8
-rw-r--r--app/src/test/kotlin/com/pitchedapps/frost/internal/Internal.kt5
9 files changed, 39 insertions, 11 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseMainActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseMainActivity.kt
index d8b29ddc..49d5f8bf 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseMainActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseMainActivity.kt
@@ -383,6 +383,11 @@ abstract class BaseMainActivity : BaseActivity(), MainActivityContract,
R.id.action_settings to GoogleMaterial.Icon.gmd_settings,
R.id.action_search to GoogleMaterial.Icon.gmd_search
)
+ bindSearchView(menu)
+ return true
+ }
+
+ private fun bindSearchView(menu: Menu) {
searchViewBindIfNull {
bindSearchView(menu, R.id.action_search, Prefs.iconColor) {
textCallback = { query, searchView ->
@@ -414,7 +419,6 @@ abstract class BaseMainActivity : BaseActivity(), MainActivityContract,
onItemClick = { _, key, _, _ -> launchWebOverlay(key) }
}
}
- return true
}
@SuppressLint("RestrictedApi")
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbItem.kt b/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbItem.kt
index 9ee34ab7..82e15111 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbItem.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbItem.kt
@@ -56,6 +56,9 @@ enum class FbItem(
PHOTOS(R.string.photos, GoogleMaterial.Icon.gmd_photo, "me/photos"),
PROFILE(R.string.profile, CommunityMaterial.Icon.cmd_account, "me"),
SAVED(R.string.saved, GoogleMaterial.Icon.gmd_bookmark, "saved"),
+ /**
+ * Note that this url only works if a query (?q=) is provided
+ */
_SEARCH(R.string.kau_search, GoogleMaterial.Icon.gmd_search, "search/top"),
SETTINGS(R.string.settings, GoogleMaterial.Icon.gmd_settings, "settings"),
;
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/FrostParser.kt b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/FrostParser.kt
index 4c494e0b..24c39e28 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/FrostParser.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/FrostParser.kt
@@ -38,7 +38,7 @@ import org.jsoup.select.Elements
* The return type must be nonnull if no parsing errors occurred, as null signifies a parse error
* If null really must be allowed, use Optionals
*/
-interface FrostParser<out T : Any> {
+interface FrostParser<out T : ParseData> {
/**
* Name associated to parser
@@ -76,11 +76,15 @@ const val FALLBACK_TIME_MOD = 1000000
data class FrostLink(val text: String, val href: String)
-data class ParseResponse<out T>(val cookie: String, val data: T) {
+data class ParseResponse<out T: ParseData>(val cookie: String, val data: T) {
override fun toString() = "ParseResponse\ncookie: $cookie\ndata:\n$data"
}
-interface ParseNotification {
+interface ParseData {
+ val isEmpty: Boolean
+}
+
+interface ParseNotification : ParseData {
fun getUnreadNotifications(data: CookieEntity): List<NotificationContent>
}
@@ -95,7 +99,7 @@ internal fun <T> List<T>.toJsonString(tag: String, indent: Int) = StringBuilder(
* T should have a readable toString() function
* [redirectToText] dictates whether all data should be converted to text then back to document before parsing
*/
-internal abstract class FrostParserBase<out T : Any>(private val redirectToText: Boolean) : FrostParser<T> {
+internal abstract class FrostParserBase<out T : ParseData>(private val redirectToText: Boolean) : FrostParser<T> {
final override fun parse(cookie: String?) = parseFromUrl(cookie, url)
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/MessageParser.kt b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/MessageParser.kt
index 9979cd2b..00a1432f 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/MessageParser.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/MessageParser.kt
@@ -46,6 +46,10 @@ data class FrostMessages(
val seeMore: FrostLink?,
val extraLinks: List<FrostLink>
) : ParseNotification {
+
+ override val isEmpty: Boolean
+ get() = threads.isEmpty()
+
override fun toString() = StringBuilder().apply {
append("FrostMessages {\n")
append(threads.toJsonString("threads", 1))
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/NotifParser.kt b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/NotifParser.kt
index c22524ad..faeaa27c 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/NotifParser.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/NotifParser.kt
@@ -36,6 +36,10 @@ data class FrostNotifs(
val notifs: List<FrostNotif>,
val seeMore: FrostLink?
) : ParseNotification {
+
+ override val isEmpty: Boolean
+ get() = notifs.isEmpty()
+
override fun toString() = StringBuilder().apply {
append("FrostNotifs {\n")
append(notifs.toJsonString("notifs", 1))
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/SearchParser.kt b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/SearchParser.kt
index 7869d881..b044ee58 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/SearchParser.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/parsers/SearchParser.kt
@@ -40,7 +40,10 @@ enum class SearchKeys(val key: String) {
EVENTS("keywords_events")
}
-data class FrostSearches(val results: List<FrostSearch>) {
+data class FrostSearches(val results: List<FrostSearch>) : ParseData {
+
+ override val isEmpty: Boolean
+ get() = results.isEmpty()
override fun toString() = StringBuilder().apply {
append("FrostSearches {\n")
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/fragments/RecyclerFragmentBase.kt b/app/src/main/kotlin/com/pitchedapps/frost/fragments/RecyclerFragmentBase.kt
index ed6a4cf0..9f2d704c 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/fragments/RecyclerFragmentBase.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/fragments/RecyclerFragmentBase.kt
@@ -25,6 +25,7 @@ import com.mikepenz.fastadapter.adapters.ModelAdapter
import com.pitchedapps.frost.R
import com.pitchedapps.frost.facebook.FbCookie
import com.pitchedapps.frost.facebook.parsers.FrostParser
+import com.pitchedapps.frost.facebook.parsers.ParseData
import com.pitchedapps.frost.facebook.parsers.ParseResponse
import com.pitchedapps.frost.utils.L
import com.pitchedapps.frost.utils.frostJsoup
@@ -94,7 +95,7 @@ abstract class GenericRecyclerFragment<T, Item : IItem<*, *>> : RecyclerFragment
open fun getAdapter(): FastAdapter<IItem<*, *>> = fastAdapter(this.adapter)
}
-abstract class FrostParserFragment<T : Any, Item : IItem<*, *>> : RecyclerFragment<Item, Item>() {
+abstract class FrostParserFragment<T : ParseData, Item : IItem<*, *>> : RecyclerFragment<Item, Item>() {
/**
* The parser to make this all happen
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 075f045e..11e2502b 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
@@ -21,7 +21,9 @@ 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.Ignore
import org.junit.Test
+import kotlin.test.assertFalse
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
import kotlin.test.fail
@@ -39,13 +41,14 @@ class FbParseTest {
}
}
- private inline fun <reified T : Any> FrostParser<T>.test(action: T.() -> Unit = {}) =
+ private inline fun <reified T : ParseData> FrostParser<T>.test(action: T.() -> Unit = {}) =
parse(COOKIE).test(url, action)
- private inline fun <reified T : Any> ParseResponse<T>?.test(url: String, action: T.() -> Unit = {}) {
+ private inline fun <reified T : ParseData> ParseResponse<T>?.test(url: String, action: T.() -> Unit = {}) {
val response = this
?: fail("${T::class.simpleName} parser returned null for $url")
println(response)
+ assertFalse(response.data.isEmpty, "${T::class.simpleName} parser returned empty data for $url")
response.data.action()
}
@@ -62,6 +65,7 @@ class FbParseTest {
@Test
fun messageUser() = MessageParser.queryUser(COOKIE, "allan").test("allan query")
+ @Ignore("No longer works as search results don't appear in html")
@Test
fun search() = SearchParser.test()
diff --git a/app/src/test/kotlin/com/pitchedapps/frost/internal/Internal.kt b/app/src/test/kotlin/com/pitchedapps/frost/internal/Internal.kt
index b8d9635a..41473e86 100644
--- a/app/src/test/kotlin/com/pitchedapps/frost/internal/Internal.kt
+++ b/app/src/test/kotlin/com/pitchedapps/frost/internal/Internal.kt
@@ -59,7 +59,7 @@ val AUTH: RequestAuth by lazy {
}
}
-val VALID_COOKIE: Boolean by lazy {
+private val VALID_COOKIE: Boolean by lazy {
val data = testJsoup(FbItem.SETTINGS.url)
data.title() == "Settings"
}
@@ -68,7 +68,8 @@ fun testJsoup(url: String) = frostJsoup(COOKIE, url)
fun authDependent() {
println("Auth Dependent")
- Assume.assumeTrue(COOKIE.isNotEmpty() && VALID_COOKIE)
+ Assume.assumeTrue("Cookie cannot be empty", COOKIE.isNotEmpty())
+ Assume.assumeTrue("Cookie is not valid", VALID_COOKIE)
}
/**