aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/injectors
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2017-06-14 17:01:13 -0700
committerAllan Wang <me@allanwang.ca>2017-06-14 17:01:13 -0700
commitfbbc92e4c98a30e107fb2a63887f8b6d20bffabb (patch)
treeec603d3379ddad94df084f94132ac0c739bcb4ac /app/src/main/kotlin/com/pitchedapps/frost/injectors
parentaa01ec691ef2638da7c22bf3cbd1a9c5e213ca1f (diff)
downloadfrost-fbbc92e4c98a30e107fb2a63887f8b6d20bffabb.tar.gz
frost-fbbc92e4c98a30e107fb2a63887f8b6d20bffabb.tar.bz2
frost-fbbc92e4c98a30e107fb2a63887f8b6d20bffabb.zip
Update themes and started theme settings
Diffstat (limited to 'app/src/main/kotlin/com/pitchedapps/frost/injectors')
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt8
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/injectors/CssHider.kt19
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/injectors/JsInjector.kt28
3 files changed, 49 insertions, 6 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt
index ad257276..7ef358f3 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt
@@ -9,16 +9,16 @@ import com.pitchedapps.frost.utils.L
* The enum name must match the css file name
* //TODO add folder mapping using Prefs
*/
-enum class CssAssets {
- HEADER, LOGIN
+enum class CssAssets(val folder: String = "themes") : InjectorContract {
+ LOGIN("core"), MATERIAL_LIGHT, MATERIAL_DARK, MATERIAL_AMOLED, MATERIAL_GLASS
;
var file = "${name.toLowerCase()}.compact.css"
var injector: JsInjector? = null
- fun inject(webView: WebView, callback: ((String) -> Unit)?) {
+ override fun inject(webView: WebView, callback: ((String) -> Unit)?) {
if (injector == null) {
- val content = webView.context.assets.open("css/core/$file").bufferedReader().use { it.readText() }
+ val content = webView.context.assets.open("css/$folder/$file").bufferedReader().use { it.readText() }
injector = JsBuilder().css(content).build()
}
injector!!.inject(webView, callback)
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssHider.kt b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssHider.kt
new file mode 100644
index 00000000..5ecc6d66
--- /dev/null
+++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssHider.kt
@@ -0,0 +1,19 @@
+package com.pitchedapps.frost.injectors
+
+import android.webkit.WebView
+
+/**
+ * Created by Allan Wang on 2017-05-31.
+ */
+enum class CssHider(vararg val items: String) : InjectorContract {
+ HEADER("#header[data-sigil=\"MTopBlueBarHeader\"]", "#header-notices", "[data-sigil*=\"m-promo-jewel-header\"]"),
+ ADS("[data-xt*=\"is_sponsored.1\"]")
+ ;
+
+ val injector: JsInjector by lazy { JsBuilder().css("${items.joinToString(separator = ",")}{display:none!important}").build() }
+
+ override fun inject(webView: WebView, callback: ((String) -> Unit)?) {
+ injector.inject(webView, callback)
+ }
+
+} \ No newline at end of file
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsInjector.kt b/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsInjector.kt
index 14e0606b..0000ecf1 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsInjector.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsInjector.kt
@@ -1,6 +1,11 @@
package com.pitchedapps.frost.injectors
import android.webkit.WebView
+import com.pitchedapps.frost.facebook.FbCookie
+import com.pitchedapps.frost.utils.L
+import io.reactivex.Observable
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.subjects.SingleSubject
class JsBuilder {
private val css = StringBuilder()
@@ -30,8 +35,27 @@ class JsBuilder {
}
}
-class JsInjector(val function: String) {
- fun inject(webView: WebView, callback: ((String) -> Unit)? = null) {
+interface InjectorContract {
+ fun inject(webView: WebView) = inject(webView, null)
+ fun inject(webView: WebView, callback: ((String) -> Unit)?)
+}
+
+/**
+ * Helper method to inject multiple functions simultaneously with a single callback
+ */
+fun WebView.jsInject(vararg injectors: InjectorContract, callback: ((Array<String>) -> Unit)) {
+ val observables = Array(injectors.size, { SingleSubject.create<String>() })
+ Observable.zip<String, Array<String>>(observables.map { it.toObservable() }, { it.map { it.toString() }.toTypedArray() }).subscribeOn(AndroidSchedulers.mainThread()).subscribe({
+ callback.invoke(it)
+ })
+ (0 until injectors.size).asSequence().forEach {
+ i ->
+ injectors[i].inject(this, { observables[i].onSuccess(it) })
+ }
+}
+
+class JsInjector(val function: String) : InjectorContract {
+ override fun inject(webView: WebView, callback: ((String) -> Unit)?) {
webView.evaluateJavascript(function, { value -> callback?.invoke(value) })
}
}