diff options
author | Allan Wang <me@allanwang.ca> | 2017-06-14 17:01:13 -0700 |
---|---|---|
committer | Allan Wang <me@allanwang.ca> | 2017-06-14 17:01:13 -0700 |
commit | fbbc92e4c98a30e107fb2a63887f8b6d20bffabb (patch) | |
tree | ec603d3379ddad94df084f94132ac0c739bcb4ac /app/src/main/kotlin/com/pitchedapps/frost/injectors | |
parent | aa01ec691ef2638da7c22bf3cbd1a9c5e213ca1f (diff) | |
download | frost-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')
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) }) } } |