This commit is contained in:
lunaticbum 2026-01-12 13:58:11 +09:00
parent f21f96f8a3
commit 6e7e9685ab
46 changed files with 3154 additions and 2775 deletions

View File

@ -92,9 +92,29 @@
tools:ignore="HardcodedDebugMode"> tools:ignore="HardcodedDebugMode">
<activity
android:name=".home.NeoRssActivity"
android:theme="@style/Theme.LunarLauncher.Starting"
android:launchMode="singleInstance"
android:screenOrientation="userPortrait"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|screenLayout|layoutDirection|navigation"
android:windowSoftInputMode="adjustResize"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.WEB_SEARCH"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*"/>
</intent-filter>
</activity>
<!-- android:excludeFromRecents="true"-->
<!-- portrait|reversePortrait|userPortrait|sensorPortrait-->
<activity <activity
android:name=".LauncherActivity" android:name=".LauncherActivity"
android:theme="@style/Theme.LunarLauncher.Starting" android:theme="@style/Theme.LunarLauncher.Starting"
@ -108,18 +128,7 @@
<category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.WEB_SEARCH"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*"/>
</intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
@ -172,7 +181,7 @@
<!-- </activity>--> <!-- </activity>-->
<activity <activity
android:name=".tokiz.Settings" android:name=".home.tokiz.Settings"
android:label="@string/lunar_settings" android:label="@string/lunar_settings"
android:launchMode="singleInstance" android:launchMode="singleInstance"
android:excludeFromRecents="true" android:excludeFromRecents="true"

View File

@ -42,7 +42,6 @@ import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.apps.AppDrawerBottomSheet import bums.lunatic.launcher.apps.AppDrawerBottomSheet
import bums.lunatic.launcher.common.CommonActivity import bums.lunatic.launcher.common.CommonActivity
import bums.lunatic.launcher.databinding.LauncherActivityBinding import bums.lunatic.launcher.databinding.LauncherActivityBinding
@ -50,20 +49,10 @@ import bums.lunatic.launcher.feeds.WidgetHost
import bums.lunatic.launcher.helpers.ForeGroundService import bums.lunatic.launcher.helpers.ForeGroundService
import bums.lunatic.launcher.helpers.HeadsetActionButtonReceiver import bums.lunatic.launcher.helpers.HeadsetActionButtonReceiver
import bums.lunatic.launcher.home.GeckoWeb import bums.lunatic.launcher.home.GeckoWeb
import bums.lunatic.launcher.home.NeoRssActivity
import bums.lunatic.launcher.home.RssHome import bums.lunatic.launcher.home.RssHome
import bums.lunatic.launcher.home.adapters.BookmarkDetailFragment
import bums.lunatic.launcher.home.adapters.BookmarkPagerFragment
import bums.lunatic.launcher.model.RssData
import bums.lunatic.launcher.model.RssDataType
import bums.lunatic.launcher.model.WidgetData import bums.lunatic.launcher.model.WidgetData
import bums.lunatic.launcher.receiver.NLService import bums.lunatic.launcher.receiver.NLService
import bums.lunatic.launcher.settings.SettingsActivity
import bums.lunatic.launcher.tokiz.Comics
import bums.lunatic.launcher.tokiz.Magnet
import bums.lunatic.launcher.tokiz.Novels
import bums.lunatic.launcher.tokiz.Perplexity
import bums.lunatic.launcher.tokiz.Webtoons
import bums.lunatic.launcher.tokiz.YouTube
import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.workers.WorkersDb import bums.lunatic.launcher.workers.WorkersDb
import bums.lunatic.launcher.workers.WorkersDb.syncSystemUsageStats import bums.lunatic.launcher.workers.WorkersDb.syncSystemUsageStats
@ -195,23 +184,16 @@ open class LauncherActivity : CommonActivity() {
} }
fun onSwipeRight() { fun onSwipeRight() {
showContents(R.id.feeds) startActivity(Intent(this, NeoRssActivity::class.java))
} }
private lateinit var binding: LauncherActivityBinding private lateinit var binding: LauncherActivityBinding
companion object { companion object {
private var sRuntime: GeckoRuntime? = null var sActivity : Activity? = null
fun getRuntime() : GeckoRuntime? {
lActivity?.initGeckoRuntime()
return sRuntime
}
var isOpendFold = false var isOpendFold = false
val qDayPeriod = 60L * 8L val qDayPeriod = 60L * 8L
@JvmStatic var lActivity: LauncherActivity? = null
} }
var hiddenLoader : HashMap<String,GeckoWeb> = hashMapOf() var hiddenLoader : HashMap<String,GeckoWeb> = hashMapOf()
@ -245,188 +227,7 @@ open class LauncherActivity : CommonActivity() {
var actionButtonPressY = 0f var actionButtonPressY = 0f
var onExit = false var onExit = false
var lastAction = MotionEvent.ACTION_HOVER_EXIT 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<RssData>()
.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<String>()
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) { override fun onNewIntent(intent: Intent) {
Blog.LOGE("onNewIntent intent >> ${intent}") Blog.LOGE("onNewIntent intent >> ${intent}")
@ -568,7 +369,7 @@ open class LauncherActivity : CommonActivity() {
val intent = Intent(this, ForeGroundService::class.java) val intent = Intent(this, ForeGroundService::class.java)
this.startForegroundService(intent) this.startForegroundService(intent)
// 1. 시스템 바 공간을 앱이 차지하도록 설정 (상태바 뒤로 레이아웃 확장)
WindowCompat.setDecorFitsSystemWindows(window, false) WindowCompat.setDecorFitsSystemWindows(window, false)
// 2. 상태바 색상을 투명하게 변경 (필요한 경우) // 2. 상태바 색상을 투명하게 변경 (필요한 경우)
@ -580,10 +381,10 @@ open class LauncherActivity : CommonActivity() {
this.startService(nlService) this.startService(nlService)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
lActivity = this
DynamicColors.applyToActivityIfAvailable(this) DynamicColors.applyToActivityIfAvailable(this)
binding = LauncherActivityBinding.inflate(layoutInflater) binding = LauncherActivityBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
sActivity = this
homeGestureDetector = androidx.core.view.GestureDetectorCompat(this, HomeGestureListener()) homeGestureDetector = androidx.core.view.GestureDetectorCompat(this, HomeGestureListener())
binding.widgetContainer.setOnTouchListener { view, event -> binding.widgetContainer.setOnTouchListener { view, event ->
// 위젯 드래그 중이 아닐 때만 제스처 처리 // 위젯 드래그 중이 아닐 때만 제스처 처리
@ -607,36 +408,13 @@ open class LauncherActivity : CommonActivity() {
updateLocationService() 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) { if (intent?.action == Intent.ACTION_WEB_SEARCH) {
openWithIntent(intent) openWithIntent(intent)
} }
val nullCursor = PointerIcon.getSystemIcon(this, PointerIcon.TYPE_NULL) val nullCursor = PointerIcon.getSystemIcon(this, PointerIcon.TYPE_NULL)
binding.root.setPointerIcon(nullCursor) 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) appWidgetManager = AppWidgetManager.getInstance(this)
appWidgetHost = WidgetHost(applicationContext, APPWIDGET_HOST_ID) appWidgetHost = WidgetHost(applicationContext, APPWIDGET_HOST_ID)
@ -675,6 +453,10 @@ open class LauncherActivity : CommonActivity() {
}) })
} }
override fun onPause() {
super.onPause()
}
// 위젯 선택기 실행 // 위젯 선택기 실행
fun selectWidget() { fun selectWidget() {
val appWidgetId = appWidgetHost?.allocateAppWidgetId() 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 { override fun onTouchEvent(event: MotionEvent?): Boolean {
Blog.LOGE("event >>> ${event}") Blog.LOGE("event >>> ${event}")
@ -991,12 +697,7 @@ open class LauncherActivity : CommonActivity() {
} }
override fun onDestroy() { override fun onDestroy() {
try {
sRuntime?.shutdown()
sRuntime = null
} catch (e: Exception) { e.printStackTrace() }
// appWidgetHost?.stopListening() // 이 줄은 제거하고 onStop으로 이동
super.onDestroy() super.onDestroy()
} }
@ -1046,26 +747,7 @@ open class LauncherActivity : CommonActivity() {
private fun handleBackPress() { private fun handleBackPress() {
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() { 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)
}
}
} }
}) })
} }

View File

