From 6adfc496374eb88919f70a240eb15a726d2c18e0 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Fri, 7 Jul 2017 03:26:55 -0400 Subject: Dev 1.1.6 (#33) - Fix play store listing, add sharing options, update css & js * Remove play store listing updates * Fix up listing * Combine url getters for overlay activity * Begin building context menu programmatically * Update css and js --- app/build.gradle | 1 - .../assets/css/components/round_icons.compact.css | 2 +- .../main/assets/css/components/round_icons.scss | 2 +- app/src/main/assets/css/themes/custom.compact.css | 2 +- .../assets/css/themes/material_amoled.compact.css | 2 +- .../assets/css/themes/material_dark.compact.css | 2 +- .../assets/css/themes/material_glass.compact.css | 2 +- .../assets/css/themes/material_light.compact.css | 2 +- app/src/main/assets/js/click_a.js | 36 +++++++- app/src/main/assets/js/click_a.min.js | 35 ++++---- app/src/main/assets/js/click_interceptor.js | 9 -- app/src/main/assets/js/click_interceptor.min.js | 8 -- app/src/main/assets/js/context_a.js | 31 +++++++ app/src/main/assets/js/context_a.min.js | 15 ++++ .../com/pitchedapps/frost/FrostWebActivity.kt | 4 - .../kotlin/com/pitchedapps/frost/MainActivity.kt | 2 +- .../com/pitchedapps/frost/WebOverlayActivity.kt | 6 +- .../com/pitchedapps/frost/fragments/WebFragment.kt | 2 +- .../com/pitchedapps/frost/injectors/JsAssets.kt | 7 +- .../kotlin/com/pitchedapps/frost/web/FrostJSI.kt | 12 +-- .../pitchedapps/frost/web/FrostWebContextMenu.kt | 100 +++++++++++++++++++++ .../com/pitchedapps/frost/web/FrostWebView.kt | 25 +++++- .../pitchedapps/frost/web/FrostWebViewClient.kt | 1 + .../com/pitchedapps/frost/web/FrostWebViewCore.kt | 18 ---- app/src/main/play/contactEmail | 1 + app/src/main/play/defaultLanguage | 1 + app/src/main/play/en-CA/listing/title | 1 + app/src/main/res/layout/swipe_webview.xml | 7 +- app/src/main/res/xml/changelog.xml | 3 +- 29 files changed, 255 insertions(+), 84 deletions(-) delete mode 100644 app/src/main/assets/js/click_interceptor.js delete mode 100644 app/src/main/assets/js/click_interceptor.min.js create mode 100644 app/src/main/assets/js/context_a.js create mode 100644 app/src/main/assets/js/context_a.min.js create mode 100644 app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebContextMenu.kt create mode 100644 app/src/main/play/contactEmail create mode 100644 app/src/main/play/defaultLanguage create mode 100644 app/src/main/play/en-CA/listing/title (limited to 'app') diff --git a/app/build.gradle b/app/build.gradle index 921f0cf5..1517309c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,6 @@ plugins { apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'io.fabric' apply plugin: 'com.github.triplet.play' diff --git a/app/src/main/assets/css/components/round_icons.compact.css b/app/src/main/assets/css/components/round_icons.compact.css index 0d85c1ff..0ae132de 100644 --- a/app/src/main/assets/css/components/round_icons.compact.css +++ b/app/src/main/assets/css/components/round_icons.compact.css @@ -1 +1 @@ -#threadlist_rows i.img:not(.profpic), i.img.profpic:not(._1_0m) { border-radius: 50%; } +#threadlist_rows i.img:not(.profpic), i.img.profpic:not(._1_0m), ._42b6._42b6._42b6, ._5i9c.img, img._2cu2, i.img.l, [id*=threadlist] i.img:not(._1_0m) { border-radius: 50%; } diff --git a/app/src/main/assets/css/components/round_icons.scss b/app/src/main/assets/css/components/round_icons.scss index 19f2824f..58d20670 100644 --- a/app/src/main/assets/css/components/round_icons.scss +++ b/app/src/main/assets/css/components/round_icons.scss @@ -1,3 +1,3 @@ -#threadlist_rows i.img:not(.profpic), i.img.profpic:not(._1_0m) { +#threadlist_rows i.img:not(.profpic), i.img.profpic:not(._1_0m), ._42b6._42b6._42b6, ._5i9c.img, img._2cu2, i.img.l, [id*=threadlist] i.img:not(._1_0m) { border-radius: 50%; } diff --git a/app/src/main/assets/css/themes/custom.compact.css b/app/src/main/assets/css/themes/custom.compact.css index ce04f7c0..5c911764 100644 --- a/app/src/main/assets/css/themes/custom.compact.css +++ b/app/src/main/assets/css/themes/custom.compact.css @@ -10,7 +10,7 @@ body, #root, #header, [style*="background-color"], ._55wo, ._1upc, input, ._2f9r button, button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before, ._590n, ._4g8h, ._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj, .excessItem, ._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51, ._4qax, .aclb, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, .acbk { background: $BBT$ !important; } -[style*="color"], body, input, ._43mh, .touch .btn, p, span, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35, ._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu, ._18qg, ._1_ac, textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782, ._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh, ._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions, ._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g, ._2new, .appCenterCategorySelectorButton, .mentions-input, .mentions-placeholder, .fcw, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, h1, h2, h3, h4, h5, h6 { color: $T$ !important; } +[style*="color"], body, input, ._43mh, .touch .btn, p, span, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35, ._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu, ._18qg, ._1_ac, textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782, ._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh, ._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions, ._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g, ._2new, .appCenterCategorySelectorButton, .mentions-input, .mentions-placeholder, .fcw, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs, h1, h2, h3, h4, h5, h6 { color: $T$ !important; } ._15kl::before, ._5j35::after, ._2k4b, ._3to7, ._4nw8 { border-left: 1px solid $D$ !important; } diff --git a/app/src/main/assets/css/themes/material_amoled.compact.css b/app/src/main/assets/css/themes/material_amoled.compact.css index 1f0ecb46..068fa185 100644 --- a/app/src/main/assets/css/themes/material_amoled.compact.css +++ b/app/src/main/assets/css/themes/material_amoled.compact.css @@ -10,7 +10,7 @@ body, #root, #header, [style*="background-color"], ._55wo, ._1upc, input, ._2f9r button, button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before, ._590n, ._4g8h, ._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj, .excessItem, ._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51, ._4qax, .aclb, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, .acbk { background: rgba(89, 89, 89, 0.2) !important; } -[style*="color"], body, input, ._43mh, .touch .btn, p, span, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35, ._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu, ._18qg, ._1_ac, textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782, ._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh, ._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions, ._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g, ._2new, .appCenterCategorySelectorButton, .mentions-input, .mentions-placeholder, .fcw, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, h1, h2, h3, h4, h5, h6 { color: #fff !important; } +[style*="color"], body, input, ._43mh, .touch .btn, p, span, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35, ._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu, ._18qg, ._1_ac, textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782, ._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh, ._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions, ._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g, ._2new, .appCenterCategorySelectorButton, .mentions-input, .mentions-placeholder, .fcw, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs, h1, h2, h3, h4, h5, h6 { color: #fff !important; } ._15kl::before, ._5j35::after, ._2k4b, ._3to7, ._4nw8 { border-left: 1px solid rgba(255, 255, 255, 0.3) !important; } diff --git a/app/src/main/assets/css/themes/material_dark.compact.css b/app/src/main/assets/css/themes/material_dark.compact.css index 6e7107fd..22566c19 100644 --- a/app/src/main/assets/css/themes/material_dark.compact.css +++ b/app/src/main/assets/css/themes/material_dark.compact.css @@ -10,7 +10,7 @@ body, #root, #header, [style*="background-color"], ._55wo, ._1upc, input, ._2f9r button, button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before, ._590n, ._4g8h, ._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj, .excessItem, ._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51, ._4qax, .aclb, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, .acbk { background: rgba(137, 137, 137, 0.2) !important; } -[style*="color"], body, input, ._43mh, .touch .btn, p, span, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35, ._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu, ._18qg, ._1_ac, textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782, ._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh, ._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions, ._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g, ._2new, .appCenterCategorySelectorButton, .mentions-input, .mentions-placeholder, .fcw, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, h1, h2, h3, h4, h5, h6 { color: #fff !important; } +[style*="color"], body, input, ._43mh, .touch .btn, p, span, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35, ._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu, ._18qg, ._1_ac, textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782, ._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh, ._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions, ._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g, ._2new, .appCenterCategorySelectorButton, .mentions-input, .mentions-placeholder, .fcw, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs, h1, h2, h3, h4, h5, h6 { color: #fff !important; } ._15kl::before, ._5j35::after, ._2k4b, ._3to7, ._4nw8 { border-left: 1px solid rgba(255, 255, 255, 0.3) !important; } diff --git a/app/src/main/assets/css/themes/material_glass.compact.css b/app/src/main/assets/css/themes/material_glass.compact.css index abaa81ac..bb81c573 100644 --- a/app/src/main/assets/css/themes/material_glass.compact.css +++ b/app/src/main/assets/css/themes/material_glass.compact.css @@ -10,7 +10,7 @@ body, #root, #header, [style*="background-color"], ._55wo, ._1upc, input, ._2f9r button, button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before, ._590n, ._4g8h, ._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj, .excessItem, ._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51, ._4qax, .aclb, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, .acbk { background: rgba(128, 128, 128, 0.05) !important; } -[style*="color"], body, input, ._43mh, .touch .btn, p, span, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35, ._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu, ._18qg, ._1_ac, textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782, ._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh, ._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions, ._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g, ._2new, .appCenterCategorySelectorButton, .mentions-input, .mentions-placeholder, .fcw, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, h1, h2, h3, h4, h5, h6 { color: #fff !important; } +[style*="color"], body, input, ._43mh, .touch .btn, p, span, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35, ._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu, ._18qg, ._1_ac, textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782, ._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh, ._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions, ._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g, ._2new, .appCenterCategorySelectorButton, .mentions-input, .mentions-placeholder, .fcw, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs, h1, h2, h3, h4, h5, h6 { color: #fff !important; } ._15kl::before, ._5j35::after, ._2k4b, ._3to7, ._4nw8 { border-left: 1px solid rgba(255, 255, 255, 0.3) !important; } diff --git a/app/src/main/assets/css/themes/material_light.compact.css b/app/src/main/assets/css/themes/material_light.compact.css index 87b2b923..9acc213f 100644 --- a/app/src/main/assets/css/themes/material_light.compact.css +++ b/app/src/main/assets/css/themes/material_light.compact.css @@ -10,7 +10,7 @@ body, #root, #header, [style*="background-color"], ._55wo, ._1upc, input, ._2f9r button, button::before, .touch ._56bt, ._56be::before, .btnS, .touch::before, ._590n, ._4g8h, ._5xo2, ._5u5a::before, ._4u3j, ._15ks, ._5hua, ._59tt, ._41ft, .jx-tokenizer, ._55fj, .excessItem, ._4e8n, ._5pxa._3uj9, ._5n_5, ._u2d, ._56bu::before, ._5h8f, ._d00, ._2066, ._2k51, ._4qax, .aclb, ._4756, ._w34, ._56bv::before, ._5769, ._34iv, .acbk { background: rgba(255, 255, 255, 0.2) !important; } -[style*="color"], body, input, ._43mh, .touch .btn, p, span, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35, ._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu, ._18qg, ._1_ac, textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782, ._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh, ._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions, ._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g, ._2new, .appCenterCategorySelectorButton, .mentions-input, .mentions-placeholder, .fcw, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, h1, h2, h3, h4, h5, h6 { color: #000 !important; } +[style*="color"], body, input, ._43mh, .touch .btn, p, span, .fcg, button, ._52j9, ._52jb, ._52ja, ._5j35, ._rnk, ._24u0, ._1g06, ._14ye, .fcb, ._56cz._56c_, ._1gk_, ._55fj, ._45fu, ._18qg, ._1_ac, textarea, ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._5780, ._5781, ._5782, ._3u9u, ._3u9_, ._3u9s, ._1hcx, ._2066, ._1_-1, ._cv_, ._1nbx, ._2cuh, ._4ms9, ._4ms5, ._4ms6, ._31b4, ._31b5, ._5q_r, ._idb, ._27vp, ._4nwe, ._4nw9, ._27vi, .appCenterAppInfo, .appCenterPermissions, ._3c9l, ._3c9m, ._4jn_, ._32qt, ._3mom, ._3moo, ._-7o, ._d00, ._d01, ._559g, ._2new, .appCenterCategorySelectorButton, .mentions-input, .mentions-placeholder, .fcw, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs, h1, h2, h3, h4, h5, h6 { color: #000 !important; } ._15kl::before, ._5j35::after, ._2k4b, ._3to7, ._4nw8 { border-left: 1px solid rgba(0, 0, 0, 0.3) !important; } diff --git a/app/src/main/assets/js/click_a.js b/app/src/main/assets/js/click_a.js index aabcd7e3..27b09a7e 100644 --- a/app/src/main/assets/js/click_a.js +++ b/app/src/main/assets/js/click_a.js @@ -3,7 +3,14 @@ if (!window.hasOwnProperty('frost_click_a')) { console.log('Registering frost_click_a'); window.frost_click_a = true; + var prevented = false; + var _frostAClick = function(e) { + + + /* + * Commonality; check for valid target + */ var element = e.target || e.srcElement; if (element.tagName !== 'A') element = element.parentNode; //Notifications is two layers under @@ -11,12 +18,37 @@ if (!window.hasOwnProperty('frost_click_a')) { if (element.tagName === 'A' && element.getAttribute('href') !== '#') { var url = element.getAttribute('href'); if (url.includes('photoset_token')) return; - console.log('Click Intercept', url); - Frost.loadUrl(url); + + + + + if (!prevented) { + console.log('Click Intercept', url); + Frost.loadUrl(url); + } e.stopPropagation(); e.preventDefault(); } } + /* + * On top of the click event, we must stop it for long presses + * Since that will conflict with the context menu + * Note that we only override it on conditions where the context menu + * Will occur + */ + var _frostPreventClick = function() { + console.log('Click prevented') + prevented = true; + } + document.addEventListener('click', _frostAClick, true); + + document.addEventListener('touchstart', function _frostStart(e) { + setTimeout(_frostPreventClick, 500); + }, true); + + document.addEventListener('touchend', function _frostEnd(e) { + prevented = false; + }, true); } diff --git a/app/src/main/assets/js/click_a.min.js b/app/src/main/assets/js/click_a.min.js index b09e7174..9f955705 100644 --- a/app/src/main/assets/js/click_a.min.js +++ b/app/src/main/assets/js/click_a.min.js @@ -1,17 +1,22 @@ if(!window.hasOwnProperty("frost_click_a")){ -console.log("Registering frost_click_a"); -window.frost_click_a=true; -var _frostAClick=function(e){ -var element=e.target||e.srcElement; -if(element.tagName!=="A")element=element.parentNode; -if(element.tagName!=="A")element=element.parentNode; -if(element.tagName==="A"&&element.getAttribute("href")!=="#"){ -var url=element.getAttribute("href"); -if(url.includes("photoset_token"))return; -console.log("Click Intercept",url); -Frost.loadUrl(url); -e.stopPropagation(); -e.preventDefault(); -}}; -document.addEventListener("click",_frostAClick,true); +console.log("Registering frost_click_a"), +window.frost_click_a=!0 +;var prevented=!1,_frostAClick=function(e){ +var t=e.target||e.srcElement +;if("A"!==t.tagName&&(t=t.parentNode),"A"!==t.tagName&&(t=t.parentNode), +"A"===t.tagName&&"#"!==t.getAttribute("href")){ +var n=t.getAttribute("href") +;if(n.includes("photoset_token"))return +;prevented||(console.log("Click Intercept",n), +Frost.loadUrl(n)),e.stopPropagation(), +e.preventDefault() +} +},_frostPreventClick=function(){ +console.log("Click prevented"),prevented=!0 +} +;document.addEventListener("click",_frostAClick,!0),document.addEventListener("touchstart",function(e){ +setTimeout(_frostPreventClick,500) +},!0),document.addEventListener("touchend",function(e){ +prevented=!1 +},!0) } \ No newline at end of file diff --git a/app/src/main/assets/js/click_interceptor.js b/app/src/main/assets/js/click_interceptor.js deleted file mode 100644 index debf85dc..00000000 --- a/app/src/main/assets/js/click_interceptor.js +++ /dev/null @@ -1,9 +0,0 @@ -// we will handle click events -if (!window.hasOwnProperty('frost_click_interceptor')) { - console.log('Registering frost_click_interceptor'); - window.frost_click_interceptor = true; - document.addEventListener('click', function _menuClick(e) { - var element = e.target || e.srcElement; - console.log(element.tagName); - }, true); -} diff --git a/app/src/main/assets/js/click_interceptor.min.js b/app/src/main/assets/js/click_interceptor.min.js deleted file mode 100644 index 45649781..00000000 --- a/app/src/main/assets/js/click_interceptor.min.js +++ /dev/null @@ -1,8 +0,0 @@ -if(!window.hasOwnProperty("frost_click_interceptor")){ -console.log("Registering frost_click_interceptor"); -window.frost_click_interceptor=true; -document.addEventListener("click",function _menuClick(e){ -var element=e.target||e.srcElement; -console.log(element.tagName); -},true); -} \ No newline at end of file diff --git a/app/src/main/assets/js/context_a.js b/app/src/main/assets/js/context_a.js new file mode 100644 index 00000000..5e09ffcd --- /dev/null +++ b/app/src/main/assets/js/context_a.js @@ -0,0 +1,31 @@ +//context menu for links +//largely mimics click_a.js +if (!window.hasOwnProperty('frost_context_a')) { + console.log('frost_context_a frost_click_a'); + window.frost_context_a = true; + + var _frostAContext = function(e) { + + + /* + * Commonality; check for valid target + */ + var element = e.target || e.srcElement; + if (element.tagName !== 'A') element = element.parentNode; + //Notifications is two layers under + if (element.tagName !== 'A') element = element.parentNode; + if (element.tagName === 'A' && element.getAttribute('href') !== '#') { + var url = element.getAttribute('href'); + if (url.includes('photoset_token')) return; + + + + console.log('Context Intercept', url); + Frost.contextMenu(url); + e.stopPropagation(); + e.preventDefault(); + } + } + + document.addEventListener('contextmenu', _frostAContext, true); +} diff --git a/app/src/main/assets/js/context_a.min.js b/app/src/main/assets/js/context_a.min.js new file mode 100644 index 00000000..dc68cb3b --- /dev/null +++ b/app/src/main/assets/js/context_a.min.js @@ -0,0 +1,15 @@ +if(!window.hasOwnProperty("frost_context_a")){ +console.log("frost_context_a frost_click_a"), +window.frost_context_a=!0 +;var _frostAContext=function(t){ +var e=t.target||t.srcElement +;if("A"!==e.tagName&&(e=e.parentNode),"A"!==e.tagName&&(e=e.parentNode), +"A"===e.tagName&&"#"!==e.getAttribute("href")){ +var o=e.getAttribute("href") +;if(o.includes("photoset_token"))return +;console.log("Context Intercept",o),Frost.contextMenu(o), +t.stopPropagation(),t.preventDefault() +} +} +;document.addEventListener("contextmenu",_frostAContext,!0) +} \ No newline at end of file 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? = (context as? MainActivity)?.headerBadgeObservable @@ -35,6 +32,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() } - @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) diff --git a/app/src/main/play/contactEmail b/app/src/main/play/contactEmail new file mode 100644 index 00000000..3e033920 --- /dev/null +++ b/app/src/main/play/contactEmail @@ -0,0 +1 @@ +pitchedapps@gmail.com \ No newline at end of file diff --git a/app/src/main/play/defaultLanguage b/app/src/main/play/defaultLanguage new file mode 100644 index 00000000..ffdd217e --- /dev/null +++ b/app/src/main/play/defaultLanguage @@ -0,0 +1 @@ +en-CA \ No newline at end of file diff --git a/app/src/main/play/en-CA/listing/title b/app/src/main/play/en-CA/listing/title new file mode 100644 index 00000000..a933d845 --- /dev/null +++ b/app/src/main/play/en-CA/listing/title @@ -0,0 +1 @@ +Frost for Facebook \ No newline at end of file diff --git a/app/src/main/res/layout/swipe_webview.xml b/app/src/main/res/layout/swipe_webview.xml index e8c0572d..12bccf11 100644 --- a/app/src/main/res/layout/swipe_webview.xml +++ b/app/src/main/res/layout/swipe_webview.xml @@ -22,9 +22,14 @@ + + \ No newline at end of file diff --git a/app/src/main/res/xml/changelog.xml b/app/src/main/res/xml/changelog.xml index 82ec5257..ac883387 100644 --- a/app/src/main/res/xml/changelog.xml +++ b/app/src/main/res/xml/changelog.xml @@ -11,8 +11,7 @@ - - + -- cgit v1.2.3