From fd0d61c58403b6554c992c90ca32771a111c2bd1 Mon Sep 17 00:00:00 2001 From: lunaticbum Date: Fri, 22 Aug 2025 17:06:04 +0900 Subject: [PATCH] ... --- .../extensions/my_extension/messaging.js | 12 +++++-- .../launcher/helpers/ForeGroundService.kt | 4 +-- .../bums/lunatic/launcher/home/RssHome.kt | 33 +++++++++++++++---- .../launcher/home/SearchBottomSheet.kt | 13 ++++---- .../lunatic/launcher/home/WebBottomSheet.kt | 10 +++--- .../lunatic/launcher/model/CommunityData.kt | 8 +++-- .../launcher/model/RssDataInterface.kt | 1 + .../lunatic/launcher/workers/BaseGetter.kt | 5 ++- .../main/res/layout/bottom_sheet_search.xml | 14 ++++++++ 9 files changed, 75 insertions(+), 25 deletions(-) diff --git a/app/src/main/assets/extensions/my_extension/messaging.js b/app/src/main/assets/extensions/my_extension/messaging.js index 28045f99..2b267a2c 100644 --- a/app/src/main/assets/extensions/my_extension/messaging.js +++ b/app/src/main/assets/extensions/my_extension/messaging.js @@ -306,15 +306,21 @@ document.addEventListener('DOMContentLoaded', function () { } }) -if(location.href.search("youtube") < 0) { + +const keywords = ["youtube", "mojeek"]; +const url = location.href; +if (keywords.every(keyword => !url.includes(keyword))) { document.addEventListener('touchstart', function(e) { console.log('터치 시작'); }); - document.addEventListener('touchend', function(e) { - autoScrollAndSave() + + setTimeout(() => { + autoScrollAndSave(); + }, 5); }); } + function scrollToLazyImg(fastMode) { (function(autoScrollAndSave){ // 한 번에 이동할 픽셀 diff --git a/app/src/main/kotlin/bums/lunatic/launcher/helpers/ForeGroundService.kt b/app/src/main/kotlin/bums/lunatic/launcher/helpers/ForeGroundService.kt index ed625452..6e1cf360 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/helpers/ForeGroundService.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/helpers/ForeGroundService.kt @@ -186,8 +186,6 @@ class ForeGroundService : Service() { .setSmallIcon(R.drawable.ic_b) .setContentIntent(pendingIntent) .addAction(android.R.drawable.ic_btn_speak_now,"퇴근", makeSendMsgAction(0,"돼지 퇴근했다요~!")) - .addAction(android.R.drawable.ic_btn_speak_now,"버스 탐", makeSendMsgAction(1,"돼지 버스 탔다요~!")) - .addAction(android.R.drawable.ic_btn_speak_now,"버스 내림", makeSendMsgAction(2,"돼지 버스 내린다요~!")) .setOngoing(true) // 사용자가 알림을 스와이프로 지울 수 없게 만듦 .setProgress(max, progress, false) .build()) @@ -205,7 +203,7 @@ class ForeGroundService : Service() { Blog.LOGE("onBind intent >>> ${intent}") return null } - private val CHANNEL_ID = "ble_service_channel" + private val CHANNEL_ID = "bums_service_channel" private val CHANNEL_NAME = "BUM'S 서비스" diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/RssHome.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/RssHome.kt index 90740060..1ca14544 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/home/RssHome.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/home/RssHome.kt @@ -316,10 +316,11 @@ internal class RssHome : Fragment() { override fun onSearch( keyword: String, category: List, + onlyVote : Boolean, addReaded: Boolean, addVoted: Boolean ) { - queryInfos(keywords = keyword.split(" "), category , addReaded, addVoted) + queryInfos(keywords = keyword.split(" "), category ,onlyVote, addReaded, addVoted) } } bottomSheet.show(childFragmentManager, "SearchBottomSheet") @@ -340,11 +341,20 @@ internal class RssHome : Fragment() { privateMode: Boolean ) { when (category) { + + RssDataType.ANYTHING -> { + if (binding.geckoWeb.lastedUrl?.contains("search.brave") == true) { + binding.geckoWeb.sendSearch(keyword) + } else { + binding.geckoWeb.loadUrl("https://search.brave.com/", if (keyword.length ?: 0 > 0) { "search?q=${keyword}" } else { null }) + } + binding.geckoWeb.privateMode = false + } RssDataType.GOOGLE -> { if (binding.geckoWeb.lastedUrl?.contains("www.google") == true) { binding.geckoWeb.sendSearch(keyword) } else { - binding.geckoWeb.loadUrl("https://www.google.com/", if (keyword.length ?: 0 > 0) { "search/?q=${keyword}" } else { null }) + binding.geckoWeb.loadUrl("https://www.google.com/", if (keyword.length ?: 0 > 0) { "search?q=${keyword}" } else { null }) } binding.geckoWeb.privateMode = false } @@ -400,6 +410,7 @@ internal class RssHome : Fragment() { var currentRss : RssData? = null @SuppressLint("SimpleDateFormat") fun openGecko(rssData: RssData? = null) { + Blog.LOGE("rssData >>> ${rssData}") binding.layoutRssSummary.root.visibility = View.GONE if (rssData?.category()?.equals(RssDataType.PRIVATE) == false && rssData?.originPage?.isNotEmpty() == true) { rssData?.let { rss -> @@ -692,7 +703,7 @@ internal class RssHome : Fragment() { Blog.LOGE("updateQuery >>> ${q.description()}") infosJob?.cancel() commandHandler.removeCallbacks(infoUpdate) - mLastedQuery = q.query("hide != $0", true).sort("pubDate ", Sort.DESCENDING).limit(300).distinct("originPage", "title") + mLastedQuery = q.query("hide != $0", true).sort("pubDate ", Sort.DESCENDING).limit(500).distinct("originPage", "title") mRssDataResult = mLastedQuery?.find() mRssDataResult?.asFlow()?.let { flow -> infosJob = CoroutineScope(Dispatchers.IO).launch { @@ -769,13 +780,23 @@ internal class RssHome : Fragment() { fun queryInfos( keywords: List, category: List, + onlyVote : Boolean = false, includeVote : Boolean = false, includeRead : Boolean = false ) { beforeQuery() var rQ = getRealm().query().sort("read", Sort.ASCENDING) - if (!includeRead) { rQ = rQ.query("read == $0", 0)} - if (!includeVote) { rQ = rQ.query("vote != $0", true)} + if (onlyVote) { + rQ = rQ.query("vote == $0", true) + } else { + if (!includeRead) { + rQ = rQ.query("read == $0", 0) + } + if (!includeVote) { + rQ = rQ.query("vote != $0", true) + } + } + category.forEach { rQ = rQ.query("category != $0", it) } @@ -960,7 +981,7 @@ internal class RssHome : Fragment() { imageView.visibility = View.INVISIBLE } } - fun randomOrNull() : RssData? = lasted.filter { it.vote == false && it.read < 2 }.randomOrNull() + fun randomOrNull() : RssData? = lasted.randomOrNull() } var toast: Toast? = null fun Context.toast(string: String) { diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/SearchBottomSheet.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/SearchBottomSheet.kt index 9839cf64..e1dc9b39 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/home/SearchBottomSheet.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/home/SearchBottomSheet.kt @@ -40,22 +40,25 @@ class SearchBottomSheet : BottomSheetDialogFragment() { } interface OnSearchListener { - fun onSearch(keyword: String, category: List, addReaded : Boolean, addVoted: Boolean) + fun onSearch(keyword: String, category: List, onlyVoted : Boolean, addReaded : Boolean, addVoted: Boolean) } var listener: OnSearchListener? = null private val categoryStates = mutableMapOf() + lateinit var onlyVote : CheckBox lateinit var addVote : CheckBox lateinit var addRead : CheckBox lateinit var inputKeyword : EditText override fun onViewCreated(view: View, savedInstanceState: Bundle?) { inputKeyword = view.findViewById(R.id.inputKeyword) val categoryContainer = view.findViewById(R.id.categoryContainer) + onlyVote = view.findViewById(R.id.only_vote) as CheckBox addVote = view.findViewById(R.id.add_vote) as CheckBox addRead = view.findViewById(R.id.add_read) as CheckBox addVote.setOnCheckedChangeListener {v,b->triggerSearchWithDebounce(inputKeyword.text.toString())} addRead.setOnCheckedChangeListener {v,b->triggerSearchWithDebounce(inputKeyword.text.toString())} + onlyVote.setOnCheckedChangeListener {v,b->triggerSearchWithDebounce(inputKeyword.text.toString())} // 카테고리 목록 val categories = RssDataType.getAll() categories.forEach { categoryStates[it.name] = true } @@ -112,10 +115,8 @@ class SearchBottomSheet : BottomSheetDialogFragment() { inputKeyword.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_SEARCH) { val keyword = inputKeyword.text.toString() - if (keyword.isNotEmpty()) { - triggerSearchWithDebounce(keyword) - dismiss() // 필요 시 닫기 - } + triggerSearchWithDebounce(keyword) + dismiss() // 필요 시 닫기 true } else { false @@ -128,7 +129,7 @@ class SearchBottomSheet : BottomSheetDialogFragment() { searchRunnable?.let { debounceHandler.removeCallbacks(it) } searchRunnable = Runnable { val disabledCategories = categoryStates.filter { it.value == false }.keys.toList() - listener?.onSearch(keyword, disabledCategories, addRead.isChecked,addVote.isChecked) + listener?.onSearch(keyword, disabledCategories,onlyVote.isChecked ,addRead.isChecked,addVote.isChecked) } debounceHandler.postDelayed(searchRunnable!!, debounceDelay) } diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/WebBottomSheet.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/WebBottomSheet.kt index 7b07be0c..2bd0737f 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/home/WebBottomSheet.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/home/WebBottomSheet.kt @@ -54,9 +54,11 @@ class WebBottomSheet : BottomSheetDialogFragment() { inputKeyword = view.findViewById(R.id.inputKeyword) val categoryContainer = view.findViewById(R.id.categoryContainer) privateMode = view.findViewById(R.id.check_private) as CheckBox - privateMode.setOnCheckedChangeListener {v,b->triggerSearchWithDebounce(inputKeyword.text.toString())} + privateMode.setOnCheckedChangeListener {v,b-> +// triggerSearchWithDebounce(inputKeyword.text.toString()) + } // 카테고리 목록 - val categories = listOf(RssDataType.GOOGLE, RssDataType.NAVER,RssDataType.NEWS,RssDataType.NEWSFEED,RssDataType.NAMU,RssDataType.PRIVATE) + val categories = listOf(RssDataType.ANYTHING,RssDataType.GOOGLE, RssDataType.NAVER,RssDataType.NEWS,RssDataType.NEWSFEED,RssDataType.NAMU,RssDataType.PRIVATE) // 버튼 동적 생성 categoryContainer.removeAllViews() @@ -80,7 +82,7 @@ class WebBottomSheet : BottomSheetDialogFragment() { setTextColor(Color.WHITE) setBackgroundResource(R.color.tabs_black) setOnClickListener { - triggerSearchWithDebounce(inputKeyword.text.toString()) +// triggerSearchWithDebounce(inputKeyword.text.toString()) } // setOnLongClickListener { // categoryContainer.forEach { (it as? RadioButton)?.let { it.isChecked = false} } @@ -104,7 +106,7 @@ class WebBottomSheet : BottomSheetDialogFragment() { // EditText 입력 실시간 감지 + debounce inputKeyword.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable?) { - triggerSearchWithDebounce(s.toString()) +// triggerSearchWithDebounce(s.toString()) } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} diff --git a/app/src/main/kotlin/bums/lunatic/launcher/model/CommunityData.kt b/app/src/main/kotlin/bums/lunatic/launcher/model/CommunityData.kt index 03f56e18..0df5d71f 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/model/CommunityData.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/model/CommunityData.kt @@ -290,8 +290,12 @@ class RssData : RealmObject, RssDataInterface { } override fun category(): RssDataType { - if (mRssDataType == null) - mRssDataType = RssDataType.valueOf(category!!.uppercase()) + try { + if (mRssDataType == null) + mRssDataType = RssDataType.valueOf(category!!.uppercase()) + } catch (e: Exception) { + mRssDataType = RssDataType.NO_DATA + } return mRssDataType!! } diff --git a/app/src/main/kotlin/bums/lunatic/launcher/model/RssDataInterface.kt b/app/src/main/kotlin/bums/lunatic/launcher/model/RssDataInterface.kt index 5d0a6ce3..8ad80ba2 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/model/RssDataInterface.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/model/RssDataInterface.kt @@ -22,6 +22,7 @@ enum class RssDataType { THEQOO, NAVER, GOOGLE, + ANYTHING, NAMU, ARCA; diff --git a/app/src/main/kotlin/bums/lunatic/launcher/workers/BaseGetter.kt b/app/src/main/kotlin/bums/lunatic/launcher/workers/BaseGetter.kt index d2b9fc7a..8da8e9a9 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/workers/BaseGetter.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/workers/BaseGetter.kt @@ -4,6 +4,8 @@ import android.content.Context import androidx.annotation.CallSuper import androidx.work.Worker import androidx.work.WorkerParameters +import bums.lunatic.launcher.LauncherActivity +import bums.lunatic.launcher.LunaticLauncher import bums.lunatic.launcher.model.RssData import bums.lunatic.launcher.utils.beforeDay import bums.lunatic.launcher.utils.beforeOneDay @@ -33,6 +35,7 @@ open abstract class BaseGetter : Worker { @CallSuper override fun doWork(): Result { + LunaticLauncher.mHourlyLogWriter?.writeLog("${this::class.java.simpleName} doWork()") val currentTime = before10Min() if (lastedUpdateTime > 0L && currentTime > lastedUpdateTime) { return Result.success().apply { @@ -40,7 +43,7 @@ open abstract class BaseGetter : Worker { } } return realWork().apply { - + LunaticLauncher.mHourlyLogWriter?.writeLog("${this@BaseGetter::class.java.simpleName} return realWork() ") } } abstract fun realWork() : Result diff --git a/app/src/main/res/layout/bottom_sheet_search.xml b/app/src/main/res/layout/bottom_sheet_search.xml index d55b3d72..4ef52a72 100644 --- a/app/src/main/res/layout/bottom_sheet_search.xml +++ b/app/src/main/res/layout/bottom_sheet_search.xml @@ -22,6 +22,20 @@ android:singleLine="true" /> + +