diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b11917dd..564d2c85 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -92,9 +92,29 @@
tools:ignore="HardcodedDebugMode">
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -172,7 +181,7 @@
= hashMapOf()
@@ -245,188 +227,7 @@ open class LauncherActivity : CommonActivity() {
var actionButtonPressY = 0f
var onExit = false
var lastAction = MotionEvent.ACTION_HOVER_EXIT
- override fun dispatchKeyEvent(ev: KeyEvent): Boolean {
- val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
- Blog.LOGE("dispatch ev?.device?.name >>> ${ev?.device?.name} , keyCode >> ${ev?.keyCode}")
- if (ev?.device?.name?.contains("SM-031N Mouse") == true) {
- when(ev.action) {
- ACTION_UP -> {
- Blog.LOGE("dispatch dispatchKeyEvent>>> ${ev}")
- when(ev.keyCode) {
- KEYCODE_BUTTON_Y->{
-
- }
- KEYCODE_BUTTON_X->{
-
- }
- KEYCODE_BUTTON_A->{
- WorkersDb.getRealm().apply {
- writeBlocking {
- }
- }
- }
- KEYCODE_BUTTON_B->{
-
- }
- KEYCODE_DPAD_DOWN->{
-
- }
- KEYCODE_DPAD_UP->{
-
- }
- KEYCODE_BUTTON_START->{
- onClickCenterButton()
- }
- KEYCODE_BUTTON_SELECT->{
- WorkersDb.getRealm().apply {
- writeBlocking {
-
- }
- }
- }
- else -> {}
- }
- }
- else->{}
- }
- return true
- }
- else {
- val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
- when(currentFragment) {
- is Novels -> {
- if(MotionEvent.ACTION_UP.equals(ev?.action ?: MotionEvent.ACTION_CANCEL) == true) {
- return when (ev.keyCode) {
- KeyEvent.KEYCODE_VOLUME_DOWN -> {
- if(currentFragment is Novels){ currentFragment.actionNextEvent() }
- true
- }
- KeyEvent.KEYCODE_VOLUME_UP -> {
- if(currentFragment is Novels){ currentFragment.actionPrevEvent() }
- true
- }
- else -> false
- }
- } else {
- return when (ev.keyCode) {
- KeyEvent.KEYCODE_VOLUME_DOWN -> {
- true
- }
-
- KeyEvent.KEYCODE_VOLUME_UP -> {
- true
- }
-
- else -> false
- }
- }
- }
- else -> return super.dispatchKeyEvent(ev)
- }
- }
- return super.dispatchKeyEvent(ev)
- }
-
- override fun dispatchTrackballEvent(event: MotionEvent?): Boolean {
- Blog.LOGE("event >>> ${event?.device}")
- return super.dispatchTrackballEvent(event)
- }
-
- @SuppressLint("RestrictedApi")
- override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean {
- Blog.LOGE("event >>> ${event.device}")
- return super.dispatchKeyShortcutEvent(event)
- }
-
- fun onClickCenterButton() {
- WorkersDb.getRealm().apply {
- writeBlocking {
- delete(
- query()
- .query("pubDate < $0",
- bums.lunatic.launcher.utils.beforeDay(28)
- )
- .query("vote != $0", true).apply {
- Blog.LOGE("onClickCenterButton DELETE >> ${this.description()}")
- }.find()
- )
- var ddd = copyFromRealm(WorkersDb.getRssQuery("", RssDataType.getExcAdt(),false).limit(100).query("read == $0", 0).query("vote != $0", true).apply {
- Blog.LOGE("onClickCenterButton SELECT >> ${this.description()}")
- }.find()).map { it.originPage() }
- var origin = ddd.first()
- var jjjj = hashSetOf()
- jjjj.addAll(ddd)
- }
- }
- }
- override fun dispatchGenericMotionEvent(ev: MotionEvent?): Boolean {
- if (ev?.device?.name?.contains("BLE-M3") == true) {
- Blog.LOGE("keyEvent >>>>> dispatchGenericMotionEvent ${ev}")
- ev?.action?.let { action ->
- when(action) {
- MotionEvent.ACTION_HOVER_ENTER -> {
- return false
- }
- MotionEvent.ACTION_HOVER_MOVE ->{
- if(lastAction == MotionEvent.ACTION_HOVER_MOVE) {
- Blog.LOGE("ACTION_HOVER_MOVE Click")
- }
- return false
- }
- MotionEvent.ACTION_BUTTON_PRESS ->{
- if (actionButtonPressX * actionButtonPressY == 0f) {
- actionButtonPressX = ev.x ?: 0f
- actionButtonPressY = ev.y ?: 0f
- }
-// if (onExit) return true
- return false
- }
- MotionEvent.ACTION_BUTTON_RELEASE -> {
- if (actionButtonPressX == ev.x && actionButtonPressY == ev.y) {
-// Blog.LOGE("DisplayUtil.width >>> ${DisplayUtil.width} ${actionButtonPressX}")
-// Blog.LOGE("DisplayUtil.width >>> ${DisplayUtil.height} ${actionButtonPressY}")
- if(actionButtonPressX.toInt() == 480 && actionButtonPressY < 2000) {
- Blog.LOGE("Arrow Center Click")
- onClickCenterButton()
- } else if(ev.y > 2000) {
-
- }
- } else if (actionButtonPressY == ev.y) {
- if (actionButtonPressX.minus(ev.x ?: 0f) > 0f) {
- Blog.LOGE("Arrow Right Click")
- } else {
- Blog.LOGE("Arrow Left Click")
- }
- } else {
- if (actionButtonPressY.minus(ev.y ?: 0f) > 0f) {
- Blog.LOGE("Arrow Down Click")
- } else {
- Blog.LOGE("Arrow Up Click")
- }
- }
-// if (onExit) return true
- return false
- }
- MotionEvent.ACTION_HOVER_EXIT -> {
- actionButtonPressX = 0f
- actionButtonPressY = 0f
- onExit = true
- return false
- }
- else -> {return false}
- }.apply {
- lastAction = action
- }
- }
- }
- return super.dispatchGenericMotionEvent(ev)
- }
-
- fun floatClick(v : View) {
- Blog.LOGE("v >>> ${v}")
- showContents(v.id)
- }
override fun onNewIntent(intent: Intent) {
Blog.LOGE("onNewIntent intent >> ${intent}")
@@ -568,7 +369,7 @@ open class LauncherActivity : CommonActivity() {
val intent = Intent(this, ForeGroundService::class.java)
this.startForegroundService(intent)
-// 1. 시스템 바 공간을 앱이 차지하도록 설정 (상태바 뒤로 레이아웃 확장)
+
WindowCompat.setDecorFitsSystemWindows(window, false)
// 2. 상태바 색상을 투명하게 변경 (필요한 경우)
@@ -580,10 +381,10 @@ open class LauncherActivity : CommonActivity() {
this.startService(nlService)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
- lActivity = this
DynamicColors.applyToActivityIfAvailable(this)
binding = LauncherActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
+ sActivity = this
homeGestureDetector = androidx.core.view.GestureDetectorCompat(this, HomeGestureListener())
binding.widgetContainer.setOnTouchListener { view, event ->
// 위젯 드래그 중이 아닐 때만 제스처 처리
@@ -607,36 +408,13 @@ open class LauncherActivity : CommonActivity() {
updateLocationService()
-// showContents(binding.feeds.id)
- binding.floatingActionMenu.setOnTouchListener { v: View, e: MotionEvent ->
- if (binding.floatingActionMenu.isOpened) {
- binding.floatingActionMenu.close(true)
- return@setOnTouchListener true
- }
- return@setOnTouchListener false
- }
- binding.floatingActionMenu.setOnMenuButtonClickListener { v->
- Blog.LOGE("v >> ${v}")
- showContents(v.id)
- }
if (intent?.action == Intent.ACTION_WEB_SEARCH) {
openWithIntent(intent)
}
val nullCursor = PointerIcon.getSystemIcon(this, PointerIcon.TYPE_NULL)
binding.root.setPointerIcon(nullCursor)
- binding.share.setOnClickListener {
- if (binding.currentAddress.text.length > 5) {
- val sendIntent: Intent = Intent().apply {
- action = Intent.ACTION_SEND
- (binding.currentAddress.tag as? String)?.let{putExtra(Intent.EXTRA_TITLE, it)}
- putExtra(Intent.EXTRA_TEXT, binding.currentAddress.text)
- type = "text/plain"
- }
- val shareIntent = Intent.createChooser(sendIntent, "링크 공유하기")
- startActivity(shareIntent)
- }
- }
+
appWidgetManager = AppWidgetManager.getInstance(this)
appWidgetHost = WidgetHost(applicationContext, APPWIDGET_HOST_ID)
@@ -675,6 +453,10 @@ open class LauncherActivity : CommonActivity() {
})
}
+ override fun onPause() {
+ super.onPause()
+
+ }
// 위젯 선택기 실행
fun selectWidget() {
val appWidgetId = appWidgetHost?.allocateAppWidgetId()
@@ -897,83 +679,7 @@ open class LauncherActivity : CommonActivity() {
}
}
- fun showContents(id : Int) {
- binding.fragmentLayer.visibility = View.VISIBLE
- binding.fragmentContainer.visibility = View.VISIBLE
- binding.controllPanel.visibility = View.VISIBLE
- binding.floatingActionMenu.visibility = View.VISIBLE
- when(id) {
- R.id.feeds -> {
- supportFragmentManager.beginTransaction()
- .replace(R.id.fragment_container, RssHome())
- .commit()
- }
- R.id.books ->{
- supportFragmentManager.beginTransaction()
- .replace(R.id.fragment_container, Novels())
- .commit()
- }
- R.id.webtoons ->{
- supportFragmentManager.beginTransaction()
- .replace(R.id.fragment_container, Webtoons())
- .commit()
- }
- R.id.comics ->{
- supportFragmentManager.beginTransaction()
- .replace(R.id.fragment_container, Comics())
- .commit()
- }
- R.id.youtube ->{
- supportFragmentManager.beginTransaction()
- .replace(R.id.fragment_container, YouTube())
- .commit()
- }
- R.id.perplexity ->{
- supportFragmentManager.beginTransaction()
- .replace(R.id.fragment_container, Perplexity())
- .commit()
- }
- R.id.zota ->{
- supportFragmentManager.beginTransaction()
- .replace(R.id.fragment_container, BookmarkPagerFragment())
- .commit()
- }
- R.id.setting ->{
- startActivity(Intent(this, SettingsActivity::class.java))
- }
- R.id.close ->{
- supportFragmentManager.findFragmentById(R.id.fragment_container)?.let {
- supportFragmentManager.beginTransaction()
- .remove(it)
- .commit()
- binding.fragmentLayer.visibility = View.GONE
- binding.fragmentContainer.visibility = View.GONE
- binding.controllPanel.visibility = View.GONE
- binding.floatingActionMenu.visibility = View.GONE
- }
-
- }
- else -> {}
- }
- binding.floatingActionMenu.close(false)
- }
-
- private fun initGeckoRuntime() {
- if (sRuntime == null) {
- try {
- sRuntime = GeckoRuntime.create(this, GeckoRuntimeSettings.Builder()
- .extensionsProcessEnabled(true)
- .extensionsWebAPIEnabled(true)
- .experimentDelegate(experimentDelegate)
- .debugLogging(false)
- .remoteDebuggingEnabled(true).build())
- } catch (e : Exception) {
- e.printStackTrace()
-
- }
- }
- }
override fun onTouchEvent(event: MotionEvent?): Boolean {
Blog.LOGE("event >>> ${event}")
@@ -991,12 +697,7 @@ open class LauncherActivity : CommonActivity() {
}
override fun onDestroy() {
- try {
- sRuntime?.shutdown()
- sRuntime = null
- } catch (e: Exception) { e.printStackTrace() }
- // appWidgetHost?.stopListening() // 이 줄은 제거하고 onStop으로 이동
super.onDestroy()
}
@@ -1046,26 +747,7 @@ open class LauncherActivity : CommonActivity() {
private fun handleBackPress() {
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
- val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
- if (currentFragment == null) showContents(R.id.close)
- when(currentFragment) {
- is RssHome ->{
- if (currentFragment.binding.layoutRssSummary.root.isVisible) {
- currentFragment.openGecko(rssData = currentFragment.randomOrNull())
- } else {
- currentFragment.doNextPage()
- }
- }
- is YouTube -> {
- currentFragment.back()
- }
- is Novels -> {
- currentFragment.actionNextEvent(false)
- }
- else -> {
- showContents(R.id.close)
- }
- }
+
}
})
}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/apps/AppDrawer.kt b/app/src/main/kotlin/bums/lunatic/launcher/apps/AppDrawer.kt
index a073a065..3c7ec0ea 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/apps/AppDrawer.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/apps/AppDrawer.kt
@@ -1,506 +1,421 @@
-/*
- * Lunar Launcher
- * Copyright (C) 2022 Md Rasel Hossain
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package bums.lunatic.launcher.apps
-
-import android.content.Context
-import android.content.Intent
-import android.content.SharedPreferences
-import android.content.pm.PackageManager
-import android.net.Uri
-import android.os.Bundle
-import android.os.Handler
-import android.os.Looper
-import android.view.KeyEvent
-import android.view.View.GONE
-import android.view.View.VISIBLE
-import android.view.inputmethod.InputMethodManager
-import androidx.core.widget.doOnTextChanged
-import androidx.recyclerview.widget.GridLayoutManager
-import bums.lunatic.launcher.BuildConfig
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
-import bums.lunatic.launcher.common.CommonActivity
-import bums.lunatic.launcher.common.letTrue
-import bums.lunatic.launcher.databinding.AppDrawerBinding
-import bums.lunatic.launcher.helpers.Constants.Companion.KEY_APPS_COUNT
-import bums.lunatic.launcher.helpers.Constants.Companion.KEY_APPS_LAYOUT
-import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_APP_NAMES
-import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SETTINGS
-import bums.lunatic.launcher.helpers.PrefBoolean
-import bums.lunatic.launcher.helpers.PrefLong
-import bums.lunatic.launcher.helpers.PrefString
-import bums.lunatic.launcher.model.AppInfo
-import bums.lunatic.launcher.model.SimpleContact
-import bums.lunatic.launcher.utils.Blog
-import bums.lunatic.launcher.utils.JamoUtils
-import bums.lunatic.launcher.workers.UsageLogType
-import bums.lunatic.launcher.workers.UsageUpdateType
-import bums.lunatic.launcher.workers.WorkersDb
-import io.realm.kotlin.ext.query
-import io.realm.kotlin.query.RealmResults
-import io.realm.kotlin.query.Sort
-import java.net.URLEncoder
-import java.util.concurrent.Executors
-import java.util.concurrent.TimeUnit
-import java.util.regex.Pattern
-
-
-class AppDrawer : CommonActivity() {
-
- private lateinit var binding: AppDrawerBinding
- private var layoutType: Int = 0
- // private var isSearchShown: Boolean = false
- private var isKeyboardShowing: Boolean = false
-
- companion object {
-
- private var appsAdapter: AppsAdapter? = null
- private var contactAdapter : ContactAdapter? = null
- private var packageList = mutableListOf()
- @JvmStatic var settingsPrefs: SharedPreferences? = null
- @JvmStatic var appNamesPrefs: SharedPreferences? = null
-
-
-
-
- }
- fun getInputText() = binding.searchInput.text.toString()
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-// setStyle(STYLE_NO_TITLE, R.style.FilterFullScreenDialog)
-// packageManager
+///*
+// * Lunar Launcher
+// * Copyright (C) 2022 Md Rasel Hossain
+// *
+// * This program is free software: you can redistribute it and/or modify
+// * it under the terms of the GNU General Public License as published by
+// * the Free Software Foundation, either version 3 of the License, or
+// * (at your option) any later version.
+// *
+// * This program is distributed in the hope that it will be useful,
+// * but WITHOUT ANY WARRANTY; without even the implied warranty of
+// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// * GNU General Public License for more details.
+// *
+// * You should have received a copy of the GNU General Public License
+// * along with this program. If not, see .
+// */
+//
+//package bums.lunatic.launcher.apps
+//
+//import android.content.Context
+//import android.content.Intent
+//import android.content.SharedPreferences
+//import android.content.pm.PackageManager
+//import android.net.Uri
+//import android.os.Bundle
+//import android.os.Handler
+//import android.os.Looper
+//import android.view.KeyEvent
+//import android.view.View.GONE
+//import android.view.View.VISIBLE
+//import android.view.inputmethod.InputMethodManager
+//import androidx.core.widget.doOnTextChanged
+//import androidx.recyclerview.widget.GridLayoutManager
+//import bums.lunatic.launcher.BuildConfig
+//import bums.lunatic.launcher.LauncherActivity.Companion.sActivity
+//import bums.lunatic.launcher.common.CommonActivity
+//import bums.lunatic.launcher.common.letTrue
+//import bums.lunatic.launcher.databinding.AppDrawerBinding
+//import bums.lunatic.launcher.helpers.Constants.Companion.KEY_APPS_COUNT
+//import bums.lunatic.launcher.helpers.Constants.Companion.KEY_APPS_LAYOUT
+//import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_APP_NAMES
+//import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SETTINGS
+//import bums.lunatic.launcher.helpers.PrefBoolean
+//import bums.lunatic.launcher.helpers.PrefLong
+//import bums.lunatic.launcher.helpers.PrefString
+//import bums.lunatic.launcher.model.AppInfo
+//import bums.lunatic.launcher.model.SimpleContact
+//import bums.lunatic.launcher.utils.Blog
+//import bums.lunatic.launcher.utils.JamoUtils
+//import bums.lunatic.launcher.workers.UsageLogType
+//import bums.lunatic.launcher.workers.UsageUpdateType
+//import bums.lunatic.launcher.workers.WorkersDb
+//import io.realm.kotlin.ext.query
+//import io.realm.kotlin.query.RealmResults
+//import io.realm.kotlin.query.Sort
+//import java.net.URLEncoder
+//import java.util.concurrent.Executors
+//import java.util.concurrent.TimeUnit
+//import java.util.regex.Pattern
+//
+//
+//class AppDrawer : CommonActivity() {
+//
+// private lateinit var binding: AppDrawerBinding
+// private var layoutType: Int = 0
+// // private var isSearchShown: Boolean = false
+// private var isKeyboardShowing: Boolean = false
+//
+// companion object {
+//
+// private var appsAdapter: AppsAdapter? = null
+// private var contactAdapter : ContactAdapter? = null
+// private var packageList = mutableListOf()
+// @JvmStatic var settingsPrefs: SharedPreferences? = null
+// @JvmStatic var appNamesPrefs: SharedPreferences? = null
+//
+//
+//
+//
// }
-
-// override fun onAttach(context: Context) {
-// super.onAttach(context)
+// fun getInputText() = binding.searchInput.text.toString()
+// override fun onCreate(savedInstanceState: Bundle?) {
+// super.onCreate(savedInstanceState)
+//// setStyle(STYLE_NO_TITLE, R.style.FilterFullScreenDialog)
+//// packageManager
//// }
//
+//// override fun onAttach(context: Context) {
+//// super.onAttach(context)
+////// }
+////
+////
+////
+//// override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
//
+// binding = AppDrawerBinding.inflate(layoutInflater)
+// setContentView(binding.root)
+// settingsPrefs = this.getSharedPreferences(PREFS_SETTINGS, 0)
+// appNamesPrefs = this.getSharedPreferences(PREFS_APP_NAMES, 0)
+// layoutType = settingsPrefs!!.getInt(KEY_APPS_LAYOUT, 0)
//
-// override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
-
- binding = AppDrawerBinding.inflate(layoutInflater)
- setContentView(binding.root)
- settingsPrefs = this.getSharedPreferences(PREFS_SETTINGS, 0)
- appNamesPrefs = this.getSharedPreferences(PREFS_APP_NAMES, 0)
- layoutType = settingsPrefs!!.getInt(KEY_APPS_LAYOUT, 0)
-
- appsAdapter = AppsAdapter(packageManager!!, supportFragmentManager, binding.appsCount)
- contactAdapter = ContactAdapter(applicationContext, supportFragmentManager)
-
- binding.appsCount.visibility = if (settingsPrefs!!.getBoolean(KEY_APPS_COUNT, true)) VISIBLE else GONE
- binding.searchNmap.setOnClickListener {
- openSearchApps("nmap://search?query=${getInputText()}&appname=${BuildConfig.APPLICATION_ID}","com.nhn.android.nmap")
- }
- binding.searchYoutube.setOnClickListener {
- openSearchApps("https://www.youtube.com/results?search_query=${getInputText()}","com.google.android.youtube")
- }
- binding.searchGoogleMap.setOnClickListener {
- openSearchApps("geo:0,0?q=${getInputText()}","com.google.android.apps.maps")
- }
- binding.searchGoogle.setOnClickListener {
- openSearchApps("https://www.google.com/search?q=${getInputText()}","com.android.chrome")
- }
- binding.searchTmap.setOnClickListener {
- openSearchApps("tmap://search?name=${getInputText()}","com.skt.tmap.ku")
-
- }
- binding.searchNaver.setOnClickListener {
- openSearchApps("https://search.naver.com/search.naver?where=nexearch&query=${getInputText()}", "com.nhn.android.search")
- }
- binding.searchDuckduckgo.setOnClickListener {
- openSearchApps("https://duckduckgo.com/?t=h_&q=${getInputText()}","com.duckduckgo.mobile.android")
- }
- binding.searchNamuwiki.setOnClickListener {
- openSearchApps("https://namu.wiki/Search?q=${getInputText()}")
- }
-
- binding.searchTranslate.setOnClickListener {
- openSearchApps("https://translate.google.com/?hl=ko&sl=ko&tl=en&text=${getInputText()}&op=translate","com.android.chrome")
- }
- binding.searchStore.setOnClickListener {
- openSearchApps("market://search?q=${getInputText()}")
- }
- binding.runSend.setOnClickListener {
- sendMsg()
- }
- binding.runTelegram.setOnClickListener {
- sendMsg("tg://msg?text=${getInputText()}&to=${PrefString.telegramSendTarget.get()}","org.telegram.messenger")
- }
- binding.runKatalk.setOnClickListener {
- sendMsg(pkg = "com.kakao.talk")
- }
-
- binding.runKatalkT.setOnClickListener{
- openSearchApps("kakaot://taxi?dest_lat=${URLEncoder.encode("37.467696")}&dest_lng=${URLEncoder.encode("127.101063")}","com.kakao.taxi")
-// openSearchApps("kakaot://taxi?${URLEncoder.encode("세곡동 557")}","com.kakao.taxi")
-// openSearchApps("kakaot://taxi?dest_addr=${URLEncoder.encode("세곡동 557")}","com.kakao.taxi")
- }
- setLayout()
- binding.searchInput.setOnKeyListener { v, keyCode, event ->
- //contactList.size < 1 && packageList.size < 1 &&
- if(PrefBoolean.useQuickLaunch.get(false) && keyCode == 66 && event.action == KeyEvent.ACTION_UP) {
- checkResult(binding.searchInput.text.toString())
- true
- }else {
- false
- }
- }
- var packageManager = lActivity?.packageManager
-
- binding.searchInput.setOnLongClickListener {
- WorkersDb.getRealm().apply {
- var newQ = query()
- appQuery = newQ.sort(Pair("clickCount", Sort.DESCENDING),Pair("lastUseDate",Sort.DESCENDING)).find()
- appQuery?.let {
- if(it.size > 0) {
- WorkersDb.getRealm().apply {
- packageList.clear()
- writeBlocking {
- it.filter {
- var installed = isPackageInstalled(it.pkgName ?: "fffffffail", packageManager!!)
-// it.isInstalled = installed
- installed
- }.let { result ->
- packageList.addAll(copyFromRealm(result))
- binding.appsList.post { if (result.size > 0) {
- appsAdapter?.updateData(packageList)
- }}
- }
- }
- }
- }
- }
- }
- WorkersDb.getRealm().apply {
- var newQ = query()
- contactQuery = newQ.sort(Pair("touchCount", Sort.DESCENDING),Pair("lastedTouchDateTime",Sort.DESCENDING)).find()
- contactQuery?.let {
- if (it.size > 0) {
- contactList.clear()
- contactList.addAll(copyFromRealm(it).toList())
- binding.contactList.post {
- if (contactList.size > 0) {
- contactAdapter?.updateData(contactList)
- }
- }
- }
- }
-
- }
- true
- }
- binding.searchInput.doOnTextChanged{ inputText, _, _, _ ->
- binding.searchInput.text?.let { binding.searchInput.setSelection(it.length) }
- filterAppsList(inputText.toString())
- }
-// return binding.root
- }
- fun isPackageInstalled( packageName : String, packageManager : PackageManager?) : Boolean{
- try {
- packageManager!!.getPackageInfo(packageName, 0)
- return true;
- } catch ( e : Exception) {
- return false;
- }
- }
-
- fun sendMsg(scheme : String? = null , pkg : String? = null) {
- var postIntent : Intent? = null
- if (scheme != null && scheme.length > 1) {
- postIntent = Intent(Intent.ACTION_VIEW,Uri.parse(scheme))
- } else {
- postIntent = Intent(Intent.ACTION_SEND)
- postIntent.type = "text/plain"
- postIntent.putExtra(Intent.EXTRA_TEXT, "${getInputText()}")
- }
- if (pkg != null && pkg.length > 1) {
- postIntent?.setPackage(pkg)
- startActivity(postIntent)
- } else {
- val chooserTitle = "바로 보냄"
- startActivity(Intent.createChooser(postIntent, chooserTitle))
- }
- }
-
- val appNames = hashSetOf()
- val contactList = arrayListOf()
-
- fun openSearchApps(schemeString : String, pakage : String? = null) {
- val gmmIntentUri = Uri.parse(schemeString)
- val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
- pakage?.let {
- mapIntent.setPackage(pakage)
- WorkersDb.logAppUsage(pakage, UsageLogType.APP, UsageUpdateType.DATETIME)
- }
- startActivity(mapIntent)
- }
-
-
- fun checkResult(keyword: String) {
- openSearchMenus(keyword) {
- registCancelSearch()
- }
- }
-
-
-
- fun runonUi(invoke : () -> Unit) {
- Handler(Looper.getMainLooper()).run {
- try {
- invoke.invoke()
- }catch (e : Exception) {
- e.printStackTrace()
- }
- }
- }
-
-
- override fun onResume() {
- super.onResume()
- Blog.LOGE("onResume")
- fetchApps()
-
- binding.appsCount.visibility = if (PrefBoolean.showAppResultCount.get(false)) VISIBLE else GONE
-
- PrefBoolean.openWithKayboard.get().letTrue { openSearch() }
- registCancelSearch()
- }
-
- val chechHandler = Handler(Looper.getMainLooper())
-
- val cancelSearch = Runnable {
- finish()
- }
-
- fun registCancelSearch() {
- chechHandler.removeCallbacks(cancelSearch)
- chechHandler.postDelayed(cancelSearch, 15000L)
- }
-
- fun clearCancelSearch() {
- chechHandler.removeCallbacks(cancelSearch)
- }
-
- override fun onPause() {
- super.onPause()
- closeSearch()
- }
-
- private fun setLayout() {
- binding.appsList.layoutManager = GridLayoutManager(this, 2, GridLayoutManager.HORIZONTAL,false)
- binding.contactList.layoutManager = GridLayoutManager(this, 2, GridLayoutManager.HORIZONTAL,false)
- /* initialize apps list adapter */
- 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(PrefLong.maxQueryCount.get(18L).toInt()).find()
- appQuery?.let {
- if(it.size > 0) {
- WorkersDb.getRealm().apply {
- packageList.clear()
- writeBlocking {
- it.filter {
- var installed = isPackageInstalled(it.pkgName ?: "fffffffail", packageManager!!)
-// it.isInstalled = installed
- installed
- }.let { result ->
- packageList.addAll(copyFromRealm(result))
- binding.appsList.post { if (result.size > 0) {
- appsAdapter?.updateData(packageList)
- }}
- }
- }
- }
- }
- }
- }
- fetcContact(keyword)
- }
-
-
- 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)
- }
- }
- contactQuery = newQ.sort(Pair("touchCount", Sort.DESCENDING),Pair("lastedTouchDateTime",Sort.DESCENDING))
- .limit(PrefLong.maxQueryCount.get(18L).toInt()).find()
- contactQuery?.let {
- if (it.size > 0)
- WorkersDb.getRealm().apply {
- contactList.clear()
- contactList.addAll(copyFromRealm(it).toList())
- 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")
+// appsAdapter = AppsAdapter(packageManager!!, supportFragmentManager, binding.appsCount)
+// contactAdapter = ContactAdapter(applicationContext, supportFragmentManager)
+//
+// binding.appsCount.visibility = if (settingsPrefs!!.getBoolean(KEY_APPS_COUNT, true)) VISIBLE else GONE
+// binding.searchNmap.setOnClickListener {
+// openSearchApps("nmap://search?query=${getInputText()}&appname=${BuildConfig.APPLICATION_ID}","com.nhn.android.nmap")
+// }
+// binding.searchYoutube.setOnClickListener {
+// openSearchApps("https://www.youtube.com/results?search_query=${getInputText()}","com.google.android.youtube")
+// }
+// binding.searchGoogleMap.setOnClickListener {
+// openSearchApps("geo:0,0?q=${getInputText()}","com.google.android.apps.maps")
+// }
+// binding.searchGoogle.setOnClickListener {
+// openSearchApps("https://www.google.com/search?q=${getInputText()}","com.android.chrome")
+// }
+// binding.searchTmap.setOnClickListener {
+// openSearchApps("tmap://search?name=${getInputText()}","com.skt.tmap.ku")
+//
+// }
+// binding.searchNaver.setOnClickListener {
+// openSearchApps("https://search.naver.com/search.naver?where=nexearch&query=${getInputText()}", "com.nhn.android.search")
+// }
+// binding.searchDuckduckgo.setOnClickListener {
+// openSearchApps("https://duckduckgo.com/?t=h_&q=${getInputText()}","com.duckduckgo.mobile.android")
+// }
+// binding.searchNamuwiki.setOnClickListener {
+// openSearchApps("https://namu.wiki/Search?q=${getInputText()}")
+// }
+//
+// binding.searchTranslate.setOnClickListener {
+// openSearchApps("https://translate.google.com/?hl=ko&sl=ko&tl=en&text=${getInputText()}&op=translate","com.android.chrome")
+// }
+// binding.searchStore.setOnClickListener {
+// openSearchApps("market://search?q=${getInputText()}")
+// }
+// binding.runSend.setOnClickListener {
+// sendMsg()
+// }
+// binding.runTelegram.setOnClickListener {
+// sendMsg("tg://msg?text=${getInputText()}&to=${PrefString.telegramSendTarget.get()}","org.telegram.messenger")
+// }
+// binding.runKatalk.setOnClickListener {
+// sendMsg(pkg = "com.kakao.talk")
+// }
+//
+// binding.runKatalkT.setOnClickListener{
+// openSearchApps("kakaot://taxi?dest_lat=${URLEncoder.encode("37.467696")}&dest_lng=${URLEncoder.encode("127.101063")}","com.kakao.taxi")
+//// openSearchApps("kakaot://taxi?${URLEncoder.encode("세곡동 557")}","com.kakao.taxi")
+//// openSearchApps("kakaot://taxi?dest_addr=${URLEncoder.encode("세곡동 557")}","com.kakao.taxi")
+// }
+// setLayout()
+// binding.searchInput.setOnKeyListener { v, keyCode, event ->
+// //contactList.size < 1 && packageList.size < 1 &&
+// if(PrefBoolean.useQuickLaunch.get(false) && keyCode == 66 && event.action == KeyEvent.ACTION_UP) {
+// checkResult(binding.searchInput.text.toString())
+// true
+// }else {
+// false
+// }
+// }
+// var packageManager = sActivity?.packageManager
+//
+// binding.searchInput.setOnLongClickListener {
+// WorkersDb.getRealm().apply {
+// var newQ = query()
+// appQuery = newQ.sort(Pair("clickCount", Sort.DESCENDING),Pair("lastUseDate",Sort.DESCENDING)).find()
+// appQuery?.let {
+// if(it.size > 0) {
+// WorkersDb.getRealm().apply {
+// packageList.clear()
+// writeBlocking {
+// it.filter {
+// var installed = isPackageInstalled(it.pkgName ?: "fffffffail", packageManager!!)
+//// it.isInstalled = installed
+// installed
+// }.let { result ->
+// packageList.addAll(copyFromRealm(result))
+// binding.appsList.post { if (result.size > 0) {
+// appsAdapter?.updateData(packageList)
+// }}
// }
// }
-//
-// }.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() {
-// settingsPrefs!!.getInt(KEY_SCROLLBAR_HEIGHT, DEFAULT_SCROLLBAR_HEIGHT).let { height: Int ->
-// if (height == 0) { binding.alphabets.visibility = GONE }
-// else {
-// binding.alphabets.apply {
-// if (visibility == GONE) visibility = VISIBLE
-// updateLayoutParams { this.height = height }
-// }
-// alphabetList.clear()
-// for (mPackage in packageList) {
-// mPackage.appName.first().uppercase().let { firstLetter: String ->
-// when {
-// numberPattern.matcher(firstLetter).matches() -> alphabetList.add(0, "#")
-// alphabetPattern.matcher(firstLetter).matches() -> alphabetList.add(firstLetter)
-// !numberPattern.matcher(firstLetter).matches() &&
-// !alphabetPattern.matcher(firstLetter).matches() -> alphabetList.add(alphabetList.size,"⠶")
-// else -> {}
// }
// }
// }
-// binding.alphabets.invalidate()
+// }
+// WorkersDb.getRealm().apply {
+// var newQ = query()
+// contactQuery = newQ.sort(Pair("touchCount", Sort.DESCENDING),Pair("lastedTouchDateTime",Sort.DESCENDING)).find()
+// contactQuery?.let {
+// if (it.size > 0) {
+// contactList.clear()
+// contactList.addAll(copyFromRealm(it).toList())
+// binding.contactList.post {
+// if (contactList.size > 0) {
+// contactAdapter?.updateData(contactList)
+// }
+// }
+// }
+// }
+//
+// }
+// true
+// }
+// binding.searchInput.doOnTextChanged{ inputText, _, _, _ ->
+// binding.searchInput.text?.let { binding.searchInput.setSelection(it.length) }
+// filterAppsList(inputText.toString())
+// }
+//// return binding.root
+// }
+// fun isPackageInstalled( packageName : String, packageManager : PackageManager?) : Boolean{
+// try {
+// packageManager!!.getPackageInfo(packageName, 0)
+// return true;
+// } catch ( e : Exception) {
+// return false;
+// }
+// }
+//
+// fun sendMsg(scheme : String? = null , pkg : String? = null) {
+// var postIntent : Intent? = null
+// if (scheme != null && scheme.length > 1) {
+// postIntent = Intent(Intent.ACTION_VIEW,Uri.parse(scheme))
+// } else {
+// postIntent = Intent(Intent.ACTION_SEND)
+// postIntent.type = "text/plain"
+// postIntent.putExtra(Intent.EXTRA_TEXT, "${getInputText()}")
+// }
+// if (pkg != null && pkg.length > 1) {
+// postIntent?.setPackage(pkg)
+// startActivity(postIntent)
+// } else {
+// val chooserTitle = "바로 보냄"
+// startActivity(Intent.createChooser(postIntent, chooserTitle))
+// }
+// }
+//
+// val appNames = hashSetOf()
+// val contactList = arrayListOf()
+//
+// fun openSearchApps(schemeString : String, pakage : String? = null) {
+// val gmmIntentUri = Uri.parse(schemeString)
+// val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
+// pakage?.let {
+// mapIntent.setPackage(pakage)
+// WorkersDb.logAppUsage(pakage, UsageLogType.APP, UsageUpdateType.DATETIME)
+// }
+// startActivity(mapIntent)
+// }
+//
+//
+// fun checkResult(keyword: String) {
+// openSearchMenus(keyword) {
+// registCancelSearch()
+// }
+// }
+//
+//
+//
+// fun runonUi(invoke : () -> Unit) {
+// Handler(Looper.getMainLooper()).run {
+// try {
+// invoke.invoke()
+// }catch (e : Exception) {
+// e.printStackTrace()
// }
// }
- }
-
-
- private fun filterAppsList(searchString: String) {
- fetchApps(searchString)
- registCancelSearch()
- }
-
- fun openSearch() {
- try {
- binding.searchInput.apply {
- visibility = VISIBLE
- requestFocus()
- let {
- (getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager)?.showSoftInput(
- it,
- InputMethodManager.SHOW_IMPLICIT
- )
- }
- }
- } catch (e : UninitializedPropertyAccessException) {
-
- }
- }
-
- /* clear search string, hide keyboard and search box */
- private fun closeSearch() {
- binding.searchInput.apply {
- let {
- text?.clear()
- (getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager)?.hideSoftInputFromWindow(it.windowToken, 0)
- }
- }
- }
-
-}
-
+// }
+//
+//
+// override fun onResume() {
+// super.onResume()
+// Blog.LOGE("onResume")
+// fetchApps()
+//
+// binding.appsCount.visibility = if (PrefBoolean.showAppResultCount.get(false)) VISIBLE else GONE
+//
+// PrefBoolean.openWithKayboard.get().letTrue { openSearch() }
+// registCancelSearch()
+// }
+//
+// val chechHandler = Handler(Looper.getMainLooper())
+//
+// val cancelSearch = Runnable {
+// finish()
+// }
+//
+// fun registCancelSearch() {
+// chechHandler.removeCallbacks(cancelSearch)
+// chechHandler.postDelayed(cancelSearch, 15000L)
+// }
+//
+// fun clearCancelSearch() {
+// chechHandler.removeCallbacks(cancelSearch)
+// }
+//
+// override fun onPause() {
+// super.onPause()
+// closeSearch()
+// }
+//
+// private fun setLayout() {
+// binding.appsList.layoutManager = GridLayoutManager(this, 2, GridLayoutManager.HORIZONTAL,false)
+// binding.contactList.layoutManager = GridLayoutManager(this, 2, GridLayoutManager.HORIZONTAL,false)
+// /* initialize apps list adapter */
+// 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(PrefLong.maxQueryCount.get(18L).toInt()).find()
+// appQuery?.let {
+// if(it.size > 0) {
+// WorkersDb.getRealm().apply {
+// packageList.clear()
+// writeBlocking {
+// it.filter {
+// var installed = isPackageInstalled(it.pkgName ?: "fffffffail", packageManager!!)
+//// it.isInstalled = installed
+// installed
+// }.let { result ->
+// packageList.addAll(copyFromRealm(result))
+// binding.appsList.post { if (result.size > 0) {
+// appsAdapter?.updateData(packageList)
+// }}
+// }
+// }
+// }
+// }
+// }
+// }
+// fetcContact(keyword)
+// }
+//
+//
+// 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)
+// }
+// }
+// contactQuery = newQ.sort(Pair("touchCount", Sort.DESCENDING),Pair("lastedTouchDateTime",Sort.DESCENDING))
+// .limit(PrefLong.maxQueryCount.get(18L).toInt()).find()
+// contactQuery?.let {
+// if (it.size > 0)
+// WorkersDb.getRealm().apply {
+// contactList.clear()
+// contactList.addAll(copyFromRealm(it).toList())
+// binding.contactList.post { if (contactList.size > 0) {
+// contactAdapter?.updateData(contactList)
+// } }
+// }
+// }
+// }
+// }
+//
+//
+//
+//
+// private fun filterAppsList(searchString: String) {
+// fetchApps(searchString)
+// registCancelSearch()
+// }
+//
+// fun openSearch() {
+// try {
+// binding.searchInput.apply {
+// visibility = VISIBLE
+// requestFocus()
+// let {
+// (getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager)?.showSoftInput(
+// it,
+// InputMethodManager.SHOW_IMPLICIT
+// )
+// }
+// }
+// } catch (e : UninitializedPropertyAccessException) {
+//
+// }
+// }
+//
+// /* clear search string, hide keyboard and search box */
+// private fun closeSearch() {
+// binding.searchInput.apply {
+// let {
+// text?.clear()
+// (getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager)?.hideSoftInputFromWindow(it.windowToken, 0)
+// }
+// }
+// }
+//
+//}
+//
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/apps/AppDrawerBottomSheet.kt b/app/src/main/kotlin/bums/lunatic/launcher/apps/AppDrawerBottomSheet.kt
index ef4be267..93753d7b 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/apps/AppDrawerBottomSheet.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/apps/AppDrawerBottomSheet.kt
@@ -37,6 +37,7 @@ import io.realm.kotlin.query.Sort
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
+import java.net.URLEncoder
class AppDrawerBottomSheet : BottomSheetDialogFragment() {
@@ -176,29 +177,74 @@ class AppDrawerBottomSheet : BottomSheetDialogFragment() {
}
}
+ val keyword : String
+ get() {
+ return binding.searchInput.text.toString()
+ }
+
private fun setupSearchButtons() {
// 기존 AppDrawer의 버튼 연결
binding.searchNmap.setOnClickListener {
- openSearchApps("nmap://search?query=${getInputText()}&appname=${BuildConfig.APPLICATION_ID}", "com.nhn.android.nmap")
+ openSearchApps("nmap://search?query=${keyword}&appname=${BuildConfig.APPLICATION_ID}", "com.nhn.android.nmap")
}
binding.searchYoutube.setOnClickListener {
- openSearchApps("https://www.youtube.com/results?search_query=${getInputText()}", "com.google.android.youtube")
+ openSearchApps("https://www.youtube.com/results?search_query=${keyword}", "com.google.android.youtube")
+ }
+ binding.hidden.setOnClickListener {
+ binding.hidden.isSelected = !binding.hidden.isSelected
+ Blog.LOGE("binding.hidden.isSelected >>> ${binding.hidden.isSelected}")
+ filterAppsList(keyword)
+
+ }
+ binding.searchTaxi.setOnClickListener {
+ openSearchApps("kakaot://taxi?goalx=${URLEncoder.encode("37.467696")}&goaly=${URLEncoder.encode("127.101063")}","com.kakao.taxi")
+ }
+ binding.searchMusic.setOnClickListener {
+ try {
+ // 스포티파이는 별도의 URL 인코딩 없이도 잘 동작하지만, 안전하게 인코딩 추천
+ val encodedKeyword = URLEncoder.encode(keyword, "UTF-8")
+ val uri = Uri.parse("spotify:search:$encodedKeyword")
+
+ val intent = Intent(Intent.ACTION_VIEW, uri)
+ // 명시적으로 스포티파이 앱 지정 (웹 브라우저로 빠지는 것 방지)
+ intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
+
+ requireContext().startActivity(intent)
+ } catch (e: Exception) {
+ // 앱이 없을 경우 플레이스토어로 이동
+ val marketIntent = Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.spotify.music"))
+ marketIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
+ requireContext().startActivity(marketIntent)
+ }
+ }
+
+ binding.searchTmap.setOnClickListener {
+ try {
+ // 한글 검색어를 위해 URL 인코딩 필수
+ val encodedKeyword = URLEncoder.encode(keyword, "UTF-8")
+ val uri = Uri.parse("tmap://search?name=$encodedKeyword")
+ val intent = Intent(Intent.ACTION_VIEW, uri)
+ requireContext().startActivity(intent)
+ } catch (e: Exception) {
+ // 앱이 없을 경우 스토어로 이동
+ val marketIntent = Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.skt.tmap.ku"))
+ requireContext().startActivity(marketIntent)
+ }
}
binding.searchGoogle.setOnClickListener {
val intent = Intent(Intent.ACTION_WEB_SEARCH).apply {
- putExtra(SearchManager.QUERY, getInputText()) // 질문 전달
+ putExtra(SearchManager.QUERY, keyword) // 질문 전달
}
if (intent.resolveActivity(requireContext().packageManager) != null) {
startActivity(intent)
}
}
binding.searchNaver.setOnClickListener {
- openSearchApps("https://search.naver.com/search.naver?where=nexearch&query=${getInputText()}", "com.nhn.android.search")
+ openSearchApps("https://search.naver.com/search.naver?where=nexearch&query=${keyword}", "com.nhn.android.search")
}
// ... 나머지 버튼들도 동일하게 추가 ...
}
- private fun getInputText() = binding.searchInput.text.toString()
private fun openSearchApps(schemeString: String, packageName: String? = null) {
try {
@@ -294,7 +340,13 @@ class AppDrawerBottomSheet : BottomSheetDialogFragment() {
}
- val mainAppList = allApps.filter { it.visibilityMode == 0}
+ val mainAppList = allApps.filter {
+ if (binding.hidden.isSelected) {
+ true
+ } else {
+ it.visibilityMode == 0
+ }
+ }
var contactQuery = realm.query()
@@ -315,7 +367,13 @@ class AppDrawerBottomSheet : BottomSheetDialogFragment() {
contactQuery = contactQuery.sort("touchCount", Sort.DESCENDING).limit(10)
val contactsResult = contactQuery.find()
- val contactsList = contactsResult.map { realm.copyFromRealm(it) }
+ val contactsList = contactsResult.map { realm.copyFromRealm(it) }.filter {
+ if (binding.hidden.isSelected) {
+ true
+ } else {
+ it.visibilityMode == 0
+ }
+ }
Blog.LOGE("unifiedList >>> ${unifiedList.size}")
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/apps/AppMenu.kt b/app/src/main/kotlin/bums/lunatic/launcher/apps/AppMenu.kt
index bbacf2cf..c36177d3 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/apps/AppMenu.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/apps/AppMenu.kt
@@ -24,6 +24,7 @@ import android.content.ActivityNotFoundException
import android.content.ComponentName
import android.content.Context
import android.content.Intent
+import android.content.SharedPreferences
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.graphics.Rect
@@ -43,15 +44,14 @@ import android.widget.Toast
import androidx.core.content.FileProvider
import androidx.core.content.pm.PackageInfoCompat
import androidx.core.widget.doOnTextChanged
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.R
-import bums.lunatic.launcher.apps.AppDrawer.Companion.appNamesPrefs
import bums.lunatic.launcher.databinding.ActivityBrowserDialogBinding
import bums.lunatic.launcher.databinding.AppInfoDialogBinding
import bums.lunatic.launcher.databinding.AppMenuBinding
import bums.lunatic.launcher.helpers.UniUtils.Companion.copyToClipboard
import bums.lunatic.launcher.helpers.UniUtils.Companion.screenHeight
import bums.lunatic.launcher.helpers.UniUtils.Companion.screenWidth
+import bums.lunatic.launcher.home.NeoRssActivity.Companion.lActivity
import bums.lunatic.launcher.model.AppInfo
import bums.lunatic.launcher.utils.JamoUtils
import bums.lunatic.launcher.workers.UsageLogType
@@ -78,7 +78,10 @@ internal class AppMenu : BottomSheetDialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = AppMenuBinding.inflate(inflater, container, false)
-
+// @JvmStatic
+ var settingsPrefs: SharedPreferences? = null
+// @JvmStatic
+ var appNamesPrefs: SharedPreferences? = null
/* get package name from fragment's tag */
packageName = tag.toString()
packageManager = requireContext().packageManager
@@ -130,39 +133,40 @@ internal class AppMenu : BottomSheetDialogFragment() {
binding.alterName.setText(app.koreanName)
binding.recommend.isChecked = app.blockRecommend
binding.listVisible.isChecked = app.visibilityMode == 1
+
+
+ binding.totalTouch.setOnClickListener {
+ WorkersDb.logAppUsage(packageName, UsageLogType.APP,UsageUpdateType.COUNT)
+ }
+ binding.lastTouchDate.setOnClickListener {
+ WorkersDb.logAppUsage(packageName, UsageLogType.APP,UsageUpdateType.DATETIME)
+ }
+
+ binding.alterName.doOnTextChanged { text, start, before, count ->
+ WorkersDb.getRealm().apply {
+ writeBlocking {
+ var result = query("pkgName == $0",packageName).find()
+ if(result.size > 0) {
+ val app = result.first()
+ app.koreanName = text.toString()
+ app.appNameChosung = JamoUtils.split(app.koreanName).joinToString("")
+ }
+ }
+ }
+ }
+ /* set application name and package name */
+ binding.appName.apply {
+ setText(app.appName)
+ hint = defAppName
+
+ }
+
+ binding.appPackage.text = packageName
}
}
}
}
-
- binding.totalTouch.setOnClickListener {
- WorkersDb.logAppUsage(packageName, UsageLogType.APP,UsageUpdateType.COUNT)
- }
- binding.lastTouchDate.setOnClickListener {
- WorkersDb.logAppUsage(packageName, UsageLogType.APP,UsageUpdateType.DATETIME)
- }
-
- binding.alterName.doOnTextChanged { text, start, before, count ->
- WorkersDb.getRealm().apply {
- writeBlocking {
- var result = query("pkgName == $0",packageName).find()
- if(result.size > 0) {
- val app = result.first()
- app.koreanName = text.toString()
- app.appNameChosung = JamoUtils.split(app.koreanName).joinToString("")
- }
- }
- }
- }
- /* set application name and package name */
- binding.appName.apply {
- setText(appNamesPrefs?.getString(packageName, defAppName))
- hint = defAppName
-
- }
-
- binding.appPackage.text = packageName
return binding.root
}
@@ -219,10 +223,10 @@ internal class AppMenu : BottomSheetDialogFragment() {
if (text!!.isBlank()) setText(defAppName)
else setText(text!!.trim())
- if (text.toString() == defAppName) appNamesPrefs?.edit()!!.remove(packageName).apply()
- else appNamesPrefs?.edit()!!.putString(packageName, text.toString()).apply()
-
- (requireParentFragment() as AppDrawer).fetchApps()
+// if (text.toString() == defAppName) appNamesPrefs?.edit()!!.remove(packageName).apply()
+// else appNamesPrefs?.edit()!!.putString(packageName, text.toString()).apply()
+//
+// (requireParentFragment() as AppDrawer).fetchApps()
}
}
}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/apps/AppsAdapter.kt b/app/src/main/kotlin/bums/lunatic/launcher/apps/AppsAdapter.kt
index d7e8114d..c1f9f9c8 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/apps/AppsAdapter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/apps/AppsAdapter.kt
@@ -28,7 +28,7 @@ import android.widget.TextView
import androidx.fragment.app.FragmentManager
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
+import bums.lunatic.launcher.LauncherActivity.Companion.sActivity
import bums.lunatic.launcher.R
import bums.lunatic.launcher.databinding.AppsChildBinding
import bums.lunatic.launcher.model.AppInfo
@@ -50,7 +50,7 @@ class AppsViewHolder(var view: AppsChildBinding) : RecyclerView.ViewHolder(view.
loadIconAsync(appIconTwo, appinfo.pkgName)
childTextview.apply {
gravity = Gravity.CENTER
- setTextSize(TypedValue.COMPLEX_UNIT_PX, lActivity!!.resources.getDimension(R.dimen.twelve))
+ setTextSize(TypedValue.COMPLEX_UNIT_PX, sActivity!!.resources.getDimension(R.dimen.twelve))
}
}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/apps/ContactMenu.kt b/app/src/main/kotlin/bums/lunatic/launcher/apps/ContactMenu.kt
index cb43abc4..1cacad43 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/apps/ContactMenu.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/apps/ContactMenu.kt
@@ -25,7 +25,7 @@ import android.provider.ContactsContract
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
+import bums.lunatic.launcher.LauncherActivity.Companion.sActivity
import bums.lunatic.launcher.databinding.ContactMenuBinding
import bums.lunatic.launcher.model.SimpleContact
import bums.lunatic.launcher.utils.Blog
@@ -73,7 +73,7 @@ internal class ContactMenu : BottomSheetDialogFragment() {
WorkersDb.logAppUsage(contactId, UsageLogType.CONTACT,UsageUpdateType.DATETIME)
}
- val resolver = lActivity!!.contentResolver
+ val resolver = sActivity!!.contentResolver
val phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
val projection = arrayOf(
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/apps/SmmsMenu.kt b/app/src/main/kotlin/bums/lunatic/launcher/apps/SmmsMenu.kt
index 9cb89e12..6f26193a 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/apps/SmmsMenu.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/apps/SmmsMenu.kt
@@ -6,7 +6,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
+import bums.lunatic.launcher.LauncherActivity.Companion.sActivity
import bums.lunatic.launcher.databinding.ContactMenuBinding
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
@@ -25,7 +25,7 @@ class SmmsMenu: BottomSheetDialogFragment() {
/* get package name from fragment's tag */
msgId = tag.toString()
- val resolver = lActivity!!.contentResolver
+ val resolver = sActivity!!.contentResolver
return binding.root
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/feeds/SystemStats.kt b/app/src/main/kotlin/bums/lunatic/launcher/feeds/SystemStats.kt
index fa60fffd..d9f10a8f 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/feeds/SystemStats.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/feeds/SystemStats.kt
@@ -32,7 +32,7 @@ import android.view.LayoutInflater
import android.view.View
import androidx.appcompat.widget.LinearLayoutCompat
import androidx.core.content.ContextCompat
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
+import bums.lunatic.launcher.LauncherActivity.Companion.sActivity
import bums.lunatic.launcher.R
import bums.lunatic.launcher.databinding.ChildSysInfoBinding
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_TEMP_UNIT
@@ -53,8 +53,8 @@ import kotlin.math.roundToInt
internal class SystemStats {
private val toGb = 1.07374182E9f
- private fun string(id: Int) : String { return lActivity!!.getString(id) }
- private val inflater : LayoutInflater get() { return lActivity!!.layoutInflater }
+ private fun string(id: Int) : String { return sActivity!!.getString(id) }
+ private val inflater : LayoutInflater get() { return sActivity!!.layoutInflater }
/* ram info */
fun ram(ramParent: LinearLayoutCompat) {
@@ -137,7 +137,7 @@ internal class SystemStats {
/* external storage */
fun extStorage(extParent: LinearLayoutCompat) {
- val extStorages = ContextCompat.getExternalFilesDirs(lActivity!!, null)
+ val extStorages = ContextCompat.getExternalFilesDirs(sActivity!!, null)
/* sd card is available */
if (extStorages.size > 1) {
extParent.removeAllViews()
@@ -175,7 +175,7 @@ internal class SystemStats {
val totalRootStorage = StatFs(Environment.getRootDirectory().path).blockCountLong *
StatFs(Environment.getRootDirectory().path).blockSizeLong / toGb
- val batteryIntent = lActivity!!.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
+ val batteryIntent = sActivity!!.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
val batteryTemp = batteryIntent!!.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0).toFloat() / 10
val voltage = batteryIntent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, 0).toFloat() / 1000
@@ -199,13 +199,13 @@ internal class SystemStats {
private val memoryInfo: ActivityManager.MemoryInfo get() {
val memoryInfo = ActivityManager.MemoryInfo()
- val activityManager = lActivity!!.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+ val activityManager = sActivity!!.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
activityManager.getMemoryInfo(memoryInfo)
return memoryInfo
}
private val tempUnit: Int get() =
- lActivity!!.getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_TEMP_UNIT, 0)
+ sActivity!!.getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_TEMP_UNIT, 0)
private fun longToString(long: Long) : String {
var seconds = (long.toDouble() / 1000).roundToInt()
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/feeds/rss/RssAdapter.kt b/app/src/main/kotlin/bums/lunatic/launcher/feeds/rss/RssAdapter.kt
index 66df6a80..3b36a9ad 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/feeds/rss/RssAdapter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/feeds/rss/RssAdapter.kt
@@ -28,7 +28,6 @@ import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.databinding.ListItemWithBinding
import bums.lunatic.launcher.home.adapters.RssItemDiffUtil
import bums.lunatic.launcher.model.RssDataInterface
@@ -105,7 +104,7 @@ internal class RssAdapter(private val context: Context) :
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
mapIntent.setPackage("com.opera.browser")
- lActivity?.startActivity(mapIntent)
+ context.startActivity(mapIntent)
}
fun updateData(newList: List) {
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 2d1b529d..9c0bb0d3 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/helpers/ForeGroundService.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/helpers/ForeGroundService.kt
@@ -29,7 +29,6 @@ import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import bums.lunatic.launcher.LauncherActivity
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.R
import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.workers.TaskAggregator
@@ -252,8 +251,8 @@ class ForeGroundService : Service() {
fun workmanager() : WorkManager? {
- if (mWorkManager == null && lActivity != null) {
- mWorkManager = WorkManager.getInstance(lActivity!!)
+ if (mWorkManager == null && applicationContext != null) {
+ mWorkManager = WorkManager.getInstance(applicationContext)
}
return mWorkManager
}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/helpers/UniUtils.kt b/app/src/main/kotlin/bums/lunatic/launcher/helpers/UniUtils.kt
index 800b6c11..a8cded74 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/helpers/UniUtils.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/helpers/UniUtils.kt
@@ -37,7 +37,7 @@ import androidx.appcompat.widget.LinearLayoutCompat
import androidx.biometric.BiometricManager
import androidx.biometric.BiometricManager.BIOMETRIC_SUCCESS
import androidx.biometric.BiometricPrompt
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
+import bums.lunatic.launcher.LauncherActivity.Companion.sActivity
import bums.lunatic.launcher.R
import bums.lunatic.launcher.helpers.Constants.Companion.ACCESSIBILITY_SERVICE_LOCK_SCREEN
import bums.lunatic.launcher.helpers.Constants.Companion.AUTHENTICATOR_TYPE
@@ -51,13 +51,13 @@ internal class UniUtils {
/* get display width */
val screenWidth: Int get() {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
- val windowMetrics = lActivity!!.windowManager.currentWindowMetrics
+ val windowMetrics = sActivity!!.windowManager.currentWindowMetrics
val insets = windowMetrics.windowInsets
.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
windowMetrics.bounds.width() - insets.left - insets.right
} else {
val displayMetrics = DisplayMetrics()
- @Suppress("DEPRECATION") lActivity!!.windowManager.defaultDisplay.getMetrics(displayMetrics)
+ @Suppress("DEPRECATION") sActivity!!.windowManager.defaultDisplay.getMetrics(displayMetrics)
displayMetrics.widthPixels
}
}
@@ -65,13 +65,13 @@ internal class UniUtils {
/* get display height */
val screenHeight: Int get() {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
- val windowMetrics = lActivity!!.windowManager.currentWindowMetrics
+ val windowMetrics = sActivity!!.windowManager.currentWindowMetrics
val insets = windowMetrics.windowInsets
.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
windowMetrics.bounds.height() - insets.top - insets.bottom
} else {
val displayMetrics = DisplayMetrics()
- @Suppress("DEPRECATION") lActivity!!.windowManager.defaultDisplay.getMetrics(displayMetrics)
+ @Suppress("DEPRECATION") sActivity!!.windowManager.defaultDisplay.getMetrics(displayMetrics)
displayMetrics.heightPixels
}
}
@@ -79,7 +79,7 @@ internal class UniUtils {
/* copy texts to clipboard */
fun copyToClipboard(context: Context, copiedString: String?) {
val clipBoard =
- lActivity!!.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
+ context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clipBoard.setPrimaryClip(ClipData.newPlainText("", copiedString))
Toast.makeText(context, context.getString(R.string.copied_message), Toast.LENGTH_SHORT).show()
}
@@ -129,7 +129,7 @@ internal class UniUtils {
/* check if the device is connected to the internet */
val isNetworkAvailable: Boolean get() {
val connectivityManager =
- lActivity!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+ sActivity!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
@Suppress("DEPRECATION") val activeNetworkInfo = connectivityManager.activeNetworkInfo
@Suppress("DEPRECATION") return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting
}
@@ -144,7 +144,7 @@ internal class UniUtils {
fun biometricPromptInfo(title: String): BiometricPrompt.PromptInfo {
return BiometricPrompt.PromptInfo.Builder()
.setTitle(title)
- .setSubtitle(lActivity!!.getString(R.string.authentication_subtitle))
+ .setSubtitle(sActivity!!.getString(R.string.authentication_subtitle))
.setConfirmationRequired(true)
.setAllowedAuthenticators(AUTHENTICATOR_TYPE)
.build()
@@ -170,7 +170,7 @@ internal class UniUtils {
policy.lockNow()
} catch (exception: SecurityException) {
/* open device admin manager screen */
- lActivity!!.startActivity(
+ sActivity!!.startActivity(
Intent().setComponent(
ComponentName(
"com.android.settings",
@@ -226,10 +226,10 @@ internal class UniUtils {
/* lock screen using accessibility service */
private fun lockAccessibility() {
- if (LockService().isAccessibilityServiceEnabled(lActivity!!.applicationContext)) {
+ if (LockService().isAccessibilityServiceEnabled(sActivity!!.applicationContext)) {
try {
- lActivity!!.startService(
- Intent(lActivity!!.applicationContext, LockService::class.java)
+ sActivity!!.startService(
+ Intent(sActivity!!.applicationContext, LockService::class.java)
.setAction(ACCESSIBILITY_SERVICE_LOCK_SCREEN)
)
} catch (exception: Exception) {
@@ -237,7 +237,7 @@ internal class UniUtils {
}
} else {
/* open accessibility service screen */
- lActivity!!.startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS))
+ sActivity!!.startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS))
}
}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt
index 2a4fb1ba..1f39e00a 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt
@@ -2,8 +2,6 @@ package bums.lunatic.launcher.home
import CustomVideoNodeRenderer
import android.app.Dialog
-import android.content.ClipData
-import android.content.ClipboardManager
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
@@ -37,17 +35,16 @@ import android.widget.RadioGroup
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
-import androidx.core.content.ContextCompat.getSystemService
import androidx.core.net.toUri
import androidx.core.view.isVisible
import bums.lunatic.launcher.BookmarkUploader
-import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
import bums.lunatic.launcher.R
+import bums.lunatic.launcher.home.NeoRssActivity.Companion.getRuntime
import bums.lunatic.launcher.model.Dotax
import bums.lunatic.launcher.model.DotaxArticles
import bums.lunatic.launcher.model.getRssData
-import bums.lunatic.launcher.tokiz.PortMessage
-import bums.lunatic.launcher.tokiz.view.BWebview
+import bums.lunatic.launcher.home.tokiz.PortMessage
+import bums.lunatic.launcher.home.tokiz.view.BWebview
import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.utils.CommonUtils
import bums.lunatic.launcher.workers.WorkersDb
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/NeoRssActivity.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/NeoRssActivity.kt
new file mode 100644
index 00000000..e5a6df6e
--- /dev/null
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/NeoRssActivity.kt
@@ -0,0 +1,654 @@
+package bums.lunatic.launcher.home
+
+import android.annotation.SuppressLint
+import android.app.SearchManager
+import android.content.Intent
+import android.content.res.Configuration
+import android.graphics.Color
+import android.os.Build
+import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
+import android.view.KeyEvent
+import android.view.KeyEvent.ACTION_UP
+import android.view.KeyEvent.KEYCODE_BUTTON_A
+import android.view.KeyEvent.KEYCODE_BUTTON_B
+import android.view.KeyEvent.KEYCODE_BUTTON_SELECT
+import android.view.KeyEvent.KEYCODE_BUTTON_START
+import android.view.KeyEvent.KEYCODE_BUTTON_X
+import android.view.KeyEvent.KEYCODE_BUTTON_Y
+import android.view.KeyEvent.KEYCODE_DPAD_DOWN
+import android.view.KeyEvent.KEYCODE_DPAD_UP
+import android.view.MotionEvent
+import android.view.PointerIcon
+import android.view.View
+import android.view.WindowManager
+import androidx.activity.OnBackPressedCallback
+import androidx.annotation.RequiresApi
+import androidx.core.net.toUri
+import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.isVisible
+import bums.lunatic.launcher.LunaticLauncher
+import bums.lunatic.launcher.R
+import bums.lunatic.launcher.common.CommonActivity
+import bums.lunatic.launcher.databinding.RssActivityBinding
+import bums.lunatic.launcher.helpers.ForeGroundService
+import bums.lunatic.launcher.helpers.HeadsetActionButtonReceiver
+import bums.lunatic.launcher.home.adapters.BookmarkPagerFragment
+import bums.lunatic.launcher.model.RssData
+import bums.lunatic.launcher.model.RssDataType
+import bums.lunatic.launcher.settings.SettingsActivity
+import bums.lunatic.launcher.home.tokiz.Comics
+import bums.lunatic.launcher.home.tokiz.Novels
+import bums.lunatic.launcher.home.tokiz.Perplexity
+import bums.lunatic.launcher.home.tokiz.Webtoons
+import bums.lunatic.launcher.home.tokiz.YouTube
+import bums.lunatic.launcher.utils.Blog
+import bums.lunatic.launcher.utils.beforeDay
+import bums.lunatic.launcher.workers.WorkersDb
+import com.google.android.material.color.DynamicColors
+import com.yausername.ffmpeg.FFmpeg
+import com.yausername.youtubedl_android.YoutubeDL
+import com.yausername.youtubedl_android.YoutubeDLException
+import io.realm.kotlin.ext.query
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import org.json.JSONObject
+import org.mozilla.geckoview.ExperimentDelegate
+import org.mozilla.geckoview.GeckoResult
+import org.mozilla.geckoview.GeckoRuntime
+import org.mozilla.geckoview.GeckoRuntimeSettings
+
+
+open class NeoRssActivity : CommonActivity() {
+
+
+ private lateinit var binding: RssActivityBinding
+
+ companion object {
+ private var sRuntime: GeckoRuntime? = null
+ fun getRuntime() : GeckoRuntime? {
+ lActivity?.initGeckoRuntime()
+ return sRuntime
+ }
+
+
+ var isOpendFold = false
+ val qDayPeriod = 60L * 8L
+
+ @JvmStatic var lActivity: NeoRssActivity? = null
+
+ }
+ var hiddenLoader : HashMap = hashMapOf()
+ fun contentsLoad(url : String){
+ if (isDestroyed == false && isFinishing == false) {
+ url.toUri()?.host?.let { host ->
+ if (!hiddenLoader.contains(host)) {
+ GeckoWeb(this).apply {
+ LunaticLauncher.Companion.mHourlyLogWriter?.writeLog("contentsLoad FIRST_LOAD$host")
+ hiddenLoader.put(host,this)
+ loadUrl(url)
+ }
+ } else {
+ hiddenLoader.get(host)?.loadUrl(url)
+ LunaticLauncher.Companion.mHourlyLogWriter?.writeLog("contentsLoad RELOAD$host")
+ }
+ }
+ }
+ }
+
+ @SuppressLint("MissingSuperCall")
+ override fun onConfigurationChanged(newConfig: Configuration) {
+ super.onConfigurationChanged(newConfig)
+
+ isOpendFold = (newConfig.screenWidthDp * 1.1f) > newConfig.screenHeightDp
+ val nullCursor = PointerIcon.getSystemIcon(this, PointerIcon.TYPE_NULL)
+ binding.root.setPointerIcon(nullCursor)
+ }
+
+ var actionButtonPressX = 0f
+ var actionButtonPressY = 0f
+ var onExit = false
+ var lastAction = MotionEvent.ACTION_HOVER_EXIT
+ override fun dispatchKeyEvent(ev: KeyEvent): Boolean {
+ val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
+ Blog.LOGE("dispatch ev?.device?.name >>> ${ev?.device?.name} , keyCode >> ${ev?.keyCode}")
+
+ if (ev?.device?.name?.contains("SM-031N Mouse") == true) {
+ when(ev.action) {
+ ACTION_UP -> {
+ Blog.LOGE("dispatch dispatchKeyEvent>>> ${ev}")
+ when(ev.keyCode) {
+ KEYCODE_BUTTON_Y->{
+
+ }
+ KEYCODE_BUTTON_X->{
+
+ }
+ KEYCODE_BUTTON_A->{
+ WorkersDb.getRealm().apply {
+ writeBlocking {
+ }
+ }
+ }
+ KEYCODE_BUTTON_B->{
+
+ }
+ KEYCODE_DPAD_DOWN->{
+
+ }
+ KEYCODE_DPAD_UP->{
+
+ }
+ KEYCODE_BUTTON_START->{
+ onClickCenterButton()
+ }
+ KEYCODE_BUTTON_SELECT->{
+ WorkersDb.getRealm().apply {
+ writeBlocking {
+
+ }
+ }
+ }
+ else -> {}
+ }
+ }
+ else->{}
+ }
+ return true
+ }
+ else {
+ val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
+ when(currentFragment) {
+ is Novels -> {
+ if(MotionEvent.ACTION_UP.equals(ev?.action ?: MotionEvent.ACTION_CANCEL) == true) {
+ return when (ev.keyCode) {
+ KeyEvent.KEYCODE_VOLUME_DOWN -> {
+ if(currentFragment is Novels){ currentFragment.actionNextEvent() }
+ true
+ }
+ KeyEvent.KEYCODE_VOLUME_UP -> {
+ if(currentFragment is Novels){ currentFragment.actionPrevEvent() }
+ true
+ }
+ else -> false
+ }
+ } else {
+ return when (ev.keyCode) {
+ KeyEvent.KEYCODE_VOLUME_DOWN -> {
+ true
+ }
+
+ KeyEvent.KEYCODE_VOLUME_UP -> {
+ true
+ }
+
+ else -> false
+ }
+ }
+ }
+ else -> return super.dispatchKeyEvent(ev)
+ }
+ }
+ return super.dispatchKeyEvent(ev)
+ }
+
+ override fun dispatchTrackballEvent(event: MotionEvent?): Boolean {
+ Blog.LOGE("event >>> ${event?.device}")
+ return super.dispatchTrackballEvent(event)
+ }
+
+ @SuppressLint("RestrictedApi")
+ override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean {
+ Blog.LOGE("event >>> ${event.device}")
+ return super.dispatchKeyShortcutEvent(event)
+ }
+
+ fun onClickCenterButton() {
+ WorkersDb.getRealm().apply {
+ writeBlocking {
+ delete(
+ query()
+ .query("pubDate < $0",
+ beforeDay(28)
+ )
+ .query("vote != $0", true).apply {
+ Blog.LOGE("onClickCenterButton DELETE >> ${this.description()}")
+ }.find()
+ )
+ var ddd = copyFromRealm(WorkersDb.getRssQuery("", RssDataType.getExcAdt(),false).limit(100).query("read == $0", 0).query("vote != $0", true).apply {
+ Blog.LOGE("onClickCenterButton SELECT >> ${this.description()}")
+ }.find()).map { it.originPage() }
+ var origin = ddd.first()
+ var jjjj = hashSetOf()
+ jjjj.addAll(ddd)
+ }
+ }
+ }
+ override fun dispatchGenericMotionEvent(ev: MotionEvent?): Boolean {
+ if (ev?.device?.name?.contains("BLE-M3") == true) {
+ Blog.LOGE("keyEvent >>>>> dispatchGenericMotionEvent ${ev}")
+ ev?.action?.let { action ->
+ when(action) {
+ MotionEvent.ACTION_HOVER_ENTER -> {
+ return false
+ }
+ MotionEvent.ACTION_HOVER_MOVE ->{
+ if(lastAction == MotionEvent.ACTION_HOVER_MOVE) {
+ Blog.LOGE("ACTION_HOVER_MOVE Click")
+ }
+ return false
+ }
+ MotionEvent.ACTION_BUTTON_PRESS ->{
+ if (actionButtonPressX * actionButtonPressY == 0f) {
+ actionButtonPressX = ev.x ?: 0f
+ actionButtonPressY = ev.y ?: 0f
+ }
+// if (onExit) return true
+ return false
+ }
+ MotionEvent.ACTION_BUTTON_RELEASE -> {
+ if (actionButtonPressX == ev.x && actionButtonPressY == ev.y) {
+// Blog.LOGE("DisplayUtil.width >>> ${DisplayUtil.width} ${actionButtonPressX}")
+// Blog.LOGE("DisplayUtil.width >>> ${DisplayUtil.height} ${actionButtonPressY}")
+ if(actionButtonPressX.toInt() == 480 && actionButtonPressY < 2000) {
+ Blog.LOGE("Arrow Center Click")
+ onClickCenterButton()
+ } else if(ev.y > 2000) {
+
+ }
+ } else if (actionButtonPressY == ev.y) {
+ if (actionButtonPressX.minus(ev.x ?: 0f) > 0f) {
+ Blog.LOGE("Arrow Right Click")
+ } else {
+ Blog.LOGE("Arrow Left Click")
+ }
+ } else {
+ if (actionButtonPressY.minus(ev.y ?: 0f) > 0f) {
+ Blog.LOGE("Arrow Down Click")
+ } else {
+ Blog.LOGE("Arrow Up Click")
+ }
+ }
+// if (onExit) return true
+ return false
+ }
+ MotionEvent.ACTION_HOVER_EXIT -> {
+ actionButtonPressX = 0f
+ actionButtonPressY = 0f
+ onExit = true
+ return false
+ }
+ else -> {return false}
+ }.apply {
+ lastAction = action
+ }
+ }
+ }
+ return super.dispatchGenericMotionEvent(ev)
+ }
+
+ fun floatClick(v : View) {
+ Blog.LOGE("v >>> ${v}")
+ showContents(v.id)
+ }
+
+ override fun onNewIntent(intent: Intent) {
+ Blog.LOGE("onNewIntent intent >> ${intent}")
+ if(intent?.action?.equals(Intent.ACTION_SEND) == true &&
+ intent?.hasExtra(Intent.EXTRA_TEXT) == true) {
+ intent?.getStringExtra(Intent.EXTRA_TEXT)?.let {
+ if(it.startsWith("http") == false) {
+ it.split("http").forEach { string ->
+ if(string.startsWith("http")) {
+ try {
+ string.toUri()?.let { uri ->
+ Blog.LOGE("onNewIntent string uri.lastPathSegment >>>>> ${uri.host}")
+ Blog.LOGE("onNewIntent string uri.lastPathSegment >>>>> ${uri.lastPathSegment}")
+ }
+ } catch (e: Exception) {
+
+ }
+ }
+ }
+ } else {
+ try {
+ it.toUri()?.let { uri ->
+ Blog.LOGE("onNewIntent it uri.lastPathSegment >>>>> ${uri.host}")
+ Blog.LOGE("onNewIntent it uri.lastPathSegment >>>>> ${uri.lastPathSegment}")
+ }
+ } catch (e: Exception) {
+
+ }
+ }
+ }
+ } else if (intent?.action == Intent.ACTION_WEB_SEARCH) {
+ openWithIntent(intent)
+ } else {
+ Blog.LOGE("onNewIntent intent?.hasExtra >> ${intent?.hasExtra(Intent.EXTRA_STREAM)}")
+
+
+ if (intent?.action?.equals(Intent.ACTION_MAIN) == true && intent.categories.contains(
+ Intent.CATEGORY_HOME
+ ) && intent.hasExtra("android.intent.extra.EXTRA_START_REASON") && intent.getStringExtra(
+ "android.intent.extra.EXTRA_START_REASON"
+ ).equals("startDockOrHome")
+ ) {
+
+ } else {
+ intent?.extras?.keySet()?.forEach {
+ try {
+ Blog.LOGE(
+ "onNewIntent :: key >> ${it} :: value >> ${
+ intent?.extras?.getString(
+ it
+ )
+ }"
+ )
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+
+ }
+ }
+ }
+ super.onNewIntent(intent)
+ }
+
+ private fun openWithIntent(intent: Intent){
+ Blog.LOGE("intent >> ${intent}")
+
+ intent.getStringExtra(SearchManager.QUERY)?.let { query->
+ Blog.LOGE("intent >> ${query}")
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, RssHome().apply {
+ arguments = Bundle().apply {
+ putString(SearchManager.QUERY, query)
+ }
+ })
+ .commit()
+ }
+ }
+
+
+ @SuppressLint("NewApi", "MissingPermission", "ClickableViewAccessibility")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ installSplashScreen()
+ super.onCreate(savedInstanceState)
+ try {
+ YoutubeDL.getInstance().init(this)
+ FFmpeg.getInstance().init(this);
+ CoroutineScope(Dispatchers.IO).launch {
+ YoutubeDL.getInstance().updateYoutubeDL(this@NeoRssActivity)
+ }
+ } catch (e: YoutubeDLException) {
+ Blog.LOGE("failed to initialize youtubedl-android", e)
+ }
+
+ val intent = Intent(this, ForeGroundService::class.java)
+ this.startForegroundService(intent)
+// 1. 시스템 바 공간을 앱이 차지하도록 설정 (상태바 뒤로 레이아웃 확장)
+ WindowCompat.setDecorFitsSystemWindows(window, false)
+
+ // 2. 상태바 색상을 투명하게 변경 (필요한 경우)
+ window.statusBarColor = Color.TRANSPARENT
+
+ // (선택 사항) 내비게이션 바도 투명하게 하고 싶다면
+ window.navigationBarColor = Color.TRANSPARENT
+
+
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
+ lActivity = this
+ DynamicColors.applyToActivityIfAvailable(this)
+ binding = RssActivityBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ HeadsetActionButtonReceiver.register(this)
+ ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets ->
+ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
+ view.setPadding(insets.left, insets.top, insets.right, insets.bottom)
+ WindowInsetsCompat.CONSUMED
+ }
+
+ handleBackPress()
+ updateLocationService()
+
+
+// showContents(binding.feeds.id)
+ binding.floatingActionMenu.setOnTouchListener { v: View, e: MotionEvent ->
+ if (binding.floatingActionMenu.isOpened) {
+ binding.floatingActionMenu.close(true)
+ return@setOnTouchListener true
+ }
+ return@setOnTouchListener false
+ }
+ binding.floatingActionMenu.setOnMenuButtonClickListener { v->
+ Blog.LOGE("v >> ${v}")
+ showContents(v.id)
+ }
+
+ if (intent?.action == Intent.ACTION_WEB_SEARCH) {
+ openWithIntent(intent)
+ }
+ val nullCursor = PointerIcon.getSystemIcon(this, PointerIcon.TYPE_NULL)
+ binding.root.setPointerIcon(nullCursor)
+ binding.share.setOnClickListener {
+ if (binding.currentAddress.text.length > 5) {
+ val sendIntent: Intent = Intent().apply {
+ setAction(Intent.ACTION_SEND)
+ (binding.currentAddress.tag as? String)?.let{putExtra(Intent.EXTRA_TITLE, it)}
+ putExtra(Intent.EXTRA_TEXT, binding.currentAddress.text)
+ setType("text/plain")
+ }
+ val shareIntent = Intent.createChooser(sendIntent, "링크 공유하기")
+ startActivity(shareIntent)
+ }
+ }
+ showContents(R.id.feeds)
+ }
+
+ override fun onPause() {
+ super.onPause()
+
+ }
+
+
+
+ // LauncherActivity 클래스 멤버 변수 추가
+ private var isDraggingWidget = false
+ private var currentDragView: View? = null
+ private var lastTouchX = 0f
+ private var lastTouchY = 0f
+
+
+
+ fun showContents(id : Int) {
+ binding.fragmentLayer.visibility = View.VISIBLE
+ binding.fragmentContainer.visibility = View.VISIBLE
+ binding.controllPanel.visibility = View.VISIBLE
+ binding.floatingActionMenu.visibility = View.VISIBLE
+ when(id) {
+ R.id.feeds -> {
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, RssHome())
+ .commit()
+ }
+ R.id.books ->{
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, Novels())
+ .commit()
+ }
+
+ R.id.webtoons ->{
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, Webtoons())
+ .commit()
+ }
+ R.id.comics ->{
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, Comics())
+ .commit()
+ }
+ R.id.youtube ->{
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, YouTube())
+ .commit()
+ }
+ R.id.perplexity ->{
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, Perplexity())
+ .commit()
+ }
+ R.id.zota ->{
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, BookmarkPagerFragment())
+ .commit()
+ }
+ R.id.setting ->{
+ startActivity(Intent(this, SettingsActivity::class.java))
+ }
+ R.id.close ->{
+ supportFragmentManager.findFragmentById(R.id.fragment_container)?.let {
+ supportFragmentManager.beginTransaction()
+ .remove(it)
+ .commit()
+ binding.fragmentLayer.visibility = View.GONE
+ binding.fragmentContainer.visibility = View.GONE
+ binding.controllPanel.visibility = View.GONE
+ binding.floatingActionMenu.visibility = View.GONE
+ }
+
+ }
+ else -> {}
+ }
+ binding.floatingActionMenu.close(false)
+ }
+
+ private fun initGeckoRuntime() {
+ if (sRuntime == null) {
+ try {
+ sRuntime = GeckoRuntime.create(this, GeckoRuntimeSettings.Builder()
+ .extensionsProcessEnabled(true)
+ .extensionsWebAPIEnabled(true)
+ .experimentDelegate(experimentDelegate)
+ .debugLogging(false)
+ .remoteDebuggingEnabled(true).build())
+ } catch (e : Exception) {
+ e.printStackTrace()
+
+ }
+ }
+ }
+
+ override fun onTouchEvent(event: MotionEvent?): Boolean {
+ Blog.LOGE("event >>> ${event}")
+ return super.onTouchEvent(event)
+ }
+
+ override fun onStart() {
+ super.onStart()
+ }
+
+ override fun onStop() {
+ super.onStop()
+ }
+
+ override fun onDestroy() {
+ try {
+ sRuntime?.shutdown()
+ sRuntime = null
+ } catch (e: Exception) { e.printStackTrace() }
+
+ // appWidgetHost?.stopListening() // 이 줄은 제거하고 onStop으로 이동
+ super.onDestroy()
+ }
+
+
+
+ @RequiresApi(Build.VERSION_CODES.O_MR1)
+ override fun onResume() {
+ super.onResume()
+ Blog.LOGE("LauncherActivity onResume")
+ }
+
+ private fun openSearch() {
+ val searchManager = getSystemService(SEARCH_SERVICE) as SearchManager
+ val searchableInfo = searchManager.getSearchableInfo(componentName)
+ if (searchableInfo != null) {
+ val intent = Intent(Intent.ACTION_SEARCH).apply {
+// setSearchableInfo(searchableInfo)
+ setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ }
+ startActivity(intent)
+ } else {
+ // 검색 가능한 앱이 없을 경우 처리
+ }
+ }
+
+
+ /* alternative of deprecated onBackPressed method */
+ private fun handleBackPress() {
+ onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
+ override fun handleOnBackPressed() {
+ val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
+ if (currentFragment == null) showContents(R.id.close)
+ when(currentFragment) {
+ is RssHome ->{
+ if (currentFragment.binding.layoutRssSummary.root.isVisible) {
+ currentFragment.openGecko(rssData = currentFragment.randomOrNull())
+ } else {
+ currentFragment.doNextPage()
+ }
+ }
+ is YouTube -> {
+ currentFragment.back()
+ }
+ is Novels -> {
+ currentFragment.actionNextEvent(false)
+ }
+ else -> {
+ showContents(R.id.close)
+ }
+ }
+ }
+ })
+ }
+
+ val experimentDelegate = object : ExperimentDelegate {
+ override fun onGetExperimentFeature(feature: String): GeckoResult {
+ Blog.LOGE("onGetExperimentFeature $feature")
+ return super.onGetExperimentFeature(feature)
+ }
+
+ override fun onRecordExposureEvent(feature: String): GeckoResult {
+ Blog.LOGE("onRecordExposureEvent $feature")
+ return super.onRecordExposureEvent(feature)
+ }
+
+ override fun onRecordExperimentExposureEvent(
+ feature: String,
+ slug: String
+ ): GeckoResult {
+ Blog.LOGE("onRecordExperimentExposureEvent $feature , $slug")
+ return super.onRecordExperimentExposureEvent(feature, slug)
+ }
+
+ override fun onRecordMalformedConfigurationEvent(
+ feature: String,
+ part: String
+ ): GeckoResult {
+ Blog.LOGE("onRecordMalformedConfigurationEvent $feature , $part")
+ return super.onRecordMalformedConfigurationEvent(feature, part)
+ }
+ }
+ val callBackHandler = Handler(Looper.getMainLooper())
+
+
+}
+
+
+
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 6ba6cb38..b4d1f77a 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/home/RssHome.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/RssHome.kt
@@ -43,26 +43,24 @@ import androidx.fragment.app.FragmentManager
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
-import bums.lunatic.launcher.LauncherActivity
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.R
import bums.lunatic.launcher.common.letTrue
import bums.lunatic.launcher.databinding.LauncherHomeBinding
import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SETTINGS
+import bums.lunatic.launcher.home.NeoRssActivity.Companion.lActivity
import bums.lunatic.launcher.home.SearchBottomSheet.OnSearchListener
import bums.lunatic.launcher.home.adapters.RssItemAdapter
import bums.lunatic.launcher.home.adapters.SwipeToDeleteCallback
import bums.lunatic.launcher.model.RssData
import bums.lunatic.launcher.model.RssDataType
import bums.lunatic.launcher.model.WeatherForcast
-import bums.lunatic.launcher.tokiz.view.JxEvent
+import bums.lunatic.launcher.home.tokiz.view.JxEvent
import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.utils.SimpleFingerGestures
import bums.lunatic.launcher.utils.beforeDay
import bums.lunatic.launcher.utils.beforeOneDay
import bums.lunatic.launcher.workers.WorkersDb
import bums.lunatic.launcher.workers.WorkersDb.getRealm
-import com.google.android.material.imageview.ShapeableImageView
import com.squareup.picasso.Picasso
import io.realm.kotlin.UpdatePolicy
import io.realm.kotlin.ext.query
@@ -577,7 +575,7 @@ internal class RssHome : Fragment() {
binding.geckoWeb.decoViews.add(binding.hide)
binding.geckoWeb.decoViews.add(binding.vote)
binding.geckoWeb.decoViews.add(binding.progressBar)
- (activity as? LauncherActivity)?.let { activity ->
+ (activity as? NeoRssActivity)?.let { activity ->
binding.geckoWeb.decoViews.add(activity.findViewById(R.id.current_address))
binding.geckoWeb.decoViews.add(activity.findViewById(R.id.back))
binding.geckoWeb.decoViews.add(activity.findViewById(R.id.reload))
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/RssViewer.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/RssViewer.kt
index 85a1e827..566caade 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/home/RssViewer.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/RssViewer.kt
@@ -1,114 +1,114 @@
-/*
- * Lunar Launcher
- * Copyright (C) 2022 Md Rasel Hossain
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package bums.lunatic.launcher.home
-
-import android.content.pm.PackageManager
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.webkit.WebView
-import androidx.fragment.app.DialogFragment
-import bums.lunatic.launcher.R
-import bums.lunatic.launcher.databinding.RssViewerBinding
-
-
-internal class RssViewer : DialogFragment() {
-
- private lateinit var binding: RssViewerBinding
- private lateinit var packageName: String
- private lateinit var packageManager: PackageManager
- private lateinit var defAppName: String
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setStyle(STYLE_NO_TITLE, R.style.FilterFullScreenDialog)
- }
-
- override fun onStart() {
- super.onStart()
- if (dialog != null) {
-// val metrics = resources.displayMetrics
-// val screenHeight = metrics.heightPixels
-// val bottomSheet =
-// dialog!!.findViewById(com.google.android.material.R.id.design_bottom_sheet)
-// bottomSheet.layoutParams.height = (screenHeight * 0.95).toInt()
-// val behavior = BottomSheetBehavior.from(bottomSheet)
-// behavior.state = BottomSheetBehavior.STATE_EXPANDED
-// behavior.skipCollapsed = true
- }
- }
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
- binding = RssViewerBinding.inflate(inflater, container, false)
- binding.webview.loadUrl(tag!!)
- binding.webview.setDesktopMode(false)
-
- var mWebView = WebView(requireContext())
- mWebView.requestFocus()
- mWebView.evaluateJavascript("try {document.querySelector('.my-point-box').focus()}catch(err){}") { }
-
-// binding.pdfPrint.setOnClickListener { pdfPring() }
- return binding.root
- }
-
-// fun pdfPring() {
-// val fileName = tag?.toUri()?.path?.replace("/","_")?.replace(".","_")
-// val path = File(Environment.getExternalStorageDirectory(),"bums")
-// if (path.exists() == false) {
-// path.mkdirs()
-// }
-// val file = File(path, fileName.plus(".pdf"))
+///*
+// * Lunar Launcher
+// * Copyright (C) 2022 Md Rasel Hossain
+// *
+// * This program is free software: you can redistribute it and/or modify
+// * it under the terms of the GNU General Public License as published by
+// * the Free Software Foundation, either version 3 of the License, or
+// * (at your option) any later version.
+// *
+// * This program is distributed in the hope that it will be useful,
+// * but WITHOUT ANY WARRANTY; without even the implied warranty of
+// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// * GNU General Public License for more details.
+// *
+// * You should have received a copy of the GNU General Public License
+// * along with this program. If not, see .
+// */
//
-// BLog.LOGE("file >>> ${file.absolutePath}")
-// try {
-// PDFPrint.generatePDFFromWebView(file,binding.webview, object : PDFPrint.OnPDFPrintListener {
-// override fun onSuccess(file: File?) {
-// BLog.LOGE("file >>>> ${file!!.absolutePath}")
-// val shareIntent: Intent = Intent().apply {
-// action = Intent.ACTION_SEND
-// this.`package` = "com.synology.dsdrive"
-// val imageUri = FileProvider.getUriForFile(
-// lActivity!!,
-// "bums.lunatic.launcher.fileprovider", //(use your app signature + ".provider" )
-// file
-// )
-// putExtra(Intent.EXTRA_STREAM, imageUri)
-// type = "pdf"
-// }
-// lActivity!!.startActivity(shareIntent)
-// }
+//package bums.lunatic.launcher.home
//
-// override fun onError(exception: java.lang.Exception?) {
-// Toast.makeText(lActivity!!,
-// "Pdf Save Failk ${exception?.localizedMessage}", Toast.LENGTH_LONG).show()
-// exception?.printStackTrace()
-// }
-// } )
-// } catch (e: IOException) {
-// e.printStackTrace()
+//import android.content.pm.PackageManager
+//import android.os.Bundle
+//import android.view.LayoutInflater
+//import android.view.View
+//import android.view.ViewGroup
+//import android.webkit.WebView
+//import androidx.fragment.app.DialogFragment
+//import bums.lunatic.launcher.R
+//import bums.lunatic.launcher.databinding.RssViewerBinding
+//
+//
+//internal class RssViewer : DialogFragment() {
+//
+// private lateinit var binding: RssViewerBinding
+// private lateinit var packageName: String
+// private lateinit var packageManager: PackageManager
+// private lateinit var defAppName: String
+//
+// override fun onCreate(savedInstanceState: Bundle?) {
+// super.onCreate(savedInstanceState)
+// setStyle(STYLE_NO_TITLE, R.style.FilterFullScreenDialog)
+// }
+//
+// override fun onStart() {
+// super.onStart()
+// if (dialog != null) {
+//// val metrics = resources.displayMetrics
+//// val screenHeight = metrics.heightPixels
+//// val bottomSheet =
+//// dialog!!.findViewById(com.google.android.material.R.id.design_bottom_sheet)
+//// bottomSheet.layoutParams.height = (screenHeight * 0.95).toInt()
+//// val behavior = BottomSheetBehavior.from(bottomSheet)
+//// behavior.state = BottomSheetBehavior.STATE_EXPANDED
+//// behavior.skipCollapsed = true
// }
// }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-// (requireDialog() as BottomSheetDialog).dismissWithAnimation = true
-
- }
-}
+//
+// override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+// binding = RssViewerBinding.inflate(inflater, container, false)
+// binding.webview.loadUrl(tag!!)
+// binding.webview.setDesktopMode(false)
+//
+// var mWebView = WebView(requireContext())
+// mWebView.requestFocus()
+// mWebView.evaluateJavascript("try {document.querySelector('.my-point-box').focus()}catch(err){}") { }
+//
+//// binding.pdfPrint.setOnClickListener { pdfPring() }
+// return binding.root
+// }
+//
+//// fun pdfPring() {
+//// val fileName = tag?.toUri()?.path?.replace("/","_")?.replace(".","_")
+//// val path = File(Environment.getExternalStorageDirectory(),"bums")
+//// if (path.exists() == false) {
+//// path.mkdirs()
+//// }
+//// val file = File(path, fileName.plus(".pdf"))
+////
+//// BLog.LOGE("file >>> ${file.absolutePath}")
+//// try {
+//// PDFPrint.generatePDFFromWebView(file,binding.webview, object : PDFPrint.OnPDFPrintListener {
+//// override fun onSuccess(file: File?) {
+//// BLog.LOGE("file >>>> ${file!!.absolutePath}")
+//// val shareIntent: Intent = Intent().apply {
+//// action = Intent.ACTION_SEND
+//// this.`package` = "com.synology.dsdrive"
+//// val imageUri = FileProvider.getUriForFile(
+//// lActivity!!,
+//// "bums.lunatic.launcher.fileprovider", //(use your app signature + ".provider" )
+//// file
+//// )
+//// putExtra(Intent.EXTRA_STREAM, imageUri)
+//// type = "pdf"
+//// }
+//// lActivity!!.startActivity(shareIntent)
+//// }
+////
+//// override fun onError(exception: java.lang.Exception?) {
+//// Toast.makeText(lActivity!!,
+//// "Pdf Save Failk ${exception?.localizedMessage}", Toast.LENGTH_LONG).show()
+//// exception?.printStackTrace()
+//// }
+//// } )
+//// } catch (e: IOException) {
+//// e.printStackTrace()
+//// }
+//// }
+//
+// override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+// super.onViewCreated(view, savedInstanceState)
+//// (requireDialog() as BottomSheetDialog).dismissWithAnimation = true
+//
+// }
+//}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/NotificationItemAdapter.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/NotificationItemAdapter.kt
index 55a44a08..f3eb40bc 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/NotificationItemAdapter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/NotificationItemAdapter.kt
@@ -1,112 +1,112 @@
-/*
- * Lunar Launcher
- * Copyright (C) 2022 Md Rasel Hossain
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package bums.lunatic.launcher.home.adapters
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.content.pm.PackageManager
-import android.graphics.drawable.Drawable
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.recyclerview.widget.DiffUtil
-import androidx.recyclerview.widget.RecyclerView
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
-import bums.lunatic.launcher.databinding.ListItemWithBinding
-import bums.lunatic.launcher.model.NotificationItem
-import bums.lunatic.launcher.workers.WorkersDb
-import java.text.SimpleDateFormat
-import java.util.Date
-
-
-internal class NotificationItemAdapter (
- private val context: Context) : RecyclerView.Adapter() {
- private var notiItems: ArrayList = arrayListOf()
- override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): NotiHolder {
- val binding = ListItemWithBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)
- return NotiHolder(binding)
- }
-
- override fun getItemCount(): Int {
- return notiItems.size
- }
-
- val dateFormat = SimpleDateFormat("hh:mm / yy - MM - dd")
-
- @SuppressLint("SetTextI18n")
- override fun onBindViewHolder(holder: NotiHolder, position: Int) {
- val appInfo = notiItems[position]
- try {
- holder.view.circlePreview.visibility = View.VISIBLE
- var param = holder.view.circlePreview.layoutParams
- 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 ?: "${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
- }
-
-
- } catch (e: PackageManager.NameNotFoundException) {
- return
- }
-
- }
-
- fun updateData(newList: List) {
- try {
- DiffUtil.calculateDiff(NotiItemDiffUtil(notiItems, newList)).apply {
-
- }.dispatchUpdatesTo(this).apply {
-// notifyItemRangeChanged(0,10)
- }
- notiItems.clear()
- notiItems.addAll(newList)
- }catch ( e : Exception) {
- e.printStackTrace()
- }
- }
-
-
-}
-
-internal class NotiHolder(var view: ListItemWithBinding) : RecyclerView.ViewHolder(view.root)
-internal class NotiItemDiffUtil(
- var oldList: List, var 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].uniq_id == if (newList.size > newItemPosition) newList[newItemPosition].uniq_id else ""
-
- override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
- oldList[oldItemPosition].uniq_id == if (newList.size > newItemPosition) newList[newItemPosition].uniq_id else ""
-}
+///*
+// * Lunar Launcher
+// * Copyright (C) 2022 Md Rasel Hossain
+// *
+// * This program is free software: you can redistribute it and/or modify
+// * it under the terms of the GNU General Public License as published by
+// * the Free Software Foundation, either version 3 of the License, or
+// * (at your option) any later version.
+// *
+// * This program is distributed in the hope that it will be useful,
+// * but WITHOUT ANY WARRANTY; without even the implied warranty of
+// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// * GNU General Public License for more details.
+// *
+// * You should have received a copy of the GNU General Public License
+// * along with this program. If not, see .
+// */
+//
+//package bums.lunatic.launcher.home.adapters
+//
+//import android.annotation.SuppressLint
+//import android.content.Context
+//import android.content.pm.PackageManager
+//import android.graphics.drawable.Drawable
+//import android.view.LayoutInflater
+//import android.view.View
+//import android.view.ViewGroup
+//import androidx.constraintlayout.widget.ConstraintLayout
+//import androidx.recyclerview.widget.DiffUtil
+//import androidx.recyclerview.widget.RecyclerView
+//import bums.lunatic.launcher.databinding.ListItemWithBinding
+//import bums.lunatic.launcher.home.NeoRssActivity.Companion.lActivity
+//import bums.lunatic.launcher.model.NotificationItem
+//import bums.lunatic.launcher.workers.WorkersDb
+//import java.text.SimpleDateFormat
+//import java.util.Date
+//
+//
+//internal class NotificationItemAdapter (
+// private val context: Context) : RecyclerView.Adapter() {
+// private var notiItems: ArrayList = arrayListOf()
+// override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): NotiHolder {
+// val binding = ListItemWithBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)
+// return NotiHolder(binding)
+// }
+//
+// override fun getItemCount(): Int {
+// return notiItems.size
+// }
+//
+// val dateFormat = SimpleDateFormat("hh:mm / yy - MM - dd")
+//
+// @SuppressLint("SetTextI18n")
+// override fun onBindViewHolder(holder: NotiHolder, position: Int) {
+// val appInfo = notiItems[position]
+// try {
+// holder.view.circlePreview.visibility = View.VISIBLE
+// var param = holder.view.circlePreview.layoutParams
+// 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 ?: "${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
+// }
+//
+//
+// } catch (e: PackageManager.NameNotFoundException) {
+// return
+// }
+//
+// }
+//
+// fun updateData(newList: List) {
+// try {
+// DiffUtil.calculateDiff(NotiItemDiffUtil(notiItems, newList)).apply {
+//
+// }.dispatchUpdatesTo(this).apply {
+//// notifyItemRangeChanged(0,10)
+// }
+// notiItems.clear()
+// notiItems.addAll(newList)
+// }catch ( e : Exception) {
+// e.printStackTrace()
+// }
+// }
+//
+//
+//}
+//
+//internal class NotiHolder(var view: ListItemWithBinding) : RecyclerView.ViewHolder(view.root)
+//internal class NotiItemDiffUtil(
+// var oldList: List, var 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].uniq_id == if (newList.size > newItemPosition) newList[newItemPosition].uniq_id else ""
+//
+// override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
+// oldList[oldItemPosition].uniq_id == if (newList.size > newItemPosition) newList[newItemPosition].uniq_id else ""
+//}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/RecentCallsAdapter.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/RecentCallsAdapter.kt
index 460c963f..89c3cdc1 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/RecentCallsAdapter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/RecentCallsAdapter.kt
@@ -1,167 +1,167 @@
-/*
- * Lunar Launcher
- * Copyright (C) 2022 Md Rasel Hossain
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package bums.lunatic.launcher.home.adapters
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.content.Intent
-import android.net.Uri
-import android.provider.CallLog
-import android.provider.ContactsContract
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import androidx.recyclerview.widget.DiffUtil
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
-import bums.lunatic.launcher.R
-import bums.lunatic.launcher.databinding.CalllogItemBinding
-import bums.lunatic.launcher.utils.getContactId
-import bums.lunatic.launcher.workers.RecentCall
-
-
-internal class RecentCallsAdapter(
- private val callList: ArrayList,
- private val context: Context) : RecyclerView.Adapter() {
-
- private val currentFragment = lActivity!!.supportFragmentManager.findFragmentById(R.id.mainFragmentsContainer)
-
- override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): RecentCallsHolder {
- val binding = CalllogItemBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)
- return RecentCallsHolder(binding)
- }
-
- override fun getItemCount(): Int {
-// BLog.LOGE("callList.size >>> ${callList.size}")
- return callList.size
- }
-
- @SuppressLint("SetTextI18n")
- override fun onBindViewHolder(holder: RecentCallsHolder, position: Int) {
- val todo = callList[position]
- holder.view.name.text = if(todo.name.equals("unknown")) todo.number else { todo.name}
-
- when (todo.type) {
-// CallLog.Calls.INCOMING_TYPE -> { dir = "INCOMING_TYPE" }
-// CallLog.Calls.OUTGOING_TYPE -> { dir = "OUTGOING_TYPE" }
- CallLog.Calls.MISSED_TYPE -> { holder.view.root.isSelected = true }
-// CallLog.Calls.VOICEMAIL_TYPE -> { dir = "VOICEMAIL_TYPE" }
-// CallLog.Calls.REJECTED_TYPE -> { dir = "REJECTED_TYPE" }
-// CallLog.Calls.BLOCKED_TYPE -> { dir = "BLOCKED_TYPE" }
-// CallLog.Calls.ANSWERED_EXTERNALLY_TYPE -> { dir = "ANSWERED_EXTERNALLY_TYPE" }
- else -> { holder.view.root.isSelected = false }
- }
-// "\u25CF ${} , ${todo.typeString} : ${todo.count} : ${todo.date}"
- holder.view.type.text = todo.typeString
- /* multiline texts are enabled for TodoManager */
- holder.view.date.text = todo.date
- /* launch edit or update dialog on item click */
- holder.view.root.setOnClickListener { updateDialog(position) }
- /* copy texts on long click */
- holder.view.root.setOnLongClickListener {
-
-// copyToClipboard(context, todo.name)
- var cId = getContactId(lActivity!!.contentResolver, todo.number)
- if (cId != null && cId.length > 0) {
- var intent = Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse(ContactsContract.Contacts.CONTENT_URI.toString() + "/" + cId));
- lActivity?.startActivity(intent);
- } else {
- lActivity?.startActivity(Intent(Intent.ACTION_DIAL, Uri.parse("tel:${todo.number}")))
- }
-
- true
- }
-
- }
-
- inner class RecentCallsHolder(var view: CalllogItemBinding) : RecyclerView.ViewHolder(view.root)
-
- /* update dialog */
- private fun updateDialog(position: Int) {
-// val bottomSheetDialog = BottomSheetDialog(lActivity!!, R.style.BottomSheetDialog)
-// val dialogBinding = TodoDialogBinding.inflate(LayoutInflater.from(context))
-// bottomSheetDialog.setContentView(dialogBinding.root)
-// bottomSheetDialog.show()
-// bottomSheetDialog.dismissWithAnimation = true
+///*
+// * Lunar Launcher
+// * Copyright (C) 2022 Md Rasel Hossain
+// *
+// * This program is free software: you can redistribute it and/or modify
+// * it under the terms of the GNU General Public License as published by
+// * the Free Software Foundation, either version 3 of the License, or
+// * (at your option) any later version.
+// *
+// * This program is distributed in the hope that it will be useful,
+// * but WITHOUT ANY WARRANTY; without even the implied warranty of
+// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// * GNU General Public License for more details.
+// *
+// * You should have received a copy of the GNU General Public License
+// * along with this program. If not, see .
+// */
//
-// val databaseHandler = DatabaseHandler(context)
-// val todo = databaseHandler.todos[position]
+//package bums.lunatic.launcher.home.adapters
//
-// dialogBinding.apply {
-// deleteAllConfirmation.visibility = View.GONE
-// todoInput.setText(todo.name)
-// todoCancel.text = context.getString(R.string.delete)
-// todoCancel.setTextColor(ContextCompat.getColor(context, android.R.color.holo_red_light))
-// todoOk.text = context.getString(R.string.update)
+//import android.annotation.SuppressLint
+//import android.content.Context
+//import android.content.Intent
+//import android.net.Uri
+//import android.provider.CallLog
+//import android.provider.ContactsContract
+//import android.view.LayoutInflater
+//import android.view.ViewGroup
+//import androidx.recyclerview.widget.DiffUtil
+//import androidx.recyclerview.widget.GridLayoutManager
+//import androidx.recyclerview.widget.RecyclerView
+//import bums.lunatic.launcher.R
+//import bums.lunatic.launcher.databinding.CalllogItemBinding
+//import bums.lunatic.launcher.home.NeoRssActivity.Companion.lActivity
+//import bums.lunatic.launcher.utils.getContactId
+//import bums.lunatic.launcher.workers.RecentCall
+//
+//
+//internal class RecentCallsAdapter(
+// private val callList: ArrayList,
+// private val context: Context) : RecyclerView.Adapter() {
+//
+// private val currentFragment = lActivity!!.supportFragmentManager.findFragmentById(R.id.mainFragmentsContainer)
+//
+// override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): RecentCallsHolder {
+// val binding = CalllogItemBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)
+// return RecentCallsHolder(binding)
+// }
+//
+// override fun getItemCount(): Int {
+//// BLog.LOGE("callList.size >>> ${callList.size}")
+// return callList.size
+// }
+//
+// @SuppressLint("SetTextI18n")
+// override fun onBindViewHolder(holder: RecentCallsHolder, position: Int) {
+// val todo = callList[position]
+// holder.view.name.text = if(todo.name.equals("unknown")) todo.number else { todo.name}
+//
+// when (todo.type) {
+//// CallLog.Calls.INCOMING_TYPE -> { dir = "INCOMING_TYPE" }
+//// CallLog.Calls.OUTGOING_TYPE -> { dir = "OUTGOING_TYPE" }
+// CallLog.Calls.MISSED_TYPE -> { holder.view.root.isSelected = true }
+//// CallLog.Calls.VOICEMAIL_TYPE -> { dir = "VOICEMAIL_TYPE" }
+//// CallLog.Calls.REJECTED_TYPE -> { dir = "REJECTED_TYPE" }
+//// CallLog.Calls.BLOCKED_TYPE -> { dir = "BLOCKED_TYPE" }
+//// CallLog.Calls.ANSWERED_EXTERNALLY_TYPE -> { dir = "ANSWERED_EXTERNALLY_TYPE" }
+// else -> { holder.view.root.isSelected = false }
// }
+//// "\u25CF ${} , ${todo.typeString} : ${todo.count} : ${todo.date}"
+// holder.view.type.text = todo.typeString
+// /* multiline texts are enabled for TodoManager */
+// holder.view.date.text = todo.date
+// /* launch edit or update dialog on item click */
+// holder.view.root.setOnClickListener { updateDialog(position) }
+// /* copy texts on long click */
+// holder.view.root.setOnLongClickListener {
//
-// /* delete the item */
-// dialogBinding.todoCancel.setOnClickListener {
-//
-// }
-//
-// /* update the item */
-// dialogBinding.todoOk.setOnClickListener {
-// val updatedTodoString = Objects.requireNonNull(dialogBinding.todoInput.text).toString().trim { it <= ' ' }
-// if (updatedTodoString.isNotEmpty()) {
-// todo.name = updatedTodoString
-// databaseHandler.updateTodo(todo)
-// bottomSheetDialog.dismiss()
+//// copyToClipboard(context, todo.name)
+// var cId = getContactId(lActivity!!.contentResolver, todo.number)
+// if (cId != null && cId.length > 0) {
+// var intent = Intent(Intent.ACTION_VIEW);
+// intent.setData(Uri.parse(ContactsContract.Contacts.CONTENT_URI.toString() + "/" + cId));
+// lActivity?.startActivity(intent);
// } else {
-// dialogBinding.todoInput.error = context.getString(R.string.empty_text_field)
+// lActivity?.startActivity(Intent(Intent.ACTION_DIAL, Uri.parse("tel:${todo.number}")))
+// }
+//
+// true
+// }
+//
+// }
+//
+// inner class RecentCallsHolder(var view: CalllogItemBinding) : RecyclerView.ViewHolder(view.root)
+//
+// /* update dialog */
+// private fun updateDialog(position: Int) {
+//// val bottomSheetDialog = BottomSheetDialog(lActivity!!, R.style.BottomSheetDialog)
+//// val dialogBinding = TodoDialogBinding.inflate(LayoutInflater.from(context))
+//// bottomSheetDialog.setContentView(dialogBinding.root)
+//// bottomSheetDialog.show()
+//// bottomSheetDialog.dismissWithAnimation = true
+////
+//// val databaseHandler = DatabaseHandler(context)
+//// val todo = databaseHandler.todos[position]
+////
+//// dialogBinding.apply {
+//// deleteAllConfirmation.visibility = View.GONE
+//// todoInput.setText(todo.name)
+//// todoCancel.text = context.getString(R.string.delete)
+//// todoCancel.setTextColor(ContextCompat.getColor(context, android.R.color.holo_red_light))
+//// todoOk.text = context.getString(R.string.update)
+//// }
+////
+//// /* delete the item */
+//// dialogBinding.todoCancel.setOnClickListener {
+////
+//// }
+////
+//// /* update the item */
+//// dialogBinding.todoOk.setOnClickListener {
+//// val updatedTodoString = Objects.requireNonNull(dialogBinding.todoInput.text).toString().trim { it <= ' ' }
+//// if (updatedTodoString.isNotEmpty()) {
+//// todo.name = updatedTodoString
+//// databaseHandler.updateTodo(todo)
+//// bottomSheetDialog.dismiss()
+//// } else {
+//// dialogBinding.todoInput.error = context.getString(R.string.empty_text_field)
+//// }
+//// }
+// }
+// var layoutManager : GridLayoutManager? = null
+// var recyclerView: RecyclerView? = null
+// override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
+// layoutManager = recyclerView.layoutManager as? GridLayoutManager
+// this.recyclerView = recyclerView
+// }
+//
+// fun updateData(newList: Collection) {
+// val diffUtilResult = DiffUtil.calculateDiff(RecentCallDiffUtil(callList, newList.toList()))
+// diffUtilResult.dispatchUpdatesTo(this).apply {
+// val visibleItemCount = (layoutManager?.findLastVisibleItemPosition() ?: 0) - (layoutManager?.findFirstVisibleItemPosition() ?: 0)
+// if (visibleItemCount > 0) {
+// this@RecentCallsAdapter.notifyItemRangeChanged(0, visibleItemCount)
+// recyclerView?.scrollToPosition(0)
// }
// }
- }
- var layoutManager : GridLayoutManager? = null
- var recyclerView: RecyclerView? = null
- override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
- layoutManager = recyclerView.layoutManager as? GridLayoutManager
- this.recyclerView = recyclerView
- }
-
- fun updateData(newList: Collection) {
- val diffUtilResult = DiffUtil.calculateDiff(RecentCallDiffUtil(callList, newList.toList()))
- diffUtilResult.dispatchUpdatesTo(this).apply {
- val visibleItemCount = (layoutManager?.findLastVisibleItemPosition() ?: 0) - (layoutManager?.findFirstVisibleItemPosition() ?: 0)
- if (visibleItemCount > 0) {
- this@RecentCallsAdapter.notifyItemRangeChanged(0, visibleItemCount)
- recyclerView?.scrollToPosition(0)
- }
- }
- callList.clear()
- callList.addAll(newList)
- }
-
-}
-
-internal class RecentCallDiffUtil(
- 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].date == newList[newItemPosition].date
-
- override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
- oldList[oldItemPosition] == newList[newItemPosition]
-}
-
+// callList.clear()
+// callList.addAll(newList)
+// }
+//
+//}
+//
+//internal class RecentCallDiffUtil(
+// 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].date == newList[newItemPosition].date
+//
+// override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
+// oldList[oldItemPosition] == newList[newItemPosition]
+//}
+//
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/SmsLogsAdapter.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/SmsLogsAdapter.kt
index b83a19e4..b67b2eda 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/SmsLogsAdapter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/SmsLogsAdapter.kt
@@ -1,169 +1,168 @@
-/*
- * Lunar Launcher
- * Copyright (C) 2022 Md Rasel Hossain
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package bums.lunatic.launcher.home.adapters
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.content.Intent
-import android.net.Uri
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import androidx.recyclerview.widget.DiffUtil
-import androidx.recyclerview.widget.RecyclerView
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
-import bums.lunatic.launcher.R
-import bums.lunatic.launcher.databinding.SmsItemBinding
-import bums.lunatic.launcher.utils.getContactName
-import bums.lunatic.launcher.workers.RecentSms
-import java.text.SimpleDateFormat
-import java.util.Date
-
-
-internal class SmsLogsAdapter(
- private val smsList: ArrayList,
- private val context: Context) : RecyclerView.Adapter() {
-
- private val currentFragment = lActivity!!.supportFragmentManager.findFragmentById(R.id.mainFragmentsContainer)
-
- override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): SmsLogHolder {
- val binding = SmsItemBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)
- return SmsLogHolder(binding)
- }
-
- override fun getItemCount(): Int {
- return smsList.size
- }
-
- @SuppressLint("SetTextI18n")
- override fun onBindViewHolder(holder: SmsLogHolder, position: Int) {
- val todo = smsList[position]
- var name = getContactName(lActivity!!.contentResolver,todo.person)
- if (name == null) {
- getContactName(lActivity!!.contentResolver,todo.addr)
- }
- if(todo.isMms) {
- var body = todo.texts?.joinToString("\n")?.replace("\n"," ")
- body = if (body?.length ?: 0 > 60) body?.substring(0,60).plus("...") else body
- holder.view.itemText.text = "\u25CF ${if(name != null && name.length > 0) name else if(todo.person != null && todo.person.length > 0){todo.person} else todo.addr} : ${
- SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
- Date(
- Math.max(
- todo.pstDate.toLong(),
- todo.rcvDate.toLong()
- )
- )
- )
- } : ${todo.type}"
- holder.view.contents.text = "${body}"
- } else {
- holder.view.itemText.text = "\u25CF ${if(name != null && name.length > 0) name else if(todo.person != null && todo.person.length > 0){todo.person} else todo.addr} : ${
- SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
- Date(
- Math.max(
- todo.pstDate.toLong(),
- todo.rcvDate.toLong()
- )
- )
- )
- } : ${todo.type}"
-
-
-
-
- holder.view.contents.text = "${todo.body}"
- }
-
-
-
- /* multiline texts are enabled for TodoManager */
-// holder.view.itemText.isSingleLine = false
- /* launch edit or update dialog on item click */
-// holder.view.itemText.setOnClickListener { updateDialog(position) }
- /* copy texts on long click */
- holder.view.itemText.setOnLongClickListener {
- var intent = Intent(Intent.ACTION_SENDTO);
- intent.setData(Uri.parse("smsto:" + Uri.encode(todo.addr)));
- lActivity?.startActivity(intent);
- true
- }
-
- holder.view.root.isActivated = if(holder.view.itemText.text.contains("#CMAS#")) true else false
- }
-
-
-
- fun updateData(newList: List) {
- val diffUtilResult = DiffUtil.calculateDiff(SmsDiffUtil(smsList, newList))
- diffUtilResult.dispatchUpdatesTo(this)
- smsList.clear()
- smsList.addAll(newList)
- }
-
- /* update dialog */
- private fun updateDialog(position: Int) {
-// val bottomSheetDialog = BottomSheetDialog(lActivity!!, R.style.BottomSheetDialog)
-// val dialogBinding = TodoDialogBinding.inflate(LayoutInflater.from(context))
-// bottomSheetDialog.setContentView(dialogBinding.root)
-// bottomSheetDialog.show()
-// bottomSheetDialog.dismissWithAnimation = true
+///*
+// * Lunar Launcher
+// * Copyright (C) 2022 Md Rasel Hossain
+// *
+// * This program is free software: you can redistribute it and/or modify
+// * it under the terms of the GNU General Public License as published by
+// * the Free Software Foundation, either version 3 of the License, or
+// * (at your option) any later version.
+// *
+// * This program is distributed in the hope that it will be useful,
+// * but WITHOUT ANY WARRANTY; without even the implied warranty of
+// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// * GNU General Public License for more details.
+// *
+// * You should have received a copy of the GNU General Public License
+// * along with this program. If not, see .
+// */
//
-// val databaseHandler = DatabaseHandler(context)
-// val todo = databaseHandler.todos[position]
+//package bums.lunatic.launcher.home.adapters
//
-// dialogBinding.apply {
-// deleteAllConfirmation.visibility = View.GONE
-// todoInput.setText(todo.name)
-// todoCancel.text = context.getString(R.string.delete)
-// todoCancel.setTextColor(ContextCompat.getColor(context, android.R.color.holo_red_light))
-// todoOk.text = context.getString(R.string.update)
+//import android.annotation.SuppressLint
+//import android.content.Context
+//import android.content.Intent
+//import android.net.Uri
+//import android.view.LayoutInflater
+//import android.view.ViewGroup
+//import androidx.recyclerview.widget.DiffUtil
+//import androidx.recyclerview.widget.RecyclerView
+//import bums.lunatic.launcher.R
+//import bums.lunatic.launcher.databinding.SmsItemBinding
+//import bums.lunatic.launcher.utils.getContactName
+//import bums.lunatic.launcher.workers.RecentSms
+//import java.text.SimpleDateFormat
+//import java.util.Date
+//
+//
+//internal class SmsLogsAdapter(
+// private val smsList: ArrayList,
+// private val context: Context) : RecyclerView.Adapter() {
+//
+// private val currentFragment = lActivity!!.supportFragmentManager.findFragmentById(R.id.mainFragmentsContainer)
+//
+// override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): SmsLogHolder {
+// val binding = SmsItemBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)
+// return SmsLogHolder(binding)
+// }
+//
+// override fun getItemCount(): Int {
+// return smsList.size
+// }
+//
+// @SuppressLint("SetTextI18n")
+// override fun onBindViewHolder(holder: SmsLogHolder, position: Int) {
+// val todo = smsList[position]
+// var name = getContactName(lActivity!!.contentResolver,todo.person)
+// if (name == null) {
+// getContactName(lActivity!!.contentResolver,todo.addr)
+// }
+// if(todo.isMms) {
+// var body = todo.texts?.joinToString("\n")?.replace("\n"," ")
+// body = if (body?.length ?: 0 > 60) body?.substring(0,60).plus("...") else body
+// holder.view.itemText.text = "\u25CF ${if(name != null && name.length > 0) name else if(todo.person != null && todo.person.length > 0){todo.person} else todo.addr} : ${
+// SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
+// Date(
+// Math.max(
+// todo.pstDate.toLong(),
+// todo.rcvDate.toLong()
+// )
+// )
+// )
+// } : ${todo.type}"
+// holder.view.contents.text = "${body}"
+// } else {
+// holder.view.itemText.text = "\u25CF ${if(name != null && name.length > 0) name else if(todo.person != null && todo.person.length > 0){todo.person} else todo.addr} : ${
+// SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
+// Date(
+// Math.max(
+// todo.pstDate.toLong(),
+// todo.rcvDate.toLong()
+// )
+// )
+// )
+// } : ${todo.type}"
+//
+//
+//
+//
+// holder.view.contents.text = "${todo.body}"
// }
//
-// /* delete the item */
-// dialogBinding.todoCancel.setOnClickListener {
//
+//
+// /* multiline texts are enabled for TodoManager */
+//// holder.view.itemText.isSingleLine = false
+// /* launch edit or update dialog on item click */
+//// holder.view.itemText.setOnClickListener { updateDialog(position) }
+// /* copy texts on long click */
+// holder.view.itemText.setOnLongClickListener {
+// var intent = Intent(Intent.ACTION_SENDTO);
+// intent.setData(Uri.parse("smsto:" + Uri.encode(todo.addr)));
+// lActivity?.startActivity(intent);
+// true
// }
//
-// /* update the item */
-// dialogBinding.todoOk.setOnClickListener {
-// val updatedTodoString = Objects.requireNonNull(dialogBinding.todoInput.text).toString().trim { it <= ' ' }
-// if (updatedTodoString.isNotEmpty()) {
-// todo.name = updatedTodoString
-// databaseHandler.updateTodo(todo)
-// bottomSheetDialog.dismiss()
-// } else {
-// dialogBinding.todoInput.error = context.getString(R.string.empty_text_field)
-// }
-// }
- }
-
-}
-class SmsLogHolder(var view: SmsItemBinding) : RecyclerView.ViewHolder(view.root)
-internal class SmsDiffUtil(
- 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].rcvDate == newList[newItemPosition].rcvDate
-
- override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
- oldList[oldItemPosition].rcvDate == newList[newItemPosition].rcvDate
-}
+// holder.view.root.isActivated = if(holder.view.itemText.text.contains("#CMAS#")) true else false
+// }
+//
+//
+//
+// fun updateData(newList: List) {
+// val diffUtilResult = DiffUtil.calculateDiff(SmsDiffUtil(smsList, newList))
+// diffUtilResult.dispatchUpdatesTo(this)
+// smsList.clear()
+// smsList.addAll(newList)
+// }
+//
+// /* update dialog */
+// private fun updateDialog(position: Int) {
+//// val bottomSheetDialog = BottomSheetDialog(lActivity!!, R.style.BottomSheetDialog)
+//// val dialogBinding = TodoDialogBinding.inflate(LayoutInflater.from(context))
+//// bottomSheetDialog.setContentView(dialogBinding.root)
+//// bottomSheetDialog.show()
+//// bottomSheetDialog.dismissWithAnimation = true
+////
+//// val databaseHandler = DatabaseHandler(context)
+//// val todo = databaseHandler.todos[position]
+////
+//// dialogBinding.apply {
+//// deleteAllConfirmation.visibility = View.GONE
+//// todoInput.setText(todo.name)
+//// todoCancel.text = context.getString(R.string.delete)
+//// todoCancel.setTextColor(ContextCompat.getColor(context, android.R.color.holo_red_light))
+//// todoOk.text = context.getString(R.string.update)
+//// }
+////
+//// /* delete the item */
+//// dialogBinding.todoCancel.setOnClickListener {
+////
+//// }
+////
+//// /* update the item */
+//// dialogBinding.todoOk.setOnClickListener {
+//// val updatedTodoString = Objects.requireNonNull(dialogBinding.todoInput.text).toString().trim { it <= ' ' }
+//// if (updatedTodoString.isNotEmpty()) {
+//// todo.name = updatedTodoString
+//// databaseHandler.updateTodo(todo)
+//// bottomSheetDialog.dismiss()
+//// } else {
+//// dialogBinding.todoInput.error = context.getString(R.string.empty_text_field)
+//// }
+//// }
+// }
+//
+//}
+//class SmsLogHolder(var view: SmsItemBinding) : RecyclerView.ViewHolder(view.root)
+//internal class SmsDiffUtil(
+// 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].rcvDate == newList[newItemPosition].rcvDate
+//
+// override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
+// oldList[oldItemPosition].rcvDate == newList[newItemPosition].rcvDate
+//}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherAdapter.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherAdapter.kt
index 8c1ba79d..f428c597 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherAdapter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherAdapter.kt
@@ -1,107 +1,107 @@
-package bums.lunatic.launcher.home.adapters
-
-import android.annotation.SuppressLint
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.LinearSnapHelper
-import androidx.recyclerview.widget.RecyclerView
-import bums.lunatic.launcher.databinding.WeatherBookBinding
-import bums.lunatic.launcher.utils.Blog
-
-class WeatherAdapter(
- private val pages: List,
- private val adatpers: List?>,
- private val weatherBook: WeatherBookBinding? = null)
- : RecyclerView.Adapter() {
-
- class PageViewHolder(val view: View): RecyclerView.ViewHolder(view)
-
-
- var childs : ArrayList = arrayListOf()
-
-
- @SuppressLint("ResourceType")
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PageViewHolder {
-
-
- val layoutInflater = LayoutInflater.from(parent.context).inflate(pages[viewType], parent, false)
-// var first = layoutInflater.findViewById(R.id.recycler_hourly_weather)
-// var second = layoutInflater.findViewById(R.id.weather_dress_recycller)
-
- return PageViewHolder(layoutInflater)
- }
-
-
- fun syncScroll(newPosition: Int) {
- childs[newPosition].let {recyclerView ->
- Blog.LOGE("recyclerView >>> ${recyclerView} 1 ")
- if (!isSyncingScroll) {
- isSyncingScroll = true
- Blog.LOGE("recyclerView >>> ${recyclerView} 2 ")
- childs.forEach { c ->
-// val visibleItemCount = (layoutManager?.findLastVisibleItemPosition() ?: 0) - (layoutManager?.findFirstVisibleItemPosition() ?: 0)
- if (c != recyclerView) {
- (c.layoutManager as LinearLayoutManager)?.let {
- it.findFirstVisibleItemPosition()?.let {
- (recyclerView?.layoutManager as? LinearLayoutManager)?.let { target ->
- target.scrollToPositionWithOffset(it, 0)
- }
-// .scrollToPosition(it)
- }
- }
- Blog.LOGE("recyclerView >>> ${recyclerView} 3 ")
- }
- }
- isSyncingScroll = false
- Blog.LOGE("recyclerView >>> ${recyclerView} 4 ")
- }
- }
-
- }
-
-
- val mOnScrollListener = object : RecyclerView.OnScrollListener() {
- override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
- super.onScrollStateChanged(recyclerView, newState)
-// recyclerView.postDelayed({syncScroll(recyclerView)},10L)
-// recyclerView.post{syncScroll(recyclerView)}
- }
-
- override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
- super.onScrolled(recyclerView, dx, dy)
- }
- }
- var isSyncingScroll = false
- override fun onBindViewHolder(holder: PageViewHolder, position: Int) {
- if (adatpers[position] != null) {
- (holder.view as RecyclerView).apply {
- this.adapter = adatpers[position]
- this.layoutManager = LinearLayoutManager(this.context, LinearLayoutManager.HORIZONTAL, false)
- if (!childs.contains(this)) {
- childs.add(this)
- this.addOnScrollListener(mOnScrollListener)
- LinearSnapHelper().attachToRecyclerView(this)
- }
- }
-// when (position) {
-// 0 -> holder.view.findViewById(R.id.recycler_hourly_weather).apply {
-// this.adapter = adatpers[position]
-// this.layoutManager =
+//package bums.lunatic.launcher.home.adapters
//
+//import android.annotation.SuppressLint
+//import android.view.LayoutInflater
+//import android.view.View
+//import android.view.ViewGroup
+//import androidx.recyclerview.widget.LinearLayoutManager
+//import androidx.recyclerview.widget.LinearSnapHelper
+//import androidx.recyclerview.widget.RecyclerView
+//import bums.lunatic.launcher.databinding.WeatherBookBinding
+//import bums.lunatic.launcher.utils.Blog
+//
+//class WeatherAdapter(
+// private val pages: List,
+// private val adatpers: List?>,
+// private val weatherBook: WeatherBookBinding? = null)
+// : RecyclerView.Adapter() {
+//
+// class PageViewHolder(val view: View): RecyclerView.ViewHolder(view)
+//
+//
+// var childs : ArrayList = arrayListOf()
+//
+//
+// @SuppressLint("ResourceType")
+// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PageViewHolder {
+//
+//
+// val layoutInflater = LayoutInflater.from(parent.context).inflate(pages[viewType], parent, false)
+//// var first = layoutInflater.findViewById(R.id.recycler_hourly_weather)
+//// var second = layoutInflater.findViewById(R.id.weather_dress_recycller)
+//
+// return PageViewHolder(layoutInflater)
+// }
+//
+//
+// fun syncScroll(newPosition: Int) {
+// childs[newPosition].let {recyclerView ->
+// Blog.LOGE("recyclerView >>> ${recyclerView} 1 ")
+// if (!isSyncingScroll) {
+// isSyncingScroll = true
+// Blog.LOGE("recyclerView >>> ${recyclerView} 2 ")
+// childs.forEach { c ->
+//// val visibleItemCount = (layoutManager?.findLastVisibleItemPosition() ?: 0) - (layoutManager?.findFirstVisibleItemPosition() ?: 0)
+// if (c != recyclerView) {
+// (c.layoutManager as LinearLayoutManager)?.let {
+// it.findFirstVisibleItemPosition()?.let {
+// (recyclerView?.layoutManager as? LinearLayoutManager)?.let { target ->
+// target.scrollToPositionWithOffset(it, 0)
+// }
+//// .scrollToPosition(it)
+// }
+// }
+// Blog.LOGE("recyclerView >>> ${recyclerView} 3 ")
+// }
// }
+// isSyncingScroll = false
+// Blog.LOGE("recyclerView >>> ${recyclerView} 4 ")
+// }
+// }
//
-// else -> holder.view.findViewById(R.id.weather_dress_recycller).apply {
-// this.adapter = adatpers[position]
-// this.layoutManager =
-// LinearLayoutManager(this.context, LinearLayoutManager.HORIZONTAL, false)
+// }
+//
+//
+// val mOnScrollListener = object : RecyclerView.OnScrollListener() {
+// override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+// super.onScrollStateChanged(recyclerView, newState)
+//// recyclerView.postDelayed({syncScroll(recyclerView)},10L)
+//// recyclerView.post{syncScroll(recyclerView)}
+// }
+//
+// override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+// super.onScrolled(recyclerView, dx, dy)
+// }
+// }
+// var isSyncingScroll = false
+// override fun onBindViewHolder(holder: PageViewHolder, position: Int) {
+// if (adatpers[position] != null) {
+// (holder.view as RecyclerView).apply {
+// this.adapter = adatpers[position]
+// this.layoutManager = LinearLayoutManager(this.context, LinearLayoutManager.HORIZONTAL, false)
+// if (!childs.contains(this)) {
+// childs.add(this)
+// this.addOnScrollListener(mOnScrollListener)
+// LinearSnapHelper().attachToRecyclerView(this)
// }
// }
- }
- }
-
- override fun getItemCount(): Int = pages.size
-
- override fun getItemViewType(position: Int): Int = position
-}
\ No newline at end of file
+//// when (position) {
+//// 0 -> holder.view.findViewById(R.id.recycler_hourly_weather).apply {
+//// this.adapter = adatpers[position]
+//// this.layoutManager =
+////
+//// }
+////
+//// else -> holder.view.findViewById(R.id.weather_dress_recycller).apply {
+//// this.adapter = adatpers[position]
+//// this.layoutManager =
+//// LinearLayoutManager(this.context, LinearLayoutManager.HORIZONTAL, false)
+//// }
+//// }
+// }
+// }
+//
+// override fun getItemCount(): Int = pages.size
+//
+// override fun getItemViewType(position: Int): Int = position
+//}
\ No newline at end of file
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherDressAdatper.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherDressAdatper.kt
index 16a124f2..4477ca51 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherDressAdatper.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherDressAdatper.kt
@@ -1,71 +1,71 @@
-package bums.lunatic.launcher.home.adapters
-
-import android.annotation.SuppressLint
-import android.graphics.Color
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.recyclerview.widget.RecyclerView
-import bums.lunatic.launcher.databinding.ItemRecHourlyDressBinding
-import bums.lunatic.launcher.model.Hour
-import bums.lunatic.launcher.model.WeatherInfoManager
-import java.util.Calendar
-
-class WeatherDressAdatper (private val dataSet: ArrayList) : RecyclerView.Adapter(){
- var isChangedAmOrPm: Boolean = true
-
- class ViewHolder(val viewItem: ItemRecHourlyDressBinding): RecyclerView.ViewHolder(viewItem.root)
-
- // @SuppressLint("NotifyDataSetChanged")
- fun update(li: Collection) {
- li.toList()
- this.dataSet.clear()
- this.dataSet.addAll(li)
-// notifyDataSetChanged()
- }
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WeatherDressAdatper.ViewHolder {
-// val view = LayoutInflater.from(parent.context)
-// .inflate(R.layout.item_rec_hourly_dress, parent, false)
-// val itemBinding: ItemRecHourlyDressBinding = DataBindingUtil.
- val binding = ItemRecHourlyDressBinding.inflate(LayoutInflater.from(parent.context), parent, false)
- return WeatherDressAdatper.ViewHolder(binding)
- }
-
- fun getToday() = Calendar.getInstance().get(Calendar.DAY_OF_YEAR)
-
- @SuppressLint("SetTextI18n")
- override fun onBindViewHolder(holder: WeatherDressAdatper.ViewHolder, position: Int) {
- val data = dataSet[position] as? Hour
-// BLog.LOGE("saved weatherForcast >>> asFlow ${dataSet.size}")
-// val today = Calendar.getInstance()
-// today.time = Date(data?.time_epoch?.toLong()?.times(1000L) ?: 0L)
-// val dayOfItem = today.get(Calendar.DAY_OF_YEAR)
- data?.let {
-// total.loc = WorkersDb.getRealm().query().also {
-// BLog.LOGE("re >>> ${it.description()}") // 쿼리 로그
-// }.find().first()
- WeatherInfoManager.getShowingInfo(it).apply {
-// total.setInfo(this)
- holder.viewItem.setInfo(this)
- }
-// BLog.LOGE("reeeeeeeeeee >>> ${holder.viewItem.hour.text}")
- holder.viewItem.amOrPm.visibility =
- if (arrayListOf(12, 0).contains(WeatherInfoManager.toZonedDateTime(it.time_epoch).hour) || position == 0) {
- View.VISIBLE
- } else View.INVISIBLE
- holder.viewItem.hour.apply {
- if (WeatherInfoManager.toZonedDateTime(it.time_epoch).hour == 0) {
- this@apply.setTextColor(Color.BLACK)
- this@apply.isSelected = true
- } else {
- this@apply.setTextColor(Color.WHITE)
- this@apply.isSelected = false
- }
- }
- holder.viewItem.imgWeather.setImageLevel(it.temp_c.toInt())
- }
- }
-
- override fun getItemCount(): Int = dataSet.size
-}
\ No newline at end of file
+//package bums.lunatic.launcher.home.adapters
+//
+//import android.annotation.SuppressLint
+//import android.graphics.Color
+//import android.view.LayoutInflater
+//import android.view.View
+//import android.view.ViewGroup
+//import androidx.recyclerview.widget.RecyclerView
+//import bums.lunatic.launcher.databinding.ItemRecHourlyDressBinding
+//import bums.lunatic.launcher.model.Hour
+//import bums.lunatic.launcher.model.WeatherInfoManager
+//import java.util.Calendar
+//
+//class WeatherDressAdatper (private val dataSet: ArrayList) : RecyclerView.Adapter(){
+// var isChangedAmOrPm: Boolean = true
+//
+// class ViewHolder(val viewItem: ItemRecHourlyDressBinding): RecyclerView.ViewHolder(viewItem.root)
+//
+// // @SuppressLint("NotifyDataSetChanged")
+// fun update(li: Collection) {
+// li.toList()
+// this.dataSet.clear()
+// this.dataSet.addAll(li)
+//// notifyDataSetChanged()
+// }
+//
+// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WeatherDressAdatper.ViewHolder {
+//// val view = LayoutInflater.from(parent.context)
+//// .inflate(R.layout.item_rec_hourly_dress, parent, false)
+//// val itemBinding: ItemRecHourlyDressBinding = DataBindingUtil.
+// val binding = ItemRecHourlyDressBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+// return WeatherDressAdatper.ViewHolder(binding)
+// }
+//
+// fun getToday() = Calendar.getInstance().get(Calendar.DAY_OF_YEAR)
+//
+// @SuppressLint("SetTextI18n")
+// override fun onBindViewHolder(holder: WeatherDressAdatper.ViewHolder, position: Int) {
+// val data = dataSet[position] as? Hour
+//// BLog.LOGE("saved weatherForcast >>> asFlow ${dataSet.size}")
+//// val today = Calendar.getInstance()
+//// today.time = Date(data?.time_epoch?.toLong()?.times(1000L) ?: 0L)
+//// val dayOfItem = today.get(Calendar.DAY_OF_YEAR)
+// data?.let {
+//// total.loc = WorkersDb.getRealm().query().also {
+//// BLog.LOGE("re >>> ${it.description()}") // 쿼리 로그
+//// }.find().first()
+// WeatherInfoManager.getShowingInfo(it).apply {
+//// total.setInfo(this)
+// holder.viewItem.setInfo(this)
+// }
+//// BLog.LOGE("reeeeeeeeeee >>> ${holder.viewItem.hour.text}")
+// holder.viewItem.amOrPm.visibility =
+// if (arrayListOf(12, 0).contains(WeatherInfoManager.toZonedDateTime(it.time_epoch).hour) || position == 0) {
+// View.VISIBLE
+// } else View.INVISIBLE
+// holder.viewItem.hour.apply {
+// if (WeatherInfoManager.toZonedDateTime(it.time_epoch).hour == 0) {
+// this@apply.setTextColor(Color.BLACK)
+// this@apply.isSelected = true
+// } else {
+// this@apply.setTextColor(Color.WHITE)
+// this@apply.isSelected = false
+// }
+// }
+// holder.viewItem.imgWeather.setImageLevel(it.temp_c.toInt())
+// }
+// }
+//
+// override fun getItemCount(): Int = dataSet.size
+//}
\ No newline at end of file
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherHourlyAdater.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherHourlyAdater.kt
index dde6ccf6..4a487dbe 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherHourlyAdater.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/WeatherHourlyAdater.kt
@@ -1,54 +1,54 @@
-package bums.lunatic.launcher.home.adapters
-
-import android.graphics.Color
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import androidx.recyclerview.widget.RecyclerView
-import bums.lunatic.launcher.databinding.ItemHourlyWeatherBinding
-import bums.lunatic.launcher.model.Hour
-import bums.lunatic.launcher.model.WeatherInfoManager
-import com.squareup.picasso.Picasso
-
-class WeatherHourlyAdapter(private val dataSet: ArrayList): RecyclerView.Adapter() {
- class ViewHolder(val viewItem: ItemHourlyWeatherBinding): RecyclerView.ViewHolder(viewItem.root)
-
- override fun onCreateViewHolder(parent: ViewGroup, type: Int): WeatherHourlyAdapter.ViewHolder {
- val binding = ItemHourlyWeatherBinding.inflate(LayoutInflater.from(parent.context), parent, false)
- return WeatherHourlyAdapter.ViewHolder(binding)
- }
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- val data = dataSet[position] as? Hour
-// BLog.LOGE("saved weatherForcast >>> asFlow ${dataSet.size}")
- data?.let {
- WeatherInfoManager.getShowingInfo(it).apply {
- holder.viewItem.setInfo(this)
- Picasso.get()
- .load(this.urlImgWeather)
- .into(holder.viewItem.imgWeather)
- }
-// BLog.LOGE("reeeeeeeeeee >>> ${holder.viewItem.hour.text}")
-// holder.viewItem.amOrPm.visibility =
-// if (arrayListOf(12, 0).contains(WeatherInfoManager.toZonedDateTime(it.time_epoch).hour) || position == 0) {
-// View.VISIBLE
-// } else View.INVISIBLE
- holder.viewItem.hour.apply {
- if (WeatherInfoManager.toZonedDateTime(it.time_epoch).hour == 0) {
- this@apply.setTextColor(Color.BLACK)
- this@apply.isSelected = true
- } else {
- this@apply.setTextColor(Color.WHITE)
- this@apply.isSelected = false
- }
- }
- }
- }
-
- override fun getItemCount(): Int = dataSet.size
-
- fun update(li: Collection) {
- li.toList()
- this.dataSet.clear()
- this.dataSet.addAll(li)
- }
-}
\ No newline at end of file
+//package bums.lunatic.launcher.home.adapters
+//
+//import android.graphics.Color
+//import android.view.LayoutInflater
+//import android.view.ViewGroup
+//import androidx.recyclerview.widget.RecyclerView
+//import bums.lunatic.launcher.databinding.ItemHourlyWeatherBinding
+//import bums.lunatic.launcher.model.Hour
+//import bums.lunatic.launcher.model.WeatherInfoManager
+//import com.squareup.picasso.Picasso
+//
+//class WeatherHourlyAdapter(private val dataSet: ArrayList): RecyclerView.Adapter() {
+// class ViewHolder(val viewItem: ItemHourlyWeatherBinding): RecyclerView.ViewHolder(viewItem.root)
+//
+// override fun onCreateViewHolder(parent: ViewGroup, type: Int): WeatherHourlyAdapter.ViewHolder {
+// val binding = ItemHourlyWeatherBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+// return WeatherHourlyAdapter.ViewHolder(binding)
+// }
+//
+// override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+// val data = dataSet[position] as? Hour
+//// BLog.LOGE("saved weatherForcast >>> asFlow ${dataSet.size}")
+// data?.let {
+// WeatherInfoManager.getShowingInfo(it).apply {
+// holder.viewItem.setInfo(this)
+// Picasso.get()
+// .load(this.urlImgWeather)
+// .into(holder.viewItem.imgWeather)
+// }
+//// BLog.LOGE("reeeeeeeeeee >>> ${holder.viewItem.hour.text}")
+//// holder.viewItem.amOrPm.visibility =
+//// if (arrayListOf(12, 0).contains(WeatherInfoManager.toZonedDateTime(it.time_epoch).hour) || position == 0) {
+//// View.VISIBLE
+//// } else View.INVISIBLE
+// holder.viewItem.hour.apply {
+// if (WeatherInfoManager.toZonedDateTime(it.time_epoch).hour == 0) {
+// this@apply.setTextColor(Color.BLACK)
+// this@apply.isSelected = true
+// } else {
+// this@apply.setTextColor(Color.WHITE)
+// this@apply.isSelected = false
+// }
+// }
+// }
+// }
+//
+// override fun getItemCount(): Int = dataSet.size
+//
+// fun update(li: Collection) {
+// li.toList()
+// this.dataSet.clear()
+// this.dataSet.addAll(li)
+// }
+//}
\ No newline at end of file
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/BaseToki.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/BaseToki.kt
similarity index 99%
rename from app/src/main/kotlin/bums/lunatic/launcher/tokiz/BaseToki.kt
rename to app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/BaseToki.kt
index 8ed71c39..279c165a 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/BaseToki.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/BaseToki.kt
@@ -1,9 +1,8 @@
-package bums.lunatic.launcher.tokiz
+package bums.lunatic.launcher.home.tokiz
import android.content.DialogInterface
import android.content.Intent
import android.content.res.Configuration
-import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.os.Handler
@@ -22,8 +21,6 @@ import android.view.View.OnTouchListener
import android.view.View.VISIBLE
import android.view.View.inflate
import android.view.ViewGroup
-import android.webkit.WebView
-import android.webkit.WebViewClient
import android.widget.ArrayAdapter
import android.widget.EditText
import android.widget.ImageButton
@@ -33,15 +30,15 @@ import androidx.appcompat.app.AlertDialog
import androidx.core.net.toUri
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
-import bums.lunatic.launcher.LauncherActivity
-import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
import bums.lunatic.launcher.R
import bums.lunatic.launcher.databinding.BooktokiBinding
+import bums.lunatic.launcher.home.NeoRssActivity
+import bums.lunatic.launcher.home.NeoRssActivity.Companion.getRuntime
import bums.lunatic.launcher.home.toast
-import bums.lunatic.launcher.tokiz.view.BWebview
-import bums.lunatic.launcher.tokiz.view.JxEvent
-import bums.lunatic.launcher.tokiz.view.PagedTextLayout
-import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
+import bums.lunatic.launcher.home.tokiz.view.BWebview
+import bums.lunatic.launcher.home.tokiz.view.JxEvent
+import bums.lunatic.launcher.home.tokiz.view.PagedTextLayout
+import bums.lunatic.launcher.home.tokiz.view.PagedTextViewInterface
import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.workers.WorkersDb
import com.google.gson.Gson
@@ -655,7 +652,7 @@ abstract class BaseToki : Fragment(), PagedTextViewInterface {
binding.menuWeb
- (activity as? LauncherActivity)?.let { activity ->
+ (activity as? NeoRssActivity)?.let { activity ->
binding.menuWeb.decoViews.add(activity.findViewById(R.id.current_address))
binding.menuWeb.decoViews.add(activity.findViewById(R.id.back))
binding.menuWeb.decoViews.add(activity.findViewById(R.id.reload))
@@ -1197,7 +1194,7 @@ abstract class BaseToki : Fragment(), PagedTextViewInterface {
activity?.runOnUiThread {
view.text = contents
view.visibility = VISIBLE
- binding.menuWeb.visibility = View.GONE
+ binding.menuWeb.visibility = GONE
}
view.forceUpdateUI()
lastedUrl?.let {
@@ -1809,7 +1806,7 @@ class Novels : BaseToki(), PagedTextViewInterface {
if (binding.pagedLayer.isVisible) {
binding.pagedLayer.visibility = GONE
}
- binding.menuWeb.visibility = View.VISIBLE
+ binding.menuWeb.visibility = VISIBLE
}
}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/HistoryManager.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/HistoryManager.kt
similarity index 99%
rename from app/src/main/kotlin/bums/lunatic/launcher/tokiz/HistoryManager.kt
rename to app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/HistoryManager.kt
index 2696b2a0..ab2362b3 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/HistoryManager.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/HistoryManager.kt
@@ -1,4 +1,4 @@
-package bums.lunatic.launcher.tokiz
+package bums.lunatic.launcher.home.tokiz
import android.R
import android.content.Context
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Settings.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/Settings.kt
similarity index 99%
rename from app/src/main/kotlin/bums/lunatic/launcher/tokiz/Settings.kt
rename to app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/Settings.kt
index a6f34bf4..3d306d4a 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Settings.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/Settings.kt
@@ -1,4 +1,4 @@
-package bums.lunatic.launcher.tokiz
+package bums.lunatic.launcher.home.tokiz
import android.graphics.Color
import android.os.Build
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/BWebview.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/view/BWebview.kt
similarity index 96%
rename from app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/BWebview.kt
rename to app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/view/BWebview.kt
index 711d5278..0d8b2bac 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/BWebview.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/view/BWebview.kt
@@ -1,4 +1,4 @@
-package bums.lunatic.launcher.tokiz.view
+package bums.lunatic.launcher.home.tokiz.view
import android.annotation.SuppressLint
import android.content.Context
@@ -25,6 +25,7 @@ import org.mozilla.gecko.util.ThreadUtils.runOnUiThread
import org.mozilla.geckoview.GeckoView
import java.io.File
import java.util.Base64
+import kotlin.collections.iterator
enum class JxEvent {
SCROLL_UP,
@@ -93,7 +94,7 @@ open class BWebview : GeckoView {
runOnUiThread {
decoViews.filter { it.id == R.id.dl_video }.firstOrNull()?.let {
it.setOnClickListener {}
- it.visibility = View.GONE
+ it.visibility = GONE
}}}
Blog.LOGE("checkIfDownloadable ${url}")
CoroutineScope(Dispatchers.IO).launch {
@@ -131,7 +132,11 @@ open class BWebview : GeckoView {
it.setOnClickListener {
videoDlownLoad(url)
}
- it.visibility = if (canVideoDown){View.VISIBLE} else{View.GONE}
+ it.visibility = if (canVideoDown){
+ VISIBLE
+ } else{
+ GONE
+ }
}
}
}
@@ -143,7 +148,7 @@ open class BWebview : GeckoView {
runOnUiThread {
decoViews.filter { it.id == R.id.dl_video }.firstOrNull()?.let {
it.setOnClickListener {}
- it.visibility = View.GONE
+ it.visibility = GONE
}}}
}
}
@@ -261,7 +266,7 @@ open class BWebview : GeckoView {
nUrl = lastDomain
}
if (this.isVisible == false) {
- this.visibility = View.VISIBLE
+ this.visibility = VISIBLE
}
Blog.LOGE("nUrl >>>> ${nUrl}")
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextLayout.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/view/PagedTextLayout.kt
similarity index 99%
rename from app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextLayout.kt
rename to app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/view/PagedTextLayout.kt
index f33da79a..bec90f0e 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextLayout.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/view/PagedTextLayout.kt
@@ -1,4 +1,4 @@
-package bums.lunatic.launcher.tokiz.view
+package bums.lunatic.launcher.home.tokiz.view
import android.annotation.TargetApi
import android.content.Context
@@ -12,12 +12,11 @@ import android.util.AttributeSet
import android.util.TypedValue
import android.view.View
import android.widget.TextView
-import android.widget.TextView.BufferType
import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.Guideline
import bums.lunatic.launcher.R
-import bums.lunatic.launcher.tokiz.TouchArea
+import bums.lunatic.launcher.home.tokiz.TouchArea
import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.utils.SimpleFingerGestures
import kotlinx.coroutines.MainScope
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/SideButtonTextView.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/view/SideButtonTextView.kt
similarity index 98%
rename from app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/SideButtonTextView.kt
rename to app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/view/SideButtonTextView.kt
index 2490b18a..f91d3e3c 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/SideButtonTextView.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/home/tokiz/view/SideButtonTextView.kt
@@ -1,4 +1,4 @@
-package bums.lunatic.launcher.tokiz.view
+package bums.lunatic.launcher.home.tokiz.view
import android.content.Context
import android.util.AttributeSet
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/model/SimpleContact.kt b/app/src/main/kotlin/bums/lunatic/launcher/model/SimpleContact.kt
index 710d74ca..ee8b0383 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/model/SimpleContact.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/model/SimpleContact.kt
@@ -17,6 +17,7 @@ class SimpleContact : RealmObject {
// [신규] true면 추천 리스트에 절대 안 뜸
var blockRecommend: Boolean = false
+
constructor(id: String, name: String, phoneNumber: String) {
this.id = id
this.name = name
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/qaccess/QuickAccess.kt b/app/src/main/kotlin/bums/lunatic/launcher/qaccess/QuickAccess.kt
index fe6346f9..225ebe12 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/qaccess/QuickAccess.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/qaccess/QuickAccess.kt
@@ -1,432 +1,432 @@
-/*
- * Lunar Launcher
- * Copyright (C) 2022 Md Rasel Hossain
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package bums.lunatic.launcher.qaccess
-
-import android.Manifest
-import android.app.AlertDialog
-import android.content.Context
-import android.content.Intent
-import android.content.SharedPreferences
-import android.content.pm.PackageManager
-import android.graphics.BlendMode
-import android.graphics.BlendModeColorFilter
-import android.graphics.Color
-import android.graphics.PorterDuff
-import android.graphics.Typeface
-import android.media.AudioManager
-import android.net.Uri
-import android.os.Build
-import android.os.Bundle
-import android.os.PowerManager
-import android.provider.Settings
-import android.text.InputType
-import android.view.Gravity
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.RelativeLayout
-import androidx.appcompat.widget.LinearLayoutCompat
-import androidx.core.content.ContextCompat
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
-import bums.lunatic.launcher.R
-import bums.lunatic.launcher.databinding.QuickAccessBinding
-import bums.lunatic.launcher.databinding.ShortcutMakerBinding
-import bums.lunatic.launcher.helpers.ColorPicker
-import bums.lunatic.launcher.helpers.Constants.Companion.DEFAULT_ICON_SIZE
-import bums.lunatic.launcher.helpers.Constants.Companion.KEY_ICON_SIZE
-import bums.lunatic.launcher.helpers.Constants.Companion.KEY_SHORTCUT_COUNT
-import bums.lunatic.launcher.helpers.Constants.Companion.KEY_SHORTCUT_NO_
-import bums.lunatic.launcher.helpers.Constants.Companion.MAX_SHORTCUTS
-import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SETTINGS
-import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SHORTCUTS
-import bums.lunatic.launcher.helpers.Constants.Companion.SEPARATOR
-import bums.lunatic.launcher.helpers.Constants.Companion.SHORTCUT_TYPE_PHONE
-import bums.lunatic.launcher.helpers.Constants.Companion.SHORTCUT_TYPE_URL
-import bums.lunatic.launcher.model.AppInfo
-import bums.lunatic.launcher.model.SimpleContact
-import bums.lunatic.launcher.utils.Blog
-import bums.lunatic.launcher.workers.WorkersDb
-import com.google.android.material.bottomsheet.BottomSheetDialog
-import com.google.android.material.bottomsheet.BottomSheetDialogFragment
-import com.google.android.material.button.MaterialButtonToggleGroup
-import com.google.android.material.dialog.MaterialAlertDialogBuilder
-import com.google.android.material.slider.Slider
-import com.google.android.material.textview.MaterialTextView
-import io.realm.kotlin.ext.query
-import io.realm.kotlin.query.RealmResults
-import java.util.Objects
-import kotlin.properties.Delegates
-
-
-internal class QuickAccess : BottomSheetDialogFragment() {
-
- private lateinit var binding: QuickAccessBinding
- private lateinit var sharedPreferences: SharedPreferences
- private var iconSize by Delegates.notNull()
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
- binding = QuickAccessBinding.inflate(inflater, container, false)
-
- sharedPreferences = requireContext().getSharedPreferences(PREFS_SHORTCUTS, 0)
- iconSize = requireContext().getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_ICON_SIZE, DEFAULT_ICON_SIZE)
-
- /* set up volume sliders, brightness slider and favorite apps */
- volumeControllers()
- controlBrightness()
-
- return binding.root
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- /* enable dismiss animation */
- (requireDialog() as BottomSheetDialog).dismissWithAnimation = true
- }
-
- override fun onResume() {
- super.onResume()
- /* repopulate shortcuts and apps */
- shortcuts()
- }
-
- /* control the volumes */
- private fun volumeControllers() {
- val audioManager = lActivity!!.getSystemService(Context.AUDIO_SERVICE) as AudioManager
- /* max value */
- binding.notification.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION).toFloat()
- binding.alarm.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM).toFloat()
- binding.media.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat()
- binding.voice.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL).toFloat()
- binding.ring.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING).toFloat()
- /* current value */
- binding.notification.value = audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION).toFloat()
- binding.alarm.value = audioManager.getStreamVolume(AudioManager.STREAM_ALARM).toFloat()
- binding.media.value = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).toFloat()
- binding.voice.value = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL).toFloat()
- binding.ring.value = audioManager.getStreamVolume(AudioManager.STREAM_RING).toFloat()
-
- /* slider change listener for alarm volume */
- binding.alarm.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
- audioManager.setStreamVolume(AudioManager.STREAM_ALARM, value.toInt(), 0)
- })
-
- /* slider change listener for media volume */
- binding.media.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
- audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, value.toInt(), 0)
- })
-
- /* slider change listener for voice call volume */
- binding.voice.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
- audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, value.toInt(), 0)
- })
-
- /* notify and ring volume sliders will work only if
- the device isn't in dnd or silent mode */
- if (Settings.Global.getInt(lActivity!!.contentResolver, "zen_mode") == 0 &&
- audioManager.ringerMode != AudioManager.RINGER_MODE_SILENT) {
- /* slider change listener for notify volume */
- binding.notification.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
- audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, value.toInt(), 0)
- })
- /* slider change listener for ring volume */
- binding.ring.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
- audioManager.setStreamVolume(AudioManager.STREAM_RING, value.toInt(), 0)
- })
- } else {
- binding.notification.isEnabled = false
- binding.ring.isEnabled = false
- }
- }
-
- /* set up contact and url shortcuts */
- private fun shortcuts() {
- binding.shortcutsGroup.removeAllViews()
- val shortcutCount =
- requireContext().getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_SHORTCUT_COUNT, MAX_SHORTCUTS)
- if (shortcutCount == 0) binding.shortcutsGroup.visibility = View.GONE
-
- for (position in 1..shortcutCount) {
- val shortcutValue = sharedPreferences.getString(KEY_SHORTCUT_NO_ + position.toString(), "").toString()
- val splitShortcutValue = shortcutValue.split(SEPARATOR).toTypedArray()
-
- var shortcutType = ""
- var intentString = ""
- var thumbLetter = ""
- var color = ""
-
- try {
- if (splitShortcutValue.size >= 4) {
- shortcutType = splitShortcutValue[0]
- intentString = splitShortcutValue[1]
- thumbLetter = splitShortcutValue[2]
- color = splitShortcutValue[3]
- }
- } catch (exception : Exception) {
- exception.printStackTrace()
- }
-
- shortcutsUtil(textView, shortcutType, intentString, thumbLetter, color, position)
- }
- }
-
- /* control the brightness */
- private fun controlBrightness() {
- val resolver = lActivity!!.contentResolver
- /* set max value */
- binding.brightness.valueTo = maxBrightness
-
- /* set slider value to current brightness value */
- try {
- binding.brightness.value = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS).toFloat()
- } catch (settingNotFoundException: Settings.SettingNotFoundException) {
- settingNotFoundException.printStackTrace()
- }
-
- /* listen slider value changes */
- binding.brightness.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
- /* if write settings permission is not allowed already,
- again ask for it to be granted */
- if (!Settings.System.canWrite(lActivity!!)) {
- lActivity!!.startActivity(
- Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
- .setData(Uri.parse("package:" + lActivity!!.packageName))
- .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- )
- /* set the brightness according to the slider value */
- } else {
- Settings.System.putInt(
- resolver,
- Settings.System.SCREEN_BRIGHTNESS_MODE,
- Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL
- )
- Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, value.toInt())
- }
- })
- }
-
- /* contact/url shortcuts */
- private fun shortcutsUtil(textView: MaterialTextView, shortcutType: String, intentString: String,
- thumbLetter: String, color: String, position: Int) {
- /* show plus sign for empty positions and set click listener */
- if (intentString.isEmpty()) {
- textView.text = "+"
- textView.setOnClickListener {
- shortcutsSaverDialog(position, "00000000", "", "", "")
- }
- } else {
- /* show thumbnail letter */
- textView.text = thumbLetter
- /* set background color */
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
- textView.background.colorFilter =
- BlendModeColorFilter(Color.parseColor("#$color"), BlendMode.MULTIPLY)
- } else {
- @Suppress("DEPRECATION")
- textView.background.setColorFilter(Color.parseColor("#$color"), PorterDuff.Mode.MULTIPLY)
- }
-
- /* on normal click */
- textView.setOnClickListener {
- /* type is url */
- if (shortcutType == SHORTCUT_TYPE_URL) {
- var url = intentString
- Blog.LOGE("intentString >>>> ${intentString}")
- /* add http before the url if it doesn't have http/https prefix */
- if (!url.startsWith("http")) {
-// url = "http://$intentString"
- /* open the url */
- WorkersDb.getRealm().apply {
- var result = query("appName CONTAINS $0 OR koreanName CONTAINS $0", url).find()
- if (result.size == 1) {
- result.first().pkgName?.let {
- try {
- context?.startActivity(context?.packageManager?.getLaunchIntentForPackage(it))
- }catch (e : Exception) {}
- }
- } else {
- lActivity!!.startActivity(
- Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- )
- }
- }
- } else {
- lActivity!!.startActivity(
- Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- )
- }
-
- /* type is contact */
- } else if (shortcutType == SHORTCUT_TYPE_PHONE) {
- /* if the necessary permission is not granted already,
- ask for it again */
- if (lActivity!!.checkSelfPermission(Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
- lActivity!!.requestPermissions(arrayOf(Manifest.permission.CALL_PHONE), 1)
- } else {
- /* make phone call */
-
- WorkersDb.getRealm().writeBlocking {
- Blog.LOGE(">>>> ${query().query("phoneNumber CONTAINS $0", intentString).description()}")
- var result : RealmResults? = null
- if (intentString.startsWith("0")) {
- result = query().query("phoneNumber CONTAINS $0 or phoneNumber CONTAINS $1", intentString, intentString.removeRange(0,1)).find()
- } else {
- result = query().query("phoneNumber CONTAINS $0", intentString).find()
- }
- Blog.LOGE(">>>> ${result.size}")
- if(result.size > 0){
- result.forEach {
- it.touchCount = 1 + it.touchCount
- it.lastedTouchDateTime = System.currentTimeMillis()
- }
- }
- }
- lActivity!!.startActivity(
- Intent(Intent.ACTION_DIAL, Uri.parse("tel:$intentString"))
- )
- }
- }
- try {
- this.dismissAllowingStateLoss()
- } catch (e : Exception) {
-
- }
- }
-
- /* reset the shortcut on long click */
- textView.setOnLongClickListener {
- shortcutsSaverDialog(position, color, thumbLetter, shortcutType, intentString)
- true
- }
- }
- }
-
- /* dialog for creating shortcuts */
- private fun shortcutsSaverDialog(
- position: Int, color: String, thumbLetter: String, shortcutType: String, intentString: String) {
- val dialogBinding = ShortcutMakerBinding.inflate(lActivity!!.layoutInflater)
- val dialogBuilder = MaterialAlertDialogBuilder(lActivity!!)
- .setView(dialogBinding.root)
- .setNeutralButton(R.string.delete, null)
- .setNegativeButton(android.R.string.cancel, null)
- .setPositiveButton(android.R.string.ok, null)
- .show()
-
- dialogBinding.thumbField.setText(thumbLetter)
- dialogBinding.inputField.setText(intentString)
- when (shortcutType) {
- SHORTCUT_TYPE_PHONE -> dialogBinding.shortcutType.check(dialogBinding.contact.id)
- SHORTCUT_TYPE_URL -> dialogBinding.shortcutType.check(dialogBinding.url.id)
- }
-
- /* set up color picker section */
- ColorPicker(color, dialogBinding.colorPicker.colorInput, dialogBinding.colorPicker.colorA,
- dialogBinding.colorPicker.colorR, dialogBinding.colorPicker.colorG,
- dialogBinding.colorPicker.colorB, dialogBinding.root).pickColor()
-
- /* shortcut type chooser - contact/url */
- var updatedShortcutType = shortcutType
- dialogBinding.shortcutType.addOnButtonCheckedListener {
- _: MaterialButtonToggleGroup?, checkedId: Int, isChecked: Boolean ->
- if (isChecked) {
- when (checkedId) {
- dialogBinding.contact.id -> {
- updatedShortcutType = SHORTCUT_TYPE_PHONE
- dialogBinding.inputField.inputType = InputType.TYPE_CLASS_PHONE
- }
- dialogBinding.url.id -> {
- updatedShortcutType = SHORTCUT_TYPE_URL
- dialogBinding.inputField.inputType = InputType.TYPE_TEXT_VARIATION_URI
- }
- }
- }
- }
-
- dialogBuilder.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener {
- sharedPreferences.edit().remove(KEY_SHORTCUT_NO_ + position).apply()
- dialogBuilder.dismiss()
- this.onResume()
- }
-
- /* save the shortcut values */
- dialogBuilder.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
- /* get shortcut value */
- val updatedIntentString =
- Objects.requireNonNull(dialogBinding.inputField.text).toString().trim { it <= ' ' }
- /* get thumbnail letter */
- val updatedThumbLetter =
- Objects.requireNonNull(dialogBinding.thumbField.text).toString().trim { it <= ' ' }.uppercase()
- /* get color value */
- val updatedColor =
- Objects.requireNonNull(dialogBinding.colorPicker.colorInput.text).toString().trim { it <= ' ' }
-
- /* save the values if every field is filled */
- if (updatedShortcutType.isNotEmpty() && updatedIntentString.isNotEmpty() &&
- updatedThumbLetter.isNotEmpty() && updatedColor.isNotEmpty()) {
- sharedPreferences.edit().putString(KEY_SHORTCUT_NO_ + position,
- "$updatedShortcutType$SEPARATOR$updatedIntentString$SEPARATOR" +
- "$updatedThumbLetter$SEPARATOR$updatedColor").apply()
- dialogBuilder.dismiss()
- this.onResume()
- }
- }
- }
-
- /* create text view for shortcut thumbnails */
- private val textView: MaterialTextView get() {
- val relativeLayout = RelativeLayout(lActivity!!)
- relativeLayout.apply {
- layoutParams = LinearLayoutCompat.LayoutParams(
- LinearLayoutCompat.LayoutParams.WRAP_CONTENT,
- LinearLayoutCompat.LayoutParams.WRAP_CONTENT, 1F)
- gravity = Gravity.CENTER
- }
- binding.shortcutsGroup.addView(relativeLayout)
-
- MaterialTextView(requireContext()).apply {
- layoutParams = LinearLayoutCompat.LayoutParams(
- (iconSize * resources.displayMetrics.density).toInt(),
- (iconSize * resources.displayMetrics.density).toInt())
- gravity = Gravity.CENTER
- textSize = (iconSize / 4) * resources.displayMetrics.density
- setTypeface(null, Typeface.BOLD)
- background = ContextCompat.getDrawable(requireContext(), R.drawable.rounded_bg)
- }.let {
- relativeLayout.addView(it)
- return it
- }
- }
-
- /* returns maximum brightness value of the device */
- private val maxBrightness: Float get() {
- val powerManager = requireContext().getSystemService(Context.POWER_SERVICE) as PowerManager
- var value = 255f
- for (f in powerManager.javaClass.declaredFields) {
- if (f.name.equals("BRIGHTNESS_ON")) {
- f.isAccessible = true
- value = try {
- f.getInt(powerManager).toFloat()
- } catch (e: IllegalAccessException) {
- 255f
- }
- }
- }
- return value
- }
-
-}
+///*
+// * Lunar Launcher
+// * Copyright (C) 2022 Md Rasel Hossain
+// *
+// * This program is free software: you can redistribute it and/or modify
+// * it under the terms of the GNU General Public License as published by
+// * the Free Software Foundation, either version 3 of the License, or
+// * (at your option) any later version.
+// *
+// * This program is distributed in the hope that it will be useful,
+// * but WITHOUT ANY WARRANTY; without even the implied warranty of
+// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// * GNU General Public License for more details.
+// *
+// * You should have received a copy of the GNU General Public License
+// * along with this program. If not, see .
+// */
+//
+//package bums.lunatic.launcher.qaccess
+//
+//import android.Manifest
+//import android.app.AlertDialog
+//import android.content.Context
+//import android.content.Intent
+//import android.content.SharedPreferences
+//import android.content.pm.PackageManager
+//import android.graphics.BlendMode
+//import android.graphics.BlendModeColorFilter
+//import android.graphics.Color
+//import android.graphics.PorterDuff
+//import android.graphics.Typeface
+//import android.media.AudioManager
+//import android.net.Uri
+//import android.os.Build
+//import android.os.Bundle
+//import android.os.PowerManager
+//import android.provider.Settings
+//import android.text.InputType
+//import android.view.Gravity
+//import android.view.LayoutInflater
+//import android.view.View
+//import android.view.ViewGroup
+//import android.widget.RelativeLayout
+//import androidx.appcompat.widget.LinearLayoutCompat
+//import androidx.core.content.ContextCompat
+//import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
+//import bums.lunatic.launcher.R
+//import bums.lunatic.launcher.databinding.QuickAccessBinding
+//import bums.lunatic.launcher.databinding.ShortcutMakerBinding
+//import bums.lunatic.launcher.helpers.ColorPicker
+//import bums.lunatic.launcher.helpers.Constants.Companion.DEFAULT_ICON_SIZE
+//import bums.lunatic.launcher.helpers.Constants.Companion.KEY_ICON_SIZE
+//import bums.lunatic.launcher.helpers.Constants.Companion.KEY_SHORTCUT_COUNT
+//import bums.lunatic.launcher.helpers.Constants.Companion.KEY_SHORTCUT_NO_
+//import bums.lunatic.launcher.helpers.Constants.Companion.MAX_SHORTCUTS
+//import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SETTINGS
+//import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SHORTCUTS
+//import bums.lunatic.launcher.helpers.Constants.Companion.SEPARATOR
+//import bums.lunatic.launcher.helpers.Constants.Companion.SHORTCUT_TYPE_PHONE
+//import bums.lunatic.launcher.helpers.Constants.Companion.SHORTCUT_TYPE_URL
+//import bums.lunatic.launcher.model.AppInfo
+//import bums.lunatic.launcher.model.SimpleContact
+//import bums.lunatic.launcher.utils.Blog
+//import bums.lunatic.launcher.workers.WorkersDb
+//import com.google.android.material.bottomsheet.BottomSheetDialog
+//import com.google.android.material.bottomsheet.BottomSheetDialogFragment
+//import com.google.android.material.button.MaterialButtonToggleGroup
+//import com.google.android.material.dialog.MaterialAlertDialogBuilder
+//import com.google.android.material.slider.Slider
+//import com.google.android.material.textview.MaterialTextView
+//import io.realm.kotlin.ext.query
+//import io.realm.kotlin.query.RealmResults
+//import java.util.Objects
+//import kotlin.properties.Delegates
+//
+//
+//internal class QuickAccess : BottomSheetDialogFragment() {
+//
+// private lateinit var binding: QuickAccessBinding
+// private lateinit var sharedPreferences: SharedPreferences
+// private var iconSize by Delegates.notNull()
+//
+// override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+// binding = QuickAccessBinding.inflate(inflater, container, false)
+//
+// sharedPreferences = requireContext().getSharedPreferences(PREFS_SHORTCUTS, 0)
+// iconSize = requireContext().getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_ICON_SIZE, DEFAULT_ICON_SIZE)
+//
+// /* set up volume sliders, brightness slider and favorite apps */
+// volumeControllers()
+// controlBrightness()
+//
+// return binding.root
+// }
+//
+// override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+// super.onViewCreated(view, savedInstanceState)
+// /* enable dismiss animation */
+// (requireDialog() as BottomSheetDialog).dismissWithAnimation = true
+// }
+//
+// override fun onResume() {
+// super.onResume()
+// /* repopulate shortcuts and apps */
+// shortcuts()
+// }
+//
+// /* control the volumes */
+// private fun volumeControllers() {
+// val audioManager = lActivity!!.getSystemService(Context.AUDIO_SERVICE) as AudioManager
+// /* max value */
+// binding.notification.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION).toFloat()
+// binding.alarm.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM).toFloat()
+// binding.media.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat()
+// binding.voice.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL).toFloat()
+// binding.ring.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING).toFloat()
+// /* current value */
+// binding.notification.value = audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION).toFloat()
+// binding.alarm.value = audioManager.getStreamVolume(AudioManager.STREAM_ALARM).toFloat()
+// binding.media.value = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).toFloat()
+// binding.voice.value = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL).toFloat()
+// binding.ring.value = audioManager.getStreamVolume(AudioManager.STREAM_RING).toFloat()
+//
+// /* slider change listener for alarm volume */
+// binding.alarm.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
+// audioManager.setStreamVolume(AudioManager.STREAM_ALARM, value.toInt(), 0)
+// })
+//
+// /* slider change listener for media volume */
+// binding.media.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
+// audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, value.toInt(), 0)
+// })
+//
+// /* slider change listener for voice call volume */
+// binding.voice.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
+// audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, value.toInt(), 0)
+// })
+//
+// /* notify and ring volume sliders will work only if
+// the device isn't in dnd or silent mode */
+// if (Settings.Global.getInt(lActivity!!.contentResolver, "zen_mode") == 0 &&
+// audioManager.ringerMode != AudioManager.RINGER_MODE_SILENT) {
+// /* slider change listener for notify volume */
+// binding.notification.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
+// audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, value.toInt(), 0)
+// })
+// /* slider change listener for ring volume */
+// binding.ring.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
+// audioManager.setStreamVolume(AudioManager.STREAM_RING, value.toInt(), 0)
+// })
+// } else {
+// binding.notification.isEnabled = false
+// binding.ring.isEnabled = false
+// }
+// }
+//
+// /* set up contact and url shortcuts */
+// private fun shortcuts() {
+// binding.shortcutsGroup.removeAllViews()
+// val shortcutCount =
+// requireContext().getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_SHORTCUT_COUNT, MAX_SHORTCUTS)
+// if (shortcutCount == 0) binding.shortcutsGroup.visibility = View.GONE
+//
+// for (position in 1..shortcutCount) {
+// val shortcutValue = sharedPreferences.getString(KEY_SHORTCUT_NO_ + position.toString(), "").toString()
+// val splitShortcutValue = shortcutValue.split(SEPARATOR).toTypedArray()
+//
+// var shortcutType = ""
+// var intentString = ""
+// var thumbLetter = ""
+// var color = ""
+//
+// try {
+// if (splitShortcutValue.size >= 4) {
+// shortcutType = splitShortcutValue[0]
+// intentString = splitShortcutValue[1]
+// thumbLetter = splitShortcutValue[2]
+// color = splitShortcutValue[3]
+// }
+// } catch (exception : Exception) {
+// exception.printStackTrace()
+// }
+//
+// shortcutsUtil(textView, shortcutType, intentString, thumbLetter, color, position)
+// }
+// }
+//
+// /* control the brightness */
+// private fun controlBrightness() {
+// val resolver = lActivity!!.contentResolver
+// /* set max value */
+// binding.brightness.valueTo = maxBrightness
+//
+// /* set slider value to current brightness value */
+// try {
+// binding.brightness.value = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS).toFloat()
+// } catch (settingNotFoundException: Settings.SettingNotFoundException) {
+// settingNotFoundException.printStackTrace()
+// }
+//
+// /* listen slider value changes */
+// binding.brightness.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
+// /* if write settings permission is not allowed already,
+// again ask for it to be granted */
+// if (!Settings.System.canWrite(lActivity!!)) {
+// lActivity!!.startActivity(
+// Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
+// .setData(Uri.parse("package:" + lActivity!!.packageName))
+// .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+// )
+// /* set the brightness according to the slider value */
+// } else {
+// Settings.System.putInt(
+// resolver,
+// Settings.System.SCREEN_BRIGHTNESS_MODE,
+// Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL
+// )
+// Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, value.toInt())
+// }
+// })
+// }
+//
+// /* contact/url shortcuts */
+// private fun shortcutsUtil(textView: MaterialTextView, shortcutType: String, intentString: String,
+// thumbLetter: String, color: String, position: Int) {
+// /* show plus sign for empty positions and set click listener */
+// if (intentString.isEmpty()) {
+// textView.text = "+"
+// textView.setOnClickListener {
+// shortcutsSaverDialog(position, "00000000", "", "", "")
+// }
+// } else {
+// /* show thumbnail letter */
+// textView.text = thumbLetter
+// /* set background color */
+// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+// textView.background.colorFilter =
+// BlendModeColorFilter(Color.parseColor("#$color"), BlendMode.MULTIPLY)
+// } else {
+// @Suppress("DEPRECATION")
+// textView.background.setColorFilter(Color.parseColor("#$color"), PorterDuff.Mode.MULTIPLY)
+// }
+//
+// /* on normal click */
+// textView.setOnClickListener {
+// /* type is url */
+// if (shortcutType == SHORTCUT_TYPE_URL) {
+// var url = intentString
+// Blog.LOGE("intentString >>>> ${intentString}")
+// /* add http before the url if it doesn't have http/https prefix */
+// if (!url.startsWith("http")) {
+//// url = "http://$intentString"
+// /* open the url */
+// WorkersDb.getRealm().apply {
+// var result = query("appName CONTAINS $0 OR koreanName CONTAINS $0", url).find()
+// if (result.size == 1) {
+// result.first().pkgName?.let {
+// try {
+// context?.startActivity(context?.packageManager?.getLaunchIntentForPackage(it))
+// }catch (e : Exception) {}
+// }
+// } else {
+// lActivity!!.startActivity(
+// Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+// )
+// }
+// }
+// } else {
+// lActivity!!.startActivity(
+// Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+// )
+// }
+//
+// /* type is contact */
+// } else if (shortcutType == SHORTCUT_TYPE_PHONE) {
+// /* if the necessary permission is not granted already,
+// ask for it again */
+// if (lActivity!!.checkSelfPermission(Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
+// lActivity!!.requestPermissions(arrayOf(Manifest.permission.CALL_PHONE), 1)
+// } else {
+// /* make phone call */
+//
+// WorkersDb.getRealm().writeBlocking {
+// Blog.LOGE(">>>> ${query().query("phoneNumber CONTAINS $0", intentString).description()}")
+// var result : RealmResults? = null
+// if (intentString.startsWith("0")) {
+// result = query().query("phoneNumber CONTAINS $0 or phoneNumber CONTAINS $1", intentString, intentString.removeRange(0,1)).find()
+// } else {
+// result = query().query("phoneNumber CONTAINS $0", intentString).find()
+// }
+// Blog.LOGE(">>>> ${result.size}")
+// if(result.size > 0){
+// result.forEach {
+// it.touchCount = 1 + it.touchCount
+// it.lastedTouchDateTime = System.currentTimeMillis()
+// }
+// }
+// }
+// lActivity!!.startActivity(
+// Intent(Intent.ACTION_DIAL, Uri.parse("tel:$intentString"))
+// )
+// }
+// }
+// try {
+// this.dismissAllowingStateLoss()
+// } catch (e : Exception) {
+//
+// }
+// }
+//
+// /* reset the shortcut on long click */
+// textView.setOnLongClickListener {
+// shortcutsSaverDialog(position, color, thumbLetter, shortcutType, intentString)
+// true
+// }
+// }
+// }
+//
+// /* dialog for creating shortcuts */
+// private fun shortcutsSaverDialog(
+// position: Int, color: String, thumbLetter: String, shortcutType: String, intentString: String) {
+// val dialogBinding = ShortcutMakerBinding.inflate(lActivity!!.layoutInflater)
+// val dialogBuilder = MaterialAlertDialogBuilder(lActivity!!)
+// .setView(dialogBinding.root)
+// .setNeutralButton(R.string.delete, null)
+// .setNegativeButton(android.R.string.cancel, null)
+// .setPositiveButton(android.R.string.ok, null)
+// .show()
+//
+// dialogBinding.thumbField.setText(thumbLetter)
+// dialogBinding.inputField.setText(intentString)
+// when (shortcutType) {
+// SHORTCUT_TYPE_PHONE -> dialogBinding.shortcutType.check(dialogBinding.contact.id)
+// SHORTCUT_TYPE_URL -> dialogBinding.shortcutType.check(dialogBinding.url.id)
+// }
+//
+// /* set up color picker section */
+// ColorPicker(color, dialogBinding.colorPicker.colorInput, dialogBinding.colorPicker.colorA,
+// dialogBinding.colorPicker.colorR, dialogBinding.colorPicker.colorG,
+// dialogBinding.colorPicker.colorB, dialogBinding.root).pickColor()
+//
+// /* shortcut type chooser - contact/url */
+// var updatedShortcutType = shortcutType
+// dialogBinding.shortcutType.addOnButtonCheckedListener {
+// _: MaterialButtonToggleGroup?, checkedId: Int, isChecked: Boolean ->
+// if (isChecked) {
+// when (checkedId) {
+// dialogBinding.contact.id -> {
+// updatedShortcutType = SHORTCUT_TYPE_PHONE
+// dialogBinding.inputField.inputType = InputType.TYPE_CLASS_PHONE
+// }
+// dialogBinding.url.id -> {
+// updatedShortcutType = SHORTCUT_TYPE_URL
+// dialogBinding.inputField.inputType = InputType.TYPE_TEXT_VARIATION_URI
+// }
+// }
+// }
+// }
+//
+// dialogBuilder.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener {
+// sharedPreferences.edit().remove(KEY_SHORTCUT_NO_ + position).apply()
+// dialogBuilder.dismiss()
+// this.onResume()
+// }
+//
+// /* save the shortcut values */
+// dialogBuilder.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
+// /* get shortcut value */
+// val updatedIntentString =
+// Objects.requireNonNull(dialogBinding.inputField.text).toString().trim { it <= ' ' }
+// /* get thumbnail letter */
+// val updatedThumbLetter =
+// Objects.requireNonNull(dialogBinding.thumbField.text).toString().trim { it <= ' ' }.uppercase()
+// /* get color value */
+// val updatedColor =
+// Objects.requireNonNull(dialogBinding.colorPicker.colorInput.text).toString().trim { it <= ' ' }
+//
+// /* save the values if every field is filled */
+// if (updatedShortcutType.isNotEmpty() && updatedIntentString.isNotEmpty() &&
+// updatedThumbLetter.isNotEmpty() && updatedColor.isNotEmpty()) {
+// sharedPreferences.edit().putString(KEY_SHORTCUT_NO_ + position,
+// "$updatedShortcutType$SEPARATOR$updatedIntentString$SEPARATOR" +
+// "$updatedThumbLetter$SEPARATOR$updatedColor").apply()
+// dialogBuilder.dismiss()
+// this.onResume()
+// }
+// }
+// }
+//
+// /* create text view for shortcut thumbnails */
+// private val textView: MaterialTextView get() {
+// val relativeLayout = RelativeLayout(lActivity!!)
+// relativeLayout.apply {
+// layoutParams = LinearLayoutCompat.LayoutParams(
+// LinearLayoutCompat.LayoutParams.WRAP_CONTENT,
+// LinearLayoutCompat.LayoutParams.WRAP_CONTENT, 1F)
+// gravity = Gravity.CENTER
+// }
+// binding.shortcutsGroup.addView(relativeLayout)
+//
+// MaterialTextView(requireContext()).apply {
+// layoutParams = LinearLayoutCompat.LayoutParams(
+// (iconSize * resources.displayMetrics.density).toInt(),
+// (iconSize * resources.displayMetrics.density).toInt())
+// gravity = Gravity.CENTER
+// textSize = (iconSize / 4) * resources.displayMetrics.density
+// setTypeface(null, Typeface.BOLD)
+// background = ContextCompat.getDrawable(requireContext(), R.drawable.rounded_bg)
+// }.let {
+// relativeLayout.addView(it)
+// return it
+// }
+// }
+//
+// /* returns maximum brightness value of the device */
+// private val maxBrightness: Float get() {
+// val powerManager = requireContext().getSystemService(Context.POWER_SERVICE) as PowerManager
+// var value = 255f
+// for (f in powerManager.javaClass.declaredFields) {
+// if (f.name.equals("BRIGHTNESS_ON")) {
+// f.isAccessible = true
+// value = try {
+// f.getInt(powerManager).toFloat()
+// } catch (e: IllegalAccessException) {
+// 255f
+// }
+// }
+// }
+// return value
+// }
+//
+//}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/workers/AppInfoGetter.kt b/app/src/main/kotlin/bums/lunatic/launcher/workers/AppInfoGetter.kt
index b56345dd..cee7f0de 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/workers/AppInfoGetter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/workers/AppInfoGetter.kt
@@ -6,15 +6,10 @@ import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
import android.os.Build
-import androidx.work.WorkerParameters
import bums.lunatic.launcher.BuildConfig
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
-import bums.lunatic.launcher.apps.AppDrawer.Companion.appNamesPrefs
import bums.lunatic.launcher.model.AppInfo
import bums.lunatic.launcher.utils.AlphabetToChosungMap
-import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.utils.JamoUtils
-import io.realm.kotlin.ext.query
import io.realm.kotlin.types.RealmObject
import java.text.Normalizer
import java.util.regex.Pattern
@@ -31,7 +26,7 @@ class AppInfoGetter : BaseGetter {
override fun realWork(): List {
var result = mutableListOf()
try {
- val packageManager = lActivity?.packageManager ?: return result
+ val packageManager = context.packageManager ?: return result
// 1. 설치된 앱 목록 가져오기 (시스템 호출 1회)
val intent = Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER)
@@ -44,9 +39,6 @@ class AppInfoGetter : BaseGetter {
resolveInfos.forEach { ri ->
val pkgName = ri.activityInfo.packageName
if (pkgName == BuildConfig.APPLICATION_ID) return@forEach
-
- // 이미 DB에 있는지 Map에서 확인 (고속 검색)
- // 신규 앱 발견 -> 추가
val appName = normalize(appName(ri))
result.add(AppInfo().apply {
@@ -67,9 +59,10 @@ class AppInfoGetter : BaseGetter {
fun appName(resolver: ResolveInfo): String {
- return resolver.loadLabel(lActivity?.packageManager!!).toString().apply {
- appNamesPrefs?.edit()?.putString(resolver.activityInfo.packageName, this)?.apply()
- }
+ return resolver.loadLabel(context.packageManager!!).toString()
+// .apply {
+// appNamesPrefs?.edit()?.putString(resolver.activityInfo.packageName, this)?.apply()
+// }
}
fun getCategory(category : Int) : String {
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/workers/ContactInfoGetter.kt b/app/src/main/kotlin/bums/lunatic/launcher/workers/ContactInfoGetter.kt
index 40e7b6be..148bab97 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/workers/ContactInfoGetter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/workers/ContactInfoGetter.kt
@@ -2,8 +2,6 @@ package bums.lunatic.launcher.workers
import android.content.Context
import android.provider.ContactsContract
-import androidx.work.WorkerParameters
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.model.SimpleContact
import bums.lunatic.launcher.utils.Blog
import io.realm.kotlin.ext.query
@@ -25,7 +23,7 @@ class ContactInfoGetter(context: Context) : BaseGetter(context) {
try {
- lActivity?.contentResolver?.query(phoneUri, projection, null, null, null)?.use { cursor ->
+ context.applicationContext?.contentResolver?.query(phoneUri, projection, null, null, null)?.use { cursor ->
val idIdx = cursor.getColumnIndex(projection[0])
val nameIdx = cursor.getColumnIndex(projection[1])
val numberIdx = cursor.getColumnIndex(projection[2])
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/workers/DotaxGetter.kt b/app/src/main/kotlin/bums/lunatic/launcher/workers/DotaxGetter.kt
index 2a5ca005..d58d2e4f 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/workers/DotaxGetter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/workers/DotaxGetter.kt
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.Context
import androidx.work.WorkerParameters
import bums.lunatic.launcher.LauncherActivity
+import bums.lunatic.launcher.home.NeoRssActivity
import bums.lunatic.launcher.model.RssDataType
import bums.lunatic.launcher.utils.Blog
import io.realm.kotlin.types.RealmObject
@@ -26,7 +27,7 @@ class DotaxGetter(context: Context) : BaseGetter(context) {
temp.clear()
CoroutineScope(Dispatchers.Main).launch {
withContext(Dispatchers.Main) {
- LauncherActivity.lActivity?.let {
+ NeoRssActivity.lActivity?.let {
it.contentsLoad("https://m.cafe.daum.net/dotax/Elgq")
}
}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/workers/RecentCallGetter.kt b/app/src/main/kotlin/bums/lunatic/launcher/workers/RecentCallGetter.kt
index 9f8bdb79..5bed964f 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/workers/RecentCallGetter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/workers/RecentCallGetter.kt
@@ -4,7 +4,6 @@ import android.annotation.SuppressLint
import android.content.Context
import android.provider.CallLog
import androidx.work.WorkerParameters
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.utils.beforeDay
import bums.lunatic.launcher.utils.getContactId
import com.google.gson.Gson
@@ -46,72 +45,72 @@ class RecentCall : RealmObject {
}
}
-
-class RecentCallGetter(context: Context) : BaseGetter(context) {
- companion object{
- var dayRange = BaseGetter.defaultDay
- val TAG = "RecentCallGetter"
- val dateFormat = SimpleDateFormat("yyy/MM/dd-HH:mm:ss")
- }
-
- @SuppressLint("RestrictedApi")
- override fun realWork(): List {
- var temp = mutableListOf()
- var dateParam = beforeDay(dayRange).toString()
- var managedCursor = lActivity?.contentResolver?.query(
- CallLog.Calls.CONTENT_URI, arrayOf(
- CallLog.Calls.NUMBER,
- CallLog.Calls.TYPE,
- CallLog.Calls.DATE,
- CallLog.Calls.DURATION,
- CallLog.Calls.CACHED_NAME,
- ), CallLog.Calls.DATE + " >= ? " , arrayOf(dateParam), CallLog.Calls.DATE + " desc")
-
- if(managedCursor != null && managedCursor.isClosed == false) {
- try {
- val number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER)
- val type = managedCursor.getColumnIndex(CallLog.Calls.TYPE)
- val date = managedCursor.getColumnIndex(CallLog.Calls.DATE)
- val duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION)
- val name = managedCursor.getColumnIndex(CallLog.Calls.CACHED_NAME)
- 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 = callDate.toLong()
- val callDuration = managedCursor.getString(duration)
- val callerName = managedCursor.getString(name)
-
- var dir: String = ""
- val dircode = callType.toInt()
- when (dircode) {
- CallLog.Calls.INCOMING_TYPE -> { dir = "INCOMING_TYPE" }
- CallLog.Calls.OUTGOING_TYPE -> { dir = "OUTGOING_TYPE" }
- CallLog.Calls.MISSED_TYPE -> { dir = "MISSED_TYPE" }
- CallLog.Calls.VOICEMAIL_TYPE -> { dir = "VOICEMAIL_TYPE" }
- CallLog.Calls.REJECTED_TYPE -> { dir = "REJECTED_TYPE" }
- CallLog.Calls.BLOCKED_TYPE -> { dir = "BLOCKED_TYPE" }
- CallLog.Calls.ANSWERED_EXTERNALLY_TYPE -> { dir = "ANSWERED_EXTERNALLY_TYPE" }
- }
- temp.add(RecentCall(
- 1,
- callerName,
- phNumber,
- dircode,
- dir,
- dateFormat.format(Date(callDayTime)),
- callDayTime,
- callDuration.toLong()
- ))
-
- }
- } catch (e: Exception) {
- e.printStackTrace()
- } finally {
- managedCursor.close()
- }
- }
- return temp
- }
-
-}
\ No newline at end of file
+//
+//class RecentCallGetter(context: Context) : BaseGetter(context) {
+// companion object{
+// var dayRange = BaseGetter.defaultDay
+// val TAG = "RecentCallGetter"
+// val dateFormat = SimpleDateFormat("yyy/MM/dd-HH:mm:ss")
+// }
+//
+// @SuppressLint("RestrictedApi")
+// override fun realWork(): List {
+// var temp = mutableListOf()
+// var dateParam = beforeDay(dayRange).toString()
+// var managedCursor = lActivity?.contentResolver?.query(
+// CallLog.Calls.CONTENT_URI, arrayOf(
+// CallLog.Calls.NUMBER,
+// CallLog.Calls.TYPE,
+// CallLog.Calls.DATE,
+// CallLog.Calls.DURATION,
+// CallLog.Calls.CACHED_NAME,
+// ), CallLog.Calls.DATE + " >= ? " , arrayOf(dateParam), CallLog.Calls.DATE + " desc")
+//
+// if(managedCursor != null && managedCursor.isClosed == false) {
+// try {
+// val number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER)
+// val type = managedCursor.getColumnIndex(CallLog.Calls.TYPE)
+// val date = managedCursor.getColumnIndex(CallLog.Calls.DATE)
+// val duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION)
+// val name = managedCursor.getColumnIndex(CallLog.Calls.CACHED_NAME)
+// 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 = callDate.toLong()
+// val callDuration = managedCursor.getString(duration)
+// val callerName = managedCursor.getString(name)
+//
+// var dir: String = ""
+// val dircode = callType.toInt()
+// when (dircode) {
+// CallLog.Calls.INCOMING_TYPE -> { dir = "INCOMING_TYPE" }
+// CallLog.Calls.OUTGOING_TYPE -> { dir = "OUTGOING_TYPE" }
+// CallLog.Calls.MISSED_TYPE -> { dir = "MISSED_TYPE" }
+// CallLog.Calls.VOICEMAIL_TYPE -> { dir = "VOICEMAIL_TYPE" }
+// CallLog.Calls.REJECTED_TYPE -> { dir = "REJECTED_TYPE" }
+// CallLog.Calls.BLOCKED_TYPE -> { dir = "BLOCKED_TYPE" }
+// CallLog.Calls.ANSWERED_EXTERNALLY_TYPE -> { dir = "ANSWERED_EXTERNALLY_TYPE" }
+// }
+// temp.add(RecentCall(
+// 1,
+// callerName,
+// phNumber,
+// dircode,
+// dir,
+// dateFormat.format(Date(callDayTime)),
+// callDayTime,
+// callDuration.toLong()
+// ))
+//
+// }
+// } catch (e: Exception) {
+// e.printStackTrace()
+// } finally {
+// managedCursor.close()
+// }
+// }
+// return temp
+// }
+//
+//}
\ No newline at end of file
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/workers/RecentSmsGetter.kt b/app/src/main/kotlin/bums/lunatic/launcher/workers/RecentSmsGetter.kt
index 4d9546ad..5cb6fdb5 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/workers/RecentSmsGetter.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/workers/RecentSmsGetter.kt
@@ -1,107 +1,116 @@
package bums.lunatic.launcher.workers
-import android.annotation.SuppressLint
-import android.content.ContentResolver
-import android.content.Context
-import android.database.Cursor
-import android.net.Uri
-import android.provider.Telephony
-import androidx.work.WorkerParameters
-import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
-import bums.lunatic.launcher.utils.beforeDay
-import bums.lunatic.launcher.utils.getContactName
-import bums.lunatic.launcher.workers.RecentSmsGetter.Companion.dayRange
import com.google.gson.Gson
-import io.realm.kotlin.ext.query
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
-import java.io.BufferedReader
-import java.io.IOException
-import java.io.InputStream
-import java.io.InputStreamReader
-class RecentSmsGetter(context: Context) : BaseGetter(context) {
- companion object {
- var dayRange = BaseGetter.defaultDay
- val SMS_WORK_TAG = "RecentSmsGetter"
- }
-
-
- @SuppressLint("RestrictedApi")
- override fun realWork(): List {
- var temp = mutableListOf()
- var dateParam = beforeDay(dayRange).toString()
- val managedCursor = lActivity?.contentResolver?.query(
- Telephony.Sms.CONTENT_URI, arrayOf(
- Telephony.Sms.THREAD_ID,
- Telephony.Sms.ADDRESS,
- Telephony.Sms.TYPE,
- Telephony.Sms.DATE,
- Telephony.Sms.DATE_SENT,
- Telephony.Sms.BODY,
- Telephony.Sms.PERSON,
- ), Telephony.Sms.DATE + "> ${dateParam}", null, Telephony.Sms.DEFAULT_SORT_ORDER)
- if (managedCursor != null && managedCursor.isClosed == false) {
- try {
- val tid = managedCursor.getColumnIndex(Telephony.Sms.THREAD_ID)
- val address = managedCursor.getColumnIndex(Telephony.Sms.ADDRESS)
- val type = managedCursor.getColumnIndex(Telephony.Sms.TYPE)
- val date = managedCursor.getColumnIndex(Telephony.Sms.DATE)
- val sendDate = managedCursor.getColumnIndex(Telephony.Sms.DATE_SENT)
- val bodyIdx = managedCursor.getColumnIndex(Telephony.Sms.BODY)
- val name = managedCursor.getColumnIndex(Telephony.Sms.PERSON)
- while (managedCursor.moveToNext()) {
- val id = managedCursor.getString(tid) // mobile number
- val phNumber = managedCursor.getString(address) // mobile number
- val callType = managedCursor.getString(type) // call type
- val reciveDate = managedCursor.getLong(date) // call date
- val sendedDate = managedCursor.getLong(sendDate) // call date
- val smsBody = managedCursor.getString(bodyIdx).replace("\n"," ")
- val callerName = managedCursor.getString(name)
-
- var dir: String = ""
- val dircode = callType.toInt()
- when (dircode) {
- Telephony.Sms.MESSAGE_TYPE_ALL -> {dir = "MESSAGE_TYPE_ALL"}
- Telephony.Sms.MESSAGE_TYPE_INBOX -> {dir = "MESSAGE_TYPE_INBOX"}
- Telephony.Sms.MESSAGE_TYPE_SENT -> {dir = "MESSAGE_TYPE_SENT"}
- Telephony.Sms.MESSAGE_TYPE_DRAFT -> {dir = "MESSAGE_TYPE_DRAFT"}
- Telephony.Sms.MESSAGE_TYPE_OUTBOX -> {dir = "MESSAGE_TYPE_OUTBOX"}
- Telephony.Sms.MESSAGE_TYPE_FAILED -> {dir = "MESSAGE_TYPE_FAILED"}
- Telephony.Sms.MESSAGE_TYPE_QUEUED -> {dir = "MESSAGE_TYPE_QUEUED"}
- }
- var log = RecentSms(
- id.plus("_").plus(reciveDate).plus("_").plus(sendedDate),
- phNumber,
- dir,
- reciveDate,
- sendedDate,
- smsBody,
- callerName ?: ""
- )
- log.isMms = false
-// BLog.LOGE("RecentSmsGetter resultData put ${phNumber +"_"+ reciveDate} >>> ${log.toJson()}")
- log.sender = getContactName(context.applicationContext.contentResolver,phNumber) ?: ""
- temp.add(log)
- }
- } catch (e: Exception) {
-
- } finally {
- managedCursor.close()
- }
- }
- if (lActivity?.contentResolver != null) {
- MmsQueryHelper(lActivity?.contentResolver!!).query()
- }
- return temp
- }
-
-}
-
-internal class RecentSms : RealmObject {
+//
+//import android.annotation.SuppressLint
+//import android.content.ContentResolver
+//import android.content.Context
+//import android.database.Cursor
+//import android.net.Uri
+//import android.provider.Telephony
+//import androidx.work.WorkerParameters
+//import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
+//import bums.lunatic.launcher.utils.beforeDay
+//import bums.lunatic.launcher.utils.getContactName
+//import bums.lunatic.launcher.workers.RecentSmsGetter.Companion.dayRange
+//import com.google.gson.Gson
+//import io.realm.kotlin.ext.query
+//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
+//import java.io.BufferedReader
+//import java.io.IOException
+//import java.io.InputStream
+//import java.io.InputStreamReader
+//
+//class RecentSmsGetter(context: Context) : BaseGetter(context) {
+// companion object {
+// var dayRange = BaseGetter.defaultDay
+// val SMS_WORK_TAG = "RecentSmsGetter"
+// }
+//
+//
+// @SuppressLint("RestrictedApi")
+// override fun realWork(): List {
+// var temp = mutableListOf()
+// var dateParam = beforeDay(dayRange).toString()
+// val managedCursor = lActivity?.contentResolver?.query(
+// Telephony.Sms.CONTENT_URI, arrayOf(
+// Telephony.Sms.THREAD_ID,
+// Telephony.Sms.ADDRESS,
+// Telephony.Sms.TYPE,
+// Telephony.Sms.DATE,
+// Telephony.Sms.DATE_SENT,
+// Telephony.Sms.BODY,
+// Telephony.Sms.PERSON,
+// ), Telephony.Sms.DATE + "> ${dateParam}", null, Telephony.Sms.DEFAULT_SORT_ORDER)
+// if (managedCursor != null && managedCursor.isClosed == false) {
+// try {
+// val tid = managedCursor.getColumnIndex(Telephony.Sms.THREAD_ID)
+// val address = managedCursor.getColumnIndex(Telephony.Sms.ADDRESS)
+// val type = managedCursor.getColumnIndex(Telephony.Sms.TYPE)
+// val date = managedCursor.getColumnIndex(Telephony.Sms.DATE)
+// val sendDate = managedCursor.getColumnIndex(Telephony.Sms.DATE_SENT)
+// val bodyIdx = managedCursor.getColumnIndex(Telephony.Sms.BODY)
+// val name = managedCursor.getColumnIndex(Telephony.Sms.PERSON)
+// while (managedCursor.moveToNext()) {
+// val id = managedCursor.getString(tid) // mobile number
+// val phNumber = managedCursor.getString(address) // mobile number
+// val callType = managedCursor.getString(type) // call type
+// val reciveDate = managedCursor.getLong(date) // call date
+// val sendedDate = managedCursor.getLong(sendDate) // call date
+// val smsBody = managedCursor.getString(bodyIdx).replace("\n"," ")
+// val callerName = managedCursor.getString(name)
+//
+// var dir: String = ""
+// val dircode = callType.toInt()
+// when (dircode) {
+// Telephony.Sms.MESSAGE_TYPE_ALL -> {dir = "MESSAGE_TYPE_ALL"}
+// Telephony.Sms.MESSAGE_TYPE_INBOX -> {dir = "MESSAGE_TYPE_INBOX"}
+// Telephony.Sms.MESSAGE_TYPE_SENT -> {dir = "MESSAGE_TYPE_SENT"}
+// Telephony.Sms.MESSAGE_TYPE_DRAFT -> {dir = "MESSAGE_TYPE_DRAFT"}
+// Telephony.Sms.MESSAGE_TYPE_OUTBOX -> {dir = "MESSAGE_TYPE_OUTBOX"}
+// Telephony.Sms.MESSAGE_TYPE_FAILED -> {dir = "MESSAGE_TYPE_FAILED"}
+// Telephony.Sms.MESSAGE_TYPE_QUEUED -> {dir = "MESSAGE_TYPE_QUEUED"}
+// }
+// var log = RecentSms(
+// id.plus("_").plus(reciveDate).plus("_").plus(sendedDate),
+// phNumber,
+// dir,
+// reciveDate,
+// sendedDate,
+// smsBody,
+// callerName ?: ""
+// )
+// log.isMms = false
+//// BLog.LOGE("RecentSmsGetter resultData put ${phNumber +"_"+ reciveDate} >>> ${log.toJson()}")
+// log.sender = getContactName(context.applicationContext.contentResolver,phNumber) ?: ""
+// temp.add(log)
+// }
+// } catch (e: Exception) {
+//
+// } finally {
+// managedCursor.close()
+// }
+// }
+// if (lActivity?.contentResolver != null) {
+// MmsQueryHelper(lActivity?.contentResolver!!).query()
+// }
+// return temp
+// }
+//
+//}
+//
+//internal
+ class RecentSms : RealmObject {
@PrimaryKey
var uniqKey : String = ""
@@ -164,199 +173,199 @@ internal class RecentSms : RealmObject {
return Gson().toJson(this)
}
}
-
-internal class MmsQueryHelper(
- private val _contentResolver: ContentResolver
-) {
-
- private val mmsUri: Uri = Telephony.Mms.CONTENT_URI
- private val cursor: Cursor?
- get() =
- _contentResolver.query(
- mmsUri,
- null,
- null,
- null,
- null
- )
-
- fun dataMapper(cursor: Cursor): RecentSms {
- val id = cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Mms._ID))
- val date = cursor.getLong(cursor.getColumnIndexOrThrow(Telephony.Mms.DATE)) * 1000
- val sender : String = getSender(id) ?: throw NullPointerException("NotFound Sender For Mms")
- val body = getBody(id) ?: throw NullPointerException("NotFound Body by Mms")
-
- return RecentSms(
- id = id.toString(),
- date = date,
- body = body,
- sender = sender
- ).apply {
- isMms = true
- this.sender = getContactName(_contentResolver,addr) ?: ""
- }
- }
-
- private fun getSender(id: Int): String? {
- _contentResolver.query(
- Uri.parse("content://mms/$id/addr"),
- null,
- "${Telephony.Mms.Addr.MSG_ID} = ?",
- arrayOf(id.toString()),
- null
- )?.use { senderAddressCursor ->
- if (senderAddressCursor.moveToFirst()) {
- do {
- // 137 수신, 151 발신 타입 값이다. Telephony.Mms.Addr.Type 의 주석 참고.
- val isSender = senderAddressCursor.getInt(
- senderAddressCursor.getColumnIndexOrThrow(Telephony.Mms.Addr.TYPE)
- ) == 137
- var sender = senderAddressCursor.getString(
- senderAddressCursor.getColumnIndexOrThrow(Telephony.Mms.Addr.ADDRESS)
- )
-// BLog.LOGE("sender >> ${sender}")
- if (isSender) {
- return sender
- }
- } while (senderAddressCursor.moveToNext())
- }
- }
- return null
- }
-
- private fun getMmsText(id: String): String {
- val partURI = Uri.parse("content://mms/part/$id")
- var `is`: InputStream? = null
- val sb = StringBuilder()
- try {
- `is` = _contentResolver.openInputStream(partURI)
- if (`is` != null) {
- val isr = InputStreamReader(`is`, "UTF-8")
- val reader = BufferedReader(isr)
- var temp = reader.readLine()
- while (temp != null) {
- sb.append(temp)
- temp = reader.readLine()
- }
- }
- } catch (e: IOException) {
- } finally {
- if (`is` != null) {
- try {
- `is`.close()
- } catch (e: IOException) {
- }
- }
- }
- return sb.toString()
- }
- private fun getBody(id: Int): HashMap> {
- var returns = hashMapOf>()
- val text = arrayListOf()
- val image = arrayListOf()
- val audio = arrayListOf()
- val partsIds = arrayListOf()
- partsIds.add(id.toString())
- val projection = arrayOf("*")
- val video = arrayListOf()
- _contentResolver.query(
- Uri.parse("content://mms/part"),
- projection,
- "${Telephony.Mms.Part.MSG_ID} = ?",
- arrayOf(id.toString()),
- null
- )?.use { partsCursor ->
- if (partsCursor.moveToFirst()) {
- do {
- val partId: String = partsCursor.getString(partsCursor.getColumnIndexOrThrow(
- Telephony.Mms.Part._ID))
- val partContentType =
- partsCursor.getString(partsCursor.getColumnIndexOrThrow(Telephony.Mms.Part.CONTENT_TYPE))
-// BLog.LOGE("partContentType >> ${partContentType}")
- partsIds.add(partId.toString())
- if(partContentType?.contains("text") == true) {
-// BLog.LOGE("partContentType text >> ${partContentType} :: ${partId}")
- val data =
- partsCursor.getString(partsCursor.getColumnIndexOrThrow(Telephony.Mms.Part._DATA))
- val textBody =
- partsCursor.getString(partsCursor.getColumnIndexOrThrow(Telephony.Mms.Part.TEXT))
- if (data != null && data.length > 0) {
- text.add(getMmsText(partId))
- } else {
- text.add(textBody)
- }
- }
- else if(partContentType?.contains("image") == true) {
-// BLog.LOGE("partContentType image >> ${partContentType}:: ${partId}")
- image.add(partId)
- }
- else if(partContentType?.contains("audio") == true) {
-// BLog.LOGE("partContentType audio >> ${partContentType}:: ${partId}")
- audio.add(partId)
- }
- else if(partContentType?.contains("video") == true) {
-// BLog.LOGE("partContentType video >> ${partContentType}:: ${partId}")
- video.add(partId)
- }
- else {
-// BLog.LOGE("partContentType >> ${partContentType}:: ${partId}")
- }
-
-// if (partContentType == "text/plain") {
-// var textBody =
-// partsCursor.getString(partsCursor.getColumnIndexOrThrow(Telephony.Mms.Part.TEXT))
-//// .replace("\n\n", "\n").replace("\n", " ")
-//// if (textBody.length > 60) {
-//// textBody = textBody.substring(0, Math.min(textBody.length, 60)).plus(" ... ")
-//// }
-//// BLog.LOGE("textBody >>> ${textBody}")
-// return Pair(textBody , partContentType)
+//
+//internal class MmsQueryHelper(
+// private val _contentResolver: ContentResolver
+//) {
+//
+// private val mmsUri: Uri = Telephony.Mms.CONTENT_URI
+// private val cursor: Cursor?
+// get() =
+// _contentResolver.query(
+// mmsUri,
+// null,
+// null,
+// null,
+// null
+// )
+//
+// fun dataMapper(cursor: Cursor): RecentSms {
+// val id = cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Mms._ID))
+// val date = cursor.getLong(cursor.getColumnIndexOrThrow(Telephony.Mms.DATE)) * 1000
+// val sender : String = getSender(id) ?: throw NullPointerException("NotFound Sender For Mms")
+// val body = getBody(id) ?: throw NullPointerException("NotFound Body by Mms")
+//
+// return RecentSms(
+// id = id.toString(),
+// date = date,
+// body = body,
+// sender = sender
+// ).apply {
+// isMms = true
+// this.sender = getContactName(_contentResolver,addr) ?: ""
+// }
+// }
+//
+// private fun getSender(id: Int): String? {
+// _contentResolver.query(
+// Uri.parse("content://mms/$id/addr"),
+// null,
+// "${Telephony.Mms.Addr.MSG_ID} = ?",
+// arrayOf(id.toString()),
+// null
+// )?.use { senderAddressCursor ->
+// if (senderAddressCursor.moveToFirst()) {
+// do {
+// // 137 수신, 151 발신 타입 값이다. Telephony.Mms.Addr.Type 의 주석 참고.
+// val isSender = senderAddressCursor.getInt(
+// senderAddressCursor.getColumnIndexOrThrow(Telephony.Mms.Addr.TYPE)
+// ) == 137
+// var sender = senderAddressCursor.getString(
+// senderAddressCursor.getColumnIndexOrThrow(Telephony.Mms.Addr.ADDRESS)
+// )
+//// BLog.LOGE("sender >> ${sender}")
+// if (isSender) {
+// return sender
// }
- } while (partsCursor.moveToNext())
- }
- }
- returns.put("partId", partsIds)
- returns.put("text", text)
- returns.put("image", image)
- returns.put("audio", audio)
- returns.put("video", video)
-// BLog.LOGE("returns.get(text).join => ${text.size} :: ${text.joinToString("\n")}")
- return returns
- }
-
- fun convertData(cursor: Cursor?) {
- cursor ?: return
- val dateTime = beforeDay(dayRange)
- cursor.use {
- if (cursor.moveToFirst()) {
- do {
- val data = kotlin.runCatching {
- dataMapper(cursor)
- }.getOrNull()
- data?.let {
- if (it?.pstDate ?: 0L > dateTime || it?.rcvDate ?: 0L > dateTime) {
- WorkersDb.getRealm().apply {
- if (query("uniqKey == $0", it.uniqKey).find().size == 0) {
- writeBlocking {
- copyToRealm(it)
- }
- }
-// else if (it.isMms && it.addr.contains("#CMAS#")){
+// } while (senderAddressCursor.moveToNext())
+// }
+// }
+// return null
+// }
+//
+// private fun getMmsText(id: String): String {
+// val partURI = Uri.parse("content://mms/part/$id")
+// var `is`: InputStream? = null
+// val sb = StringBuilder()
+// try {
+// `is` = _contentResolver.openInputStream(partURI)
+// if (`is` != null) {
+// val isr = InputStreamReader(`is`, "UTF-8")
+// val reader = BufferedReader(isr)
+// var temp = reader.readLine()
+// while (temp != null) {
+// sb.append(temp)
+// temp = reader.readLine()
+// }
+// }
+// } catch (e: IOException) {
+// } finally {
+// if (`is` != null) {
+// try {
+// `is`.close()
+// } catch (e: IOException) {
+// }
+// }
+// }
+// return sb.toString()
+// }
+// private fun getBody(id: Int): HashMap> {
+// var returns = hashMapOf>()
+// val text = arrayListOf()
+// val image = arrayListOf()
+// val audio = arrayListOf()
+// val partsIds = arrayListOf()
+// partsIds.add(id.toString())
+// val projection = arrayOf("*")
+// val video = arrayListOf()
+// _contentResolver.query(
+// Uri.parse("content://mms/part"),
+// projection,
+// "${Telephony.Mms.Part.MSG_ID} = ?",
+// arrayOf(id.toString()),
+// null
+// )?.use { partsCursor ->
+// if (partsCursor.moveToFirst()) {
+// do {
+// val partId: String = partsCursor.getString(partsCursor.getColumnIndexOrThrow(
+// Telephony.Mms.Part._ID))
+// val partContentType =
+// partsCursor.getString(partsCursor.getColumnIndexOrThrow(Telephony.Mms.Part.CONTENT_TYPE))
+//// BLog.LOGE("partContentType >> ${partContentType}")
+// partsIds.add(partId.toString())
+// if(partContentType?.contains("text") == true) {
+//// BLog.LOGE("partContentType text >> ${partContentType} :: ${partId}")
+// val data =
+// partsCursor.getString(partsCursor.getColumnIndexOrThrow(Telephony.Mms.Part._DATA))
+// val textBody =
+// partsCursor.getString(partsCursor.getColumnIndexOrThrow(Telephony.Mms.Part.TEXT))
+// if (data != null && data.length > 0) {
+// text.add(getMmsText(partId))
+// } else {
+// text.add(textBody)
+// }
+// }
+// else if(partContentType?.contains("image") == true) {
+//// BLog.LOGE("partContentType image >> ${partContentType}:: ${partId}")
+// image.add(partId)
+// }
+// else if(partContentType?.contains("audio") == true) {
+//// BLog.LOGE("partContentType audio >> ${partContentType}:: ${partId}")
+// audio.add(partId)
+// }
+// else if(partContentType?.contains("video") == true) {
+//// BLog.LOGE("partContentType video >> ${partContentType}:: ${partId}")
+// video.add(partId)
+// }
+// else {
+//// BLog.LOGE("partContentType >> ${partContentType}:: ${partId}")
+// }
+//
+//// if (partContentType == "text/plain") {
+//// var textBody =
+//// partsCursor.getString(partsCursor.getColumnIndexOrThrow(Telephony.Mms.Part.TEXT))
+////// .replace("\n\n", "\n").replace("\n", " ")
+////// if (textBody.length > 60) {
+////// textBody = textBody.substring(0, Math.min(textBody.length, 60)).plus(" ... ")
+////// }
+////// BLog.LOGE("textBody >>> ${textBody}")
+//// return Pair(textBody , partContentType)
+//// }
+// } while (partsCursor.moveToNext())
+// }
+// }
+// returns.put("partId", partsIds)
+// returns.put("text", text)
+// returns.put("image", image)
+// returns.put("audio", audio)
+// returns.put("video", video)
+//// BLog.LOGE("returns.get(text).join => ${text.size} :: ${text.joinToString("\n")}")
+// return returns
+// }
+//
+// fun convertData(cursor: Cursor?) {
+// cursor ?: return
+// val dateTime = beforeDay(dayRange)
+// cursor.use {
+// if (cursor.moveToFirst()) {
+// do {
+// val data = kotlin.runCatching {
+// dataMapper(cursor)
+// }.getOrNull()
+// data?.let {
+// if (it?.pstDate ?: 0L > dateTime || it?.rcvDate ?: 0L > dateTime) {
+// WorkersDb.getRealm().apply {
+// if (query("uniqKey == $0", it.uniqKey).find().size == 0) {
// writeBlocking {
-// it.uniqKey = it.uniqKey.plus("1")
// copyToRealm(it)
// }
// }
- }
-// smsList.add(it)
- }
- }
- } while (cursor.moveToNext())
- }
- }
- }
- fun query() {
- return convertData(cursor)
- }
-
-}
\ No newline at end of file
+//// else if (it.isMms && it.addr.contains("#CMAS#")){
+//// writeBlocking {
+//// it.uniqKey = it.uniqKey.plus("1")
+//// copyToRealm(it)
+//// }
+//// }
+// }
+//// smsList.add(it)
+// }
+// }
+// } while (cursor.moveToNext())
+// }
+// }
+// }
+// fun query() {
+// return convertData(cursor)
+// }
+//
+//}
\ No newline at end of file
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/workers/TaskAggregator.kt b/app/src/main/kotlin/bums/lunatic/launcher/workers/TaskAggregator.kt
index 137fc750..27669a10 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/workers/TaskAggregator.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/workers/TaskAggregator.kt
@@ -28,7 +28,8 @@ object TaskAggregator {
// 2. [일괄 저장 및 병합] 트랜잭션 시작
realm.write {
-
+ var oldA = 0
+ var newA = 0
// --- [A] 앱 정보 병합 (AppInfo) ---
// DB에 있는 기존 앱들을 패키지명(Key) 기준으로 Map 생성
val existingAppsMap = query(AppInfo::class).find().associateBy { it.pkgName }
@@ -38,57 +39,46 @@ object TaskAggregator {
val pkgName = newApp.pkgName ?: return@forEach
activeAppPkgNames.add(pkgName)
- // 기존 데이터가 있으면 카운트 정보 이식
- val oldApp = existingAppsMap[pkgName]
- if (oldApp != null) {
- newApp.clickCount = oldApp.clickCount
- newApp.lastUseDate = oldApp.lastUseDate
- newApp.visibilityMode = oldApp.visibilityMode
- newApp.blockRecommend = oldApp.blockRecommend
- // 즐겨찾기 여부 등 보존해야 할 다른 필드가 있다면 여기서 복사
- // newApp.isFavorite = oldApp.isFavorite
+ if (existingAppsMap.contains(pkgName)) {
+ existingAppsMap.get(pkgName)?.let { oldApp->
+ newApp.clickCount = oldApp.clickCount
+ newApp.lastUseDate = oldApp.lastUseDate
+ newApp.visibilityMode = oldApp.visibilityMode
+ newApp.blockRecommend = oldApp.blockRecommend
+ oldA += 1
+ }
+ } else {
+ newA += 1
}
-
// 병합된 데이터 저장 (덮어쓰기)
copyToRealm(newApp, UpdatePolicy.ALL)
}
+ Blog.LOGE("scannedApps Size ${scannedApps.size} OLD APP UPDATE ${oldA} NEW APP INSERT ${newA} TOTAL ${oldA + newA}")
- // 삭제된 앱 처리 (시스템 스캔 목록에 없는 앱은 DB에서 삭제)
- val appsToDelete = query(AppInfo::class).find().filter {
- !activeAppPkgNames.contains(it.pkgName)
- }
- appsToDelete.forEach { delete(it) }
-
-
- // --- [B] 연락처 정보 병합 (SimpleContact) ---
- // DB에 있는 기존 연락처들을 ID(Key) 기준으로 Map 생성
- // (SimpleContact의 PrimaryKey가 id라고 가정)
val existingContactsMap = query(SimpleContact::class).find().associateBy { it.id }
val activeContactIds = HashSet()
-
+ oldA = 0
+ newA = 0
scannedContacts.forEach { newContact ->
// SimpleContact 타입 캐스팅 (fetchData 반환형이 List이므로)
val contact = newContact as? SimpleContact ?: return@forEach
val contactId = contact.id ?: return@forEach
activeContactIds.add(contactId)
-
- val oldContact = existingContactsMap[contactId]
- if (oldContact != null) {
- contact.touchCount = oldContact.touchCount
- contact.lastedTouchDateTime = oldContact.lastedTouchDateTime
- contact.visibilityMode = oldContact.visibilityMode
- contact.blockRecommend = oldContact.blockRecommend
+ if (existingContactsMap.contains(contactId)) {
+ existingContactsMap.get(contactId)?.let { oldContact->
+ contact.touchCount = oldContact.touchCount
+ contact.lastedTouchDateTime = oldContact.lastedTouchDateTime
+ contact.visibilityMode = oldContact.visibilityMode
+ contact.blockRecommend = oldContact.blockRecommend
+ oldA += 1
+ }
+ } else {
+ newA += 1
}
-
copyToRealm(contact, UpdatePolicy.ALL)
}
-
- // 삭제된 연락처 처리
-// val contactsToDelete = query(SimpleContact::class).find().filter {
-// !activeContactIds.contains(it.id)
-// }
-// contactsToDelete.forEach { delete(it) }
+ Blog.LOGE("scannedContacts Size ${scannedContacts.size} OLD APP UPDATE ${oldA} NEW APP INSERT ${newA} TOTAL ${oldA + newA}")
}
diff --git a/app/src/main/kotlin/bums/lunatic/launcher/workers/WorkersDb.kt b/app/src/main/kotlin/bums/lunatic/launcher/workers/WorkersDb.kt
index 6ded9c6d..1d520f07 100644
--- a/app/src/main/kotlin/bums/lunatic/launcher/workers/WorkersDb.kt
+++ b/app/src/main/kotlin/bums/lunatic/launcher/workers/WorkersDb.kt
@@ -29,11 +29,11 @@ import bums.lunatic.launcher.model.TelegramFrom
import bums.lunatic.launcher.model.TelegramMessage
import bums.lunatic.launcher.model.WeatherForcast
import bums.lunatic.launcher.model.WidgetData
-import bums.lunatic.launcher.tokiz.ContentsCollection
-import bums.lunatic.launcher.tokiz.ContentsPageInfo
-import bums.lunatic.launcher.tokiz.HistoryItem
-import bums.lunatic.launcher.tokiz.LastInfo
-import bums.lunatic.launcher.tokiz.ReaderConfig
+import bums.lunatic.launcher.home.tokiz.ContentsCollection
+import bums.lunatic.launcher.home.tokiz.ContentsPageInfo
+import bums.lunatic.launcher.home.tokiz.HistoryItem
+import bums.lunatic.launcher.home.tokiz.LastInfo
+import bums.lunatic.launcher.home.tokiz.ReaderConfig
import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.utils.JamoUtils
import bums.lunatic.launcher.utils.afterDay
@@ -293,29 +293,7 @@ object WorkersDb {
}
}
- fun update(info: AppInfo) {
- getRealm().apply {
- this.writeBlocking {
- try {
- this.copyToRealm(info, UpdatePolicy.ALL)
- } catch (e : Exception) {
- e.printStackTrace()
- }
- }
- }
- }
- fun update(contact: SimpleContact) {
- getRealm().apply {
- this.writeBlocking {
- try {
- this.copyToRealm(contact, UpdatePolicy.ALL)
- } catch (e : Exception) {
- e.printStackTrace()
- }
- }
- }
- }
fun insertCall(contact: RecentCall) {
getRealm().apply {
this.writeBlocking {
diff --git a/app/src/main/res/drawable/bg_circle.xml b/app/src/main/res/drawable/bg_circle.xml
new file mode 100644
index 00000000..d791066c
--- /dev/null
+++ b/app/src/main/res/drawable/bg_circle.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_key_accs.xml b/app/src/main/res/drawable/bg_key_accs.xml
new file mode 100644
index 00000000..18ce91b9
--- /dev/null
+++ b/app/src/main/res/drawable/bg_key_accs.xml
@@ -0,0 +1,28 @@
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/booktoki.xml b/app/src/main/res/layout/booktoki.xml
index 79096670..6c1b5b4c 100644
--- a/app/src/main/res/layout/booktoki.xml
+++ b/app/src/main/res/layout/booktoki.xml
@@ -8,7 +8,7 @@
android:layout_height="match_parent"
>
-
-
-
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/launcher_activity.xml b/app/src/main/res/layout/launcher_activity.xml
index 11811a46..ea89e7fe 100644
--- a/app/src/main/res/layout/launcher_activity.xml
+++ b/app/src/main/res/layout/launcher_activity.xml
@@ -32,166 +32,5 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="10dp"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/layout_textviewer.xml b/app/src/main/res/layout/layout_textviewer.xml
index e20464d0..f19bfa39 100644
--- a/app/src/main/res/layout/layout_textviewer.xml
+++ b/app/src/main/res/layout/layout_textviewer.xml
@@ -13,7 +13,7 @@
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/settings.xml b/app/src/main/res/layout/settings.xml
index 2485e9c7..7101210a 100644
--- a/app/src/main/res/layout/settings.xml
+++ b/app/src/main/res/layout/settings.xml
@@ -39,22 +39,22 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
-
-
-
-
-
-
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 2fdc757d..58a6b5bd 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -36,6 +36,17 @@
- 1dp
- #000000
+