This commit is contained in:
lunaticbum 2024-09-09 18:00:09 +09:00
parent a4f0cecfa4
commit e250a06d39
13 changed files with 432 additions and 157 deletions

View File

@ -97,6 +97,7 @@ import rasel.lunar.launcher.utils.RssList.jGuruMain
import rasel.lunar.launcher.utils.beforeDay import rasel.lunar.launcher.utils.beforeDay
import rasel.lunar.launcher.utils.make0H import rasel.lunar.launcher.utils.make0H
import rasel.lunar.launcher.workers.ArcaGetter import rasel.lunar.launcher.workers.ArcaGetter
import rasel.lunar.launcher.workers.ClienGetter
import rasel.lunar.launcher.workers.DCGetter import rasel.lunar.launcher.workers.DCGetter
import rasel.lunar.launcher.workers.DotaxGetter import rasel.lunar.launcher.workers.DotaxGetter
import rasel.lunar.launcher.workers.FmKoreaGetter import rasel.lunar.launcher.workers.FmKoreaGetter
@ -104,6 +105,8 @@ import rasel.lunar.launcher.workers.NewsFeedsGetter
import rasel.lunar.launcher.workers.RecentCallGetter import rasel.lunar.launcher.workers.RecentCallGetter
import rasel.lunar.launcher.workers.RecentSmsGetter import rasel.lunar.launcher.workers.RecentSmsGetter
import rasel.lunar.launcher.workers.RedditGetter import rasel.lunar.launcher.workers.RedditGetter
import rasel.lunar.launcher.workers.RuliWebGetter
import rasel.lunar.launcher.workers.TheQooGetter
import rasel.lunar.launcher.workers.WorkersDb import rasel.lunar.launcher.workers.WorkersDb
import rasel.lunar.launcher.workers.YoutubeGetter import rasel.lunar.launcher.workers.YoutubeGetter
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -214,6 +217,17 @@ internal class LauncherActivity : AppCompatActivity() {
}, 2, TimeUnit.SECONDS) }, 2, TimeUnit.SECONDS)
} }
fun refreshComics3() { fun refreshComics3() {
Executors.newSingleThreadScheduledExecutor().schedule({
mWorkManager?.cancelAllWorkByTag(ClienGetter.TAG)
mWorkManager?.enqueueUniquePeriodicWork(
ClienGetter.TAG, ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
PeriodicWorkRequestBuilder<ClienGetter>(midTimePeriod, TimeUnit.MINUTES)
.addTag(ClienGetter.TAG)
.build())
refreshArca()
}, 2, TimeUnit.SECONDS)
Executors.newSingleThreadScheduledExecutor().schedule({ Executors.newSingleThreadScheduledExecutor().schedule({
mWorkManager?.cancelAllWorkByTag(DCGetter.TAG) mWorkManager?.cancelAllWorkByTag(DCGetter.TAG)
mWorkManager?.enqueueUniquePeriodicWork( mWorkManager?.enqueueUniquePeriodicWork(
@ -223,6 +237,28 @@ internal class LauncherActivity : AppCompatActivity() {
.build()) .build())
refreshArca() refreshArca()
}, 2, TimeUnit.SECONDS) }, 2, TimeUnit.SECONDS)
Executors.newSingleThreadScheduledExecutor().schedule({
mWorkManager?.cancelAllWorkByTag(RuliWebGetter.TAG)
mWorkManager?.enqueueUniquePeriodicWork(
RuliWebGetter.TAG, ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
PeriodicWorkRequestBuilder<RuliWebGetter>(midTimePeriod, TimeUnit.MINUTES)
.addTag(RuliWebGetter.TAG)
.build())
refreshArca()
}, 2, TimeUnit.SECONDS)
Executors.newSingleThreadScheduledExecutor().schedule({
mWorkManager?.cancelAllWorkByTag(TheQooGetter.TAG)
mWorkManager?.enqueueUniquePeriodicWork(
TheQooGetter.TAG, ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
PeriodicWorkRequestBuilder<TheQooGetter>(midTimePeriod, TimeUnit.MINUTES)
.addTag(TheQooGetter.TAG)
.build())
refreshArca()
}, 2, TimeUnit.SECONDS)
} }
fun refreshArca() { fun refreshArca() {

View File

@ -254,7 +254,10 @@ internal class LauncherHome : Fragment() {
mNotificationResult = null mNotificationResult = null
try { try {
System.gc() System.gc()
}catch (e : Exception){e.printStackTrace()} }catch (e : Exception){
e.printStackTrace()
}
mNotificationResult = WorkersDb.getRealm().query<NotificationItem>().sort("postTime",Sort.DESCENDING).find() mNotificationResult = WorkersDb.getRealm().query<NotificationItem>().sort("postTime",Sort.DESCENDING).find()
noticeJob = CoroutineScope(Dispatchers.Default).launch { noticeJob = CoroutineScope(Dispatchers.Default).launch {
mNotificationResult?.asFlow()?.collect { changes: ResultsChange<NotificationItem> -> mNotificationResult?.asFlow()?.collect { changes: ResultsChange<NotificationItem> ->
@ -276,10 +279,10 @@ internal class LauncherHome : Fragment() {
} }
mNotificationResult?.let { mNotiAdapter?.updateData(it) } mNotificationResult?.let { mNotiAdapter?.updateData(it) }
noticeJob.start() noticeJob?.start()
} }
fun queryInfos(filter: Collection<RssDataType>? = arrayListOf(RssDataType.GURU,RssDataType.Most)) { fun queryInfos(filter: Collection<RssDataType>? = arrayListOf(RssDataType.GURU,RssDataType.Most,RssDataType.REDDIT_nsfw)) {
BLog.LOGE("${this} ::::: queryInfos >>>> ${filter}") BLog.LOGE("${this} ::::: queryInfos >>>> ${filter}")
try { infosJob?.cancel() } catch (e:Exception) {e.printStackTrace()} try { infosJob?.cancel() } catch (e:Exception) {e.printStackTrace()}
mRssDataResult = null mRssDataResult = null
@ -291,11 +294,11 @@ internal class LauncherHome : Fragment() {
delete(query<RssData>().query("pubDate < $0",beforeDay(Date(),3)).query("category != $0 || category != $1 ", RssDataType.GURU.name,RssDataType.Most.name).find()) delete(query<RssData>().query("pubDate < $0",beforeDay(Date(),3)).query("category != $0 || category != $1 ", RssDataType.GURU.name,RssDataType.Most.name).find())
}} }}
BLog.LOGE("${this} ::::: queryInfos after delete >>>> ") BLog.LOGE("${this} ::::: queryInfos after delete >>>> ")
var rQ = WorkersDb.getRealm().query<RssData>().sort("pubDate ", Sort.DESCENDING).query("pubDate > $0",beforeDay(Date(),3)) var rQ = WorkersDb.getRealm().query<RssData>().query("pubDate > $0", beforeDay(Date(),3))
filter!!.forEach { filter!!.forEach {
rQ = rQ.query("category != $0", it.name) rQ = rQ.query("category != $0", it.name)
} }
mRssDataResult = rQ.limit(1000).find() mRssDataResult = rQ.sort("pubDate ", Sort.DESCENDING).limit(1000).find()
BLog.LOGE("${this} ::::: queryInfos after query find >>>> ") BLog.LOGE("${this} ::::: queryInfos after query find >>>> ")
infosJob = CoroutineScope(Dispatchers.Default).launch { infosJob = CoroutineScope(Dispatchers.Default).launch {
mRssDataResult?.asFlow()?.collect { changes: ResultsChange<RssData> -> mRssDataResult?.asFlow()?.collect { changes: ResultsChange<RssData> ->
@ -322,11 +325,11 @@ internal class LauncherHome : Fragment() {
// commandHandler.postDelayed(infoUpdate, UPDATE_DELAY * 3) // commandHandler.postDelayed(infoUpdate, UPDATE_DELAY * 3)
mRssAdapter.updateData(it) mRssAdapter.updateData(it)
} }
infosJob.start() infosJob?.start()
} }
lateinit var infosJob : Job var infosJob : Job? = null
lateinit var noticeJob : Job var noticeJob : Job? = null
lateinit var mMissedCallsAdapter : MissedCallsAdapter lateinit var mMissedCallsAdapter : MissedCallsAdapter
lateinit var mSmsLogsAdapter : SmsLogsAdapter lateinit var mSmsLogsAdapter : SmsLogsAdapter
@ -515,8 +518,7 @@ internal class LauncherHome : Fragment() {
binding.otherCheck.isSelected = false binding.otherCheck.isSelected = false
binding.notiList.visibility = View.VISIBLE binding.notiList.visibility = View.VISIBLE
binding.notice.text = "알림 센터[${lastedNoti?.size ?: "-"}]" binding.notice.text = "알림 센터[${lastedNoti?.size ?: "-"}]"
lastedNoti?.let { mNotiAdapter.updateData(it) } lastedNoti?.let { mNotiAdapter.updateData(it)}
} }
} }
commandHandler.postDelayed(hideListView, UPDATE_DELAY * 5) commandHandler.postDelayed(hideListView, UPDATE_DELAY * 5)

View File

@ -0,0 +1,27 @@
package rasel.lunar.launcher.model
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
class Clien : DcInside() {
companion object{
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
}
override fun category(): RssDataType {
return RssDataType.Clien
}
override fun pubDate(): Long {
if (dateTiemL < 1L) {
if (dateTiem?.length ?: 0 < 1) return 0L
return dateFormat.parse(dateTiem!!).time.apply {
dateTiemL = this
}
} else {
return dateTiemL
}
}
}

View File

@ -15,6 +15,7 @@ import java.util.TimeZone
fun Elements.getT() = if (size > 0) get(0).text() else "" fun Elements.getT() = if (size > 0) get(0).text() else ""
fun Elements.getHref() = if (size > 0) get(0).attr("href") else ""
val dateFormat = SimpleDateFormat("hh:mm / yy - MM - dd") val dateFormat = SimpleDateFormat("hh:mm / yy - MM - dd")
class Arca : RssDataInterface { class Arca : RssDataInterface {
var link : String? = null var link : String? = null
@ -108,7 +109,7 @@ class Arca : RssDataInterface {
class DcInside : RssDataInterface { open class DcInside : RssDataInterface {
var link : String? = null var link : String? = null
var title : String? = null var title : String? = null
var thumbnail : String? = null var thumbnail : String? = null
@ -124,7 +125,7 @@ class DcInside : RssDataInterface {
} }
override fun thumbnailUrl(): String { override fun thumbnailUrl(): String {
return thumbnail ?:"" return thumbnail ?: ""
} }
override fun originPage(): String { override fun originPage(): String {
@ -141,7 +142,7 @@ class DcInside : RssDataInterface {
return if (dateTiem?.contains(":") == true) { return if (dateTiem?.contains(":") == true) {
val cal: Calendar = Calendar.getInstance() val cal: Calendar = Calendar.getInstance()
cal.setTime(Date()) cal.setTime(Date())
cal.set(Calendar.HOUR_OF_DAY, dateTiem!!.split(":")[0].toInt()- 1) cal.set(Calendar.HOUR_OF_DAY, dateTiem!!.split(":")[0].toInt())
cal.set(Calendar.MINUTE, dateTiem!!.split(":")[1].toInt()) cal.set(Calendar.MINUTE, dateTiem!!.split(":")[1].toInt())
// cal.set(Calendar.MINUTE, dateTiem!!.split(":")[1].toI nt()) // cal.set(Calendar.MINUTE, dateTiem!!.split(":")[1].toI nt())
dateTiemL = cal.timeInMillis dateTiemL = cal.timeInMillis
@ -151,7 +152,7 @@ class DcInside : RssDataInterface {
cal.setTime(Date()) cal.setTime(Date())
cal.set(Calendar.MONTH, dateTiem!!.split("-")[0].toInt() - 1) cal.set(Calendar.MONTH, dateTiem!!.split("-")[0].toInt() - 1)
cal.set(Calendar.DAY_OF_MONTH, dateTiem!!.split("-")[1].toInt()) cal.set(Calendar.DAY_OF_MONTH, dateTiem!!.split("-")[1].toInt())
cal.add(Calendar.DAY_OF_MONTH, -1) // cal.add(Calendar.DAY_OF_MONTH, -1)
dateTiemL = cal.timeInMillis dateTiemL = cal.timeInMillis
dateTiemL dateTiemL
} else { } else {
@ -168,6 +169,19 @@ class DcInside : RssDataInterface {
} }
class RuliWeb : DcInside() {
override fun category(): RssDataType {
return RssDataType.RuliWeb
}
}
class TheQoo : DcInside() {
override fun category(): RssDataType {
return RssDataType.TheQoo
}
}
class RssData : RealmObject, RssDataInterface { class RssData : RealmObject, RssDataInterface {
@PrimaryKey @PrimaryKey

View File

@ -271,7 +271,9 @@ class Data : RssDataInterface {
} }
override fun category(): RssDataType { override fun category(): RssDataType {
return RssDataType.REDDIT return if (description()?.contains("nsfw") == true) {
RssDataType.REDDIT_nsfw
} else RssDataType.REDDIT
} }
} }

View File

@ -1,5 +1,8 @@
package rasel.lunar.launcher.model package rasel.lunar.launcher.model
import android.view.View
import rasel.lunar.launcher.R
enum class RssDataType { enum class RssDataType {
NO_DATA, NO_DATA,
YOUTUBE, YOUTUBE,
@ -8,10 +11,37 @@ enum class RssDataType {
Most, Most,
TAGS, TAGS,
REDDIT, REDDIT,
REDDIT_nsfw,
Dotax, Dotax,
FmKorae, FmKorae,
DcInside, DcInside,
Arca, RuliWeb,
Clien,
TheQoo,
Arca;
fun getResId() = when (this) {
YOUTUBE -> R.drawable.youtube
REDDIT, REDDIT_nsfw -> R.drawable.reddit
Dotax -> R.drawable.daum
FmKorae -> R.drawable.fmk
DcInside -> R.drawable.dcinside
Arca -> R.drawable.arca
else -> {
0
}
}
fun defaultImgSize() = when (this) {
YOUTUBE -> 200
REDDIT_nsfw,GURU,Most -> 360
else -> { 120 }
}
fun getDefaultVisibiliy() = when (this) {
REDDIT_nsfw,GURU,Most,NewsFeed -> View.GONE
else -> { View.VISIBLE }
}
} }
interface RssDataInterface { interface RssDataInterface {
@ -21,4 +51,6 @@ interface RssDataInterface {
fun description() : String fun description() : String
fun pubDate() : Long fun pubDate() : Long
fun category() : RssDataType fun category() : RssDataType
} }

View File

@ -22,7 +22,6 @@ import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
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
@ -30,6 +29,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.imageview.ShapeableImageView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import rasel.lunar.launcher.LauncherActivity.Companion.lActivity import rasel.lunar.launcher.LauncherActivity.Companion.lActivity
import rasel.lunar.launcher.R import rasel.lunar.launcher.R
@ -53,155 +53,72 @@ internal class RssItemAdapter (
return rssDataItemLis.size return rssDataItemLis.size
} }
val dateFormat = SimpleDateFormat("hh:mm / yy - MM - dd") val dateFormat = SimpleDateFormat("a HH:mm / yy - MM - dd")
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: RssTag, position: Int) { override fun onBindViewHolder(holder: RssTag, position: Int) {
val todo = rssDataItemLis[position] val rssData = rssDataItemLis[position]
Picasso.get().cancelRequest(holder.view.circlePreview)
holder.view.date.text = dateFormat.format(Date(todo.pubDate())) if (rssData.pubDate() > 1000L) {
holder.view.date.setOnClickListener { } holder.view.date.text = dateFormat.format(Date(rssData.pubDate()))
when(todo.category()) { } else {
holder.view.date.text = ""
}
holder.view.title.text = rssData.title()
when(rssData.category()) {
RssDataType.YOUTUBE -> { RssDataType.YOUTUBE -> {
if(todo.thumbnailUrl()?.length ?: 0 > 6) { holder.view.desc.text = if(rssData.description().contains("게시자")) rssData.description().split("게시자")[0] else rssData.description()
Picasso.get().load(todo.thumbnailUrl().toUri()).into(holder.view.circlePreview)
holder.view.circlePreview.visibility = View.VISIBLE
}
var param = holder.view.circlePreview.layoutParams
holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(280,param.height)
holder.view.title.text = "${todo.title()}"
holder.view.title.gravity = Gravity.CENTER_VERTICAL.plus(Gravity.RIGHT)
holder.view.desc.gravity = Gravity.CENTER_VERTICAL.plus(Gravity.RIGHT)
holder.view.date.gravity = Gravity.CENTER_VERTICAL.plus(Gravity.RIGHT)
holder.view.desc.visibility = View.VISIBLE
holder.view.desc.text = if(todo.description().contains("게시자")) todo.description().split("게시자")[0] else todo.description()
holder.view.root.setOnClickListener {
}
holder.view.root.setOnLongClickListener {
openYouTube(todo.originPage())
true
}
} }
RssDataType.NewsFeed -> { RssDataType.NewsFeed -> {
holder.view.desc.text = todo.category().name holder.view.desc.text = rssData.category().name
holder.view.circlePreview.visibility = View.GONE holder.view.title.text = if(rssData.title().length > 30)rssData.title().substring(0,30).plus("...") else rssData.title()
holder.view.title.text = if(todo.title().length > 30)todo.title().substring(0,30).plus("...") else todo.title()
holder.view.title.gravity = Gravity.CENTER_VERTICAL.plus(Gravity.RIGHT)
holder.view.desc.gravity = Gravity.CENTER_VERTICAL.plus(Gravity.RIGHT)
holder.view.date.gravity = Gravity.CENTER_VERTICAL.plus(Gravity.RIGHT)
holder.view.root.setOnClickListener {
}
holder.view.root.setOnLongClickListener {
openNews(todo.originPage())
true
}
} }
RssDataType.NO_DATA -> {} RssDataType.NO_DATA -> {}
else -> { else -> {
holder.view.title.gravity = Gravity.CENTER_VERTICAL.plus(Gravity.RIGHT) holder.view.desc.text = rssData.description().plus(" ").plus(rssData.category().name)
holder.view.desc.gravity = Gravity.CENTER_VERTICAL.plus(Gravity.RIGHT) }
holder.view.date.gravity = Gravity.CENTER_VERTICAL.plus(Gravity.RIGHT) }
holder.view.title.text = todo.title() var param = holder.view.circlePreview.layoutParams
if (todo.pubDate() > 1000L) { holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(rssData.category().defaultImgSize(), param.height)
holder.view.date.text = dateFormat.format(Date(todo.pubDate())) holder.view.circlePreview.visibility = rssData.category().getDefaultVisibiliy()
if(rssData.thumbnailUrl()?.length ?: 0 > 6) {
Picasso.get().load(rssData.thumbnailUrl().replace("&amp;","&").toUri()).into(holder.view.circlePreview)
} else if (rssData.category().getResId() > 0 ) {
holder.view.circlePreview.setImageResource(rssData.category().getResId())
} else {
holder.view.circlePreview.setImageDrawable(null)
Picasso.get().cancelRequest(holder.view.circlePreview)
}
holder.view.root.tag = position
holder.view.root.setOnClickListener(dateViewClick)
holder.view.root.setOnLongClickListener(mLongClickListener)
} }
if(todo.description().contains("nsfw") || todo.category().equals(RssDataType.GURU) || todo.category().equals(RssDataType.Most)) { val dateViewClick = View.OnClickListener {
holder.view.circlePreview.visibility = View.GONE it.findViewById<ShapeableImageView>(R.id.circle_preview)?.let {
var param = holder.view.circlePreview.layoutParams if (it.visibility == View.GONE) {
holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(360,param.height) it.visibility = View.VISIBLE
} else if( todo.category().equals(RssDataType.Dotax)) { it.postDelayed({
holder.view.circlePreview.setImageResource(R.drawable.daum) it.visibility = View.GONE
holder.view.circlePreview.visibility = View.VISIBLE
var param = holder.view.circlePreview.layoutParams
holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(120,param.height)
} else if( todo.category().equals(RssDataType.REDDIT)) {
holder.view.circlePreview.setImageResource(R.drawable.reddit)
holder.view.circlePreview.visibility = View.VISIBLE
var param = holder.view.circlePreview.layoutParams
holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(120,param.height)
} else if( todo.category().equals(RssDataType.FmKorae) ) {
holder.view.circlePreview.setImageResource(R.drawable.fmk)
holder.view.circlePreview.visibility = View.VISIBLE
var param = holder.view.circlePreview.layoutParams
holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(120,param.height)
} else if(todo.category().equals(RssDataType.DcInside)) {
holder.view.circlePreview.setImageResource(R.drawable.dcinside)
holder.view.circlePreview.visibility = View.VISIBLE
var param = holder.view.circlePreview.layoutParams
holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(120,param.height)
} else if(todo.category().equals(RssDataType.Arca)) {
holder.view.circlePreview.setImageResource(R.drawable.arca)
holder.view.circlePreview.visibility = View.VISIBLE
var param = holder.view.circlePreview.layoutParams
holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(120,param.height)
}
if(todo.thumbnailUrl()?.length ?: 0 > 6) {
Picasso.get().load(todo.thumbnailUrl().toUri()).into(holder.view.circlePreview)
}
holder.view.desc.text = todo.description().plus(" ").plus(todo.category().name)
holder.view.desc.visibility = View.VISIBLE
holder.view.date.setOnClickListener {
if (holder.view.circlePreview.visibility == View.GONE) {
holder.view.circlePreview.visibility = View.VISIBLE
holder.view.circlePreview.postDelayed({
holder.view.circlePreview.visibility = View.GONE
}, 1000L) }, 1000L)
} }
} }
// holder.view.date.setOnTouchListener { v,e -> }
// if (holder.view.date.equals(v)) {
// when(e.action) {
// MotionEvent.ACTION_DOWN -> {holder.view.circlePreview.visibility = View.VISIBLE}
// MotionEvent.ACTION_UP -> {holder.view.circlePreview.visibility = View.GONE}
// MotionEvent.ACTION_UP -> {holder.view.circlePreview.visibility = View.GONE}
// }
// }
// false
// }
holder.view.title.setOnLongClickListener { val mLongClickListener = View.OnLongClickListener { v ->
BLog.LOGE("holder.view.root ${holder.view.root}") (v?.tag as? Int)?.let { idx ->
if ( todo.category().equals(RssDataType.GURU)) { val rss = rssDataItemLis[idx]
openOpera(todo.originPage()) when (rss.category()) {
} else if( todo.category().equals(RssDataType.REDDIT)) { RssDataType.GURU ,RssDataType.Most , RssDataType.TAGS-> { openOpera(rss.originPage()) }
openReddit(todo.originPage()) RssDataType.REDDIT -> { openReddit(rss.originPage()) }
} else if( todo.category().equals(RssDataType.Dotax)) { RssDataType.Dotax -> { openDotax(rss.originPage()) }
openDotax(todo.originPage()) RssDataType.YOUTUBE -> { openYouTube(rss.originPage()) }
}else if(todo.category().equals(RssDataType.FmKorae)|| todo.category().equals( else -> { openNews(rss.originPage()) }
RssDataType.DcInside)|| todo.category().equals(RssDataType.Arca)) { }
openNews(todo.originPage())
} else {
openOpera(todo.originPage())
} }
true true
} }
holder.view.root.setOnLongClickListener {
BLog.LOGE("holder.view.root ${holder.view.root}")
if ( todo.category().equals(RssDataType.GURU)) {
openOpera(todo.originPage())
} else if( todo.category().equals(RssDataType.REDDIT)) {
openReddit(todo.originPage())
} else if( todo.category().equals(RssDataType.Dotax)) {
openDotax(todo.originPage())
}else if(todo.category().equals(RssDataType.FmKorae)|| todo.category().equals(
RssDataType.DcInside)|| todo.category().equals(RssDataType.Arca)) {
openNews(todo.originPage())
} else {
openOpera(todo.originPage())
}
true
}
}
}
}
fun openOpera(schemeString : String) { fun openOpera(schemeString : String) {
BLog.LOGE("openOpera ${schemeString}") BLog.LOGE("openOpera ${schemeString}")
@ -266,7 +183,7 @@ internal class RssItemAdapter (
// return px // return px
//} //}
internal class RssTag(var view: ListItemWithBinding) : RecyclerView.ViewHolder(view.root) internal class RssTag(var view: ListItemWithBinding) : RecyclerView.ViewHolder(view.root) {}
internal class RssItemDiffUtil( internal class RssItemDiffUtil(
var oldList: List<RssDataInterface>, var newList: List<RssDataInterface> var oldList: List<RssDataInterface>, var newList: List<RssDataInterface>
) : DiffUtil.Callback() { ) : DiffUtil.Callback() {

View File

@ -0,0 +1,90 @@
package rasel.lunar.launcher.workers
import android.annotation.SuppressLint
import android.content.Context
import androidx.work.WorkerParameters
import org.jsoup.Jsoup
import rasel.lunar.launcher.model.Clien
import rasel.lunar.launcher.model.TheQoo
import rasel.lunar.launcher.model.getHref
import rasel.lunar.launcher.model.getRssData
import rasel.lunar.launcher.model.getT
import rasel.lunar.launcher.utils.BLog
class ClienGetter : BaseGetter {
companion object {
val TAG = "ClienGetter"
}
constructor(context: Context, workerParams: WorkerParameters) : super(context, workerParams) {
}
fun parseClien(div_clien : org.jsoup.nodes.Element) {
BLog.LOGE("div_clien >>>> ${div_clien}")
BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("subject_fixed").getT()}")
BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("shortname fixed").getT()}")
BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("list_subject").getHref()}")
BLog.LOGE("div_clien >>>> ${div_clien.getElementsByClass("timestamp").getT()}")
val title = div_clien.getElementsByClass("subject_fixed").getT()
val desc = div_clien.getElementsByClass("shortname fixed").getT()
val link = div_clien.getElementsByClass("list_subject").getHref()
val timeStamp = div_clien.getElementsByClass("timestamp").getT()
if (title.length > 0 && timeStamp.length > 0) {
Clien().let { c ->
c.title = title
c.link = "https://www.clien.net".plus(link)
c.desc = desc
c.dateTiem = timeStamp
if (c.pubDate() > limitDateTime) {
temp.add(c.getRssData())
}
}
}
// var desc = tq_tr.getElementsByClass("cate").getT()
// var title = tq_tr.getElementsByClass("title").getT()
// var pageLink = tq_tr.getElementsByTag("a").getHref()
// var dateTime = tq_tr.getElementsByClass("time").getT()
// BLog.LOGE("${TAG} :::: desc >>> $desc")
// BLog.LOGE("${TAG} :::: title >>> $title")
// BLog.LOGE("${TAG} :::: pageLink >>> $pageLink")
// BLog.LOGE("${TAG} :::: dateTime >>> $dateTime")
// if (title.length > 0 && pageLink.length > 0) {
// TheQoo().let { tq ->
// tq.title = title
// tq.link = "https://theqoo.net".plus(pageLink)
// tq.dateTiem = dateTime
// tq.desc = desc
// if (tq.pubDate() > limitDateTime) {
// temp.add(tq.getRssData())
// }
// }
// }
}
@SuppressLint("RestrictedApi")
override fun doWork(): Result {
try {
val testUrl2 = arrayListOf("https://www.clien.net/service/group/community")
testUrl2.forEach { url ->
Jsoup.connect(url)
.userAgent(USAGT)
.get().let { ruli ->
BLog.LOGE("test ${url} >> ${ruli.title()}")
ruli.getElementsByClass("list_item symph_row ").forEach { ruli_tr ->
parseClien(ruli_tr)
}
}
}
} catch (e:Exception){e.printStackTrace()}
return Result.success().apply {
BLog.LOGE("ClienGetter temp >>>> ${temp.size}")
WorkersDb.insertBulkData(temp)
}
}
}

View File

@ -8,6 +8,7 @@ import rasel.lunar.launcher.model.DcInside
import rasel.lunar.launcher.model.RssData import rasel.lunar.launcher.model.RssData
import rasel.lunar.launcher.model.getRssData import rasel.lunar.launcher.model.getRssData
import rasel.lunar.launcher.model.RssDataInterface import rasel.lunar.launcher.model.RssDataInterface
import rasel.lunar.launcher.utils.BLog
class DCGetter : BaseGetter { class DCGetter : BaseGetter {
companion object { companion object {

View File

@ -0,0 +1,82 @@
package rasel.lunar.launcher.workers
import android.annotation.SuppressLint
import android.content.Context
import androidx.work.WorkerParameters
import org.jsoup.Jsoup
import rasel.lunar.launcher.model.DcInside
import rasel.lunar.launcher.model.RssData
import rasel.lunar.launcher.model.getRssData
import rasel.lunar.launcher.model.RssDataInterface
import rasel.lunar.launcher.model.RuliWeb
import rasel.lunar.launcher.utils.BLog
class RuliWebGetter : BaseGetter {
companion object {
val TAG = "RuliWebGetter"
}
constructor(context: Context, workerParams: WorkerParameters) : super(context, workerParams) {
}
fun parseRuli(ruli_tr : org.jsoup.nodes.Element) {
var aTags = ruli_tr.getElementsByTag("a")
var tagIdx = 0
var pageLink = ""
var thumbnailUrl = ""
var title = ""
var desc = ""
var dateTimeTxt = ""
if(ruli_tr.getElementsByTag("a").size > tagIdx) {
pageLink = aTags.get(tagIdx).attr("href").replace("&amp;","&")
thumbnailUrl = aTags.get(tagIdx).attr("style").split("(")[1].replace(");","")
}
tagIdx = 1
if(ruli_tr.getElementsByTag("a").size > tagIdx) { title = aTags.get(tagIdx).text() }
tagIdx = 2
if(ruli_tr.getElementsByTag("a").size > tagIdx) { desc = aTags.get(tagIdx).text().plus(" / ") }
tagIdx = 3
if(ruli_tr.getElementsByTag("a").size > tagIdx) { desc = desc.plus(aTags.get(tagIdx).text()) }
var timeClass = ruli_tr.getElementsByClass("time")
if(timeClass.size > 0) { dateTimeTxt = timeClass.get(0).text() }
// BLog.LOGE("pageLink >>>> $pageLink ")
// BLog.LOGE("thumbnailUrl >>>> $thumbnailUrl ")
// BLog.LOGE("title >>>> $title ")
// BLog.LOGE("desc >>>> $desc ")
// BLog.LOGE("dateTimeTxt >>>> $dateTimeTxt ")
if (title.length > 0 && pageLink.length > 0) {
RuliWeb().let { ru ->
ru.title = title
ru.link = pageLink
ru.desc = desc
ru.thumbnail = thumbnailUrl
ru.dateTiem = dateTimeTxt.replace("날짜","").trim()
if (ru.pubDate() > limitDateTime) {
temp.add(ru.getRssData())
}
}
}
}
@SuppressLint("RestrictedApi")
override fun doWork(): Result {
try {
val testUrl2 = arrayListOf("https://bbs.ruliweb.com/best/humor_only","https://bbs.ruliweb.com/best/humor_only/now?m=humor_only&t=default&page=2")
testUrl2.forEach { url ->
Jsoup.connect(url)
.userAgent(USAGT)
.get().let { ruli ->
BLog.LOGE("test ${testUrl2} >> ${ruli.title()}")
ruli.getElementsByTag("tr").forEach { ruli_tr ->
parseRuli(ruli_tr)
}
}
}
} catch (e:Exception){e.printStackTrace()}
return Result.success().apply {
// BLog.LOGE("Ruli temp >>>> ${temp.size}")
WorkersDb.insertBulkData(temp)
}
}
}

View File

@ -0,0 +1,68 @@
package rasel.lunar.launcher.workers
import android.annotation.SuppressLint
import android.content.Context
import androidx.work.WorkerParameters
import org.jsoup.Jsoup
import rasel.lunar.launcher.model.TheQoo
import rasel.lunar.launcher.model.getHref
import rasel.lunar.launcher.model.getRssData
import rasel.lunar.launcher.model.getT
import rasel.lunar.launcher.utils.BLog
class TheQooGetter : BaseGetter {
companion object {
val TAG = "TheQooGetter"
}
constructor(context: Context, workerParams: WorkerParameters) : super(context, workerParams) {
}
fun parseTQoo(tq_tr : org.jsoup.nodes.Element) {
// BLog.LOGE("tq_tr >>>> ${tq_tr}")
var desc = tq_tr.getElementsByClass("cate").getT()
var title = tq_tr.getElementsByClass("title").getT()
var pageLink = tq_tr.getElementsByTag("a").getHref()
var dateTime = tq_tr.getElementsByClass("time").getT()
// BLog.LOGE("${TAG} :::: desc >>> $desc")
// BLog.LOGE("${TAG} :::: title >>> $title")
// BLog.LOGE("${TAG} :::: pageLink >>> $pageLink")
// BLog.LOGE("${TAG} :::: dateTime >>> $dateTime")
if (title.length > 0 && pageLink.length > 0) {
TheQoo().let { tq ->
tq.title = title
tq.link = "https://theqoo.net".plus(pageLink)
tq.dateTiem = dateTime
tq.desc = desc
if (tq.pubDate() > limitDateTime) {
temp.add(tq.getRssData())
}
}
}
}
@SuppressLint("RestrictedApi")
override fun doWork(): Result {
try {
val testUrl2 = arrayListOf("https://theqoo.net/hot")
testUrl2.forEach { url ->
Jsoup.connect(url)
.userAgent(USAGT)
.get().let { ruli ->
BLog.LOGE("test ${testUrl2} >> ${ruli.title()}")
ruli.getElementsByTag("tr").forEach { ruli_tr ->
parseTQoo(ruli_tr)
}
}
}
} catch (e:Exception){e.printStackTrace()}
return Result.success().apply {
// BLog.LOGE("theqoo temp >>>> ${temp.size}")
WorkersDb.insertBulkData(temp)
}
}
}

View File

@ -44,7 +44,7 @@ object WorkersDb {
try { try {
getRealm().writeBlocking { getRealm().writeBlocking {
try { try {
this.copyToRealm(it, UpdatePolicy.ERROR) this.copyToRealm(it, UpdatePolicy.ALL)
} catch (e : Exception) { } catch (e : Exception) {
} }

View File

@ -7,7 +7,6 @@
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<com.google.android.material.imageview.ShapeableImageView <com.google.android.material.imageview.ShapeableImageView
app:layout_constraintTop_toTopOf="@id/title" app:layout_constraintTop_toTopOf="@id/title"
app:shapeAppearanceOverlay="@style/roundedImageView" app:shapeAppearanceOverlay="@style/roundedImageView"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
@ -24,11 +23,13 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="24sp" android:textSize="24sp"
android:maxLines="2" android:maxLines="2"
android:gravity="center_vertical|right"
android:includeFontPadding="false" android:includeFontPadding="false"
android:ellipsize="middle" android:ellipsize="middle"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/circle_preview" app:layout_constraintLeft_toRightOf="@id/circle_preview"
app:layout_constraintRight_toRightOf="parent"/> app:layout_constraintRight_toRightOf="parent"/>
<TextView <TextView
android:id="@+id/desc" android:id="@+id/desc"
android:layout_width="@dimen/zero" android:layout_width="@dimen/zero"
@ -36,17 +37,20 @@
android:textSize="16sp" android:textSize="16sp"
android:maxLines="2" android:maxLines="2"
android:includeFontPadding="false" android:includeFontPadding="false"
android:gravity="center_vertical|right"
android:ellipsize="middle" android:ellipsize="middle"
app:layout_constraintTop_toBottomOf="@id/title" app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintBottom_toTopOf="@id/date" app:layout_constraintBottom_toTopOf="@id/date"
app:layout_constraintLeft_toRightOf="@id/circle_preview" app:layout_constraintLeft_toRightOf="@id/circle_preview"
app:layout_constraintRight_toRightOf="parent"/> app:layout_constraintRight_toRightOf="parent"/>
<TextView <TextView
android:id="@+id/date" android:id="@+id/date"
android:layout_width="@dimen/zero" android:layout_width="@dimen/zero"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="16sp" android:textSize="16sp"
android:lines="1" android:lines="1"
android:gravity="center_vertical|right"
android:includeFontPadding="false" android:includeFontPadding="false"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/circle_preview" app:layout_constraintLeft_toRightOf="@id/circle_preview"