diff options
Diffstat (limited to 'app/src/main/kotlin')
10 files changed, 138 insertions, 39 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/FrostWebActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/FrostWebActivity.kt index c853e8f0..98b5897f 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/FrostWebActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/FrostWebActivity.kt @@ -13,10 +13,6 @@ import com.pitchedapps.frost.utils.formattedFbUrl */ class FrostWebActivity : WebOverlayActivity() { - override val url: String - get() = intent.dataString!!.formattedFbUrl - - override fun onCreate(savedInstanceState: Bundle?) { Prefs.prevId = Prefs.userId super.onCreate(savedInstanceState) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt index b2dc676c..592c3b5b 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt @@ -106,7 +106,7 @@ class MainActivity : BaseActivity(), FrostWebViewSearch.SearchContract, super.onCreate(savedInstanceState) if (BuildConfig.VERSION_CODE > Prefs.versionCode) { Prefs.versionCode = BuildConfig.VERSION_CODE - showChangelog(R.xml.changelog, Prefs.textColor) { theme() } + if (!BuildConfig.DEBUG) showChangelog(R.xml.changelog, Prefs.textColor) { theme() } } setContentView(R.layout.activity_main) setSupportActionBar(toolbar) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt index 9f203970..c256b674 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt @@ -41,7 +41,7 @@ open class WebOverlayActivity : AppCompatActivity(), } open val url: String - get() = intent.extras!!.getString(ARG_URL).formattedFbUrl + get() = (intent.extras?.getString(ARG_URL) ?: intent.dataString).formattedFbUrl val userId: Long get() = intent.extras?.getLong(ARG_USER_ID, Prefs.userId) ?: Prefs.userId @@ -61,7 +61,7 @@ open class WebOverlayActivity : AppCompatActivity(), setFrostColors(toolbar, themeWindow = false) coordinator.setBackgroundColor(Prefs.bgColor.withAlpha(255)) - frostWeb.web.setupWebview(url) + frostWeb.setupWebview(url) frostWeb.web.addTitleListener({ toolbar.title = it }) if (userId != Prefs.userId) FbCookie.switchUser(userId) { frostWeb.web.loadBaseUrl() } else frostWeb.web.loadBaseUrl() @@ -80,7 +80,7 @@ open class WebOverlayActivity : AppCompatActivity(), */ override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) - val newUrl = intent.extras!!.getString(ARG_URL).formattedFbUrl + val newUrl = (intent.extras?.getString(ARG_URL) ?: intent.dataString).formattedFbUrl L.d("New intent") if (url != newUrl) { this.intent = intent 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 b76925f5..764c0bc9 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt @@ -63,7 +63,7 @@ class WebFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) frostWebView = FrostWebView(context) - frostWebView.web.setupWebview(url, urlEnum) + frostWebView.setupWebview(url, urlEnum) return frostWebView } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt b/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt index 132d1968..278f2adf 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt @@ -9,7 +9,7 @@ import com.pitchedapps.frost.utils.L * The enum name must match the css file name */ enum class JsAssets : InjectorContract { - MENU, CLICK_A, CLICK_INTERCEPTOR, HEADER_BADGES, SEARCH + MENU, CLICK_A, CONTEXT_A, HEADER_BADGES, SEARCH ; var file = "${name.toLowerCase()}.min.js" @@ -22,9 +22,4 @@ enum class JsAssets : InjectorContract { } injector!!.inject(webView, callback) } - - fun reset() { - injector = null - } - } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostJSI.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostJSI.kt index 89f7d20b..68163333 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostJSI.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostJSI.kt @@ -4,17 +4,14 @@ import android.content.Context import android.webkit.JavascriptInterface import com.pitchedapps.frost.MainActivity import com.pitchedapps.frost.dbflow.CookieModel -import com.pitchedapps.frost.utils.L -import com.pitchedapps.frost.utils.cookies -import com.pitchedapps.frost.utils.launchLogin -import com.pitchedapps.frost.utils.launchWebOverlay +import com.pitchedapps.frost.utils.* import io.reactivex.subjects.Subject /** * Created by Allan Wang on 2017-06-01. */ -class FrostJSI(val context: Context, val webView: FrostWebViewCore) { +class FrostJSI(val context: Context, val webView: FrostWebViewCore, val contextMenu: FrostWebContextMenu) { val headerObservable: Subject<String>? = (context as? MainActivity)?.headerBadgeObservable @@ -36,6 +33,11 @@ class FrostJSI(val context: Context, val webView: FrostWebViewCore) { } @JavascriptInterface + fun contextMenu(url: String) { + contextMenu.post { contextMenu.show(url) } + } + + @JavascriptInterface fun loadLogin() { context.launchLogin(cookies, true) } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebContextMenu.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebContextMenu.kt new file mode 100644 index 00000000..e0aa5ebd --- /dev/null +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebContextMenu.kt @@ -0,0 +1,100 @@ +package com.pitchedapps.frost.web + +import android.content.Context +import android.support.constraint.ConstraintLayout +import android.support.constraint.ConstraintSet +import android.text.method.ScrollingMovementMethod +import android.util.AttributeSet +import android.widget.TextView +import ca.allanwang.kau.logging.KL +import ca.allanwang.kau.utils.* +import com.pitchedapps.frost.R +import com.pitchedapps.frost.utils.Prefs + +/** + * Created by Allan Wang on 2017-07-06. + */ +class FrostWebContextMenu @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + var url = "" + + val urlHolder = TextView(context, attrs, defStyleAttr) + + init { + layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) + elevation = 20f + setBackgroundColor(0x80000000.toInt()) + gone() + + val tc = Prefs.textColor + val bg = Prefs.bgColor.colorToForeground(0.1f).withAlpha(255) + + urlHolder.apply { + isVerticalScrollBarEnabled = true + movementMethod = ScrollingMovementMethod() + maxHeight = 60.dpToPx + } + addView(urlHolder) + + //collection of items in our menu and their click event + val data = arrayOf( + R.string.copy_link to { context.copyToClipboard(url) } + ) + + //add views and extract ids + val views = data.map { + (textId, onClick) -> + val tv = TextView(context).apply { + text = context.string(textId) + setOnClickListener({ onClick(); close() }) + } + addView(tv) + tv + }.toMutableList() + + views.add(0, urlHolder) + + val ids = views.mapIndexed { index, textView -> + textView.apply { + id = 74329 + index //totally arbitrary + setTextColor(tc) + setBackgroundColor(bg) + } + KL.d("ID ${textView.text}") + textView.id + } + + //clone to set only after ids are set + val set = ConstraintSet() + set.clone(this) + + ids.forEach { + set.connect(it, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 16) + set.connect(it, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 16) + } + + + set.createVerticalChain(ConstraintSet.PARENT_ID, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, + ids.toIntArray(), null, ConstraintSet.CHAIN_PACKED) + + set.applyTo(this) + setOnClickListener { + close() + } + } + + fun close() { + transitionAuto() + gone() + } + + fun show(url: String) { + this.url = url + urlHolder.text = this.url + transitionAuto() + visible() + } + +}
\ No newline at end of file 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 7f74990e..64bdf888 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt @@ -1,6 +1,8 @@ package com.pitchedapps.frost.web +import android.annotation.SuppressLint import android.content.Context +import android.graphics.Color import android.os.Build import android.support.v4.widget.SwipeRefreshLayout import android.util.AttributeSet @@ -25,7 +27,8 @@ class FrostWebView @JvmOverloads constructor( 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) + val progress: ProgressBar by bindView(R.id.progress_bar) + val contextMenu: FrostWebContextMenu by bindView(R.id.context_menu) init { inflate(getContext(), R.layout.swipe_webview, this) @@ -50,6 +53,26 @@ class FrostWebView @JvmOverloads constructor( }) } + @SuppressLint("SetJavaScriptEnabled") + fun setupWebview(url: String, enum: FbTab? = null) { + with (web) { + baseUrl = url + baseEnum = enum + with(settings) { + javaScriptEnabled = true + userAgentString = com.pitchedapps.frost.facebook.USER_AGENT_BASIC + allowFileAccess = true + defaultFontSize + } + setLayerType(View.LAYER_TYPE_HARDWARE, null) + frostWebClient = baseEnum?.webClient?.invoke(this) ?: FrostWebViewClient(this) + webViewClient = frostWebClient + webChromeClient = FrostChromeClient(this) + addJavascriptInterface(FrostJSI(context, this, contextMenu), "Frost") + setBackgroundColor(Color.TRANSPARENT) + } + } + //Some urls have postJavascript injections so make sure we load the base url override fun onRefresh() { when (web.baseUrl) { 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 62c28527..4484dcdb 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt @@ -62,6 +62,7 @@ open class FrostWebViewClient(val webCore: FrostWebViewCore) : WebViewClient() { webCore.jsInject(CssHider.HEADER, Prefs.themeInjector, JsAssets.CLICK_A.maybe(webCore.baseEnum != null), +// JsAssets.CONTEXT_A, callback = { refreshObservable.onNext(false) }) } 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 c2c89b8a..76b04f23 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt @@ -54,24 +54,6 @@ class FrostWebViewCore @JvmOverloads constructor( titleObservable = BehaviorSubject.create<String>() } - @SuppressLint("SetJavaScriptEnabled") - fun setupWebview(url: String, enum: FbTab? = null) { - baseUrl = url - baseEnum = enum - with (settings) { - javaScriptEnabled = true - userAgentString = USER_AGENT_BASIC - allowFileAccess = true - defaultFontSize - } - setLayerType(View.LAYER_TYPE_HARDWARE, null) - frostWebClient = baseEnum?.webClient?.invoke(this) ?: FrostWebViewClient(this) - webViewClient = frostWebClient - webChromeClient = FrostChromeClient(this) - addJavascriptInterface(FrostJSI(context, this), "Frost") - setBackgroundColor(Color.TRANSPARENT) - } - fun loadUrl(url: String?, animate: Boolean) { if (url == null) return registerTransition(animate) |