This commit is contained in:
lunaticbum 2024-11-27 17:04:51 +09:00
parent 897992f914
commit 33d0a930fd
15 changed files with 221 additions and 49 deletions

View File

@ -44,8 +44,11 @@ import android.support.v4.media.MediaBrowserCompat
import android.telephony.TelephonyManager
import android.view.KeyEvent
import android.view.KeyEvent.ACTION_UP
import android.view.KeyEvent.KEYCODE_BUTTON_A
import android.view.KeyEvent.KEYCODE_BUTTON_SELECT
import android.view.KeyEvent.KEYCODE_BUTTON_START
import android.view.KeyEvent.KEYCODE_BUTTON_X
import android.view.KeyEvent.KEYCODE_BUTTON_Y
import android.view.KeyEvent.KEYCODE_DPAD_DOWN
import android.view.KeyEvent.KEYCODE_DPAD_LEFT
import android.view.KeyEvent.KEYCODE_DPAD_RIGHT
@ -87,8 +90,11 @@ import bums.lunatic.launcher.home.LauncherHome
import bums.lunatic.launcher.home.RssViewBuilder
import bums.lunatic.launcher.home.adapters.RssItemAdapter.Companion.rssList
import bums.lunatic.launcher.model.RssData
import bums.lunatic.launcher.model.RssDataType
import bums.lunatic.launcher.receiver.NLService
import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.utils.FeedParseManager
import bums.lunatic.launcher.utils.getJ
import bums.lunatic.launcher.workers.AppInfoGetter
import bums.lunatic.launcher.workers.ArcaGetter
import bums.lunatic.launcher.workers.CalendarGetter
@ -116,8 +122,12 @@ import bums.lunatic.launcher.workers.YoutubeGetter.Companion.YT_WORK_TAG
import com.google.android.material.color.DynamicColors
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import io.realm.kotlin.ext.query
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kr.lunaticbum.utils.ui.DisplayUtil
import java.text.SimpleDateFormat
import java.util.Base64
import java.util.Calendar
import java.util.Date
import java.util.Locale
@ -323,26 +333,26 @@ internal class LauncherActivity : CommonActivity() {
override fun dispatchKeyEvent(ev: KeyEvent): Boolean {
Blog.LOGE("dispatch ev?.device?.name >>> ${ev?.device?.name}")
if (ev?.device?.name?.contains("SM-031N Mouse") == true) {
Blog.LOGE("dispatch dispatchKeyEvent>>> ${ev}")
when(ev.action) {
ACTION_UP -> {
Blog.LOGE("dispatch dispatchKeyEvent>>> ${ev}")
when(ev.keyCode) {
KEYCODE_DPAD_LEFT->{
KEYCODE_BUTTON_Y->{
CoroutineScope(Dispatchers.IO).launch {
String(Base64.getMimeDecoder().decode("aHR0cHM6Ly9qYXZtb3N0LnRvL2xhdGVzdC11cGRhdGVzCg==".toByteArray())).getJ().let { doc -> FeedParseManager.parse(doc){Blog.LOGE(it)} }
}
KEYCODE_DPAD_RIGHT->{
CoroutineScope(Dispatchers.IO).launch {
String.format(String(Base64.getMimeDecoder().decode("aHR0cHM6Ly9qYXZtb3N0LnRvL3NlYXJjaC9tb3ZpZS8lcw==".toByteArray())),"").getJ().let { doc -> FeedParseManager.parse(doc){Blog.LOGE(it)} }
}
KEYCODE_DPAD_DOWN->{
CoroutineScope(Dispatchers.IO).launch {
String.format(String(Base64.getMimeDecoder().decode("aHR0cHM6Ly9rcjcxLnNvZ2lybC5zby8/cz0lcw==".toByteArray())),"").getJ().let { doc -> FeedParseManager.parse(doc){Blog.LOGE(it)} }
}
KEYCODE_DPAD_UP->{
}
KEYCODE_BUTTON_START->{
KEYCODE_BUTTON_X->{
WorkersDb.getRealm().apply {
writeBlocking {
var ddd = copyFromRealm(WorkersDb.getRssQuery(null, null,false).limit(100).find()).map { it.originPage() }
var ddd = copyFromRealm(WorkersDb.getRssQuery("", RssDataType.getAdts(),false).limit(100).find()).map { it.originPage() }
var origin = ddd.first()
RssViewBuilder(lActivity!!)
.setRssList(arrayListOf<String>().apply { this.addAll(ddd) })
@ -352,13 +362,39 @@ internal class LauncherActivity : CommonActivity() {
}
}
}
KEYCODE_BUTTON_A->{
WorkersDb.getRealm().apply {
writeBlocking {
var ddd = copyFromRealm(WorkersDb.getRssQuery("", arrayListOf(),false).limit(100).query("read == $0", 0).query("vote != $0", true).find()).map { it.originPage() }
var origin = ddd.first()
RssViewBuilder(lActivity!!)
.setRssList(arrayListOf<String>().apply { this.addAll(ddd) })
.setRssId(origin)
.showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
.show(origin)
}
}
}
KEYCODE_DPAD_DOWN->{
}
KEYCODE_DPAD_UP->{
}
KEYCODE_BUTTON_START->{
onClickCenterButton()
}
KEYCODE_BUTTON_SELECT->{
WorkersDb.getRealm().apply {
writeBlocking {
var ddd = copyFromRealm(WorkersDb.getVotedRss().limit(100).find()).map { it.originPage() }
var origin = ddd.first()
RssViewBuilder(lActivity!!)
.setRssList(arrayListOf<String>().apply { this.addAll(ddd) })
.setRssList(arrayListOf<String>().apply {
var jjjj = hashSetOf<String>()
jjjj.addAll(ddd)
this.addAll(jjjj)}
)
.setRssId(origin)
.showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
.show(origin)
@ -374,6 +410,24 @@ internal class LauncherActivity : CommonActivity() {
}
return super.dispatchKeyEvent(ev)
}
fun onClickCenterButton() {
WorkersDb.getRealm().apply {
writeBlocking {
var ddd = copyFromRealm(WorkersDb.getRssQuery("", RssDataType.getExcAdt(),false).limit(100).query("read == $0", 0).query("vote != $0", true).find()).map { it.originPage() }
var origin = ddd.first()
RssViewBuilder(lActivity!!)
.setRssList(arrayListOf<String>().apply {
var jjjj = hashSetOf<String>()
jjjj.addAll(ddd)
this.addAll(jjjj) })
.setRssId(origin)
.showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
.show(origin)
}
}
}
override fun dispatchGenericMotionEvent(ev: MotionEvent?): Boolean {
// Blog.LOGE("dispatchKeyEvent ev?.device?.name >>> ${ev?.device?.name}")
/// || ev?.device?.name?.contains("SM-031N Mouse") == true
@ -409,17 +463,7 @@ internal class LauncherActivity : CommonActivity() {
Blog.LOGE("DisplayUtil.width >>> ${DisplayUtil.height} ${actionButtonPressY}")
if(actionButtonPressX.toInt() == 480 && actionButtonPressY < 2000) {
Blog.LOGE("Arrow Center Click")
WorkersDb.getRealm().apply {
writeBlocking {
var ddd = copyFromRealm(WorkersDb.getRssQuery("", arrayListOf(),false).find()).map { it.originPage() }
var origin = ddd.first()
RssViewBuilder(lActivity!!)
.setRssList(arrayListOf<String>().apply { this.addAll(ddd) })
.setRssId(origin)
.showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
.show(origin)
}
}
onClickCenterButton()
} else if(ev.y > 2000) {
}

View File

@ -3,6 +3,7 @@ package bums.lunatic.launcher.common
import android.content.Intent
import android.os.Environment
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ComponentActivity
import bums.lunatic.launcher.R
import bums.lunatic.launcher.apps.SearchMenu
import bums.lunatic.launcher.helpers.PrefBoolean

View File

@ -391,6 +391,18 @@ internal class LauncherHome : Fragment() {
it.notifyDataSetChanged()
}
mWeatherAdapter?.let {
fun onclick() {
requireContext().startActivity(Intent().apply {
action = Intent.ACTION_VIEW
setData(Uri.parse("https://www.accuweather.com/ko/search-locations?query=${LocationGetter.latitude},${LocationGetter.longitude}"))
})
}
binding.weathers.weatherViewPager.setOnTouchListener { v, event ->
onclick()
true
}
binding.weathers.weatherViewPager.setOnClickListener { onclick() }
binding.weathers.root.setOnClickListener { onclick() }
binding.weathers.textLocation =
if (hours.isNotEmpty()) WeatherInfoManager.getShowingInfo(hours.first()).textLocation else "도시 / 나라"
it.notifyDataSetChanged()

View File

@ -211,7 +211,7 @@ class RssViewerActivity : AwesomeWebViewActivity(), View.OnGenericMotionListene
fun rightClick() {
if (currentIdx < rssList.size - 1) {
currentIdx += 1
rssId = rssList.get(currentIdx)
rssId = rssList.removeAt(currentIdx)
Blog.LOGE("Arrow Right Click ${currentIdx} ${rssId}")
load(rssId)
registCancelSearch()
@ -224,7 +224,7 @@ class RssViewerActivity : AwesomeWebViewActivity(), View.OnGenericMotionListene
fun leftClick() {
if (currentIdx > 0) {
currentIdx -= 1
rssId = rssList.get(currentIdx)
rssId = rssList.removeAt(currentIdx)
Blog.LOGE("Arrow Left Click ${currentIdx} ${rssId}")
load(rssId)
registCancelSearch()
@ -315,6 +315,18 @@ class RssViewerActivity : AwesomeWebViewActivity(), View.OnGenericMotionListene
registCancelSearch()
}
protected fun load(newUrl: String) {
newUrl.toUri().host?.let {
val splits = it.replace("http://","").replace("https://","").split(".")
when(splits.size) {
1-> host = splits[0]
2-> host = splits[0]
3-> host = splits[1]
4-> host = splits[2]
else -> {
host = null
}
}
}
if (extraHeaders == null) {
webView!!.loadUrl(newUrl!!)
} else {
@ -340,6 +352,9 @@ class RssViewerActivity : AwesomeWebViewActivity(), View.OnGenericMotionListene
}
override fun webviewOnPageFinished() {
double = false
if(hasYoutubePlayer) {
LogUtil.e("hasYoutubePlayer >>> ${hasYoutubePlayer}")
}
WorkersDb.getRealm().apply {
writeBlocking {
val result =
@ -347,6 +362,8 @@ class RssViewerActivity : AwesomeWebViewActivity(), View.OnGenericMotionListene
.find()
if (result.size == 1) {
result.first().read += 1
} else {
result.forEach { it.read += 1 }
}
}
}

View File

@ -119,7 +119,7 @@ object RssFeedsParser {
if (date > limitDateTime && title != null && link != null) {
Blog.LOGE("date ${date} title ${title} link ${link}")
// Blog.LOGE("date ${date} title ${title} link ${link}")
val item = NewsData(title, link)
item.pubDate = date
item.source = source

View File

@ -94,7 +94,11 @@ internal class RssItemAdapter (
openReddit(rss.originPage())
} else {
RssViewBuilder(lActivity!!)
.setRssList(rssList)
.setRssList(arrayListOf<String>().apply {
var jjjj = hashSetOf<String>()
jjjj.addAll(rssList)
this.addAll(jjjj)
})
.setRssId(rss.originPage())
.showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
.show(rss.originPage!!)
@ -107,7 +111,11 @@ internal class RssItemAdapter (
}
RssDataType.DOTAX -> {
RssViewBuilder(lActivity!!)
.setRssList(rssList)
.setRssList(arrayListOf<String>().apply {
var jjjj = hashSetOf<String>()
jjjj.addAll(rssList)
this.addAll(jjjj)
})
.setRssId(rss.originPage())
.showIconClose(true).showIconBack(false).showProgressBar(true).webViewMixedContentMode(0)
.show(rss.originPage!!)
@ -119,7 +127,11 @@ internal class RssItemAdapter (
}
else -> {
RssViewBuilder(lActivity!!)
.setRssList(rssList)
.setRssList(arrayListOf<String>().apply {
var jjjj = hashSetOf<String>()
jjjj.addAll(rssList)
this.addAll(jjjj)
})
.setRssId(rss.originPage())
.showIconClose(true).showIconBack(false).showProgressBar(true).webViewMixedContentMode(0)
.show(rss.originPage!!)

View File

@ -40,6 +40,7 @@ class NewsData : RssDataInterface {
return RssDataType.NEWSFEED
}
override fun getCho(): String? {
return JamoUtils.split(title()).joinToString("")
var cho = JamoUtils.split(title()).joinToString("")
return if(cho.length > 0 ) cho else title()
}
}

View File

@ -50,6 +50,10 @@ enum class RssDataType {
}
}
companion object {
fun getExcAdt() = arrayListOf(NEWSFEED, REDDIT, DOTAX, FMKORAE, DCINSIDE, RULIWEB, CLIEN, THEQOO, ARCA).map { it.name }
fun getAdts() = arrayListOf( REDDIT_NSFW, MOST,GURU).map { it.name }
}
}
interface RssDataInterface {

View File

@ -198,7 +198,7 @@ object WorkersDb {
fun getVotedRss() = getRealm().query<RssData>().query("vote == $0", true)
fun getRssQuery(keyword: String?,
category: ArrayList<String>? = arrayListOf(),
category: Collection<String>? = arrayListOf(),
noLimit: Boolean = false) : RealmQuery<RssData>{
var rQ = getRealm().query<RssData>()
if (!noLimit) rQ.query("pubDate > $0", beforeDay(Date(), 3))

View File

@ -59,6 +59,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textDress"
android:maxLines="2"
style="@style/small"
android:text="@{info.textCondition}"
android:gravity="center"

View File

@ -58,6 +58,7 @@
android:includeFontPadding="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxWidth="80dp"
android:id="@+id/textDress"
style="@style/small"
android:text="@{info.textCondition}"

View File

@ -35,6 +35,8 @@ android {
}
dependencies {
implementation( "com.github.bumptech.glide:glide:4.11.0")
annotationProcessor ("com.github.bumptech.glide:compiler:4.11.0")
// implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation ("androidx.annotation:annotation:1.9.1")
implementation ("androidx.appcompat:appcompat:1.7.0")

View File

@ -1,6 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<application
android:usesCleartextTraffic="true">
<provider
android:name="kr.lunaticbum.awesomewebview.helpers.FileProvider4WebView"
android:authorities="${applicationId}.awesome_web_view.file_provider"

View File

@ -63,6 +63,8 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.core.net.toUri
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.google.android.material.snackbar.Snackbar
import kr.lunaticbum.awesomewebview.databinding.AwesomeWebViewBinding
import kr.lunaticbum.awesomewebview.enums.Position
@ -86,11 +88,14 @@ import kr.lunaticbum.utils.service.ClipboardManagerUtil
import kr.lunaticbum.utils.ui.DisplayUtil
import kr.lunaticbum.utils.ui.ViewUtil
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.IOException
import java.io.InputStream
import java.net.URL
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import kotlin.math.abs
@ -564,7 +569,11 @@ open class AwesomeWebViewActivity : AppCompatActivity(), View.OnClickListener,
val chechHandler = Handler(Looper.getMainLooper())
val cancelSearch = Runnable {
if(!hasYoutubePlayer) {
finish()
} else {
registCancelSearch()
}
}
fun fast() {
@ -1305,9 +1314,6 @@ open class AwesomeWebViewActivity : AppCompatActivity(), View.OnClickListener,
if (data != null) {
webView!!.loadData(data!!, mimeType, encoding)
} else if (url != null) {
// host = url!!.toUri().host?.replace("www.","")?.replace("m.","")
LogUtil.e("url!!.toUri(). >> ${url!!.toUri().authority}")
LogUtil.e("url!!.toUri(). >> ${url!!.toUri().encodedFragment}")
if (extraHeaders == null) {
webView!!.loadUrl(url!!)
} else {
@ -1390,8 +1396,9 @@ LogUtil.e("url!!.toUri(). >> ${url!!.toUri().authority}")
@SuppressLint("MissingSuperCall")
override fun onBackPressed() {
LogUtil.e("onBackPressed ${webChromeClient} && ${binding.menus.menuLayout.visibility}")
LogUtil.e("onBackPressed ${webChromeClient} && ${binding.menus.menuLayout.visibility}")
if (webChromeClient is MyWebChromeClient && (webChromeClient as MyWebChromeClient).onBackPressed()) {
return
}
@ -1833,27 +1840,75 @@ LogUtil.e("onBackPressed ${webChromeClient} && ${binding.menus.menuLayout.visibi
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
return File.createTempFile(new_name, if (isVideo) ".mp4" else ".jpg", sd_directory)
}
var hasYoutubePlayer = false
open fun webviewOnPageFinished(){}
inner class MyWebViewClient : WebViewClient() {
override fun shouldInterceptRequest(
view: WebView,
request: WebResourceRequest
): WebResourceResponse? {
// LogUtil.e("shouldInterceptRequest request >>> ${request.url.toString()}")
if (request.url.toString().contains("gif") && request.url.toString().contains("sogirl")) {
var skipResource =
(host != null) && ((request.url?.host?.contains(host!!) ?: true) == false)
if (skipResource && request.url.toString().contains("gif")) {
LogUtil.e("shouldInterceptRequest request block gif resource >>> ${request.url.toString()}")
return WebResourceResponse(
"text/plain", "utf-8",
ByteArrayInputStream("".toByteArray())
)
}
return super.shouldInterceptRequest(view, request)
val url = request.url.toString()
if(!hasYoutubePlayer) {
hasYoutubePlayer = url.toLowerCase(Locale.ROOT)
.contains("https://www.youtube.com/s/player".toLowerCase(Locale.ROOT))
}
if (url.toLowerCase(Locale.ROOT)
.contains("ads".toLowerCase(Locale.ROOT))) {
LogUtil.e("shouldInterceptRequest request url contains ads >>> ${request.url.toString()}")
}
var adblockKeyWords = arrayOf("adcr.naver.com","daumcdn.net/biz/ui/ad/adcm","imgad","ad.daum.net","cr.adsappier.com","ar-adview","adtrafficquality","criteo","adlib.nhnace.com","google.com/ads","googleads.","/pagead","/adpost/","ads/search")
val adblock = adblockKeyWords.filter { url.toLowerCase(Locale.ROOT).contains(it.toLowerCase(Locale.ROOT)) }.size > 0
return if(adblock) {
try {
LogUtil.e("shouldInterceptRequest request block adblockKeyWords resource >>> ${request.url.toString()}")
WebResourceResponse("text/plain", "utf-8", ByteArrayInputStream("".toByteArray()))
} catch (e : Exception) {
super.shouldInterceptRequest(view, url)
}
}else if(url.toLowerCase(Locale.ROOT).contains(".jpg") || url.toLowerCase(Locale.ROOT).contains(".jpeg")){
try {
val bitmap = Glide.with(this@AwesomeWebViewActivity).asBitmap().timeout(30000).diskCacheStrategy(DiskCacheStrategy.ALL).load(url).submit().get()
WebResourceResponse("image/jpg", "UTF-8",getBitmapInputStream(bitmap,Bitmap.CompressFormat.JPEG))
} catch (e : Exception) {
super.shouldInterceptRequest(view, url)
}
}else if(url.toLowerCase(Locale.ROOT).contains(".png")){
try {
val bitmap = Glide.with(this@AwesomeWebViewActivity).asBitmap().timeout(30000).diskCacheStrategy(DiskCacheStrategy.ALL).load(url).submit().get()
WebResourceResponse("image/png", "UTF-8",getBitmapInputStream(bitmap,Bitmap.CompressFormat.PNG))
} catch (e : Exception) {
super.shouldInterceptRequest(view, url)
}
}else if(url.toLowerCase(Locale.ROOT).contains(".webp")){
try {
val bitmap = Glide.with(this@AwesomeWebViewActivity).asBitmap().timeout(30000).diskCacheStrategy(DiskCacheStrategy.ALL).load(url).submit().get()
WebResourceResponse("image/webp", "UTF-8",getBitmapInputStream(bitmap,Bitmap.CompressFormat.WEBP))
} catch (e : Exception) {
super.shouldInterceptRequest(view, url)
}
}else{
super.shouldInterceptRequest(view, url)
}
}
private fun getBitmapInputStream(bitmap: Bitmap, compressFormat: Bitmap.CompressFormat): InputStream {
val byteArrayOutputStream = ByteArrayOutputStream()
bitmap.compress(compressFormat, 80, byteArrayOutputStream)
val bitmapData: ByteArray = byteArrayOutputStream.toByteArray()
return ByteArrayInputStream(bitmapData)
}
// override fun shouldInterceptRequest(view: WebView, url: String): WebResourceResponse? {
// LogUtil.e("shouldInterceptRequest String >>> $url")
// if (url.contains("gif")) {
// return null
// }
// return super.shouldInterceptRequest(view, url)
// }
@ -1862,6 +1917,19 @@ LogUtil.e("onBackPressed ${webChromeClient} && ${binding.menus.menuLayout.visibi
if (!url.contains("docs.google.com") && url.endsWith(".pdf")) {
webView!!.loadUrl("http://docs.google.com/gview?embedded=true&url=$url")
}
url.toUri().host?.let {
val splits = it.replace("http://","").replace("https://","").split(".")
when(splits.size) {
1-> host = splits[0]
2-> host = splits[0]
3-> host = splits[1]
4-> host = splits[2]
else -> {
host = null
}
}
}
hasYoutubePlayer = false
}
override fun onPageFinished(view: WebView, url: String) {
@ -1899,7 +1967,12 @@ LogUtil.e("onBackPressed ${webChromeClient} && ${binding.menus.menuLayout.visibi
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
handler.sendEmptyMessage(MSG_CLICK_ON_URL)
// LogUtil.e("host >>> ${host} , url >>> ${url}")
var skipResource = host!= null && ((url.contains(host!!) ?: true) == false) && (host!!.contains("google") == false)
if (skipResource) {
LogUtil.e("shouldOverrideUrlLoading block url $url , host >>>> $host ")
return true
}
if (url.contains("coupang") == false && url.contains("aliex") == false) {
if (url.endsWith(".mp4")) {
val intent = Intent(Intent.ACTION_VIEW)

View File

@ -10,7 +10,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/finestWhite">
<ImageView
android:id="@+id/dummy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="@+id/webLayout"
android:layout_width="match_parent"