@ -1,506 +1,421 @@
/* ///*
* Lunar Launcher // * Lunar Launcher
* Copyright (C) 2022 Md Rasel Hossain // * Copyright (C) 2022 Md Rasel Hossain
* // *
* This program is free software: you can redistribute it and/or modify // * 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 // * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or // * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. // * (at your option) any later version.
* // *
* This program is distributed in the hope that it will be useful, // * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of // * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. // * GNU General Public License for more details.
* // *
* You should have received a copy of the GNU General Public License // * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. // * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ // */
//
package bums.lunatic.launcher.apps //package bums.lunatic.launcher.apps
//
import android.content.Context //import android.content.Context
import android.content.Intent //import android.content.Intent
import android.content.SharedPreferences //import android.content.SharedPreferences
import android.content.pm.PackageManager //import android.content.pm.PackageManager
import android.net.Uri //import android.net.Uri
import android.os.Bundle //import android.os.Bundle
import android.os.Handler //import android.os.Handler
import android.os.Looper //import android.os.Looper
import android.view.KeyEvent //import android.view.KeyEvent
import android.view.View.GONE //import android.view.View.GONE
import android.view.View.VISIBLE //import android.view.View.VISIBLE
import android.view.inputmethod.InputMethodManager //import android.view.inputmethod.InputMethodManager
import androidx.core.widget.doOnTextChanged //import androidx.core.widget.doOnTextChanged
import androidx.recyclerview.widget.GridLayoutManager //import androidx.recyclerview.widget.GridLayoutManager
import bums.lunatic.launcher.BuildConfig //import bums.lunatic.launcher.BuildConfig
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity //import bums.lunatic.launcher.LauncherActivity.Companion.sActivity
import bums.lunatic.launcher.common.CommonActivity //import bums.lunatic.launcher.common.CommonActivity
import bums.lunatic.launcher.common.letTrue //import bums.lunatic.launcher.common.letTrue
import bums.lunatic.launcher.databinding.AppDrawerBinding //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_COUNT
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_APPS_LAYOUT //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_APP_NAMES
import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SETTINGS //import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SETTINGS
import bums.lunatic.launcher.helpers.PrefBoolean //import bums.lunatic.launcher.helpers.PrefBoolean
import bums.lunatic.launcher.helpers.PrefLong //import bums.lunatic.launcher.helpers.PrefLong
import bums.lunatic.launcher.helpers.PrefString //import bums.lunatic.launcher.helpers.PrefString
import bums.lunatic.launcher.model.AppInfo //import bums.lunatic.launcher.model.AppInfo
import bums.lunatic.launcher.model.SimpleContact //import bums.lunatic.launcher.model.SimpleContact
import bums.lunatic.launcher.utils.Blog //import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.utils.JamoUtils //import bums.lunatic.launcher.utils.JamoUtils
import bums.lunatic.launcher.workers.UsageLogType //import bums.lunatic.launcher.workers.UsageLogType
import bums.lunatic.launcher.workers.UsageUpdateType //import bums.lunatic.launcher.workers.UsageUpdateType
import bums.lunatic.launcher.workers.WorkersDb //import bums.lunatic.launcher.workers.WorkersDb
import io.realm.kotlin.ext.query //import io.realm.kotlin.ext.query
import io.realm.kotlin.query.RealmResults //import io.realm.kotlin.query.RealmResults
import io.realm.kotlin.query.Sort //import io.realm.kotlin.query.Sort
import java.net.URLEncoder //import java.net.URLEncoder
import java.util.concurrent.Executors //import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit //import java.util.concurrent.TimeUnit
import java.util.regex.Pattern //import java.util.regex.Pattern
//
//
class AppDrawer : CommonActivity() { //class AppDrawer : CommonActivity() {
//
private lateinit var binding: AppDrawerBinding // private lateinit var binding: AppDrawerBinding
private var layoutType: Int = 0 // private var layoutType: Int = 0
// private var isSearchShown: Boolean = false // // private var isSearchShown: Boolean = false
private var isKeyboardShowing: Boolean = false // private var isKeyboardShowing: Boolean = false
//
companion object { // companion object {
//
private var appsAdapter: AppsAdapter? = null // private var appsAdapter: AppsAdapter? = null
private var contactAdapter : ContactAdapter? = null // private var contactAdapter : ContactAdapter? = null
private var packageList = mutableListOf<AppInfo>() // private var packageList = mutableListOf<AppInfo>()
@JvmStatic var settingsPrefs: SharedPreferences? = null // @JvmStatic var settingsPrefs: SharedPreferences? = null
@JvmStatic var appNamesPrefs: 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
// } // }
// fun getInputText() = binding.searchInput.text.toString()
// override fun onAttach(context: Context) { // override fun onCreate(savedInstanceState: Bundle?) {
// super.onAttach(context) // 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 { // appsAdapter = AppsAdapter(packageManager!!, supportFragmentManager, binding.appsCount)
// contactAdapter = ContactAdapter(applicationContext, supportFragmentManager)
binding = AppDrawerBinding.inflate(layoutInflater) //
setContentView(binding.root) // binding.appsCount.visibility = if (settingsPrefs!!.getBoolean(KEY_APPS_COUNT, true)) VISIBLE else GONE
settingsPrefs = this.getSharedPreferences(PREFS_SETTINGS, 0) // binding.searchNmap.setOnClickListener {
appNamesPrefs = this.getSharedPreferences(PREFS_APP_NAMES, 0) // openSearchApps("nmap://search?query=${getInputText()}&appname=${BuildConfig.APPLICATION_ID}","com.nhn.android.nmap")
layoutType = settingsPrefs!!.getInt(KEY_APPS_LAYOUT, 0) // }
// binding.searchYoutube.setOnClickListener {
appsAdapter = AppsAdapter(packageManager!!, supportFragmentManager, binding.appsCount) // openSearchApps("https://www.youtube.com/results?search_query=${getInputText()}","com.google.android.youtube")
contactAdapter = ContactAdapter(applicationContext, supportFragmentManager) // }
// binding.searchGoogleMap.setOnClickListener {
binding.appsCount.visibility = if (settingsPrefs!!.getBoolean(KEY_APPS_COUNT, true)) VISIBLE else GONE // openSearchApps("geo:0,0?q=${getInputText()}","com.google.android.apps.maps")
binding.searchNmap.setOnClickListener { // }
openSearchApps("nmap://search?query=${getInputText()}&appname=${BuildConfig.APPLICATION_ID}","com.nhn.android.nmap") // binding.searchGoogle.setOnClickListener {
} // openSearchApps("https://www.google.com/search?q=${getInputText()}","com.android.chrome")
binding.searchYoutube.setOnClickListener { // }
openSearchApps("https://www.youtube.com/results?search_query=${getInputText()}","com.google.android.youtube") // binding.searchTmap.setOnClickListener {
} // openSearchApps("tmap://search?name=${getInputText()}","com.skt.tmap.ku")
binding.searchGoogleMap.setOnClickListener { //
openSearchApps("geo:0,0?q=${getInputText()}","com.google.android.apps.maps") // }
} // binding.searchNaver.setOnClickListener {
binding.searchGoogle.setOnClickListener { // openSearchApps("https://search.naver.com/search.naver?where=nexearch&query=${getInputText()}", "com.nhn.android.search")
openSearchApps("https://www.google.com/search?q=${getInputText()}","com.android.chrome") // }
} // binding.searchDuckduckgo.setOnClickListener {
binding.searchTmap.setOnClickListener { // openSearchApps("https://duckduckgo.com/?t=h_&q=${getInputText()}","com.duckduckgo.mobile.android")
openSearchApps("tmap://search?name=${getInputText()}","com.skt.tmap.ku") // }
// binding.searchNamuwiki.setOnClickListener {
} // openSearchApps("https://namu.wiki/Search?q=${getInputText()}")
binding.searchNaver.setOnClickListener { // }
openSearchApps("https://search.naver.com/search.naver?where=nexearch&query=${getInputText()}", "com.nhn.android.search") //
} // binding.searchTranslate.setOnClickListener {
binding.searchDuckduckgo.setOnClickListener { // openSearchApps("https://translate.google.com/?hl=ko&sl=ko&tl=en&text=${getInputText()}&op=translate","com.android.chrome")
openSearchApps("https://duckduckgo.com/?t=h_&q=${getInputText()}","com.duckduckgo.mobile.android") // }
} // binding.searchStore.setOnClickListener {
binding.searchNamuwiki.setOnClickListener { // openSearchApps("market://search?q=${getInputText()}")
openSearchApps("https://namu.wiki/Search?q=${getInputText()}") // }
} // binding.runSend.setOnClickListener {
// sendMsg()
binding.searchTranslate.setOnClickListener { // }
openSearchApps("https://translate.google.com/?hl=ko&sl=ko&tl=en&text=${getInputText()}&op=translate","com.android.chrome") // binding.runTelegram.setOnClickListener {
} // sendMsg("tg://msg?text=${getInputText()}&to=${PrefString.telegramSendTarget.get()}","org.telegram.messenger")
binding.searchStore.setOnClickListener { // }
openSearchApps("market://search?q=${getInputText()}") // binding.runKatalk.setOnClickListener {
} // sendMsg(pkg = "com.kakao.talk")
binding.runSend.setOnClickListener { // }
sendMsg() //
} // binding.runKatalkT.setOnClickListener{
binding.runTelegram.setOnClickListener { // openSearchApps("kakaot://taxi?dest_lat=${URLEncoder.encode("37.467696")}&dest_lng=${URLEncoder.encode("127.101063")}","com.kakao.taxi")
sendMsg("tg://msg?text=${getInputText()}&to=${PrefString.telegramSendTarget.get()}","org.telegram.messenger") //// openSearchApps("kakaot://taxi?${URLEncoder.encode("세곡동 557")}","com.kakao.taxi")
} //// openSearchApps("kakaot://taxi?dest_addr=${URLEncoder.encode("세곡동 557")}","com.kakao.taxi")
binding.runKatalk.setOnClickListener { // }
sendMsg(pkg = "com.kakao.talk") // setLayout()
} // binding.searchInput.setOnKeyListener { v, keyCode, event ->
// //contactList.size < 1 && packageList.size < 1 &&
binding.runKatalkT.setOnClickListener{ // if(PrefBoolean.useQuickLaunch.get(false) && keyCode == 66 && event.action == KeyEvent.ACTION_UP) {
openSearchApps("kakaot://taxi?dest_lat=${URLEncoder.encode("37.467696")}&dest_lng=${URLEncoder.encode("127.101063")}","com.kakao.taxi") // checkResult(binding.searchInput.text.toString())
// openSearchApps("kakaot://taxi?${URLEncoder.encode("세곡동 557")}","com.kakao.taxi") // true
// openSearchApps("kakaot://taxi?dest_addr=${URLEncoder.encode("세곡동 557")}","com.kakao.taxi") // }else {
} // false
setLayout() // }
binding.searchInput.setOnKeyListener { v, keyCode, event -> // }
//contactList.size < 1 && packageList.size < 1 && // var packageManager = sActivity?.packageManager
if(PrefBoolean.useQuickLaunch.get(false) && keyCode == 66 && event.action == KeyEvent.ACTION_UP) { //
checkResult(binding.searchInput.text.toString()) // binding.searchInput.setOnLongClickListener {
true // WorkersDb.getRealm().apply {
}else { // var newQ = query<AppInfo>()
false // appQuery = newQ.sort(Pair("clickCount", Sort.DESCENDING),Pair("lastUseDate",Sort.DESCENDING)).find()
} // appQuery?.let {
} // if(it.size > 0) {
var packageManager = lActivity?.packageManager // WorkersDb.getRealm().apply {
// packageList.clear()
binding.searchInput.setOnLongClickListener { // writeBlocking {
WorkersDb.getRealm().apply { // it.filter {
var newQ = query<AppInfo>() // var installed = isPackageInstalled(it.pkgName ?: "fffffffail", packageManager!!)
appQuery = newQ.sort(Pair("clickCount", Sort.DESCENDING),Pair("lastUseDate",Sort.DESCENDING)).find() //// it.isInstalled = installed
appQuery?.let { // installed
if(it.size > 0) { // }.let { result ->
WorkersDb.getRealm().apply { // packageList.addAll(copyFromRealm(result))
packageList.clear() // binding.appsList.post { if (result.size > 0) {
writeBlocking { // appsAdapter?.updateData(packageList)
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<SimpleContact>()
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<AppInfo>()
val contactList = arrayListOf<SimpleContact>()
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<AppInfo>? = null
fun fetchApps(keyword : String? = null) {
WorkersDb.getRealm().apply {
var newQ = query<AppInfo>()
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<SimpleContact>? = null
fun fetcContact(keyword : String? = null) {
WorkersDb.getRealm().apply {
var newQ = query<SimpleContact>()
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")
// } // }
// } // }
//
// }.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<SimpleContact>()
// 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<AppInfo>()
// val contactList = arrayListOf<SimpleContact>()
//
// 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) { // override fun onResume() {
fetchApps(searchString) // super.onResume()
registCancelSearch() // Blog.LOGE("onResume")
} // fetchApps()
//
fun openSearch() { // binding.appsCount.visibility = if (PrefBoolean.showAppResultCount.get(false)) VISIBLE else GONE
try { //
binding.searchInput.apply { // PrefBoolean.openWithKayboard.get().letTrue { openSearch() }
visibility = VISIBLE // registCancelSearch()
requestFocus() // }
let { //
(getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager)?.showSoftInput( // val chechHandler = Handler(Looper.getMainLooper())
it, //
InputMethodManager.SHOW_IMPLICIT // val cancelSearch = Runnable {
) // finish()
} // }
} //
} catch (e : UninitializedPropertyAccessException) { // fun registCancelSearch() {
// chechHandler.removeCallbacks(cancelSearch)
} // chechHandler.postDelayed(cancelSearch, 15000L)
} // }
//
/* clear search string, hide keyboard and search box */ // fun clearCancelSearch() {
private fun closeSearch() { // chechHandler.removeCallbacks(cancelSearch)
binding.searchInput.apply { // }
let { //
text?.clear() // override fun onPause() {
(getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager)?.hideSoftInputFromWindow(it.windowToken, 0) // 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<AppInfo>? = null
// fun fetchApps(keyword : String? = null) {
// WorkersDb.getRealm().apply {
// var newQ = query<AppInfo>()
// 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<SimpleContact>? = null
// fun fetcContact(keyword : String? = null) {
// WorkersDb.getRealm().apply {
// var newQ = query<SimpleContact>()
// 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)
// }
// }
// }
//
//}
//

View File

@ -37,6 +37,7 @@ import io.realm.kotlin.query.Sort
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.net.URLEncoder
class AppDrawerBottomSheet : BottomSheetDialogFragment() { class AppDrawerBottomSheet : BottomSheetDialogFragment() {
@ -176,29 +177,74 @@ class AppDrawerBottomSheet : BottomSheetDialogFragment() {
} }
} }
val keyword : String
get() {
return binding.searchInput.text.toString()
}
private fun setupSearchButtons() { private fun setupSearchButtons() {
// 기존 AppDrawer의 버튼 연결 // 기존 AppDrawer의 버튼 연결
binding.searchNmap.setOnClickListener { 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 { 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 { binding.searchGoogle.setOnClickListener {
val intent = Intent(Intent.ACTION_WEB_SEARCH).apply { val intent = Intent(Intent.ACTION_WEB_SEARCH).apply {
putExtra(SearchManager.QUERY, getInputText()) // 질문 전달 putExtra(SearchManager.QUERY, keyword) // 질문 전달
} }
if (intent.resolveActivity(requireContext().packageManager) != null) { if (intent.resolveActivity(requireContext().packageManager) != null) {
startActivity(intent) startActivity(intent)
} }
} }
binding.searchNaver.setOnClickListener { 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) { private fun openSearchApps(schemeString: String, packageName: String? = null) {
try { 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<SimpleContact>() var contactQuery = realm.query<SimpleContact>()
@ -315,7 +367,13 @@ class AppDrawerBottomSheet : BottomSheetDialogFragment() {
contactQuery = contactQuery.sort("touchCount", Sort.DESCENDING).limit(10) contactQuery = contactQuery.sort("touchCount", Sort.DESCENDING).limit(10)
val contactsResult = contactQuery.find() 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}") Blog.LOGE("unifiedList >>> ${unifiedList.size}")

View File

@ -24,6 +24,7 @@ import android.content.ActivityNotFoundException
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.Rect import android.graphics.Rect
@ -43,15 +44,14 @@ import android.widget.Toast
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.pm.PackageInfoCompat
import androidx.core.widget.doOnTextChanged import androidx.core.widget.doOnTextChanged
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.R import bums.lunatic.launcher.R
import bums.lunatic.launcher.apps.AppDrawer.Companion.appNamesPrefs
import bums.lunatic.launcher.databinding.ActivityBrowserDialogBinding import bums.lunatic.launcher.databinding.ActivityBrowserDialogBinding
import bums.lunatic.launcher.databinding.AppInfoDialogBinding import bums.lunatic.launcher.databinding.AppInfoDialogBinding
import bums.lunatic.launcher.databinding.AppMenuBinding import bums.lunatic.launcher.databinding.AppMenuBinding
import bums.lunatic.launcher.helpers.UniUtils.Companion.copyToClipboard import bums.lunatic.launcher.helpers.UniUtils.Companion.copyToClipboard
import bums.lunatic.launcher.helpers.UniUtils.Companion.screenHeight import bums.lunatic.launcher.helpers.UniUtils.Companion.screenHeight
import bums.lunatic.launcher.helpers.UniUtils.Companion.screenWidth 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.model.AppInfo
import bums.lunatic.launcher.utils.JamoUtils import bums.lunatic.launcher.utils.JamoUtils
import bums.lunatic.launcher.workers.UsageLogType import bums.lunatic.launcher.workers.UsageLogType
@ -78,7 +78,10 @@ internal class AppMenu : BottomSheetDialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = AppMenuBinding.inflate(inflater, container, false) binding = AppMenuBinding.inflate(inflater, container, false)
// @JvmStatic
var settingsPrefs: SharedPreferences? = null
// @JvmStatic
var appNamesPrefs: SharedPreferences? = null
/* get package name from fragment's tag */ /* get package name from fragment's tag */
packageName = tag.toString() packageName = tag.toString()
packageManager = requireContext().packageManager packageManager = requireContext().packageManager
@ -130,39 +133,40 @@ internal class AppMenu : BottomSheetDialogFragment() {
binding.alterName.setText(app.koreanName) binding.alterName.setText(app.koreanName)
binding.recommend.isChecked = app.blockRecommend binding.recommend.isChecked = app.blockRecommend
binding.listVisible.isChecked = app.visibilityMode == 1 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<AppInfo>("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<AppInfo>("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 return binding.root
} }
@ -219,10 +223,10 @@ internal class AppMenu : BottomSheetDialogFragment() {
if (text!!.isBlank()) setText(defAppName) if (text!!.isBlank()) setText(defAppName)
else setText(text!!.trim()) else setText(text!!.trim())
if (text.toString() == defAppName) appNamesPrefs?.edit()!!.remove(packageName).apply() // if (text.toString() == defAppName) appNamesPrefs?.edit()!!.remove(packageName).apply()
else appNamesPrefs?.edit()!!.putString(packageName, text.toString()).apply() // else appNamesPrefs?.edit()!!.putString(packageName, text.toString()).apply()
//
(requireParentFragment() as AppDrawer).fetchApps() // (requireParentFragment() as AppDrawer).fetchApps()
} }
} }
} }

View File

@ -28,7 +28,7 @@ import android.widget.TextView
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView 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.R
import bums.lunatic.launcher.databinding.AppsChildBinding import bums.lunatic.launcher.databinding.AppsChildBinding
import bums.lunatic.launcher.model.AppInfo import bums.lunatic.launcher.model.AppInfo
@ -50,7 +50,7 @@ class AppsViewHolder(var view: AppsChildBinding) : RecyclerView.ViewHolder(view.
loadIconAsync(appIconTwo, appinfo.pkgName) loadIconAsync(appIconTwo, appinfo.pkgName)
childTextview.apply { childTextview.apply {
gravity = Gravity.CENTER 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))
} }
} }

View File

@ -25,7 +25,7 @@ import android.provider.ContactsContract
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup 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.databinding.ContactMenuBinding
import bums.lunatic.launcher.model.SimpleContact import bums.lunatic.launcher.model.SimpleContact
import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.Blog
@ -73,7 +73,7 @@ internal class ContactMenu : BottomSheetDialogFragment() {
WorkersDb.logAppUsage(contactId, UsageLogType.CONTACT,UsageUpdateType.DATETIME) WorkersDb.logAppUsage(contactId, UsageLogType.CONTACT,UsageUpdateType.DATETIME)
} }
val resolver = lActivity!!.contentResolver val resolver = sActivity!!.contentResolver
val phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI val phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
val projection = arrayOf( val projection = arrayOf(
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,

View File

@ -6,7 +6,7 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup 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.databinding.ContactMenuBinding
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
@ -25,7 +25,7 @@ class SmmsMenu: BottomSheetDialogFragment() {
/* get package name from fragment's tag */ /* get package name from fragment's tag */
msgId = tag.toString() msgId = tag.toString()
val resolver = lActivity!!.contentResolver val resolver = sActivity!!.contentResolver
return binding.root return binding.root

View File

@ -32,7 +32,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import androidx.appcompat.widget.LinearLayoutCompat import androidx.appcompat.widget.LinearLayoutCompat
import androidx.core.content.ContextCompat 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.R
import bums.lunatic.launcher.databinding.ChildSysInfoBinding import bums.lunatic.launcher.databinding.ChildSysInfoBinding
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_TEMP_UNIT import bums.lunatic.launcher.helpers.Constants.Companion.KEY_TEMP_UNIT
@ -53,8 +53,8 @@ import kotlin.math.roundToInt
internal class SystemStats { internal class SystemStats {
private val toGb = 1.07374182E9f private val toGb = 1.07374182E9f
private fun string(id: Int) : String { return lActivity!!.getString(id) } private fun string(id: Int) : String { return sActivity!!.getString(id) }
private val inflater : LayoutInflater get() { return lActivity!!.layoutInflater } private val inflater : LayoutInflater get() { return sActivity!!.layoutInflater }
/* ram info */ /* ram info */
fun ram(ramParent: LinearLayoutCompat) { fun ram(ramParent: LinearLayoutCompat) {
@ -137,7 +137,7 @@ internal class SystemStats {
/* external storage */ /* external storage */
fun extStorage(extParent: LinearLayoutCompat) { fun extStorage(extParent: LinearLayoutCompat) {
val extStorages = ContextCompat.getExternalFilesDirs(lActivity!!, null) val extStorages = ContextCompat.getExternalFilesDirs(sActivity!!, null)
/* sd card is available */ /* sd card is available */
if (extStorages.size > 1) { if (extStorages.size > 1) {
extParent.removeAllViews() extParent.removeAllViews()
@ -175,7 +175,7 @@ internal class SystemStats {
val totalRootStorage = StatFs(Environment.getRootDirectory().path).blockCountLong * val totalRootStorage = StatFs(Environment.getRootDirectory().path).blockCountLong *
StatFs(Environment.getRootDirectory().path).blockSizeLong / toGb 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 batteryTemp = batteryIntent!!.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0).toFloat() / 10
val voltage = batteryIntent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, 0).toFloat() / 1000 val voltage = batteryIntent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, 0).toFloat() / 1000
@ -199,13 +199,13 @@ internal class SystemStats {
private val memoryInfo: ActivityManager.MemoryInfo get() { private val memoryInfo: ActivityManager.MemoryInfo get() {
val memoryInfo = ActivityManager.MemoryInfo() 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) activityManager.getMemoryInfo(memoryInfo)
return memoryInfo return memoryInfo
} }
private val tempUnit: Int get() = 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 { private fun longToString(long: Long) : String {
var seconds = (long.toDouble() / 1000).roundToInt() var seconds = (long.toDouble() / 1000).roundToInt()

View File

@ -28,7 +28,6 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.databinding.ListItemWithBinding import bums.lunatic.launcher.databinding.ListItemWithBinding
import bums.lunatic.launcher.home.adapters.RssItemDiffUtil import bums.lunatic.launcher.home.adapters.RssItemDiffUtil
import bums.lunatic.launcher.model.RssDataInterface import bums.lunatic.launcher.model.RssDataInterface
@ -105,7 +104,7 @@ internal class RssAdapter<T : RssDataInterface>(private val context: Context) :
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) mapIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
mapIntent.setPackage("com.opera.browser") mapIntent.setPackage("com.opera.browser")
lActivity?.startActivity(mapIntent) context.startActivity(mapIntent)
} }
fun updateData(newList: List<RssDataInterface>) { fun updateData(newList: List<RssDataInterface>) {

View File

@ -29,7 +29,6 @@ import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager import androidx.work.WorkManager
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import bums.lunatic.launcher.LauncherActivity import bums.lunatic.launcher.LauncherActivity
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.R import bums.lunatic.launcher.R
import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.workers.TaskAggregator import bums.lunatic.launcher.workers.TaskAggregator
@ -252,8 +251,8 @@ class ForeGroundService : Service() {
fun workmanager() : WorkManager? { fun workmanager() : WorkManager? {
if (mWorkManager == null && lActivity != null) { if (mWorkManager == null && applicationContext != null) {
mWorkManager = WorkManager.getInstance(lActivity!!) mWorkManager = WorkManager.getInstance(applicationContext)
} }
return mWorkManager return mWorkManager
} }

View File

@ -37,7 +37,7 @@ import androidx.appcompat.widget.LinearLayoutCompat
import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager
import androidx.biometric.BiometricManager.BIOMETRIC_SUCCESS import androidx.biometric.BiometricManager.BIOMETRIC_SUCCESS
import androidx.biometric.BiometricPrompt 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.R
import bums.lunatic.launcher.helpers.Constants.Companion.ACCESSIBILITY_SERVICE_LOCK_SCREEN import bums.lunatic.launcher.helpers.Constants.Companion.ACCESSIBILITY_SERVICE_LOCK_SCREEN
import bums.lunatic.launcher.helpers.Constants.Companion.AUTHENTICATOR_TYPE import bums.lunatic.launcher.helpers.Constants.Companion.AUTHENTICATOR_TYPE
@ -51,13 +51,13 @@ internal class UniUtils {
/* get display width */ /* get display width */
val screenWidth: Int get() { val screenWidth: Int get() {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val windowMetrics = lActivity!!.windowManager.currentWindowMetrics val windowMetrics = sActivity!!.windowManager.currentWindowMetrics
val insets = windowMetrics.windowInsets val insets = windowMetrics.windowInsets
.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()) .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
windowMetrics.bounds.width() - insets.left - insets.right windowMetrics.bounds.width() - insets.left - insets.right
} else { } else {
val displayMetrics = DisplayMetrics() val displayMetrics = DisplayMetrics()
@Suppress("DEPRECATION") lActivity!!.windowManager.defaultDisplay.getMetrics(displayMetrics) @Suppress("DEPRECATION") sActivity!!.windowManager.defaultDisplay.getMetrics(displayMetrics)
displayMetrics.widthPixels displayMetrics.widthPixels
} }
} }
@ -65,13 +65,13 @@ internal class UniUtils {
/* get display height */ /* get display height */
val screenHeight: Int get() { val screenHeight: Int get() {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val windowMetrics = lActivity!!.windowManager.currentWindowMetrics val windowMetrics = sActivity!!.windowManager.currentWindowMetrics
val insets = windowMetrics.windowInsets val insets = windowMetrics.windowInsets
.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()) .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
windowMetrics.bounds.height() - insets.top - insets.bottom windowMetrics.bounds.height() - insets.top - insets.bottom
} else { } else {
val displayMetrics = DisplayMetrics() val displayMetrics = DisplayMetrics()
@Suppress("DEPRECATION") lActivity!!.windowManager.defaultDisplay.getMetrics(displayMetrics) @Suppress("DEPRECATION") sActivity!!.windowManager.defaultDisplay.getMetrics(displayMetrics)
displayMetrics.heightPixels displayMetrics.heightPixels
} }
} }
@ -79,7 +79,7 @@ internal class UniUtils {
/* copy texts to clipboard */ /* copy texts to clipboard */
fun copyToClipboard(context: Context, copiedString: String?) { fun copyToClipboard(context: Context, copiedString: String?) {
val clipBoard = val clipBoard =
lActivity!!.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clipBoard.setPrimaryClip(ClipData.newPlainText("", copiedString)) clipBoard.setPrimaryClip(ClipData.newPlainText("", copiedString))
Toast.makeText(context, context.getString(R.string.copied_message), Toast.LENGTH_SHORT).show() 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 */ /* check if the device is connected to the internet */
val isNetworkAvailable: Boolean get() { val isNetworkAvailable: Boolean get() {
val connectivityManager = val connectivityManager =
lActivity!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager sActivity!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
@Suppress("DEPRECATION") val activeNetworkInfo = connectivityManager.activeNetworkInfo @Suppress("DEPRECATION") val activeNetworkInfo = connectivityManager.activeNetworkInfo
@Suppress("DEPRECATION") return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting @Suppress("DEPRECATION") return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting
} }
@ -144,7 +144,7 @@ internal class UniUtils {
fun biometricPromptInfo(title: String): BiometricPrompt.PromptInfo { fun biometricPromptInfo(title: String): BiometricPrompt.PromptInfo {
return BiometricPrompt.PromptInfo.Builder() return BiometricPrompt.PromptInfo.Builder()
.setTitle(title) .setTitle(title)
.setSubtitle(lActivity!!.getString(R.string.authentication_subtitle)) .setSubtitle(sActivity!!.getString(R.string.authentication_subtitle))
.setConfirmationRequired(true) .setConfirmationRequired(true)
.setAllowedAuthenticators(AUTHENTICATOR_TYPE) .setAllowedAuthenticators(AUTHENTICATOR_TYPE)
.build() .build()
@ -170,7 +170,7 @@ internal class UniUtils {
policy.lockNow() policy.lockNow()
} catch (exception: SecurityException) { } catch (exception: SecurityException) {
/* open device admin manager screen */ /* open device admin manager screen */
lActivity!!.startActivity( sActivity!!.startActivity(
Intent().setComponent( Intent().setComponent(
ComponentName( ComponentName(
"com.android.settings", "com.android.settings",
@ -226,10 +226,10 @@ internal class UniUtils {
/* lock screen using accessibility service */ /* lock screen using accessibility service */
private fun lockAccessibility() { private fun lockAccessibility() {
if (LockService().isAccessibilityServiceEnabled(lActivity!!.applicationContext)) { if (LockService().isAccessibilityServiceEnabled(sActivity!!.applicationContext)) {
try { try {
lActivity!!.startService( sActivity!!.startService(
Intent(lActivity!!.applicationContext, LockService::class.java) Intent(sActivity!!.applicationContext, LockService::class.java)
.setAction(ACCESSIBILITY_SERVICE_LOCK_SCREEN) .setAction(ACCESSIBILITY_SERVICE_LOCK_SCREEN)
) )
} catch (exception: Exception) { } catch (exception: Exception) {
@ -237,7 +237,7 @@ internal class UniUtils {
} }
} else { } else {
/* open accessibility service screen */ /* open accessibility service screen */
lActivity!!.startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)) sActivity!!.startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS))
} }
} }

View File

@ -2,8 +2,6 @@ package bums.lunatic.launcher.home
import CustomVideoNodeRenderer import CustomVideoNodeRenderer
import android.app.Dialog import android.app.Dialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
@ -37,17 +35,16 @@ import android.widget.RadioGroup
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.content.ContextCompat.getSystemService
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.view.isVisible import androidx.core.view.isVisible
import bums.lunatic.launcher.BookmarkUploader import bums.lunatic.launcher.BookmarkUploader
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
import bums.lunatic.launcher.R import bums.lunatic.launcher.R
import bums.lunatic.launcher.home.NeoRssActivity.Companion.getRuntime
import bums.lunatic.launcher.model.Dotax import bums.lunatic.launcher.model.Dotax
import bums.lunatic.launcher.model.DotaxArticles import bums.lunatic.launcher.model.DotaxArticles
import bums.lunatic.launcher.model.getRssData import bums.lunatic.launcher.model.getRssData
import bums.lunatic.launcher.tokiz.PortMessage import bums.lunatic.launcher.home.tokiz.PortMessage
import bums.lunatic.launcher.tokiz.view.BWebview import bums.lunatic.launcher.home.tokiz.view.BWebview
import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.utils.CommonUtils import bums.lunatic.launcher.utils.CommonUtils
import bums.lunatic.launcher.workers.WorkersDb import bums.lunatic.launcher.workers.WorkersDb

View File

@ -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<String,GeckoWeb> = 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<RssData>()
.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<String>()
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<JSONObject?> {
Blog.LOGE("onGetExperimentFeature $feature")
return super.onGetExperimentFeature(feature)
}
override fun onRecordExposureEvent(feature: String): GeckoResult<Void?> {
Blog.LOGE("onRecordExposureEvent $feature")
return super.onRecordExposureEvent(feature)
}
override fun onRecordExperimentExposureEvent(
feature: String,
slug: String
): GeckoResult<Void?> {
Blog.LOGE("onRecordExperimentExposureEvent $feature , $slug")
return super.onRecordExperimentExposureEvent(feature, slug)
}
override fun onRecordMalformedConfigurationEvent(
feature: String,
part: String
): GeckoResult<Void?> {
Blog.LOGE("onRecordMalformedConfigurationEvent $feature , $part")
return super.onRecordMalformedConfigurationEvent(feature, part)
}
}
val callBackHandler = Handler(Looper.getMainLooper())
}

View File

@ -43,26 +43,24 @@ import androidx.fragment.app.FragmentManager
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView 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.R
import bums.lunatic.launcher.common.letTrue import bums.lunatic.launcher.common.letTrue
import bums.lunatic.launcher.databinding.LauncherHomeBinding import bums.lunatic.launcher.databinding.LauncherHomeBinding
import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SETTINGS 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.SearchBottomSheet.OnSearchListener
import bums.lunatic.launcher.home.adapters.RssItemAdapter import bums.lunatic.launcher.home.adapters.RssItemAdapter
import bums.lunatic.launcher.home.adapters.SwipeToDeleteCallback import bums.lunatic.launcher.home.adapters.SwipeToDeleteCallback
import bums.lunatic.launcher.model.RssData import bums.lunatic.launcher.model.RssData
import bums.lunatic.launcher.model.RssDataType import bums.lunatic.launcher.model.RssDataType
import bums.lunatic.launcher.model.WeatherForcast 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.Blog
import bums.lunatic.launcher.utils.SimpleFingerGestures import bums.lunatic.launcher.utils.SimpleFingerGestures
import bums.lunatic.launcher.utils.beforeDay import bums.lunatic.launcher.utils.beforeDay
import bums.lunatic.launcher.utils.beforeOneDay import bums.lunatic.launcher.utils.beforeOneDay
import bums.lunatic.launcher.workers.WorkersDb import bums.lunatic.launcher.workers.WorkersDb
import bums.lunatic.launcher.workers.WorkersDb.getRealm import bums.lunatic.launcher.workers.WorkersDb.getRealm
import com.google.android.material.imageview.ShapeableImageView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import io.realm.kotlin.UpdatePolicy import io.realm.kotlin.UpdatePolicy
import io.realm.kotlin.ext.query 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.hide)
binding.geckoWeb.decoViews.add(binding.vote) binding.geckoWeb.decoViews.add(binding.vote)
binding.geckoWeb.decoViews.add(binding.progressBar) binding.geckoWeb.decoViews.add(binding.progressBar)
(activity as? LauncherActivity)?.let { activity -> (activity as? NeoRssActivity)?.let { activity ->
binding.geckoWeb.decoViews.add(activity.findViewById<TextView>(R.id.current_address)) binding.geckoWeb.decoViews.add(activity.findViewById<TextView>(R.id.current_address))
binding.geckoWeb.decoViews.add(activity.findViewById<ImageButton>(R.id.back)) binding.geckoWeb.decoViews.add(activity.findViewById<ImageButton>(R.id.back))
binding.geckoWeb.decoViews.add(activity.findViewById<ImageButton>(R.id.reload)) binding.geckoWeb.decoViews.add(activity.findViewById<ImageButton>(R.id.reload))

View File

@ -1,114 +1,114 @@
/* ///*
* Lunar Launcher // * Lunar Launcher
* Copyright (C) 2022 Md Rasel Hossain // * Copyright (C) 2022 Md Rasel Hossain
* // *
* This program is free software: you can redistribute it and/or modify // * 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 // * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or // * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. // * (at your option) any later version.
* // *
* This program is distributed in the hope that it will be useful, // * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of // * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. // * GNU General Public License for more details.
* // *
* You should have received a copy of the GNU General Public License // * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. // * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ // */
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<View>(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"))
// //
// BLog.LOGE("file >>> ${file.absolutePath}") //package bums.lunatic.launcher.home
// 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?) { //import android.content.pm.PackageManager
// Toast.makeText(lActivity!!, //import android.os.Bundle
// "Pdf Save Failk ${exception?.localizedMessage}", Toast.LENGTH_LONG).show() //import android.view.LayoutInflater
// exception?.printStackTrace() //import android.view.View
// } //import android.view.ViewGroup
// } ) //import android.webkit.WebView
// } catch (e: IOException) { //import androidx.fragment.app.DialogFragment
// e.printStackTrace() //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<View>(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?) { // override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
super.onViewCreated(view, savedInstanceState) // binding = RssViewerBinding.inflate(inflater, container, false)
// (requireDialog() as BottomSheetDialog).dismissWithAnimation = true // 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
//
// }
//}

View File

@ -1,112 +1,112 @@
/* ///*
* Lunar Launcher // * Lunar Launcher
* Copyright (C) 2022 Md Rasel Hossain // * Copyright (C) 2022 Md Rasel Hossain
* // *
* This program is free software: you can redistribute it and/or modify // * 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 // * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or // * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. // * (at your option) any later version.
* // *
* This program is distributed in the hope that it will be useful, // * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of // * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. // * GNU General Public License for more details.
* // *
* You should have received a copy of the GNU General Public License // * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. // * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ // */
//
package bums.lunatic.launcher.home.adapters //package bums.lunatic.launcher.home.adapters
//
import android.annotation.SuppressLint //import android.annotation.SuppressLint
import android.content.Context //import android.content.Context
import android.content.pm.PackageManager //import android.content.pm.PackageManager
import android.graphics.drawable.Drawable //import android.graphics.drawable.Drawable
import android.view.LayoutInflater //import android.view.LayoutInflater
import android.view.View //import android.view.View
import android.view.ViewGroup //import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout //import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.DiffUtil //import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView //import androidx.recyclerview.widget.RecyclerView
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity //import bums.lunatic.launcher.databinding.ListItemWithBinding
import bums.lunatic.launcher.databinding.ListItemWithBinding //import bums.lunatic.launcher.home.NeoRssActivity.Companion.lActivity
import bums.lunatic.launcher.model.NotificationItem //import bums.lunatic.launcher.model.NotificationItem
import bums.lunatic.launcher.workers.WorkersDb //import bums.lunatic.launcher.workers.WorkersDb
import java.text.SimpleDateFormat //import java.text.SimpleDateFormat
import java.util.Date //import java.util.Date
//
//
internal class NotificationItemAdapter ( //internal class NotificationItemAdapter (
private val context: Context) : RecyclerView.Adapter<NotiHolder>() { // private val context: Context) : RecyclerView.Adapter<NotiHolder>() {
private var notiItems: ArrayList<NotificationItem> = arrayListOf() // private var notiItems: ArrayList<NotificationItem> = arrayListOf()
override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): NotiHolder { // override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): NotiHolder {
val binding = ListItemWithBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false) // val binding = ListItemWithBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)
return NotiHolder(binding) // return NotiHolder(binding)
} // }
//
override fun getItemCount(): Int { // override fun getItemCount(): Int {
return notiItems.size // return notiItems.size
} // }
//
val dateFormat = SimpleDateFormat("hh:mm / yy - MM - dd") // val dateFormat = SimpleDateFormat("hh:mm / yy - MM - dd")
//
@SuppressLint("SetTextI18n") // @SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: NotiHolder, position: Int) { // override fun onBindViewHolder(holder: NotiHolder, position: Int) {
val appInfo = notiItems[position] // val appInfo = notiItems[position]
try { // try {
holder.view.circlePreview.visibility = View.VISIBLE // holder.view.circlePreview.visibility = View.VISIBLE
var param = holder.view.circlePreview.layoutParams // var param = holder.view.circlePreview.layoutParams
holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(120,param.height) // holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(120,param.height)
val d: Drawable = context.packageManager.getApplicationIcon(appInfo.pkgName!!) // val d: Drawable = context.packageManager.getApplicationIcon(appInfo.pkgName!!)
holder.view.circlePreview.setImageDrawable(d) // holder.view.circlePreview.setImageDrawable(d)
holder.view.title.text = appInfo.tikerMsg ?: "${appInfo.selfDisplayName} ${appInfo.subtext}" // holder.view.title.text = appInfo.tikerMsg ?: "${appInfo.selfDisplayName} ${appInfo.subtext}"
holder.view.desc.text = "${appInfo.pkgName} ${appInfo.title}" // holder.view.desc.text = "${appInfo.pkgName} ${appInfo.title}"
holder.view.date.text = dateFormat.format(Date(appInfo.postTime)) // holder.view.date.text = dateFormat.format(Date(appInfo.postTime))
holder.view.circlePreview.setOnLongClickListener { // holder.view.circlePreview.setOnLongClickListener {
WorkersDb.getRealm().writeBlocking { // WorkersDb.getRealm().writeBlocking {
delete(query<NotificationItem>(NotificationItem::class).query("pkgName == $0",appInfo.pkgName).find()) // delete(query<NotificationItem>(NotificationItem::class).query("pkgName == $0",appInfo.pkgName).find())
} // }
lActivity?.packageManager?.apply { // lActivity?.packageManager?.apply {
context.startActivity(getLaunchIntentForPackage(appInfo.pkgName!!)) // context.startActivity(getLaunchIntentForPackage(appInfo.pkgName!!))
} // }
true // true
} // }
//
//
} catch (e: PackageManager.NameNotFoundException) { // } catch (e: PackageManager.NameNotFoundException) {
return // return
} // }
//
} // }
//
fun updateData(newList: List<NotificationItem>) { // fun updateData(newList: List<NotificationItem>) {
try { // try {
DiffUtil.calculateDiff(NotiItemDiffUtil(notiItems, newList)).apply { // DiffUtil.calculateDiff(NotiItemDiffUtil(notiItems, newList)).apply {
//
}.dispatchUpdatesTo(this).apply { // }.dispatchUpdatesTo(this).apply {
// notifyItemRangeChanged(0,10) //// notifyItemRangeChanged(0,10)
} // }
notiItems.clear() // notiItems.clear()
notiItems.addAll(newList) // notiItems.addAll(newList)
}catch ( e : Exception) { // }catch ( e : Exception) {
e.printStackTrace() // e.printStackTrace()
} // }
} // }
//
//
} //}
//
internal class NotiHolder(var view: ListItemWithBinding) : RecyclerView.ViewHolder(view.root) //internal class NotiHolder(var view: ListItemWithBinding) : RecyclerView.ViewHolder(view.root)
internal class NotiItemDiffUtil( //internal class NotiItemDiffUtil(
var oldList: List<NotificationItem>, var newList: List<NotificationItem> // var oldList: List<NotificationItem>, var newList: List<NotificationItem>
) : DiffUtil.Callback() { //) : DiffUtil.Callback() {
//
override fun getOldListSize(): Int = oldList.size // override fun getOldListSize(): Int = oldList.size
override fun getNewListSize(): Int = newList.size // override fun getNewListSize(): Int = newList.size
//
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean = // override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
oldList[oldItemPosition].uniq_id == if (newList.size > newItemPosition) newList[newItemPosition].uniq_id else "" // oldList[oldItemPosition].uniq_id == if (newList.size > newItemPosition) newList[newItemPosition].uniq_id else ""
//
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean = // override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
oldList[oldItemPosition].uniq_id == if (newList.size > newItemPosition) newList[newItemPosition].uniq_id else "" // oldList[oldItemPosition].uniq_id == if (newList.size > newItemPosition) newList[newItemPosition].uniq_id else ""
} //}

View File

@ -1,167 +1,167 @@
/* ///*
* Lunar Launcher // * Lunar Launcher
* Copyright (C) 2022 Md Rasel Hossain // * Copyright (C) 2022 Md Rasel Hossain
* // *
* This program is free software: you can redistribute it and/or modify // * 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 // * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or // * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. // * (at your option) any later version.
* // *
* This program is distributed in the hope that it will be useful, // * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of // * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. // * GNU General Public License for more details.
* // *
* You should have received a copy of the GNU General Public License // * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. // * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ // */
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<RecentCall>,
private val context: Context) : RecyclerView.Adapter<RecentCallsAdapter.RecentCallsHolder>() {
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
// //
// val databaseHandler = DatabaseHandler(context) //package bums.lunatic.launcher.home.adapters
// val todo = databaseHandler.todos[position]
// //
// dialogBinding.apply { //import android.annotation.SuppressLint
// deleteAllConfirmation.visibility = View.GONE //import android.content.Context
// todoInput.setText(todo.name) //import android.content.Intent
// todoCancel.text = context.getString(R.string.delete) //import android.net.Uri
// todoCancel.setTextColor(ContextCompat.getColor(context, android.R.color.holo_red_light)) //import android.provider.CallLog
// todoOk.text = context.getString(R.string.update) //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<RecentCall>,
// private val context: Context) : RecyclerView.Adapter<RecentCallsAdapter.RecentCallsHolder>() {
//
// 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 */ //// copyToClipboard(context, todo.name)
// dialogBinding.todoCancel.setOnClickListener { // 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));
// /* update the item */ // lActivity?.startActivity(intent);
// 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 { // } 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<RecentCall>) {
// 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()
var layoutManager : GridLayoutManager? = null // callList.addAll(newList)
var recyclerView: RecyclerView? = null // }
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { //
layoutManager = recyclerView.layoutManager as? GridLayoutManager //}
this.recyclerView = recyclerView //
} //internal class RecentCallDiffUtil(
// private val oldList: List<RecentCall>, private val newList: List<RecentCall>
fun updateData(newList: Collection<RecentCall>) { //) : DiffUtil.Callback() {
val diffUtilResult = DiffUtil.calculateDiff(RecentCallDiffUtil(callList, newList.toList())) //
diffUtilResult.dispatchUpdatesTo(this).apply { // override fun getOldListSize(): Int = oldList.size
val visibleItemCount = (layoutManager?.findLastVisibleItemPosition() ?: 0) - (layoutManager?.findFirstVisibleItemPosition() ?: 0) // override fun getNewListSize(): Int = newList.size
if (visibleItemCount > 0) { //
this@RecentCallsAdapter.notifyItemRangeChanged(0, visibleItemCount) // override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
recyclerView?.scrollToPosition(0) // oldList[oldItemPosition].date == newList[newItemPosition].date
} //
} // override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
callList.clear() // oldList[oldItemPosition] == newList[newItemPosition]
callList.addAll(newList) //}
} //
}
internal class RecentCallDiffUtil(
private val oldList: List<RecentCall>, private val newList: List<RecentCall>
) : 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]
}

View File

@ -1,169 +1,168 @@
/* ///*
* Lunar Launcher // * Lunar Launcher
* Copyright (C) 2022 Md Rasel Hossain // * Copyright (C) 2022 Md Rasel Hossain
* // *
* This program is free software: you can redistribute it and/or modify // * 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 // * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or // * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. // * (at your option) any later version.
* // *
* This program is distributed in the hope that it will be useful, // * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of // * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. // * GNU General Public License for more details.
* // *
* You should have received a copy of the GNU General Public License // * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. // * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ // */
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<RecentSms>,
private val context: Context) : RecyclerView.Adapter<SmsLogHolder>() {
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<RecentSms>) {
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) //package bums.lunatic.launcher.home.adapters
// val todo = databaseHandler.todos[position]
// //
// dialogBinding.apply { //import android.annotation.SuppressLint
// deleteAllConfirmation.visibility = View.GONE //import android.content.Context
// todoInput.setText(todo.name) //import android.content.Intent
// todoCancel.text = context.getString(R.string.delete) //import android.net.Uri
// todoCancel.setTextColor(ContextCompat.getColor(context, android.R.color.holo_red_light)) //import android.view.LayoutInflater
// todoOk.text = context.getString(R.string.update) //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<RecentSms>,
// private val context: Context) : RecyclerView.Adapter<SmsLogHolder>() {
//
// 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 */ // holder.view.root.isActivated = if(holder.view.itemText.text.contains("#CMAS#")) true else false
// dialogBinding.todoOk.setOnClickListener { // }
// val updatedTodoString = Objects.requireNonNull(dialogBinding.todoInput.text).toString().trim { it <= ' ' } //
// if (updatedTodoString.isNotEmpty()) { //
// todo.name = updatedTodoString //
// databaseHandler.updateTodo(todo) // fun updateData(newList: List<RecentSms>) {
// bottomSheetDialog.dismiss() // val diffUtilResult = DiffUtil.calculateDiff(SmsDiffUtil(smsList, newList))
// } else { // diffUtilResult.dispatchUpdatesTo(this)
// dialogBinding.todoInput.error = context.getString(R.string.empty_text_field) // smsList.clear()
// } // smsList.addAll(newList)
// } // }
} //
// /* update dialog */
} // private fun updateDialog(position: Int) {
class SmsLogHolder(var view: SmsItemBinding) : RecyclerView.ViewHolder(view.root) //// val bottomSheetDialog = BottomSheetDialog(lActivity!!, R.style.BottomSheetDialog)
internal class SmsDiffUtil( //// val dialogBinding = TodoDialogBinding.inflate(LayoutInflater.from(context))
private val oldList: List<RecentSms>, private val newList: List<RecentSms> //// bottomSheetDialog.setContentView(dialogBinding.root)
) : DiffUtil.Callback() { //// bottomSheetDialog.show()
//// bottomSheetDialog.dismissWithAnimation = true
override fun getOldListSize(): Int = oldList.size ////
override fun getNewListSize(): Int = newList.size //// val databaseHandler = DatabaseHandler(context)
//// val todo = databaseHandler.todos[position]
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean = ////
oldList[oldItemPosition].rcvDate == newList[newItemPosition].rcvDate //// dialogBinding.apply {
//// deleteAllConfirmation.visibility = View.GONE
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean = //// todoInput.setText(todo.name)
oldList[oldItemPosition].rcvDate == newList[newItemPosition].rcvDate //// 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<RecentSms>, private val newList: List<RecentSms>
//) : 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
//}

View File

@ -1,107 +1,107 @@
package bums.lunatic.launcher.home.adapters //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<Int>,
private val adatpers: List<RecyclerView.Adapter<out RecyclerView.ViewHolder>?>,
private val weatherBook: WeatherBookBinding? = null)
: RecyclerView.Adapter<WeatherAdapter.PageViewHolder>() {
class PageViewHolder(val view: View): RecyclerView.ViewHolder(view)
var childs : ArrayList<RecyclerView> = arrayListOf<RecyclerView>()
@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<RecyclerView>(R.id.recycler_hourly_weather)
// var second = layoutInflater.findViewById<RecyclerView>(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<RecyclerView>(R.id.recycler_hourly_weather).apply {
// this.adapter = adatpers[position]
// this.layoutManager =
// //
//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<Int>,
// private val adatpers: List<RecyclerView.Adapter<out RecyclerView.ViewHolder>?>,
// private val weatherBook: WeatherBookBinding? = null)
// : RecyclerView.Adapter<WeatherAdapter.PageViewHolder>() {
//
// class PageViewHolder(val view: View): RecyclerView.ViewHolder(view)
//
//
// var childs : ArrayList<RecyclerView> = arrayListOf<RecyclerView>()
//
//
// @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<RecyclerView>(R.id.recycler_hourly_weather)
//// var second = layoutInflater.findViewById<RecyclerView>(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<RecyclerView>(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)
// } // }
// } // }
} //// when (position) {
} //// 0 -> holder.view.findViewById<RecyclerView>(R.id.recycler_hourly_weather).apply {
//// this.adapter = adatpers[position]
override fun getItemCount(): Int = pages.size //// this.layoutManager =
////
override fun getItemViewType(position: Int): Int = position //// }
} ////
//// else -> holder.view.findViewById<RecyclerView>(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
//}

View File

@ -1,71 +1,71 @@
package bums.lunatic.launcher.home.adapters //package bums.lunatic.launcher.home.adapters
//
import android.annotation.SuppressLint //import android.annotation.SuppressLint
import android.graphics.Color //import android.graphics.Color
import android.view.LayoutInflater //import android.view.LayoutInflater
import android.view.View //import android.view.View
import android.view.ViewGroup //import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView //import androidx.recyclerview.widget.RecyclerView
import bums.lunatic.launcher.databinding.ItemRecHourlyDressBinding //import bums.lunatic.launcher.databinding.ItemRecHourlyDressBinding
import bums.lunatic.launcher.model.Hour //import bums.lunatic.launcher.model.Hour
import bums.lunatic.launcher.model.WeatherInfoManager //import bums.lunatic.launcher.model.WeatherInfoManager
import java.util.Calendar //import java.util.Calendar
//
class WeatherDressAdatper (private val dataSet: ArrayList<Hour>) : RecyclerView.Adapter<WeatherDressAdatper.ViewHolder>(){ //class WeatherDressAdatper (private val dataSet: ArrayList<Hour>) : RecyclerView.Adapter<WeatherDressAdatper.ViewHolder>(){
var isChangedAmOrPm: Boolean = true // var isChangedAmOrPm: Boolean = true
//
class ViewHolder(val viewItem: ItemRecHourlyDressBinding): RecyclerView.ViewHolder(viewItem.root) // class ViewHolder(val viewItem: ItemRecHourlyDressBinding): RecyclerView.ViewHolder(viewItem.root)
//
// @SuppressLint("NotifyDataSetChanged") // // @SuppressLint("NotifyDataSetChanged")
fun update(li: Collection<Hour>) { // fun update(li: Collection<Hour>) {
li.toList() // li.toList()
this.dataSet.clear() // this.dataSet.clear()
this.dataSet.addAll(li) // this.dataSet.addAll(li)
// notifyDataSetChanged() //// notifyDataSetChanged()
} // }
//
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WeatherDressAdatper.ViewHolder { // override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WeatherDressAdatper.ViewHolder {
// val view = LayoutInflater.from(parent.context) //// val view = LayoutInflater.from(parent.context)
// .inflate(R.layout.item_rec_hourly_dress, parent, false) //// .inflate(R.layout.item_rec_hourly_dress, parent, false)
// val itemBinding: ItemRecHourlyDressBinding = DataBindingUtil. //// val itemBinding: ItemRecHourlyDressBinding = DataBindingUtil.
val binding = ItemRecHourlyDressBinding.inflate(LayoutInflater.from(parent.context), parent, false) // val binding = ItemRecHourlyDressBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return WeatherDressAdatper.ViewHolder(binding) // return WeatherDressAdatper.ViewHolder(binding)
} // }
//
fun getToday() = Calendar.getInstance().get(Calendar.DAY_OF_YEAR) // fun getToday() = Calendar.getInstance().get(Calendar.DAY_OF_YEAR)
//
@SuppressLint("SetTextI18n") // @SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: WeatherDressAdatper.ViewHolder, position: Int) { // override fun onBindViewHolder(holder: WeatherDressAdatper.ViewHolder, position: Int) {
val data = dataSet[position] as? Hour // val data = dataSet[position] as? Hour
// BLog.LOGE("saved weatherForcast >>> asFlow ${dataSet.size}") //// BLog.LOGE("saved weatherForcast >>> asFlow ${dataSet.size}")
// val today = Calendar.getInstance() //// val today = Calendar.getInstance()
// today.time = Date(data?.time_epoch?.toLong()?.times(1000L) ?: 0L) //// today.time = Date(data?.time_epoch?.toLong()?.times(1000L) ?: 0L)
// val dayOfItem = today.get(Calendar.DAY_OF_YEAR) //// val dayOfItem = today.get(Calendar.DAY_OF_YEAR)
data?.let { // data?.let {
// total.loc = WorkersDb.getRealm().query<Location>().also { //// total.loc = WorkersDb.getRealm().query<Location>().also {
// BLog.LOGE("re >>> ${it.description()}") // 쿼리 로그 //// BLog.LOGE("re >>> ${it.description()}") // 쿼리 로그
// }.find().first() //// }.find().first()
WeatherInfoManager.getShowingInfo(it).apply { // WeatherInfoManager.getShowingInfo(it).apply {
// total.setInfo(this) //// total.setInfo(this)
holder.viewItem.setInfo(this) // holder.viewItem.setInfo(this)
} // }
// BLog.LOGE("reeeeeeeeeee >>> ${holder.viewItem.hour.text}") //// BLog.LOGE("reeeeeeeeeee >>> ${holder.viewItem.hour.text}")
holder.viewItem.amOrPm.visibility = // holder.viewItem.amOrPm.visibility =
if (arrayListOf(12, 0).contains(WeatherInfoManager.toZonedDateTime(it.time_epoch).hour) || position == 0) { // if (arrayListOf(12, 0).contains(WeatherInfoManager.toZonedDateTime(it.time_epoch).hour) || position == 0) {
View.VISIBLE // View.VISIBLE
} else View.INVISIBLE // } else View.INVISIBLE
holder.viewItem.hour.apply { // holder.viewItem.hour.apply {
if (WeatherInfoManager.toZonedDateTime(it.time_epoch).hour == 0) { // if (WeatherInfoManager.toZonedDateTime(it.time_epoch).hour == 0) {
this@apply.setTextColor(Color.BLACK) // this@apply.setTextColor(Color.BLACK)
this@apply.isSelected = true // this@apply.isSelected = true
} else { // } else {
this@apply.setTextColor(Color.WHITE) // this@apply.setTextColor(Color.WHITE)
this@apply.isSelected = false // this@apply.isSelected = false
} // }
} // }
holder.viewItem.imgWeather.setImageLevel(it.temp_c.toInt()) // holder.viewItem.imgWeather.setImageLevel(it.temp_c.toInt())
} // }
} // }
//
override fun getItemCount(): Int = dataSet.size // override fun getItemCount(): Int = dataSet.size
} //}

View File

@ -1,54 +1,54 @@
package bums.lunatic.launcher.home.adapters //package bums.lunatic.launcher.home.adapters
//
import android.graphics.Color //import android.graphics.Color
import android.view.LayoutInflater //import android.view.LayoutInflater
import android.view.ViewGroup //import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView //import androidx.recyclerview.widget.RecyclerView
import bums.lunatic.launcher.databinding.ItemHourlyWeatherBinding //import bums.lunatic.launcher.databinding.ItemHourlyWeatherBinding
import bums.lunatic.launcher.model.Hour //import bums.lunatic.launcher.model.Hour
import bums.lunatic.launcher.model.WeatherInfoManager //import bums.lunatic.launcher.model.WeatherInfoManager
import com.squareup.picasso.Picasso //import com.squareup.picasso.Picasso
//
class WeatherHourlyAdapter(private val dataSet: ArrayList<Hour>): RecyclerView.Adapter<WeatherHourlyAdapter.ViewHolder>() { //class WeatherHourlyAdapter(private val dataSet: ArrayList<Hour>): RecyclerView.Adapter<WeatherHourlyAdapter.ViewHolder>() {
class ViewHolder(val viewItem: ItemHourlyWeatherBinding): RecyclerView.ViewHolder(viewItem.root) // class ViewHolder(val viewItem: ItemHourlyWeatherBinding): RecyclerView.ViewHolder(viewItem.root)
//
override fun onCreateViewHolder(parent: ViewGroup, type: Int): WeatherHourlyAdapter.ViewHolder { // override fun onCreateViewHolder(parent: ViewGroup, type: Int): WeatherHourlyAdapter.ViewHolder {
val binding = ItemHourlyWeatherBinding.inflate(LayoutInflater.from(parent.context), parent, false) // val binding = ItemHourlyWeatherBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return WeatherHourlyAdapter.ViewHolder(binding) // return WeatherHourlyAdapter.ViewHolder(binding)
} // }
//
override fun onBindViewHolder(holder: ViewHolder, position: Int) { // override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val data = dataSet[position] as? Hour // val data = dataSet[position] as? Hour
// BLog.LOGE("saved weatherForcast >>> asFlow ${dataSet.size}") //// BLog.LOGE("saved weatherForcast >>> asFlow ${dataSet.size}")
data?.let { // data?.let {
WeatherInfoManager.getShowingInfo(it).apply { // WeatherInfoManager.getShowingInfo(it).apply {
holder.viewItem.setInfo(this) // holder.viewItem.setInfo(this)
Picasso.get() // Picasso.get()
.load(this.urlImgWeather) // .load(this.urlImgWeather)
.into(holder.viewItem.imgWeather) // .into(holder.viewItem.imgWeather)
} // }
// BLog.LOGE("reeeeeeeeeee >>> ${holder.viewItem.hour.text}") //// BLog.LOGE("reeeeeeeeeee >>> ${holder.viewItem.hour.text}")
// holder.viewItem.amOrPm.visibility = //// holder.viewItem.amOrPm.visibility =
// if (arrayListOf(12, 0).contains(WeatherInfoManager.toZonedDateTime(it.time_epoch).hour) || position == 0) { //// if (arrayListOf(12, 0).contains(WeatherInfoManager.toZonedDateTime(it.time_epoch).hour) || position == 0) {
// View.VISIBLE //// View.VISIBLE
// } else View.INVISIBLE //// } else View.INVISIBLE
holder.viewItem.hour.apply { // holder.viewItem.hour.apply {
if (WeatherInfoManager.toZonedDateTime(it.time_epoch).hour == 0) { // if (WeatherInfoManager.toZonedDateTime(it.time_epoch).hour == 0) {
this@apply.setTextColor(Color.BLACK) // this@apply.setTextColor(Color.BLACK)
this@apply.isSelected = true // this@apply.isSelected = true
} else { // } else {
this@apply.setTextColor(Color.WHITE) // this@apply.setTextColor(Color.WHITE)
this@apply.isSelected = false // this@apply.isSelected = false
} // }
} // }
} // }
} // }
//
override fun getItemCount(): Int = dataSet.size // override fun getItemCount(): Int = dataSet.size
//
fun update(li: Collection<Hour>) { // fun update(li: Collection<Hour>) {
li.toList() // li.toList()
this.dataSet.clear() // this.dataSet.clear()
this.dataSet.addAll(li) // this.dataSet.addAll(li)
} // }
} //}

View File

@ -1,9 +1,8 @@
package bums.lunatic.launcher.tokiz package bums.lunatic.launcher.home.tokiz
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
@ -22,8 +21,6 @@ import android.view.View.OnTouchListener
import android.view.View.VISIBLE import android.view.View.VISIBLE
import android.view.View.inflate import android.view.View.inflate
import android.view.ViewGroup import android.view.ViewGroup
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import android.widget.EditText import android.widget.EditText
import android.widget.ImageButton import android.widget.ImageButton
@ -33,15 +30,15 @@ import androidx.appcompat.app.AlertDialog
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment 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.R
import bums.lunatic.launcher.databinding.BooktokiBinding 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.home.toast
import bums.lunatic.launcher.tokiz.view.BWebview import bums.lunatic.launcher.home.tokiz.view.BWebview
import bums.lunatic.launcher.tokiz.view.JxEvent import bums.lunatic.launcher.home.tokiz.view.JxEvent
import bums.lunatic.launcher.tokiz.view.PagedTextLayout import bums.lunatic.launcher.home.tokiz.view.PagedTextLayout
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface import bums.lunatic.launcher.home.tokiz.view.PagedTextViewInterface
import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.workers.WorkersDb import bums.lunatic.launcher.workers.WorkersDb
import com.google.gson.Gson import com.google.gson.Gson
@ -655,7 +652,7 @@ abstract class BaseToki : Fragment(), PagedTextViewInterface {
binding.menuWeb binding.menuWeb
(activity as? LauncherActivity)?.let { activity -> (activity as? NeoRssActivity)?.let { activity ->
binding.menuWeb.decoViews.add(activity.findViewById<TextView>(R.id.current_address)) binding.menuWeb.decoViews.add(activity.findViewById<TextView>(R.id.current_address))
binding.menuWeb.decoViews.add(activity.findViewById<ImageButton>(R.id.back)) binding.menuWeb.decoViews.add(activity.findViewById<ImageButton>(R.id.back))
binding.menuWeb.decoViews.add(activity.findViewById<ImageButton>(R.id.reload)) binding.menuWeb.decoViews.add(activity.findViewById<ImageButton>(R.id.reload))
@ -1197,7 +1194,7 @@ abstract class BaseToki : Fragment(), PagedTextViewInterface {
activity?.runOnUiThread { activity?.runOnUiThread {
view.text = contents view.text = contents
view.visibility = VISIBLE view.visibility = VISIBLE
binding.menuWeb.visibility = View.GONE binding.menuWeb.visibility = GONE
} }
view.forceUpdateUI() view.forceUpdateUI()
lastedUrl?.let { lastedUrl?.let {
@ -1809,7 +1806,7 @@ class Novels : BaseToki(), PagedTextViewInterface {
if (binding.pagedLayer.isVisible) { if (binding.pagedLayer.isVisible) {
binding.pagedLayer.visibility = GONE binding.pagedLayer.visibility = GONE
} }
binding.menuWeb.visibility = View.VISIBLE binding.menuWeb.visibility = VISIBLE
} }
} }

View File

@ -1,4 +1,4 @@
package bums.lunatic.launcher.tokiz package bums.lunatic.launcher.home.tokiz
import android.R import android.R
import android.content.Context import android.content.Context

View File

@ -1,4 +1,4 @@
package bums.lunatic.launcher.tokiz package bums.lunatic.launcher.home.tokiz
import android.graphics.Color import android.graphics.Color
import android.os.Build import android.os.Build

View File

@ -1,4 +1,4 @@
package bums.lunatic.launcher.tokiz.view package bums.lunatic.launcher.home.tokiz.view
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
@ -25,6 +25,7 @@ import org.mozilla.gecko.util.ThreadUtils.runOnUiThread
import org.mozilla.geckoview.GeckoView import org.mozilla.geckoview.GeckoView
import java.io.File import java.io.File
import java.util.Base64 import java.util.Base64
import kotlin.collections.iterator
enum class JxEvent { enum class JxEvent {
SCROLL_UP, SCROLL_UP,
@ -93,7 +94,7 @@ open class BWebview : GeckoView {
runOnUiThread { runOnUiThread {
decoViews.filter { it.id == R.id.dl_video }.firstOrNull()?.let { decoViews.filter { it.id == R.id.dl_video }.firstOrNull()?.let {
it.setOnClickListener {} it.setOnClickListener {}
it.visibility = View.GONE it.visibility = GONE
}}} }}}
Blog.LOGE("checkIfDownloadable ${url}") Blog.LOGE("checkIfDownloadable ${url}")
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
@ -131,7 +132,11 @@ open class BWebview : GeckoView {
it.setOnClickListener { it.setOnClickListener {
videoDlownLoad(url) 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 { runOnUiThread {
decoViews.filter { it.id == R.id.dl_video }.firstOrNull()?.let { decoViews.filter { it.id == R.id.dl_video }.firstOrNull()?.let {
it.setOnClickListener {} it.setOnClickListener {}
it.visibility = View.GONE it.visibility = GONE
}}} }}}
} }
} }
@ -261,7 +266,7 @@ open class BWebview : GeckoView {
nUrl = lastDomain nUrl = lastDomain
} }
if (this.isVisible == false) { if (this.isVisible == false) {
this.visibility = View.VISIBLE this.visibility = VISIBLE
} }
Blog.LOGE("nUrl >>>> ${nUrl}") Blog.LOGE("nUrl >>>> ${nUrl}")

View File

@ -1,4 +1,4 @@
package bums.lunatic.launcher.tokiz.view package bums.lunatic.launcher.home.tokiz.view
import android.annotation.TargetApi import android.annotation.TargetApi
import android.content.Context import android.content.Context
@ -12,12 +12,11 @@ import android.util.AttributeSet
import android.util.TypedValue import android.util.TypedValue
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import android.widget.TextView.BufferType
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.Guideline import androidx.constraintlayout.widget.Guideline
import bums.lunatic.launcher.R 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.Blog
import bums.lunatic.launcher.utils.SimpleFingerGestures import bums.lunatic.launcher.utils.SimpleFingerGestures
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope

View File

@ -1,4 +1,4 @@
package bums.lunatic.launcher.tokiz.view package bums.lunatic.launcher.home.tokiz.view
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet

View File

@ -17,6 +17,7 @@ class SimpleContact : RealmObject {
// [신규] true면 추천 리스트에 절대 안 뜸 // [신규] true면 추천 리스트에 절대 안 뜸
var blockRecommend: Boolean = false var blockRecommend: Boolean = false
constructor(id: String, name: String, phoneNumber: String) { constructor(id: String, name: String, phoneNumber: String) {
this.id = id this.id = id
this.name = name this.name = name

View File

@ -1,432 +1,432 @@
/* ///*
* Lunar Launcher // * Lunar Launcher
* Copyright (C) 2022 Md Rasel Hossain // * Copyright (C) 2022 Md Rasel Hossain
* // *
* This program is free software: you can redistribute it and/or modify // * 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 // * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or // * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. // * (at your option) any later version.
* // *
* This program is distributed in the hope that it will be useful, // * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of // * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. // * GNU General Public License for more details.
* // *
* You should have received a copy of the GNU General Public License // * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. // * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ // */
//
package bums.lunatic.launcher.qaccess //package bums.lunatic.launcher.qaccess
//
import android.Manifest //import android.Manifest
import android.app.AlertDialog //import android.app.AlertDialog
import android.content.Context //import android.content.Context
import android.content.Intent //import android.content.Intent
import android.content.SharedPreferences //import android.content.SharedPreferences
import android.content.pm.PackageManager //import android.content.pm.PackageManager
import android.graphics.BlendMode //import android.graphics.BlendMode
import android.graphics.BlendModeColorFilter //import android.graphics.BlendModeColorFilter
import android.graphics.Color //import android.graphics.Color
import android.graphics.PorterDuff //import android.graphics.PorterDuff
import android.graphics.Typeface //import android.graphics.Typeface
import android.media.AudioManager //import android.media.AudioManager
import android.net.Uri //import android.net.Uri
import android.os.Build //import android.os.Build
import android.os.Bundle //import android.os.Bundle
import android.os.PowerManager //import android.os.PowerManager
import android.provider.Settings //import android.provider.Settings
import android.text.InputType //import android.text.InputType
import android.view.Gravity //import android.view.Gravity
import android.view.LayoutInflater //import android.view.LayoutInflater
import android.view.View //import android.view.View
import android.view.ViewGroup //import android.view.ViewGroup
import android.widget.RelativeLayout //import android.widget.RelativeLayout
import androidx.appcompat.widget.LinearLayoutCompat //import androidx.appcompat.widget.LinearLayoutCompat
import androidx.core.content.ContextCompat //import androidx.core.content.ContextCompat
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity //import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.R //import bums.lunatic.launcher.R
import bums.lunatic.launcher.databinding.QuickAccessBinding //import bums.lunatic.launcher.databinding.QuickAccessBinding
import bums.lunatic.launcher.databinding.ShortcutMakerBinding //import bums.lunatic.launcher.databinding.ShortcutMakerBinding
import bums.lunatic.launcher.helpers.ColorPicker //import bums.lunatic.launcher.helpers.ColorPicker
import bums.lunatic.launcher.helpers.Constants.Companion.DEFAULT_ICON_SIZE //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_ICON_SIZE
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_SHORTCUT_COUNT //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.KEY_SHORTCUT_NO_
import bums.lunatic.launcher.helpers.Constants.Companion.MAX_SHORTCUTS //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_SETTINGS
import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SHORTCUTS //import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SHORTCUTS
import bums.lunatic.launcher.helpers.Constants.Companion.SEPARATOR //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_PHONE
import bums.lunatic.launcher.helpers.Constants.Companion.SHORTCUT_TYPE_URL //import bums.lunatic.launcher.helpers.Constants.Companion.SHORTCUT_TYPE_URL
import bums.lunatic.launcher.model.AppInfo //import bums.lunatic.launcher.model.AppInfo
import bums.lunatic.launcher.model.SimpleContact //import bums.lunatic.launcher.model.SimpleContact
import bums.lunatic.launcher.utils.Blog //import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.workers.WorkersDb //import bums.lunatic.launcher.workers.WorkersDb
import com.google.android.material.bottomsheet.BottomSheetDialog //import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment //import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.android.material.button.MaterialButtonToggleGroup //import com.google.android.material.button.MaterialButtonToggleGroup
import com.google.android.material.dialog.MaterialAlertDialogBuilder //import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.slider.Slider //import com.google.android.material.slider.Slider
import com.google.android.material.textview.MaterialTextView //import com.google.android.material.textview.MaterialTextView
import io.realm.kotlin.ext.query //import io.realm.kotlin.ext.query
import io.realm.kotlin.query.RealmResults //import io.realm.kotlin.query.RealmResults
import java.util.Objects //import java.util.Objects
import kotlin.properties.Delegates //import kotlin.properties.Delegates
//
//
internal class QuickAccess : BottomSheetDialogFragment() { //internal class QuickAccess : BottomSheetDialogFragment() {
//
private lateinit var binding: QuickAccessBinding // private lateinit var binding: QuickAccessBinding
private lateinit var sharedPreferences: SharedPreferences // private lateinit var sharedPreferences: SharedPreferences
private var iconSize by Delegates.notNull<Int>() // private var iconSize by Delegates.notNull<Int>()
//
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { // override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = QuickAccessBinding.inflate(inflater, container, false) // binding = QuickAccessBinding.inflate(inflater, container, false)
//
sharedPreferences = requireContext().getSharedPreferences(PREFS_SHORTCUTS, 0) // sharedPreferences = requireContext().getSharedPreferences(PREFS_SHORTCUTS, 0)
iconSize = requireContext().getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_ICON_SIZE, DEFAULT_ICON_SIZE) // iconSize = requireContext().getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_ICON_SIZE, DEFAULT_ICON_SIZE)
//
/* set up volume sliders, brightness slider and favorite apps */ // /* set up volume sliders, brightness slider and favorite apps */
volumeControllers() // volumeControllers()
controlBrightness() // controlBrightness()
//
return binding.root // return binding.root
} // }
//
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { // override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) // super.onViewCreated(view, savedInstanceState)
/* enable dismiss animation */ // /* enable dismiss animation */
(requireDialog() as BottomSheetDialog).dismissWithAnimation = true // (requireDialog() as BottomSheetDialog).dismissWithAnimation = true
} // }
//
override fun onResume() { // override fun onResume() {
super.onResume() // super.onResume()
/* repopulate shortcuts and apps */ // /* repopulate shortcuts and apps */
shortcuts() // shortcuts()
} // }
//
/* control the volumes */ // /* control the volumes */
private fun volumeControllers() { // private fun volumeControllers() {
val audioManager = lActivity!!.getSystemService(Context.AUDIO_SERVICE) as AudioManager // val audioManager = lActivity!!.getSystemService(Context.AUDIO_SERVICE) as AudioManager
/* max value */ // /* max value */
binding.notification.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION).toFloat() // binding.notification.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION).toFloat()
binding.alarm.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM).toFloat() // binding.alarm.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM).toFloat()
binding.media.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat() // binding.media.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat()
binding.voice.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL).toFloat() // binding.voice.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL).toFloat()
binding.ring.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING).toFloat() // binding.ring.valueTo = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING).toFloat()
/* current value */ // /* current value */
binding.notification.value = audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION).toFloat() // binding.notification.value = audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION).toFloat()
binding.alarm.value = audioManager.getStreamVolume(AudioManager.STREAM_ALARM).toFloat() // binding.alarm.value = audioManager.getStreamVolume(AudioManager.STREAM_ALARM).toFloat()
binding.media.value = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).toFloat() // binding.media.value = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).toFloat()
binding.voice.value = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL).toFloat() // binding.voice.value = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL).toFloat()
binding.ring.value = audioManager.getStreamVolume(AudioManager.STREAM_RING).toFloat() // binding.ring.value = audioManager.getStreamVolume(AudioManager.STREAM_RING).toFloat()
//
/* slider change listener for alarm volume */ // /* slider change listener for alarm volume */
binding.alarm.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean -> // binding.alarm.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, value.toInt(), 0) // audioManager.setStreamVolume(AudioManager.STREAM_ALARM, value.toInt(), 0)
}) // })
//
/* slider change listener for media volume */ // /* slider change listener for media volume */
binding.media.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean -> // binding.media.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, value.toInt(), 0) // audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, value.toInt(), 0)
}) // })
//
/* slider change listener for voice call volume */ // /* slider change listener for voice call volume */
binding.voice.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean -> // binding.voice.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, value.toInt(), 0) // audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, value.toInt(), 0)
}) // })
//
/* notify and ring volume sliders will work only if // /* notify and ring volume sliders will work only if
the device isn't in dnd or silent mode */ // the device isn't in dnd or silent mode */
if (Settings.Global.getInt(lActivity!!.contentResolver, "zen_mode") == 0 && // if (Settings.Global.getInt(lActivity!!.contentResolver, "zen_mode") == 0 &&
audioManager.ringerMode != AudioManager.RINGER_MODE_SILENT) { // audioManager.ringerMode != AudioManager.RINGER_MODE_SILENT) {
/* slider change listener for notify volume */ // /* slider change listener for notify volume */
binding.notification.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean -> // binding.notification.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, value.toInt(), 0) // audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, value.toInt(), 0)
}) // })
/* slider change listener for ring volume */ // /* slider change listener for ring volume */
binding.ring.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean -> // binding.ring.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
audioManager.setStreamVolume(AudioManager.STREAM_RING, value.toInt(), 0) // audioManager.setStreamVolume(AudioManager.STREAM_RING, value.toInt(), 0)
}) // })
} else { // } else {
binding.notification.isEnabled = false // binding.notification.isEnabled = false
binding.ring.isEnabled = false // binding.ring.isEnabled = false
} // }
} // }
//
/* set up contact and url shortcuts */ // /* set up contact and url shortcuts */
private fun shortcuts() { // private fun shortcuts() {
binding.shortcutsGroup.removeAllViews() // binding.shortcutsGroup.removeAllViews()
val shortcutCount = // val shortcutCount =
requireContext().getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_SHORTCUT_COUNT, MAX_SHORTCUTS) // requireContext().getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_SHORTCUT_COUNT, MAX_SHORTCUTS)
if (shortcutCount == 0) binding.shortcutsGroup.visibility = View.GONE // if (shortcutCount == 0) binding.shortcutsGroup.visibility = View.GONE
//
for (position in 1..shortcutCount) { // for (position in 1..shortcutCount) {
val shortcutValue = sharedPreferences.getString(KEY_SHORTCUT_NO_ + position.toString(), "").toString() // val shortcutValue = sharedPreferences.getString(KEY_SHORTCUT_NO_ + position.toString(), "").toString()
val splitShortcutValue = shortcutValue.split(SEPARATOR).toTypedArray() // val splitShortcutValue = shortcutValue.split(SEPARATOR).toTypedArray()
//
var shortcutType = "" // var shortcutType = ""
var intentString = "" // var intentString = ""
var thumbLetter = "" // var thumbLetter = ""
var color = "" // var color = ""
//
try { // try {
if (splitShortcutValue.size >= 4) { // if (splitShortcutValue.size >= 4) {
shortcutType = splitShortcutValue[0] // shortcutType = splitShortcutValue[0]
intentString = splitShortcutValue[1] // intentString = splitShortcutValue[1]
thumbLetter = splitShortcutValue[2] // thumbLetter = splitShortcutValue[2]
color = splitShortcutValue[3] // color = splitShortcutValue[3]
} // }
} catch (exception : Exception) { // } catch (exception : Exception) {
exception.printStackTrace() // exception.printStackTrace()
} // }
//
shortcutsUtil(textView, shortcutType, intentString, thumbLetter, color, position) // shortcutsUtil(textView, shortcutType, intentString, thumbLetter, color, position)
} // }
} // }
//
/* control the brightness */ // /* control the brightness */
private fun controlBrightness() { // private fun controlBrightness() {
val resolver = lActivity!!.contentResolver // val resolver = lActivity!!.contentResolver
/* set max value */ // /* set max value */
binding.brightness.valueTo = maxBrightness // binding.brightness.valueTo = maxBrightness
//
/* set slider value to current brightness value */ // /* set slider value to current brightness value */
try { // try {
binding.brightness.value = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS).toFloat() // binding.brightness.value = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS).toFloat()
} catch (settingNotFoundException: Settings.SettingNotFoundException) { // } catch (settingNotFoundException: Settings.SettingNotFoundException) {
settingNotFoundException.printStackTrace() // settingNotFoundException.printStackTrace()
} // }
//
/* listen slider value changes */ // /* listen slider value changes */
binding.brightness.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean -> // binding.brightness.addOnChangeListener(Slider.OnChangeListener { _: Slider?, value: Float, _: Boolean ->
/* if write settings permission is not allowed already, // /* if write settings permission is not allowed already,
again ask for it to be granted */ // again ask for it to be granted */
if (!Settings.System.canWrite(lActivity!!)) { // if (!Settings.System.canWrite(lActivity!!)) {
lActivity!!.startActivity( // lActivity!!.startActivity(
Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS) // Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
.setData(Uri.parse("package:" + lActivity!!.packageName)) // .setData(Uri.parse("package:" + lActivity!!.packageName))
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
) // )
/* set the brightness according to the slider value */ // /* set the brightness according to the slider value */
} else { // } else {
Settings.System.putInt( // Settings.System.putInt(
resolver, // resolver,
Settings.System.SCREEN_BRIGHTNESS_MODE, // Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL // Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL
) // )
Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, value.toInt()) // Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, value.toInt())
} // }
}) // })
} // }
//
/* contact/url shortcuts */ // /* contact/url shortcuts */
private fun shortcutsUtil(textView: MaterialTextView, shortcutType: String, intentString: String, // private fun shortcutsUtil(textView: MaterialTextView, shortcutType: String, intentString: String,
thumbLetter: String, color: String, position: Int) { // thumbLetter: String, color: String, position: Int) {
/* show plus sign for empty positions and set click listener */ // /* show plus sign for empty positions and set click listener */
if (intentString.isEmpty()) { // if (intentString.isEmpty()) {
textView.text = "+" // textView.text = "+"
textView.setOnClickListener { // textView.setOnClickListener {
shortcutsSaverDialog(position, "00000000", "", "", "") // shortcutsSaverDialog(position, "00000000", "", "", "")
} // }
} else { // } else {
/* show thumbnail letter */ // /* show thumbnail letter */
textView.text = thumbLetter // textView.text = thumbLetter
/* set background color */ // /* set background color */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
textView.background.colorFilter = // textView.background.colorFilter =
BlendModeColorFilter(Color.parseColor("#$color"), BlendMode.MULTIPLY) // BlendModeColorFilter(Color.parseColor("#$color"), BlendMode.MULTIPLY)
} else { // } else {
@Suppress("DEPRECATION") // @Suppress("DEPRECATION")
textView.background.setColorFilter(Color.parseColor("#$color"), PorterDuff.Mode.MULTIPLY) // textView.background.setColorFilter(Color.parseColor("#$color"), PorterDuff.Mode.MULTIPLY)
} // }
//
/* on normal click */ // /* on normal click */
textView.setOnClickListener { // textView.setOnClickListener {
/* type is url */ // /* type is url */
if (shortcutType == SHORTCUT_TYPE_URL) { // if (shortcutType == SHORTCUT_TYPE_URL) {
var url = intentString // var url = intentString
Blog.LOGE("intentString >>>> ${intentString}") // Blog.LOGE("intentString >>>> ${intentString}")
/* add http before the url if it doesn't have http/https prefix */ // /* add http before the url if it doesn't have http/https prefix */
if (!url.startsWith("http")) { // if (!url.startsWith("http")) {
// url = "http://$intentString" //// url = "http://$intentString"
/* open the url */ // /* open the url */
WorkersDb.getRealm().apply { // WorkersDb.getRealm().apply {
var result = query<AppInfo>("appName CONTAINS $0 OR koreanName CONTAINS $0", url).find() // var result = query<AppInfo>("appName CONTAINS $0 OR koreanName CONTAINS $0", url).find()
if (result.size == 1) { // if (result.size == 1) {
result.first().pkgName?.let { // result.first().pkgName?.let {
try { // try {
context?.startActivity(context?.packageManager?.getLaunchIntentForPackage(it)) // context?.startActivity(context?.packageManager?.getLaunchIntentForPackage(it))
}catch (e : Exception) {} // }catch (e : Exception) {}
} // }
} else { // } else {
lActivity!!.startActivity( // lActivity!!.startActivity(
Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
) // )
} // }
} // }
} else { // } else {
lActivity!!.startActivity( // lActivity!!.startActivity(
Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
) // )
} // }
//
/* type is contact */ // /* type is contact */
} else if (shortcutType == SHORTCUT_TYPE_PHONE) { // } else if (shortcutType == SHORTCUT_TYPE_PHONE) {
/* if the necessary permission is not granted already, // /* if the necessary permission is not granted already,
ask for it again */ // ask for it again */
if (lActivity!!.checkSelfPermission(Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { // if (lActivity!!.checkSelfPermission(Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
lActivity!!.requestPermissions(arrayOf(Manifest.permission.CALL_PHONE), 1) // lActivity!!.requestPermissions(arrayOf(Manifest.permission.CALL_PHONE), 1)
} else { // } else {
/* make phone call */ // /* make phone call */
//
WorkersDb.getRealm().writeBlocking { // WorkersDb.getRealm().writeBlocking {
Blog.LOGE(">>>> ${query<SimpleContact>().query("phoneNumber CONTAINS $0", intentString).description()}") // Blog.LOGE(">>>> ${query<SimpleContact>().query("phoneNumber CONTAINS $0", intentString).description()}")
var result : RealmResults<SimpleContact>? = null // var result : RealmResults<SimpleContact>? = null
if (intentString.startsWith("0")) { // if (intentString.startsWith("0")) {
result = query<SimpleContact>().query("phoneNumber CONTAINS $0 or phoneNumber CONTAINS $1", intentString, intentString.removeRange(0,1)).find() // result = query<SimpleContact>().query("phoneNumber CONTAINS $0 or phoneNumber CONTAINS $1", intentString, intentString.removeRange(0,1)).find()
} else { // } else {
result = query<SimpleContact>().query("phoneNumber CONTAINS $0", intentString).find() // result = query<SimpleContact>().query("phoneNumber CONTAINS $0", intentString).find()
} // }
Blog.LOGE(">>>> ${result.size}") // Blog.LOGE(">>>> ${result.size}")
if(result.size > 0){ // if(result.size > 0){
result.forEach { // result.forEach {
it.touchCount = 1 + it.touchCount // it.touchCount = 1 + it.touchCount
it.lastedTouchDateTime = System.currentTimeMillis() // it.lastedTouchDateTime = System.currentTimeMillis()
} // }
} // }
} // }
lActivity!!.startActivity( // lActivity!!.startActivity(
Intent(Intent.ACTION_DIAL, Uri.parse("tel:$intentString")) // Intent(Intent.ACTION_DIAL, Uri.parse("tel:$intentString"))
) // )
} // }
} // }
try { // try {
this.dismissAllowingStateLoss() // this.dismissAllowingStateLoss()
} catch (e : Exception) { // } catch (e : Exception) {
//
} // }
} // }
//
/* reset the shortcut on long click */ // /* reset the shortcut on long click */
textView.setOnLongClickListener { // textView.setOnLongClickListener {
shortcutsSaverDialog(position, color, thumbLetter, shortcutType, intentString) // shortcutsSaverDialog(position, color, thumbLetter, shortcutType, intentString)
true // true
} // }
} // }
} // }
//
/* dialog for creating shortcuts */ // /* dialog for creating shortcuts */
private fun shortcutsSaverDialog( // private fun shortcutsSaverDialog(
position: Int, color: String, thumbLetter: String, shortcutType: String, intentString: String) { // position: Int, color: String, thumbLetter: String, shortcutType: String, intentString: String) {
val dialogBinding = ShortcutMakerBinding.inflate(lActivity!!.layoutInflater) // val dialogBinding = ShortcutMakerBinding.inflate(lActivity!!.layoutInflater)
val dialogBuilder = MaterialAlertDialogBuilder(lActivity!!) // val dialogBuilder = MaterialAlertDialogBuilder(lActivity!!)
.setView(dialogBinding.root) // .setView(dialogBinding.root)
.setNeutralButton(R.string.delete, null) // .setNeutralButton(R.string.delete, null)
.setNegativeButton(android.R.string.cancel, null) // .setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok, null) // .setPositiveButton(android.R.string.ok, null)
.show() // .show()
//
dialogBinding.thumbField.setText(thumbLetter) // dialogBinding.thumbField.setText(thumbLetter)
dialogBinding.inputField.setText(intentString) // dialogBinding.inputField.setText(intentString)
when (shortcutType) { // when (shortcutType) {
SHORTCUT_TYPE_PHONE -> dialogBinding.shortcutType.check(dialogBinding.contact.id) // SHORTCUT_TYPE_PHONE -> dialogBinding.shortcutType.check(dialogBinding.contact.id)
SHORTCUT_TYPE_URL -> dialogBinding.shortcutType.check(dialogBinding.url.id) // SHORTCUT_TYPE_URL -> dialogBinding.shortcutType.check(dialogBinding.url.id)
} // }
//
/* set up color picker section */ // /* set up color picker section */
ColorPicker(color, dialogBinding.colorPicker.colorInput, dialogBinding.colorPicker.colorA, // ColorPicker(color, dialogBinding.colorPicker.colorInput, dialogBinding.colorPicker.colorA,
dialogBinding.colorPicker.colorR, dialogBinding.colorPicker.colorG, // dialogBinding.colorPicker.colorR, dialogBinding.colorPicker.colorG,
dialogBinding.colorPicker.colorB, dialogBinding.root).pickColor() // dialogBinding.colorPicker.colorB, dialogBinding.root).pickColor()
//
/* shortcut type chooser - contact/url */ // /* shortcut type chooser - contact/url */
var updatedShortcutType = shortcutType // var updatedShortcutType = shortcutType
dialogBinding.shortcutType.addOnButtonCheckedListener { // dialogBinding.shortcutType.addOnButtonCheckedListener {
_: MaterialButtonToggleGroup?, checkedId: Int, isChecked: Boolean -> // _: MaterialButtonToggleGroup?, checkedId: Int, isChecked: Boolean ->
if (isChecked) { // if (isChecked) {
when (checkedId) { // when (checkedId) {
dialogBinding.contact.id -> { // dialogBinding.contact.id -> {
updatedShortcutType = SHORTCUT_TYPE_PHONE // updatedShortcutType = SHORTCUT_TYPE_PHONE
dialogBinding.inputField.inputType = InputType.TYPE_CLASS_PHONE // dialogBinding.inputField.inputType = InputType.TYPE_CLASS_PHONE
} // }
dialogBinding.url.id -> { // dialogBinding.url.id -> {
updatedShortcutType = SHORTCUT_TYPE_URL // updatedShortcutType = SHORTCUT_TYPE_URL
dialogBinding.inputField.inputType = InputType.TYPE_TEXT_VARIATION_URI // dialogBinding.inputField.inputType = InputType.TYPE_TEXT_VARIATION_URI
} // }
} // }
} // }
} // }
//
dialogBuilder.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener { // dialogBuilder.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener {
sharedPreferences.edit().remove(KEY_SHORTCUT_NO_ + position).apply() // sharedPreferences.edit().remove(KEY_SHORTCUT_NO_ + position).apply()
dialogBuilder.dismiss() // dialogBuilder.dismiss()
this.onResume() // this.onResume()
} // }
//
/* save the shortcut values */ // /* save the shortcut values */
dialogBuilder.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { // dialogBuilder.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
/* get shortcut value */ // /* get shortcut value */
val updatedIntentString = // val updatedIntentString =
Objects.requireNonNull(dialogBinding.inputField.text).toString().trim { it <= ' ' } // Objects.requireNonNull(dialogBinding.inputField.text).toString().trim { it <= ' ' }
/* get thumbnail letter */ // /* get thumbnail letter */
val updatedThumbLetter = // val updatedThumbLetter =
Objects.requireNonNull(dialogBinding.thumbField.text).toString().trim { it <= ' ' }.uppercase() // Objects.requireNonNull(dialogBinding.thumbField.text).toString().trim { it <= ' ' }.uppercase()
/* get color value */ // /* get color value */
val updatedColor = // val updatedColor =
Objects.requireNonNull(dialogBinding.colorPicker.colorInput.text).toString().trim { it <= ' ' } // Objects.requireNonNull(dialogBinding.colorPicker.colorInput.text).toString().trim { it <= ' ' }
//
/* save the values if every field is filled */ // /* save the values if every field is filled */
if (updatedShortcutType.isNotEmpty() && updatedIntentString.isNotEmpty() && // if (updatedShortcutType.isNotEmpty() && updatedIntentString.isNotEmpty() &&
updatedThumbLetter.isNotEmpty() && updatedColor.isNotEmpty()) { // updatedThumbLetter.isNotEmpty() && updatedColor.isNotEmpty()) {
sharedPreferences.edit().putString(KEY_SHORTCUT_NO_ + position, // sharedPreferences.edit().putString(KEY_SHORTCUT_NO_ + position,
"$updatedShortcutType$SEPARATOR$updatedIntentString$SEPARATOR" + // "$updatedShortcutType$SEPARATOR$updatedIntentString$SEPARATOR" +
"$updatedThumbLetter$SEPARATOR$updatedColor").apply() // "$updatedThumbLetter$SEPARATOR$updatedColor").apply()
dialogBuilder.dismiss() // dialogBuilder.dismiss()
this.onResume() // this.onResume()
} // }
} // }
} // }
//
/* create text view for shortcut thumbnails */ // /* create text view for shortcut thumbnails */
private val textView: MaterialTextView get() { // private val textView: MaterialTextView get() {
val relativeLayout = RelativeLayout(lActivity!!) // val relativeLayout = RelativeLayout(lActivity!!)
relativeLayout.apply { // relativeLayout.apply {
layoutParams = LinearLayoutCompat.LayoutParams( // layoutParams = LinearLayoutCompat.LayoutParams(
LinearLayoutCompat.LayoutParams.WRAP_CONTENT, // LinearLayoutCompat.LayoutParams.WRAP_CONTENT,
LinearLayoutCompat.LayoutParams.WRAP_CONTENT, 1F) // LinearLayoutCompat.LayoutParams.WRAP_CONTENT, 1F)
gravity = Gravity.CENTER // gravity = Gravity.CENTER
} // }
binding.shortcutsGroup.addView(relativeLayout) // binding.shortcutsGroup.addView(relativeLayout)
//
MaterialTextView(requireContext()).apply { // MaterialTextView(requireContext()).apply {
layoutParams = LinearLayoutCompat.LayoutParams( // layoutParams = LinearLayoutCompat.LayoutParams(
(iconSize * resources.displayMetrics.density).toInt(), // (iconSize * resources.displayMetrics.density).toInt(),
(iconSize * resources.displayMetrics.density).toInt()) // (iconSize * resources.displayMetrics.density).toInt())
gravity = Gravity.CENTER // gravity = Gravity.CENTER
textSize = (iconSize / 4) * resources.displayMetrics.density // textSize = (iconSize / 4) * resources.displayMetrics.density
setTypeface(null, Typeface.BOLD) // setTypeface(null, Typeface.BOLD)
background = ContextCompat.getDrawable(requireContext(), R.drawable.rounded_bg) // background = ContextCompat.getDrawable(requireContext(), R.drawable.rounded_bg)
}.let { // }.let {
relativeLayout.addView(it) // relativeLayout.addView(it)
return it // return it
} // }
} // }
//
/* returns maximum brightness value of the device */ // /* returns maximum brightness value of the device */
private val maxBrightness: Float get() { // private val maxBrightness: Float get() {
val powerManager = requireContext().getSystemService(Context.POWER_SERVICE) as PowerManager // val powerManager = requireContext().getSystemService(Context.POWER_SERVICE) as PowerManager
var value = 255f // var value = 255f
for (f in powerManager.javaClass.declaredFields) { // for (f in powerManager.javaClass.declaredFields) {
if (f.name.equals("BRIGHTNESS_ON")) { // if (f.name.equals("BRIGHTNESS_ON")) {
f.isAccessible = true // f.isAccessible = true
value = try { // value = try {
f.getInt(powerManager).toFloat() // f.getInt(powerManager).toFloat()
} catch (e: IllegalAccessException) { // } catch (e: IllegalAccessException) {
255f // 255f
} // }
} // }
} // }
return value // return value
} // }
//
} //}

