diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c9105ab..f0a37a2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -74,7 +74,6 @@ android { dependencies { val kotlinVersion: String? by extra - implementation ("androidx.appcompat:appcompat:1.7.0") implementation ("androidx.biometric:biometric-ktx:1.2.0-alpha05") implementation ("androidx.browser:browser:1.8.0") @@ -89,5 +88,5 @@ dependencies { implementation ("com.google.code.gson:gson:2.11.0") implementation ("io.realm.kotlin:library-base:2.1.0") implementation ("org.jsoup:jsoup:1.18.1") - implementation ("org.apache.commons:commons-text:1.10.0") + implementation ("org.apache.commons:commons-text:1.12.0") } diff --git a/app/src/main/kotlin/rasel/lunar/launcher/LauncherActivity.kt b/app/src/main/kotlin/rasel/lunar/launcher/LauncherActivity.kt index 648cf53..7036342 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/LauncherActivity.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/LauncherActivity.kt @@ -82,23 +82,29 @@ import rasel.lunar.launcher.home.LauncherHome import rasel.lunar.launcher.home.LauncherHome.Companion.lastedFinishedPageUrl import rasel.lunar.launcher.home.LauncherHome.Companion.listItem import rasel.lunar.launcher.home.LauncherHome.Companion.listTags -import rasel.lunar.launcher.home.LauncherHome.Companion.rssSet -import rasel.lunar.launcher.home.RssItem -import rasel.lunar.launcher.home.RssTagItem -import rasel.lunar.launcher.model.ArcaGetter -import rasel.lunar.launcher.model.DCGetter +//import rasel.lunar.launcher.home.LauncherHome.Companion.rssSet +import rasel.lunar.launcher.model.RssItem +import rasel.lunar.launcher.model.RssTagItem +import rasel.lunar.launcher.model.RssData +import rasel.lunar.launcher.model.getT +import rasel.lunar.launcher.model.RssDataInterface +import rasel.lunar.launcher.model.RssDataType +import rasel.lunar.launcher.model.getRssData import rasel.lunar.launcher.utils.BLog -import rasel.lunar.launcher.utils.ComicsGetter -import rasel.lunar.launcher.utils.ComicsGetter2 -import rasel.lunar.launcher.utils.MissedCallGetter -import rasel.lunar.launcher.utils.NewsFeedsGetter -import rasel.lunar.launcher.utils.RecentSmsGetter -import rasel.lunar.launcher.utils.RedditGetter import rasel.lunar.launcher.utils.RssList.jGuruMain import rasel.lunar.launcher.utils.RssList.jGuruRanks -import rasel.lunar.launcher.utils.YoutubeGetter import rasel.lunar.launcher.utils.beforeDay import rasel.lunar.launcher.utils.make0H +import rasel.lunar.launcher.workers.ArcaGetter +import rasel.lunar.launcher.workers.DCGetter +import rasel.lunar.launcher.workers.DotaxGetter +import rasel.lunar.launcher.workers.FmKoreaGetter +import rasel.lunar.launcher.workers.NewsFeedsGetter +import rasel.lunar.launcher.workers.RecentCallGetter +import rasel.lunar.launcher.workers.RecentSmsGetter +import rasel.lunar.launcher.workers.RedditGetter +import rasel.lunar.launcher.workers.WorkersDb +import rasel.lunar.launcher.workers.YoutubeGetter import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -115,7 +121,6 @@ internal class LauncherActivity : AppCompatActivity() { companion object { private var mWorkManager: WorkManager? = null - val SMS_WORK_TAG = "RecentSmsGetter" val CALL_WORK_TAG = "MissedCallGetter" val FEDDS_WORK_TAG = "NewsFeedsGetter" @@ -127,7 +132,6 @@ internal class LauncherActivity : AppCompatActivity() { val longTimePeriod = 60L val midTimePeriod = 30L var isOpendFold = false - var rssSetTouchCount = 0 @JvmStatic var lActivity: LauncherActivity? = null @JvmStatic var appWidgetManager: AppWidgetManager? = null @@ -149,7 +153,7 @@ internal class LauncherActivity : AppCompatActivity() { mWorkManager?.enqueueUniquePeriodicWork( CALL_WORK_TAG, ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, - PeriodicWorkRequestBuilder(longTimePeriod, TimeUnit.MINUTES) + PeriodicWorkRequestBuilder(longTimePeriod, TimeUnit.MINUTES) .addTag(CALL_WORK_TAG) .build()) }, 2, TimeUnit.SECONDS) @@ -191,7 +195,7 @@ internal class LauncherActivity : AppCompatActivity() { mWorkManager?.cancelAllWorkByTag(COMIC_WORK_TAG) mWorkManager?.enqueueUniquePeriodicWork( COMIC_WORK_TAG, ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, - PeriodicWorkRequestBuilder(midTimePeriod, TimeUnit.MINUTES) + PeriodicWorkRequestBuilder(midTimePeriod, TimeUnit.MINUTES) .addTag(COMIC_WORK_TAG) .build()) refreshComics2() @@ -202,7 +206,7 @@ internal class LauncherActivity : AppCompatActivity() { mWorkManager?.cancelAllWorkByTag(COMIC2_WORK_TAG) mWorkManager?.enqueueUniquePeriodicWork( COMIC2_WORK_TAG, ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, - PeriodicWorkRequestBuilder(midTimePeriod, TimeUnit.MINUTES) + PeriodicWorkRequestBuilder(midTimePeriod, TimeUnit.MINUTES) .addTag(COMIC2_WORK_TAG) .build()) }, 2, TimeUnit.SECONDS) @@ -247,8 +251,8 @@ internal class LauncherActivity : AppCompatActivity() { BLog.LOGE("onConfigurationChanged newConfig?.screenWidthDp >> ${newConfig?.screenWidthDp}") isOpendFold = (newConfig?.screenWidthDp?.toInt() ?: 0 > 700) == true - binding.viewPager.invalidate() - binding.viewPager.currentItem = 1 +// binding.viewPager.invalidate() +// binding.viewPager.currentItem = 1 } override fun onNewIntent(intent: Intent?) { @@ -592,6 +596,7 @@ internal class LauncherActivity : AppCompatActivity() { val triple = 1000L * 60L * 60L * 24L * 2L val simpldateFormat = SimpleDateFormat("d MMM, yy", Locale.US) fun jGuruToday(doc: Document) { + var temp = arrayListOf() doc.getElementsByTag("li").forEach { if (it.getElementsByTag("img").size > 0) { var title = it.getElementsByTag("a").get(0).attr("title") @@ -600,7 +605,7 @@ internal class LauncherActivity : AppCompatActivity() { var imgg = it.getElementsByTag("img").get(0).attr("src") var actor = if (it.getElementsByClass("wpptax").size > 0 )it.getElementsByClass("wpptax").get(0).text() else "" if (pageLink.length > 0 && imgg.length > 0 && title.length > 0 && model.length > 0) { - listItem.add( + temp.add( RssItem( model = model, title = title, @@ -608,20 +613,13 @@ internal class LauncherActivity : AppCompatActivity() { image = imgg, tags = actor, date = beforeDay(Date(),3) + 360000 - ) + ).getRssData() ) } } }.apply { this@LauncherActivity.callBack?.invoke() - var idx = 0 - listItem?.forEach { - if(it.date > beforeDay(Date(),3) && idx < 10) { - it.date = it.date + (10000L * idx) - rssSet.put(it.pageLink,it) - idx += 1 - } - } + WorkersDb.insertBulkInteface(temp) Toast.makeText(this@LauncherActivity, "Stored rank data", Toast.LENGTH_LONG).show() binding.searcher01?.post { binding.searcher01.loadUrl(jGuruMain) } @@ -629,6 +627,7 @@ internal class LauncherActivity : AppCompatActivity() { } fun jGuruMain(doc: Document) { // BLog.LOGE("SimpleDateFormat D MM yy => ${SimpleDateFormat("d MMM yy", Locale.US).format(Date())}") + var temp = arrayListOf() val prevUrl = doc.getElementsByClass("prev").get(0).getElementsByAttribute("href").get(0).attr("href") doc.getElementsByClass("column").forEach { var title = it.getElementsByAttribute("title").get(0).text() @@ -641,23 +640,10 @@ internal class LauncherActivity : AppCompatActivity() { minDate = Math.min(minDate,regDate) maxDate = Math.max(maxDate,regDate) - listItem.add(RssItem(model = model, title = title, pageLink = pageLink, image = imgg, tags = tags, date = make0H(simpldateFormat.parse(date)))) + temp.add(RssItem(model = model, title = title, pageLink = pageLink, image = imgg, tags = tags, date = make0H(simpldateFormat.parse(date))).getRssData()) }.apply { -// if (prevUrl!=null && prevUrl.length > TEST_PAG.length && prevUrl.contains("/page/") && ((maxDate - minDate) < triple)) { -// listItem.sortByDescending { it.date } -// binding.searcher01.postDelayed({binding.searcher01.loadUrl(prevUrl)}, 5000L) -//// } else { var itemC = 0 - listItem.sortByDescending { it.date } - listItem?.forEach { - if(it.date > beforeDay(Date(),1)) { - if (itemC < 10) { - it.date = it.date + (10000L * itemC) - rssSet.put(it.pageLink, it) - } - itemC = itemC + 1 - } - } + WorkersDb.insertBulkInteface(temp) BLog.LOGE("Stored data :: ${listItem.size}items ${simpldateFormat.format(Date(minDate))} ~ ${simpldateFormat.format(Date(maxDate))} set in ${itemC}") Toast.makeText(this@LauncherActivity, "Stored data :: ${listItem.size} items :: [${simpldateFormat.format(Date(minDate))} ~ ${simpldateFormat.format(Date(maxDate))}] \n set in ${itemC}", Toast.LENGTH_LONG).show() @@ -681,7 +667,7 @@ internal class LauncherActivity : AppCompatActivity() { } } }.apply { - listTags.sortByDescending { it.count } + listTags.sortByDescending { it.pubDate() } Toast.makeText(this@LauncherActivity, "Stored data :: ${listTags.size}tags", Toast.LENGTH_SHORT).show() this@LauncherActivity.callBack?.invoke() @@ -693,7 +679,7 @@ internal class LauncherActivity : AppCompatActivity() { @JavascriptInterface fun sendValueFromHtml(result: String) { - BLog.LOGE("binding.otherCheck start with ${result}") +// BLog.LOGE("binding.otherCheck start with ${result}") if (lastedFinishedPageUrl.contains(jGuruMain)) { var htmlString = result.replace("\\u003","<") val doc: Document = Jsoup.parse(htmlString) @@ -710,12 +696,31 @@ internal class LauncherActivity : AppCompatActivity() { } else if (lastedFinishedPageUrl?.contains("youtube") == true) { // val doc: Document = Jsoup.parse(result) // ytChannel(doc) - } else if (lastedFinishedPageUrl?.contains("missjav")==true) { + } else if (lastedFinishedPageUrl?.contains("missav")==true) { val doc: Document = Jsoup.parse(result) - BLog.LOGE("missav >>> ${doc}") - doc.getElementsByTag("li").forEach { miss_li -> - BLog.LOGE("miss_li >>>> ${miss_li}") +// BLog.LOGE("missav >>> ${doc}") + var temp = arrayListOf() + doc.getElementsByClass("thumbnail group").forEach { miss_li -> + if (miss_li.getElementsByTag("img").size > 0 && miss_li.getElementsByTag("img").get(0).attr("data-src").length > 10 && + miss_li.getElementsByTag("img").get(0).attr("data-src").startsWith("https") && + miss_li.getElementsByTag("img").get(0).attr("data-src").endsWith("jpg")) { + var link = if(miss_li.getElementsByTag("a").size > 0) miss_li.getElementsByTag("a").get(0).attr("href") else "" + var title = miss_li.getElementsByClass("text-secondary group-hover:text-primary").getT() + var thumb = miss_li.getElementsByTag("img").get(0).attr("data-src") + var desc = miss_li.getElementsByTag("img").get(0).text() + MissD().apply { + this.link = link + this.title = title + this.thumb = thumb + this.desc = desc + temp.add(this.getRssData()) + } + } + }.apply { + WorkersDb.insertBulkData(temp) + binding.searcher01?.post { binding.searcher01.loadData("",null,null) } } + } BLog.LOGE("binding.otherCheck after ThreadRun") } @@ -723,3 +728,36 @@ internal class LauncherActivity : AppCompatActivity() { } } +class MissD : RssDataInterface { + var link : String? = null + + var title : String? = null + + var thumb : String? = null + + var desc : String? = null + + override fun title(): String { + return title ?: "" + } + + override fun thumbnailUrl(): String { + return thumb ?: "" + } + + override fun originPage(): String { + return link ?: "" + } + + override fun description(): String { + return desc ?: "" + } + + override fun pubDate(): Long { + return beforeDay(Date(),3) + 36000L + } + + override fun category(): RssDataType { + return RssDataType.GURU + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/feeds/Feeds.kt b/app/src/main/kotlin/rasel/lunar/launcher/feeds/Feeds.kt index d7ea0df..a966494 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/feeds/Feeds.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/feeds/Feeds.kt @@ -36,6 +36,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.google.android.material.button.MaterialButtonToggleGroup +import io.realm.kotlin.ext.query import kotlinx.coroutines.* import rasel.lunar.launcher.LauncherActivity.Companion.appWidgetHost import rasel.lunar.launcher.LauncherActivity.Companion.appWidgetManager @@ -55,9 +56,12 @@ import rasel.lunar.launcher.helpers.Constants.Companion.requestCreateWidget import rasel.lunar.launcher.helpers.Constants.Companion.requestPickWidget import rasel.lunar.launcher.home.LauncherHome.Companion.listItem import rasel.lunar.launcher.home.LauncherHome.Companion.listTags -import rasel.lunar.launcher.home.RssItem -import rasel.lunar.launcher.home.RssTagItem +import rasel.lunar.launcher.model.RssTagItem +import rasel.lunar.launcher.model.RssData +import rasel.lunar.launcher.model.RssDataInterface +import rasel.lunar.launcher.model.RssDataType import rasel.lunar.launcher.utils.RssList.jGuruMain +import rasel.lunar.launcher.workers.WorkersDb import java.util.* @@ -65,12 +69,12 @@ internal class Feeds : Fragment() { private lateinit var binding: FeedsBinding private val requestCodeString = "requestCode" - var mRssAdapter : RssAdapter? = null + var mRssAdapter : RssAdapter? = null var mRssAdapter2 : RssAdapter? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { binding = FeedsBinding.inflate(inflater, container, false) - mRssAdapter = RssAdapter(listItem, requireContext()) - mRssAdapter2 = RssAdapter(listTags, requireContext()) + mRssAdapter = RssAdapter(requireContext()) + mRssAdapter2 = RssAdapter(requireContext()) binding.feedsRss.rss.adapter = mRssAdapter binding.feedsRss.rss2.adapter = mRssAdapter2 updateWidgets() @@ -166,7 +170,11 @@ internal class Feeds : Fragment() { rss.adapter = mRssAdapter loading.visibility = View.VISIBLE if (listItem.size > 0) { - mRssAdapter?.updateData(listItem) + listItem.sortByDescending { it.pubDate() } + WorkersDb.getRealm().query("category == '$0'", RssDataType.GURU.name).find()?.apply { + mRssAdapter?.updateData(listItem) + } + rss.visibility = View.VISIBLE loading.visibility = View.GONE refresh.visibility = View.GONE @@ -177,6 +185,7 @@ internal class Feeds : Fragment() { var call = { if (listItem.size > 0) { rss?.postDelayed( { + listItem.sortByDescending { it.pubDate() } mRssAdapter?.updateData(listItem) loading.visibility = View.GONE refresh.visibility = View.GONE @@ -192,7 +201,7 @@ internal class Feeds : Fragment() { lActivity?.doWebParseStart("https://projectjav.com") {} } "jmiss" -> { - lActivity?.doWebParseStart("https://missjav.com") {} + lActivity?.doWebParseStart("https://missav.com/dm11/ko") {} } "jreq" -> { lActivity?.doWebParseStart(jGuruMain) {} diff --git a/app/src/main/kotlin/rasel/lunar/launcher/feeds/rss/RssAdapter.kt b/app/src/main/kotlin/rasel/lunar/launcher/feeds/rss/RssAdapter.kt index ace46b3..df4d406 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/feeds/rss/RssAdapter.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/feeds/rss/RssAdapter.kt @@ -25,25 +25,15 @@ import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.view.Gravity -import androidx.core.content.ContextCompat -import android.graphics.Typeface -import android.util.TypedValue -import android.content.res.ColorStateList import android.net.Uri -import android.os.Handler -import android.os.Looper -import android.view.MotionEvent import android.view.View -import androidx.browser.customtabs.CustomTabsIntent import androidx.recyclerview.widget.DiffUtil import com.squareup.picasso.Picasso import rasel.lunar.launcher.LauncherActivity.Companion.lActivity -import rasel.lunar.launcher.databinding.ListItemBinding import rasel.lunar.launcher.databinding.ListItemWithBinding -import rasel.lunar.launcher.helpers.UniUtils.Companion.getColorResId -import rasel.lunar.launcher.home.RssItem -import rasel.lunar.launcher.todos.RssDataItem -import rasel.lunar.launcher.todos.RssDataType +import rasel.lunar.launcher.model.RssItem +import rasel.lunar.launcher.model.RssDataInterface +import rasel.lunar.launcher.model.RssDataType import rasel.lunar.launcher.todos.RssItemDiffUtil import java.net.URLEncoder import java.nio.charset.Charset @@ -51,9 +41,9 @@ import java.text.SimpleDateFormat import java.util.Date -internal class RssAdapter(var items: ArrayList = arrayListOf(), private val context: Context) : +internal class RssAdapter(private val context: Context) : RecyclerView.Adapter() { - + var items: ArrayList = arrayListOf() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RssViewHolder { val binding = ListItemWithBinding.inflate(LayoutInflater.from(parent.context), parent, false) return RssViewHolder(binding) @@ -128,8 +118,10 @@ internal class RssAdapter(var items: ArrayList = arrayListOf lActivity?.startActivity(mapIntent) } - fun updateData(newList: List) { + fun updateData(newList: List) { DiffUtil.calculateDiff(RssItemDiffUtil(items, newList)).dispatchUpdatesTo(this) + items.clear() + items.addAll(newList) } } @@ -138,7 +130,7 @@ class RssViewHolder(var view: ListItemWithBinding) : RecyclerView.ViewHolder(vie } internal class RssItemDiffUtil( - private val oldList: List, private val newList: List + private val oldList: List, private val newList: List ) : DiffUtil.Callback() { override fun getOldListSize(): Int = oldList.size diff --git a/app/src/main/kotlin/rasel/lunar/launcher/helpers/UniUtils.kt b/app/src/main/kotlin/rasel/lunar/launcher/helpers/UniUtils.kt index ba1ecf3..5340420 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/helpers/UniUtils.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/helpers/UniUtils.kt @@ -193,43 +193,43 @@ internal class UniUtils { /* favorite apps */ private fun populateFavApps(context: Context, linearLayoutCompat: LinearLayoutCompat) { - val prefsFavApps = context.getSharedPreferences(PREFS_FAVORITE_APPS, 0) - if (linearLayoutCompat.isVisible || prefsFavApps.all.toString().length < 3) { - linearLayoutCompat.visibility = View.GONE - } else { - linearLayoutCompat.removeAllViews() - linearLayoutCompat.visibility = View.VISIBLE - val iconSize = context.getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_ICON_SIZE, DEFAULT_ICON_SIZE) - - for (position in 1..MAX_FAVORITE_APPS) { - val packageName = prefsFavApps.getString(KEY_APP_NO_ + position.toString(), "").toString() - /* package name is not empty for a specific position */ - if (packageName.isNotEmpty()) { - try { - ShapeableImageView(context).apply { - layoutParams = LinearLayoutCompat.LayoutParams( - (iconSize * resources.displayMetrics.density).toInt(), - (iconSize * resources.displayMetrics.density).toInt(), 1F) - }.let { sImageView -> - context.packageManager.getApplicationIcon(packageName).let { defaultIcon -> - if (context.getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_APPS_LAYOUT, 0) != 0) - getDrawableIconForPackage(packageName, defaultIcon) { - sImageView.setImageDrawable(it ?: defaultIcon) - } - else sImageView.setImageDrawable(defaultIcon) - } - sImageView.setOnClickListener { - context.startActivity(context.packageManager.getLaunchIntentForPackage(packageName)) - } - linearLayoutCompat.addView(sImageView) - } - } catch (nameNotFoundException: PackageManager.NameNotFoundException) { - context.getSharedPreferences(PREFS_FAVORITE_APPS, 0) - .edit().remove(KEY_APP_NO_ + position).apply() - } - } - } - } +// val prefsFavApps = context.getSharedPreferences(PREFS_FAVORITE_APPS, 0) +// if (linearLayoutCompat.isVisible || prefsFavApps.all.toString().length < 3) { +// linearLayoutCompat.visibility = View.GONE +// } else { +// linearLayoutCompat.removeAllViews() +// linearLayoutCompat.visibility = View.VISIBLE +// val iconSize = context.getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_ICON_SIZE, DEFAULT_ICON_SIZE) +// +// for (position in 1..MAX_FAVORITE_APPS) { +// val packageName = prefsFavApps.getString(KEY_APP_NO_ + position.toString(), "").toString() +// /* package name is not empty for a specific position */ +// if (packageName.isNotEmpty()) { +// try { +// ShapeableImageView(context).apply { +// layoutParams = LinearLayoutCompat.LayoutParams( +// (iconSize * resources.displayMetrics.density).toInt(), +// (iconSize * resources.displayMetrics.density).toInt(), 1F) +// }.let { sImageView -> +// context.packageManager.getApplicationIcon(packageName).let { defaultIcon -> +// if (context.getSharedPreferences(PREFS_SETTINGS, 0).getInt(KEY_APPS_LAYOUT, 0) != 0) +// getDrawableIconForPackage(packageName, defaultIcon) { +// sImageView.setImageDrawable(it ?: defaultIcon) +// } +// else sImageView.setImageDrawable(defaultIcon) +// } +// sImageView.setOnClickListener { +// context.startActivity(context.packageManager.getLaunchIntentForPackage(packageName)) +// } +// linearLayoutCompat.addView(sImageView) +// } +// } catch (nameNotFoundException: PackageManager.NameNotFoundException) { +// context.getSharedPreferences(PREFS_FAVORITE_APPS, 0) +// .edit().remove(KEY_APP_NO_ + position).apply() +// } +// } +// } +// } } /* lock screen using accessibility service */ diff --git a/app/src/main/kotlin/rasel/lunar/launcher/home/BatteryReceiver.kt b/app/src/main/kotlin/rasel/lunar/launcher/home/BatteryReceiver.kt index 99e204e..1011794 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/home/BatteryReceiver.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/home/BatteryReceiver.kt @@ -24,12 +24,13 @@ import android.content.Intent import android.os.BatteryManager import android.provider.Settings import android.view.animation.AnimationUtils +import android.widget.TextView import com.google.android.material.progressindicator.CircularProgressIndicator import rasel.lunar.launcher.R import rasel.lunar.launcher.utils.BLog -internal class BatteryReceiver(private val progressBar: CircularProgressIndicator) : BroadcastReceiver() { +internal class BatteryReceiver(private val progressBar: TextView) : BroadcastReceiver() { /* get current battery percentage */ private fun batteryPercentage(intent: Intent): Int { @@ -49,20 +50,20 @@ internal class BatteryReceiver(private val progressBar: CircularProgressIndicato } /* set battery percentage value to the circular progress bar */ - progressBar.progress = batteryPercentage(intent!!) + progressBar.text = "빠떼뤼 ~> ${batteryPercentage(intent!!)}%" /* progress bar animation */ - if (chargingStatus(intent) == BatteryManager.BATTERY_STATUS_CHARGING || - chargingStatus(intent) == BatteryManager.BATTERY_STATUS_FULL) { - if (progressBar.animation == null && animationDuration != 0f) { - progressBar.startAnimation( - AnimationUtils.loadAnimation(context, R.anim.rotate_clockwise) - ) - } - } else if (chargingStatus(intent) == BatteryManager.BATTERY_STATUS_DISCHARGING || - chargingStatus(intent) == BatteryManager.BATTERY_STATUS_NOT_CHARGING) { - progressBar.clearAnimation() - } +// if (chargingStatus(intent) == BatteryManager.BATTERY_STATUS_CHARGING || +// chargingStatus(intent) == BatteryManager.BATTERY_STATUS_FULL) { +// if (progressBar.animation == null && animationDuration != 0f) { +// progressBar.startAnimation( +// AnimationUtils.loadAnimation(context, R.anim.rotate_clockwise) +// ) +// } +// } else if (chargingStatus(intent) == BatteryManager.BATTERY_STATUS_DISCHARGING || +// chargingStatus(intent) == BatteryManager.BATTERY_STATUS_NOT_CHARGING) { +// progressBar.clearAnimation() +// } } } diff --git a/app/src/main/kotlin/rasel/lunar/launcher/home/LauncherHome.kt b/app/src/main/kotlin/rasel/lunar/launcher/home/LauncherHome.kt index 31e2daa..5b7c1db 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/home/LauncherHome.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/home/LauncherHome.kt @@ -41,12 +41,16 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager -import com.google.gson.Gson -import kotlinx.coroutines.GlobalScope +import io.realm.kotlin.ext.query +import io.realm.kotlin.notifications.ResultsChange +import io.realm.kotlin.notifications.UpdatedResults +import io.realm.kotlin.query.RealmResults +import io.realm.kotlin.query.Sort +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.json.JSONArray import org.json.JSONObject -import org.jsoup.Jsoup import rasel.lunar.launcher.LauncherActivity.Companion.CALL_WORK_TAG import rasel.lunar.launcher.LauncherActivity.Companion.FEDDS_WORK_TAG import rasel.lunar.launcher.LauncherActivity.Companion.SMS_WORK_TAG @@ -70,24 +74,25 @@ import rasel.lunar.launcher.helpers.UniUtils.Companion.canAuthenticate import rasel.lunar.launcher.helpers.UniUtils.Companion.expandNotificationPanel import rasel.lunar.launcher.helpers.UniUtils.Companion.lockMethod import rasel.lunar.launcher.home.weather.WeatherExecutor -import rasel.lunar.launcher.model.ArcaGetter -import rasel.lunar.launcher.model.DCGetter +import rasel.lunar.launcher.model.RssData import rasel.lunar.launcher.qaccess.QuickAccess import rasel.lunar.launcher.settings.SettingsActivity import rasel.lunar.launcher.todos.MissedCallsAdapter -import rasel.lunar.launcher.todos.RssDataItem -import rasel.lunar.launcher.todos.RssDataType +import rasel.lunar.launcher.model.RssDataInterface import rasel.lunar.launcher.todos.RssItemAdapter import rasel.lunar.launcher.todos.SmsLogsAdapter import rasel.lunar.launcher.utils.BLog -import rasel.lunar.launcher.utils.RecentSmsLog import rasel.lunar.launcher.utils.SimpleFingerGestures import rasel.lunar.launcher.utils.beforeDay +import rasel.lunar.launcher.workers.ArcaGetter +import rasel.lunar.launcher.workers.DCGetter +import rasel.lunar.launcher.workers.RecentCall +import rasel.lunar.launcher.workers.RecentSms +import rasel.lunar.launcher.workers.WorkersDb +import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date import java.util.Locale -import java.util.concurrent.Executors -import java.util.concurrent.TimeUnit internal class LauncherHome : Fragment() { @@ -99,17 +104,11 @@ internal class LauncherHome : Fragment() { private var shouldResume = true companion object { var lastedFinishedPageUrl : String = "" - - - var missedCalls = hashMapOf() - var callList = arrayListOf() - var smsList = arrayListOf() - var listTags = arrayListOf() - var listItem = arrayListOf() - var rssSet = hashMapOf() - - var rssList = arrayListOf() - + var recentCalls = hashMapOf() + var callList = arrayListOf() + var smsList = arrayListOf() + var listTags = arrayListOf() + var listItem = arrayListOf() } private var nReceiver: NotificationReceiver? = null @@ -120,7 +119,7 @@ internal class LauncherHome : Fragment() { } } - val UPDATE_DELAY = 500L + val UPDATE_DELAY = 3000L val commandHandler = Handler(Looper.getMainLooper()) val smsUpdate = Runnable { @@ -130,18 +129,24 @@ internal class LauncherHome : Fragment() { } val callUpdate = Runnable { - binding.missedCalls.text = "최근 통화 [${missedCalls.size}]" - BLog.LOGE("observeForever missedCalls.size >>> ${missedCalls.size}") + binding.missedCalls.text = "최근 통화 [${recentCalls.size}]" + BLog.LOGE("observeForever missedCalls.size >>> ${recentCalls.size}") chooseAdpater() } val infoUpdate = Runnable { - binding.otherCheck.text = "최근 정보[${rssSet.size}]" - BLog.LOGE("observeForever rssSet.size >>> ${rssSet.size}") chooseAdpater() + if (lasted?.size ?: 0 > 0) { + binding.otherCheck.text = "최근 정보[${lasted!!.size}]" + mRssAdapter.updateData(lasted!!) + binding.infoList.smoothScrollToPosition(0) + binding.infoList.visibility = View.VISIBLE + } } + var lasted : RealmResults? = null + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { binding = LauncherHomeBinding.inflate(inflater, container, false) @@ -162,7 +167,7 @@ internal class LauncherHome : Fragment() { binding.smsList.visibility = View.GONE binding.infoList.visibility = View.GONE - binding.favAppsGroup.visibility = View.GONE +// binding.favAppsGroup.visibility = View.GONE binding.mainList.layoutManager = LinearLayoutManager(requireContext()) binding.smsList.layoutManager = LinearLayoutManager(requireContext()) @@ -207,14 +212,46 @@ internal class LauncherHome : Fragment() { registerReceiver(requireContext(),nReceiver, filter,RECEIVER_EXPORTED) BLog.LOGE("onCreateView()") + mRssDataResult = WorkersDb.getRealm().query().query("pubDate > $0",beforeDay(Date(),3)).sort("pubDate ", Sort.DESCENDING).find() + val job = CoroutineScope(Dispatchers.Default).launch { + // create a Flow from that collection, then add a listener to the Flow + mRssDataResult.asFlow().collect { changes: ResultsChange -> + when (changes) { + // UpdatedResults means this change represents an update/insert/delete operation + is UpdatedResults -> { +// changes.insertions // indexes of inserted objects +// changes.insertionRanges // ranges of inserted objects +// changes.changes // indexes of modified objects +// changes.changeRanges // ranges of modified objects +// changes.deletions // indexes of deleted objects +// changes.deletionRanges // ranges of deleted objects +// changes.list // the full collection of objects + if (lasted?.size != changes.list.size) { + BLog.LOGE("ResultsChange") + lasted = changes.list + commandHandler.removeCallbacks(infoUpdate) + commandHandler.postDelayed(infoUpdate, UPDATE_DELAY) + } + WorkersDb.getRealm().apply { write { + delete(query().query("pubDate < $0",beforeDay(Date(),3)).find()) + }} + } + else -> { + // types other than UpdatedResults are not changes -- ignore them + } + } + } + } +// commandHandler.postDelayed(infoUpdate, UPDATE_DELAY) + job.start() return binding.root } lateinit var mMissedCallsAdapter : MissedCallsAdapter lateinit var mSmsLogsAdapter : SmsLogsAdapter lateinit var mRssAdapter : RssItemAdapter - + lateinit var mRssDataResult : RealmResults override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -249,26 +286,27 @@ internal class LauncherHome : Fragment() { } binding.otherCheck.setOnClickListener { binding.otherCheck.isChecked = true - chooseAdpater() + commandHandler.removeCallbacks(infoUpdate) + commandHandler.post(infoUpdate) } binding.otherCheck.setOnLongClickListener { - synchronized(rssSet) { - val now = Date() - var keys = arrayListOf() - rssSet.forEach { t, u -> - if (u.pubDate() <= beforeDay(now,3)) { - keys.add(t) - } - }.apply { - keys.forEach { rssSet.remove(it) } - }.apply { - refreshYoutube() - refreshComics() - refreshFeeds() - refreshReddit() - } - } +// synchronized(rssSet) { +// val now = Date() +// var keys = arrayListOf() +// rssSet.forEach { t, u -> +// if (u.pubDate() <= beforeDay(now,3)) { +// keys.add(t) +// } +// }.apply { +// keys.forEach { rssSet.remove(it) } +// }.apply { + refreshYoutube() + refreshComics() + refreshFeeds() + refreshReddit() +// } +// } true } @@ -284,14 +322,15 @@ internal class LauncherHome : Fragment() { fun chooseAdpater () { - binding.mainList.visibility = View.GONE - binding.smsList.visibility = View.GONE - binding.infoList.visibility = View.GONE + if (binding.missedCalls.isChecked == false) binding.mainList.visibility = View.GONE else binding.mainList.visibility = View.VISIBLE + if (binding.recentSms.isChecked == false) binding.smsList.visibility = View.GONE else binding.smsList.visibility = View.VISIBLE + if (binding.otherCheck.isChecked == false) binding.infoList.visibility = View.GONE else binding.infoList.visibility = View.VISIBLE + if (binding.missedCalls.isChecked) { - if (missedCalls.size > 0 && isAdded && isResumed && isVisible) { + if (recentCalls.size > 0 && isAdded && isResumed && isVisible) { try { callList.clear() - missedCalls.forEach { t, u -> + recentCalls.forEach { t, u -> callList.add(u) }.apply { callList.sortByDescending { it.date } @@ -317,48 +356,50 @@ internal class LauncherHome : Fragment() { } } } else if(binding.otherCheck.isChecked) { - try { - GlobalScope.launch { - (rssSet.clone() as? HashMap)?.let { temMap -> - synchronized(binding.infoList) { - var tempList = arrayListOf() - temMap.forEach { k,v -> - if(v.pubDate() > beforeDay(Date(),3)) { - tempList.add(v) - } else { - - } - }.apply { - tempList.sortByDescending { it.pubDate() } - rssList.clear() - rssList.addAll(tempList) - Handler(Looper.getMainLooper()).post { - binding.infoList.visibility = View.VISIBLE - mRssAdapter.updateData(rssList) - } - } - } - } - } - }catch (e : Exception){} +// try { +// GlobalScope.launch { +// (rssSet.clone() as? HashMap)?.let { temMap -> +// synchronized(binding.infoList) { +// var tempList = arrayListOf() +// temMap.forEach { k,v -> +// if(v.pubDate() > beforeDay(Date(),3)) { +// tempList.add(v) +// } else { +// +// } +// }.apply { +// tempList.sortByDescending { it.pubDate() } +// rssList.clear() +// rssList.addAll(tempList) +// Handler(Looper.getMainLooper()).post { +// binding.infoList.visibility = View.VISIBLE +// mRssAdapter.updateData(rssList) +// } +// } +// } +// } +// } +// }catch (e : Exception){} } } override fun onResume() { super.onResume() BLog.LOGE("onResume()") + BLog.LOGE(SimpleDateFormat("yyyy년 M월 W주차, dd일 E요일").format(Date())) if (shouldResume) { + /* register battery changes */ requireContext().registerReceiver(batteryReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) /* time and date */ - binding.time.textLocale = Locale.US - binding.date.textLocale = Locale.US - if (DateFormat.is24HourFormat(requireContext())) { +// binding.time.textLocale = Locale.US +// binding.date.textLocale = Locale.US +// if (DateFormat.is24HourFormat(requireContext())) { binding.time.format24Hour = timeFormat - binding.date.format24Hour = dateFormat - } else { - binding.time.format12Hour = timeFormat - binding.date.format12Hour = dateFormat - } + binding.date.format24Hour = "yyyy년 M월 W주차, dd일 E요일" +// } else { +// binding.time.format12Hour = timeFormat +// binding.date.format12Hour = dateFormat +// } /* show weather */ WeatherExecutor(settingsPrefs).generateWeatherString(binding.weather) } @@ -594,16 +635,16 @@ internal class LauncherHome : Fragment() { /* get time format string */ private val timeFormat: String? get() { - when (settingsPrefs.getInt(KEY_TIME_FORMAT, 0)) { - 0 -> return if (DateFormat.is24HourFormat(requireContext())) { - "kk:mm" - } else { - "HH:mm a" - } - 1 -> return "HH:mm a" - 2 -> return "kk:mm" - } - return null +// when (settingsPrefs.getInt(KEY_TIME_FORMAT, 0)) { +// 0 -> return if (DateFormat.is24HourFormat(requireContext())) { +// "kk:mm" +// } else { +// "HH:mm a" +// } +// 1 -> return "HH:mm a" +// 2 -> return "kk:mm" +// } + return "a HH : mm" } /* get date number suffix */ @@ -618,127 +659,18 @@ internal class LauncherHome : Fragment() { /* get date format string */ private val dateFormat: String get() { - settingsPrefs.getString(KEY_DATE_FORMAT, DEFAULT_DATE_FORMAT).let { - return if (it!!.contains("x")) { - it.replace("x", dateNumberSuffix) - } else { - it - } - } - } - -} - - -class MissedCall { - constructor(count: Int, name: String?, number: String, type: Int, typeString: String, date : String) { - this.count = count - this.name = name ?: "unknown" - this.number = number - this.type = type - this.typeString = typeString - this.date = date - } - - var count : Int = 1 - var name : String = "how" - var number : String = "" - var type : Int = 0 - var typeString : String = "" - var date : String = "" - - fun toJson() : String { - return Gson().toJson(this) +// settingsPrefs.getString(KEY_DATE_FORMAT, DEFAULT_DATE_FORMAT).let { +// return if (it!!.contains("x")) { +// it.replace("x", dateNumberSuffix) +// } else { +// it +// } +// } + return "yyyy년 M월 W주차, dd일 E요일" } } -class RssTagItem : RssDataItem{ - var link : String = "" - var tagTitle = "" - var count = 0 - override fun title(): String { - return tagTitle - } - - override fun thumbnailUrl(): String { - return "" - } - - override fun originPage(): String { - return link - } - - override fun description(): String { - return " " - } - - override fun pubDate(): Long { - return 0L - } - - override fun category(): RssDataType { - return RssDataType.TAGS - } - - constructor(link: String, tagTitle: String) { - this.link = link - this.tagTitle = tagTitle - if (tagTitle.contains("(") && tagTitle.contains(")")) { - try { - count = tagTitle.split("(")[1].split(")")[0].toInt() - }catch (e : Exception) {} - } - } -} -class RssItem : RssDataItem { - var model : String = "" - var title : String = "" - var pageLink : String = "" - var image : String = "" - var tags : String = "" - var date : Long = 0L - - constructor( - model: String, - title: String, - pageLink: String, - image: String, - tags: String, - date: Long - ) { - this.model = model - this.title = title - this.pageLink = pageLink - this.image = image - this.tags = tags - this.date = date - } - - override fun title(): String { - return title - } - - override fun thumbnailUrl(): String { - return image - } - - override fun originPage(): String { - return pageLink - } - - override fun description(): String { - return tags.plus(model) - } - - override fun pubDate(): Long { - return date - } - - override fun category(): RssDataType { - return RssDataType.GURU - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/CommunityData.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/CommunityData.kt index 79eb894..02d153e 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/model/CommunityData.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/CommunityData.kt @@ -1,17 +1,9 @@ package rasel.lunar.launcher.model -import android.annotation.SuppressLint -import android.content.Context -import androidx.work.Worker -import androidx.work.WorkerParameters -import org.jsoup.Jsoup -import org.jsoup.nodes.Element +import io.realm.kotlin.types.RealmObject +import io.realm.kotlin.types.annotations.PrimaryKey import org.jsoup.select.Elements -import rasel.lunar.launcher.home.LauncherHome.Companion.rssSet -import rasel.lunar.launcher.todos.RssDataItem -import rasel.lunar.launcher.todos.RssDataType import rasel.lunar.launcher.utils.BLog -import rasel.lunar.launcher.utils.USAGT import rasel.lunar.launcher.utils.afterDay import rasel.lunar.launcher.utils.beforeDay import java.text.SimpleDateFormat @@ -20,91 +12,17 @@ import java.util.Date import java.util.TimeZone -class ArcaGetter : Worker { - companion object { - val TAG = "DCGetter" - } - constructor(context: Context, workerParams: WorkerParameters) : super(context, workerParams) { - } - override fun doWork(): Result { - var tempArray = arrayListOf() - try { - val urls = arrayListOf( - "https://arca.live/b/singbung?mode=best", - "https://arca.live/b/headline", - "https://arca.live/b/live", - "https://arca.live/b/namuhotnow", - "https://arca.live/b/society", - "https://arca.live/b/replay", - "https://arca.live/b/breaking" - ) - urls.forEach { - Jsoup.connect(it) - .userAgent(USAGT) - .get().let { arca -> -// BLog.LOGE("url >> ${it} >> ${arca}") - arca.getElementsByClass("vrow hybrid").forEach { araca_li -> - if (araca_li.html().contains("title ") == true) { - parseArcaLi(araca_li).apply { - tempArray.addAll(this) - } - } - } - } - } -// Jsoup.connect("https://projrctjav.com").userAgent(USAGT).get().let { projectj -> -// BLog.LOGE("projectj >>>>> ${projectj}") -// } - } catch (e:Exception){e.printStackTrace()} - - return tempArray.forEach { - rssSet.put(it.originPage(),it) - }.run { - Result.success() - } - } - - private fun parseArcaLi(aracaLi: Element) : ArrayList { - var tempArray = arrayListOf() -// BLog.LOGE("aracaLi >>> ${aracaLi}") - var title = aracaLi.getElementsByClass("title hybrid-title").getT() - var desc = aracaLi.getElementsByClass("badge").getT() - desc.plus(aracaLi.getElementsByClass("user-info ").getT()) - var dateTime = aracaLi.getElementsByTag("time").attr("datetime") - var tumbnail = aracaLi.getElementsByTag("img").attr("src") - var link = "https://arca.live".plus(if(aracaLi.getElementsByClass("title hybrid-title").size > 0) aracaLi.getElementsByClass("title hybrid-title").get(0).attr("href") else if(aracaLi.getElementsByTag("a").size > 0) aracaLi.getElementsByTag("a").get(0).attr("href") else "") - if (title.length > 0 && link.length > 20) { - Arca().apply { - this.link = link - this.title = title - if (tumbnail.length > 0) { - this.thumbnail = "https:".plus(tumbnail) -// -// BLog.LOGE("Arca thumbnail >>> ${thumbnail}") - } - this.desc = desc - this.dateTiem = dateTime - }.apply { -// BLog.LOGE("parseArcaLi >>>> ${this}") - if(this.pubDate() > beforeDay(Date(),3)) { - tempArray.add(this) - } - } - } - return tempArray - } - - fun Elements.getT() = if (size > 0) get(0).text() else "" -} -class Arca : RssDataItem { +fun Elements.getT() = if (size > 0) get(0).text() else "" +val dateFormat = SimpleDateFormat("hh:mm / yy - MM - dd") +class Arca : RssDataInterface { var link : String? = null var title : String? = null var thumbnail : String? = null var desc : String? = null var dateTiem : String? = null -var updateDateTime : Long = 0L + var updateDateTime : Long = 0L override fun title(): String { return title ?: "" } @@ -120,18 +38,18 @@ var updateDateTime : Long = 0L override fun description(): String { return desc ?: "" } - val dateFormat = SimpleDateFormat("hh:mm / yy - MM - dd") + override fun pubDate(): Long { var date = Date() var dateTime = date.time var before = 0 if (updateDateTime == 0L) { try { - BLog.LOGE("this.dateTiem >>> ${this.dateTiem}") +// BLog.LOGE("this.dateTiem >>> ${this.dateTiem}") val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") sdf.timeZone = TimeZone.getTimeZone("GMT") updateDateTime = sdf.parse(this.dateTiem!!).time - BLog.LOGE("updateDateTime >>>> ${dateFormat.format(Date(updateDateTime))}" ) +// BLog.LOGE("updateDateTime >>>> ${dateFormat.format(Date(updateDateTime))}" ) // var targetDate = this.dateTiem ?: "" // if (targetDate?.length ?: 0 > 1) { // var dateDesc = targetDate @@ -176,7 +94,6 @@ var updateDateTime : Long = 0L } else { dateTime = updateDateTime } - return dateTime } @@ -185,95 +102,13 @@ var updateDateTime : Long = 0L } } -class DCGetter : Worker { - companion object { - val TAG = "DCGetter" - } - constructor(context: Context, workerParams: WorkerParameters) : super(context, workerParams) { - - } - - fun parseDcLi(dc_li : org.jsoup.nodes.Element) : ArrayList{ - var temp = arrayListOf() - if (dc_li.html().contains("
    ") && dc_li.html().contains("con_list img")) { - dc_li.child(0).getElementsByTag("li").forEach { - parseDcLi(it) - } - } else { - var link = if (dc_li.getElementsByTag("a").size > 0) dc_li.getElementsByTag("a").get(0) - .attr("href") else "" - var title = - if (dc_li.getElementsByClass("box besttxt").size > 0) dc_li.getElementsByClass("box besttxt") - .get(0) - .text() else if (dc_li.getElementsByClass("tit").size > 0) dc_li.getElementsByClass( - "tit" - ).get(0).text() else "" - var thumbnail = - if (dc_li.getElementsByTag("img").size > 0) dc_li.getElementsByTag("img").get(0) - .attr("src") else "" - var desc = - if (dc_li.getElementsByClass("box best_info").size > 0) dc_li.getElementsByClass("box best_info") - .get(0).text() else "" - var dateTiem = - if (dc_li.getElementsByClass("time").size > 0) dc_li.getElementsByClass("time") - .get(0).text() else "" - link = link.replace("&","&") - thumbnail = thumbnail.replace("&","&") -// BLog.LOGE("DC_LI >>>> link >>>> ${link}") -// BLog.LOGE("DC_LI >>>> title >>>> ${title}") -// BLog.LOGE("DC_LI >>>> thumbnail >>>> ${thumbnail}") -// BLog.LOGE("DC_LI >>>> desc >>>> ${desc}") -// BLog.LOGE("DC_LI >>>> dateTiem >>>> ${dateTiem}") - if (title.length > 0 && link.length > 0) { - DcInside().apply { - this.link = link - this.title = title - this.thumbnail = thumbnail - this.desc = desc - this.dateTiem = dateTiem - }.apply { - temp.add(this) - } - } - } - return temp - } - - @SuppressLint("RestrictedApi") - override fun doWork(): Result { - - var tempArray = arrayListOf() - - try { - val testUrl2 = "https://www.dcinside.com/" - Jsoup.connect(testUrl2) - .userAgent(USAGT) - .get().let { dc -> -// BLog.LOGE("test ${testUrl2} >> ${this}") - dc.getElementsByTag("li").forEach { dc_li -> - if (dc_li.html().contains("main_log") == true) { - parseDcLi(dc_li).apply { - tempArray.addAll(this) - } - } - } - } - - - } catch (e:Exception){e.printStackTrace()} - return tempArray.forEach { - rssSet.put(it.originPage(),it) - }.run { - Result.success() - } - } -} -class DcInside : RssDataItem { + +class DcInside : RssDataInterface { var link : String? = null var title : String? = null var thumbnail : String? = null @@ -282,7 +117,6 @@ class DcInside : RssDataItem { var dateTiemL : Long = 0L - val dateF = SimpleDateFormat("MM-dd") val timeF = SimpleDateFormat("HH:mm") override fun title(): String { @@ -332,4 +166,143 @@ class DcInside : RssDataItem { return RssDataType.DcInside } +} + +class RssData : RealmObject, RssDataInterface { + + @PrimaryKey + var originPage : String? = null + var title : String? = null + var description : String? = null + var thumbnail : String? = null + var pubDate : Long = 0L + var category : String? = null + + override fun title(): String { + return title ?: "" + } + + override fun thumbnailUrl(): String { + return thumbnail ?: "" + } + + override fun originPage(): String { + return originPage ?: "" + } + + override fun description(): String { + return description ?: "" + } + + override fun pubDate(): Long { + return pubDate + } + + override fun category(): RssDataType { + return RssDataType.valueOf(category!!) + } + +} + + +open class Dotax(var pageLink : String, + var desc : String, + var dateTime : String, + var title : String, + var thumbnail : String) : RssDataInterface { + var updateDateTime = 0L + override fun title(): String { + return title + } + + override fun thumbnailUrl(): String { + return thumbnail + } + + override fun originPage(): String { + return "https://m.cafe.daum.net".plus(pageLink) + } + + override fun description(): String { + return desc + } + override fun pubDate(): Long { + var date = Date() + var dateTime = date.time + var before = 0 + if (updateDateTime == 0L) { + try { + var targetDate = this.dateTime ?: "" + if (targetDate?.length ?: 0 > 1) { + var dateDesc = targetDate + var isBefore = dateDesc.contains("전") + val dayString = dateDesc.replace("[^0-9]".toRegex(), "") + before = dayString.toInt() + if (dateDesc.contains("년")) { + before = 365 * before + dateTime = if (isBefore) beforeDay(date, before) else afterDay(date, before) + } else if (dateDesc.contains("월")) { + before = 30 * before + dateTime = if (isBefore) beforeDay(date, before) else afterDay(date, before) + } else if (dateDesc.contains("주")) { + before = 7 * before + dateTime = if (isBefore) beforeDay(date, before) else afterDay(date, before) + } else if (dateDesc.contains("일")) { + dateTime = if (isBefore) beforeDay(date, before) else afterDay(date, before) + } else if (dateDesc.contains("시간")) { + dateTime = + if (isBefore) dateTime.minus(before.times(1000L * 60L * 60L)) else dateTime.plus( + before.times(1000L * 60L * 60L) + ) + } else if (dateDesc.contains("분")) { + dateTime = + if (isBefore) dateTime.minus(before.times(1000L * 60L)) else dateTime.plus( + before.times(1000L * 60L) + ) + } + else if (dateDesc.contains("초")) { + dateTime = + if (isBefore) dateTime.minus(before.times(1000L)) else dateTime.plus( + before.times(1000L) + ) + } + } + + } catch (e: Exception) { + + } finally { + updateDateTime = dateTime + } + } else { + dateTime = updateDateTime + } + return dateTime + } + override fun category(): RssDataType { + return RssDataType.Dotax + } +} + +data class FmKorea(var apageLink : String, + var adesc : String, + var adateTime : String, + var atitle : String, + var athumbnail : String) : Dotax(apageLink, adesc, adateTime, atitle, athumbnail) { + override fun originPage(): String { + return pageLink + } + override fun category(): RssDataType { + return RssDataType.FmKorae + } +} + +fun RssDataInterface.getRssData() : RssData { + return RssData().apply { + title = this@getRssData.title() + description = this@getRssData.description() + originPage = this@getRssData.originPage() + thumbnail = this@getRssData.thumbnailUrl() + pubDate = this@getRssData.pubDate() + category = this@getRssData.category().name + } } \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/Reddit.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/Reddit.kt index 8cf9d9e..ee39b07 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/model/Reddit.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/Reddit.kt @@ -1,16 +1,9 @@ package rasel.lunar.launcher.model import rasel.lunar.launcher.todos.Image -import rasel.lunar.launcher.todos.RssDataItem -import rasel.lunar.launcher.todos.RssDataType import rasel.lunar.launcher.todos.Source -import rasel.lunar.launcher.utils.beforeDay -import java.sql.Date -class Reddit { -} - class Child { var kind: String? = null var data: Data? = null @@ -129,7 +122,7 @@ class CrosspostParentList { var link_flair_template_id: String? = null } -class Data : RssDataItem { +class Data : RssDataInterface { var after: String? = null var dist: Int = 0 var modhash: String? = null @@ -280,6 +273,7 @@ class Data : RssDataItem { override fun category(): RssDataType { return RssDataType.REDDIT } + } class Gif { @@ -362,7 +356,7 @@ class Resolution { var height: Int = 0 } -class Root { +class Reddit { var kind: String? = null var data: Data? = null } diff --git a/app/src/main/kotlin/rasel/lunar/launcher/todos/RssDataItem.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/RssDataInterface.kt similarity index 83% rename from app/src/main/kotlin/rasel/lunar/launcher/todos/RssDataItem.kt rename to app/src/main/kotlin/rasel/lunar/launcher/model/RssDataInterface.kt index 6dc35dc..a34b0e5 100644 --- a/app/src/main/kotlin/rasel/lunar/launcher/todos/RssDataItem.kt +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/RssDataInterface.kt @@ -1,4 +1,4 @@ -package rasel.lunar.launcher.todos +package rasel.lunar.launcher.model enum class RssDataType { NO_DATA, @@ -13,7 +13,7 @@ enum class RssDataType { Arca, } -interface RssDataItem { +interface RssDataInterface { fun title() : String fun thumbnailUrl() : String fun originPage() : String diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/RssItem.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/RssItem.kt new file mode 100644 index 0000000..28daa21 --- /dev/null +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/RssItem.kt @@ -0,0 +1,50 @@ +package rasel.lunar.launcher.model + +class RssItem : RssDataInterface { + var model : String = "" + var title : String = "" + var pageLink : String = "" + var image : String = "" + var tags : String = "" + var date : Long = 0L + + constructor( + model: String, + title: String, + pageLink: String, + image: String, + tags: String, + date: Long + ) { + this.model = model + this.title = title + this.pageLink = pageLink + this.image = image + this.tags = tags + this.date = date + } + + override fun title(): String { + return title + } + + override fun thumbnailUrl(): String { + return image + } + + override fun originPage(): String { + return pageLink + } + + override fun description(): String { + return tags.plus(model) + } + + override fun pubDate(): Long { + return date + } + + override fun category(): RssDataType { + return RssDataType.GURU + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/RssTagItem.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/RssTagItem.kt new file mode 100644 index 0000000..5f12872 --- /dev/null +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/RssTagItem.kt @@ -0,0 +1,41 @@ +package rasel.lunar.launcher.model + +class RssTagItem : RssDataInterface { + var link : String = "" + var tagTitle = "" + var count = 0 + + override fun title(): String { + return tagTitle + } + + override fun thumbnailUrl(): String { + return "" + } + + override fun originPage(): String { + return link + } + + override fun description(): String { + return " " + } + + override fun pubDate(): Long { + return count.toLong() + } + + override fun category(): RssDataType { + return RssDataType.TAGS + } + + constructor(link: String, tagTitle: String) { + this.link = link + this.tagTitle = tagTitle + if (tagTitle.contains("(") && tagTitle.contains(")")) { + try { + count = tagTitle.split("(")[1].split(")")[0].toInt() + }catch (e : Exception) {} + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/rasel/lunar/launcher/model/YoutubeData.kt b/app/src/main/kotlin/rasel/lunar/launcher/model/YoutubeData.kt new file mode 100644 index 0000000..d73d74e --- /dev/null +++ b/app/src/main/kotlin/rasel/lunar/launcher/model/YoutubeData.kt @@ -0,0 +1,1749 @@ +package rasel.lunar.launcher.model + +import org.json.JSONObject +import rasel.lunar.launcher.utils.afterDay +import rasel.lunar.launcher.utils.beforeDay +import java.util.Date + + +// import com.fasterxml.jackson.databind.ObjectMapper; // version 2.11.1 +// import com.fasterxml.jackson.annotation.JsonProperty; // version 2.11.1 +/* ObjectMapper om = new ObjectMapper(); +Root root = om.readValue(myJsonString, Root.class); */ +class A11ySkipNavigationButton { + var buttonRenderer: ButtonRenderer? = null +} + +class Accessibility { + var accessibilityData: AccessibilityData? = null + var label: String? = null +} + +class AccessibilityContext { + var label: String? = null +} + +class AccessibilityData { + var label: String? = null + var accessibilityData: AccessibilityData? = null + var publishedTimeText : PublishedTimeText? = null +} + +class Action { + var clickTrackingParams: String? = null + var addToPlaylistCommand: AddToPlaylistCommand? = null + var action: String? = null + var removedVideoId: String? = null + var openPopupAction: OpenPopupAction? = null + var subscribeButtonViewModel: SubscribeButtonViewModel? = null + var buttonViewModel: ButtonViewModel? = null + var signalAction: SignalAction? = null + var addedVideoId: String? = null + var flexibleActionsViewModel: FlexibleActionsViewModel? = null +} + +class ActionsRow { + var actions: ArrayList? = null +} + +class AdditionalData { + var userFeedbackEndpointProductSpecificValueData: UserFeedbackEndpointProductSpecificValueData? = + null +} + +class AddToPlaylistCommand { + var openMiniplayer: Boolean = false + var videoId: String? = null + var listType: String? = null + var onCreateListCommand: OnCreateListCommand? = null + var videoIds: ArrayList? = null +} + +class AddToPlaylistServiceEndpoint { + var videoId: String? = null +} + +class AttachmentRun { + var startIndex: Int = 0 + var length: Int = 0 + var element: Element? = null + var alignment: String? = null +} + +class Attribution { + var attributionViewModel: AttributionViewModel? = null +} + +class AttributionViewModel { + var text: Text? = null + var suffix: Suffix? = null + var rendererContext: RendererContext? = null +} + +class Avatar { + var decoratedAvatarViewModel: DecoratedAvatarViewModel? = null + var avatarViewModel: AvatarViewModel? = null + var thumbnails: ArrayList? = null + var accessibility: Accessibility? = null +} + +class AvatarViewModel { + var YTBImage: YTBImage? = null + var avatarImageSize: String? = null + var loggingDirectives: LoggingDirectives? = null +} + +class BackButton { + var buttonRenderer: ButtonRenderer? = null +} + +class Badge { + var metadataBadgeRenderer: MetadataBadgeRenderer? = null +} + +class Banner { + var imageBannerViewModel: ImageBannerViewModel? = null +} + +class BellAccessibilityData { + var offLabel: String? = null + var allLabel: String? = null + var occasionalLabel: String? = null + var disabledLabel: String? = null +} + +class BorderImageProcessor { + var circular: Boolean = false +} + +class BrowseEndpoint { + var browseId: String? = null + var params: String? = null + var canonicalBaseUrl: String? = null +} + +class Button { + var menuRenderer: MenuRenderer? = null +} + +class ButtonRenderer { + var style: String? = null + var size: String? = null + var isDisabled: Boolean = false + var icon: Icon? = null + var accessibility: Accessibility? = null + var trackingParams: String? = null + var accessibilityData: AccessibilityData? = null + var command: Command? = null + var text: Text? = null + var serviceEndpoint: ServiceEndpoint? = null + var tooltip: String? = null + var navigationEndpoint: NavigationEndpoint? = null +} + +class ButtonStyle { + var unsubscribedStateStyle: String? = null + var subscribedStateStyle: String? = null + var buttonSize: String? = null +} + +class ButtonText { + var runs: ArrayList? = null +} + +class ButtonViewModel { + var title: String? = null + var onTap: OnTap? = null + var accessibilityText: String? = null + var style: String? = null + var trackingParams: String? = null + var isFullWidth: Boolean = false + var type: String? = null + var buttonSize: String? = null + var state: String? = null + var onVisible: OnVisible? = null + var targetId: String? = null + var loggingDirectives: LoggingDirectives? = null +} + +class CancelButton { + var buttonRenderer: ButtonRenderer? = null +} + +class ChangeEngagementPanelVisibilityAction { + var targetId: String? = null + var visibility: String? = null +} + +class ChannelFeaturedContentRenderer { + var title: Title? = null + var items: ArrayList? = null +} + +class ChannelMetadataRenderer { + var title: String? = null + var description: String? = null + var rssUrl: String? = null + var channelConversionUrl: String? = null + var externalId: String? = null + var keywords: String? = null + var ownerUrls: ArrayList? = null + var avatar: Avatar? = null + var channelUrl: String? = null + var isFamilySafe: Boolean = false + var availableCountryCodes: ArrayList? = null + var androidDeepLink: String? = null + var androidAppindexingLink: String? = null + var iosAppindexingLink: String? = null + var vanityChannelUrl: String? = null +} + +class ChannelThumbnailSupportedRenderers { + var channelThumbnailWithLinkRenderer: ChannelThumbnailWithLinkRenderer? = null +} + +class ChannelThumbnailWithLinkRenderer { + var thumbnail: Thumbnail? = null + var navigationEndpoint: NavigationEndpoint? = null + var accessibility: Accessibility? = null +} + +class ClearButton { + var buttonRenderer: ButtonRenderer? = null +} + +class ClientResource { + var imageName: String? = null +} + +class ClientVeSpec { + var uiType: Int = 0 + var veCounter: Int = 0 +} + +class ColorMap { + var key: String? = null + var value: Any? = null +} + +class Command { + var clickTrackingParams: String? = null + var openPopupAction: OpenPopupAction? = null + var commandMetadata: CommandMetadata? = null + var ypcGetOffersEndpoint: YpcGetOffersEndpoint? = null + var logFlowLoggingEventCommand: LogFlowLoggingEventCommand? = null +} + +class Command10 { + var clickTrackingParams: String? = null + var commandMetadata: CommandMetadata? = null + var signalServiceEndpoint: SignalServiceEndpoint? = null + var changeEngagementPanelVisibilityAction: ChangeEngagementPanelVisibilityAction? = null +} + +class CommandContext { + var onTap: OnTap? = null +} + +class CommandExecutorCommand { + var commands: ArrayList? = null +} + +class CommandMetadata { + var webCommandMetadata: WebCommandMetadata? = null +} + +class CommandRun { + var startIndex: Int = 0 + var length: Int = 0 + var onTap: OnTap? = null +} + +class CommonConfig { + var url: String? = null +} + +class CompactLinkRenderer { + var icon: Icon? = null + var title: Title? = null + var navigationEndpoint: NavigationEndpoint? = null + var trackingParams: String? = null + var style: String? = null +} + +class Config { + var webSearchboxConfig: WebSearchboxConfig? = null +} + +class ConfirmButton { + var buttonRenderer: ButtonRenderer? = null +} + +class ConfirmDialogRenderer { + var trackingParams: String? = null + var dialogMessages: ArrayList? = null + var confirmButton: ConfirmButton? = null + var cancelButton: CancelButton? = null + var primaryIsCancel: Boolean = false +} + +class ConnectionErrorHeader { + var runs: ArrayList? = null +} + +class ConnectionErrorMicrophoneLabel { + var runs: ArrayList? = null +} + +class Content : Content14() { + var sectionListRenderer: SectionListRenderer? = null + var horizontalListRenderer: HorizontalListRenderer? = null + var pageHeaderViewModel: PageHeaderViewModel? = null + var verticalListRenderer: HorizontalListRenderer? = null + var listViewModel: ListViewModel? = null +} + +open class Content14 { + var itemSectionRenderer: ItemSectionRenderer? = null + var continuationItemRenderer: ContinuationItemRenderer? = null + var channelFeaturedContentRenderer: ChannelFeaturedContentRenderer? = null + var shelfRenderer: ShelfRenderer? = null + var reelShelfRenderer: ReelShelfRenderer? = null + var twoColumnBrowseResultsRenderer: TwoColumnBrowseResultsRenderer? = null + var singleColumnBrowseResultsRenderer : TwoColumnBrowseResultsRenderer? = null +} + +class ContentMetadataViewModel { + var metadataRows: ArrayList? = null + var delimiter: String? = null + var rendererContext: RendererContext? = null +} + +class ContinuationCommand { + var token: String? = null + var request: String? = null +} + +class ContinuationEndpoint { + var clickTrackingParams: String? = null + var commandMetadata: CommandMetadata? = null + var continuationCommand: ContinuationCommand? = null +} + +class ContinuationItemRenderer { + var trigger: String? = null + var continuationEndpoint: ContinuationEndpoint? = null +} + +class CreatePlaylistServiceEndpoint { + var videoIds: ArrayList? = null + var params: String? = null +} + +class DecoratedAvatarViewModel { + var avatar: Avatar? = null + var a11yLabel: String? = null + var rendererContext: RendererContext? = null +} + +class Description { + var descriptionPreviewViewModel: DescriptionPreviewViewModel? = null + var content: String? = null +} + +class DescriptionPreviewViewModel { + var description: Description? = null + var maxLines: Int = 0 + var truncationText: TruncationText? = null + var alwaysShowTruncationText: Boolean = false + var rendererContext: RendererContext? = null +} + +class DescriptionSnippet { + var runs: ArrayList? = null +} + +class DesktopTopbarRenderer { + var logo: Logo? = null + var searchbox: Searchbox? = null + var trackingParams: String? = null + var countryCode: String? = null + var topbarButtons: ArrayList? = null + var hotkeyDialog: HotkeyDialog? = null + var backButton: BackButton? = null + var forwardButton: ForwardButton? = null + var a11ySkipNavigationButton: A11ySkipNavigationButton? = null + var voiceSearchButton: VoiceSearchButton? = null +} + +class DialogMessage { + var runs: ArrayList? = null +} + +class DisabledHeader { + var runs: ArrayList? = null +} + +class DisabledSubtext { + var runs: ArrayList? = null +} + +class DismissButton { + var buttonRenderer: ButtonRenderer? = null +} + +class DynamicTextViewModel { + var text: Text? = null + var maxLines: Int = 0 + var rendererContext: RendererContext? = null +} + +class Element { + var type: Type? = null + var properties: Properties? = null +} + +class Endpoint { + var clickTrackingParams: String? = null + var commandMetadata: CommandMetadata? = null + var browseEndpoint: BrowseEndpoint? = null + var showEngagementPanelEndpoint: ShowEngagementPanelEndpoint? = null +} + +class EngagementPanel { + var engagementPanelSectionListRenderer: EngagementPanelSectionListRenderer? = null +} + +class EngagementPanelPopupPresentationConfig { + var popupType: String? = null +} + +class EngagementPanelPresentationConfigs { + var engagementPanelPopupPresentationConfig: EngagementPanelPopupPresentationConfig? = null +} + +class EngagementPanelSectionListRenderer { + var header: Header? = null + var content: Content? = null + var targetId: String? = null + var identifier: Identifier? = null + var size: String? = null +} + +class EngagementPanelTitleHeaderRenderer { + var title: Title? = null + var visibilityButton: VisibilityButton? = null + var trackingParams: String? = null +} + +class EntityBatchUpdate { + var mutations: ArrayList? = null + var timestamp: Timestamp? = null +} + +class ExampleQuery1 { + var runs: ArrayList? = null +} + +class ExampleQuery2 { + var runs: ArrayList? = null +} + +class ExitButton { + var buttonRenderer: ButtonRenderer? = null +} + +class ExpandableTabRenderer { + var endpoint: Endpoint? = null + var title: String? = null + var selected: Boolean = false +} + +class FlexibleActionsViewModel { + var actionsRows: ArrayList? = null + var minimumRowHeight: Int = 0 + var rendererContext: RendererContext? = null +} + +class FlowEventMetadata { + var sponsorshipsPurchaseContext: SponsorshipsPurchaseContext? = null +} + +class ForwardButton { + var buttonRenderer: ButtonRenderer? = null +} + +class FrameworkUpdates { + var entityBatchUpdate: EntityBatchUpdate? = null +} + +class FusionSearchboxRenderer { + var icon: Icon? = null + var placeholderText: PlaceholderText? = null + var config: Config? = null + var trackingParams: String? = null + var searchEndpoint: SearchEndpoint? = null + var clearButton: ClearButton? = null +} + +class GetDownloadActionCommand { + var videoId: String? = null + var params: String? = null +} + +class GridChannelRenderer { + var channelId: String? = null + var thumbnail: Thumbnail? = null + var videoCountText: VideoCountText? = null + var subscriberCountText: SubscriberCountText? = null + var navigationEndpoint: NavigationEndpoint? = null + var title: Title? = null + var subscribeButton: SubscribeButton? = null + var trackingParams: String? = null +} + +class GridVideoRenderer : VideoRenderer() { + // var videoId: String? = null +// var thumbnail: Thumbnail? = null +// var title: Title? = null +// var publishedTimeText: PublishedTimeText? = null +// var navigationEndpoint: NavigationEndpoint? = null + var badges: ArrayList? = null + // var ownerBadges: ArrayList? = null +// var trackingParams: String? = null +// var menu: Menu? = null +// var thumbnailOverlays: ArrayList? = null +// var viewCountText: ViewCountText? = null +// var shortViewCountText: ShortViewCountText? = null + var richThumbnail: RichThumbnail? = null +// var shortBylineText: ShortBylineText? = null +} + +class Header { + var engagementPanelTitleHeaderRenderer: EngagementPanelTitleHeaderRenderer? = null + var pageHeaderRenderer: PageHeaderRenderer? = null +} + +class Headline { + var simpleText: String? = null +} + +class Height { + var value: Int = 0 + var unit: String? = null +} + +class HorizontalListRenderer { + var items: ArrayList? = null + var trackingParams: String? = null + var visibleItemCount: Int = 0 + var nextButton: NextButton? = null + var previousButton: PreviousButton? = null + var collapsedItemCount: Int = 0 + var itemSizeConstraint: String? = null +} + +class HotkeyAccessibilityLabel { + var accessibilityData: AccessibilityData? = null +} + +class HotkeyDialog { + var hotkeyDialogRenderer: HotkeyDialogRenderer? = null +} + +class HotkeyDialogRenderer { + var title: Title? = null + var sections: ArrayList
    ? = null + var dismissButton: DismissButton? = null + var trackingParams: String? = null +} + +class HotkeyDialogSectionOptionRenderer { + var label: Label? = null + var hotkey: String? = null + var hotkeyAccessibilityLabel: HotkeyAccessibilityLabel? = null +} + +class HotkeyDialogSectionRenderer { + var title: Title? = null + var options: ArrayList