diff options
18 files changed, 269 insertions, 140 deletions
diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml new file mode 100644 index 00000000..838ef398 --- /dev/null +++ b/.idea/markdown-navigator.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="MarkdownProjectSettings"> + <PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" useGrayscaleRendering="false" zoomFactor="1.25" maxImageWidth="0" showGitHubPageIfSynced="false" allowBrowsingInPreview="false" synchronizePreviewPosition="true" highlightPreviewType="LINE" highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true" verticallyAlignSourceAndPreviewSyncPosition="true" showSearchHighlightsInPreview="true" showSelectionInPreview="true"> + <PanelProvider> + <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" providerName="Default - Swing" /> + </PanelProvider> + </PreviewSettings> + <ParserSettings gitHubSyntaxChange="false"> + <PegdownExtensions> + <option name="ABBREVIATIONS" value="false" /> + <option name="ANCHORLINKS" value="true" /> + <option name="ASIDE" value="false" /> + <option name="ATXHEADERSPACE" value="true" /> + <option name="AUTOLINKS" value="true" /> + <option name="DEFINITIONS" value="false" /> + <option name="DEFINITION_BREAK_DOUBLE_BLANK_LINE" value="false" /> + <option name="FENCED_CODE_BLOCKS" value="true" /> + <option name="FOOTNOTES" value="false" /> + <option name="HARDWRAPS" value="false" /> + <option name="INSERTED" value="false" /> + <option name="QUOTES" value="false" /> + <option name="RELAXEDHRULES" value="true" /> + <option name="SMARTS" value="false" /> + <option name="STRIKETHROUGH" value="true" /> + <option name="SUBSCRIPT" value="false" /> + <option name="SUPERSCRIPT" value="false" /> + <option name="SUPPRESS_HTML_BLOCKS" value="false" /> + <option name="SUPPRESS_INLINE_HTML" value="false" /> + <option name="TABLES" value="true" /> + <option name="TASKLISTITEMS" value="true" /> + <option name="TOC" value="false" /> + <option name="WIKILINKS" value="true" /> + </PegdownExtensions> + <ParserOptions> + <option name="COMMONMARK_LISTS" value="false" /> + <option name="DUMMY" value="false" /> + <option name="EMOJI_SHORTCUTS" value="true" /> + <option name="FLEXMARK_FRONT_MATTER" value="false" /> + <option name="GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA" value="false" /> + <option name="GFM_TABLE_RENDERING" value="true" /> + <option name="GITBOOK_URL_ENCODING" value="false" /> + <option name="GITHUB_EMOJI_URL" value="false" /> + <option name="GITHUB_LISTS" value="true" /> + <option name="GITHUB_WIKI_LINKS" value="true" /> + <option name="JEKYLL_FRONT_MATTER" value="false" /> + <option name="SIM_TOC_BLANK_LINE_SPACER" value="true" /> + </ParserOptions> + </ParserSettings> + <HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" addPageHeader="true"> + <GeneratorProvider> + <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" providerName="Default Swing HTML Generator" /> + </GeneratorProvider> + <headerTop /> + <headerBottom /> + <bodyTop /> + <bodyBottom /> + </HtmlSettings> + <CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssTextEnabled="false" isDynamicPageWidth="true"> + <StylesheetProvider> + <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" providerName="Default Swing Stylesheet" /> + </StylesheetProvider> + <ScriptProviders /> + <cssText /> + </CssSettings> + <HtmlExportSettings updateOnSave="false" parentDir="$ProjectFileDir$" targetDir="$ProjectFileDir$" cssDir="" scriptDir="" plainHtml="false" imageDir="" copyLinkedImages="false" imageUniquifyType="0" targetExt="" useTargetExt="false" noCssNoScripts="false" linkToExportedHtml="true" exportOnSettingsChange="true" regenerateOnProjectOpen="false" /> + <LinkMapSettings> + <textMaps /> + </LinkMapSettings> + </component> +</project>
\ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 059bca8c..6e3f694c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,74 +3,6 @@ <component name="EntryPointsManager"> <entry_points version="2.0" /> </component> - <component name="MarkdownProjectSettings"> - <PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" useGrayscaleRendering="false" zoomFactor="1.25" maxImageWidth="0" showGitHubPageIfSynced="false" allowBrowsingInPreview="false" synchronizePreviewPosition="true" highlightPreviewType="LINE" highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true" verticallyAlignSourceAndPreviewSyncPosition="true" showSearchHighlightsInPreview="true" showSelectionInPreview="true"> - <PanelProvider> - <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" providerName="Default - Swing" /> - </PanelProvider> - </PreviewSettings> - <ParserSettings gitHubSyntaxChange="false"> - <PegdownExtensions> - <option name="ABBREVIATIONS" value="false" /> - <option name="ANCHORLINKS" value="true" /> - <option name="ASIDE" value="false" /> - <option name="ATXHEADERSPACE" value="true" /> - <option name="AUTOLINKS" value="true" /> - <option name="DEFINITIONS" value="false" /> - <option name="DEFINITION_BREAK_DOUBLE_BLANK_LINE" value="false" /> - <option name="FENCED_CODE_BLOCKS" value="true" /> - <option name="FOOTNOTES" value="false" /> - <option name="HARDWRAPS" value="false" /> - <option name="INSERTED" value="false" /> - <option name="QUOTES" value="false" /> - <option name="RELAXEDHRULES" value="true" /> - <option name="SMARTS" value="false" /> - <option name="STRIKETHROUGH" value="true" /> - <option name="SUBSCRIPT" value="false" /> - <option name="SUPERSCRIPT" value="false" /> - <option name="SUPPRESS_HTML_BLOCKS" value="false" /> - <option name="SUPPRESS_INLINE_HTML" value="false" /> - <option name="TABLES" value="true" /> - <option name="TASKLISTITEMS" value="true" /> - <option name="TOC" value="false" /> - <option name="WIKILINKS" value="true" /> - </PegdownExtensions> - <ParserOptions> - <option name="COMMONMARK_LISTS" value="false" /> - <option name="DUMMY" value="false" /> - <option name="EMOJI_SHORTCUTS" value="true" /> - <option name="FLEXMARK_FRONT_MATTER" value="false" /> - <option name="GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA" value="false" /> - <option name="GFM_TABLE_RENDERING" value="true" /> - <option name="GITBOOK_URL_ENCODING" value="false" /> - <option name="GITHUB_EMOJI_URL" value="false" /> - <option name="GITHUB_LISTS" value="true" /> - <option name="GITHUB_WIKI_LINKS" value="true" /> - <option name="JEKYLL_FRONT_MATTER" value="false" /> - <option name="SIM_TOC_BLANK_LINE_SPACER" value="true" /> - </ParserOptions> - </ParserSettings> - <HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" addPageHeader="true"> - <GeneratorProvider> - <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" providerName="Default Swing HTML Generator" /> - </GeneratorProvider> - <headerTop /> - <headerBottom /> - <bodyTop /> - <bodyBottom /> - </HtmlSettings> - <CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssTextEnabled="false" isDynamicPageWidth="true"> - <StylesheetProvider> - <provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" providerName="Default Swing Stylesheet" /> - </StylesheetProvider> - <ScriptProviders /> - <cssText /> - </CssSettings> - <HtmlExportSettings updateOnSave="false" parentDir="$ProjectFileDir$" targetDir="$ProjectFileDir$" cssDir="" scriptDir="" plainHtml="false" imageDir="" copyLinkedImages="false" imageUniquifyType="0" targetExt="" useTargetExt="false" noCssNoScripts="false" linkToExportedHtml="true" exportOnSettingsChange="true" regenerateOnProjectOpen="false" /> - <LinkMapSettings> - <textMaps /> - </LinkMapSettings> - </component> <component name="NullableNotNullManager"> <option name="myDefaultNullable" value="android.support.annotation.Nullable" /> <option name="myDefaultNotNull" value="android.support.annotation.NonNull" /> @@ -95,19 +27,7 @@ </value> </option> </component> - <component name="ProjectLevelVcsManager" settingsEditedManually="false"> - <OptionsSetting value="true" id="Add" /> - <OptionsSetting value="true" id="Remove" /> - <OptionsSetting value="true" id="Checkout" /> - <OptionsSetting value="true" id="Update" /> - <OptionsSetting value="true" id="Status" /> - <OptionsSetting value="true" id="Edit" /> - <ConfirmationsSetting value="0" id="Add" /> - <ConfirmationsSetting value="0" id="Remove" /> - </component> - <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> - <output url="file://$PROJECT_DIR$/build/classes" /> - </component> + <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" /> <component name="ProjectType"> <option name="id" value="Android" /> </component> diff --git a/.idea/typescript-compiler.xml b/.idea/typescript-compiler.xml new file mode 100644 index 00000000..17ff836a --- /dev/null +++ b/.idea/typescript-compiler.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="TypeScriptCompiler"> + <option name="isCompilerEnabled" value="true" /> + <option name="useConfig" value="true" /> + </component> +</project>
\ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 67360af3..28d8b8d4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,7 +110,7 @@ dependencies { compile "org.jsoup:jsoup:${JSOUP}" -// compile "org.jetbrains.anko:anko:${ANKO}" + compile "org.jetbrains.anko:anko:${ANKO}" // compile "com.squareup.retrofit2:retrofit:${RETROFIT}" // compile "com.squareup.retrofit2:adapter-rxjava2:${RETROFIT}" diff --git a/app/src/main/assets/js/menu.js b/app/src/main/assets/js/menu.js index 94261146..2c517ed2 100644 --- a/app/src/main/assets/js/menu.js +++ b/app/src/main/assets/js/menu.js @@ -1,35 +1,33 @@ 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) { + var menuChildren = document.getElementsByClassName('mSideMenu'); + if (menuChildren.length > 0) { x.disconnect(); console.log('Found side menu'); - var menu = document.getElementsByClassName('mSideMenu')[0]; + var menu = menuChildren[0]; while (root.firstChild) root.removeChild(root.firstChild); while (menu.childNodes.length) root.appendChild(menu.childNodes[0]); + Frost.emit(0); setTimeout(function() { y.disconnect(); console.log('Unhook styler'); - }, 500) + Frost.handleHtml(document.documentElement.outerHTML); + }, 500); } }); - x.observe(document.getElementById('mJewelNav'), { childList: true, subtree: true diff --git a/app/src/main/assets/js/menu.min.js b/app/src/main/assets/js/menu.min.js index 6943e2a5..7aa05351 100644 --- a/app/src/main/assets/js/menu.min.js +++ b/app/src/main/assets/js/menu.min.js @@ -1 +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 +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){var c=document.getElementsByClassName("mSideMenu");if(c.length>0){x.disconnect();console.log("Found side menu");var b=c[0];while(root.firstChild){root.removeChild(root.firstChild)}while(b.childNodes.length){root.appendChild(b.childNodes[0])}Frost.emit(0);setTimeout(function(){y.disconnect();console.log("Unhook styler");Frost.handleHtml(document.documentElement.outerHTML)},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/assets/js/menu_click.js b/app/src/main/assets/js/menu_click.js new file mode 100644 index 00000000..5698cbf0 --- /dev/null +++ b/app/src/main/assets/js/menu_click.js @@ -0,0 +1,16 @@ +// we will handle click events +document.onclick = function(e) { + e.preventDefault ? e.preventDefault() : e.returnValue = false; + e = e || window.event; + var element = e.target || e.srcElement; + if (element.tagName !== 'A') + element = element.parentNode; + if (element.tagName === 'A') { + var url = element.href; + console.log('Click Intercept'); + console.log(url); + if (url !== "https://m.facebook.com/settings" && url !== "https://m.facebook.com/settings#" && url !== "https://m.facebook.com/settings#!/settings?soft=bookmarks") + Frost.loadUrl(url); + Frost.reloadBaseUrl(); //temporary workaround + } +}; diff --git a/app/src/main/assets/js/menu_click.min.js b/app/src/main/assets/js/menu_click.min.js new file mode 100644 index 00000000..f404e360 --- /dev/null +++ b/app/src/main/assets/js/menu_click.min.js @@ -0,0 +1 @@ +document.onclick=function(c){c.preventDefault?c.preventDefault():c.returnValue=false;c=c||window.event;var b=c.target||c.srcElement;if(b.tagName!=="A"){b=b.parentNode}if(b.tagName==="A"){var a=b.href;console.log("Click Intercept");console.log(a);if(a!=="https://m.facebook.com/settings"&&a!=="https://m.facebook.com/settings#"&&a!=="https://m.facebook.com/settings#!/settings?soft=bookmarks"){Frost.loadUrl(a)}Frost.reloadBaseUrl()}};
\ No newline at end of file diff --git a/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt index 70e86239..cc190004 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt @@ -24,7 +24,7 @@ class WebOverlayActivity : AppCompatActivity() { supportActionBar?.setDisplayShowHomeEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true) toolbar.setNavigationOnClickListener { onBackPressed() } - frostWeb.web.baseUrl = url() + frostWeb.web.setupWebview(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 c3bad56c..4a9b3441 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbTab.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbTab.kt @@ -6,9 +6,11 @@ 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 +import com.pitchedapps.frost.web.FrostWebViewClient +import com.pitchedapps.frost.web.FrostWebViewClientMenu +import io.reactivex.subjects.BehaviorSubject -enum class FbTab(@StringRes val titleId: Int, val icon: IIcon, relativeUrl: String, val javascript: JsAssets? = null) { +enum class FbTab(@StringRes val titleId: Int, val icon: IIcon, relativeUrl: String, val webClient: ((refreshObservable: BehaviorSubject<Boolean>) -> FrostWebViewClient)? = 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"), @@ -25,7 +27,7 @@ enum class FbTab(@StringRes val titleId: Int, val icon: IIcon, relativeUrl: Stri 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) + MENU(R.string.menu, GoogleMaterial.Icon.gmd_menu, "settings", { FrostWebViewClientMenu(it) }) ; val url = "$FB_URL_BASE$relativeUrl" 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 0f56592c..04b392ed 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt @@ -10,7 +10,6 @@ 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 @@ -25,21 +24,21 @@ class WebFragment : Fragment() { companion object { private const val ARG_URL = "arg_url" - private const val ARG_ID = "arg_id" + private const val ARG_URL_ENUM = "arg_url_enum" 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) + putSerializable(ARG_URL_ENUM, data) } } // val refresh: SwipeRefreshLayout by lazy { frostWebView.refresh } val web: FrostWebViewCore by lazy { frostWebView.web } lateinit var url: String - var baseJavascript: JsAssets? = null + var urlEnum: FbTab? = null lateinit private var frostWebView: FrostWebView private var firstLoad = true private var refreshDisposable: Disposable? = null @@ -47,14 +46,13 @@ class WebFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) url = arguments.getString(ARG_URL) - baseJavascript = arguments.getSerializable(ARG_ID) as? JsAssets + urlEnum = arguments.getSerializable(ARG_URL_ENUM) as? FbTab } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) frostWebView = FrostWebView(context) - frostWebView.web.baseUrl = url - frostWebView.web.baseJavascript = baseJavascript + frostWebView.web.setupWebview(url, urlEnum) return frostWebView } @@ -106,7 +104,8 @@ class WebFragment : Fragment() { var pauseLoad: Boolean get() = web.settings.blockNetworkLoads set(value) { - web.settings.blockNetworkLoads = value + if (urlEnum != FbTab.MENU) + web.settings.blockNetworkLoads = value } 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 2bf53d2e..e0a9dd3d 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/JsAssets.kt @@ -10,7 +10,7 @@ import com.pitchedapps.frost.utils.L * //TODO add folder mapping using Prefs */ enum class JsAssets { - MENU + MENU, MENU_CLICK ; var file = "${name.toLowerCase()}.min.js" 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 66f638af..14ea4df8 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostJSI.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostJSI.kt @@ -6,15 +6,16 @@ import com.pitchedapps.frost.LoginActivity import com.pitchedapps.frost.MainActivity import com.pitchedapps.frost.SelectorActivity import com.pitchedapps.frost.dbflow.CookieModel +import com.pitchedapps.frost.utils.L import com.pitchedapps.frost.utils.cookies import com.pitchedapps.frost.utils.launchNewTask import com.pitchedapps.frost.utils.launchWebOverlay + /** * Created by Allan Wang on 2017-06-01. */ -class FrostJSI(val context: Context) { - +class FrostJSI(val context: Context, val webView: FrostWebViewCore) { val cookies: ArrayList<CookieModel> get() = (context as? MainActivity)?.cookies() ?: arrayListOf() @@ -22,6 +23,15 @@ class FrostJSI(val context: Context) { fun loadUrl(url: String) = context.launchWebOverlay(url) @JavascriptInterface + fun reloadBaseUrl() { + L.d("FrostJSI reload") + webView.post { + webView.stopLoading() + webView.loadBaseUrl() + } + } + + @JavascriptInterface fun loadLogin() { if (cookies.isNotEmpty()) context.launchNewTask(SelectorActivity::class.java, cookies) @@ -29,4 +39,14 @@ class FrostJSI(val context: Context) { context.launchNewTask(LoginActivity::class.java) } + @JavascriptInterface + fun emit(flag: Int) { + webView.post { webView.frostWebClient!!.emit(flag) } + } + + @JavascriptInterface + fun handleHtml(html: String) { + webView.post { webView.frostWebClient!!.handleHtml(html) } + } + }
\ 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 4554e0a4..167661a4 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt @@ -41,7 +41,7 @@ class FrostWebView @JvmOverloads constructor(context: Context, attrs: AttributeS }) } - //Some urls have javascript injections so make sure we load the base url + //Some urls have postJavascript injections so make sure we load the base url override fun onRefresh() { when (web.baseUrl) { FbTab.MENU.url -> web.loadBaseUrl() 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 28048a1d..2f24d055 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt @@ -4,6 +4,7 @@ import android.content.Context import android.graphics.Bitmap import android.view.KeyEvent import android.webkit.* +import ca.allanwang.kau.utils.isVisible import com.pitchedapps.frost.LoginActivity import com.pitchedapps.frost.MainActivity import com.pitchedapps.frost.SelectorActivity @@ -11,23 +12,25 @@ import com.pitchedapps.frost.facebook.FACEBOOK_COM import com.pitchedapps.frost.facebook.FbCookie import com.pitchedapps.frost.injectors.CssAssets import com.pitchedapps.frost.injectors.JsActions +import com.pitchedapps.frost.injectors.JsAssets import com.pitchedapps.frost.utils.L import com.pitchedapps.frost.utils.Prefs import com.pitchedapps.frost.utils.cookies import com.pitchedapps.frost.utils.launchNewTask import com.pitchedapps.frost.views.circularReveal +import com.pitchedapps.frost.views.fadeIn import com.pitchedapps.frost.views.fadeOut import io.reactivex.subjects.Subject /** * Created by Allan Wang on 2017-05-31. */ -class FrostWebViewClient(val refreshObservable: Subject<Boolean>) : WebViewClient() { +open class FrostWebViewClient(val refreshObservable: Subject<Boolean>) : WebViewClient() { override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) L.i("FWV Loading $url") - L.i("Cookies ${CookieManager.getInstance().getCookie(url)}") + L.v("Cookies ${CookieManager.getInstance().getCookie(url)}") refreshObservable.onNext(true) if (!url.contains(FACEBOOK_COM)) return if (url.contains("logout.php")) FbCookie.logout(Prefs.userId, { launchLogin(view.context) }) @@ -44,20 +47,42 @@ class FrostWebViewClient(val refreshObservable: Subject<Boolean>) : WebViewClien override fun onPageFinished(view: WebView, url: String) { 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") - }) - } + if (!url.contains(FACEBOOK_COM)) { + refreshObservable.onNext(false) + if (!view.isVisible()) view.fadeIn(duration = 200L) + return } + L.i("Page finished $url") JsActions.LOGIN_CHECK.inject(view) + onPageFinishedReveal(view as FrostWebViewCore, url) + } + + open internal fun onPageFinishedReveal(view: FrostWebViewCore, url: String?) { + onPageFinishedReveal(view, true) + } + + internal fun onPageFinishedReveal(view: FrostWebViewCore, animate: Boolean) { + L.d("Page finished reveal") CssAssets.HEADER.inject(view, { - view.circularReveal(offset = 150L) + refreshObservable.onNext(false) + if (animate) view.circularReveal(offset = 150L) + else view.fadeIn(duration = 100L) + }) + } + + open fun handleHtml(html: String) { + L.d("Handle Html") + } + + open fun emit(flag: Int) { + L.d("Emit $flag") + } + + fun inject(jsAssets: JsAssets, view: WebView, callback: (String) -> Unit = {}) { + L.i("Post inject ${jsAssets.name}") + jsAssets.inject(view, { + L.i("Post injection done $it") + callback.invoke(it) }) } @@ -66,13 +91,13 @@ class FrostWebViewClient(val refreshObservable: Subject<Boolean>) : WebViewClien return super.shouldOverrideKeyEvent(view, event) } - override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { - L.d("Url Loading ${request.url?.path}") + override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest?): Boolean { + L.d("Url Loading ${request?.url?.path}") return super.shouldOverrideUrlLoading(view, request) } - override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse? { - if (!request.url.host.contains(FACEBOOK_COM)) return super.shouldInterceptRequest(view, request) + override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest?): WebResourceResponse? { + if (request == null || !(request.url.host?.contains(FACEBOOK_COM) ?: false)) return super.shouldInterceptRequest(view, request) L.v("Url intercept ${request.url.path}") return super.shouldInterceptRequest(view, request) } @@ -80,15 +105,11 @@ class FrostWebViewClient(val refreshObservable: Subject<Boolean>) : WebViewClien override fun onLoadResource(view: WebView, url: String) { if (!url.contains(FACEBOOK_COM)) return super.onLoadResource(view, url) L.v("Resource $url") - FrostWebOverlay.values.forEach { - if (url.contains(it.match)) - L.d("Resource Loaded $it") - } +// FrostWebOverlay.values.forEach { +// if (url.contains(it.match)) +// L.d("Resource Loaded $it") +// } super.onLoadResource(view, url) } - fun logout() { - - } - }
\ No newline at end of file diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClientMenu.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClientMenu.kt new file mode 100644 index 00000000..faf42fdd --- /dev/null +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClientMenu.kt @@ -0,0 +1,71 @@ +package com.pitchedapps.frost.web + +import android.graphics.Bitmap +import android.webkit.WebView +import com.pitchedapps.frost.injectors.JsAssets +import com.pitchedapps.frost.utils.L +import io.reactivex.subjects.Subject + +/** + * Created by Allan Wang on 2017-05-31. + */ +class FrostWebViewClientMenu(refreshObservable: Subject<Boolean>) : FrostWebViewClient(refreshObservable) { + + var content: String? = null + var view: FrostWebViewCore? = null + var loadingFromBase: Boolean = false + + override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { + super.onPageStarted(view, url, favicon) + if (content != null) { + when (url) { + "https://m.facebook.com/settings", + "https://m.facebook.com/settings#", + "https://m.facebook.com/settings#!/settings?soft=bookmarks" -> { + loadingFromBase = true + L.d("Load from stored $url") + view.stopLoading() + view.loadDataWithBaseURL("https://touch.facebook.com/notifications", content, "text/html", "utf-8", "https://google.ca/test") + } + } + } + } + + override fun onPageFinished(view: WebView, url: String) { + super.onPageFinished(view, url) + L.d("DON $url") + loadingFromBase = false + with(view as FrostWebViewCore) { + if (url == view.baseUrl) { + this@FrostWebViewClientMenu.view = view + inject(JsAssets.MENU, view, { + inject(JsAssets.MENU_CLICK, view) //menu injection must be after or we will have a loop from the click listener + }) + } else { + inject(JsAssets.MENU_CLICK, view) + } + } + } + + override fun emit(flag: Int) { + super.emit(flag) + if (view != null) super.onPageFinishedReveal(view!!, true) + view = null + } + + override fun onPageFinishedReveal(view: FrostWebViewCore, url: String?) { + when (url) { + "https://m.facebook.com/settings", + "https://m.facebook.com/settings#", + "https://m.facebook.com/settings#!/settings?soft=bookmarks" -> { + //do nothing; we will further inject before revealing + } + else -> super.onPageFinishedReveal(view, false) + } + } + + override fun handleHtml(html: String) { + super.handleHtml(html) + content = html //we will not save this locally in case things change + } +}
\ No newline at end of file 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 f0596f7c..8d057db1 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt @@ -11,8 +11,8 @@ import android.view.MotionEvent import android.view.View import android.view.animation.DecelerateInterpolator import android.webkit.WebView +import com.pitchedapps.frost.facebook.FbTab 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 @@ -39,25 +39,28 @@ class FrostWebViewCore @JvmOverloads constructor( val titleObservable: BehaviorSubject<String> // Only emits on different non http titles var baseUrl: String? = null - var baseJavascript: JsAssets? = null + var baseEnum: FbTab? = null + internal var frostWebClient: FrostWebViewClient? = null init { isNestedScrollingEnabled = true progressObservable = BehaviorSubject.create<Int>() refreshObservable = BehaviorSubject.create<Boolean>() titleObservable = BehaviorSubject.create<String>() - setupWebview() } @SuppressLint("SetJavaScriptEnabled") - fun setupWebview() { + fun setupWebview(url: String, enum: FbTab? = null) { + baseUrl = url + baseEnum = enum settings.javaScriptEnabled = true settings.userAgentString = USER_AGENT_BASIC // settings.domStorageEnabled = true setLayerType(View.LAYER_TYPE_HARDWARE, null) - webViewClient = FrostWebViewClient(refreshObservable) + frostWebClient = baseEnum?.webClient?.invoke(refreshObservable) ?: FrostWebViewClient(refreshObservable) + webViewClient = frostWebClient webChromeClient = FrostChromeClient(progressObservable, titleObservable) - addJavascriptInterface(FrostJSI(context), "Frost") + addJavascriptInterface(FrostJSI(context, this), "Frost") } override fun loadUrl(url: String?) { diff --git a/gradle.properties b/gradle.properties index befbfcb9..4f1d02e7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -31,7 +31,7 @@ RX_JAVA=2.1.0 RX_ANDROID=2.0.1 RX_BINDING=2.0.0 JSOUP=1.10.2 -ANKO=0.10.0 +ANKO=0.10.1 GLIDE=4.0.0-RC0 RETROFIT=2.2.0 DBFLOW=4.0.2 |