From 7b9dab089190d884a544ab67d4a347c27f8da46e Mon Sep 17 00:00:00 2001 From: lunaticbum <> Date: Wed, 11 Sep 2024 18:09:16 +0900 Subject: [PATCH] ... --- app/build.gradle.kts | 2 + .../rasel/lunar/launcher/LauncherActivity.kt | 136 +++++-- .../rasel/lunar/launcher/apps/AppDrawer.kt | 378 ++++++++++-------- .../rasel/lunar/launcher/apps/AppMenu.kt | 1 - .../rasel/lunar/launcher/apps/AppsAdapter.kt | 38 +- .../lunar/launcher/apps/ContactAdapter.kt | 48 ++- .../rasel/lunar/launcher/feeds/Feeds.kt | 4 + .../rasel/lunar/launcher/home/LauncherHome.kt | 60 ++- .../rasel/lunar/launcher/model/AppInfo.kt | 19 + .../lunar/launcher/model/CommunityData.kt | 15 +- .../rasel/lunar/launcher/model/Reddit.kt | 5 +- .../lunar/launcher/model/RssDataInterface.kt | 2 +- .../rasel/lunar/launcher/model/RssItem.kt | 10 +- .../rasel/lunar/launcher/model/RssTagItem.kt | 5 + .../rasel/lunar/launcher/model/YoutubeData.kt | 4 + .../lunar/launcher/todos/RssFeedsParser.kt | 4 + .../lunar/launcher/todos/RssItemAdapter.kt | 2 +- .../rasel/lunar/launcher/todos/YoutubeData.kt | 5 + .../launcher/utils/AlphabetToChosungMap.kt | 45 +++ .../rasel/lunar/launcher/utils/EnToKo.kt | 238 +++++++++++ .../rasel/lunar/launcher/utils/JamoUtils.kt | 3 +- .../lunar/launcher/workers/AppInfoGetter.kt | 63 +++ .../lunar/launcher/workers/ClienGetter.kt | 12 +- .../launcher/workers/ContactInfoGetter.kt | 61 +++ .../launcher/workers/RecentCallGetter.kt | 65 ++- .../rasel/lunar/launcher/workers/WorkersDb.kt | 41 +- 26 files changed, 1000 insertions(+), 266 deletions(-) create mode 100644 app/src/main/kotlin/rasel/lunar/launcher/model/AppInfo.kt create mode 100644 app/src/main/kotlin/rasel/lunar/launcher/utils/AlphabetToChosungMap.kt create mode 100644 app/src/main/kotlin/rasel/lunar/launcher/utils/EnToKo.kt create mode 100644 app/src/main/kotlin/rasel/lunar/launcher/workers/AppInfoGetter.kt create mode 100644 app/src/main/kotlin/rasel/lunar/launcher/workers/ContactInfoGetter.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 18631b4d..21249d01 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -90,4 +90,6 @@ dependencies { implementation ("org.jsoup:jsoup:1.18.1") implementation ("org.apache.commons:commons-text:1.12.0") implementation("com.squareup.okhttp:okhttp:2.7.5") +// 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/LauncherActivity.kt b/app/src/main/kotlin/rasel/lunar/launcher/LauncherActivity.kt index 98e0a54c..3d0272d2 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/LauncherActivity.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/LauncherActivity.kt @@ -20,6 +20,7 @@ package rasel.lunar.launcher //import rasel.lunar.launcher.home.LauncherHome.Companion.rssSet import android.Manifest +import android.annotation.SuppressLint import android.app.NotificationManager import android.appwidget.AppWidgetManager import android.content.BroadcastReceiver @@ -37,12 +38,15 @@ import android.os.Build import android.os.Bundle import android.os.Environment import android.os.Environment.isExternalStorageManager +import android.os.Handler +import android.os.Looper import android.print.PDFPrint import android.provider.Settings import android.telephony.TelephonyManager import android.view.View import android.view.WindowInsets import android.view.WindowManager + import android.webkit.JavascriptInterface import android.webkit.SslErrorHandler import android.webkit.WebResourceError @@ -63,8 +67,12 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 +import androidx.window.layout.FoldingFeature +import androidx.window.layout.WindowLayoutInfo import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkManager @@ -96,12 +104,15 @@ import rasel.lunar.launcher.model.RssTagItem import rasel.lunar.launcher.model.getRssData import rasel.lunar.launcher.model.getT import rasel.lunar.launcher.utils.BLog +import rasel.lunar.launcher.utils.JamoUtils import rasel.lunar.launcher.utils.NLService import rasel.lunar.launcher.utils.RssList.jGuruMain import rasel.lunar.launcher.utils.beforeDay import rasel.lunar.launcher.utils.make0H +import rasel.lunar.launcher.workers.AppInfoGetter import rasel.lunar.launcher.workers.ArcaGetter import rasel.lunar.launcher.workers.ClienGetter +import rasel.lunar.launcher.workers.ContactInfoGetter import rasel.lunar.launcher.workers.DCGetter import rasel.lunar.launcher.workers.DotaxGetter import rasel.lunar.launcher.workers.FmKoreaGetter @@ -160,16 +171,37 @@ internal class LauncherActivity : AppCompatActivity() { }, 1, TimeUnit.SECONDS) } fun refreshCalls() { + var delay = 1L Executors.newSingleThreadScheduledExecutor().schedule({ - mWorkManager?.cancelAllWorkByTag(CALL_WORK_TAG) + mWorkManager?.cancelAllWorkByTag(ContactInfoGetter.TAG) mWorkManager?.enqueueUniquePeriodicWork( - CALL_WORK_TAG, + ContactInfoGetter.TAG, ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, + PeriodicWorkRequestBuilder(12, TimeUnit.HOURS) + .addTag(ContactInfoGetter.TAG) + .build()) + }, delay, TimeUnit.SECONDS) + delay = delay + 3L + Executors.newSingleThreadScheduledExecutor().schedule({ + mWorkManager?.cancelAllWorkByTag(AppInfoGetter.TAG) + mWorkManager?.enqueueUniquePeriodicWork( + AppInfoGetter.TAG, ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, + PeriodicWorkRequestBuilder(12, TimeUnit.HOURS) + .addTag(AppInfoGetter.TAG) + .build()) + }, delay, TimeUnit.SECONDS) + + delay = delay + 3L + Executors.newSingleThreadScheduledExecutor().schedule({ + mWorkManager?.cancelAllWorkByTag(RecentCallGetter.TAG) + mWorkManager?.enqueueUniquePeriodicWork( + RecentCallGetter.TAG, ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, PeriodicWorkRequestBuilder(longTimePeriod, TimeUnit.MINUTES) - .addTag(CALL_WORK_TAG) + .addTag(RecentCallGetter.TAG) .build()) - }, 1, TimeUnit.SECONDS) + }, delay, TimeUnit.SECONDS) } + fun refreshFeeds() { var delay = 5L Executors.newSingleThreadScheduledExecutor().schedule({ @@ -300,11 +332,13 @@ internal class LauncherActivity : AppCompatActivity() { // } } + @SuppressLint("NewApi") override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() mWorkManager = WorkManager.getInstance(this) DynamicColors.applyToActivityIfAvailable(this) + settingsPrefs = getSharedPreferences(PREFS_SETTINGS, 0) AppCompatDelegate.setDefaultNightMode(settingsPrefs.getInt(KEY_APPLICATION_THEME, MODE_NIGHT_FOLLOW_SYSTEM)) @@ -325,28 +359,7 @@ internal class LauncherActivity : AppCompatActivity() { /* handle navigation back events */ handleBackPress() - refreshSms() - refreshCalls() - refreshFeeds() - } - - override fun onDestroy() { - super.onDestroy() - appWidgetHost?.stopListening() - } - - override fun onStart() { - super.onStart() - BLog.LOGE("LauncherActivity onStart()") - statusBarView() - setBgColor() - } - - @RequiresApi(Build.VERSION_CODES.O_MR1) - override fun onResume() { - super.onResume() - BLog.LOGE("LauncherActivity onResume") val cn: ComponentName = ComponentName(this, NLService::class.java) val n = applicationContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager if (n.isNotificationListenerAccessGranted(cn)) { @@ -368,6 +381,25 @@ internal class LauncherActivity : AppCompatActivity() { } } } + + } + + override fun onDestroy() { + super.onDestroy() + appWidgetHost?.stopListening() + } + + override fun onStart() { + super.onStart() + BLog.LOGE("LauncherActivity onStart()") + statusBarView() + setBgColor() + } + + @RequiresApi(Build.VERSION_CODES.O_MR1) + override fun onResume() { + super.onResume() + BLog.LOGE("LauncherActivity onResume") } private fun welcomeDialog() { @@ -397,6 +429,12 @@ internal class LauncherActivity : AppCompatActivity() { }.show() } } + + if (!needAsk) { + refreshSms() + refreshCalls() + refreshFeeds() + } } /* ask for the permissions */ @@ -728,6 +766,18 @@ internal class LauncherActivity : AppCompatActivity() { } } + } else if(url?.contains("translate.google.com") == true) { + binding.searcher01.postDelayed({ + binding.searcher01.evaluateJavascript( + "function getAll() {\n" + + " MyJavaScriptInterface.sendValueFromHtml(document.getElementsByTagName('html')[0].innerHTML)" + + " };getAll()" + ) { result -> + (result as? String)?.let { + + } + } + }, 6000L) } else { //if (url?.contains("guru", true) == true) view?.evaluateJavascript( @@ -939,6 +989,29 @@ internal class LauncherActivity : AppCompatActivity() { "date >>>>> ${date}" + "") } + } else if(lastedFinishedPageUrl?.contains("https://translate.google.com") == true){ + callBackHandler.removeCallbacks(postNext) + val doc: Document = Jsoup.parse(result) + doc.getElementsByTag("span").forEach { span -> +// BLog.LOGE("on getHangule ${span.text()}") + if(span.hasAttr("jsaction") && + span.attr("jsaction").contains("mouseout") && + span.attr("jsaction").contains("contextmenu") && + span.attr("jsaction").contains("click") && + span.attr("jsaction").contains("mouseover") + ) { + BLog.LOGE("on getHangule $span") + val resultString = span.text() + if (resultString != null && resultString.length > 0) { + callBackHandler.removeCallbacks(postNext) + callBack?.onConsoleLog("result::${span.text()}") + callBack = null + } + } + }.apply { + callBackHandler.removeCallbacks(postNext) + callBackHandler.postDelayed(postNext,25000L) + } } else { val doc: Document = Jsoup.parse(result) callBack?.onConsoleLog("lastedFinishedPageUrl >>> ${doc}") @@ -947,8 +1020,17 @@ internal class LauncherActivity : AppCompatActivity() { } } + var postNext : Runnable = Runnable{ + callBack?.collectComplete() + } + + val callBackHandler = Handler(Looper.getMainLooper()) + } + + + class MissD : RssDataInterface { var link : String? = null @@ -981,6 +1063,10 @@ class MissD : RssDataInterface { override fun category(): RssDataType { return RssDataType.GURU } + + override fun getCho(): String? { + return JamoUtils.split(title!!).joinToString("") + } } fun beforeDay(date: Date): Long { val cal: Calendar = Calendar.getInstance() diff --git a/app/src/main/kotlin/rasel/lunar/launcher/apps/AppDrawer.kt b/app/src/main/kotlin/rasel/lunar/launcher/apps/AppDrawer.kt index 09a6059d..693bbae7 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/apps/AppDrawer.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/apps/AppDrawer.kt @@ -33,7 +33,6 @@ import android.os.Looper import android.provider.ContactsContract import android.util.Log import android.view.KeyEvent -import android.view.KeyEvent.ACTION_UP import android.view.LayoutInflater import android.view.View import android.view.View.GONE @@ -44,18 +43,36 @@ import androidx.appcompat.app.AlertDialog import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.recyclerview.widget.GridLayoutManager -import kotlinx.coroutines.GlobalScope +import io.realm.kotlin.ext.query +import io.realm.kotlin.notifications.InitialResults +import io.realm.kotlin.notifications.ResultsChange +import io.realm.kotlin.notifications.UpdatedResults +import io.realm.kotlin.query.RealmResults +import io.realm.kotlin.query.Sort +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job import kotlinx.coroutines.launch +import org.jsoup.Jsoup import rasel.lunar.launcher.BuildConfig +import rasel.lunar.launcher.CommadCallabck +import rasel.lunar.launcher.LauncherActivity import rasel.lunar.launcher.LauncherActivity.Companion.lActivity import rasel.lunar.launcher.databinding.AppDrawerBinding import rasel.lunar.launcher.helpers.Constants.Companion.KEY_APPS_COUNT import rasel.lunar.launcher.helpers.Constants.Companion.KEY_APPS_LAYOUT import rasel.lunar.launcher.helpers.Constants.Companion.PREFS_APP_NAMES import rasel.lunar.launcher.helpers.Constants.Companion.PREFS_SETTINGS +import rasel.lunar.launcher.model.AppInfo +import rasel.lunar.launcher.model.RssData +import rasel.lunar.launcher.utils.AlphabetToChosungMap import rasel.lunar.launcher.utils.BLog +import rasel.lunar.launcher.utils.JamoUtils +import rasel.lunar.launcher.workers.WorkersDb import java.net.URLEncoder import java.text.Normalizer +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit import java.util.regex.Pattern @@ -63,36 +80,25 @@ internal class AppDrawer : Fragment() { private lateinit var binding: AppDrawerBinding private var layoutType: Int = 0 -// private var isSearchShown: Boolean = false + // private var isSearchShown: Boolean = false private var isKeyboardShowing: Boolean = false companion object { private var packageManager: PackageManager? = null private var appsAdapter: AppsAdapter? = null private var contactAdapter : ContactAdapter? = null - private var packageInfoList: MutableList = mutableListOf() - private var packageList = mutableListOf() - var oringinPackageList = mutableListOf() - val originContactList = arrayListOf() - // private val numberPattern = Pattern.compile("[0-9]") -// private val alphabetPattern = Pattern.compile("[A-Z]") + private var packageList = mutableListOf() @JvmStatic var settingsPrefs: SharedPreferences? = null @JvmStatic var appNamesPrefs: SharedPreferences? = null - private fun appName(resolver: ResolveInfo): String { - if(appNamesPrefs?.contains(resolver.activityInfo.packageName) != null && appNamesPrefs?.getString(resolver.activityInfo.packageName,"")?.length ?: 0 > 0) { - BLog.LOGE("it.activityInfo.packageName >>>> ${resolver.activityInfo.packageName} == name : ${appNamesPrefs?.getString(resolver.activityInfo.packageName,"") ?: ""}") - return appNamesPrefs?.getString(resolver.activityInfo.packageName,"") ?: "" - } else { - return resolver.loadLabel(packageManager).toString().apply { - appNamesPrefs?.edit()?.putString(resolver.activityInfo.packageName, this)?.apply() - } + fun appName(resolver: ResolveInfo): String { + return resolver.loadLabel(packageManager).toString().apply { + appNamesPrefs?.edit()?.putString(resolver.activityInfo.packageName, this)?.apply() } - } - private fun getCategory(category : Int) : String { + fun getCategory(category : Int) : String { return when(category) { ApplicationInfo.CATEGORY_UNDEFINED -> "UNDEFINED" ApplicationInfo.CATEGORY_GAME -> "GAME" @@ -192,53 +198,8 @@ internal class AppDrawer : Fragment() { } } - + val appNames = hashSetOf() val contactList = arrayListOf() - private fun GetContact() { - if (originContactList.size > 0) { - contactList.clear() - for (item in originContactList) { - contactList.add(item) - } - } else { - contactList.clear() - originContactList.clear() - val resolver = lActivity!!.contentResolver - - val phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI - val projection = arrayOf( - ContactsContract.CommonDataKinds.Phone.CONTACT_ID, - ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, - ContactsContract.CommonDataKinds.Phone.NUMBER, - ) - - try { - val cursor = resolver.query(phoneUri, projection, null, null, null) - if (cursor != null) { - while (cursor.moveToNext()) { - val idx =cursor.getColumnIndex(projection[0]) - val nameIndex = cursor.getColumnIndex(projection[1]) - val numberIndex = cursor.getColumnIndex(projection[2]) - var contactId = cursor.getString(idx) - val name = cursor.getString(nameIndex) - var number = cursor.getString(numberIndex) - number = number.replace("-", "") - if (name?.length ?: 0 > 0 && number?.length ?: 0 > 0) { - contactList.add(SimpleContact(contactId,name, number)) - originContactList.add(SimpleContact(contactId,name, number)) - } - Log.d("GetContact", "이름 : $name 번호 : $number ") - } - } - // 데이터 계열은 반드시 닫아줘야 한다. - cursor?.close() - } catch ( e : Exception) { - e.printStackTrace() - } - } - } - - fun openSearchApps(schemeString : String, pakage : String? = null) { val gmmIntentUri = Uri.parse(schemeString) @@ -281,7 +242,7 @@ internal class AppDrawer : Fragment() { dialog?.setMessage("${keyword} 검색 결과 '${packageList[0].appName}' 준비됨") dialog?.setPositiveButton("실행") { s, d -> runonUi { - startActivity(packageManager?.getLaunchIntentForPackage(packageList[0].packageName)) + startActivity(packageManager?.getLaunchIntentForPackage(packageList[0].pkgName!!)) s.dismiss() } } @@ -289,14 +250,14 @@ internal class AppDrawer : Fragment() { dialog?.setMessage("${keyword} 검색 결과 '${filted[0].appName}' 준비됨") dialog?.setPositiveButton("${filted[0].appName} 실행") { s, d -> runonUi { - startActivity(packageManager?.getLaunchIntentForPackage(filted[0].packageName)) + startActivity(packageManager?.getLaunchIntentForPackage(filted[0].pkgName!!)) s.dismiss() } } if(filted.size > 1) { dialog?.setNeutralButton("${filted[1].appName} 실행") { s, d -> runonUi { - startActivity(packageManager?.getLaunchIntentForPackage(filted[1].packageName)) + startActivity(packageManager?.getLaunchIntentForPackage(filted[1].pkgName!!)) s.dismiss() } } @@ -366,23 +327,10 @@ internal class AppDrawer : Fragment() { super.onResume() BLog.LOGE("onResume") fetchApps() - GetContact() binding.appsCount.visibility = if (settingsPrefs!!.getBoolean(KEY_APPS_COUNT, true)) VISIBLE else GONE -// if (settingsPrefs!!.getInt(KEY_APPS_LAYOUT, 0) in 0..1) { -// appsAdapter?.updateGravity(settingsPrefs!!.getInt(KEY_DRAW_ALIGN, Gravity.CENTER)) -// } - - -// openSearch() -// setKeyboardPadding() - contactList.sortBy { it.name } - contactAdapter?.updateData(contactList) - - /* pop up the keyboard */ openSearch() - registCancelSearch() BLog.LOGE("onResume after chechHandler.postDelayed(cancelSearch, 3000L)") } @@ -420,35 +368,142 @@ internal class AppDrawer : Fragment() { binding.appsList.adapter = appsAdapter binding.contactList.adapter = contactAdapter } + var appQuery : RealmResults? = null + fun fetchApps(keyword : String? = null) { + WorkersDb.getRealm().apply { + var newQ = query() + if (keyword != null && keyword.length > 0) { + if (JamoUtils.CHOSUNG.contains(keyword.split("")[0])) { + newQ = newQ.query("appName CONTAINS $0 OR appNameChosung CONTAINS $0 OR koreanName CONTAINS $0 OR alphaCho CONTAINS $0 OR category CONTAINS $0", keyword) + } else if(Pattern.matches("^[가-힣]*\$", keyword)){ + newQ = newQ.query("appName CONTAINS $0 OR koreanName CONTAINS $0 OR category CONTAINS $0", keyword) + }else { + keyword.split("").forEach { + if (it.length > 0) { + newQ = newQ.query( + "appName CONTAINS $0 OR category CONTAINS $0 OR pkgName CONTAINS $0 OR appName CONTAINS $1 OR category CONTAINS $1 OR pkgName CONTAINS $1", + keyword.lowercase(), + keyword.uppercase() + ) + } + } + } + } + appQuery = newQ.sort(Pair("clickCount", Sort.DESCENDING),Pair("lastUseDate",Sort.DESCENDING)).limit(20).find() + appQuery?.let { + if(it.size > 0) { + WorkersDb.getRealm().apply { + packageList.clear() + packageList.addAll(copyFromRealm(it)) + BLog.LOGE("packageList >>> ${packageList.size}") + binding.appsList.post { if (packageList.size > 0) { + appsAdapter?.updateData(packageList) + } } +// val clo = packageList.clone() +// appNames.clear() +// appNames.addAll(packageList.filter { it.koreanName?.trim()?.length ?: 0 < 1 }) +// getHangule() + } + } + } + } + fetcContact(keyword) + } - /* update app list with app and package name */ - fun fetchApps() { - packageList.clear() - oringinPackageList.clear() - try { - packageInfoList = (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - packageManager?.queryIntentActivities( - Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER), - PackageManager.ResolveInfoFlags.of(0) - ) - } else { - (packageManager?.queryIntentActivities( - Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER), 0 - )) - })?.apply { - removeIf { it.activityInfo.packageName.equals(BuildConfig.APPLICATION_ID) } - forEach { oringinPackageList.add(Packages(it.activityInfo.packageName, normalize(appName(it)), getCategory(it.activityInfo.applicationInfo.category))) } - oringinPackageList.sortBy { it.appName } - packageList.addAll( - oringinPackageList - ) - binding.appsList.post { if (packageList.size > 0) { - appsAdapter?.updateData(packageList) - } } - }!! + var contactQuery : RealmResults? = null + fun fetcContact(keyword : String? = null) { + WorkersDb.getRealm().apply { + var newQ = query() + if (keyword != null && keyword.length > 0) { + if(Pattern.matches("^[0-9]*\$", keyword)){ + keyword.split("").forEach { + if (it.length > 0) newQ = newQ.query("phoneNumber CONTAINS $0", keyword) + } + } else { + newQ = newQ.query( + "name CONTAINS $0 OR chosung CONTAINS $0", + keyword + ) + } + } - } catch (e : Exception) {e.printStackTrace()} + contactQuery = newQ.sort(Pair("touchCount", Sort.DESCENDING),Pair("lastedTouchDateTime",Sort.DESCENDING)).find() + contactQuery?.let { + if (it.size > 0) + WorkersDb.getRealm().apply { + contactList.clear() + contactList.addAll(copyFromRealm(it).toList()) + BLog.LOGE("packageList >>> ${contactList.size}") + binding.contactList.post { if (contactList.size > 0) { + contactAdapter?.updateData(contactList) + } } + } + } + + } + } + + fun getHangule() { + BLog.LOGE("on getHangule") + Executors.newSingleThreadScheduledExecutor().schedule({ + if (appNames.size > 0) { + val info = appNames.first() + appNames.remove(info) + if (info.koreanName?.length ?: 0 > 0 || info.appNameChosung?.length ?: 0 > 0) { + getHangule() + } else { + BLog.LOGE("on getHangule ${info.appName}") + if (Pattern.matches("^[a-zA-Z]*$", info.appName)) { +// Jsoup.connect("https://translate.google.com/?hl=ko&sl=en&tl=ko&text=${info.appName}&op=translate").get().let { trans -> +// BLog.LOGE("on getHangule ${trans.title()}") +// trans.getElementsByTag("span").forEach { +// BLog.LOGE("on getHangule ${it.text()}") +// if(it.hasAttr("jsaction") && +// it.attr("jsaction").contains("mouseout") && +// it.attr("jsaction").contains("contextmenu") && +// it.attr("jsaction").contains("mouseover") +// ) { +// BLog.LOGE("on getHangule $it") +// } +// } +// +// }.apply { +// getHangule() +// } + Handler(Looper.getMainLooper()).post { + LauncherActivity.Companion.lActivity?.doWebParseStart( + "https://translate.google.com/?hl=ko&sl=en&tl=ko&text=${info.appName}&op=translate", + object : CommadCallabck { + override fun onConsoleLog(log: String) { + if (log.contains("result::")) { + val appHangulName = log.split("result::")[1] + if(appHangulName?.length ?: 0 > 0) { + info.appNameChosung = JamoUtils.split(appHangulName).joinToString("") + info.koreanName = appHangulName + BLog.LOGE("appHangulName >>> $appHangulName") + BLog.LOGE("appHangulName >>> ${info.appNameChosung}") + WorkersDb.update(info) + getHangule() + } + } + } + + override fun collectComplete() { + getHangule() + } + }) + } + } else { + info.appNameChosung = JamoUtils.split(info.appName).joinToString("") + info.koreanName = info.appName + WorkersDb.update(info) + getHangule() + BLog.LOGE("on getHangule to next") + } + } + } + },5,TimeUnit.SECONDS) } private fun getAlphabetItems() { @@ -480,73 +535,52 @@ internal class AppDrawer : Fragment() { var lastSearchString : String = "" private fun filterAppsList(searchString: String) { /* check each app name and add if it matches the search string */ - if (searchString.length > 0 && (lastSearchStringLength != searchString.length || lastSearchString.equals(searchString) == false)) { - BLog.LOGE("START FILTER") - packageList.clear() - for (pkg in oringinPackageList) { - if (pkg.appName.contains(searchString,true) || pkg.category.contains(searchString,true) || pkg.packageName.contains(searchString,true)) { - BLog.LOGE("pkg >>> ${pkg.category} , ${pkg.appName}") - packageList.add(pkg) - } - } - packageList.sortBy { it.appName } - BLog.LOGE("MIDDLE FILTER") - - appsAdapter?.updateData(packageList) - - contactList.clear() - for (item in originContactList) { - if (item.name.contains(searchString) || item.phoneNumber.contains(searchString)) { - contactList.add(item) - } - } - contactList.sortBy { it.name } - contactAdapter?.updateData(contactList) - BLog.LOGE("END FILTER") - - - } else if(lastSearchStringLength == 0){ - contactList.clear() - for (item in originContactList) { - contactList.add(item) - } - packageList.clear() - for (resolver in oringinPackageList) { - packageList.add(resolver) - } - appsAdapter?.updateData(packageList) - contactAdapter?.updateData(contactList) - } else { - afterClearSearch() - - } + fetchApps(searchString) +// if (searchString.length > 0 && (lastSearchStringLength != searchString.length || lastSearchString.equals(searchString) == false)) { +// BLog.LOGE("START FILTER") +// packageList.clear() +// for (pkg in oringinPackageList) { +// if (pkg.appName!!.contains(searchString,true) || pkg.category!!.contains(searchString,true) || pkg.pkgName!!.contains(searchString,true)) { +// BLog.LOGE("pkg >>> ${pkg.category} , ${pkg.appName}") +// packageList.add(pkg) +// } +// } +// packageList.sortBy { it.appName } +// BLog.LOGE("MIDDLE FILTER") +// +// appsAdapter?.updateData(packageList) +// +// contactList.clear() +// for (item in originContactList) { +// if (item.name!!.contains(searchString) || item.phoneNumber!!.contains(searchString)) { +// contactList.add(item) +// } +// } +// contactList.sortBy { it.name } +// contactAdapter?.updateData(contactList) +// BLog.LOGE("END FILTER") +// +// +// } else if(lastSearchStringLength == 0){ +// contactList.clear() +// for (item in originContactList) { +// contactList.add(item) +// } +// packageList.clear() +// for (resolver in oringinPackageList) { +// packageList.add(resolver) +// } +// appsAdapter?.updateData(packageList) +// contactAdapter?.updateData(contactList) +// } else { +// afterClearSearch() +// +// } lastSearchString = searchString lastSearchStringLength = searchString.length registCancelSearch() } - private fun afterClearSearch() { - contactList.clear() - packageList.clear() - for (item in originContactList) { - contactList.add(item) - } - for (resolver in oringinPackageList) { - packageList.add(resolver) - } - packageList.sortBy { it.appName } - contactList.sortBy { it.name } - appsAdapter?.updateData(packageList) - contactAdapter?.updateData(contactList) - } - - private fun normalize(str: String): String { - val normalizedString = - Normalizer.normalize(str.replace("\\W".toRegex(), ""), Normalizer.Form.NFC) - val pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+") - return pattern.matcher(normalizedString).replaceAll("").toLowerCase() - } - private fun openSearch() { binding.searchInput.apply { visibility = VISIBLE @@ -594,3 +628,9 @@ internal class AppDrawer : Fragment() { } +fun normalize(str: String): String { + val normalizedString = + Normalizer.normalize(str.replace("\\W".toRegex(), ""), Normalizer.Form.NFC) + val pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+") + return pattern.matcher(normalizedString).replaceAll("").toLowerCase() +} \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/apps/AppMenu.kt b/app/src/main/kotlin/rasel/lunar/launcher/apps/AppMenu.kt index b08bbe58..f201005a 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/apps/AppMenu.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/apps/AppMenu.kt @@ -53,7 +53,6 @@ import com.google.gson.Gson import rasel.lunar.launcher.LauncherActivity.Companion.lActivity import rasel.lunar.launcher.R import rasel.lunar.launcher.apps.AppDrawer.Companion.appNamesPrefs -import rasel.lunar.launcher.apps.AppDrawer.Companion.oringinPackageList import rasel.lunar.launcher.databinding.ActivityBrowserDialogBinding import rasel.lunar.launcher.databinding.AppInfoDialogBinding import rasel.lunar.launcher.databinding.AppMenuBinding diff --git a/app/src/main/kotlin/rasel/lunar/launcher/apps/AppsAdapter.kt b/app/src/main/kotlin/rasel/lunar/launcher/apps/AppsAdapter.kt index 4cb1fd95..cc57b4c4 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/apps/AppsAdapter.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/apps/AppsAdapter.kt @@ -18,7 +18,6 @@ package rasel.lunar.launcher.apps -import android.annotation.SuppressLint import android.content.pm.PackageManager import android.util.TypedValue import android.view.Gravity @@ -26,18 +25,23 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView -import androidx.core.view.updatePadding import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.textview.MaterialTextView +import io.realm.kotlin.ext.query import kotlinx.coroutines.MainScope import kotlinx.coroutines.async import rasel.lunar.launcher.LauncherActivity.Companion.lActivity import rasel.lunar.launcher.R import rasel.lunar.launcher.apps.IconPackManager.Companion.getDrawableIconForPackage import rasel.lunar.launcher.databinding.AppsChildBinding -import rasel.lunar.launcher.helpers.UniUtils.Companion.dpToPx +import rasel.lunar.launcher.model.AppInfo +import rasel.lunar.launcher.utils.BLog +import rasel.lunar.launcher.utils.EnToKo.engToKor +import rasel.lunar.launcher.workers.WorkersDb +import java.util.regex.Matcher +import java.util.regex.Pattern + internal class AppsAdapter( @@ -46,7 +50,7 @@ internal class AppsAdapter( private val fragmentManager: FragmentManager, private val appsCount: TextView) : RecyclerView.Adapter() { - private var oldList = mutableListOf() + private var oldList = mutableListOf() // private var appGravity: Int = Gravity.CENTER companion object { @@ -60,12 +64,14 @@ internal class AppsAdapter( val item = oldList[i] + + holder.view.apply { childTextview.text = item.appName appIconTwo.visibility = View.VISIBLE MainScope().async { - getDrawableIconForPackage(item.packageName, packageManager.getApplicationIcon(item.packageName)) { + getDrawableIconForPackage(item.pkgName, packageManager.getApplicationIcon(item.pkgName!!)) { appIconTwo.post { appIconTwo.setImageDrawable(it) } } } childTextview.apply { @@ -77,13 +83,23 @@ internal class AppsAdapter( holder.view.root.apply { /* on click - open app */ setOnClickListener { - context.startActivity(packageManager.getLaunchIntentForPackage(item.packageName)) + WorkersDb.getRealm().apply { + writeBlocking { + var result = query("pkgName == $0",item.pkgName).find() + if(result.size > 0) { + val app = result.first() + app.clickCount = app.clickCount + 1 + app.lastUseDate = Math.max(app.lastUseDate, System.currentTimeMillis()) + } + } + } + context.startActivity(packageManager.getLaunchIntentForPackage(item.pkgName!!)) } /* on long click - open app menu */ setOnLongClickListener { AppMenu().apply { - }.show(fragmentManager, item.packageName) + }.show(fragmentManager, item.pkgName) true } } @@ -94,7 +110,7 @@ internal class AppsAdapter( inner class AppsViewHolder(var view: AppsChildBinding) : RecyclerView.ViewHolder(view.root) /* update app list */ - fun updateData(newList: List) { + fun updateData(newList: List) { val diffUtilResult = DiffUtil.calculateDiff(AppsDiffUtil(oldList, newList)) // diffUtilResult.dispatchUpdatesTo(this) @@ -114,14 +130,14 @@ data class Packages ( ) internal class AppsDiffUtil( - private val oldList: List, private val newList: List + private val oldList: List, private val newList: List ) : DiffUtil.Callback() { override fun getOldListSize(): Int = oldList.size override fun getNewListSize(): Int = newList.size override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean = - oldList[oldItemPosition].packageName == newList[newItemPosition].packageName + oldList[oldItemPosition].pkgName == newList[newItemPosition].pkgName override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean = oldList[oldItemPosition] == newList[newItemPosition] diff --git a/app/src/main/kotlin/rasel/lunar/launcher/apps/ContactAdapter.kt b/app/src/main/kotlin/rasel/lunar/launcher/apps/ContactAdapter.kt index c7438d7f..cce9e516 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/apps/ContactAdapter.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/apps/ContactAdapter.kt @@ -33,6 +33,8 @@ import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.google.android.material.textview.MaterialTextView +import io.realm.kotlin.types.RealmObject +import io.realm.kotlin.types.annotations.PrimaryKey import kotlinx.coroutines.MainScope import kotlinx.coroutines.async import rasel.lunar.launcher.LauncherActivity.Companion.lActivity @@ -42,6 +44,9 @@ import rasel.lunar.launcher.databinding.AppsChildBinding import rasel.lunar.launcher.databinding.ContactItemBinding import rasel.lunar.launcher.helpers.UniUtils.Companion.dpToPx import rasel.lunar.launcher.utils.BLog +import rasel.lunar.launcher.utils.JamoUtils +import rasel.lunar.launcher.workers.RecentCallGetter +import java.util.Date internal class ContactAdapter ( @@ -60,13 +65,14 @@ internal class ContactAdapter ( override fun onBindViewHolder(holder: ContactViewHolder, i: Int) { val item = oldList[i] - + BLog.LOGE("name >>> ${item.name} :: ${item.touchCount} :: ${RecentCallGetter.dateFormat.format( + Date(item.lastedTouchDateTime) + )}") holder.view.apply { name.text = item.name number.text= item.phoneNumber } - holder.view.root.apply { /* on click - open app */ setOnClickListener { @@ -88,12 +94,18 @@ internal class ContactAdapter ( /* update app list */ fun updateData(newList: List) { - val diffUtilResult = DiffUtil.calculateDiff(ContactDiffUtil(oldList, newList)) - diffUtilResult.dispatchUpdatesTo(this) - oldList.clear() - oldList.addAll(newList) - newList.size.let { - appsSize = it + synchronized(oldList) { + try { + val diffUtilResult = DiffUtil.calculateDiff(ContactDiffUtil(oldList, newList)) + diffUtilResult.dispatchUpdatesTo(this) + oldList.clear() + oldList.addAll(newList) + newList.size.let { + appsSize = it + } + }catch (e : IndexOutOfBoundsException) { + + } } } @@ -112,7 +124,25 @@ internal class ContactAdapter ( } } -data class SimpleContact(val id : String,val name : String ,val phoneNumber : String) +class SimpleContact : RealmObject { + @PrimaryKey + var id : String? = "" + var name : String? = "" + var chosung : String? = "" + var phoneNumber : String? = "" + var touchCount = 0 + var lastedTouchDateTime = 0L + + constructor(id: String, name: String, phoneNumber: String) { + this.id = id + this.name = name + this.phoneNumber = phoneNumber + chosung = JamoUtils.split(name).joinToString("") + } + + constructor() + +} internal class ContactDiffUtil( private val oldList: List, private val newList: List diff --git a/app/src/main/kotlin/rasel/lunar/launcher/feeds/Feeds.kt b/app/src/main/kotlin/rasel/lunar/launcher/feeds/Feeds.kt index 1c20df62..f6f5d1ee 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/feeds/Feeds.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/feeds/Feeds.kt @@ -62,7 +62,9 @@ import rasel.lunar.launcher.CommadCallabck import rasel.lunar.launcher.LauncherActivity.Companion.appWidgetHost import rasel.lunar.launcher.LauncherActivity.Companion.appWidgetManager import rasel.lunar.launcher.LauncherActivity.Companion.lActivity +import rasel.lunar.launcher.LauncherActivity.Companion.refreshCalls import rasel.lunar.launcher.LauncherActivity.Companion.refreshFeeds +import rasel.lunar.launcher.LauncherActivity.Companion.refreshSms import rasel.lunar.launcher.R import rasel.lunar.launcher.databinding.FeedsBinding import rasel.lunar.launcher.feeds.rss.RssAdapter @@ -313,6 +315,8 @@ internal class Feeds : Fragment() , CommadCallabck { "req" -> { refreshFeeds() + refreshCalls() + refreshSms() consoleLog("excute refreshFeeds()") } 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 74c30acd..425bd236 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/home/LauncherHome.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/home/LauncherHome.kt @@ -30,6 +30,7 @@ import android.net.Uri import android.os.Bundle import android.os.Handler import android.os.Looper +import android.os.PatternMatcher import android.provider.AlarmClock import android.view.LayoutInflater import android.view.View @@ -64,6 +65,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.json.JSONArray import org.json.JSONObject @@ -110,6 +112,7 @@ import java.nio.charset.Charset import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date +import java.util.regex.Pattern internal class LauncherHome : Fragment() { @@ -123,7 +126,7 @@ internal class LauncherHome : Fragment() { companion object { var home : LauncherHome? = null var lastedFinishedPageUrl : String = "" - var recentCalls = arrayListOf() +// var recentCalls = arrayListOf() var callList = arrayListOf() var smsList = arrayListOf() var listTags = arrayListOf() @@ -147,8 +150,7 @@ internal class LauncherHome : Fragment() { } val callUpdate = Runnable { - binding.missedCalls.text = "최근 통화 [${recentCalls.size}]" - BLog.LOGE("observeForever missedCalls.size >>> ${recentCalls.size}") + chooseAdpater() } @@ -352,17 +354,33 @@ internal class LauncherHome : Fragment() { var rQ = WorkersDb.getRealm().query().query("pubDate > $0", beforeDay(Date(),3)) if(keyword.length > 0) keyword.split("").forEach { - if (Character.codePointAt(it, 0) in 0xAC00..0xD79D) { - rQ = rQ.query("title CONTAINS $0 OR chosung CONTAINS $1 ", it, JamoUtils.splitOne(it)) - } else { - rQ = rQ.query("title CONTAINS $0 OR title CONTAINS $1", it.toUpperCase(), it.toLowerCase()) + BLog.LOGE("queryInfos it >>> ${it}") + if (it.length > 0) { + if (JamoUtils.CHOSUNG.contains(it)) { + rQ = rQ.query( + "title CONTAINS $0 OR chosung CONTAINS $1 ", + it, + it + ) + } else if(Pattern.matches("^[가-힣]*\$", it)){ + rQ = rQ.query( + "title CONTAINS $0", + it + ) + }else { + rQ = rQ.query( + "title CONTAINS $0 OR title CONTAINS $1", + it.toUpperCase(), + it.toLowerCase() + ) + } } } category?.let { rQ = rQ.query("category == $0", it) } - + BLog.LOGE("queryInfos rQ.description() >>>>> ${rQ.description()}") //limit(1000) mRssDataResult = rQ.sort("pubDate ", Sort.DESCENDING).find() BLog.LOGE("${this} ::::: queryInfos after query find >>>> ") @@ -573,21 +591,19 @@ internal class LauncherHome : Fragment() { binding.smsList.visibility = View.INVISIBLE binding.infoList.visibility = View.INVISIBLE binding.notiList.visibility = View.INVISIBLE - if (binding.missedCalls.isSelected) { - if (recentCalls.size > 0) { - try { - callList.clear() - callList.addAll(recentCalls) - callList.sortByDescending { it.date } -// Handler(Looper.getMainLooper()).post { - binding.mainList.visibility = View.VISIBLE - mMissedCallsAdapter.updateData(callList) - binding.recentSms.isSelected = false - binding.otherCheck.isSelected = false - binding.notice.isSelected = false - } catch (e : Exception) { - } + var dateParam = beforeDay(Date(),7).toString() + if (binding.missedCalls.isSelected) { + WorkersDb.getRealm().apply { + val result = query().query("callDayTime >= $0", dateParam).sort("callDayTime", Sort.DESCENDING).find() + callList.clear() + callList.addAll(copyFromRealm(result)) + binding.missedCalls.text = "최근 통화 [${callList.size}]" + binding.mainList.visibility = View.VISIBLE + mMissedCallsAdapter.updateData(callList) + binding.recentSms.isSelected = false + binding.otherCheck.isSelected = false + binding.notice.isSelected = false } } else if(binding.recentSms.isSelected){ if (smsList.size > 0) { diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/AppInfo.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/AppInfo.kt new file mode 100644 index 00000000..4e5affb8 --- /dev/null +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/AppInfo.kt @@ -0,0 +1,19 @@ +package rasel.lunar.launcher.model + +import io.realm.kotlin.types.RealmObject +import io.realm.kotlin.types.annotations.PrimaryKey + +class AppInfo : RealmObject { + + var appName : String? = null + var appNameChosung : String? = null + var koreanName : String? = null + var alphaCho : String? = null + + @PrimaryKey + var pkgName : String? = null + + var clickCount : Int = 0 + var lastUseDate : Long = 0L + var category : String? = null +} \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/CommunityData.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/CommunityData.kt index 9064c029..59f3b281 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/model/CommunityData.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/CommunityData.kt @@ -103,6 +103,9 @@ class Arca : RssDataInterface { override fun category(): RssDataType { return RssDataType.Arca } + override fun getCho(): String? { + return JamoUtils.split(title!!).joinToString("") + } } @@ -169,6 +172,9 @@ open class DcInside : RssDataInterface { return RssDataType.DcInside } + override fun getCho(): String? { + return JamoUtils.split(title!!).joinToString("") + } } @@ -205,7 +211,7 @@ class RssData : RealmObject, RssDataInterface { } else -> title ?: "" }.apply { - chosung = JamoUtils.split(this).joinToString { "" } + chosung = JamoUtils.split(this).joinToString("") } } @@ -240,6 +246,9 @@ class RssData : RealmObject, RssDataInterface { return mRssDataType!! } + override fun getCho(): String? { + return chosung + } } @@ -319,6 +328,9 @@ open class Dotax(var pageLink : String, override fun category(): RssDataType { return RssDataType.Dotax } + override fun getCho(): String? { + return JamoUtils.split(title!!).joinToString("") + } } data class FmKorea(var apageLink : String, @@ -341,6 +353,7 @@ fun RssDataInterface.getRssData() : RssData { originPage = this@getRssData.originPage() thumbnail = this@getRssData.thumbnailUrl() pubDate = this@getRssData.pubDate() + chosung = this@getRssData.getCho() category = this@getRssData.category().name } } \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/Reddit.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/Reddit.kt index e5c65179..87085c84 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/model/Reddit.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/Reddit.kt @@ -2,6 +2,7 @@ package rasel.lunar.launcher.model import rasel.lunar.launcher.todos.Image import rasel.lunar.launcher.todos.Source +import rasel.lunar.launcher.utils.JamoUtils class Child { @@ -275,7 +276,9 @@ class Data : RssDataInterface { RssDataType.REDDIT_nsfw } else RssDataType.REDDIT } - + override fun getCho(): String? { + return JamoUtils.split(title!!).joinToString("") + } } class Gif { diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/RssDataInterface.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/RssDataInterface.kt index 6459b310..de313f69 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/model/RssDataInterface.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/RssDataInterface.kt @@ -51,6 +51,6 @@ interface RssDataInterface { fun description() : String fun pubDate() : Long fun category() : RssDataType - + fun getCho() : String? } \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/RssItem.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/RssItem.kt index f6561750..4497ce5e 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/model/RssItem.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/RssItem.kt @@ -1,5 +1,7 @@ package rasel.lunar.launcher.model +import rasel.lunar.launcher.utils.JamoUtils + open class RssItem : RssDataInterface { var model : String = "" var title : String = "" @@ -51,6 +53,10 @@ open class RssItem : RssDataInterface { } fun isValid() = (((pageLink.length ?:0) > 0) && ((title.length ?:0) > 0)&& ((image.length ?:0) > 0)) + + override fun getCho(): String? { + return JamoUtils.split(title!!).joinToString("") + } } class MostItem : RssItem , RssDataInterface { @@ -81,5 +87,7 @@ class MostItem : RssItem , RssDataInterface { return RssDataType.Most } - + override fun getCho(): String? { + return JamoUtils.split(title!!).joinToString("") + } } diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/RssTagItem.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/RssTagItem.kt index 5f128729..b279f7d7 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/model/RssTagItem.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/RssTagItem.kt @@ -1,5 +1,7 @@ package rasel.lunar.launcher.model +import rasel.lunar.launcher.utils.JamoUtils + class RssTagItem : RssDataInterface { var link : String = "" var tagTitle = "" @@ -38,4 +40,7 @@ class RssTagItem : RssDataInterface { }catch (e : Exception) {} } } + override fun getCho(): String? { + return JamoUtils.split(tagTitle!!).joinToString("") + } } \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/YoutubeData.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/YoutubeData.kt index d73d74e4..b0758774 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/model/YoutubeData.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/YoutubeData.kt @@ -1,6 +1,7 @@ package rasel.lunar.launcher.model import org.json.JSONObject +import rasel.lunar.launcher.utils.JamoUtils import rasel.lunar.launcher.utils.afterDay import rasel.lunar.launcher.utils.beforeDay import java.util.Date @@ -1644,6 +1645,9 @@ open class VideoRenderer : RssDataInterface { override fun category(): RssDataType { return RssDataType.YOUTUBE } + override fun getCho(): String? { + return JamoUtils.split(title()).joinToString("") + } } class ViewCountText { diff --git a/app/src/main/kotlin/rasel/lunar/launcher/todos/RssFeedsParser.kt b/app/src/main/kotlin/rasel/lunar/launcher/todos/RssFeedsParser.kt index 0e6cd563..aa86ed24 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/todos/RssFeedsParser.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/todos/RssFeedsParser.kt @@ -7,6 +7,7 @@ import org.xmlpull.v1.XmlPullParserException import rasel.lunar.launcher.model.RssDataInterface import rasel.lunar.launcher.model.RssDataType import rasel.lunar.launcher.utils.BLog +import rasel.lunar.launcher.utils.JamoUtils import rasel.lunar.launcher.utils.beforeDay import java.io.IOException import java.io.InputStream @@ -211,4 +212,7 @@ class RssFeed : RssDataInterface { override fun category(): RssDataType { return RssDataType.NewsFeed } + override fun getCho(): String? { + return JamoUtils.split(title()).joinToString("") + } } \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/todos/RssItemAdapter.kt b/app/src/main/kotlin/rasel/lunar/launcher/todos/RssItemAdapter.kt index dee6064f..88155008 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/todos/RssItemAdapter.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/todos/RssItemAdapter.kt @@ -34,6 +34,7 @@ import com.squareup.picasso.Picasso import rasel.lunar.launcher.LauncherActivity.Companion.lActivity import rasel.lunar.launcher.R import rasel.lunar.launcher.databinding.ListItemWithBinding +import rasel.lunar.launcher.model.RssData import rasel.lunar.launcher.model.RssDataInterface import rasel.lunar.launcher.model.RssDataType import rasel.lunar.launcher.utils.BLog @@ -147,7 +148,6 @@ internal class RssItemAdapter ( @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: RssTag, position: Int) { val rssData = rssDataItemLis[position] - if (rssData.pubDate() > 1000L) { holder.view.date.text = dateFormat.format(Date(rssData.pubDate())) } else { diff --git a/app/src/main/kotlin/rasel/lunar/launcher/todos/YoutubeData.kt b/app/src/main/kotlin/rasel/lunar/launcher/todos/YoutubeData.kt index 32c3bd99..962b0ff6 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/todos/YoutubeData.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/todos/YoutubeData.kt @@ -5,6 +5,7 @@ import rasel.lunar.launcher.model.RssDataInterface import rasel.lunar.launcher.model.RssDataType import rasel.lunar.launcher.model.YTBImage import rasel.lunar.launcher.model.YTBSource +import rasel.lunar.launcher.utils.JamoUtils import rasel.lunar.launcher.utils.afterDay import rasel.lunar.launcher.utils.beforeDay import java.util.Date @@ -1648,6 +1649,10 @@ open class VideoRenderer : RssDataInterface { override fun category(): RssDataType { return RssDataType.YOUTUBE } + + override fun getCho(): String? { + return JamoUtils.split(title()).joinToString("") + } } class ViewCountText { diff --git a/app/src/main/kotlin/rasel/lunar/launcher/utils/AlphabetToChosungMap.kt b/app/src/main/kotlin/rasel/lunar/launcher/utils/AlphabetToChosungMap.kt new file mode 100644 index 00000000..b6a19a82 --- /dev/null +++ b/app/src/main/kotlin/rasel/lunar/launcher/utils/AlphabetToChosungMap.kt @@ -0,0 +1,45 @@ +package rasel.lunar.launcher.utils + +object AlphabetToChosungMap { + val map = hashMapOf( + Pair("a","o"), + Pair("b","ㅂ"), + Pair("c","ㅋㅅ"), + Pair("d","ㄷ"), + Pair("e","o"), + Pair("f","ㅍ"), + Pair("g","ㄱㅈ"), + Pair("h","ㅎ"), + Pair("i","o"), + Pair("j","ㅈ"), + Pair("k","ㅋ"), + Pair("l","ㄹ"), + Pair("m","ㅁ"), + Pair("n","ㄴ"), + Pair("o","o"), + Pair("p","ㅍ"), + Pair("q","ㅋ"), + Pair("r","ㄹ"), + Pair("s","ㅅ"), + Pair("t","ㅌ"), + Pair("u","o"), + Pair("v","ㅂ"), + Pair("w","o"), + Pair("x","ㅋㅅㅈ"), + Pair("y","이"), + Pair("z","ㅈ"), + Pair("10","ㅅㅌ"), + Pair("0","ㅇㅈ"), + Pair("9","ㄱㄴ"), + Pair("8","ㅍㅇ"), + Pair("7","ㅊㅅ"), + Pair("6","ㅇㅅ"), + Pair("5","ㅇㅍ"), + Pair("4","ㅅㅍ"), + Pair("3","ㅅㅆ"), + Pair("2","ㅇㅌ"), + Pair("1","ㅇ"), + ) + + fun getCho(string : String) = string.split("").filter { it.length > 0 && map.containsKey(it.toLowerCase()) }.map { map.get(it) }.joinToString("") +} \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/utils/EnToKo.kt b/app/src/main/kotlin/rasel/lunar/launcher/utils/EnToKo.kt new file mode 100644 index 00000000..623dd614 --- /dev/null +++ b/app/src/main/kotlin/rasel/lunar/launcher/utils/EnToKo.kt @@ -0,0 +1,238 @@ +package rasel.lunar.launcher.utils + +import java.util.Scanner +import java.util.regex.Matcher + + +object EnToKo { + var ignoreChars: String = "`1234567890-=[]\\;',./~!@#$%^&*()_+{}|:\"<>? " + + /** * 영어를 한글로... */ + fun engToKor(eng: String): String { + val sb = StringBuffer() + var initialCode = 0 + var medialCode = 0 + var finalCode = 0 + var tempMedialCode: Int + var tempFinalCode: Int + var i = 0 + while (i < eng.length) { + // 숫자특수문자 처리 + if (ignoreChars.indexOf(eng.substring(i, i + 1)) > -1) { + sb.append(eng.substring(i, i + 1)) + i++ + continue + } + + // 초성코드 추출 + initialCode = getCode(CodeType.chosung, eng.substring(i, i + 1)) + i++ + + // 다음문자로 + // 중성코드 추출 + tempMedialCode = getDoubleMedial(i, eng) + + // 두 자로 이루어진 중성코드 추출 + if (tempMedialCode != -1) { + medialCode = tempMedialCode + i += 2 + } else { + // 없다면, + medialCode = getSingleMedial(i, eng) + + // 한 자로 이루어진 중성코드 추출 + i++ + } + + // 종성코드 추출 + tempFinalCode = getDoubleFinal(i, eng) + + // 두 자로 이루어진 종성코드 추출 + if (tempFinalCode != -1) { + finalCode = tempFinalCode + + // 그 다음의 중성 문자에 대한 코드를 추출한다. + tempMedialCode = getSingleMedial(i + 2, eng) + if (tempMedialCode != -1) { + // 코드 값이 있을 경우 + finalCode = getSingleFinal(i, eng) + + // 종성 코드 값을 저장한다. + } else { + i++ + } + } else { + // 코드 값이 없을 경우 , + tempMedialCode = getSingleMedial(i + 1, eng) + + // 그 다음의 중성 문자에 대한 코드 추출. + if (tempMedialCode != -1) { + // 그 다음에 중성 문자가 존재할 경우, + finalCode = 0 // 종성 문자는 없음. + i-- + } else { + finalCode = getSingleFinal(i, eng) + + // 종성 문자 추출 + if (finalCode == -1) { + finalCode = 0 + i-- + + // 초성,중성 + 숫자,특수문자, + //기호가 나오는 경우 index를 줄임. + } + } + } + + // 추출한 초성 문자 코드, + //중성 문자 코드, 종성 문자 코드를 합한 후 변환하여 스트링버퍼에 넘김 + sb.append((0xAC00 + initialCode + medialCode + finalCode).toChar()) + i++ + } + return sb.toString() + } + + /** * 해당 문자에 따른 코드를 추출한다. * * @param type * 초성 : chosung, 중성 : jungsung, 종성 : jongsung 구분 * @param char 해당 문자 */ + private fun getCode(type: CodeType, c: String): Int { + // 초성 + val init = "rRseEfaqQtTdwWczxvg" + + // 중성 + val mid = arrayOf( + "k", + "o", + "i", + "O", + "j", + "p", + "u", + "P", + "h", + "hk", + "ho", + "hl", + "y", + "n", + "nj", + "np", + "nl", + "b", + "m", + "ml", + "l" + ) + + // 종성 + val fin = arrayOf( + "r", + "R", + "rt", + "s", + "sw", + "sg", + "e", + "f", + "fr", + "fa", + "fq", + "ft", + "fx", + "fv", + "fg", + "a", + "q", + "qt", + "t", + "T", + "d", + "w", + "c", + "z", + "x", + "v", + "g" + ) + when (type) { + CodeType.chosung -> { + val index = init.indexOf(c) + if (index != -1) { + return index * 21 * 28 + } + } + + CodeType.jungsung -> { + var i = 0 + while (i < mid.size) { + if (mid[i] == c) { + return i * 28 + } + i++ + } + } + + CodeType.jongsung -> { + var i = 0 + while (i < fin.size) { + if (fin[i] == c) { + return i + 1 + } + i++ + } + } + + else -> println("잘못된 타입 입니다") + } + return -1 + } + + // 한 자로 된 중성값을 리턴한다 + // 인덱스를 벗어낫다면 -1을 리턴 + private fun getSingleMedial(i: Int, eng: String): Int { + return if ((i + 1) <= eng.length) { + getCode(CodeType.jungsung, eng.substring(i, i + 1)) + } else { + -1 + } + } + + // 두 자로 된 중성을 체크하고, 있다면 값을 리턴한다. + // 없으면 리턴값은 -1 + private fun getDoubleMedial(i: Int, eng: String): Int { + val result: Int + if ((i + 2) > eng.length) { + return -1 + } else { + result = getCode(CodeType.jungsung, eng.substring(i, i + 2)) + return if (result != -1) { + result + } else { + -1 + } + } + } + + // 한 자로된 종성값을 리턴한다 + // 인덱스를 벗어낫다면 -1을 리턴 + private fun getSingleFinal(i: Int, eng: String): Int { + return if ((i + 1) <= eng.length) { + getCode(CodeType.jongsung, eng.substring(i, i + 1)) + } else { + -1 + } + } + + // 두 자로된 종성을 체크하고, 있다면 값을 리턴한다. + // 없으면 리턴값은 -1 + private fun getDoubleFinal(i: Int, eng: String): Int { + return if ((i + 2) > eng.length) { + -1 + } else { + getCode(CodeType.jongsung, eng.substring(i, i + 2)) + } + } + + // 코드타입 - 초성, 중성, 종성 + internal enum class CodeType { + chosung, jungsung, jongsung + } +} diff --git a/app/src/main/kotlin/rasel/lunar/launcher/utils/JamoUtils.kt b/app/src/main/kotlin/rasel/lunar/launcher/utils/JamoUtils.kt index 49bfb651..19755fd8 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/utils/JamoUtils.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/utils/JamoUtils.kt @@ -17,7 +17,8 @@ object JamoUtils { "ᆽ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ", ) - fun split(target: String): List { + fun split(target: String?): List { + if (target.isNullOrEmpty()) return arrayListOf() return target.split("") .filter(String::isNotEmpty) .map(JamoUtils::splitOne) diff --git a/app/src/main/kotlin/rasel/lunar/launcher/workers/AppInfoGetter.kt b/app/src/main/kotlin/rasel/lunar/launcher/workers/AppInfoGetter.kt new file mode 100644 index 00000000..aa2af236 --- /dev/null +++ b/app/src/main/kotlin/rasel/lunar/launcher/workers/AppInfoGetter.kt @@ -0,0 +1,63 @@ +package rasel.lunar.launcher.workers + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo +import android.os.Build +import androidx.work.WorkerParameters +import io.realm.kotlin.ext.query +import rasel.lunar.launcher.BuildConfig +import rasel.lunar.launcher.LauncherActivity.Companion.lActivity +import rasel.lunar.launcher.apps.AppDrawer.Companion.appName +import rasel.lunar.launcher.apps.AppDrawer.Companion.getCategory +import rasel.lunar.launcher.apps.normalize +import rasel.lunar.launcher.model.AppInfo +import rasel.lunar.launcher.utils.AlphabetToChosungMap +import rasel.lunar.launcher.utils.JamoUtils + +class AppInfoGetter : BaseGetter { + companion object { + val TAG = "AppInfoGetter" + } + constructor(context: Context, workerParams: WorkerParameters) : super(context, workerParams) { + + } + override fun realWork(): Result { + try { + var packageManager = lActivity?.packageManager + var packageInfoList: MutableList = mutableListOf() + packageInfoList = (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + packageManager?.queryIntentActivities( + Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER), + PackageManager.ResolveInfoFlags.of(0) + ) + } else { + (packageManager?.queryIntentActivities( + Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER), 0 + )) + })?.apply { + removeIf { it.activityInfo.packageName.equals(BuildConfig.APPLICATION_ID) } + forEach { + val result = WorkersDb.getRealm().query().query("pkgName == $0",it.activityInfo.packageName).find() + if (result.size < 1) { + val info = AppInfo() + info.appName = normalize(appName(it)) + info.pkgName = it.activityInfo.packageName + info.category = getCategory(it.activityInfo.applicationInfo.category) + info.alphaCho = AlphabetToChosungMap.getCho(info.appName!!) + info.appNameChosung = JamoUtils.split(info.appName).joinToString("") + WorkersDb.update(info) + } else{ + val info = WorkersDb.getRealm().copyFromRealm(result.first()) + info.alphaCho = AlphabetToChosungMap.getCho(info.appName!!) + info.appNameChosung = JamoUtils.split(info.appName).joinToString("") + WorkersDb.update(info) + } + } + }!! + + } catch (e : Exception) {e.printStackTrace()} + return Result.success() + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/workers/ClienGetter.kt b/app/src/main/kotlin/rasel/lunar/launcher/workers/ClienGetter.kt index 3e62879a..1ad6c87e 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/workers/ClienGetter.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/workers/ClienGetter.kt @@ -19,12 +19,12 @@ class ClienGetter : BaseGetter { } fun parseClien(div_clien : org.jsoup.nodes.Element) { - BLog.LOGE("div_clien >>>> ${div_clien}") - - BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("subject_fixed").getT()}") - BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("shortname fixed").getT()}") - BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("list_subject").getHref()}") - BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("timestamp").getT()}") +// BLog.LOGE("div_clien >>>> ${div_clien}") +// +// BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("subject_fixed").getT()}") +// BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("shortname fixed").getT()}") +// BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("list_subject").getHref()}") +// BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("timestamp").getT()}") val title = div_clien.getElementsByClass("subject_fixed").getT() val desc = div_clien.getElementsByClass("shortname fixed").getT() diff --git a/app/src/main/kotlin/rasel/lunar/launcher/workers/ContactInfoGetter.kt b/app/src/main/kotlin/rasel/lunar/launcher/workers/ContactInfoGetter.kt new file mode 100644 index 00000000..87977327 --- /dev/null +++ b/app/src/main/kotlin/rasel/lunar/launcher/workers/ContactInfoGetter.kt @@ -0,0 +1,61 @@ +package rasel.lunar.launcher.workers + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo +import android.os.Build +import android.provider.ContactsContract +import android.util.Log +import androidx.work.WorkerParameters +import io.realm.kotlin.ext.query +import rasel.lunar.launcher.BuildConfig +import rasel.lunar.launcher.LauncherActivity.Companion.lActivity +import rasel.lunar.launcher.apps.AppDrawer.Companion.appName +import rasel.lunar.launcher.apps.AppDrawer.Companion.getCategory +import rasel.lunar.launcher.apps.SimpleContact +import rasel.lunar.launcher.apps.normalize +import rasel.lunar.launcher.model.AppInfo +import rasel.lunar.launcher.utils.AlphabetToChosungMap + +class ContactInfoGetter : BaseGetter { + companion object { + val TAG = "ContactInfoGetter" + } + constructor(context: Context, workerParams: WorkerParameters) : super(context, workerParams) { + + } + override fun realWork(): Result { + val phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI + val projection = arrayOf( + ContactsContract.CommonDataKinds.Phone.CONTACT_ID, + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, + ContactsContract.CommonDataKinds.Phone.NUMBER, + ) + + try { + val cursor = lActivity?.contentResolver?.query(phoneUri, projection, null, null, null) + if (cursor != null) { + while (cursor.moveToNext()) { + val idx =cursor.getColumnIndex(projection[0]) + val nameIndex = cursor.getColumnIndex(projection[1]) + val numberIndex = cursor.getColumnIndex(projection[2]) + var contactId = cursor.getString(idx) + val name = cursor.getString(nameIndex) + var number = cursor.getString(numberIndex) + number = number.replace("-", "") + if (name?.length ?: 0 > 0 && number?.length ?: 0 > 0) { + if (WorkersDb.getRealm().query("id == $0", contactId).find().size == 0) { + WorkersDb.update(SimpleContact(contactId,name,number)) + } + } + } + } + // 데이터 계열은 반드시 닫아줘야 한다. + cursor?.close() + } catch ( e : Exception) { + e.printStackTrace() + } + return Result.success() + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/workers/RecentCallGetter.kt b/app/src/main/kotlin/rasel/lunar/launcher/workers/RecentCallGetter.kt index 8ca23c51..183a4c42 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/workers/RecentCallGetter.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/workers/RecentCallGetter.kt @@ -5,30 +5,44 @@ import android.content.Context import android.provider.CallLog import androidx.work.WorkerParameters import com.google.gson.Gson +import io.realm.kotlin.UpdatePolicy +import io.realm.kotlin.ext.query +import io.realm.kotlin.types.RealmObject import rasel.lunar.launcher.LauncherActivity.Companion.lActivity -import rasel.lunar.launcher.home.LauncherHome.Companion.recentCalls +import rasel.lunar.launcher.apps.SimpleContact +import rasel.lunar.launcher.utils.BLog import rasel.lunar.launcher.utils.beforeDay +import rasel.lunar.launcher.utils.getContactId import java.text.SimpleDateFormat import java.util.Date -class RecentCall { - constructor(count: Int, name: String?, number: String, type: Int, typeString: String, date : String) { +class RecentCall : RealmObject { + + constructor(count: Int, name: String?, number: String, type: Int, typeString: String, date : String, callDayTime : Long, duration : Long) { this.count = count this.name = name ?: "unknown" this.number = number this.type = type this.typeString = typeString this.date = date + this.uniqK = number.plus("_").plus(callDayTime) + this.callDayTime = callDayTime + this.duration = duration } + constructor() + + var callDayTime = 0L + var uniqK : String? = "" var count : Int = 1 var name : String = "how" var number : String = "" var type : Int = 0 var typeString : String = "" var date : String = "" + var duration = 0L fun toJson() : String { return Gson().toJson(this) @@ -37,14 +51,17 @@ class RecentCall { } class RecentCallGetter : BaseGetter { - + companion object{ + val TAG = "RecentCallGetter" + val dateFormat = SimpleDateFormat("yyy/MM/dd-HH:mm:ss") + } constructor(context: Context, workerParams: WorkerParameters) : super(context, workerParams) { } @SuppressLint("RestrictedApi") override fun realWork(): Result { - var dateParam = beforeDay(Date(),7).toString() + var dateParam = beforeDay(Date(),30).toString() var managedCursor = lActivity?.contentResolver?.query( CallLog.Calls.CONTENT_URI, arrayOf( CallLog.Calls.NUMBER, @@ -62,12 +79,11 @@ class RecentCallGetter : BaseGetter { val date = managedCursor.getColumnIndex(CallLog.Calls.DATE) val duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION) val name = managedCursor.getColumnIndex(CallLog.Calls.CACHED_NAME) - recentCalls.clear() while (managedCursor.moveToNext()) { val phNumber = managedCursor.getString(number) // mobile number val callType = managedCursor.getString(type) // call type val callDate = managedCursor.getString(date) // call date - val callDayTime: Date = Date(callDate.toLong()) + val callDayTime = callDate.toLong() val callDuration = managedCursor.getString(duration) val callerName = managedCursor.getString(name) @@ -82,21 +98,40 @@ class RecentCallGetter : BaseGetter { CallLog.Calls.BLOCKED_TYPE -> { dir = "BLOCKED_TYPE" } CallLog.Calls.ANSWERED_EXTERNALLY_TYPE -> { dir = "ANSWERED_EXTERNALLY_TYPE" } } - recentCalls.add(RecentCall( + + val call = RecentCall( 1, callerName, phNumber, dircode, dir, - SimpleDateFormat("yyy/MM/dd-HH:mm:ss").format(callDayTime) - )) + dateFormat.format(Date(callDayTime)), + callDayTime, + callDuration.toLong() + ) + call.uniqK?.let { + BLog.LOGE("${TAG} call.uniqK? >>> ${call.uniqK}") + WorkersDb.getRealm().writeBlocking { + if(query().query("uniqK == $0", it).find().count() < 1) { + this.copyToRealm(call, UpdatePolicy.ALL) + var cId = getContactId(lActivity!!.contentResolver, call.number) + if (cId!=null && cId.length > 0) { + val result = query().query("id == $0", cId).find() + if(result.size > 0){ + var contact = result.first() + contact.touchCount = contact.touchCount + 1 + contact.lastedTouchDateTime = Math.max(contact.lastedTouchDateTime, callDayTime) + BLog.LOGE("${TAG} updatetouch info >>>> ${contact.touchCount}") + } + } + } + BLog.LOGE("${TAG} updatetouch info >>>> BE ") + } + BLog.LOGE("${TAG} updatetouch info >>>> E") + } } - - - - } catch (e: Exception) { - + e.printStackTrace() } finally { managedCursor.close() } diff --git a/app/src/main/kotlin/rasel/lunar/launcher/workers/WorkersDb.kt b/app/src/main/kotlin/rasel/lunar/launcher/workers/WorkersDb.kt index a9855f8c..f20d1572 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/workers/WorkersDb.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/workers/WorkersDb.kt @@ -1,19 +1,23 @@ package rasel.lunar.launcher.workers +import com.google.gson.Gson import io.realm.kotlin.Realm import io.realm.kotlin.RealmConfiguration import io.realm.kotlin.UpdatePolicy import io.realm.kotlin.types.BaseRealmObject import io.realm.kotlin.types.TypedRealmObject +import rasel.lunar.launcher.apps.SimpleContact +import rasel.lunar.launcher.model.AppInfo import rasel.lunar.launcher.model.NotificationItem import rasel.lunar.launcher.model.RssData import rasel.lunar.launcher.model.RssDataInterface import rasel.lunar.launcher.model.getRssData +import rasel.lunar.launcher.utils.BLog import kotlin.reflect.KClass object WorkersDb { - val clazz : Set> = setOf(RssData::class, NotificationItem::class) + val clazz : Set> = setOf(RssData::class, NotificationItem::class, AppInfo::class,SimpleContact::class, RecentCall::class) val schemaVersion : Long = 0L private var pRealm : Realm? = null @@ -76,7 +80,7 @@ object WorkersDb { getRealm().apply { this.writeBlocking { try { - this.copyToRealm(data, UpdatePolicy.ERROR) + this.copyToRealm(data, UpdatePolicy.ALL) } catch (e : Exception) { } @@ -84,5 +88,38 @@ object WorkersDb { } } + fun update(info: AppInfo) { + getRealm().apply { + this.writeBlocking { + try { + this.copyToRealm(info, UpdatePolicy.ALL) + } catch (e : Exception) { + } + } + } + } + + fun update(contact: SimpleContact) { + getRealm().apply { + this.writeBlocking { + try { + this.copyToRealm(contact, UpdatePolicy.ALL) + } catch (e : Exception) { + + } + } + } + } + fun insertCall(contact: RecentCall) { + getRealm().apply { + this.writeBlocking { + try { + this.copyToRealm(contact, UpdatePolicy.ALL) + } catch (e : Exception) { + + } + } + } + } } \ No newline at end of file