From 3fae93db8e28e0048f4bbbbeda0e1a1358a5d8c4 Mon Sep 17 00:00:00 2001 From: lunaticbum <> Date: Thu, 19 Sep 2024 18:08:07 +0900 Subject: [PATCH] ..... --- app/build.gradle.kts | 1 + .../rasel/lunar/launcher/home/LauncherHome.kt | 30 ++++--- .../home/adapters/NotificationItemAdapter.kt | 23 ++---- .../lunar/launcher/model/NotificationItem.kt | 3 + .../lunar/launcher/model/TelegramBotUpdate.kt | 80 +++++++++++++++++++ .../rasel/lunar/launcher/utils/NLService.kt | 32 ++++++-- .../lunar/launcher/utils/SimpleGesture.kt | 5 +- .../launcher/workers/TelegramBotGetter.kt | 79 ++++++++++++++++++ 8 files changed, 219 insertions(+), 34 deletions(-) create mode 100644 app/src/main/kotlin/rasel/lunar/launcher/model/TelegramBotUpdate.kt create mode 100644 app/src/main/kotlin/rasel/lunar/launcher/workers/TelegramBotGetter.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 92cbb3c2..69f1afb8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -91,6 +91,7 @@ dependencies { implementation ("org.apache.commons:commons-text:1.12.0") implementation("com.squareup.okhttp:okhttp:2.7.5") implementation("com.google.android.gms:play-services-location:21.0.1") + implementation("com.google.android.gms:play-services-tasks:18.2.0") // implementation ("androidx.window:window:1.0.0") // implementation("io.github.vaneproject:hanguleditor:1.0.0") } diff --git a/app/src/main/kotlin/rasel/lunar/launcher/home/LauncherHome.kt b/app/src/main/kotlin/rasel/lunar/launcher/home/LauncherHome.kt index faf13e26..e2e6fcef 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/home/LauncherHome.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/home/LauncherHome.kt @@ -50,6 +50,8 @@ import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.work.OneTimeWorkRequest +import androidx.work.WorkManager import io.realm.kotlin.ext.query import io.realm.kotlin.notifications.InitialResults import io.realm.kotlin.notifications.ResultsChange @@ -61,12 +63,14 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import kotlinx.coroutines.launch +import okhttp3.ConnectionPool +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import okhttp3.ResponseBody import org.json.JSONArray import org.json.JSONObject -import rasel.lunar.launcher.LauncherActivity.Companion.CALL_WORK_TAG -import rasel.lunar.launcher.LauncherActivity.Companion.SMS_WORK_TAG import rasel.lunar.launcher.LauncherActivity.Companion.lActivity -import rasel.lunar.launcher.LauncherActivity.Companion.workmanager import rasel.lunar.launcher.R import rasel.lunar.launcher.databinding.LauncherHomeBinding import rasel.lunar.launcher.helpers.Constants.Companion.BOTTOM_SHEET_TAG @@ -96,10 +100,13 @@ import rasel.lunar.launcher.utils.beforeDay import rasel.lunar.launcher.view.TableRadioGroup import rasel.lunar.launcher.workers.RecentCall import rasel.lunar.launcher.workers.RecentSms +import rasel.lunar.launcher.workers.TelegramBotGetter import rasel.lunar.launcher.workers.WorkersDb import java.net.URLEncoder import java.util.Calendar import java.util.Date +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit import java.util.regex.Pattern @@ -270,6 +277,7 @@ internal class LauncherHome : Fragment() { return binding.root } + val hideListViewTime = 1000L * 60 * 5 val hideListView = { binding.notiList.visibility = View.GONE binding.mainList.visibility = View.GONE @@ -287,7 +295,7 @@ internal class LauncherHome : Fragment() { super.onScrollStateChanged(recyclerView, newState) when (newState) { RecyclerView.SCROLL_STATE_IDLE -> { - commandHandler.postDelayed(hideListView, UPDATE_DELAY * 20) + commandHandler.postDelayed(hideListView, hideListViewTime) } RecyclerView.SCROLL_STATE_DRAGGING -> { } @@ -304,6 +312,10 @@ internal class LauncherHome : Fragment() { } private fun queryNotice() { + var mWorkManager = WorkManager.getInstance(requireContext()) + Executors.newSingleThreadScheduledExecutor().schedule({ + mWorkManager.enqueue(OneTimeWorkRequest.from(TelegramBotGetter::class.java)) + }, 5, TimeUnit.SECONDS) try { noticeJob?.cancel() } catch (e:Exception) {e.printStackTrace()} mNotificationResult = null try { @@ -312,7 +324,7 @@ internal class LauncherHome : Fragment() { e.printStackTrace() } - mNotificationResult = WorkersDb.getRealm().query().sort("postTime",Sort.DESCENDING).distinct("pkgName").find() + mNotificationResult = WorkersDb.getRealm().query().sort("postTime",Sort.DESCENDING).find() noticeJob = CoroutineScope(Dispatchers.Default).launch { mNotificationResult?.asFlow()?.collect { changes: ResultsChange -> // BLog.LOGE("changes >>> ${changes}") @@ -323,7 +335,7 @@ internal class LauncherHome : Fragment() { lastedNoti = copyFromRealm(changes.list) } commandHandler.removeCallbacks(notiUpdate) - commandHandler.postDelayed(notiUpdate, UPDATE_DELAY) + commandHandler.postDelayed(notiUpdate, hideListViewTime) } else -> { @@ -362,7 +374,7 @@ internal class LauncherHome : Fragment() { WorkersDb.getRealm().apply { lasted = copyFromRealm(changes.list) } - commandHandler.postDelayed(infoUpdate, UPDATE_DELAY * 3) + commandHandler.postDelayed(infoUpdate, hideListViewTime) } is UpdatedResults -> { // lasted = changes.list @@ -433,7 +445,7 @@ internal class LauncherHome : Fragment() { lasted = copyFromRealm(changes.list) } - commandHandler.postDelayed(infoUpdate, UPDATE_DELAY * 3) + commandHandler.postDelayed(infoUpdate, hideListViewTime) } is UpdatedResults -> { // lasted = changes.list @@ -684,7 +696,7 @@ internal class LauncherHome : Fragment() { binding.notice.text = "알림 센터[${lastedNoti?.size ?: "-"}]" lastedNoti?.let { mNotiAdapter.updateData(it)} } - commandHandler.postDelayed(hideListView, UPDATE_DELAY * 20) + commandHandler.postDelayed(hideListView, hideListViewTime) } override fun onResume() { super.onResume() diff --git a/app/src/main/kotlin/rasel/lunar/launcher/home/adapters/NotificationItemAdapter.kt b/app/src/main/kotlin/rasel/lunar/launcher/home/adapters/NotificationItemAdapter.kt index ebe41fa4..d014d82c 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/home/adapters/NotificationItemAdapter.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/home/adapters/NotificationItemAdapter.kt @@ -62,19 +62,19 @@ internal class NotificationItemAdapter ( holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(120,param.height) val d: Drawable = context.packageManager.getApplicationIcon(appInfo.pkgName!!) holder.view.circlePreview.setImageDrawable(d) - holder.view.title.text = appInfo.tikerMsg - holder.view.desc.text = appInfo.pkgName + holder.view.title.text = appInfo.tikerMsg ?: "${appInfo.selfDisplayName} ${appInfo.subtext}" + holder.view.desc.text = "${appInfo.pkgName} ${appInfo.title}" holder.view.date.text = dateFormat.format(Date(appInfo.postTime)) - holder.view.circlePreview.setOnLongClickListener { WorkersDb.getRealm().writeBlocking { delete(query(NotificationItem::class).query("pkgName == $0",appInfo.pkgName).find()) } + lActivity?.packageManager?.apply { + context.startActivity(getLaunchIntentForPackage(appInfo.pkgName!!)) + } true } - lActivity?.packageManager?.apply { - context.startActivity(getLaunchIntentForPackage(appInfo.pkgName!!)) - } + } catch (e: PackageManager.NameNotFoundException) { return @@ -82,19 +82,8 @@ internal class NotificationItemAdapter ( } - - fun openOpera(schemeString : String) { - val gmmIntentUri = Uri.parse(schemeString) - val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) - mapIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) - mapIntent.setPackage("com.opera.browser") - lActivity?.startActivity(mapIntent) - } - - fun updateData(newList: List) { try { - BLog.LOGE("NotificationItem newList >> ${newList}") DiffUtil.calculateDiff(NotiItemDiffUtil(notiItems, newList)).apply { }.dispatchUpdatesTo(this).apply { diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/NotificationItem.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/NotificationItem.kt index 4de1a38b..e44b9ae9 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/model/NotificationItem.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/NotificationItem.kt @@ -6,6 +6,9 @@ class NotificationItem : RealmObject{ var notiId : Int = 0 var pkgName : String? = null var tikerMsg : String? = null + var title : String? = null + var subtext : String? = null + var selfDisplayName : String? = null var postTime : Long = 0L var uniq_id : String? = null } \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/TelegramBotUpdate.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/TelegramBotUpdate.kt new file mode 100644 index 00000000..ef3613a7 --- /dev/null +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/TelegramBotUpdate.kt @@ -0,0 +1,80 @@ +package rasel.lunar.launcher.model + +import io.realm.kotlin.ext.realmListOf +import io.realm.kotlin.types.RealmList +import io.realm.kotlin.types.RealmObject +import io.realm.kotlin.types.annotations.Ignore +import io.realm.kotlin.types.annotations.PrimaryKey + +class TelegramBotUpdate : RealmObject { + var ok : String? = null + @Ignore + var result : ArrayList = arrayListOf() + var list : RealmList = realmListOf() + fun isOK() = "true".equals(ok) + fun fill() { + list.clear() + list.addAll(result) + list.forEach { + it.fill() + } + } + +} + +class TelegramData : RealmObject{ + fun fill() { + message?.fill() + } + + @PrimaryKey + var update_id : Long = 0L + var message : TelegramMessage? = null +} + +class TelegramMessage : RealmObject{ + fun fill() { + commandEentitie.clear() + commandEentitie.addAll(entities) + } + + @PrimaryKey + var message_id : Long = 0L + var from : TelegramFrom? = null + var chat : TelegramChat? = null + var date : Long = 0L + var text : String? = null + @Ignore + var entities : ArrayList = arrayListOf() + set(n) { + commandEentitie.clear() + commandEentitie.addAll(n) + } + var commandEentitie : RealmList = realmListOf() +} + +class TelegramChat : RealmObject{ + @PrimaryKey + var id :Long = 0L + var language_code : String? = null + var is_bot : String? = null //"id": 7068729507, + var first_name : String? = null //"first_name": "BUM", + var last_name : String? = null //"last_name": "Han", + var type : String? = null //"type": "private" +} + +class BotCommandEentitie : RealmObject{ + var offset : Int = 0 + var length : Int = 0 + var type : String? = null +} + +class TelegramFrom : RealmObject { + @PrimaryKey + var id :Long = 0L + var language_code : String? = null + var is_bot : String? = null //"id": 7068729507, + var first_name : String? = null //"first_name": "BUM", + var last_name : String? = null //"last_name": "Han", + var type : String? = null //"type": "private" +} \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/utils/NLService.kt b/app/src/main/kotlin/rasel/lunar/launcher/utils/NLService.kt index b5b3ebaf..5a2b68af 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/utils/NLService.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/utils/NLService.kt @@ -12,11 +12,17 @@ import android.service.notification.NotificationListenerService import android.service.notification.StatusBarNotification import androidx.annotation.RequiresApi import androidx.core.content.getSystemService +import androidx.work.OneTimeWorkRequest +import androidx.work.WorkManager import com.google.gson.Gson import io.realm.kotlin.ext.query import rasel.lunar.launcher.model.CurrentPlayItem import rasel.lunar.launcher.model.NotificationItem +import rasel.lunar.launcher.workers.AppInfoGetter +import rasel.lunar.launcher.workers.TelegramBotGetter import rasel.lunar.launcher.workers.WorkersDb +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit class NLService : NotificationListenerService() { @@ -41,14 +47,25 @@ class NLService : NotificationListenerService() { override fun onNotificationPosted(sbn: StatusBarNotification) { BLog.LOGE( "NLService********** onNotificationPosted") BLog.LOGE("NLServiceID :" + sbn.id + "\t${sbn.notification.tickerText}\t" + sbn.packageName) - - if (sbn.notification.actions != null && sbn.notification.actions.size > 0 && sbn.id > 0 && (sbn.packageName.contains(".") || sbn.packageName.contains("android")) && sbn.packageName.length > 0) { + sbn.notification.extras.keySet().forEach { + BLog.LOGE( "NLService********** keySet >> ${it} ${sbn.notification.extras.get(it)}") + } + if (sbn.id > 0 && (sbn.packageName.contains(".") || sbn.packageName.contains("android")) && sbn.packageName.length > 0) { NotificationItem().apply { notiId = sbn.id pkgName = sbn.packageName + title = sbn.notification?.extras?.getString("android.title") ?: "" + subtext = sbn.notification?.extras?.getString("android.subText") ?: "" + selfDisplayName = sbn.notification?.extras?.getString("android.selfDisplayName") ?: "" tikerMsg = sbn.notification?.tickerText?.toString() ?: "" postTime = sbn.postTime uniq_id = "${sbn.id}_${sbn.packageName}" + if (true == "bumssavor".equals(title) && "org.telegram.messenger".equals(pkgName)) { + var mWorkManager = WorkManager.getInstance(applicationContext) + Executors.newSingleThreadScheduledExecutor().schedule({ + mWorkManager.enqueue(OneTimeWorkRequest.from(TelegramBotGetter::class.java)) + }, 5, TimeUnit.SECONDS) + } }.apply { if (skips.contains(pkgName)) { @@ -59,11 +76,12 @@ class NLService : NotificationListenerService() { } } - val m = getSystemService()!! - val component = ComponentName(this, NLService::class.java) - val sessions = m.getActiveSessions(component) - BLog.LOGE("Sessions", "count: ${sessions.size}") + if (sbn.packageName.contains("youtube")) { + val m = getSystemService()!! + val component = ComponentName(this, NLService::class.java) + val sessions = m.getActiveSessions(component) + BLog.LOGE("Sessions", "count: ${sessions.size}") sessions.forEach { session -> WorkersDb.getRealm().writeBlocking { if (session.playbackState?.isActive == true) { @@ -123,7 +141,7 @@ class NLService : NotificationListenerService() { try { WorkersDb.getRealm()?.apply { this.writeBlocking { - delete(query().query("pkgName == $0", sbn.packageName).find()) +// delete(query().query("pkgName == $0", sbn.packageName).find()) } } }catch (e : Exception){e.printStackTrace()} diff --git a/app/src/main/kotlin/rasel/lunar/launcher/utils/SimpleGesture.kt b/app/src/main/kotlin/rasel/lunar/launcher/utils/SimpleGesture.kt index d35d9dfd..ff0c0fc8 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/utils/SimpleGesture.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/utils/SimpleGesture.kt @@ -6,6 +6,7 @@ import android.util.Log import android.view.MotionEvent import android.view.View import android.view.View.OnTouchListener +import rasel.lunar.launcher.BuildConfig import kotlin.math.abs import kotlin.math.pow import kotlin.math.sqrt @@ -414,8 +415,10 @@ class GestureAnalyser @JvmOverloads constructor( } } +///https://api.telegram.org/bot7934509464:AAE_xUbICxMdywLGnxo7BkeIqA1nVza4P9w/getUpdates + class SimpleFingerGestures : OnTouchListener { - private var debug = true + private var debug = BuildConfig.DEBUG var consumeTouchEvents: Boolean = false var screenHeight : Int = 100 protected var tracking: BooleanArray = booleanArrayOf(false, false, false, false, false) diff --git a/app/src/main/kotlin/rasel/lunar/launcher/workers/TelegramBotGetter.kt b/app/src/main/kotlin/rasel/lunar/launcher/workers/TelegramBotGetter.kt new file mode 100644 index 00000000..01880069 --- /dev/null +++ b/app/src/main/kotlin/rasel/lunar/launcher/workers/TelegramBotGetter.kt @@ -0,0 +1,79 @@ +package rasel.lunar.launcher.workers + +import android.annotation.SuppressLint +import android.content.Context +import androidx.work.WorkerParameters +import com.google.gson.Gson +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import okhttp3.ConnectionPool +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import okhttp3.ResponseBody +import org.jsoup.Jsoup +import rasel.lunar.launcher.model.Clien +import rasel.lunar.launcher.model.TelegramBotUpdate +import rasel.lunar.launcher.model.getHref +import rasel.lunar.launcher.model.getRssData +import rasel.lunar.launcher.model.getT +import rasel.lunar.launcher.utils.BLog +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit + +class TelegramBotGetter : BaseGetter { + companion object { + val TAG = "TelegramBotGetter" + } + constructor(context: Context, workerParams: WorkerParameters) : super(context, workerParams) { + } + + + @SuppressLint("RestrictedApi") + override fun realWork(): Result { + + try { + + try { + val url = "https://api.telegram.org/bot7934509464:AAE_xUbICxMdywLGnxo7BkeIqA1nVza4P9w/getUpdates" + //"https://api.telegram.org/bot7934509464:AAE_xUbICxMdywLGnxo7BkeIqA1nVza4P9w/sendMessage?chat_id=71476436&text=안녕하세요." + //7068729507 + // OkHttp 클라이언트 객체 생성 + val client = OkHttpClient.Builder().connectionPool(ConnectionPool(5,60,TimeUnit.SECONDS)).build() + + // GET 요청 객체 생성 + val builder: Request.Builder = Request.Builder().url(url).addHeader("Content-Type", "application/json").get() + + val request: Request = builder.build() + + BLog.LOGE("telegram before request ") + // OkHttp 클라이언트로 GET 요청 객체 전송 + val response: Response = client.newCall(request).execute() + if (response.isSuccessful()) { + // 응답 받아서 처리 + val body: ResponseBody? = response.body() + if (body != null) { + Gson().fromJson(body.string(),TelegramBotUpdate::class.java)?.let { telegramUpdates -> + telegramUpdates.fill() + telegramUpdates.list.forEach { + if (it.message?.text?.startsWith("/") == true) { + BLog.LOGE("telegram telegramUpdates >>>> ${Gson().toJson(it)}") + } + } +// BLog.LOGE("telegram telegramUpdates >>>> ${Gson().toJson(telegramUpdates)}") +// WorkersDb.getRealm().writeBlocking { +// copyToRealm(telegramUpdates) +// } + } + } + } else BLog.LOGE("telegram Error Occurred") + + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + } catch (e:Exception){e.printStackTrace()} + return Result.success().apply { + + } + } +} \ No newline at end of file