aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2017-06-13 00:42:31 -0700
committerAllan Wang <me@allanwang.ca>2017-06-13 00:42:31 -0700
commite4377fed20ce1e3f4a0b236271eecdb1fe573b7a (patch)
treeaa0b14e328daa4ece41f65cfed5a4422f2c9e898
parenta7a37f8f5b1955f006a83d4713a2c6af500c28af (diff)
downloadfrost-e4377fed20ce1e3f4a0b236271eecdb1fe573b7a.tar.gz
frost-e4377fed20ce1e3f4a0b236271eecdb1fe573b7a.tar.bz2
frost-e4377fed20ce1e3f4a0b236271eecdb1fe573b7a.zip
Created js base for facebook menu
-rw-r--r--app/build.gradle2
-rw-r--r--app/src/main/assets/css/core/_base.scss (renamed from app/src/main/assets/core/_base.scss)0
-rw-r--r--app/src/main/assets/css/core/_colors.scss (renamed from app/src/main/assets/core/_colors.scss)0
-rw-r--r--app/src/main/assets/css/core/header.compact.css (renamed from app/src/main/assets/core/header.compact.css)0
-rw-r--r--app/src/main/assets/css/core/header.scss (renamed from app/src/main/assets/core/header.scss)0
-rw-r--r--app/src/main/assets/css/core/login.compact.css (renamed from app/src/main/assets/core/login.compact.css)0
-rw-r--r--app/src/main/assets/css/core/login.scss (renamed from app/src/main/assets/core/login.scss)0
-rw-r--r--app/src/main/assets/js/menu.js37
-rw-r--r--app/src/main/assets/js/menu.min.js1
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/BaseActivity.kt24
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/FrostApp.kt2
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt6
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt28
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/SelectorActivity.kt5
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt4
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/facebook/FbTab.kt7
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt13
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt2
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt32
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/injectors/JsInjector.kt10
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/utils/ContextUtils.kt16
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt1
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/web/FrostChromeClient.kt2
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt15
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt18
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt10
-rw-r--r--app/src/main/res/values/strings.xml7
-rw-r--r--app/src/main/res/values/strings_preferences1
-rw-r--r--gradle.properties2
29 files changed, 193 insertions, 52 deletions
diff --git a/app/build.gradle b/app/build.gradle
index dc682577..67360af3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -106,8 +106,6 @@ dependencies {
compile "com.jakewharton.rxbinding2:rxbinding:${RX_BINDING}"
compile "com.jakewharton.rxbinding2:rxbinding-appcompat-v7:${RX_BINDING}"
-// compile "com.facebook.stetho:stetho-okhttp3:${STETHO}"
-
compile "com.lapism:searchview:${SEARCH_VIEW}"
compile "org.jsoup:jsoup:${JSOUP}"
diff --git a/app/src/main/assets/core/_base.scss b/app/src/main/assets/css/core/_base.scss
index 344b6696..344b6696 100644
--- a/app/src/main/assets/core/_base.scss
+++ b/app/src/main/assets/css/core/_base.scss
diff --git a/app/src/main/assets/core/_colors.scss b/app/src/main/assets/css/core/_colors.scss
index 718c1e62..718c1e62 100644
--- a/app/src/main/assets/core/_colors.scss
+++ b/app/src/main/assets/css/core/_colors.scss
diff --git a/app/src/main/assets/core/header.compact.css b/app/src/main/assets/css/core/header.compact.css
index 560a8465..560a8465 100644
--- a/app/src/main/assets/core/header.compact.css
+++ b/app/src/main/assets/css/core/header.compact.css
diff --git a/app/src/main/assets/core/header.scss b/app/src/main/assets/css/core/header.scss
index 4e4a2148..4e4a2148 100644
--- a/app/src/main/assets/core/header.scss
+++ b/app/src/main/assets/css/core/header.scss
diff --git a/app/src/main/assets/core/login.compact.css b/app/src/main/assets/css/core/login.compact.css
index 436b1875..436b1875 100644
--- a/app/src/main/assets/core/login.compact.css
+++ b/app/src/main/assets/css/core/login.compact.css
diff --git a/app/src/main/assets/core/login.scss b/app/src/main/assets/css/core/login.scss
index 00627838..00627838 100644
--- a/app/src/main/assets/core/login.scss
+++ b/app/src/main/assets/css/core/login.scss
diff --git a/app/src/main/assets/js/menu.js b/app/src/main/assets/js/menu.js
new file mode 100644
index 00000000..94261146
--- /dev/null
+++ b/app/src/main/assets/js/menu.js
@@ -0,0 +1,37 @@
+var viewport = document.getElementById('viewport');
+var root = document.getElementById('root');
+
+var y = new MutationObserver(function(mutations) {
+ viewport.removeAttribute('style');
+ root.removeAttribute('style');
+})
+
+y.observe(viewport, {
+ attributes: true
+});
+
+y.observe(root, {
+ attributes: true
+});
+
+var x = new MutationObserver(function(mutations) {
+ if (document.getElementsByClassName('mSideMenu').length) {
+ x.disconnect();
+ console.log('Found side menu');
+ var menu = document.getElementsByClassName('mSideMenu')[0];
+ while (root.firstChild)
+ root.removeChild(root.firstChild);
+ while (menu.childNodes.length)
+ root.appendChild(menu.childNodes[0]);
+ setTimeout(function() {
+ y.disconnect();
+ console.log('Unhook styler');
+ }, 500)
+ }
+});
+
+x.observe(document.getElementById('mJewelNav'), {
+ childList: true,
+ subtree: true
+});
+document.getElementById('bookmarks_jewel').getElementsByTagName('a')[0].click();
diff --git a/app/src/main/assets/js/menu.min.js b/app/src/main/assets/js/menu.min.js
new file mode 100644
index 00000000..6943e2a5
--- /dev/null
+++ b/app/src/main/assets/js/menu.min.js
@@ -0,0 +1 @@
+var viewport=document.getElementById("viewport");var root=document.getElementById("root");var y=new MutationObserver(function(a){viewport.removeAttribute("style");root.removeAttribute("style")});y.observe(viewport,{attributes:true});y.observe(root,{attributes:true});var x=new MutationObserver(function(a){if(document.getElementsByClassName("mSideMenu").length){x.disconnect();console.log("Found side menu");var b=document.getElementsByClassName("mSideMenu")[0];while(root.firstChild){root.removeChild(root.firstChild)}while(b.childNodes.length){root.appendChild(b.childNodes[0])}setTimeout(function(){y.disconnect();console.log("Unhook styler")},500)}});x.observe(document.getElementById("mJewelNav"),{childList:true,subtree:true});document.getElementById("bookmarks_jewel").getElementsByTagName("a")[0].click(); \ No newline at end of file
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/BaseActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/BaseActivity.kt
new file mode 100644
index 00000000..6c638618
--- /dev/null
+++ b/app/src/main/kotlin/com/pitchedapps/frost/BaseActivity.kt
@@ -0,0 +1,24 @@
+package com.pitchedapps.frost
+
+import android.support.v7.app.AppCompatActivity
+import com.pitchedapps.frost.utils.Prefs
+import com.pitchedapps.frost.utils.materialDialog
+
+/**
+ * Created by Allan Wang on 2017-06-12.
+ */
+open class BaseActivity : AppCompatActivity() {
+ override fun onBackPressed() {
+ if (isTaskRoot && Prefs.exitConfirmation) {
+ materialDialog {
+ title(R.string.exit)
+ content(R.string.exit_confirmation)
+ positiveText(android.R.string.yes)
+ negativeText(android.R.string.no)
+ onPositive { _, _ -> super.onBackPressed() }
+ checkBoxPromptRes(R.string.do_not_show_again, false, { _, b -> Prefs.exitConfirmation = !b })
+ show()
+ }
+ } else super.onBackPressed()
+ }
+} \ No newline at end of file
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/FrostApp.kt b/app/src/main/kotlin/com/pitchedapps/frost/FrostApp.kt
index b5f8c9cb..85d1c8b5 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/FrostApp.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/FrostApp.kt
@@ -17,8 +17,6 @@ import com.pitchedapps.frost.utils.CrashReportingTree
import com.pitchedapps.frost.utils.Prefs
import com.raizlabs.android.dbflow.config.FlowConfig
import com.raizlabs.android.dbflow.config.FlowManager
-import com.squareup.leakcanary.LeakCanary
-import com.squareup.leakcanary.RefWatcher
import io.fabric.sdk.android.Fabric
import timber.log.Timber
import timber.log.Timber.DebugTree
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt
index a9746d6f..9ba83879 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt
@@ -4,11 +4,10 @@ import android.graphics.drawable.Drawable
import android.os.Bundle
import android.os.Handler
import android.support.v4.widget.SwipeRefreshLayout
-import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.AppCompatTextView
import android.support.v7.widget.Toolbar
import android.widget.ImageView
-import butterknife.ButterKnife
+import ca.allanwang.kau.utils.bindView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
@@ -21,7 +20,6 @@ import com.pitchedapps.frost.facebook.FACEBOOK_COM
import com.pitchedapps.frost.facebook.FbTab
import com.pitchedapps.frost.facebook.PROFILE_PICTURE_URL
import com.pitchedapps.frost.utils.L
-import ca.allanwang.kau.utils.bindView
import com.pitchedapps.frost.utils.launchNewTask
import com.pitchedapps.frost.views.fadeIn
import com.pitchedapps.frost.views.fadeOut
@@ -40,7 +38,7 @@ import kotlin.concurrent.thread
/**
* Created by Allan Wang on 2017-06-01.
*/
-class LoginActivity : AppCompatActivity() {
+class LoginActivity : BaseActivity() {
val toolbar: Toolbar by bindView(R.id.toolbar)
val web: LoginWebView by bindView(R.id.login_webview)
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt
index 05ee2e50..12b308d0 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt
@@ -1,6 +1,7 @@
package com.pitchedapps.frost
import android.content.Intent
+import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.design.widget.Snackbar
@@ -8,15 +9,11 @@ import android.support.design.widget.TabLayout
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter
import android.support.v4.view.ViewPager
-import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.Menu
import android.view.MenuItem
import android.view.ViewTreeObserver
-import ca.allanwang.kau.utils.bindView
-import ca.allanwang.kau.utils.restart
-import ca.allanwang.kau.utils.showChangelog
-import ca.allanwang.kau.utils.toDrawable
+import ca.allanwang.kau.utils.*
import co.zsmb.materialdrawerkt.builders.Builder
import co.zsmb.materialdrawerkt.builders.accountHeader
import co.zsmb.materialdrawerkt.builders.drawer
@@ -40,7 +37,7 @@ import com.pitchedapps.frost.utils.launchWebOverlay
import io.reactivex.disposables.Disposable
import io.reactivex.subjects.PublishSubject
-class MainActivity : AppCompatActivity() {
+class MainActivity : BaseActivity() {
lateinit var adapter: SectionsPagerAdapter
val toolbar: Toolbar by bindView(R.id.toolbar)
@@ -113,19 +110,27 @@ class MainActivity : AppCompatActivity() {
toolbar = this@MainActivity.toolbar
savedInstance = savedInstanceState
translucentStatusBar = false
+ sliderBackgroundColor = Prefs.bgColor.withMinAlpha(200).toLong()
drawerHeader = accountHeader {
+ textColor = Prefs.textColor.toLong()
+ backgroundDrawable = ColorDrawable(Prefs.headerColor)
cookies().forEach { (id, name) ->
profile(name = name ?: "") {
iconUrl = PROFILE_PICTURE_URL(id)
+ textColor = Prefs.textColor.toLong()
+ selectedTextColor = Prefs.textColor.toLong()
identifier = id
}
}
- profileSetting(nameRes = R.string.add_account, descriptionRes = R.string.add_account_desc) {
- iconDrawable = IconicsDrawable(this@MainActivity, GoogleMaterial.Icon.gmd_add).actionBar().paddingDp(5).colorRes(R.color.material_drawer_primary_text)
+ profileSetting(nameRes = R.string.add_account) {
+ iconDrawable = IconicsDrawable(this@MainActivity, GoogleMaterial.Icon.gmd_add).actionBar().paddingDp(5).color(Prefs.textColor)
+ textColor = Prefs.textColor.toLong()
identifier = -2L
}
profileSetting(nameRes = R.string.manage_account) {
iicon = GoogleMaterial.Icon.gmd_settings
+ iconColor = Prefs.textColor.toLong()
+ textColor = Prefs.textColor.toLong()
identifier = -3L
}
onProfileChanged { _, profile, current ->
@@ -147,6 +152,11 @@ class MainActivity : AppCompatActivity() {
fun Builder.primaryItem(item: FbTab) = this.primaryItem(item.titleId) {
iicon = item.icon
+ iconColor = Prefs.textColor.toLong()
+ textColor = Prefs.textColor.toLong()
+ selectedIconColor = Prefs.textColor.toLong()
+ selectedTextColor = Prefs.textColor.toLong()
+ selectedColor = 0x00000001.toLong()
identifier = item.titleId.toLong()
onClick { _ ->
launchWebOverlay(item.url)
@@ -187,7 +197,7 @@ class MainActivity : AppCompatActivity() {
inner class SectionsPagerAdapter(fm: FragmentManager, val pages: List<FbTab>) : FragmentPagerAdapter(fm) {
- override fun getItem(position: Int) = WebFragment(pages[position].url)
+ override fun getItem(position: Int) = WebFragment(pages[position])
override fun getCount() = pages.size
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/SelectorActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/SelectorActivity.kt
index 57d0ff4d..082d7887 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/SelectorActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/SelectorActivity.kt
@@ -1,15 +1,14 @@
package com.pitchedapps.frost
import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.GridLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.View
+import ca.allanwang.kau.utils.bindView
import com.mikepenz.fastadapter.FastAdapter
import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter
import com.mikepenz.fastadapter.listeners.ClickEventHook
import com.pitchedapps.frost.facebook.FbCookie
-import ca.allanwang.kau.utils.bindView
import com.pitchedapps.frost.utils.cookies
import com.pitchedapps.frost.utils.launchNewTask
import com.pitchedapps.frost.views.AccountItem
@@ -17,7 +16,7 @@ import com.pitchedapps.frost.views.AccountItem
/**
* Created by Allan Wang on 2017-06-04.
*/
-class SelectorActivity : AppCompatActivity() {
+class SelectorActivity : BaseActivity() {
val recycler: RecyclerView by bindView(R.id.selector_recycler)
val adapter = FastItemAdapter<AccountItem>()
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt
index 1968d07e..70e86239 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt
@@ -3,10 +3,8 @@ package com.pitchedapps.frost
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
-import butterknife.ButterKnife
import ca.allanwang.kau.utils.bindView
import com.jude.swipbackhelper.SwipeBackHelper
-import ca.allanwang.kau.utils.bindView
import com.pitchedapps.frost.utils.url
import com.pitchedapps.frost.web.FrostWebView
@@ -26,7 +24,7 @@ class WebOverlayActivity : AppCompatActivity() {
supportActionBar?.setDisplayShowHomeEnabled(true)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
toolbar.setNavigationOnClickListener { onBackPressed() }
- frostWeb.baseUrl = url()
+ frostWeb.web.baseUrl = url()
frostWeb.web.loadBaseUrl()
SwipeBackHelper.onCreate(this)
SwipeBackHelper.getCurrentPage(this)
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbTab.kt b/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbTab.kt
index 17dd4862..c3bad56c 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbTab.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbTab.kt
@@ -6,8 +6,9 @@ import com.mikepenz.google_material_typeface_library.GoogleMaterial
import com.mikepenz.iconics.typeface.IIcon
import com.mikepenz.material_design_iconic_typeface_library.MaterialDesignIconic
import com.pitchedapps.frost.R
+import com.pitchedapps.frost.injectors.JsAssets
-enum class FbTab(@StringRes val titleId: Int, val icon: IIcon, relativeUrl: String) {
+enum class FbTab(@StringRes val titleId: Int, val icon: IIcon, relativeUrl: String, val javascript: JsAssets? = null) {
FEED(R.string.feed, CommunityMaterial.Icon.cmd_newspaper, ""),
FEED_MOST_RECENT(R.string.most_recent, GoogleMaterial.Icon.gmd_grade, "/?sk=h_chr"),
FEED_TOP_STORIES(R.string.top_stories, GoogleMaterial.Icon.gmd_star, "/?sk=h_nor"),
@@ -23,10 +24,12 @@ enum class FbTab(@StringRes val titleId: Int, val icon: IIcon, relativeUrl: Stri
BIRTHDAYS(R.string.birthdays, GoogleMaterial.Icon.gmd_cake, "events/birthdays"),
CHAT(R.string.chat, GoogleMaterial.Icon.gmd_chat, "buddylist"),
PHOTOS(R.string.photos, GoogleMaterial.Icon.gmd_photo, "me/photos"),
+ SETTINGS(R.string.settings, GoogleMaterial.Icon.gmd_settings, "settings"),
+ MENU(R.string.menu, GoogleMaterial.Icon.gmd_menu, "settings", JsAssets.MENU)
;
val url = "$FB_URL_BASE$relativeUrl"
}
-fun defaultTabs(): List<FbTab> = listOf(FbTab.FEED, FbTab.MESSAGES, FbTab.FRIENDS, FbTab.NOTIFICATIONS)
+fun defaultTabs(): List<FbTab> = listOf(FbTab.FEED, FbTab.MESSAGES, FbTab.NOTIFICATIONS, FbTab.MENU)
fun defaultDrawers(): List<FbTab> = listOf(FbTab.ACTIVITY_LOG, FbTab.PAGES, FbTab.GROUPS, FbTab.SAVED) \ No newline at end of file
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt b/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt
index 40f37189..0f56592c 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt
@@ -9,6 +9,8 @@ import android.view.View
import android.view.ViewGroup
import ca.allanwang.kau.utils.withBundle
import com.pitchedapps.frost.MainActivity
+import com.pitchedapps.frost.facebook.FbTab
+import com.pitchedapps.frost.injectors.JsAssets
import com.pitchedapps.frost.web.FrostWebView
import com.pitchedapps.frost.web.FrostWebViewCore
import io.reactivex.android.schedulers.AndroidSchedulers
@@ -23,14 +25,21 @@ class WebFragment : Fragment() {
companion object {
private const val ARG_URL = "arg_url"
+ private const val ARG_ID = "arg_id"
operator fun invoke(url: String) = WebFragment().withBundle {
putString(ARG_URL, url)
}
+
+ operator fun invoke(data: FbTab) = WebFragment().withBundle {
+ putString(ARG_URL, data.url)
+ if (data.javascript != null) putSerializable(ARG_ID, data.javascript)
+ }
}
// val refresh: SwipeRefreshLayout by lazy { frostWebView.refresh }
val web: FrostWebViewCore by lazy { frostWebView.web }
lateinit var url: String
+ var baseJavascript: JsAssets? = null
lateinit private var frostWebView: FrostWebView
private var firstLoad = true
private var refreshDisposable: Disposable? = null
@@ -38,12 +47,14 @@ class WebFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
url = arguments.getString(ARG_URL)
+ baseJavascript = arguments.getSerializable(ARG_ID) as? JsAssets
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
super.onCreateView(inflater, container, savedInstanceState)
frostWebView = FrostWebView(context)
- frostWebView.baseUrl = url
+ frostWebView.web.baseUrl = url
+ frostWebView.web.baseJavascript = baseJavascript
return frostWebView
}
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 336ffc71..ad257276 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt
@@ -18,7 +18,7 @@ enum class CssAssets {
fun inject(webView: WebView, callback: ((String) -> Unit)?) {
if (injector == null) {
- val content = webView.context.assets.open("core/$file").bufferedReader().use { it.readText() }
+ val content = webView.context.assets.open("css/core/$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/JsAssets.kt b/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt
new file mode 100644
index 00000000..2bf53d2e
--- /dev/null
+++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt
@@ -0,0 +1,32 @@
+package com.pitchedapps.frost.injectors
+
+import android.webkit.WebView
+import com.pitchedapps.frost.utils.L
+
+/**
+ * Created by Allan Wang on 2017-05-31.
+ * Mapping of the available assets
+ * The enum name must match the css file name
+ * //TODO add folder mapping using Prefs
+ */
+enum class JsAssets {
+ MENU
+ ;
+
+ var file = "${name.toLowerCase()}.min.js"
+ var injector: JsInjector? = null
+
+ fun inject(webView: WebView, callback: ((String) -> Unit)?) {
+ if (injector == null) {
+ val content = webView.context.assets.open("js/$file").bufferedReader().use { it.readText() }
+ injector = JsBuilder().js(content).build()
+ }
+ injector!!.inject(webView, callback)
+ L.v("JS ${injector!!.function}")
+ }
+
+ fun reset() {
+ injector = null
+ }
+
+} \ 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 bda9ae16..14e0606b 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsInjector.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsInjector.kt
@@ -3,13 +3,19 @@ package com.pitchedapps.frost.injectors
import android.webkit.WebView
class JsBuilder {
- private val css: StringBuilder by lazy { StringBuilder() }
+ private val css = StringBuilder()
+ private val js = StringBuilder()
fun css(css: String): JsBuilder {
this.css.append(css)
return this
}
+ fun js(content: String): JsBuilder {
+ this.js.append(content)
+ return this
+ }
+
fun build() = JsInjector(toString())
override fun toString(): String {
@@ -18,6 +24,8 @@ class JsBuilder {
val cssMin = css.replace(Regex("\\s+"), "")
builder.append("var a=document.createElement('style');a.innerHTML='$cssMin';document.head.appendChild(a);")
}
+ if (js.isNotBlank())
+ builder.append(js)
return builder.append("}()").toString()
}
}
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/ContextUtils.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/ContextUtils.kt
index e601283c..1569532c 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/utils/ContextUtils.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/ContextUtils.kt
@@ -5,7 +5,10 @@ import android.content.Context
import android.content.Intent
import android.support.v4.app.ActivityOptionsCompat
import android.support.v4.content.ContextCompat
+import ca.allanwang.kau.utils.adjustAlpha
+import ca.allanwang.kau.utils.lighten
import ca.allanwang.kau.utils.startActivity
+import com.afollestad.materialdialogs.MaterialDialog
import com.pitchedapps.frost.LoginActivity
import com.pitchedapps.frost.R
import com.pitchedapps.frost.WebOverlayActivity
@@ -38,4 +41,17 @@ fun Context.launchWebOverlay(url: String) {
fun WebOverlayActivity.url(): String {
return intent.extras?.getString(ARG_URL) ?: FbTab.FEED.url
+}
+
+fun Activity.materialDialog(action: MaterialDialog.Builder.() -> Unit) {
+ val builder = MaterialDialog.Builder(this)
+ val dimmerTextColor = Prefs.textColor.adjustAlpha(0.8f)
+ builder.titleColor(Prefs.textColor)
+ .contentColor(dimmerTextColor)
+ .widgetColor(dimmerTextColor)
+ .backgroundColor(Prefs.bgColor.lighten(0.1f))
+ .positiveColor(Prefs.textColor)
+ .negativeColor(Prefs.textColor)
+ .neutralColor(Prefs.textColor)
+ builder.action()
} \ No newline at end of file
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt
index 89cccd40..6284a2f8 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt
@@ -23,4 +23,5 @@ object Prefs : KPref() {
var iconColor: Int by kpref("color_icons", Color.WHITE)
+ var exitConfirmation: Boolean by kpref("exit_confirmation", true)
}
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostChromeClient.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostChromeClient.kt
index 7ad12c3a..720026e6 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostChromeClient.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostChromeClient.kt
@@ -13,7 +13,7 @@ import io.reactivex.subjects.Subject
class FrostChromeClient(val progressObservable: Subject<Int>, val titleObservable: BehaviorSubject<String>) : WebChromeClient() {
override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean {
- L.v("Chrome Console ${consoleMessage.lineNumber()}: ${consoleMessage.message()}")
+ L.i("Chrome Console ${consoleMessage.lineNumber()}: ${consoleMessage.message()}")
return super.onConsoleMessage(consoleMessage)
}
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt
index d4bf8e07..4554e0a4 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt
@@ -7,9 +7,9 @@ import android.util.AttributeSet
import android.view.View
import android.widget.FrameLayout
import android.widget.ProgressBar
-import butterknife.ButterKnife
-import com.pitchedapps.frost.R
import ca.allanwang.kau.utils.bindView
+import com.pitchedapps.frost.R
+import com.pitchedapps.frost.facebook.FbTab
import io.reactivex.android.schedulers.AndroidSchedulers
/**
@@ -17,11 +17,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers
*/
class FrostWebView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0)
: FrameLayout(context, attrs, defStyleAttr, defStyleRes), SwipeRefreshLayout.OnRefreshListener {
- var baseUrl: String?
- get() = web.baseUrl
- set(value) {
- web.baseUrl = value
- }
val refresh: SwipeRefreshLayout by bindView(R.id.swipe_refresh)
val web: FrostWebViewCore by bindView(R.id.frost_webview_core)
val progress: ProgressBar by bindView(R.id.progressBar)
@@ -46,8 +41,12 @@ class FrostWebView @JvmOverloads constructor(context: Context, attrs: AttributeS
})
}
+ //Some urls have javascript injections so make sure we load the base url
override fun onRefresh() {
- web.reload()
+ when (web.baseUrl) {
+ FbTab.MENU.url -> web.loadBaseUrl()
+ else -> web.reload()
+ }
}
fun onBackPressed(): Boolean {
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt
index 922d527b..28048a1d 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt
@@ -24,15 +24,6 @@ import io.reactivex.subjects.Subject
*/
class FrostWebViewClient(val refreshObservable: Subject<Boolean>) : WebViewClient() {
- companion object {
- //Collections of jewels mapped with url match -> id
- val jewelMap: Map<String, String> = mapOf("a" to "b")
-
- fun test() {
-
- }
- }
-
override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
L.i("FWV Loading $url")
@@ -55,6 +46,15 @@ class FrostWebViewClient(val refreshObservable: Subject<Boolean>) : WebViewClien
super.onPageFinished(view, url)
refreshObservable.onNext(false)
if (!url.contains(FACEBOOK_COM)) return
+ L.i("Page finished $url")
+ with(view as FrostWebViewCore) {
+ if (url == view.baseUrl && view.baseJavascript != null) {
+ L.i("Base inject ${view.baseJavascript!!.name}")
+ view.baseJavascript!!.inject(view, {
+ L.i("Base injection done")
+ })
+ }
+ }
JsActions.LOGIN_CHECK.inject(view)
CssAssets.HEADER.inject(view, {
view.circularReveal(offset = 150L)
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt
index 1d3f348a..f0596f7c 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt
@@ -12,6 +12,7 @@ import android.view.View
import android.view.animation.DecelerateInterpolator
import android.webkit.WebView
import com.pitchedapps.frost.facebook.USER_AGENT_BASIC
+import com.pitchedapps.frost.injectors.JsAssets
import io.reactivex.Scheduler
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@@ -38,6 +39,7 @@ class FrostWebViewCore @JvmOverloads constructor(
val titleObservable: BehaviorSubject<String> // Only emits on different non http titles
var baseUrl: String? = null
+ var baseJavascript: JsAssets? = null
init {
isNestedScrollingEnabled = true
@@ -53,8 +55,8 @@ class FrostWebViewCore @JvmOverloads constructor(
settings.userAgentString = USER_AGENT_BASIC
// settings.domStorageEnabled = true
setLayerType(View.LAYER_TYPE_HARDWARE, null)
- setWebViewClient(FrostWebViewClient(refreshObservable))
- setWebChromeClient(FrostChromeClient(progressObservable, titleObservable))
+ webViewClient = FrostWebViewClient(refreshObservable)
+ webChromeClient = FrostChromeClient(progressObservable, titleObservable)
addJavascriptInterface(FrostJSI(context), "Frost")
}
@@ -63,7 +65,9 @@ class FrostWebViewCore @JvmOverloads constructor(
super.loadUrl(url)
}
- fun loadBaseUrl() = loadUrl(baseUrl)
+ fun loadBaseUrl() {
+ loadUrl(baseUrl)
+ }
fun addTitleListener(subscriber: (title: String) -> Unit, scheduler: Scheduler = AndroidSchedulers.mainThread()): Disposable
= titleObservable.observeOn(scheduler).subscribe(subscriber)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ee5d1294..c7fc6e72 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -20,11 +20,16 @@
<string name="birthdays">Birthdays</string>
<string name="chat">Chat</string>
<string name="photos">Photos</string>
+ <string name="settings">Settings</string>
+ <string name="menu">Menu</string>
+
<string name="loading_account">Getting everything ready…</string>
<string name="welcome">Welcome %s</string>
<string name="login">Login</string>
<string name="select_facebook_account">Select Facebook Account</string>
<string name="add_account">Add Account</string>
- <string name="add_account_desc">Add Facebook Account</string>
<string name="manage_account">Manage Account</string>
+ <string name="exit">Exit</string>
+ <string name="exit_confirmation">Are you sure you want to exit Frost?</string>
+ <string name="do_not_show_again">Don\'t show again</string>
</resources>
diff --git a/app/src/main/res/values/strings_preferences b/app/src/main/res/values/strings_preferences
index 9cb29553..9f9ca131 100644
--- a/app/src/main/res/values/strings_preferences
+++ b/app/src/main/res/values/strings_preferences
@@ -1,5 +1,4 @@
<resources>
- <string name="settings">Settings</string>
<string name="text_color">Text Color</string>
<string name="background_color">Background Color</string>
<string name="header_color">Header Color</string>
diff --git a/gradle.properties b/gradle.properties
index cf41d83e..befbfcb9 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -20,7 +20,7 @@ VERSION_CODE=1
VERSION_NAME=0.1
ANDROID_SUPPORT_LIBS=26.0.0-alpha1
-KAU=-SNAPSHOT
+KAU=1805793c7c
MATERIAL_DRAWER=5.9.2
MATERIAL_DRAWER_KT=1.0.2
IICON_GOOGLE=3.0.1.0