View File

@ -6,15 +6,10 @@ import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.pm.ResolveInfo import android.content.pm.ResolveInfo
import android.os.Build import android.os.Build
import androidx.work.WorkerParameters
import bums.lunatic.launcher.BuildConfig 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.model.AppInfo
import bums.lunatic.launcher.utils.AlphabetToChosungMap import bums.lunatic.launcher.utils.AlphabetToChosungMap
import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.utils.JamoUtils import bums.lunatic.launcher.utils.JamoUtils
import io.realm.kotlin.ext.query
import io.realm.kotlin.types.RealmObject import io.realm.kotlin.types.RealmObject
import java.text.Normalizer import java.text.Normalizer
import java.util.regex.Pattern import java.util.regex.Pattern
@ -31,7 +26,7 @@ class AppInfoGetter : BaseGetter {
override fun realWork(): List<RealmObject> { override fun realWork(): List<RealmObject> {
var result = mutableListOf<RealmObject>() var result = mutableListOf<RealmObject>()
try { try {
val packageManager = lActivity?.packageManager ?: return result val packageManager = context.packageManager ?: return result
// 1. 설치된 앱 목록 가져오기 (시스템 호출 1회) // 1. 설치된 앱 목록 가져오기 (시스템 호출 1회)
val intent = Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER) val intent = Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER)
@ -44,9 +39,6 @@ class AppInfoGetter : BaseGetter {
resolveInfos.forEach { ri -> resolveInfos.forEach { ri ->
val pkgName = ri.activityInfo.packageName val pkgName = ri.activityInfo.packageName
if (pkgName == BuildConfig.APPLICATION_ID) return@forEach if (pkgName == BuildConfig.APPLICATION_ID) return@forEach
// 이미 DB에 있는지 Map에서 확인 (고속 검색)
// 신규 앱 발견 -> 추가
val appName = normalize(appName(ri)) val appName = normalize(appName(ri))
result.add(AppInfo().apply { result.add(AppInfo().apply {
@ -67,9 +59,10 @@ class AppInfoGetter : BaseGetter {
fun appName(resolver: ResolveInfo): String { fun appName(resolver: ResolveInfo): String {
return resolver.loadLabel(lActivity?.packageManager!!).toString().apply { return resolver.loadLabel(context.packageManager!!).toString()
appNamesPrefs?.edit()?.putString(resolver.activityInfo.packageName, this)?.apply() // .apply {
} // appNamesPrefs?.edit()?.putString(resolver.activityInfo.packageName, this)?.apply()
// }
} }
fun getCategory(category : Int) : String { fun getCategory(category : Int) : String {

View File

@ -2,8 +2,6 @@ package bums.lunatic.launcher.workers
import android.content.Context import android.content.Context
import android.provider.ContactsContract 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.model.SimpleContact
import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.Blog
import io.realm.kotlin.ext.query import io.realm.kotlin.ext.query
@ -25,7 +23,7 @@ class ContactInfoGetter(context: Context) : BaseGetter(context) {
try { 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 idIdx = cursor.getColumnIndex(projection[0])
val nameIdx = cursor.getColumnIndex(projection[1]) val nameIdx = cursor.getColumnIndex(projection[1])
val numberIdx = cursor.getColumnIndex(projection[2]) val numberIdx = cursor.getColumnIndex(projection[2])

View File

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import bums.lunatic.launcher.LauncherActivity import bums.lunatic.launcher.LauncherActivity
import bums.lunatic.launcher.home.NeoRssActivity
import bums.lunatic.launcher.model.RssDataType import bums.lunatic.launcher.model.RssDataType
import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.Blog
import io.realm.kotlin.types.RealmObject import io.realm.kotlin.types.RealmObject
@ -26,7 +27,7 @@ class DotaxGetter(context: Context) : BaseGetter(context) {
temp.clear() temp.clear()
CoroutineScope(Dispatchers.Main).launch { CoroutineScope(Dispatchers.Main).launch {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
LauncherActivity.lActivity?.let { NeoRssActivity.lActivity?.let {
it.contentsLoad("https://m.cafe.daum.net/dotax/Elgq") it.contentsLoad("https://m.cafe.daum.net/dotax/Elgq")
} }
} }

View File

@ -4,7 +4,6 @@ import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.provider.CallLog import android.provider.CallLog
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
import bums.lunatic.launcher.utils.beforeDay import bums.lunatic.launcher.utils.beforeDay
import bums.lunatic.launcher.utils.getContactId import bums.lunatic.launcher.utils.getContactId
import com.google.gson.Gson import com.google.gson.Gson
@ -46,72 +45,72 @@ class RecentCall : RealmObject {
} }
} }
//
class RecentCallGetter(context: Context) : BaseGetter(context) { //class RecentCallGetter(context: Context) : BaseGetter(context) {
companion object{ // companion object{
var dayRange = BaseGetter.defaultDay // var dayRange = BaseGetter.defaultDay
val TAG = "RecentCallGetter" // val TAG = "RecentCallGetter"
val dateFormat = SimpleDateFormat("yyy/MM/dd-HH:mm:ss") // val dateFormat = SimpleDateFormat("yyy/MM/dd-HH:mm:ss")
} // }
//
@SuppressLint("RestrictedApi") // @SuppressLint("RestrictedApi")
override fun realWork(): List<RealmObject> { // override fun realWork(): List<RealmObject> {
var temp = mutableListOf<RecentCall>() // var temp = mutableListOf<RecentCall>()
var dateParam = beforeDay(dayRange).toString() // var dateParam = beforeDay(dayRange).toString()
var managedCursor = lActivity?.contentResolver?.query( // var managedCursor = lActivity?.contentResolver?.query(
CallLog.Calls.CONTENT_URI, arrayOf( // CallLog.Calls.CONTENT_URI, arrayOf(
CallLog.Calls.NUMBER, // CallLog.Calls.NUMBER,
CallLog.Calls.TYPE, // CallLog.Calls.TYPE,
CallLog.Calls.DATE, // CallLog.Calls.DATE,
CallLog.Calls.DURATION, // CallLog.Calls.DURATION,
CallLog.Calls.CACHED_NAME, // CallLog.Calls.CACHED_NAME,
), CallLog.Calls.DATE + " >= ? " , arrayOf<String>(dateParam), CallLog.Calls.DATE + " desc") // ), CallLog.Calls.DATE + " >= ? " , arrayOf<String>(dateParam), CallLog.Calls.DATE + " desc")
//
if(managedCursor != null && managedCursor.isClosed == false) { // if(managedCursor != null && managedCursor.isClosed == false) {
try { // try {
val number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER) // val number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER)
val type = managedCursor.getColumnIndex(CallLog.Calls.TYPE) // val type = managedCursor.getColumnIndex(CallLog.Calls.TYPE)
val date = managedCursor.getColumnIndex(CallLog.Calls.DATE) // val date = managedCursor.getColumnIndex(CallLog.Calls.DATE)
val duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION) // val duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION)
val name = managedCursor.getColumnIndex(CallLog.Calls.CACHED_NAME) // val name = managedCursor.getColumnIndex(CallLog.Calls.CACHED_NAME)
while (managedCursor.moveToNext()) { // while (managedCursor.moveToNext()) {
val phNumber = managedCursor.getString(number) // mobile number // val phNumber = managedCursor.getString(number) // mobile number
val callType = managedCursor.getString(type) // call type // val callType = managedCursor.getString(type) // call type
val callDate = managedCursor.getString(date) // call date // val callDate = managedCursor.getString(date) // call date
val callDayTime = callDate.toLong() // val callDayTime = callDate.toLong()
val callDuration = managedCursor.getString(duration) // val callDuration = managedCursor.getString(duration)
val callerName = managedCursor.getString(name) // val callerName = managedCursor.getString(name)
//
var dir: String = "" // var dir: String = ""
val dircode = callType.toInt() // val dircode = callType.toInt()
when (dircode) { // when (dircode) {
CallLog.Calls.INCOMING_TYPE -> { dir = "INCOMING_TYPE" } // CallLog.Calls.INCOMING_TYPE -> { dir = "INCOMING_TYPE" }
CallLog.Calls.OUTGOING_TYPE -> { dir = "OUTGOING_TYPE" } // CallLog.Calls.OUTGOING_TYPE -> { dir = "OUTGOING_TYPE" }
CallLog.Calls.MISSED_TYPE -> { dir = "MISSED_TYPE" } // CallLog.Calls.MISSED_TYPE -> { dir = "MISSED_TYPE" }
CallLog.Calls.VOICEMAIL_TYPE -> { dir = "VOICEMAIL_TYPE" } // CallLog.Calls.VOICEMAIL_TYPE -> { dir = "VOICEMAIL_TYPE" }
CallLog.Calls.REJECTED_TYPE -> { dir = "REJECTED_TYPE" } // CallLog.Calls.REJECTED_TYPE -> { dir = "REJECTED_TYPE" }
CallLog.Calls.BLOCKED_TYPE -> { dir = "BLOCKED_TYPE" } // CallLog.Calls.BLOCKED_TYPE -> { dir = "BLOCKED_TYPE" }
CallLog.Calls.ANSWERED_EXTERNALLY_TYPE -> { dir = "ANSWERED_EXTERNALLY_TYPE" } // CallLog.Calls.ANSWERED_EXTERNALLY_TYPE -> { dir = "ANSWERED_EXTERNALLY_TYPE" }
} // }
temp.add(RecentCall( // temp.add(RecentCall(
1, // 1,
callerName, // callerName,
phNumber, // phNumber,
dircode, // dircode,
dir, // dir,
dateFormat.format(Date(callDayTime)), // dateFormat.format(Date(callDayTime)),
callDayTime, // callDayTime,
callDuration.toLong() // callDuration.toLong()
)) // ))
//
} // }
} catch (e: Exception) { // } catch (e: Exception) {
e.printStackTrace() // e.printStackTrace()
} finally { // } finally {
managedCursor.close() // managedCursor.close()
} // }
} // }
return temp // return temp
} // }
//
} //}

View File

@ -1,107 +1,116 @@
package bums.lunatic.launcher.workers 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 com.google.gson.Gson
import io.realm.kotlin.ext.query
import io.realm.kotlin.ext.realmListOf import io.realm.kotlin.ext.realmListOf
import io.realm.kotlin.types.RealmList import io.realm.kotlin.types.RealmList
import io.realm.kotlin.types.RealmObject import io.realm.kotlin.types.RealmObject
import io.realm.kotlin.types.annotations.Ignore import io.realm.kotlin.types.annotations.Ignore
import io.realm.kotlin.types.annotations.PrimaryKey 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 { //import android.annotation.SuppressLint
var dayRange = BaseGetter.defaultDay //import android.content.ContentResolver
val SMS_WORK_TAG = "RecentSmsGetter" //import android.content.Context
} //import android.database.Cursor
//import android.net.Uri
//import android.provider.Telephony
@SuppressLint("RestrictedApi") //import androidx.work.WorkerParameters
override fun realWork(): List<RealmObject> { //import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
var temp = mutableListOf<RecentSms>() //import bums.lunatic.launcher.utils.beforeDay
var dateParam = beforeDay(dayRange).toString() //import bums.lunatic.launcher.utils.getContactName
val managedCursor = lActivity?.contentResolver?.query( //import bums.lunatic.launcher.workers.RecentSmsGetter.Companion.dayRange
Telephony.Sms.CONTENT_URI, arrayOf( //import com.google.gson.Gson
Telephony.Sms.THREAD_ID, //import io.realm.kotlin.ext.query
Telephony.Sms.ADDRESS, //import io.realm.kotlin.ext.realmListOf
Telephony.Sms.TYPE, //import io.realm.kotlin.types.RealmList
Telephony.Sms.DATE, //import io.realm.kotlin.types.RealmObject
Telephony.Sms.DATE_SENT, //import io.realm.kotlin.types.annotations.Ignore
Telephony.Sms.BODY, //import io.realm.kotlin.types.annotations.PrimaryKey
Telephony.Sms.PERSON, //import java.io.BufferedReader
), Telephony.Sms.DATE + "> ${dateParam}", null, Telephony.Sms.DEFAULT_SORT_ORDER) //import java.io.IOException
if (managedCursor != null && managedCursor.isClosed == false) { //import java.io.InputStream
try { //import java.io.InputStreamReader
val tid = managedCursor.getColumnIndex(Telephony.Sms.THREAD_ID) //
val address = managedCursor.getColumnIndex(Telephony.Sms.ADDRESS) //class RecentSmsGetter(context: Context) : BaseGetter(context) {
val type = managedCursor.getColumnIndex(Telephony.Sms.TYPE) // companion object {
val date = managedCursor.getColumnIndex(Telephony.Sms.DATE) // var dayRange = BaseGetter.defaultDay
val sendDate = managedCursor.getColumnIndex(Telephony.Sms.DATE_SENT) // val SMS_WORK_TAG = "RecentSmsGetter"
val bodyIdx = managedCursor.getColumnIndex(Telephony.Sms.BODY) // }
val name = managedCursor.getColumnIndex(Telephony.Sms.PERSON) //
while (managedCursor.moveToNext()) { //
val id = managedCursor.getString(tid) // mobile number // @SuppressLint("RestrictedApi")
val phNumber = managedCursor.getString(address) // mobile number // override fun realWork(): List<RealmObject> {
val callType = managedCursor.getString(type) // call type // var temp = mutableListOf<RecentSms>()
val reciveDate = managedCursor.getLong(date) // call date // var dateParam = beforeDay(dayRange).toString()
val sendedDate = managedCursor.getLong(sendDate) // call date // val managedCursor = lActivity?.contentResolver?.query(
val smsBody = managedCursor.getString(bodyIdx).replace("\n"," ") // Telephony.Sms.CONTENT_URI, arrayOf(
val callerName = managedCursor.getString(name) // Telephony.Sms.THREAD_ID,
// Telephony.Sms.ADDRESS,
var dir: String = "" // Telephony.Sms.TYPE,
val dircode = callType.toInt() // Telephony.Sms.DATE,
when (dircode) { // Telephony.Sms.DATE_SENT,
Telephony.Sms.MESSAGE_TYPE_ALL -> {dir = "MESSAGE_TYPE_ALL"} // Telephony.Sms.BODY,
Telephony.Sms.MESSAGE_TYPE_INBOX -> {dir = "MESSAGE_TYPE_INBOX"} // Telephony.Sms.PERSON,
Telephony.Sms.MESSAGE_TYPE_SENT -> {dir = "MESSAGE_TYPE_SENT"} // ), Telephony.Sms.DATE + "> ${dateParam}", null, Telephony.Sms.DEFAULT_SORT_ORDER)
Telephony.Sms.MESSAGE_TYPE_DRAFT -> {dir = "MESSAGE_TYPE_DRAFT"} // if (managedCursor != null && managedCursor.isClosed == false) {
Telephony.Sms.MESSAGE_TYPE_OUTBOX -> {dir = "MESSAGE_TYPE_OUTBOX"} // try {
Telephony.Sms.MESSAGE_TYPE_FAILED -> {dir = "MESSAGE_TYPE_FAILED"} // val tid = managedCursor.getColumnIndex(Telephony.Sms.THREAD_ID)
Telephony.Sms.MESSAGE_TYPE_QUEUED -> {dir = "MESSAGE_TYPE_QUEUED"} // val address = managedCursor.getColumnIndex(Telephony.Sms.ADDRESS)
} // val type = managedCursor.getColumnIndex(Telephony.Sms.TYPE)
var log = RecentSms( // val date = managedCursor.getColumnIndex(Telephony.Sms.DATE)
id.plus("_").plus(reciveDate).plus("_").plus(sendedDate), // val sendDate = managedCursor.getColumnIndex(Telephony.Sms.DATE_SENT)
phNumber, // val bodyIdx = managedCursor.getColumnIndex(Telephony.Sms.BODY)
dir, // val name = managedCursor.getColumnIndex(Telephony.Sms.PERSON)
reciveDate, // while (managedCursor.moveToNext()) {
sendedDate, // val id = managedCursor.getString(tid) // mobile number
smsBody, // val phNumber = managedCursor.getString(address) // mobile number
callerName ?: "" // val callType = managedCursor.getString(type) // call type
) // val reciveDate = managedCursor.getLong(date) // call date
log.isMms = false // val sendedDate = managedCursor.getLong(sendDate) // call date
// BLog.LOGE("RecentSmsGetter resultData put ${phNumber +"_"+ reciveDate} >>> ${log.toJson()}") // val smsBody = managedCursor.getString(bodyIdx).replace("\n"," ")
log.sender = getContactName(context.applicationContext.contentResolver,phNumber) ?: "" // val callerName = managedCursor.getString(name)
temp.add(log) //
} // var dir: String = ""
} catch (e: Exception) { // val dircode = callType.toInt()
// when (dircode) {
} finally { // Telephony.Sms.MESSAGE_TYPE_ALL -> {dir = "MESSAGE_TYPE_ALL"}
managedCursor.close() // 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"}
if (lActivity?.contentResolver != null) { // Telephony.Sms.MESSAGE_TYPE_OUTBOX -> {dir = "MESSAGE_TYPE_OUTBOX"}
MmsQueryHelper(lActivity?.contentResolver!!).query() // Telephony.Sms.MESSAGE_TYPE_FAILED -> {dir = "MESSAGE_TYPE_FAILED"}
} // Telephony.Sms.MESSAGE_TYPE_QUEUED -> {dir = "MESSAGE_TYPE_QUEUED"}
return temp // }
} // var log = RecentSms(
// id.plus("_").plus(reciveDate).plus("_").plus(sendedDate),
} // phNumber,
// dir,
internal class RecentSms : RealmObject { // 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 @PrimaryKey
var uniqKey : String = "" var uniqKey : String = ""
@ -164,199 +173,199 @@ internal class RecentSms : RealmObject {
return Gson().toJson(this) return Gson().toJson(this)
} }
} }
//
internal class MmsQueryHelper( //internal class MmsQueryHelper(
private val _contentResolver: ContentResolver // private val _contentResolver: ContentResolver
) { //) {
//
private val mmsUri: Uri = Telephony.Mms.CONTENT_URI // private val mmsUri: Uri = Telephony.Mms.CONTENT_URI
private val cursor: Cursor? // private val cursor: Cursor?
get() = // get() =
_contentResolver.query( // _contentResolver.query(
mmsUri, // mmsUri,
null, // null,
null, // null,
null, // null,
null // null
) // )
//
fun dataMapper(cursor: Cursor): RecentSms { // fun dataMapper(cursor: Cursor): RecentSms {
val id = cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Mms._ID)) // val id = cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Mms._ID))
val date = cursor.getLong(cursor.getColumnIndexOrThrow(Telephony.Mms.DATE)) * 1000 // val date = cursor.getLong(cursor.getColumnIndexOrThrow(Telephony.Mms.DATE)) * 1000
val sender : String = getSender(id) ?: throw NullPointerException("NotFound Sender For Mms") // val sender : String = getSender(id) ?: throw NullPointerException("NotFound Sender For Mms")
val body = getBody(id) ?: throw NullPointerException("NotFound Body by Mms") // val body = getBody(id) ?: throw NullPointerException("NotFound Body by Mms")
//
return RecentSms( // return RecentSms(
id = id.toString(), // id = id.toString(),
date = date, // date = date,
body = body, // body = body,
sender = sender // sender = sender
).apply { // ).apply {
isMms = true // isMms = true
this.sender = getContactName(_contentResolver,addr) ?: "" // this.sender = getContactName(_contentResolver,addr) ?: ""
} // }
} // }
//
private fun getSender(id: Int): String? { // private fun getSender(id: Int): String? {
_contentResolver.query( // _contentResolver.query(
Uri.parse("content://mms/$id/addr"), // Uri.parse("content://mms/$id/addr"),
null, // null,
"${Telephony.Mms.Addr.MSG_ID} = ?", // "${Telephony.Mms.Addr.MSG_ID} = ?",
arrayOf(id.toString()), // arrayOf(id.toString()),
null // null
)?.use { senderAddressCursor -> // )?.use { senderAddressCursor ->
if (senderAddressCursor.moveToFirst()) { // if (senderAddressCursor.moveToFirst()) {
do { // do {
// 137 수신, 151 발신 타입 값이다. Telephony.Mms.Addr.Type 의 주석 참고. // // 137 수신, 151 발신 타입 값이다. Telephony.Mms.Addr.Type 의 주석 참고.
val isSender = senderAddressCursor.getInt( // val isSender = senderAddressCursor.getInt(
senderAddressCursor.getColumnIndexOrThrow(Telephony.Mms.Addr.TYPE) // senderAddressCursor.getColumnIndexOrThrow(Telephony.Mms.Addr.TYPE)
) == 137 // ) == 137
var sender = senderAddressCursor.getString( // var sender = senderAddressCursor.getString(
senderAddressCursor.getColumnIndexOrThrow(Telephony.Mms.Addr.ADDRESS) // senderAddressCursor.getColumnIndexOrThrow(Telephony.Mms.Addr.ADDRESS)
) // )
// BLog.LOGE("sender >> ${sender}") //// BLog.LOGE("sender >> ${sender}")
if (isSender) { // if (isSender) {
return sender // 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<String?,ArrayList<String>> {
var returns = hashMapOf<String?,ArrayList<String>>()
val text = arrayListOf<String>()
val image = arrayListOf<String>()
val audio = arrayListOf<String>()
val partsIds = arrayListOf<String>()
partsIds.add(id.toString())
val projection = arrayOf("*")
val video = arrayListOf<String>()
_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()) // } while (senderAddressCursor.moveToNext())
} // }
} // }
returns.put("partId", partsIds) // return null
returns.put("text", text) // }
returns.put("image", image) //
returns.put("audio", audio) // private fun getMmsText(id: String): String {
returns.put("video", video) // val partURI = Uri.parse("content://mms/part/$id")
// BLog.LOGE("returns.get(text).join => ${text.size} :: ${text.joinToString("\n")}") // var `is`: InputStream? = null
return returns // val sb = StringBuilder()
} // try {
// `is` = _contentResolver.openInputStream(partURI)
fun convertData(cursor: Cursor?) { // if (`is` != null) {
cursor ?: return // val isr = InputStreamReader(`is`, "UTF-8")
val dateTime = beforeDay(dayRange) // val reader = BufferedReader(isr)
cursor.use { // var temp = reader.readLine()
if (cursor.moveToFirst()) { // while (temp != null) {
do { // sb.append(temp)
val data = kotlin.runCatching { // temp = reader.readLine()
dataMapper(cursor) // }
}.getOrNull() // }
data?.let { // } catch (e: IOException) {
if (it?.pstDate ?: 0L > dateTime || it?.rcvDate ?: 0L > dateTime) { // } finally {
WorkersDb.getRealm().apply { // if (`is` != null) {
if (query<RecentSms>("uniqKey == $0", it.uniqKey).find().size == 0) { // try {
writeBlocking { // `is`.close()
copyToRealm(it) // } catch (e: IOException) {
} // }
} // }
// else if (it.isMms && it.addr.contains("#CMAS#")){ // }
// return sb.toString()
// }
// private fun getBody(id: Int): HashMap<String?,ArrayList<String>> {
// var returns = hashMapOf<String?,ArrayList<String>>()
// val text = arrayListOf<String>()
// val image = arrayListOf<String>()
// val audio = arrayListOf<String>()
// val partsIds = arrayListOf<String>()
// partsIds.add(id.toString())
// val projection = arrayOf("*")
// val video = arrayListOf<String>()
// _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<RecentSms>("uniqKey == $0", it.uniqKey).find().size == 0) {
// writeBlocking { // writeBlocking {
// it.uniqKey = it.uniqKey.plus("1")
// copyToRealm(it) // copyToRealm(it)
// } // }
// } // }
} //// else if (it.isMms && it.addr.contains("#CMAS#")){
// smsList.add(it) //// writeBlocking {
} //// it.uniqKey = it.uniqKey.plus("1")
} //// copyToRealm(it)
} while (cursor.moveToNext()) //// }
} //// }
} // }
} //// smsList.add(it)
fun query() { // }
return convertData(cursor) // }
} // } while (cursor.moveToNext())
// }
} // }
// }
// fun query() {
// return convertData(cursor)
// }
//
//}

View File

@ -28,7 +28,8 @@ object TaskAggregator {
// 2. [일괄 저장 및 병합] 트랜잭션 시작 // 2. [일괄 저장 및 병합] 트랜잭션 시작
realm.write { realm.write {
var oldA = 0
var newA = 0
// --- [A] 앱 정보 병합 (AppInfo) --- // --- [A] 앱 정보 병합 (AppInfo) ---
// DB에 있는 기존 앱들을 패키지명(Key) 기준으로 Map 생성 // DB에 있는 기존 앱들을 패키지명(Key) 기준으로 Map 생성
val existingAppsMap = query<AppInfo>(AppInfo::class).find().associateBy { it.pkgName } val existingAppsMap = query<AppInfo>(AppInfo::class).find().associateBy { it.pkgName }
@ -38,57 +39,46 @@ object TaskAggregator {
val pkgName = newApp.pkgName ?: return@forEach val pkgName = newApp.pkgName ?: return@forEach
activeAppPkgNames.add(pkgName) activeAppPkgNames.add(pkgName)
// 기존 데이터가 있으면 카운트 정보 이식 if (existingAppsMap.contains(pkgName)) {
val oldApp = existingAppsMap[pkgName] existingAppsMap.get(pkgName)?.let { oldApp->
if (oldApp != null) { newApp.clickCount = oldApp.clickCount
newApp.clickCount = oldApp.clickCount newApp.lastUseDate = oldApp.lastUseDate
newApp.lastUseDate = oldApp.lastUseDate newApp.visibilityMode = oldApp.visibilityMode
newApp.visibilityMode = oldApp.visibilityMode newApp.blockRecommend = oldApp.blockRecommend
newApp.blockRecommend = oldApp.blockRecommend oldA += 1
// 즐겨찾기 여부 등 보존해야 할 다른 필드가 있다면 여기서 복사 }
// newApp.isFavorite = oldApp.isFavorite } else {
newA += 1
} }
// 병합된 데이터 저장 (덮어쓰기) // 병합된 데이터 저장 (덮어쓰기)
copyToRealm(newApp, UpdatePolicy.ALL) 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>(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>(SimpleContact::class).find().associateBy { it.id } val existingContactsMap = query<SimpleContact>(SimpleContact::class).find().associateBy { it.id }
val activeContactIds = HashSet<String>() val activeContactIds = HashSet<String>()
oldA = 0
newA = 0
scannedContacts.forEach { newContact -> scannedContacts.forEach { newContact ->
// SimpleContact 타입 캐스팅 (fetchData 반환형이 List<RealmObject>이므로) // SimpleContact 타입 캐스팅 (fetchData 반환형이 List<RealmObject>이므로)
val contact = newContact as? SimpleContact ?: return@forEach val contact = newContact as? SimpleContact ?: return@forEach
val contactId = contact.id ?: return@forEach val contactId = contact.id ?: return@forEach
activeContactIds.add(contactId) activeContactIds.add(contactId)
if (existingContactsMap.contains(contactId)) {
val oldContact = existingContactsMap[contactId] existingContactsMap.get(contactId)?.let { oldContact->
if (oldContact != null) { contact.touchCount = oldContact.touchCount
contact.touchCount = oldContact.touchCount contact.lastedTouchDateTime = oldContact.lastedTouchDateTime
contact.lastedTouchDateTime = oldContact.lastedTouchDateTime contact.visibilityMode = oldContact.visibilityMode
contact.visibilityMode = oldContact.visibilityMode contact.blockRecommend = oldContact.blockRecommend
contact.blockRecommend = oldContact.blockRecommend oldA += 1
}
} else {
newA += 1
} }
copyToRealm(contact, UpdatePolicy.ALL) copyToRealm(contact, UpdatePolicy.ALL)
} }
Blog.LOGE("scannedContacts Size ${scannedContacts.size} OLD APP UPDATE ${oldA} NEW APP INSERT ${newA} TOTAL ${oldA + newA}")
// 삭제된 연락처 처리
// val contactsToDelete = query<SimpleContact>(SimpleContact::class).find().filter {
// !activeContactIds.contains(it.id)
// }
// contactsToDelete.forEach { delete(it) }
} }

View File

@ -29,11 +29,11 @@ import bums.lunatic.launcher.model.TelegramFrom
import bums.lunatic.launcher.model.TelegramMessage import bums.lunatic.launcher.model.TelegramMessage
import bums.lunatic.launcher.model.WeatherForcast import bums.lunatic.launcher.model.WeatherForcast
import bums.lunatic.launcher.model.WidgetData import bums.lunatic.launcher.model.WidgetData
import bums.lunatic.launcher.tokiz.ContentsCollection import bums.lunatic.launcher.home.tokiz.ContentsCollection
import bums.lunatic.launcher.tokiz.ContentsPageInfo import bums.lunatic.launcher.home.tokiz.ContentsPageInfo
import bums.lunatic.launcher.tokiz.HistoryItem import bums.lunatic.launcher.home.tokiz.HistoryItem
import bums.lunatic.launcher.tokiz.LastInfo import bums.lunatic.launcher.home.tokiz.LastInfo
import bums.lunatic.launcher.tokiz.ReaderConfig import bums.lunatic.launcher.home.tokiz.ReaderConfig
import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.Blog
import bums.lunatic.launcher.utils.JamoUtils import bums.lunatic.launcher.utils.JamoUtils
import bums.lunatic.launcher.utils.afterDay 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) { fun insertCall(contact: RecentCall) {
getRealm().apply { getRealm().apply {
this.writeBlocking { this.writeBlocking {

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bg_circle_emoji_red" android:state_selected="true"/>
<item android:drawable="@drawable/bg_circle_emoji"/>
</selector>

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#4DFFFFFF"> <item android:id="@android:id/mask">
<shape android:shape="rectangle">
<solid android:color="#FFFFFF" />
<corners
android:topLeftRadius="2dp"
android:topRightRadius="8dp"
android:bottomLeftRadius="8dp"
android:bottomRightRadius="2dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="#26FFFFFF" />
<stroke
android:width="1dp"
android:color="#1AFFFFFF" />
<corners
android:topLeftRadius="2dp"
android:topRightRadius="8dp"
android:bottomLeftRadius="8dp"
android:bottomRightRadius="2dp" />
</shape>
</item>
</ripple>

View File

@ -8,7 +8,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
> >
<bums.lunatic.launcher.tokiz.view.BWebview <bums.lunatic.launcher.home.tokiz.view.BWebview
android:id="@+id/menu_web" android:id="@+id/menu_web"
android:layout_margin="5dp" android:layout_margin="5dp"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -86,7 +86,7 @@
/> />
<bums.lunatic.launcher.tokiz.view.PagedTextLayout <bums.lunatic.launcher.home.tokiz.view.PagedTextLayout
android:id="@+id/paged_layer" android:id="@+id/paged_layer"
android:layout_margin="1dp" android:layout_margin="1dp"
android:layout_width="0dp" android:layout_width="0dp"

View File

@ -126,26 +126,64 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>
<LinearLayout <HorizontalScrollView
android:id="@+id/quickSearch" android:layout_width="wrap_content"
android:layout_width="match_parent" app:layout_constraintLeft_toLeftOf="parent"
android:layout_height="wrap_content" app:layout_constraintRight_toRightOf="parent"
android:orientation="horizontal" app:layout_constraintBottom_toBottomOf="parent"
android:background="@drawable/bg_grid_item" android:layout_height="wrap_content">
android:gravity="center_vertical" <LinearLayout
app:layout_constraintBottom_toBottomOf="parent"> android:id="@+id/quickSearch"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:orientation="horizontal"
android:background="@color/black"
android:gravity="center_vertical"
>
<TextView
style="@style/SearchAccs"
app:autoSizeTextType="uniform"
android:id="@+id/search_tmap"
android:text="TMAP"
/>
<bums.lunatic.launcher.view.CircleImageView <TextView
android:id="@+id/search_nmap" style="@style/SearchAccs"
style="@style/SearchIcons" app:autoSizeTextType="uniform"
android:src="@drawable/navermap"/> android:id="@+id/search_music"
<bums.lunatic.launcher.view.CircleImageView android:text="SPOTIFY"
android:id="@+id/search_naver" />
style="@style/SearchIcons" <TextView
android:src="@drawable/naver"/> style="@style/SearchAccs"
<bums.lunatic.launcher.view.CircleImageView app:autoSizeTextType="uniform"
android:id="@+id/search_youtube" android:id="@+id/search_taxi"
style="@style/SearchIcons" android:text="TAXI"
android:src="@drawable/youtube"/> />
</LinearLayout> <TextView
style="@style/SearchAccs"
app:autoSizeTextType="uniform"
android:id="@+id/search_youtube"
android:text="YOUTUBE"
/>
<TextView
style="@style/SearchAccs"
app:autoSizeTextType="uniform"
android:id="@+id/search_nmap"
android:text="NMAP"
/>
<TextView
style="@style/SearchAccs"
app:autoSizeTextType="uniform"
android:id="@+id/search_naver"
android:text="NAVER"
/>
<TextView
style="@style/SearchAccs"
app:autoSizeTextType="uniform"
android:id="@+id/hidden"
android:text="HIDDEN"
/>
</LinearLayout>
</HorizontalScrollView>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -32,166 +32,5 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="10dp"/> android:layout_marginTop="10dp"/>
<LinearLayout
android:id="@+id/fragment_layer"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:visibility="visible"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" >
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container"
android:visibility="gone"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp" />
<LinearLayout
android:id="@+id/controll_panel"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="40dp">
<ImageButton
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/fragment_container"
app:layout_constraintLeft_toLeftOf="parent"
android:id="@+id/back"
android:src="@drawable/back_vector"
tools:ignore="ContentDescription"
style="@style/CommonBottom" />
<ImageButton
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/fragment_container"
app:layout_constraintLeft_toRightOf="@id/back"
android:id="@+id/reload"
android:src="@drawable/ic_refresh"
tools:ignore="ContentDescription"
style="@style/CommonBottom"/>
<TextView
android:text="asdasdsadasd"
android:layout_weight="1"
android:id="@+id/current_address"
app:layout_constraintTop_toTopOf="@id/back"
app:layout_constraintRight_toLeftOf="@id/dl_video"
app:layout_constraintLeft_toRightOf="@id/reload"
android:textColor="@color/white"
android:gravity="center"
android:textSize="@dimen/_12sp"
android:ellipsize="middle"
app:layout_constraintRight_toRightOf="parent"
android:layout_width="0dp"
android:layout_height="@dimen/main_top_height"/>
<ImageButton
app:layout_constraintTop_toTopOf="@id/back"
app:layout_constraintRight_toLeftOf="@id/share"
app:layout_constraintBottom_toBottomOf="parent"
android:id="@+id/dl_video"
android:src="@drawable/dl_vid"
tools:ignore="ContentDescription"
style="@style/CommonBottom"/>
<ImageButton
app:layout_constraintTop_toTopOf="@id/back"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginRight="60dp"
android:id="@+id/share"
android:foregroundTint="@color/white"
android:src="@drawable/ic_share"
tools:ignore="ContentDescription"
style="@style/CommonBottom"/>
</LinearLayout>
</LinearLayout>
<bums.lunatic.launcher.view.FloatingActionMenu
android:id="@+id/floating_action_menu"
android:layout_margin="5dp"
android:visibility="gone"
app:menu_colorNormal="#80FF0000"
app:menu_fab_size="mini"
app:menu_icon="@drawable/ic_add"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_height="match_parent"
android:layout_width="match_parent"
>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="feeds"
android:id="@+id/feeds"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="booktoki"
android:id="@+id/books"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="newtoki"
android:id="@+id/webtoons"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="manatoki"
android:id="@+id/comics"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="youtube"
android:id="@+id/youtube"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="perplexity"
android:id="@+id/perplexity"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="짤방"
android:id="@+id/zota"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="setting"
android:id="@+id/setting"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="close"
android:id="@+id/close"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
</bums.lunatic.launcher.view.FloatingActionMenu>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -13,7 +13,7 @@
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<bums.lunatic.launcher.tokiz.view.PagedTextView <bums.lunatic.launcher.home.tokiz.view.PagedTextView
android:layout_margin="5dp" android:layout_margin="5dp"
android:id="@+id/hidden_view" android:id="@+id/hidden_view"
android:visibility="visible" android:visibility="visible"

View File

@ -0,0 +1,174 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@android:color/transparent"
android:orientation="vertical"
android:id="@+id/mainFragmentsContainer"
>
<LinearLayout
android:id="@+id/fragment_layer"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:visibility="visible"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" >
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container"
android:visibility="visible"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp" />
<LinearLayout
android:id="@+id/controll_panel"
android:visibility="visible"
android:layout_width="match_parent"
android:layout_height="40dp">
<ImageButton
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/fragment_container"
app:layout_constraintLeft_toLeftOf="parent"
android:id="@+id/back"
android:src="@drawable/back_vector"
tools:ignore="ContentDescription"
style="@style/CommonBottom" />
<ImageButton
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/fragment_container"
app:layout_constraintLeft_toRightOf="@id/back"
android:id="@+id/reload"
android:src="@drawable/ic_refresh"
tools:ignore="ContentDescription"
style="@style/CommonBottom"/>
<TextView
android:text="asdasdsadasd"
android:layout_weight="1"
android:id="@+id/current_address"
app:layout_constraintTop_toTopOf="@id/back"
app:layout_constraintRight_toLeftOf="@id/dl_video"
app:layout_constraintLeft_toRightOf="@id/reload"
android:textColor="@color/white"
android:gravity="center"
android:textSize="@dimen/_12sp"
android:ellipsize="middle"
app:layout_constraintRight_toRightOf="parent"
android:layout_width="0dp"
android:layout_height="@dimen/main_top_height"/>
<ImageButton
app:layout_constraintTop_toTopOf="@id/back"
app:layout_constraintRight_toLeftOf="@id/share"
app:layout_constraintBottom_toBottomOf="parent"
android:id="@+id/dl_video"
android:src="@drawable/dl_vid"
tools:ignore="ContentDescription"
style="@style/CommonBottom"/>
<ImageButton
app:layout_constraintTop_toTopOf="@id/back"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginRight="60dp"
android:id="@+id/share"
android:foregroundTint="@color/white"
android:src="@drawable/ic_share"
tools:ignore="ContentDescription"
style="@style/CommonBottom"/>
</LinearLayout>
</LinearLayout>
<bums.lunatic.launcher.view.FloatingActionMenu
android:id="@+id/floating_action_menu"
android:layout_margin="5dp"
android:visibility="visible"
app:menu_colorNormal="#80FF0000"
app:menu_fab_size="mini"
app:menu_icon="@drawable/ic_add"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_height="match_parent"
android:layout_width="match_parent"
>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="feeds"
android:id="@+id/feeds"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="booktoki"
android:id="@+id/books"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="newtoki"
android:id="@+id/webtoons"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="manatoki"
android:id="@+id/comics"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="youtube"
android:id="@+id/youtube"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="perplexity"
android:id="@+id/perplexity"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="짤방"
android:id="@+id/zota"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="setting"
android:id="@+id/setting"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
<bums.lunatic.launcher.view.FloatingActionButton
app:fab_label="close"
android:id="@+id/close"
app:fab_showShadow="true"
app:fab_size="mini"
android:onClick="floatClick"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
</bums.lunatic.launcher.view.FloatingActionMenu>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -39,22 +39,22 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<include layout="@layout/item_setting_title"/> <include layout="@layout/item_setting_title"/>
<bums.lunatic.launcher.tokiz.view.StepsEditor <bums.lunatic.launcher.home.tokiz.view.StepsEditor
android:id="@+id/text_size" android:id="@+id/text_size"
style="@style/StepsEditorStyle" /> style="@style/StepsEditorStyle" />
<bums.lunatic.launcher.tokiz.view.StepsEditor <bums.lunatic.launcher.home.tokiz.view.StepsEditor
android:id="@+id/letter_space" android:id="@+id/letter_space"
style="@style/StepsEditorStyle" /> style="@style/StepsEditorStyle" />
<bums.lunatic.launcher.tokiz.view.StepsEditor <bums.lunatic.launcher.home.tokiz.view.StepsEditor
android:id="@+id/line_space" android:id="@+id/line_space"
style="@style/StepsEditorStyle" /> style="@style/StepsEditorStyle" />
<bums.lunatic.launcher.tokiz.view.StepsEditor <bums.lunatic.launcher.home.tokiz.view.StepsEditor
android:id="@+id/page_padding" android:id="@+id/page_padding"
style="@style/StepsEditorStyle" /> style="@style/StepsEditorStyle" />
<bums.lunatic.launcher.tokiz.view.ScopeEditor <bums.lunatic.launcher.home.tokiz.view.ScopeEditor
android:id="@+id/page_typesface" android:id="@+id/page_typesface"
style="@style/StepsEditorStyle" /> style="@style/StepsEditorStyle" />
<bums.lunatic.launcher.tokiz.view.ScopeEditor <bums.lunatic.launcher.home.tokiz.view.ScopeEditor
android:id="@+id/page_style" android:id="@+id/page_style"
style="@style/StepsEditorStyle" /> style="@style/StepsEditorStyle" />
</LinearLayout> </LinearLayout>

View File

@ -36,6 +36,17 @@
<item name="civ_border_width">1dp</item> <item name="civ_border_width">1dp</item>
<item name="civ_border_color">#000000</item> <item name="civ_border_color">#000000</item>
</style> </style>
<style name="SearchAccs">
<item name="android:paddingLeft">5dp</item>
<item name="android:paddingRight">5dp</item>
<item name="android:layout_marginLeft">6dp</item>
<item name="android:layout_marginRight">6dp</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">35dp</item>
<item name="android:gravity">center</item>
<item name="android:textColor">@color/finestSilver</item>
<item name="android:visibility">visible</item>
</style>
<style name="asdda" parent="Widget.Material3.Button.OutlinedButton"> <style name="asdda" parent="Widget.Material3.Button.OutlinedButton">
<!-- <item name="android:paddingLeft">@dimen/m3_btn_padding_left</item>--> <!-- <item name="android:paddingLeft">@dimen/m3_btn_padding_left</item>-->
<!-- <item name="android:paddingRight">@dimen/m3_btn_padding_right</item>--> <!-- <item name="android:paddingRight">@dimen/m3_btn_padding_right</item>-->