...
This commit is contained in:
parent
f21f96f8a3
commit
6e7e9685ab
@ -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"
|
||||||
|
|||||||
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
|||||||
@ -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}")
|
||||||
|
|
||||||
|
|||||||
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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>) {
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
654
app/src/main/kotlin/bums/lunatic/launcher/home/NeoRssActivity.kt
Normal file
654
app/src/main/kotlin/bums/lunatic/launcher/home/NeoRssActivity.kt
Normal 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())
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -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))
|
||||||
|
|||||||
@ -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
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|||||||
@ -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 ""
|
||||||
}
|
//}
|
||||||
|
|||||||
@ -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]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
//}
|
||||||
|
|||||||
@ -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
|
||||||
|
//}
|
||||||
@ -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
|
||||||
}
|
//}
|
||||||
@ -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)
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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
|
||||||
@ -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
|
||||||
@ -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}")
|
||||||
|
|
||||||
@ -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
|
||||||
@ -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
|
||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
//}
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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])
|
||||||
|
|||||||
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
//}
|
||||||
@ -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)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
||||||
@ -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) }
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
5
app/src/main/res/drawable/bg_circle.xml
Normal file
5
app/src/main/res/drawable/bg_circle.xml
Normal 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>
|
||||||
28
app/src/main/res/drawable/bg_key_accs.xml
Normal file
28
app/src/main/res/drawable/bg_key_accs.xml
Normal 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>
|
||||||
@ -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"
|
||||||
|
|||||||
@ -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>
|
||||||
@ -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>
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
174
app/src/main/res/layout/rss_activity.xml
Normal file
174
app/src/main/res/layout/rss_activity.xml
Normal 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>
|
||||||
@ -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>
|
||||||
|
|||||||
@ -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>-->
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user