..
This commit is contained in:
parent
520350f9d1
commit
b5bbf299bd
@ -103,44 +103,50 @@ android {
|
|||||||
jvmTarget = "1.8"
|
jvmTarget = "1.8"
|
||||||
}
|
}
|
||||||
ndkVersion = "29.0.13846066 rc3"
|
ndkVersion = "29.0.13846066 rc3"
|
||||||
buildToolsVersion = "35.0.1"
|
// buildToolsVersion = "35.0.1"
|
||||||
|
packaging {
|
||||||
|
doNotStrip("**/libaria2c.zip.so")
|
||||||
|
doNotStrip("**/libffmpeg.zip.so")
|
||||||
|
doNotStrip("**/libpython.zip.so")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
val kotlinVersion: String? by extra
|
val kotlinVersion: String? by extra
|
||||||
implementation ("androidx.appcompat:appcompat:1.7.0")
|
val realmVersion = "2.0.0"
|
||||||
|
implementation ("androidx.appcompat:appcompat:1.7.1")
|
||||||
implementation ("androidx.biometric:biometric-ktx:1.2.0-alpha05")
|
implementation ("androidx.biometric:biometric-ktx:1.2.0-alpha05")
|
||||||
implementation ("androidx.browser:browser:1.8.0")
|
implementation ("androidx.browser:browser:1.8.0")
|
||||||
implementation ("androidx.core:core-ktx:1.15.0")
|
implementation ("androidx.core:core-ktx:1.15.0")
|
||||||
implementation ("androidx.core:core-splashscreen:1.0.1")
|
implementation ("androidx.core:core-splashscreen:1.0.1")
|
||||||
implementation ("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7")
|
implementation ("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7")
|
||||||
implementation ("com.google.android.material:material:1.12.0")
|
implementation ("com.google.android.material:material:1.12.0")
|
||||||
implementation ("com.ibm.icu:icu4j:68.1")
|
implementation ("com.ibm.icu:icu4j:77.1")
|
||||||
implementation (kotlin("stdlib", version = kotlinVersion))
|
implementation (kotlin("stdlib", version = "2.0.10"))
|
||||||
implementation ("com.github.cachapa:ExpandableLayout:2.9.2")
|
implementation ("com.github.cachapa:ExpandableLayout:2.9.2")
|
||||||
|
|
||||||
implementation ("androidx.work:work-runtime:2.10.0")
|
implementation ("androidx.work:work-runtime:2.10.0")
|
||||||
implementation ("com.google.code.gson:gson:2.11.0")
|
implementation ("com.google.code.gson:gson:2.13.1")
|
||||||
implementation ("io.realm.kotlin:library-base:2.1.0")
|
implementation ("io.realm.kotlin:library-base:${realmVersion}")
|
||||||
implementation ("org.jsoup:jsoup:1.18.1")
|
implementation ("org.jsoup:jsoup:1.21.2")
|
||||||
implementation ("org.apache.commons:commons-text:1.12.0")
|
implementation ("org.apache.commons:commons-text:1.14.0")
|
||||||
implementation("com.squareup.okhttp:okhttp:2.7.5")
|
implementation("com.squareup.okhttp:okhttp:2.7.5")
|
||||||
implementation("com.google.android.gms:play-services-location:21.3.0")
|
implementation("com.google.android.gms:play-services-location:21.3.0")
|
||||||
implementation("com.google.android.gms:play-services-tasks:18.2.0")
|
implementation("com.google.android.gms:play-services-tasks:18.3.2")
|
||||||
implementation("com.squareup.retrofit2:retrofit:2.9.0")
|
implementation("com.squareup.retrofit2:retrofit:3.0.0")
|
||||||
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
|
implementation("com.squareup.retrofit2:converter-gson:3.0.0")
|
||||||
implementation("com.squareup.retrofit2:converter-scalars:2.6.4")
|
implementation("com.squareup.retrofit2:converter-scalars:3.0.0")
|
||||||
implementation("androidx.viewpager2:viewpager2:1.1.0")
|
implementation("androidx.viewpager2:viewpager2:1.1.0")
|
||||||
implementation("com.squareup.picasso:picasso:2.71828")
|
implementation("com.squareup.picasso:picasso:2.71828")
|
||||||
implementation("com.github.delight-im:Android-AdvancedWebView:v3.2.1")
|
implementation("com.github.delight-im:Android-AdvancedWebView:v3.2.1")
|
||||||
implementation(project(":library"))
|
// implementation(project(":library"))
|
||||||
implementation(project(":utils"))
|
// implementation(project(":utils"))
|
||||||
implementation( "com.github.bumptech.glide:glide:4.11.0")
|
implementation( "com.github.bumptech.glide:glide:4.11.0")
|
||||||
|
implementation ("com.github.bumptech.glide:okhttp3-integration:4.11.0")
|
||||||
// implementation("org.mozilla.geckoview:geckoview:139.0.20250523173407")
|
// implementation("org.mozilla.geckoview:geckoview:139.0.20250523173407")
|
||||||
// https://mvnrepository.com/artifact/org.mozilla.geckoview/geckoview
|
// https://mvnrepository.com/artifact/org.mozilla.geckoview/geckoview
|
||||||
implementation("org.mozilla.geckoview:geckoview:139.0.20250523173407")
|
implementation("org.mozilla.geckoview:geckoview:139.0.20250523173407")
|
||||||
implementation("com.vladsch.flexmark:flexmark-all:0.64.0")
|
implementation("com.vladsch.flexmark:flexmark-all:0.64.8")
|
||||||
// implementation 'com.vladsch.flexmark:flexmark-all:0.64.8'
|
// implementation 'com.vladsch.flexmark:flexmark-all:0.64.8'
|
||||||
// implementation("org.opencv:opencv-android:4.11.0")
|
// implementation("org.opencv:opencv-android:4.11.0")
|
||||||
// build.gradle에 추가
|
// build.gradle에 추가
|
||||||
@ -162,5 +168,22 @@ dependencies {
|
|||||||
// implementation ("me.everything:providers-core:1.0.1")
|
// implementation ("me.everything:providers-core:1.0.1")
|
||||||
// implementation ("androidx.window:window:1.0.0")
|
// implementation ("androidx.window:window:1.0.0")
|
||||||
// implementation("io.github.vaneproject:hanguleditor:1.0.0")
|
// implementation("io.github.vaneproject:hanguleditor:1.0.0")
|
||||||
|
constraints {
|
||||||
|
// ⚠️ 이 버전을 프로젝트 루트의 build.gradle.kts에 정의된 kotlinVersion 값과 정확히 일치시키세요.
|
||||||
|
val targetKotlinVersion = "2.0.20"
|
||||||
|
|
||||||
|
implementation("org.jetbrains.kotlin:kotlin-stdlib") {
|
||||||
|
version { strictly(targetKotlinVersion) }
|
||||||
|
// reason = "Align all Kotlin stdlib versions with the compiler plugin version"
|
||||||
|
}
|
||||||
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") {
|
||||||
|
version { strictly(targetKotlinVersion) }
|
||||||
|
// reason = "Align all Kotlin stdlib versions with the compiler plugin version"
|
||||||
|
}
|
||||||
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-common") {
|
||||||
|
version { strictly(targetKotlinVersion) }
|
||||||
|
// reason = "Align all Kotlin stdlib versions with the compiler plugin version"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fun getDateTime() = SimpleDateFormat("yyyyMMddHHmm").format(Date()).toLong()
|
fun getDateTime() = SimpleDateFormat("yyyyMMddHHmm").format(Date()).toLong()
|
||||||
|
|||||||
@ -55,7 +55,7 @@
|
|||||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
||||||
|
|
||||||
<!-- <queries>-->
|
<!-- <queries>-->
|
||||||
<!-- <intent>-->
|
<!-- <intent>-->
|
||||||
|
|||||||
@ -63,3 +63,13 @@
|
|||||||
//// browser.runtime.sendMessage({ type: 'RELOAD_REQUEST' });
|
//// browser.runtime.sendMessage({ type: 'RELOAD_REQUEST' });
|
||||||
//// }
|
//// }
|
||||||
////});
|
////});
|
||||||
|
|
||||||
|
browser.webRequest.onBeforeRequest.addListener(
|
||||||
|
function(details) {
|
||||||
|
console.log("Request intercepted for URL:", details.url);
|
||||||
|
// 이 예시는 단순히 로그를 남기므로 요청을 변경하거나 차단하지 않음
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
{urls: ["<all_urls>"]}, // 모든 URL에 대해 요청 듣기
|
||||||
|
[]
|
||||||
|
);
|
||||||
@ -316,7 +316,9 @@ if (keywords.every(keyword => !url.includes(keyword))) {
|
|||||||
document.addEventListener('touchend', function(e) {
|
document.addEventListener('touchend', function(e) {
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
autoScrollAndSave();
|
if(location.href.search("ijavtorrent") < 0) {
|
||||||
|
autoScrollAndSave();
|
||||||
|
}
|
||||||
}, 5);
|
}, 5);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -468,9 +470,9 @@ function ytDown() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleCommon() {
|
async function handleCommon() {
|
||||||
// 공통 광고 제거
|
// 공통 광고 제거
|
||||||
alert(JSON.stringify({COOKIES : document.cookie}))
|
alert(JSON.stringify({COOKIES: document.cookie}))
|
||||||
if (document.querySelector(".top_google_ad_space")) document.querySelector(".top_google_ad_space").remove();
|
if (document.querySelector(".top_google_ad_space")) document.querySelector(".top_google_ad_space").remove();
|
||||||
document.querySelectorAll(".adv-group, [id^='div-gpt-ad'], [id^='div_adnmore_area'], [class^='adv-groupno'], [class^='code-block'], .ad-template").forEach(e => e.remove());
|
document.querySelectorAll(".adv-group, [id^='div-gpt-ad'], [id^='div_adnmore_area'], [class^='adv-groupno'], [class^='code-block'], .ad-template").forEach(e => e.remove());
|
||||||
if (document.querySelector('#xpromo-bottom-sheet')) document.querySelector('#xpromo-bottom-sheet').remove();
|
if (document.querySelector('#xpromo-bottom-sheet')) document.querySelector('#xpromo-bottom-sheet').remove();
|
||||||
@ -495,8 +497,11 @@ function handleCommon() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (location.href.search("javt") > -1 &&document.querySelectorAll('[class^="col-md-4 mb-4 video-item"]').length > 1) {
|
if (location.href.search("javt") > -1 && document.querySelectorAll('[class^="col-md-4 mb-4 video-item"]').length > 1) {
|
||||||
|
|
||||||
|
|
||||||
var datas = []
|
var datas = []
|
||||||
|
|
||||||
document.querySelectorAll('[class^="col-md-4 mb-4 video-item"]').forEach(function (e) {
|
document.querySelectorAll('[class^="col-md-4 mb-4 video-item"]').forEach(function (e) {
|
||||||
var date = 0
|
var date = 0
|
||||||
try {
|
try {
|
||||||
@ -609,11 +614,39 @@ function handleCommon() {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
gotoNext()
|
// gotoNext()
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(location.href.search("javt")) {
|
||||||
|
console.log(`Found TEST`);
|
||||||
|
const imageSelector = 'img[class*="mw-100"][src*="images"]';
|
||||||
|
const images = Array.from(document.querySelectorAll(imageSelector));
|
||||||
|
console.log(`Found ${images}`);
|
||||||
|
if (images.length > 0) {
|
||||||
|
const validImageUrls = images.map(img => img.src)
|
||||||
|
.filter(src => src && src.startsWith('http'));
|
||||||
|
const uniqueUrls = [...new Set(validImageUrls)];
|
||||||
|
|
||||||
|
console.log(`Found ${'$'}{uniqueUrls.length} unique images to cache.`);
|
||||||
|
|
||||||
|
// 3. 각 URL을 순회하며 Base64로 변환하고 즉시 네이티브로 전송
|
||||||
|
// (모든 작업을 병렬로 처리하지 않고 순차적(또는 하나씩)으로 보내 메모리 부담을 줄임)
|
||||||
|
for (const url of uniqueUrls) {
|
||||||
|
const base64Data = await getBase64FromUrl(url);
|
||||||
|
if (base64Data) {
|
||||||
|
// 이미지 하나를 성공할 때마다 네이티브로 즉시 전송
|
||||||
|
sendMessage({
|
||||||
|
type: "SINGLE_IMAGE_DATA",
|
||||||
|
imgSrc: url,
|
||||||
|
base64Data: base64Data
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (window.scrollY < 5) {
|
if (window.scrollY < 5) {
|
||||||
console.log("window.scrollY >>> " + window.scrollY)
|
console.log("window.scrollY >>> " + window.scrollY)
|
||||||
window.scrollTo({ top: 5, behavior: 'smooth' });
|
window.scrollTo({top: 5, behavior: 'smooth'});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -642,7 +675,7 @@ function handleToreentZota() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
var description = e.querySelector('.flex-none w-16 text-center').textContent + e.querySelector('.badge badge-third w-auto px-1 flex-none mr-2 float-left').textContent
|
var description = e.querySelector('.flex-none w-16 text-center').textContent + e.querySelector('.badge badge-third w-auto px-1 flex-none mr-2 float-left').textContent
|
||||||
var md = e.querySelector(".flex-none w-14 text-center hidden md:block").textContent
|
var md = e.querySelector(".flex-none w-14 text-center hidden md").textContent
|
||||||
|
|
||||||
let todayYear = new Date().getFullYear();
|
let todayYear = new Date().getFullYear();
|
||||||
let now = new Date();
|
let now = new Date();
|
||||||
@ -907,3 +940,22 @@ function autoScrollAndHandleDotax() {
|
|||||||
// scrollAndSend();
|
// scrollAndSend();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getBase64FromUrl(url) {
|
||||||
|
try {
|
||||||
|
const response = await fetch(url);
|
||||||
|
const blob = await response.blob();
|
||||||
|
|
||||||
|
// FileReader를 사용해 Blob을 Data URL (Base64)로 변환
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onloadend = () => resolve(reader.result); // 결과 예: "data:image/png;base64,iVBORw0..."
|
||||||
|
reader.onerror = reject;
|
||||||
|
reader.readAsDataURL(blob);
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Base64 conversion error for:", url, e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -15,16 +15,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package bums.lunatic.launcher
|
package bums.lunatic.launcher
|
||||||
|
|
||||||
//import rasel.lunar.launcher.home.LauncherHome.Companion.rssSet
|
//import kr.lunaticbum.utils.ui.DisplayUtil
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.app.SearchManager
|
import android.app.SearchManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
@ -44,7 +41,6 @@ import android.view.KeyEvent.KEYCODE_DPAD_UP
|
|||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.PointerIcon
|
import android.view.PointerIcon
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.WindowInsets
|
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import androidx.activity.OnBackPressedCallback
|
import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
@ -55,16 +51,12 @@ import androidx.core.view.WindowInsetsCompat
|
|||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.core.view.updatePadding
|
import androidx.core.view.updatePadding
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
|
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
|
||||||
import bums.lunatic.launcher.apps.AppDrawer
|
|
||||||
import bums.lunatic.launcher.common.CommonActivity
|
import bums.lunatic.launcher.common.CommonActivity
|
||||||
import bums.lunatic.launcher.databinding.LauncherActivityBinding
|
import bums.lunatic.launcher.databinding.LauncherActivityBinding
|
||||||
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_STATUS_BAR
|
|
||||||
import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SETTINGS
|
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService
|
import bums.lunatic.launcher.helpers.ForeGroundService
|
||||||
import bums.lunatic.launcher.helpers.HeadsetActionButtonReceiver
|
import bums.lunatic.launcher.helpers.HeadsetActionButtonReceiver
|
||||||
import bums.lunatic.launcher.home.GeckoWeb
|
import bums.lunatic.launcher.home.GeckoWeb
|
||||||
import bums.lunatic.launcher.home.RssHome
|
import bums.lunatic.launcher.home.RssHome
|
||||||
import bums.lunatic.launcher.home.RssViewBuilder
|
|
||||||
import bums.lunatic.launcher.model.RssData
|
import bums.lunatic.launcher.model.RssData
|
||||||
import bums.lunatic.launcher.model.RssDataType
|
import bums.lunatic.launcher.model.RssDataType
|
||||||
import bums.lunatic.launcher.receiver.NLService
|
import bums.lunatic.launcher.receiver.NLService
|
||||||
@ -78,11 +70,8 @@ import bums.lunatic.launcher.tokiz.Webtoons
|
|||||||
import bums.lunatic.launcher.tokiz.YouTube
|
import bums.lunatic.launcher.tokiz.YouTube
|
||||||
import bums.lunatic.launcher.tokiz.Zota
|
import bums.lunatic.launcher.tokiz.Zota
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import bums.lunatic.launcher.utils.KakaoPublicTransfer
|
|
||||||
import bums.lunatic.launcher.workers.WorkersDb
|
import bums.lunatic.launcher.workers.WorkersDb
|
||||||
import com.google.android.gms.common.util.DataUtils
|
|
||||||
import com.google.android.material.color.DynamicColors
|
import com.google.android.material.color.DynamicColors
|
||||||
import com.google.gson.Gson
|
|
||||||
import com.yausername.ffmpeg.FFmpeg
|
import com.yausername.ffmpeg.FFmpeg
|
||||||
import com.yausername.youtubedl_android.YoutubeDL
|
import com.yausername.youtubedl_android.YoutubeDL
|
||||||
import com.yausername.youtubedl_android.YoutubeDLException
|
import com.yausername.youtubedl_android.YoutubeDLException
|
||||||
@ -90,9 +79,7 @@ import io.realm.kotlin.ext.query
|
|||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kr.lunaticbum.utils.ui.DisplayUtil
|
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import org.jsoup.helper.DataUtil
|
|
||||||
import org.mozilla.geckoview.ExperimentDelegate
|
import org.mozilla.geckoview.ExperimentDelegate
|
||||||
import org.mozilla.geckoview.GeckoResult
|
import org.mozilla.geckoview.GeckoResult
|
||||||
import org.mozilla.geckoview.GeckoRuntime
|
import org.mozilla.geckoview.GeckoRuntime
|
||||||
@ -122,7 +109,7 @@ open class LauncherActivity : CommonActivity() {
|
|||||||
var hiddenLoader : HashMap<String,GeckoWeb> = hashMapOf()
|
var hiddenLoader : HashMap<String,GeckoWeb> = hashMapOf()
|
||||||
fun contentsLoad(url : String){
|
fun contentsLoad(url : String){
|
||||||
if (isDestroyed == false && isFinishing == false) {
|
if (isDestroyed == false && isFinishing == false) {
|
||||||
Uri.parse(url).host?.let { host ->
|
url.toUri()?.host?.let { host ->
|
||||||
if (!hiddenLoader.contains(host)) {
|
if (!hiddenLoader.contains(host)) {
|
||||||
GeckoWeb(this).apply {
|
GeckoWeb(this).apply {
|
||||||
LunaticLauncher.mHourlyLogWriter?.writeLog("contentsLoad FIRST_LOAD$host")
|
LunaticLauncher.mHourlyLogWriter?.writeLog("contentsLoad FIRST_LOAD$host")
|
||||||
@ -168,13 +155,13 @@ open class LauncherActivity : CommonActivity() {
|
|||||||
KEYCODE_BUTTON_A->{
|
KEYCODE_BUTTON_A->{
|
||||||
WorkersDb.getRealm().apply {
|
WorkersDb.getRealm().apply {
|
||||||
writeBlocking {
|
writeBlocking {
|
||||||
var ddd = copyFromRealm(WorkersDb.getRssQuery("", arrayListOf(),false).limit(100).query("read == $0", 0).query("vote != $0", true).find()).map { it.originPage() }
|
// var ddd = copyFromRealm(WorkersDb.getRssQuery("", arrayListOf(),false).limit(100).query("read == $0", 0).query("vote != $0", true).find()).map { it.originPage() }
|
||||||
var origin = ddd.first()
|
// var origin = ddd.first()
|
||||||
RssViewBuilder(lActivity!!)
|
// RssViewBuilder(lActivity!!)
|
||||||
.setRssList(arrayListOf<String>().apply { this.addAll(ddd) })
|
// .setRssList(arrayListOf<String>().apply { this.addAll(ddd) })
|
||||||
.setRssId(origin)
|
// .setRssId(origin)
|
||||||
.showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
|
// .showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
|
||||||
.show(origin)
|
// .show(origin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -195,15 +182,15 @@ open class LauncherActivity : CommonActivity() {
|
|||||||
writeBlocking {
|
writeBlocking {
|
||||||
var ddd = copyFromRealm(WorkersDb.getVotedRss().limit(100).find()).map { it.originPage() }
|
var ddd = copyFromRealm(WorkersDb.getVotedRss().limit(100).find()).map { it.originPage() }
|
||||||
var origin = ddd.first()
|
var origin = ddd.first()
|
||||||
RssViewBuilder(lActivity!!)
|
// RssViewBuilder(lActivity!!)
|
||||||
.setRssList(arrayListOf<String>().apply {
|
// .setRssList(arrayListOf<String>().apply {
|
||||||
var jjjj = hashSetOf<String>()
|
// var jjjj = hashSetOf<String>()
|
||||||
jjjj.addAll(ddd)
|
// jjjj.addAll(ddd)
|
||||||
this.addAll(jjjj)}
|
// this.addAll(jjjj)}
|
||||||
)
|
// )
|
||||||
.setRssId(origin)
|
// .setRssId(origin)
|
||||||
.showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
|
// .showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
|
||||||
.show(origin)
|
// .show(origin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -279,12 +266,12 @@ open class LauncherActivity : CommonActivity() {
|
|||||||
var origin = ddd.first()
|
var origin = ddd.first()
|
||||||
var jjjj = hashSetOf<String>()
|
var jjjj = hashSetOf<String>()
|
||||||
jjjj.addAll(ddd)
|
jjjj.addAll(ddd)
|
||||||
RssViewBuilder(lActivity!!)
|
// RssViewBuilder(lActivity!!)
|
||||||
.setRssList(arrayListOf<String>().apply {
|
// .setRssList(arrayListOf<String>().apply {
|
||||||
this.addAll(jjjj)})
|
// this.addAll(jjjj)})
|
||||||
.setRssId(origin)
|
// .setRssId(origin)
|
||||||
.showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
|
// .showIconClose(true).showIconBack(false).showProgressBar(true).backPressToClose(false).webViewMixedContentMode(1)
|
||||||
.show(origin)
|
// .show(origin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -312,8 +299,8 @@ open class LauncherActivity : CommonActivity() {
|
|||||||
}
|
}
|
||||||
MotionEvent.ACTION_BUTTON_RELEASE -> {
|
MotionEvent.ACTION_BUTTON_RELEASE -> {
|
||||||
if (actionButtonPressX == ev.x && actionButtonPressY == ev.y) {
|
if (actionButtonPressX == ev.x && actionButtonPressY == ev.y) {
|
||||||
Blog.LOGE("DisplayUtil.width >>> ${DisplayUtil.width} ${actionButtonPressX}")
|
// Blog.LOGE("DisplayUtil.width >>> ${DisplayUtil.width} ${actionButtonPressX}")
|
||||||
Blog.LOGE("DisplayUtil.width >>> ${DisplayUtil.height} ${actionButtonPressY}")
|
// Blog.LOGE("DisplayUtil.width >>> ${DisplayUtil.height} ${actionButtonPressY}")
|
||||||
if(actionButtonPressX.toInt() == 480 && actionButtonPressY < 2000) {
|
if(actionButtonPressX.toInt() == 480 && actionButtonPressY < 2000) {
|
||||||
Blog.LOGE("Arrow Center Click")
|
Blog.LOGE("Arrow Center Click")
|
||||||
onClickCenterButton()
|
onClickCenterButton()
|
||||||
@ -356,7 +343,7 @@ open class LauncherActivity : CommonActivity() {
|
|||||||
showContents(v.id)
|
showContents(v.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onNewIntent(intent: Intent?) {
|
override fun onNewIntent(intent: Intent) {
|
||||||
Blog.LOGE("onNewIntent intent >> ${intent}")
|
Blog.LOGE("onNewIntent intent >> ${intent}")
|
||||||
if(intent?.action?.equals(Intent.ACTION_SEND) == true &&
|
if(intent?.action?.equals(Intent.ACTION_SEND) == true &&
|
||||||
intent?.hasExtra(Intent.EXTRA_TEXT) == true) {
|
intent?.hasExtra(Intent.EXTRA_TEXT) == true) {
|
||||||
|
|||||||
@ -21,20 +21,16 @@ package bums.lunatic.launcher
|
|||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.content.ComponentCallbacks2
|
import android.content.ComponentCallbacks2
|
||||||
import android.database.sqlite.SQLiteDatabase
|
import android.database.sqlite.SQLiteDatabase
|
||||||
import android.net.Uri
|
|
||||||
import android.view.PixelCopy.request
|
|
||||||
import bums.lunatic.launcher.helpers.HourlyLogWriter
|
import bums.lunatic.launcher.helpers.HourlyLogWriter
|
||||||
import bums.lunatic.launcher.helpers.PrefHelper
|
import bums.lunatic.launcher.helpers.PrefHelper
|
||||||
|
import bums.lunatic.launcher.home.Base64RequestHandler
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import com.squareup.picasso.OkHttp3Downloader
|
import com.squareup.picasso.OkHttp3Downloader
|
||||||
import com.squareup.picasso.Picasso
|
import com.squareup.picasso.Picasso
|
||||||
import kr.lunaticbum.Base
|
|
||||||
import okhttp3.Cache
|
import okhttp3.Cache
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.logging.HttpLoggingInterceptor
|
import okhttp3.logging.HttpLoggingInterceptor
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
|
||||||
import java.net.HttpURLConnection
|
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
|
||||||
@ -47,7 +43,7 @@ internal class LunaticLauncher : Application() {
|
|||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
appContext = this
|
appContext = this
|
||||||
Base.initialize(this)
|
// Base.initialize(this)
|
||||||
PrefHelper.initialize(this)
|
PrefHelper.initialize(this)
|
||||||
val dir = File("/storage/emulated/0/bums_ob/BUM'S PACED /scraped/logs")
|
val dir = File("/storage/emulated/0/bums_ob/BUM'S PACED /scraped/logs")
|
||||||
///BUM'S PACED/pdfs
|
///BUM'S PACED/pdfs
|
||||||
@ -64,33 +60,40 @@ internal class LunaticLauncher : Application() {
|
|||||||
val cache = Cache(File(this.filesDir, "picasso-cache"), cacheSize)
|
val cache = Cache(File(this.filesDir, "picasso-cache"), cacheSize)
|
||||||
val okHttpClient = OkHttpClient.Builder()
|
val okHttpClient = OkHttpClient.Builder()
|
||||||
.cache(cache)
|
.cache(cache)
|
||||||
.addInterceptor(logging)
|
|
||||||
.addInterceptor { chain ->
|
.addInterceptor { chain ->
|
||||||
var request = chain.request()
|
var request = chain.request()
|
||||||
val cacheControl = request.header("Cache-Control")
|
val isA = request.url.host.contains("ijavtorrent")
|
||||||
if (cacheControl?.contains("only-if-cached") == true) {
|
val host = if (request.url.host.contains("ijavtorrent")) {
|
||||||
val newCacheControl = cacheControl.replace("only-if-cached", "")
|
"ijavtorrent.com"
|
||||||
.trim()
|
} else {
|
||||||
.ifEmpty { "max-stale=2419200" }
|
chain.request().url.host
|
||||||
request = request.newBuilder()
|
|
||||||
.header("Cache-Control", newCacheControl)
|
|
||||||
.build()
|
|
||||||
}
|
}
|
||||||
val host = chain.request().url.host
|
val newRequestBuilder = request.newBuilder().addHeader("authority",host)
|
||||||
val newRequest = chain.request().newBuilder().addHeader("authority",host)
|
|
||||||
.addHeader("Host",host)
|
.addHeader("Host",host)
|
||||||
.addHeader("User-Agent","Mozilla/5.0 (Android 15; Mobile; rv:139.0) Gecko/139.0 Firefox/139.0")
|
// .addHeader("User-Agent","Mozilla/5.0 (Android 15; Mobile; rv:139.0) Gecko/139.0 Firefox/139.0")
|
||||||
.addHeader("Accept","image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5")
|
.addHeader("Accept",if (isA == false) {
|
||||||
|
"image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5"
|
||||||
|
} else {
|
||||||
|
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
|
||||||
|
})
|
||||||
.addHeader("Accept-Language","ko-KR,en-US;q=0.5")
|
.addHeader("Accept-Language","ko-KR,en-US;q=0.5")
|
||||||
.addHeader("Accept-Encoding","gzip, deflate, br, zstd")
|
.addHeader("Accept-Encoding","gzip, deflate, br, zstd")
|
||||||
.addHeader("Referer",host)
|
.addHeader("Referer",host)
|
||||||
.build()
|
// .removeHeader("Cache-Control")
|
||||||
|
// if (isA) {
|
||||||
|
//// newRequestBuilder.addHeader("sec-ch-ua-platform","macOS")
|
||||||
|
// newRequestBuilder.addHeader("sec-fetch-dest","document")
|
||||||
|
// newRequestBuilder.addHeader("sec-fetch-mode","navigate")
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
Blog.LOGE("chain.request().url() >>> ${chain.request().url} : host : $host")
|
|
||||||
val response = chain.proceed(newRequest)
|
// Blog.LOGE("chain.request().url() >>> ${chain.request().url} : host : $host")
|
||||||
|
val response = chain.proceed(newRequestBuilder.build())
|
||||||
Blog.LOGE("응답 코드: ${response.code}:${response.message}")
|
Blog.LOGE("응답 코드: ${response.code}:${response.message}")
|
||||||
response
|
response
|
||||||
}
|
}
|
||||||
|
.addInterceptor(logging)
|
||||||
.callTimeout(60, TimeUnit.SECONDS)
|
.callTimeout(60, TimeUnit.SECONDS)
|
||||||
.connectTimeout(60, TimeUnit.SECONDS) // 연결 타임아웃
|
.connectTimeout(60, TimeUnit.SECONDS) // 연결 타임아웃
|
||||||
.readTimeout(60, TimeUnit.SECONDS) // 읽기 타임아웃
|
.readTimeout(60, TimeUnit.SECONDS) // 읽기 타임아웃
|
||||||
@ -98,6 +101,7 @@ internal class LunaticLauncher : Application() {
|
|||||||
.build()
|
.build()
|
||||||
|
|
||||||
val picasso = Picasso.Builder(this)
|
val picasso = Picasso.Builder(this)
|
||||||
|
.addRequestHandler(Base64RequestHandler())
|
||||||
.downloader(OkHttp3Downloader(okHttpClient))
|
.downloader(OkHttp3Downloader(okHttpClient))
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
|
|||||||
@ -1,22 +1,14 @@
|
|||||||
package bums.lunatic.launcher.behavior
|
package bums.lunatic.launcher.behavior
|
||||||
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.view.animation.AnimationUtils
|
import android.view.animation.AnimationUtils
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.view.WindowCompat
|
import androidx.core.view.WindowCompat
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import bums.lunatic.launcher.R
|
import bums.lunatic.launcher.R
|
||||||
import bums.lunatic.launcher.behavior.calendar.CalendarBean
|
|
||||||
import bums.lunatic.launcher.behavior.calendar.CalendarFactory.getMonthOfDayList
|
|
||||||
import bums.lunatic.launcher.behavior.calendar.CalendarUtil
|
|
||||||
import bums.lunatic.launcher.databinding.ItemCalendarBinding
|
|
||||||
import com.google.android.material.appbar.AppBarLayout
|
import com.google.android.material.appbar.AppBarLayout
|
||||||
import java.util.Date
|
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
class Behavior: AppCompatActivity() {
|
class Behavior: AppCompatActivity() {
|
||||||
@ -32,7 +24,7 @@ class Behavior: AppCompatActivity() {
|
|||||||
private val fadeIn by lazy { AnimationUtils.loadAnimation(this, R.anim.fade_in) }
|
private val fadeIn by lazy { AnimationUtils.loadAnimation(this, R.anim.fade_in) }
|
||||||
|
|
||||||
private val fadeOut by lazy { AnimationUtils.loadAnimation(this, R.anim.fade_out) }
|
private val fadeOut by lazy { AnimationUtils.loadAnimation(this, R.anim.fade_out) }
|
||||||
val dateArr: IntArray = CalendarUtil.getYMD(Date())
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||||
@ -41,7 +33,7 @@ class Behavior: AppCompatActivity() {
|
|||||||
|
|
||||||
|
|
||||||
initTopBarAnimation()
|
initTopBarAnimation()
|
||||||
initRecyclerView()
|
|
||||||
loadSample()
|
loadSample()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,53 +78,8 @@ class Behavior: AppCompatActivity() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initRecyclerView() {
|
|
||||||
with(findViewById<RecyclerView>(R.id.rv_main)) {
|
|
||||||
adapter = sampleAdapter
|
|
||||||
}
|
|
||||||
with(findViewById<RecyclerView>(R.id.calendarDateView)) {
|
|
||||||
adapter = CalAdapter().apply {
|
|
||||||
items.clear()
|
|
||||||
items.addAll(getMonthOfDayList(
|
|
||||||
dateArr[0],
|
|
||||||
dateArr[1]
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun loadSample() {
|
private fun loadSample() {
|
||||||
sampleAdapter.notifySample()
|
sampleAdapter.notifySample()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CalAdapter : RecyclerView.Adapter<CalAdapter.CalViewHolder>() {
|
|
||||||
|
|
||||||
val items = mutableListOf<CalendarBean>()
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = CalViewHolder(ItemCalendarBinding.inflate(LayoutInflater.from(parent.context)))
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: CalViewHolder, position: Int) {
|
|
||||||
holder.bind.day.apply {
|
|
||||||
val bean = items[position]
|
|
||||||
this.text = bean?.day.toString()
|
|
||||||
if (bean?.monthFlag != 0) {
|
|
||||||
this.setTextColor(Color.WHITE)
|
|
||||||
} else {
|
|
||||||
this.setTextColor(Color.BLACK)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemCount() = items.size
|
|
||||||
|
|
||||||
// fun notifySample() {
|
|
||||||
// items.clear()
|
|
||||||
// (1..10).forEach {
|
|
||||||
// items.add(it)
|
|
||||||
// }
|
|
||||||
// notifyDataSetChanged()
|
|
||||||
// }
|
|
||||||
|
|
||||||
class CalViewHolder(val bind: ItemCalendarBinding) : RecyclerView.ViewHolder(bind.root)
|
|
||||||
}
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
package bums.lunatic.launcher.behavior.calendar
|
|
||||||
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
|
|
||||||
|
|
||||||
interface CalendarAdapter {
|
|
||||||
fun getView(convertView: View?, parentView: ViewGroup?, bean: CalendarBean?): View
|
|
||||||
// fun hasChildView() : Boolean
|
|
||||||
}
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
//package bums.lunatic.launcher.behavior.calendar;
|
|
||||||
//
|
|
||||||
//public class CalendarBean {
|
|
||||||
// public int year;
|
|
||||||
// public int month;
|
|
||||||
// public int day;
|
|
||||||
// public int week;
|
|
||||||
//
|
|
||||||
// //-1,0,1
|
|
||||||
// public int monthFlag;
|
|
||||||
//
|
|
||||||
// //显示
|
|
||||||
//
|
|
||||||
// public CalendarBean(int year, int month, int day) {
|
|
||||||
// this.year = year;
|
|
||||||
// this.month = month;
|
|
||||||
// this.day = day;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getDisplayWeek(){
|
|
||||||
// String s="";
|
|
||||||
// switch(week){
|
|
||||||
// case 1:
|
|
||||||
// s="星期日";
|
|
||||||
// break;
|
|
||||||
// case 2:
|
|
||||||
// s="星期一";
|
|
||||||
// break;
|
|
||||||
// case 3:
|
|
||||||
// s="星期二";
|
|
||||||
// break;
|
|
||||||
// case 4:
|
|
||||||
// s="星期三";
|
|
||||||
// break;
|
|
||||||
// case 5:
|
|
||||||
// s="星期四";
|
|
||||||
// break;
|
|
||||||
// case 6:
|
|
||||||
// s="星期五";
|
|
||||||
// break;
|
|
||||||
// case 7:
|
|
||||||
// s="星期六";
|
|
||||||
// break;
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// return s ;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public String toString() {
|
|
||||||
// String s=year+"/"+month+"/"+day;
|
|
||||||
// return s;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
package bums.lunatic.launcher.behavior.calendar
|
|
||||||
|
|
||||||
class CalendarBean //显示
|
|
||||||
(var year: Int, var month: Int, var day: Int) {
|
|
||||||
var week: Int = 0
|
|
||||||
|
|
||||||
//-1,0,1
|
|
||||||
var monthFlag: Int = 0
|
|
||||||
|
|
||||||
val displayWeek: String
|
|
||||||
get() {
|
|
||||||
var s = ""
|
|
||||||
when (week) {
|
|
||||||
1 -> s = "星期日"
|
|
||||||
2 -> s = "星期一"
|
|
||||||
3 -> s = "星期二"
|
|
||||||
4 -> s = "星期三"
|
|
||||||
5 -> s = "星期四"
|
|
||||||
6 -> s = "星期五"
|
|
||||||
7 -> s = "星期六"
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toString(): String {
|
|
||||||
val s = "$year/$month/$day"
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,152 +0,0 @@
|
|||||||
package bums.lunatic.launcher.behavior.calendar
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import androidx.viewpager.widget.PagerAdapter
|
|
||||||
import androidx.viewpager.widget.ViewPager
|
|
||||||
import bums.lunatic.launcher.R
|
|
||||||
import bums.lunatic.launcher.behavior.calendar.CalendarFactory.getMonthOfDayList
|
|
||||||
import com.example.accountbook.calendar.CalendarTopView
|
|
||||||
import com.example.accountbook.calendar.CalendarTopViewChangeListener
|
|
||||||
import java.util.Date
|
|
||||||
import java.util.LinkedList
|
|
||||||
|
|
||||||
|
|
||||||
class CalendarDateView(context: Context, attrs: AttributeSet?):
|
|
||||||
ViewPager(context, attrs), CalendarTopView {
|
|
||||||
var views = HashMap<Int, CalendarView>()
|
|
||||||
private var mCaledarLayoutChangeListener: CalendarTopViewChangeListener? = null
|
|
||||||
private var onItemClickListener: CalendarView.OnItemClickListener? = null
|
|
||||||
private val cache: LinkedList<CalendarView?> = LinkedList<CalendarView?>()
|
|
||||||
private val MAXCOUNT = 6
|
|
||||||
private var row = 6
|
|
||||||
|
|
||||||
fun setCalrow(row : Int) {
|
|
||||||
this.row = row
|
|
||||||
}
|
|
||||||
private var mAdapter: CalendarAdapter? = null
|
|
||||||
override var itemHeight = 0
|
|
||||||
private set
|
|
||||||
|
|
||||||
|
|
||||||
fun setAdapter(adapter: CalendarAdapter?) {
|
|
||||||
mAdapter = adapter
|
|
||||||
initialize()
|
|
||||||
initData()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun reload() {
|
|
||||||
Log.i(this@CalendarDateView.javaClass.simpleName , "reload()")
|
|
||||||
sss.notifyDataSetChanged()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setOnItemClickListener(onItemClickListener: CalendarView.OnItemClickListener?) {
|
|
||||||
this.onItemClickListener = onItemClickListener
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
val a = context.obtainStyledAttributes(attrs, R.styleable.CalendarDateView)
|
|
||||||
row = a.getInteger(R.styleable.CalendarDateView_cbd_calendar_row, 6)
|
|
||||||
a.recycle()
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
|
||||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
|
||||||
// var calendarHeight = 0
|
|
||||||
if (adapter != null) {
|
|
||||||
(getChildAt(0) as CalendarView)?.let {
|
|
||||||
// calendarHeight = it.measuredHeight
|
|
||||||
itemHeight = it.itemHeight
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setMeasuredDimension(
|
|
||||||
widthMeasureSpec,
|
|
||||||
MeasureSpec.makeMeasureSpec(heightMeasureSpec, MeasureSpec.EXACTLY)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
val dateArr: IntArray = CalendarUtil.getYMD(Date())
|
|
||||||
var sss = object : PagerAdapter() {
|
|
||||||
override fun getCount(): Int {
|
|
||||||
// Log.i(this@CalendarDateView::class.java.simpleName, "container >>> setAdapter getCount")
|
|
||||||
return Int.MAX_VALUE
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun isViewFromObject(view: View, `object`: Any): Boolean {
|
|
||||||
return view === `object`
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun instantiateItem(container: ViewGroup, position: Int): Any {
|
|
||||||
|
|
||||||
Log.i(this@CalendarDateView::class.java.simpleName, "container >>> ${container} position >> ${position}")
|
|
||||||
val view: CalendarView = if (!cache.isEmpty()) {
|
|
||||||
cache.removeFirst()!!
|
|
||||||
} else {
|
|
||||||
CalendarView(container.context, row)
|
|
||||||
}
|
|
||||||
view.setOnItemClickListener(onItemClickListener)
|
|
||||||
view.setAdapter(mAdapter)
|
|
||||||
|
|
||||||
container.addView(view)
|
|
||||||
views[position] = view
|
|
||||||
view.apply {
|
|
||||||
setData(
|
|
||||||
getMonthOfDayList(
|
|
||||||
dateArr[0],
|
|
||||||
dateArr[1] + position - Int.MAX_VALUE / 2
|
|
||||||
), position == Int.MAX_VALUE / 2
|
|
||||||
)
|
|
||||||
}
|
|
||||||
return view
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
|
|
||||||
Log.i(this@CalendarDateView.javaClass.simpleName , "destroyItem >>> position ${position}")
|
|
||||||
container.removeView(`object` as View)
|
|
||||||
cache.addLast(`object` as CalendarView)
|
|
||||||
views.remove(position)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initialize() {
|
|
||||||
setAdapter(sss)
|
|
||||||
addOnPageChangeListener(object: SimpleOnPageChangeListener() {
|
|
||||||
override fun onPageSelected(position: Int) {
|
|
||||||
super.onPageSelected(position)
|
|
||||||
onItemClickListener?.let{
|
|
||||||
views[position]?.let {v ->
|
|
||||||
val obs: Array<Any> = v.select
|
|
||||||
it.onItemClick(
|
|
||||||
obs[0] as View,
|
|
||||||
obs[1] as Int,
|
|
||||||
obs[2] as CalendarBean
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mCaledarLayoutChangeListener?.onLayoutChange(this@CalendarDateView)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initData() {
|
|
||||||
setCurrentItem(Int.MAX_VALUE / 2, false)
|
|
||||||
adapter!!.notifyDataSetChanged()
|
|
||||||
}
|
|
||||||
|
|
||||||
override val currentSelectPositon: IntArray
|
|
||||||
get() {
|
|
||||||
var view = views[currentItem]
|
|
||||||
if (view == null) {
|
|
||||||
view = getChildAt(0) as? CalendarView
|
|
||||||
}
|
|
||||||
return view?.getSelectPosition() ?: IntArray(4)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setCalendarTopViewChangeListener(listener: CalendarTopViewChangeListener?) {
|
|
||||||
mCaledarLayoutChangeListener = listener
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
package bums.lunatic.launcher.behavior.calendar
|
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import bums.lunatic.launcher.behavior.calendar.CalendarUtil.getDayOfWeek
|
|
||||||
import java.util.Calendar
|
|
||||||
|
|
||||||
|
|
||||||
object CalendarFactory {
|
|
||||||
private val cache = HashMap<String, List<CalendarBean>>()
|
|
||||||
|
|
||||||
fun getMonthOfDayList(y: Int, m: Int): List<CalendarBean> {
|
|
||||||
Log.e("TIME CHECK" , "fun getMonthOfDayList Start")
|
|
||||||
val key = y.toString() + "" + m
|
|
||||||
if (cache.containsKey(key)) {
|
|
||||||
val list = cache[key]
|
|
||||||
if (list == null) {
|
|
||||||
cache.remove(key)
|
|
||||||
} else {
|
|
||||||
return list
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val list: MutableList<CalendarBean> = ArrayList()
|
|
||||||
cache[key] = list
|
|
||||||
|
|
||||||
val fweek: Int = getDayOfWeek(y, m, 1)
|
|
||||||
val total: Int = CalendarUtil.getDayOfMaonth(y, m)
|
|
||||||
|
|
||||||
for (i in fweek - 1 downTo 1) {
|
|
||||||
val bean = getCalendarBean(y, m, 1 - i)
|
|
||||||
bean.monthFlag = -1
|
|
||||||
list.add(bean)
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i in 0 until total) {
|
|
||||||
val bean = getCalendarBean(y, m, i + 1)
|
|
||||||
list.add(bean)
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i in 0 until 42 - (fweek - 1) - total) {
|
|
||||||
val bean = getCalendarBean(y, m, total + i + 1)
|
|
||||||
bean.monthFlag = 1
|
|
||||||
list.add(bean)
|
|
||||||
}
|
|
||||||
Log.e("TIME CHECK" , "fun getMonthOfDayList END")
|
|
||||||
return list
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getCalendarBean(year: Int, month: Int, day: Int): CalendarBean {
|
|
||||||
|
|
||||||
val calendar: Calendar = Calendar.getInstance()
|
|
||||||
.apply { this.set(year, month - 1, day) }
|
|
||||||
val year = calendar.get(Calendar.YEAR)
|
|
||||||
val month = calendar.get(Calendar.MONTH) + 1
|
|
||||||
val day = calendar.get(Calendar.DATE)
|
|
||||||
val bean = CalendarBean(year, month, day)
|
|
||||||
bean.week = CalendarUtil.getDayOfWeek(year, month, day)
|
|
||||||
// val chinaDate: Array<String> = ChinaDate.getChinaDate(year, month, day)
|
|
||||||
// bean.chinaMonth = chinaDate[0]
|
|
||||||
// bean.chinaDay = chinaDate[1]
|
|
||||||
return bean
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun main(args: Array<String>) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
package com.example.accountbook.calendar
|
|
||||||
|
|
||||||
|
|
||||||
interface CalendarTopView {
|
|
||||||
val currentSelectPositon: IntArray?
|
|
||||||
val itemHeight: Int
|
|
||||||
|
|
||||||
fun setCalendarTopViewChangeListener(listener: CalendarTopViewChangeListener?)
|
|
||||||
}
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
package com.example.accountbook.calendar
|
|
||||||
|
|
||||||
interface CalendarTopViewChangeListener {
|
|
||||||
fun onLayoutChange(topView: CalendarTopView) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
package bums.lunatic.launcher.behavior.calendar
|
|
||||||
|
|
||||||
import java.util.Calendar
|
|
||||||
import java.util.Date
|
|
||||||
|
|
||||||
|
|
||||||
object CalendarUtil {
|
|
||||||
fun getDayOfWeek(y: Int, m: Int, day: Int): Int {
|
|
||||||
val calendar: Calendar = Calendar.getInstance()
|
|
||||||
calendar.set(y, m - 1, day)
|
|
||||||
return calendar.get(Calendar.DAY_OF_WEEK)
|
|
||||||
}
|
|
||||||
|
|
||||||
//获取一月最大天数
|
|
||||||
fun getDayOfMaonth(y: Int, m: Int): Int {
|
|
||||||
val cal: Calendar = Calendar.getInstance()
|
|
||||||
cal.set(y, m - 1, 1)
|
|
||||||
return cal.getActualMaximum(Calendar.DATE)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getMothOfMonth(y: Int, m: Int): Int {
|
|
||||||
val cal: Calendar = Calendar.getInstance()
|
|
||||||
cal.set(y, m - 1, 1)
|
|
||||||
val dateOfMonth: Int = cal.get(Calendar.MONTH)
|
|
||||||
return dateOfMonth + 1
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getYMD(date: Date?): IntArray {
|
|
||||||
val cal: Calendar = Calendar.getInstance()
|
|
||||||
date?.let { cal.setTime(it) }
|
|
||||||
return intArrayOf(
|
|
||||||
cal.get(Calendar.YEAR),
|
|
||||||
cal.get(Calendar.MONTH) + 1,
|
|
||||||
cal.get(Calendar.DATE)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,201 +0,0 @@
|
|||||||
package bums.lunatic.launcher.behavior.calendar
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.graphics.Rect
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import bums.lunatic.launcher.behavior.calendar.CalendarUtil.getYMD
|
|
||||||
|
|
||||||
import java.util.Date
|
|
||||||
|
|
||||||
|
|
||||||
class CalendarView : ViewGroup {
|
|
||||||
private var selectPosition = -1
|
|
||||||
private var adapter: CalendarAdapter? = null
|
|
||||||
private var data: List<CalendarBean>? = null
|
|
||||||
private var onItemClickListener: OnItemClickListener? = null
|
|
||||||
private var row = 6
|
|
||||||
private val column = 7
|
|
||||||
private var itemWidth = 0
|
|
||||||
var itemHeight = 0
|
|
||||||
private set
|
|
||||||
private var isToday = false
|
|
||||||
|
|
||||||
interface OnItemClickListener {
|
|
||||||
fun onItemClick(view: View?, position: Int, bean: CalendarBean?)
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(context: Context?, row: Int) : super(context) {
|
|
||||||
this.row = row
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) {
|
|
||||||
this.onItemClickListener = onItemClickListener
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
|
|
||||||
setWillNotDraw(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setAdapter(adapter: CalendarAdapter?) {
|
|
||||||
this.adapter = adapter
|
|
||||||
}
|
|
||||||
fun setCalrow(row : Int) {
|
|
||||||
if (this.row != row) {
|
|
||||||
this.row = row
|
|
||||||
removeAllViews()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fun setData(data: List<CalendarBean>?, isToday: Boolean) {
|
|
||||||
this.data = data
|
|
||||||
this.isToday = isToday
|
|
||||||
setItem()
|
|
||||||
requestLayout()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setItem() {
|
|
||||||
selectPosition = -1
|
|
||||||
if (adapter == null) {
|
|
||||||
throw RuntimeException("adapter is null,please setadapter")
|
|
||||||
}
|
|
||||||
Log.i("data >>> ","data ${data}")
|
|
||||||
for (i in data!!.indices) {
|
|
||||||
val bean = data!![i]
|
|
||||||
val chidView: View? = adapter?.getView(
|
|
||||||
getChildAt(i).also { v -> Log.i("data >>> ", "view $v") },
|
|
||||||
this,
|
|
||||||
bean
|
|
||||||
).also { v -> Log.i("data >>> ", "chidView $v") }
|
|
||||||
if (chidView != null && chidView != getChildAt(i)) {
|
|
||||||
addViewInLayout(chidView, i, chidView.layoutParams, true)
|
|
||||||
}
|
|
||||||
if (isToday && selectPosition == -1) {
|
|
||||||
val date = getYMD(Date())
|
|
||||||
if (bean.year == date[0] && bean.month == date[1] && bean.day == date[2]) {
|
|
||||||
selectPosition = i
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (selectPosition == -1 && bean.day == 1) {
|
|
||||||
selectPosition = i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
chidView?.isSelected = selectPosition == i
|
|
||||||
setItemClick(chidView, i, bean)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val select: Array<Any>
|
|
||||||
get() = arrayOf(
|
|
||||||
getChildAt(selectPosition), selectPosition,
|
|
||||||
data!![selectPosition]
|
|
||||||
)
|
|
||||||
|
|
||||||
fun setItemClick(view: View?, potsion: Int, bean: CalendarBean?) {
|
|
||||||
view?.setOnClickListener {
|
|
||||||
if (selectPosition != -1) {
|
|
||||||
getChildAt(selectPosition).isSelected = false
|
|
||||||
getChildAt(potsion).isSelected = true
|
|
||||||
}
|
|
||||||
selectPosition = potsion
|
|
||||||
if (onItemClickListener != null) {
|
|
||||||
onItemClickListener!!.onItemClick(view, potsion, bean)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getSelectPosition(): IntArray {
|
|
||||||
val rect = Rect()
|
|
||||||
try {
|
|
||||||
getChildAt(selectPosition).getHitRect(rect)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
return intArrayOf(rect.left, rect.top, rect.right, rect.top)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var lastwidthMeasureSpec = 0
|
|
||||||
var lastheightMeasureSpec = 0
|
|
||||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
|
||||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
|
||||||
Log.e(this.javaClass::class.java.simpleName , "this count check ${this}")
|
|
||||||
if (widthMeasureSpec != lastwidthMeasureSpec || heightMeasureSpec != lastheightMeasureSpec) {
|
|
||||||
val parentWidth =
|
|
||||||
MeasureSpec.getSize(
|
|
||||||
MeasureSpec.makeMeasureSpec(
|
|
||||||
widthMeasureSpec,
|
|
||||||
MeasureSpec.EXACTLY
|
|
||||||
)
|
|
||||||
)
|
|
||||||
val parentH =
|
|
||||||
MeasureSpec.getSize(
|
|
||||||
MeasureSpec.makeMeasureSpec(
|
|
||||||
heightMeasureSpec,
|
|
||||||
MeasureSpec.EXACTLY
|
|
||||||
)
|
|
||||||
)
|
|
||||||
itemWidth = parentWidth / column
|
|
||||||
itemHeight = parentH / row
|
|
||||||
// itemWidth
|
|
||||||
val view = getChildAt(0) ?: return
|
|
||||||
val params = view.layoutParams
|
|
||||||
if (params != null && params.height > 0) {
|
|
||||||
itemHeight = params.height
|
|
||||||
}
|
|
||||||
setMeasuredDimension(parentWidth, itemHeight * row)
|
|
||||||
if (childCount.equals(row*column))
|
|
||||||
for (i in 0 until childCount) {
|
|
||||||
val childView = getChildAt(i)
|
|
||||||
childView.measure(
|
|
||||||
MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY),
|
|
||||||
MeasureSpec.makeMeasureSpec(itemHeight, MeasureSpec.EXACTLY)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Log.i(
|
|
||||||
TAG,
|
|
||||||
"onMeasure() called with: itemHeight = [$itemHeight], itemWidth = [$itemWidth]"
|
|
||||||
)
|
|
||||||
lastwidthMeasureSpec = widthMeasureSpec
|
|
||||||
lastheightMeasureSpec = heightMeasureSpec
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
|
|
||||||
if (changed && childCount.equals(row*column))
|
|
||||||
for (i in 0 until childCount) {
|
|
||||||
layoutChild(getChildAt(i), i, l, t, r, b)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addViewInLayout(
|
|
||||||
child: View?,
|
|
||||||
index: Int,
|
|
||||||
params: LayoutParams?,
|
|
||||||
preventRequestLayout: Boolean
|
|
||||||
): Boolean {
|
|
||||||
Log.d("CalendarView, time","time")
|
|
||||||
return super.addViewInLayout(child, index, params, preventRequestLayout)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun layoutChild(view: View, position: Int, l: Int, t: Int, r: Int, b: Int) {
|
|
||||||
var l = l
|
|
||||||
var t = t
|
|
||||||
var r = r
|
|
||||||
var b = b
|
|
||||||
val cc = position % column
|
|
||||||
val cr = position / column
|
|
||||||
val itemWidth = view.measuredWidth
|
|
||||||
val itemHeight = view.measuredHeight
|
|
||||||
l = cc * itemWidth
|
|
||||||
t = cr * itemHeight
|
|
||||||
r = l + itemWidth
|
|
||||||
b = t + itemHeight
|
|
||||||
view.layout(l, t, r, b)
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private const val TAG = "CalendarView"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -7,9 +7,7 @@ import android.os.Bundle
|
|||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.view.ViewCompat
|
|
||||||
import androidx.core.view.WindowCompat
|
import androidx.core.view.WindowCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
|
||||||
import androidx.core.view.WindowInsetsControllerCompat
|
import androidx.core.view.WindowInsetsControllerCompat
|
||||||
import bums.lunatic.launcher.apps.SearchMenu
|
import bums.lunatic.launcher.apps.SearchMenu
|
||||||
import bums.lunatic.launcher.helpers.PrefBoolean
|
import bums.lunatic.launcher.helpers.PrefBoolean
|
||||||
|
|||||||
@ -35,8 +35,6 @@ import bums.lunatic.launcher.model.RssDataInterface
|
|||||||
import bums.lunatic.launcher.model.RssDataType
|
import bums.lunatic.launcher.model.RssDataType
|
||||||
import com.squareup.picasso.NetworkPolicy
|
import com.squareup.picasso.NetworkPolicy
|
||||||
import com.squareup.picasso.Picasso
|
import com.squareup.picasso.Picasso
|
||||||
import java.net.URLEncoder
|
|
||||||
import java.nio.charset.Charset
|
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
|
||||||
|
|||||||
@ -1,43 +1,42 @@
|
|||||||
/*
|
///*
|
||||||
* Lunar Launcher
|
// * Lunar Launcher
|
||||||
* Copyright (C) 2022 Md Rasel Hossain
|
// * Copyright (C) 2022 Md Rasel Hossain
|
||||||
*
|
// *
|
||||||
* This program is free software: you can redistribute it and/or modify
|
// * This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
// * it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
// * the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
// * (at your option) any later version.
|
||||||
*
|
// *
|
||||||
* This program is distributed in the hope that it will be useful,
|
// * This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
// * GNU General Public License for more details.
|
||||||
*
|
// *
|
||||||
* You should have received a copy of the GNU General Public License
|
// * You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
// */
|
||||||
|
//
|
||||||
package bums.lunatic.launcher.helpers
|
//package bums.lunatic.launcher.helpers
|
||||||
|
//
|
||||||
import android.app.admin.DeviceAdminReceiver
|
//import android.app.admin.DeviceAdminReceiver
|
||||||
import android.content.Context
|
//import android.content.Context
|
||||||
import android.content.Intent
|
//import android.content.Intent
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
//
|
||||||
|
//
|
||||||
|
//internal class AdminReceiver : DeviceAdminReceiver() {
|
||||||
internal class AdminReceiver : DeviceAdminReceiver() {
|
//
|
||||||
|
// override fun onDisabled(context: Context, intent: Intent) {
|
||||||
override fun onDisabled(context: Context, intent: Intent) {
|
// super.onDisabled(context, intent)
|
||||||
super.onDisabled(context, intent)
|
// LocalBroadcastManager.getInstance(context).sendBroadcast(
|
||||||
LocalBroadcastManager.getInstance(context).sendBroadcast(
|
// Intent("device_admin_action_disabled")
|
||||||
Intent("device_admin_action_disabled")
|
// )
|
||||||
)
|
// }
|
||||||
}
|
//
|
||||||
|
// override fun onEnabled(context: Context, intent: Intent) {
|
||||||
override fun onEnabled(context: Context, intent: Intent) {
|
// super.onEnabled(context, intent)
|
||||||
super.onEnabled(context, intent)
|
// LocalBroadcastManager.getInstance(context).sendBroadcast(
|
||||||
LocalBroadcastManager.getInstance(context).sendBroadcast(
|
// Intent("device_admin_action_enabled")
|
||||||
Intent("device_admin_action_enabled")
|
// )
|
||||||
)
|
// }
|
||||||
}
|
//
|
||||||
|
//}
|
||||||
}
|
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
package bums.lunatic.launcher.helpers
|
package bums.lunatic.launcher.helpers
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.Date
|
||||||
|
import java.util.Locale
|
||||||
import java.util.concurrent.atomic.AtomicReference
|
import java.util.concurrent.atomic.AtomicReference
|
||||||
|
|
||||||
class HourlyLogWriter(private val logDir: File) {
|
class HourlyLogWriter(private val logDir: File) {
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
package bums.lunatic.launcher.helpers
|
package bums.lunatic.launcher.helpers
|
||||||
|
|
||||||
import bums.lunatic.launcher.model.RssDataType
|
import bums.lunatic.launcher.model.RssDataType
|
||||||
import kr.lunaticbum.utils.preferences.PrefKey
|
import bums.lunatic.launcher.utils.PrefKey
|
||||||
import kr.lunaticbum.utils.preferences.PreferencesHelper
|
import bums.lunatic.launcher.utils.PreferencesHelper
|
||||||
import java.math.BigDecimal
|
import java.math.BigDecimal
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,77 @@
|
|||||||
|
package bums.lunatic.launcher.home
|
||||||
|
|
||||||
|
import android.graphics.BitmapFactory
|
||||||
|
import android.util.Base64
|
||||||
|
import androidx.collection.LruCache
|
||||||
|
import com.squareup.picasso.Picasso
|
||||||
|
import com.squareup.picasso.Request
|
||||||
|
import com.squareup.picasso.RequestHandler
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64 데이터를 URL 키와 함께 저장하는 메모리 캐시 (Singleton 또는 DI로 관리)
|
||||||
|
* OOM(메모리 부족)을 피하기 위해 비트맵 자체가 아닌 Base64 문자열을 저장합니다.
|
||||||
|
*/
|
||||||
|
object Base64ImageCache {
|
||||||
|
// 앱 최대 메모리의 1/8을 LruCache 크기로 할당 (조정 가능)
|
||||||
|
private val maxMemory = (Runtime.getRuntime().maxMemory() / 1024).toInt()
|
||||||
|
private val cacheSize = maxMemory / 8
|
||||||
|
|
||||||
|
// Key: Image URL, Value: Base64 Data String
|
||||||
|
private val lru: LruCache<String, String> = LruCache(cacheSize)
|
||||||
|
|
||||||
|
fun put(url: String, base64Data: String) {
|
||||||
|
if (lru.get(url) == null) {
|
||||||
|
lru.put(url, base64Data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(url: String): String? {
|
||||||
|
return lru.get(url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Picasso가 요청한 URL이 Base64ImageCache에 있는지 확인하는 커스텀 핸들러
|
||||||
|
*/
|
||||||
|
class Base64RequestHandler : RequestHandler() {
|
||||||
|
|
||||||
|
private val DATA_SCHEME = "data:"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이 핸들러가 처리할 수 있는 요청인지 확인
|
||||||
|
* (캐시에 URL이 존재하고, data: 스킴이 아닌 경우)
|
||||||
|
*/
|
||||||
|
override fun canHandleRequest(data: Request): Boolean {
|
||||||
|
val url = data.uri.toString()
|
||||||
|
// data: 스킴이 아니고, 우리 캐시에 URL 키가 존재할 때만 true 반환
|
||||||
|
return !url.startsWith(DATA_SCHEME) && Base64ImageCache.get(url) != null
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 실제 이미지를 로드(디코딩)하여 Picasso에 반환
|
||||||
|
*/
|
||||||
|
@Throws(IOException::class)
|
||||||
|
override fun load(request: Request, networkPolicy: Int): Result? {
|
||||||
|
val url = request.uri.toString()
|
||||||
|
val base64String = Base64ImageCache.get(url) ?: return null
|
||||||
|
|
||||||
|
try {
|
||||||
|
// "data:image/png;base64," 접두사 분리
|
||||||
|
val pureBase64 = base64String.substring(base64String.indexOf(",") + 1)
|
||||||
|
|
||||||
|
// Base64 문자열을 바이트 배열로 디코딩
|
||||||
|
val decodedBytes = Base64.decode(pureBase64, Base64.DEFAULT)
|
||||||
|
|
||||||
|
// 바이트 배열을 비트맵으로 변환
|
||||||
|
val bitmap = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size)
|
||||||
|
?: throw IOException("Failed to decode Base64 string")
|
||||||
|
|
||||||
|
// Picasso에 비트맵 결과와 출처(DISK)를 반환 (DISK로 해야 메모리 캐싱을 다시 수행함)
|
||||||
|
return Result(bitmap, Picasso.LoadedFrom.DISK)
|
||||||
|
|
||||||
|
} catch (e: Exception) {
|
||||||
|
throw IOException("Error decoding base64 data for $url", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
import com.vladsch.flexmark.html2md.converter.*
|
import com.vladsch.flexmark.html2md.converter.HtmlNodeRenderer
|
||||||
|
import com.vladsch.flexmark.html2md.converter.HtmlNodeRendererHandler
|
||||||
import com.vladsch.flexmark.util.data.DataHolder
|
import com.vladsch.flexmark.util.data.DataHolder
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,6 @@ package bums.lunatic.launcher.home
|
|||||||
|
|
||||||
import CustomVideoNodeRenderer
|
import CustomVideoNodeRenderer
|
||||||
import android.app.Dialog
|
import android.app.Dialog
|
||||||
import android.app.DownloadManager
|
|
||||||
import android.content.ClipData
|
import android.content.ClipData
|
||||||
import android.content.ClipboardManager
|
import android.content.ClipboardManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
@ -11,8 +10,6 @@ import android.content.Intent
|
|||||||
import android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP
|
import android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||||
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
|
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
|
||||||
import android.os.Environment
|
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
@ -37,20 +34,14 @@ import android.widget.ProgressBar
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import androidx.core.content.ContextCompat.getSystemService
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.work.Worker
|
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
||||||
import bums.lunatic.launcher.R
|
import bums.lunatic.launcher.R
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService
|
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.ACTION_SENDMSG
|
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.ACTION_VIDEO_DOWNLOAD
|
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.EXTRA_MSGKEY
|
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.EXTRA_TARGET_URL
|
|
||||||
import bums.lunatic.launcher.model.Dotax
|
import bums.lunatic.launcher.model.Dotax
|
||||||
import bums.lunatic.launcher.model.DotaxArticles
|
import bums.lunatic.launcher.model.DotaxArticles
|
||||||
import bums.lunatic.launcher.model.getRssData
|
import bums.lunatic.launcher.model.getRssData
|
||||||
import bums.lunatic.launcher.model.others.Button
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
||||||
import bums.lunatic.launcher.tokiz.view.BWebview
|
import bums.lunatic.launcher.tokiz.view.BWebview
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
@ -60,16 +51,8 @@ import com.google.gson.Gson
|
|||||||
import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter
|
import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter
|
||||||
import com.yausername.youtubedl_android.YoutubeDL
|
import com.yausername.youtubedl_android.YoutubeDL
|
||||||
import com.yausername.youtubedl_android.YoutubeDLRequest
|
import com.yausername.youtubedl_android.YoutubeDLRequest
|
||||||
import com.yausername.youtubedl_android.YoutubeDLResponse
|
|
||||||
import io.realm.kotlin.ext.isValid
|
|
||||||
import kotlinx.coroutines.CoroutineExceptionHandler
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.delay
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import kr.lunaticbum.utils.service.ServiceUtil.getSystemService
|
|
||||||
import kr.lunaticbum.utils.service.ServiceUtil.layoutInflater
|
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import org.json.JSONException
|
import org.json.JSONException
|
||||||
@ -77,7 +60,6 @@ import org.json.JSONObject
|
|||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.mozilla.gecko.util.ThreadUtils
|
import org.mozilla.gecko.util.ThreadUtils
|
||||||
import org.mozilla.gecko.util.ThreadUtils.runOnUiThread
|
|
||||||
import org.mozilla.geckoview.ExperimentDelegate
|
import org.mozilla.geckoview.ExperimentDelegate
|
||||||
import org.mozilla.geckoview.GeckoResult
|
import org.mozilla.geckoview.GeckoResult
|
||||||
import org.mozilla.geckoview.GeckoSession
|
import org.mozilla.geckoview.GeckoSession
|
||||||
@ -93,7 +75,6 @@ import java.io.FileOutputStream
|
|||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import java.util.UUID
|
|
||||||
|
|
||||||
class GeckoWeb : BWebview {
|
class GeckoWeb : BWebview {
|
||||||
constructor(context: Context?) : super(context) {
|
constructor(context: Context?) : super(context) {
|
||||||
@ -402,13 +383,13 @@ class GeckoWeb : BWebview {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
fun copyToClipboard(text: String?) {
|
// fun copyToClipboard(text: String?) {
|
||||||
if (text == null) return
|
// if (text == null) return
|
||||||
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
// val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||||
val clip = ClipData.newPlainText("Media URL", text)
|
// val clip = ClipData.newPlainText("Media URL", text)
|
||||||
clipboard.setPrimaryClip(clip)
|
// clipboard.setPrimaryClip(clip)
|
||||||
Toast.makeText(context, "주소가 복사되었습니다.", Toast.LENGTH_SHORT).show()
|
// Toast.makeText(context, "주소가 복사되었습니다.", Toast.LENGTH_SHORT).show()
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
suspend fun getFormatList(url: String): List<String> = withContext(Dispatchers.IO) {
|
suspend fun getFormatList(url: String): List<String> = withContext(Dispatchers.IO) {
|
||||||
@ -737,12 +718,20 @@ class GeckoWeb : BWebview {
|
|||||||
override fun onPortMessage(
|
override fun onPortMessage(
|
||||||
message: Any, port: WebExtension.Port
|
message: Any, port: WebExtension.Port
|
||||||
) {
|
) {
|
||||||
|
|
||||||
Blog.LOGE("PortDelegate", "Received message from extension: $message")
|
Blog.LOGE("PortDelegate", "Received message from extension: $message")
|
||||||
if (message is String && message.contains("type")) {
|
if (message is String && message.contains("type")) {
|
||||||
try {
|
try {
|
||||||
var lPortMessage =
|
var lPortMessage =
|
||||||
Gson().fromJson<PortMessage>(message, PortMessage::class.java)
|
Gson().fromJson<PortMessage>(message, PortMessage::class.java)
|
||||||
when(lPortMessage.type) {
|
when(lPortMessage.type) {
|
||||||
|
"SINGLE_IMAGE_DATA"-> {
|
||||||
|
if (lPortMessage.imgSrc != null && lPortMessage.base64Data != null) {
|
||||||
|
// *** 핵심: 수신한 Base64 데이터를 커스텀 캐시에 저장 ***
|
||||||
|
Log.d("GeckoImageCache", "캐싱 저장 시도: ${lPortMessage.imgSrc}")
|
||||||
|
Base64ImageCache.put(lPortMessage.imgSrc!!, lPortMessage.base64Data!!)
|
||||||
|
}
|
||||||
|
}
|
||||||
"getListResult" -> {
|
"getListResult" -> {
|
||||||
}
|
}
|
||||||
"BookContents"->{
|
"BookContents"->{
|
||||||
|
|||||||
@ -1,250 +1,250 @@
|
|||||||
package bums.lunatic.launcher.home
|
//package bums.lunatic.launcher.home
|
||||||
|
//
|
||||||
import android.content.Context
|
//import android.content.Context
|
||||||
import android.content.Intent
|
//import android.content.Intent
|
||||||
import android.os.Environment
|
//import android.os.Environment
|
||||||
import android.webkit.CookieManager
|
//import android.webkit.CookieManager
|
||||||
import androidx.core.content.FileProvider
|
//import androidx.core.content.FileProvider
|
||||||
import kotlinx.coroutines.CoroutineScope
|
//import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
//import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.delay
|
//import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
//import kotlinx.coroutines.launch
|
||||||
import kr.lunaticbum.awesomewebview.helpers.DownPicUtil
|
//import kr.lunaticbum.awesomewebview.helpers.DownPicUtil
|
||||||
import kr.lunaticbum.awesomewebview.helpers.DownPicUtil.DownFinishListener
|
//import kr.lunaticbum.awesomewebview.helpers.DownPicUtil.DownFinishListener
|
||||||
import kr.lunaticbum.utils.log.LogUtil
|
//import kr.lunaticbum.utils.log.LogUtil
|
||||||
import org.jsoup.Jsoup
|
//import org.jsoup.Jsoup
|
||||||
import org.jsoup.UnsupportedMimeTypeException
|
//import org.jsoup.UnsupportedMimeTypeException
|
||||||
import java.io.BufferedWriter
|
//import java.io.BufferedWriter
|
||||||
import java.io.File
|
//import java.io.File
|
||||||
import java.io.FileWriter
|
//import java.io.FileWriter
|
||||||
import java.net.URL
|
//import java.net.URL
|
||||||
import java.text.SimpleDateFormat
|
//import java.text.SimpleDateFormat
|
||||||
import java.util.Date
|
//import java.util.Date
|
||||||
|
//
|
||||||
val defaultTime = 200L
|
//val defaultTime = 200L
|
||||||
class OfflineContents(val context: Context, val host : String, val cookie: String, val agent: String, val current: String, val newPath: String, val value: String, val autoCheck : Boolean, val mediaUrls : ArrayList<String>) {
|
//class OfflineContents(val context: Context, val host : String, val cookie: String, val agent: String, val current: String, val newPath: String, val value: String, val autoCheck : Boolean, val mediaUrls : ArrayList<String>) {
|
||||||
val targetFile : File
|
// val targetFile : File
|
||||||
val filePath = "index.html"
|
// val filePath = "index.html"
|
||||||
val path = File(
|
// val path = File(
|
||||||
Environment.getExternalStorageDirectory(),
|
// Environment.getExternalStorageDirectory(),
|
||||||
"bums"
|
// "bums"
|
||||||
)
|
// )
|
||||||
val newFolder = File(path, newPath).apply { mkdirs() }
|
// val newFolder = File(path, newPath).apply { mkdirs() }
|
||||||
val newFile : File
|
// val newFile : File
|
||||||
var htmlString : StringBuffer
|
// var htmlString : StringBuffer
|
||||||
val urlPathMap : HashMap<String,String> = hashMapOf()
|
// val urlPathMap : HashMap<String,String> = hashMapOf()
|
||||||
var reqCount = 0
|
// var reqCount = 0
|
||||||
var endOfLooPCheck = false
|
// var endOfLooPCheck = false
|
||||||
val lDownFinishListener = object : DownFinishListener {
|
// val lDownFinishListener = object : DownFinishListener {
|
||||||
override fun onDownFinish(url: String, path: String) {
|
// override fun onDownFinish(url: String, path: String) {
|
||||||
LogUtil.e("Url >> ${url} path >> ${path}")
|
// LogUtil.e("Url >> ${url} path >> ${path}")
|
||||||
urlPathMap.put(url, path)
|
// urlPathMap.put(url, path)
|
||||||
reqCount -= 1
|
// reqCount -= 1
|
||||||
if (reqCount == 0 && endOfLooPCheck) {
|
// if (reqCount == 0 && endOfLooPCheck) {
|
||||||
enofLoop()
|
// enofLoop()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
override fun onError() {
|
// override fun onError() {
|
||||||
reqCount -= 1
|
// reqCount -= 1
|
||||||
if (reqCount == 0 && endOfLooPCheck) {
|
// if (reqCount == 0 && endOfLooPCheck) {
|
||||||
enofLoop()
|
// enofLoop()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
init {
|
// init {
|
||||||
targetFile = File(newFolder, filePath)
|
// targetFile = File(newFolder, filePath)
|
||||||
newFile = File(
|
// newFile = File(
|
||||||
path,
|
// path,
|
||||||
newPath.plus(SimpleDateFormat("yyyMMdd").format(Date())).plus(".html")
|
// newPath.plus(SimpleDateFormat("yyyMMdd").format(Date())).plus(".html")
|
||||||
)
|
// )
|
||||||
htmlString= trimHtnl(value, host)
|
// htmlString= trimHtnl(value, host)
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
var onItEndof = false
|
// var onItEndof = false
|
||||||
fun enofLoop() {
|
// fun enofLoop() {
|
||||||
if (onItEndof) return
|
// if (onItEndof) return
|
||||||
onItEndof = true
|
// onItEndof = true
|
||||||
LogUtil.e("on it enofLoop")
|
// LogUtil.e("on it enofLoop")
|
||||||
urlPathMap.forEach { t, u ->
|
// urlPathMap.forEach { t, u ->
|
||||||
val file = File(u)
|
// val file = File(u)
|
||||||
var contentsUriString = FileProvider.getUriForFile(
|
// var contentsUriString = FileProvider.getUriForFile(
|
||||||
context,
|
// context,
|
||||||
"${context.packageName}.fileprovider",
|
// "${context.packageName}.fileprovider",
|
||||||
file
|
// file
|
||||||
).toString()
|
// ).toString()
|
||||||
|
//
|
||||||
var targetString = t
|
// var targetString = t
|
||||||
var targetIdx = htmlString.indexOf(targetString)
|
// var targetIdx = htmlString.indexOf(targetString)
|
||||||
if (targetIdx > 0) {
|
// if (targetIdx > 0) {
|
||||||
htmlString?.replace(
|
// htmlString?.replace(
|
||||||
targetIdx,
|
// targetIdx,
|
||||||
targetIdx.plus(targetString.length),
|
// targetIdx.plus(targetString.length),
|
||||||
contentsUriString
|
// contentsUriString
|
||||||
)
|
// )
|
||||||
}
|
// }
|
||||||
targetString = t.replace("&", "&")
|
// targetString = t.replace("&", "&")
|
||||||
targetIdx = htmlString.indexOf(targetString)
|
// targetIdx = htmlString.indexOf(targetString)
|
||||||
if (targetIdx > 0) {
|
// if (targetIdx > 0) {
|
||||||
htmlString?.replace(
|
// htmlString?.replace(
|
||||||
targetIdx,
|
// targetIdx,
|
||||||
targetIdx.plus(targetString.length),
|
// targetIdx.plus(targetString.length),
|
||||||
contentsUriString
|
// contentsUriString
|
||||||
)
|
// )
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
if (autoCheck) {
|
// if (autoCheck) {
|
||||||
LogUtil.e("on it enofLoop autoCheck ${autoCheck}")
|
// LogUtil.e("on it enofLoop autoCheck ${autoCheck}")
|
||||||
moveFile()
|
// moveFile()
|
||||||
context.startActivity(Intent(context,RssViewerActivity::class.java).apply {
|
// context.startActivity(Intent(context,RssViewerActivity::class.java).apply {
|
||||||
action = Intent.ACTION_VIEW
|
// action = Intent.ACTION_VIEW
|
||||||
data = FileProvider.getUriForFile(
|
// data = FileProvider.getUriForFile(
|
||||||
context,
|
// context,
|
||||||
"${context.packageName}.fileprovider",
|
// "${context.packageName}.fileprovider",
|
||||||
newFile
|
// newFile
|
||||||
)
|
// )
|
||||||
})
|
// })
|
||||||
} else {
|
// } else {
|
||||||
moveFile()
|
// moveFile()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
fun moveFile() {
|
// fun moveFile() {
|
||||||
indexSave(htmlString, targetFile, host)
|
// indexSave(htmlString, targetFile, host)
|
||||||
targetFile.copyTo(newFile)
|
// targetFile.copyTo(newFile)
|
||||||
if (targetFile.parentFile.isDirectory) {
|
// if (targetFile.parentFile.isDirectory) {
|
||||||
targetFile.parentFile.listFiles().forEach {
|
// targetFile.parentFile.listFiles().forEach {
|
||||||
it.delete()
|
// it.delete()
|
||||||
}
|
// }
|
||||||
targetFile.parentFile.delete()
|
// targetFile.parentFile.delete()
|
||||||
}
|
// }
|
||||||
targetFile.delete()
|
// targetFile.delete()
|
||||||
}
|
// }
|
||||||
fun excute() {
|
// fun excute() {
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
// CoroutineScope(Dispatchers.IO).launch {
|
||||||
LogUtil.e("onHtml value >> ${value}")
|
// LogUtil.e("onHtml value >> ${value}")
|
||||||
mediaUrls.forEach { url ->
|
// mediaUrls.forEach { url ->
|
||||||
var downPic = false
|
// var downPic = false
|
||||||
try {
|
// try {
|
||||||
LogUtil.e("try Jsoup.parse ${url}")
|
// LogUtil.e("try Jsoup.parse ${url}")
|
||||||
Jsoup.parse(URL(url), defaultTime.times(4).toInt()).let {
|
// Jsoup.parse(URL(url), defaultTime.times(4).toInt()).let {
|
||||||
try {
|
// try {
|
||||||
LogUtil.e("onit Jsoup.parse ${it.title()}")
|
// LogUtil.e("onit Jsoup.parse ${it.title()}")
|
||||||
if (it.select("svg").size > 0) {
|
// if (it.select("svg").size > 0) {
|
||||||
try {
|
// try {
|
||||||
downPic(url, agent, current!!, cookie!!, lDownFinishListener)
|
// downPic(url, agent, current!!, cookie!!, lDownFinishListener)
|
||||||
reqCount += 1
|
// reqCount += 1
|
||||||
} catch (e : Exception) {
|
// } catch (e : Exception) {
|
||||||
e.printStackTrace()
|
// e.printStackTrace()
|
||||||
}
|
// }
|
||||||
} else {
|
// } else {
|
||||||
it.getElementsByTag("video")?.forEach {
|
// it.getElementsByTag("video")?.forEach {
|
||||||
it.attribute("src").value?.let {
|
// it.attribute("src").value?.let {
|
||||||
var url = if (it.startsWith("http")) {
|
// var url = if (it.startsWith("http")) {
|
||||||
it
|
// it
|
||||||
} else {
|
// } else {
|
||||||
"https:".plus(it)
|
// "https:".plus(it)
|
||||||
}
|
// }
|
||||||
try {
|
// try {
|
||||||
downMp4(url, agent, current!!, cookie!!, lDownFinishListener)
|
// downMp4(url, agent, current!!, cookie!!, lDownFinishListener)
|
||||||
reqCount += 1
|
// reqCount += 1
|
||||||
} catch (e : Exception) {
|
// } catch (e : Exception) {
|
||||||
e.printStackTrace()
|
// e.printStackTrace()
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
} catch (e: UnsupportedMimeTypeException) {
|
// } catch (e: UnsupportedMimeTypeException) {
|
||||||
LogUtil.e("e.message3 ${e.message}")
|
// LogUtil.e("e.message3 ${e.message}")
|
||||||
} catch (e: Exception) {
|
// } catch (e: Exception) {
|
||||||
LogUtil.e("e.message4 ${e.message}")
|
// LogUtil.e("e.message4 ${e.message}")
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
} catch (e: UnsupportedMimeTypeException) {
|
// } catch (e: UnsupportedMimeTypeException) {
|
||||||
LogUtil.e("e.message ${e.message}")
|
// LogUtil.e("e.message ${e.message}")
|
||||||
LogUtil.e("e.message ${e.localizedMessage}")
|
// LogUtil.e("e.message ${e.localizedMessage}")
|
||||||
if (e.message?.contains("Must be text") == true) {
|
// if (e.message?.contains("Must be text") == true) {
|
||||||
downPic = true
|
// downPic = true
|
||||||
}
|
// }
|
||||||
} catch (e: Exception) {
|
// } catch (e: Exception) {
|
||||||
if (url.contains("dcimg") == true) {
|
// if (url.contains("dcimg") == true) {
|
||||||
downPic = true
|
// downPic = true
|
||||||
}
|
// }
|
||||||
LogUtil.e("e.message2 ${e.message}")
|
// LogUtil.e("e.message2 ${e.message}")
|
||||||
} finally {
|
// } finally {
|
||||||
if (downPic) {
|
// if (downPic) {
|
||||||
try {
|
// try {
|
||||||
downPic(url, agent, current!!, cookie!!, lDownFinishListener)
|
// downPic(url, agent, current!!, cookie!!, lDownFinishListener)
|
||||||
reqCount += 1
|
// reqCount += 1
|
||||||
} catch (e : Exception) {
|
// } catch (e : Exception) {
|
||||||
e.printStackTrace()
|
// e.printStackTrace()
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
delay(defaultTime)
|
// delay(defaultTime)
|
||||||
}
|
// }
|
||||||
LogUtil.e("END OF LOOP ${reqCount}")
|
// LogUtil.e("END OF LOOP ${reqCount}")
|
||||||
endOfLooPCheck = true
|
// endOfLooPCheck = true
|
||||||
delay(defaultTime.times(4))
|
// delay(defaultTime.times(4))
|
||||||
if (reqCount <= 0) {
|
// if (reqCount <= 0) {
|
||||||
enofLoop()
|
// enofLoop()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
fun indexSave(htmlString:StringBuffer, targetFile :File, host: String) {
|
// fun indexSave(htmlString:StringBuffer, targetFile :File, host: String) {
|
||||||
BufferedWriter(FileWriter(targetFile)).use { writer ->
|
// BufferedWriter(FileWriter(targetFile)).use { writer ->
|
||||||
trimHtnl(htmlString.toString(), host)?.let { result ->
|
// trimHtnl(htmlString.toString(), host)?.let { result ->
|
||||||
writer.write(result.toString())
|
// writer.write(result.toString())
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
fun trimHtnl(target : String, host : String) : StringBuffer {
|
// fun trimHtnl(target : String, host : String) : StringBuffer {
|
||||||
var result = target.replace("\\\"","\"").replace("\\n\\t\\t\\t","").replace("\\n\\t\\t","").replace("\\n\\t","").replace("\\t", "").replace("\\n", "").replace("\"\"\"","").replace("href=\"//","href=\"https://").replace("src=\"//","src=\"https://").replace("url(\"//","url(\"https://").replace("url("//","url("https://")
|
// var result = target.replace("\\\"","\"").replace("\\n\\t\\t\\t","").replace("\\n\\t\\t","").replace("\\n\\t","").replace("\\t", "").replace("\\n", "").replace("\"\"\"","").replace("href=\"//","href=\"https://").replace("src=\"//","src=\"https://").replace("url(\"//","url(\"https://").replace("url("//","url("https://")
|
||||||
if (host?.contains("clien") == true) {
|
// if (host?.contains("clien") == true) {
|
||||||
result = result.replace("href=\"/service","href=\"https://m.clien.net/service").replace("href=\"\\"/service","href=\"\\"https://m.clien.net/service")
|
// result = result.replace("href=\"/service","href=\"https://m.clien.net/service").replace("href=\"\\"/service","href=\"\\"https://m.clien.net/service")
|
||||||
}
|
// }
|
||||||
return StringBuffer(result)
|
// return StringBuffer(result)
|
||||||
}
|
// }
|
||||||
fun downMp4(url : String, agent : String, current : String,cookie : String, listner :DownFinishListener) {
|
// fun downMp4(url : String, agent : String, current : String,cookie : String, listner :DownFinishListener) {
|
||||||
LogUtil.e("try imageFile down ${url}")
|
// LogUtil.e("try imageFile down ${url}")
|
||||||
val path = File(
|
// val path = File(
|
||||||
Environment.getExternalStorageDirectory(),
|
// Environment.getExternalStorageDirectory(),
|
||||||
"bums"
|
// "bums"
|
||||||
)
|
// )
|
||||||
DownPicUtil.downMp4(
|
// DownPicUtil.downMp4(
|
||||||
File(
|
// File(
|
||||||
path,"private_mp4"
|
// path,"private_mp4"
|
||||||
).path,
|
// ).path,
|
||||||
url,
|
// url,
|
||||||
agent,
|
// agent,
|
||||||
current,
|
// current,
|
||||||
cookie,
|
// cookie,
|
||||||
listner
|
// listner
|
||||||
)
|
// )
|
||||||
}
|
// }
|
||||||
fun downPic( url : String, agent : String, current : String,cookie : String, listner :DownFinishListener) {
|
// fun downPic( url : String, agent : String, current : String,cookie : String, listner :DownFinishListener) {
|
||||||
LogUtil.e("try imageFile down ${url}")
|
// LogUtil.e("try imageFile down ${url}")
|
||||||
val cookieManager =
|
// val cookieManager =
|
||||||
CookieManager.getInstance()
|
// CookieManager.getInstance()
|
||||||
val cookie =
|
// val cookie =
|
||||||
cookieManager.getCookie(current)
|
// cookieManager.getCookie(current)
|
||||||
val path = File(
|
// val path = File(
|
||||||
Environment.getExternalStorageDirectory(),
|
// Environment.getExternalStorageDirectory(),
|
||||||
"bums"
|
// "bums"
|
||||||
)
|
// )
|
||||||
|
//
|
||||||
DownPicUtil.downPic(
|
// DownPicUtil.downPic(
|
||||||
File(path, "private_img").path,
|
// File(path, "private_img").path,
|
||||||
url,
|
// url,
|
||||||
agent,
|
// agent,
|
||||||
current,
|
// current,
|
||||||
cookie,
|
// cookie,
|
||||||
listner)
|
// listner)
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
@ -20,7 +20,6 @@ package bums.lunatic.launcher.home
|
|||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.DialogInterface
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
@ -28,30 +27,24 @@ import android.net.Uri
|
|||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.PointerIcon
|
import android.view.PointerIcon
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.CheckBox
|
|
||||||
import android.widget.EditText
|
|
||||||
import android.widget.ImageButton
|
import android.widget.ImageButton
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.annotation.NonNull
|
import androidx.annotation.NonNull
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
import androidx.recyclerview.widget.DividerItemDecoration
|
import androidx.recyclerview.widget.DividerItemDecoration
|
||||||
import androidx.recyclerview.widget.ItemTouchHelper
|
import androidx.recyclerview.widget.ItemTouchHelper
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import androidx.work.NetworkType
|
|
||||||
import bums.lunatic.launcher.LauncherActivity
|
import bums.lunatic.launcher.LauncherActivity
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
|
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
|
||||||
import bums.lunatic.launcher.LunaticLauncher
|
|
||||||
import bums.lunatic.launcher.R
|
import bums.lunatic.launcher.R
|
||||||
import bums.lunatic.launcher.common.letTrue
|
import bums.lunatic.launcher.common.letTrue
|
||||||
import bums.lunatic.launcher.databinding.LauncherHomeBinding
|
import bums.lunatic.launcher.databinding.LauncherHomeBinding
|
||||||
@ -63,7 +56,6 @@ import bums.lunatic.launcher.model.RssData
|
|||||||
import bums.lunatic.launcher.model.RssDataType
|
import bums.lunatic.launcher.model.RssDataType
|
||||||
import bums.lunatic.launcher.model.WeatherForcast
|
import bums.lunatic.launcher.model.WeatherForcast
|
||||||
import bums.lunatic.launcher.openReddit
|
import bums.lunatic.launcher.openReddit
|
||||||
import bums.lunatic.launcher.openYouTube
|
|
||||||
import bums.lunatic.launcher.tokiz.view.JxEvent
|
import bums.lunatic.launcher.tokiz.view.JxEvent
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import bums.lunatic.launcher.utils.SimpleFingerGestures
|
import bums.lunatic.launcher.utils.SimpleFingerGestures
|
||||||
@ -72,8 +64,6 @@ import bums.lunatic.launcher.utils.beforeOneDay
|
|||||||
import bums.lunatic.launcher.workers.WorkersDb
|
import bums.lunatic.launcher.workers.WorkersDb
|
||||||
import bums.lunatic.launcher.workers.WorkersDb.getRealm
|
import bums.lunatic.launcher.workers.WorkersDb.getRealm
|
||||||
import com.google.android.material.imageview.ShapeableImageView
|
import com.google.android.material.imageview.ShapeableImageView
|
||||||
import com.google.gson.Gson
|
|
||||||
import com.squareup.picasso.NetworkPolicy
|
|
||||||
import com.squareup.picasso.Picasso
|
import com.squareup.picasso.Picasso
|
||||||
import io.realm.kotlin.UpdatePolicy
|
import io.realm.kotlin.UpdatePolicy
|
||||||
import io.realm.kotlin.ext.query
|
import io.realm.kotlin.ext.query
|
||||||
@ -422,22 +412,9 @@ internal class RssHome : Fragment() {
|
|||||||
fun openGecko(rssData: RssData? = null) {
|
fun openGecko(rssData: RssData? = null) {
|
||||||
Blog.LOGE("rssData >>> ${rssData}")
|
Blog.LOGE("rssData >>> ${rssData}")
|
||||||
binding.layoutRssSummary.root.visibility = View.GONE
|
binding.layoutRssSummary.root.visibility = View.GONE
|
||||||
if (rssData?.category()?.equals(RssDataType.PRIVATE) == false && rssData?.originPage?.isNotEmpty() == true) {
|
|
||||||
rssData?.let { rss ->
|
fun openSummary(rssData : RssData) {
|
||||||
currentRss = rss
|
rssData.let {
|
||||||
binding.geckoWeb.privateMode = false
|
|
||||||
appendReadCount(rss, 1, false)
|
|
||||||
rss?.originPage?.let { rssId->
|
|
||||||
synchronized(lasted) {
|
|
||||||
if (lasted.isNotEmpty()) {
|
|
||||||
lasted.removeAll { target -> target.originPage.equals(rssId) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
binding.geckoWeb.loadUrl(rssId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (rssData?.category()?.equals(RssDataType.PRIVATE) == true){
|
|
||||||
rssData?.let {
|
|
||||||
currentRss = it
|
currentRss = it
|
||||||
|
|
||||||
synchronized(lasted) {
|
synchronized(lasted) {
|
||||||
@ -496,7 +473,7 @@ internal class RssHome : Fragment() {
|
|||||||
binding.layoutRssSummary.cover.tag = it
|
binding.layoutRssSummary.cover.tag = it
|
||||||
it.thumbnailUrl().let {
|
it.thumbnailUrl().let {
|
||||||
Blog.LOGE(it)
|
Blog.LOGE(it)
|
||||||
loadImage(binding.layoutRssSummary.cover, it, retryCount = 3, isMain = true)
|
loadImage(binding.layoutRssSummary.cover, it, isMain = true)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -504,7 +481,7 @@ internal class RssHome : Fragment() {
|
|||||||
binding.layoutRssSummary.screen.tag = it
|
binding.layoutRssSummary.screen.tag = it
|
||||||
it.getScreen().let {
|
it.getScreen().let {
|
||||||
Blog.LOGE(it)
|
Blog.LOGE(it)
|
||||||
loadImage(binding.layoutRssSummary.screen, it, retryCount = 2, isMain = false)
|
loadImage(binding.layoutRssSummary.screen, it, isMain = false)
|
||||||
binding.layoutRssSummary.screenLink.text = it
|
binding.layoutRssSummary.screenLink.text = it
|
||||||
}
|
}
|
||||||
if (it.getMagnet().length < 10) {
|
if (it.getMagnet().length < 10) {
|
||||||
@ -514,6 +491,27 @@ internal class RssHome : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rssData?.category()?.equals(RssDataType.PRIVATE) == true && rssData?.getMagnet().isNullOrEmpty()) {
|
||||||
|
openSummary(rssData)
|
||||||
|
} else if (rssData?.originPage?.isNotEmpty() == true) {
|
||||||
|
rssData?.let { rss ->
|
||||||
|
currentRss = rss
|
||||||
|
binding.geckoWeb.privateMode = false
|
||||||
|
appendReadCount(rss, 1, false)
|
||||||
|
rss?.originPage?.let { rssId->
|
||||||
|
synchronized(lasted) {
|
||||||
|
if (lasted.isNotEmpty()) {
|
||||||
|
lasted.removeAll { target -> target.originPage.equals(rssId) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
binding.geckoWeb.loadUrl(rssId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rssData?.let { openSummary(it) }
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -872,8 +870,9 @@ internal class RssHome : Fragment() {
|
|||||||
direction: Int
|
direction: Int
|
||||||
) {
|
) {
|
||||||
Blog.LOGE("onSwiped direction >>>> $direction")
|
Blog.LOGE("onSwiped direction >>>> $direction")
|
||||||
(viewHolder.itemView.tag as? RssData)?.let { rss ->
|
(viewHolder.itemView.tag as? RssData)?.let { rssD : RssData ->
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
val rss : RssData = rssD
|
||||||
WorkersDb.getRealm().apply {
|
WorkersDb.getRealm().apply {
|
||||||
writeBlocking {
|
writeBlocking {
|
||||||
when (direction) {
|
when (direction) {
|
||||||
@ -887,7 +886,7 @@ internal class RssHome : Fragment() {
|
|||||||
query<RssData>(
|
query<RssData>(
|
||||||
"originPage == $0",
|
"originPage == $0",
|
||||||
rss.originPage
|
rss.originPage
|
||||||
).find().forEach { it ->
|
).find().forEach { it : RssData ->
|
||||||
it.read += nomoreShowCount
|
it.read += nomoreShowCount
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -952,10 +951,9 @@ internal class RssHome : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val mainHandler = Handler(Looper.getMainLooper())
|
val mainHandler = Handler(Looper.getMainLooper())
|
||||||
fun loadImage(imageView: ImageView, url: String?, retryCount: Int = 2, isMain : Boolean = false) {
|
fun loadImage(imageView: ImageView, url: String?, retryCount: Int = 4, isMain : Boolean = false) {
|
||||||
with(imageView) {
|
with(imageView) {
|
||||||
Picasso.get().cancelRequest(this)
|
Picasso.get().cancelRequest(this)
|
||||||
// setOnTouchListener(null)
|
|
||||||
setOnTouchListener(null)
|
setOnTouchListener(null)
|
||||||
}
|
}
|
||||||
imageView.setImageResource(R.drawable.ic_info)
|
imageView.setImageResource(R.drawable.ic_info)
|
||||||
@ -968,46 +966,35 @@ internal class RssHome : Fragment() {
|
|||||||
Blog.LOGE("loadImage >>> $url")
|
Blog.LOGE("loadImage >>> $url")
|
||||||
Picasso.get()
|
Picasso.get()
|
||||||
.load(url)
|
.load(url)
|
||||||
.networkPolicy(NetworkPolicy.NO_CACHE)
|
|
||||||
.into(imageView, object : com.squareup.picasso.Callback {
|
.into(imageView, object : com.squareup.picasso.Callback {
|
||||||
override fun onSuccess() {
|
override fun onSuccess() {
|
||||||
imageView.visibility = View.VISIBLE
|
imageView.visibility = View.VISIBLE
|
||||||
imageView.setAlpha(0.05f)
|
imageView.setAlpha(0.05f)
|
||||||
imageView.setOnClickListener(lOnClickListener)
|
imageView.setOnClickListener(lOnClickListener)
|
||||||
Blog.LOGE("Picasso load into onSuccess URL:$url")
|
Blog.LOGE("Picasso load into onSuccess URL:$url")
|
||||||
|
// Picasso.get().cancelRequest(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onError(e: Exception?) {
|
override fun onError(e: Exception?) {
|
||||||
e?.printStackTrace()
|
e?.printStackTrace()
|
||||||
|
// Picasso.get().cancelRequest(imageView)
|
||||||
if (retryCount > 0) {
|
if (retryCount > 0) {
|
||||||
// 메인 스레드에서 재시도
|
|
||||||
if (binding.layoutRssSummary.root.isVisible) {
|
if (binding.layoutRssSummary.root.isVisible) {
|
||||||
mainHandler.postDelayed({
|
mainHandler.postDelayed({
|
||||||
if (binding.layoutRssSummary.root.isVisible && imageView.visibility == View.INVISIBLE) {
|
if (binding.layoutRssSummary.root.isVisible) {
|
||||||
loadImage(imageView, url, retryCount - 1, isMain)
|
loadImage(imageView, url, retryCount - 1, isMain)
|
||||||
}
|
}
|
||||||
}, 6000L)
|
}, 3000L)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// // 3회 모두 실패: 대체 이미지 표시
|
// Picasso.get().cancelRequest(imageView)
|
||||||
// imageView.setImageResource(R.drawable.ic_info)
|
// rett(imageView,url)
|
||||||
// imageView.setAlpha(1f)
|
|
||||||
if (isMain) {
|
|
||||||
mainHandler.postDelayed({
|
|
||||||
binding.layoutRssSummary.root.visibility = View.GONE
|
|
||||||
currentRss?.originPage?.let {
|
|
||||||
binding.geckoWeb.loadUrl(
|
|
||||||
it
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}, 6000L)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
imageView.contentDescription = url
|
imageView.contentDescription = url
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
Picasso.get().cancelRequest(imageView)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
imageView.visibility = View.INVISIBLE
|
imageView.visibility = View.INVISIBLE
|
||||||
@ -1025,9 +1012,7 @@ internal class RssHome : Fragment() {
|
|||||||
client.newCall(request).enqueue(object : Callback {
|
client.newCall(request).enqueue(object : Callback {
|
||||||
override fun onFailure(call: Call, e: IOException) {
|
override fun onFailure(call: Call, e: IOException) {
|
||||||
// 실패 시 기본 이미지 처리 or 로깅
|
// 실패 시 기본 이미지 처리 or 로깅
|
||||||
mainHandler.post({
|
|
||||||
// imageView.setImageResource(R.drawable.error_image)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResponse(call: Call, response: Response) {
|
override fun onResponse(call: Call, response: Response) {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -17,9 +17,6 @@ import android.widget.Button
|
|||||||
import android.widget.CheckBox
|
import android.widget.CheckBox
|
||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.RadioButton
|
|
||||||
import android.widget.RadioGroup
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.core.view.forEach
|
import androidx.core.view.forEach
|
||||||
import bums.lunatic.launcher.R
|
import bums.lunatic.launcher.R
|
||||||
import bums.lunatic.launcher.model.RssDataType
|
import bums.lunatic.launcher.model.RssDataType
|
||||||
|
|||||||
@ -14,15 +14,10 @@ import android.view.ViewGroup
|
|||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
import android.view.inputmethod.InputMethodManager
|
import android.view.inputmethod.InputMethodManager
|
||||||
import android.widget.Button
|
|
||||||
import android.widget.CheckBox
|
import android.widget.CheckBox
|
||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import android.widget.LinearLayout
|
|
||||||
import android.widget.RadioButton
|
import android.widget.RadioButton
|
||||||
import android.widget.RadioGroup
|
import android.widget.RadioGroup
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.core.view.children
|
|
||||||
import androidx.core.view.forEach
|
|
||||||
import bums.lunatic.launcher.R
|
import bums.lunatic.launcher.R
|
||||||
import bums.lunatic.launcher.model.RssDataType
|
import bums.lunatic.launcher.model.RssDataType
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||||
|
|||||||
@ -29,28 +29,18 @@ import androidx.core.net.toUri
|
|||||||
import androidx.recyclerview.widget.DiffUtil
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.lActivity
|
|
||||||
import bums.lunatic.launcher.R
|
|
||||||
import bums.lunatic.launcher.databinding.ListItemWithBinding
|
import bums.lunatic.launcher.databinding.ListItemWithBinding
|
||||||
import bums.lunatic.launcher.home.RssViewBuilder
|
|
||||||
import bums.lunatic.launcher.model.RssData
|
import bums.lunatic.launcher.model.RssData
|
||||||
import bums.lunatic.launcher.model.RssDataInterface
|
import bums.lunatic.launcher.model.RssDataInterface
|
||||||
import bums.lunatic.launcher.model.RssDataType
|
|
||||||
import bums.lunatic.launcher.openClient
|
|
||||||
import bums.lunatic.launcher.openReddit
|
|
||||||
import bums.lunatic.launcher.openYouTube
|
|
||||||
import bums.lunatic.launcher.tokiz.view.JxEvent
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import bums.lunatic.launcher.utils.SimpleFingerGestures
|
import bums.lunatic.launcher.utils.SimpleFingerGestures
|
||||||
import bums.lunatic.launcher.workers.WorkersDb
|
import bums.lunatic.launcher.workers.WorkersDb
|
||||||
import com.google.android.material.imageview.ShapeableImageView
|
import com.bumptech.glide.Glide
|
||||||
import com.squareup.picasso.NetworkPolicy
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||||
|
import com.bumptech.glide.request.RequestOptions
|
||||||
|
import com.squareup.picasso.Callback
|
||||||
import com.squareup.picasso.Picasso
|
import com.squareup.picasso.Picasso
|
||||||
import io.realm.kotlin.UpdatePolicy
|
import io.realm.kotlin.UpdatePolicy
|
||||||
import kotlinx.coroutines.CoroutineScope
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kr.lunaticbum.awesomewebview.listeners.WebViewListener
|
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
|
||||||
@ -62,15 +52,8 @@ internal class RssItemAdapter (
|
|||||||
@SuppressLint("SimpleDateFormat")
|
@SuppressLint("SimpleDateFormat")
|
||||||
val dateFormat = SimpleDateFormat("a HH:mm / yy - MM - dd")
|
val dateFormat = SimpleDateFormat("a HH:mm / yy - MM - dd")
|
||||||
val emptyDate = " - "
|
val emptyDate = " - "
|
||||||
// var rssList: ArrayList<String> = ArrayList()
|
// var rssList: ArrayList<String> = ArrayList()
|
||||||
val webViewListener = object : WebViewListener() {
|
|
||||||
override fun onCustomMenuClick(menuCode: String?) {
|
|
||||||
super.onCustomMenuClick(menuCode)
|
|
||||||
if ("PDF".equals(menuCode)) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private var rssDataItemLis: ArrayList<RssData> = arrayListOf()
|
private var rssDataItemLis: ArrayList<RssData> = arrayListOf()
|
||||||
val mLongClickListener = View.OnLongClickListener { v ->
|
val mLongClickListener = View.OnLongClickListener { v ->
|
||||||
@ -214,16 +197,27 @@ internal class RssItemAdapter (
|
|||||||
holder.view.circlePreview.setImageResource(rssData.category().getResId())
|
holder.view.circlePreview.setImageResource(rssData.category().getResId())
|
||||||
}
|
}
|
||||||
|
|
||||||
if(rssData.category().equals(RssDataType.PRIVATE) == false) {
|
if (rssData.thumbnailUrl()?.length ?: 0 > 6) {
|
||||||
if (rssData.thumbnailUrl()?.length ?: 0 > 6) {
|
Blog.LOGE("rssData.thumbnailUrl() >>> ${rssData.thumbnailUrl()}")
|
||||||
Blog.LOGE("rssData.thumbnailUrl() >>> ${rssData.thumbnailUrl()}")
|
val requestOptions = RequestOptions()
|
||||||
Picasso.get().load(rssData.thumbnailUrl().replace("&", "&").toUri()).networkPolicy(
|
.diskCacheStrategy(DiskCacheStrategy.ALL)
|
||||||
NetworkPolicy.NO_CACHE)
|
.timeout(3000) // 3초
|
||||||
.into(holder.view.circlePreview)
|
|
||||||
}
|
Picasso.get().load(rssData.thumbnailUrl().replace("&", "&").toUri())
|
||||||
|
.error(rssData.category().getResId())
|
||||||
|
.into(holder.view.circlePreview,object : Callback {
|
||||||
|
override fun onSuccess() {
|
||||||
|
// 캐시에서 이미지 성공적으로 로드됨
|
||||||
|
}
|
||||||
|
override fun onError(e: Exception?) {
|
||||||
|
Glide.with(holder.view.circlePreview).load(rssData.thumbnailUrl().replace("&", "&")).apply(requestOptions).error(rssData.category().getResId()).into(holder.view.circlePreview)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
holder.itemView.tag = rssData
|
holder.itemView.tag = rssData
|
||||||
holder.itemView.setOnClickListener(dateViewClick)
|
holder.itemView.setOnClickListener(dateViewClick)
|
||||||
holder.itemView.setOnTouchListener(object : View.OnTouchListener {
|
holder.itemView.setOnTouchListener(object : View.OnTouchListener {
|
||||||
|
|||||||
@ -1,52 +1,52 @@
|
|||||||
/*
|
///*
|
||||||
* Lunar Launcher
|
// * Lunar Launcher
|
||||||
* Copyright (C) 2022 Md Rasel Hossain
|
// * Copyright (C) 2022 Md Rasel Hossain
|
||||||
*
|
// *
|
||||||
* This program is free software: you can redistribute it and/or modify
|
// * This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
// * it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
// * the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
// * (at your option) any later version.
|
||||||
*
|
// *
|
||||||
* This program is distributed in the hope that it will be useful,
|
// * This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
// * GNU General Public License for more details.
|
||||||
*
|
// *
|
||||||
* You should have received a copy of the GNU General Public License
|
// * You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
// */
|
||||||
|
//
|
||||||
package bums.lunatic.launcher.home.weather
|
//package bums.lunatic.launcher.home.weather
|
||||||
|
//
|
||||||
import org.json.JSONException
|
//import org.json.JSONException
|
||||||
import org.json.JSONObject
|
//import org.json.JSONObject
|
||||||
|
//
|
||||||
|
//
|
||||||
internal class JsonParser {
|
//internal class JsonParser {
|
||||||
|
//
|
||||||
fun getMyWeather(jsonStr: String): Weather {
|
// fun getMyWeather(jsonStr: String): Weather {
|
||||||
val weather = Weather()
|
// val weather = Weather()
|
||||||
|
//
|
||||||
try {
|
// try {
|
||||||
val jsonObject = JSONObject(jsonStr)
|
// val jsonObject = JSONObject(jsonStr)
|
||||||
|
//
|
||||||
/* Get weather condition */
|
// /* Get weather condition */
|
||||||
val weatherArray = jsonObject.getJSONArray("weather")
|
// val weatherArray = jsonObject.getJSONArray("weather")
|
||||||
val weatherObject = weatherArray.getJSONObject(0)
|
// val weatherObject = weatherArray.getJSONObject(0)
|
||||||
weather.weatherCondition = weatherObject.getString("main")
|
// weather.weatherCondition = weatherObject.getString("main")
|
||||||
weather.weatherDescription = weatherObject.getString("description")
|
// weather.weatherDescription = weatherObject.getString("description")
|
||||||
weather.weatherIconId = weatherObject.getString("icon")
|
// weather.weatherIconId = weatherObject.getString("icon")
|
||||||
|
//
|
||||||
/* Get temperature */
|
// /* Get temperature */
|
||||||
val mainObject = jsonObject.getJSONObject("main")
|
// val mainObject = jsonObject.getJSONObject("main")
|
||||||
weather.temperature = mainObject.getDouble("temp").toFloat()
|
// weather.temperature = mainObject.getDouble("temp").toFloat()
|
||||||
|
//
|
||||||
weather.cityName = jsonObject.getString("name")
|
// weather.cityName = jsonObject.getString("name")
|
||||||
} catch (jsonException: JSONException) {
|
// } catch (jsonException: JSONException) {
|
||||||
jsonException.printStackTrace()
|
// jsonException.printStackTrace()
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
return weather
|
// return weather
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
//}
|
||||||
|
|||||||
@ -1,28 +1,28 @@
|
|||||||
/*
|
///*
|
||||||
* Lunar Launcher
|
// * Lunar Launcher
|
||||||
* Copyright (C) 2022 Md Rasel Hossain
|
// * Copyright (C) 2022 Md Rasel Hossain
|
||||||
*
|
// *
|
||||||
* This program is free software: you can redistribute it and/or modify
|
// * This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
// * it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
// * the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
// * (at your option) any later version.
|
||||||
*
|
// *
|
||||||
* This program is distributed in the hope that it will be useful,
|
// * This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
// * GNU General Public License for more details.
|
||||||
*
|
// *
|
||||||
* You should have received a copy of the GNU General Public License
|
// * You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
// */
|
||||||
|
//
|
||||||
package bums.lunatic.launcher.home.weather
|
//package bums.lunatic.launcher.home.weather
|
||||||
|
//
|
||||||
|
//
|
||||||
internal class Weather {
|
//internal class Weather {
|
||||||
var weatherCondition: String? = null
|
// var weatherCondition: String? = null
|
||||||
var weatherDescription: String? = null
|
// var weatherDescription: String? = null
|
||||||
var weatherIconId: String? = null
|
// var weatherIconId: String? = null
|
||||||
var temperature = 0f
|
// var temperature = 0f
|
||||||
var cityName: String? = null
|
// var cityName: String? = null
|
||||||
}
|
//}
|
||||||
|
|||||||
@ -1,61 +1,61 @@
|
|||||||
/*
|
///*
|
||||||
* Lunar Launcher
|
// * Lunar Launcher
|
||||||
* Copyright (C) 2022 Md Rasel Hossain
|
// * Copyright (C) 2022 Md Rasel Hossain
|
||||||
*
|
// *
|
||||||
* This program is free software: you can redistribute it and/or modify
|
// * This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
// * it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
// * the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
// * (at your option) any later version.
|
||||||
*
|
// *
|
||||||
* This program is distributed in the hope that it will be useful,
|
// * This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
// * GNU General Public License for more details.
|
||||||
*
|
// *
|
||||||
* You should have received a copy of the GNU General Public License
|
// * You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
// */
|
||||||
|
//
|
||||||
package bums.lunatic.launcher.home.weather
|
//package bums.lunatic.launcher.home.weather
|
||||||
|
//
|
||||||
import java.io.BufferedReader
|
//import java.io.BufferedReader
|
||||||
import java.io.InputStreamReader
|
//import java.io.InputStreamReader
|
||||||
import java.net.HttpURLConnection
|
//import java.net.HttpURLConnection
|
||||||
import java.net.URL
|
//import java.net.URL
|
||||||
|
//
|
||||||
|
//
|
||||||
internal class WeatherClient {
|
//internal class WeatherClient {
|
||||||
|
//
|
||||||
fun fetchWeather(wUrl: String?): String? {
|
// fun fetchWeather(wUrl: String?): String? {
|
||||||
var httpURLConnection: HttpURLConnection? = null
|
// var httpURLConnection: HttpURLConnection? = null
|
||||||
var bufferedReader: BufferedReader? = null
|
// var bufferedReader: BufferedReader? = null
|
||||||
|
//
|
||||||
try {
|
// try {
|
||||||
httpURLConnection = URL(wUrl).openConnection() as HttpURLConnection
|
// httpURLConnection = URL(wUrl).openConnection() as HttpURLConnection
|
||||||
httpURLConnection.connect()
|
// httpURLConnection.connect()
|
||||||
bufferedReader = BufferedReader(InputStreamReader(httpURLConnection.inputStream))
|
// bufferedReader = BufferedReader(InputStreamReader(httpURLConnection.inputStream))
|
||||||
|
//
|
||||||
val stringBuilder = StringBuilder()
|
// val stringBuilder = StringBuilder()
|
||||||
var line: String?
|
// var line: String?
|
||||||
while (bufferedReader.readLine().also { line = it } != null) {
|
// while (bufferedReader.readLine().also { line = it } != null) {
|
||||||
stringBuilder.append("$line\n")
|
// stringBuilder.append("$line\n")
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
if (stringBuilder.isNotEmpty()) return stringBuilder.toString()
|
// if (stringBuilder.isNotEmpty()) return stringBuilder.toString()
|
||||||
} catch (exception: Exception) {
|
// } catch (exception: Exception) {
|
||||||
exception.printStackTrace()
|
// exception.printStackTrace()
|
||||||
} finally {
|
// } finally {
|
||||||
httpURLConnection?.disconnect()
|
// httpURLConnection?.disconnect()
|
||||||
if (bufferedReader != null) {
|
// if (bufferedReader != null) {
|
||||||
try {
|
// try {
|
||||||
bufferedReader.close()
|
// bufferedReader.close()
|
||||||
} catch (exception: Exception) {
|
// } catch (exception: Exception) {
|
||||||
exception.printStackTrace()
|
// exception.printStackTrace()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
return null
|
// return null
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
//}
|
||||||
|
|||||||
@ -1,97 +1,97 @@
|
|||||||
/*
|
///*
|
||||||
* Lunar Launcher
|
// * Lunar Launcher
|
||||||
* Copyright (C) 2022 Md Rasel Hossain
|
// * Copyright (C) 2022 Md Rasel Hossain
|
||||||
*
|
// *
|
||||||
* This program is free software: you can redistribute it and/or modify
|
// * This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
// * it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
// * the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
// * (at your option) any later version.
|
||||||
*
|
// *
|
||||||
* This program is distributed in the hope that it will be useful,
|
// * This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
// * GNU General Public License for more details.
|
||||||
*
|
// *
|
||||||
* You should have received a copy of the GNU General Public License
|
// * You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// * along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
// */
|
||||||
|
//
|
||||||
package bums.lunatic.launcher.home.weather
|
//package bums.lunatic.launcher.home.weather
|
||||||
|
//
|
||||||
import android.annotation.SuppressLint
|
//import android.annotation.SuppressLint
|
||||||
import android.content.SharedPreferences
|
//import android.content.SharedPreferences
|
||||||
import android.os.Handler
|
//import android.os.Handler
|
||||||
import android.os.Looper
|
//import android.os.Looper
|
||||||
import android.view.View
|
//import android.view.View
|
||||||
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_CITY_NAME
|
//import bums.lunatic.launcher.helpers.Constants.Companion.KEY_CITY_NAME
|
||||||
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_OWM_API
|
//import bums.lunatic.launcher.helpers.Constants.Companion.KEY_OWM_API
|
||||||
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_SHOW_CITY
|
//import bums.lunatic.launcher.helpers.Constants.Companion.KEY_SHOW_CITY
|
||||||
import bums.lunatic.launcher.helpers.Constants.Companion.KEY_TEMP_UNIT
|
//import bums.lunatic.launcher.helpers.Constants.Companion.KEY_TEMP_UNIT
|
||||||
import bums.lunatic.launcher.helpers.UniUtils.Companion.isNetworkAvailable
|
//import bums.lunatic.launcher.helpers.UniUtils.Companion.isNetworkAvailable
|
||||||
import com.google.android.material.textview.MaterialTextView
|
//import com.google.android.material.textview.MaterialTextView
|
||||||
import java.util.concurrent.Executors
|
//import java.util.concurrent.Executors
|
||||||
|
//
|
||||||
|
//
|
||||||
internal class WeatherExecutor(sharedPreferences: SharedPreferences) {
|
//internal class WeatherExecutor(sharedPreferences: SharedPreferences) {
|
||||||
|
//
|
||||||
companion object {
|
// companion object {
|
||||||
var lastedCheckTime = 0L
|
// var lastedCheckTime = 0L
|
||||||
var weather: Weather? = null
|
// var weather: Weather? = null
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private val cityName: String
|
// private val cityName: String
|
||||||
private val owmApi: String
|
// private val owmApi: String
|
||||||
private val weatherUrl: String
|
// private val weatherUrl: String
|
||||||
private val tempUnit: Int
|
// private val tempUnit: Int
|
||||||
private val showCity: Boolean
|
// private val showCity: Boolean
|
||||||
|
//
|
||||||
@SuppressLint("SetTextI18n")
|
// @SuppressLint("SetTextI18n")
|
||||||
fun generateWeatherString(materialTextView: MaterialTextView) {
|
// fun generateWeatherString(materialTextView: MaterialTextView) {
|
||||||
materialTextView.visibility = View.GONE
|
// materialTextView.visibility = View.GONE
|
||||||
/* run the executor if network is available,
|
// /* run the executor if network is available,
|
||||||
and city name and owm api values are not empty */
|
// and city name and owm api values are not empty */
|
||||||
if (System.currentTimeMillis() - lastedCheckTime > (1000 * 60 * 15) && isNetworkAvailable && cityName.isNotEmpty() && owmApi.isNotEmpty()) {
|
// if (System.currentTimeMillis() - lastedCheckTime > (1000 * 60 * 15) && isNetworkAvailable && cityName.isNotEmpty() && owmApi.isNotEmpty()) {
|
||||||
try {
|
// try {
|
||||||
Executors.newSingleThreadExecutor().execute {
|
// Executors.newSingleThreadExecutor().execute {
|
||||||
WeatherClient().fetchWeather(weatherUrl).let {
|
// WeatherClient().fetchWeather(weatherUrl).let {
|
||||||
if (!it.isNullOrEmpty()) weather = JsonParser().getMyWeather(it)
|
// if (!it.isNullOrEmpty()) weather = JsonParser().getMyWeather(it)
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
Handler(Looper.getMainLooper()).post {
|
// Handler(Looper.getMainLooper()).post {
|
||||||
if (weather != null) {
|
// if (weather != null) {
|
||||||
materialTextView.apply {
|
// materialTextView.apply {
|
||||||
visibility = View.VISIBLE
|
// visibility = View.VISIBLE
|
||||||
text = weather!!.temperature.toString().substringBefore(".") +
|
// text = weather!!.temperature.toString().substringBefore(".") +
|
||||||
(if (tempUnit == 0) "ºC" else "ºF") +
|
// (if (tempUnit == 0) "ºC" else "ºF") +
|
||||||
(if (showCity) " at ${weather!!.cityName}" else "")
|
// (if (showCity) " at ${weather!!.cityName}" else "")
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
} catch (exception: Exception) {
|
// } catch (exception: Exception) {
|
||||||
exception.printStackTrace()
|
// exception.printStackTrace()
|
||||||
}
|
// }
|
||||||
} else {
|
// } else {
|
||||||
Handler(Looper.getMainLooper()).post {
|
// Handler(Looper.getMainLooper()).post {
|
||||||
if (weather != null) {
|
// if (weather != null) {
|
||||||
materialTextView.apply {
|
// materialTextView.apply {
|
||||||
visibility = View.VISIBLE
|
// visibility = View.VISIBLE
|
||||||
text = weather!!.temperature.toString().substringBefore(".") +
|
// text = weather!!.temperature.toString().substringBefore(".") +
|
||||||
(if (tempUnit == 0) "ºC" else "ºF") +
|
// (if (tempUnit == 0) "ºC" else "ºF") +
|
||||||
(if (showCity) " at ${weather!!.cityName}" else "")
|
// (if (showCity) " at ${weather!!.cityName}" else "")
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
lastedCheckTime = System.currentTimeMillis()
|
// lastedCheckTime = System.currentTimeMillis()
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
init {
|
// init {
|
||||||
cityName = sharedPreferences.getString(KEY_CITY_NAME, "").toString()
|
// cityName = sharedPreferences.getString(KEY_CITY_NAME, "").toString()
|
||||||
owmApi = sharedPreferences.getString(KEY_OWM_API, "").toString()
|
// owmApi = sharedPreferences.getString(KEY_OWM_API, "").toString()
|
||||||
tempUnit = sharedPreferences.getInt(KEY_TEMP_UNIT, 0)
|
// tempUnit = sharedPreferences.getInt(KEY_TEMP_UNIT, 0)
|
||||||
showCity = sharedPreferences.getBoolean(KEY_SHOW_CITY, false)
|
// showCity = sharedPreferences.getBoolean(KEY_SHOW_CITY, false)
|
||||||
weatherUrl = "https://api.openweathermap.org/data/2.5/weather?q=$cityName&APPID=$owmApi&units=" + if (tempUnit == 0) "metric" else "imperial"
|
// weatherUrl = "https://api.openweathermap.org/data/2.5/weather?q=$cityName&APPID=$owmApi&units=" + if (tempUnit == 0) "metric" else "imperial"
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
//}
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
package bums.lunatic.launcher.model
|
package bums.lunatic.launcher.model
|
||||||
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
|
||||||
import bums.lunatic.launcher.utils.JamoUtils
|
import bums.lunatic.launcher.utils.JamoUtils
|
||||||
import bums.lunatic.launcher.utils.afterDay
|
import bums.lunatic.launcher.utils.afterDay
|
||||||
import bums.lunatic.launcher.utils.beforeDayBy
|
import bums.lunatic.launcher.utils.beforeDayBy
|
||||||
|
|||||||
@ -2,7 +2,6 @@ package bums.lunatic.launcher.model
|
|||||||
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import bums.lunatic.launcher.R
|
import bums.lunatic.launcher.R
|
||||||
import bums.lunatic.launcher.helpers.PrefHelper
|
|
||||||
|
|
||||||
enum class RssDataType {
|
enum class RssDataType {
|
||||||
NO_DATA,
|
NO_DATA,
|
||||||
|
|||||||
@ -4,55 +4,26 @@ import android.Manifest
|
|||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.app.Notification
|
import android.app.Notification
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
import android.content.ComponentName
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
import android.location.Geocoder
|
import android.location.Geocoder
|
||||||
import android.location.Location
|
import android.location.Location
|
||||||
import android.media.MediaMetadata
|
|
||||||
import android.media.session.MediaSessionManager
|
|
||||||
import android.media.session.PlaybackState.STATE_PLAYING
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.service.notification.NotificationListenerService
|
import android.service.notification.NotificationListenerService
|
||||||
import android.service.notification.StatusBarNotification
|
import android.service.notification.StatusBarNotification
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.annotation.RequiresPermission
|
import androidx.annotation.RequiresPermission
|
||||||
import androidx.core.content.getSystemService
|
|
||||||
import bums.lunatic.launcher.LunaticLauncher.Companion.mHourlyLogWriter
|
import bums.lunatic.launcher.LunaticLauncher.Companion.mHourlyLogWriter
|
||||||
import bums.lunatic.launcher.common.letTrue
|
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService
|
import bums.lunatic.launcher.helpers.ForeGroundService
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.ACTION_SENDMSG
|
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.ACTION_SENDMSG
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.EXTRA_MSGKEY
|
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.EXTRA_MSGKEY
|
||||||
import bums.lunatic.launcher.helpers.PrefBoolean
|
import bums.lunatic.launcher.helpers.PrefBoolean
|
||||||
import bums.lunatic.launcher.helpers.PrefString
|
|
||||||
import bums.lunatic.launcher.model.CurrentPlayItem
|
|
||||||
import bums.lunatic.launcher.model.LocationLog
|
|
||||||
import bums.lunatic.launcher.model.NotificationItem
|
|
||||||
import bums.lunatic.launcher.utils.BitmapConverter
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import bums.lunatic.launcher.utils.KakaoPublicTransfer
|
import bums.lunatic.launcher.utils.KakaoPublicTransfer
|
||||||
import bums.lunatic.launcher.workers.LocationUpdateService.Companion.inRangeLocation
|
|
||||||
import bums.lunatic.launcher.workers.WorkersDb
|
|
||||||
import com.google.android.gms.location.LocationServices
|
import com.google.android.gms.location.LocationServices
|
||||||
import com.google.gson.Gson
|
|
||||||
import io.realm.kotlin.UpdatePolicy
|
|
||||||
import io.realm.kotlin.ext.query
|
|
||||||
import io.realm.kotlin.query.Sort
|
|
||||||
import okhttp3.ConnectionPool
|
|
||||||
import okhttp3.MediaType
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.Request
|
|
||||||
import okhttp3.RequestBody
|
|
||||||
import okhttp3.Response
|
|
||||||
import okhttp3.ResponseBody
|
|
||||||
import java.io.File
|
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.lang.Exception
|
|
||||||
import java.util.Base64
|
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import java.util.concurrent.Executors
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
|
|
||||||
class NLService : NotificationListenerService() {
|
class NLService : NotificationListenerService() {
|
||||||
|
|||||||
@ -34,13 +34,9 @@ import bums.lunatic.launcher.helpers.Constants.Companion.PREFS_SETTINGS
|
|||||||
import bums.lunatic.launcher.helpers.PrefBoolean
|
import bums.lunatic.launcher.helpers.PrefBoolean
|
||||||
import bums.lunatic.launcher.helpers.PrefHelper
|
import bums.lunatic.launcher.helpers.PrefHelper
|
||||||
import bums.lunatic.launcher.model.AppInfo
|
import bums.lunatic.launcher.model.AppInfo
|
||||||
import bums.lunatic.launcher.settings.childs.Advance
|
|
||||||
import bums.lunatic.launcher.settings.childs.Appearances
|
|
||||||
import bums.lunatic.launcher.settings.childs.Apps
|
import bums.lunatic.launcher.settings.childs.Apps
|
||||||
import bums.lunatic.launcher.settings.childs.HomeSettings
|
import bums.lunatic.launcher.settings.childs.HomeSettings
|
||||||
import bums.lunatic.launcher.settings.childs.Misc
|
import bums.lunatic.launcher.settings.childs.Misc
|
||||||
import bums.lunatic.launcher.settings.childs.TopInfos
|
|
||||||
import bums.lunatic.launcher.settings.childs.WeatherSettings
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import bums.lunatic.launcher.workers.WorkersDb
|
import bums.lunatic.launcher.workers.WorkersDb
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
|
|||||||
@ -27,7 +27,6 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import bums.lunatic.launcher.R
|
import bums.lunatic.launcher.R
|
||||||
import bums.lunatic.launcher.databinding.SettingsAppsBinding
|
import bums.lunatic.launcher.databinding.SettingsAppsBinding
|
||||||
import bums.lunatic.launcher.helpers.PrefBoolean
|
|
||||||
import bums.lunatic.launcher.helpers.PrefLong
|
import bums.lunatic.launcher.helpers.PrefLong
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
|
|||||||
@ -24,14 +24,9 @@ import android.view.LayoutInflater
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.core.widget.doOnTextChanged
|
import androidx.core.widget.doOnTextChanged
|
||||||
import bums.lunatic.launcher.R
|
|
||||||
import bums.lunatic.launcher.databinding.SettingsWeatherBinding
|
import bums.lunatic.launcher.databinding.SettingsWeatherBinding
|
||||||
import bums.lunatic.launcher.helpers.PrefBoolean
|
|
||||||
import bums.lunatic.launcher.helpers.PrefString
|
import bums.lunatic.launcher.helpers.PrefString
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
||||||
import kotlin.system.exitProcess
|
|
||||||
|
|
||||||
internal class WeatherSettings : SettingChild() {
|
internal class WeatherSettings : SettingChild() {
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +1,7 @@
|
|||||||
package bums.lunatic.launcher.tokiz
|
package bums.lunatic.launcher.tokiz
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.DialogInterface
|
import android.content.DialogInterface
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.ActivityInfo
|
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
@ -38,28 +36,27 @@ import androidx.fragment.app.Fragment
|
|||||||
import bums.lunatic.launcher.LauncherActivity
|
import bums.lunatic.launcher.LauncherActivity
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
||||||
import bums.lunatic.launcher.R
|
import bums.lunatic.launcher.R
|
||||||
|
import bums.lunatic.launcher.databinding.BooktokiBinding
|
||||||
|
import bums.lunatic.launcher.home.toast
|
||||||
import bums.lunatic.launcher.tokiz.common.PairArray
|
import bums.lunatic.launcher.tokiz.common.PairArray
|
||||||
import bums.lunatic.launcher.tokiz.common.TouchArea
|
import bums.lunatic.launcher.tokiz.common.TouchArea
|
||||||
import bums.lunatic.launcher.tokiz.common.colorz
|
import bums.lunatic.launcher.tokiz.common.colorz
|
||||||
import bums.lunatic.launcher.tokiz.common.getIndex
|
import bums.lunatic.launcher.tokiz.common.getIndex
|
||||||
import bums.lunatic.launcher.tokiz.common.typesfacez
|
import bums.lunatic.launcher.tokiz.common.typesfacez
|
||||||
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PageInfosJ
|
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
||||||
|
import bums.lunatic.launcher.tokiz.data.model.FakeSessions
|
||||||
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
||||||
|
import bums.lunatic.launcher.tokiz.data.model.PageInfosJ
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
||||||
import bums.lunatic.launcher.tokiz.dialog.DefaultList
|
import bums.lunatic.launcher.tokiz.dialog.DefaultList
|
||||||
|
import bums.lunatic.launcher.tokiz.view.BWebview
|
||||||
import bums.lunatic.launcher.tokiz.view.JxEvent
|
import bums.lunatic.launcher.tokiz.view.JxEvent
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextLayout
|
import bums.lunatic.launcher.tokiz.view.PagedTextLayout
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
||||||
import bums.lunatic.launcher.databinding.BooktokiBinding
|
|
||||||
import bums.lunatic.launcher.home.toast
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.FakeSession
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.FakeSessions
|
|
||||||
import bums.lunatic.launcher.tokiz.view.BWebview
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import bums.lunatic.launcher.workers.WorkersDb
|
import bums.lunatic.launcher.workers.WorkersDb
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
@ -83,25 +80,7 @@ import java.lang.System.currentTimeMillis
|
|||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import java.util.UUID
|
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.collections.List
|
|
||||||
import kotlin.collections.MutableList
|
|
||||||
import kotlin.collections.arrayListOf
|
|
||||||
import kotlin.collections.first
|
|
||||||
import kotlin.collections.isNotEmpty
|
|
||||||
import kotlin.collections.last
|
|
||||||
import kotlin.collections.sortBy
|
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
import kotlin.text.contains
|
|
||||||
import kotlin.text.endsWith
|
|
||||||
import kotlin.text.equals
|
|
||||||
import kotlin.text.replace
|
|
||||||
import kotlin.text.split
|
|
||||||
import kotlin.text.startsWith
|
|
||||||
import kotlin.text.toInt
|
|
||||||
import kotlin.text.toRegex
|
|
||||||
import kotlin.text.trim
|
|
||||||
|
|
||||||
|
|
||||||
abstract class BaseToki : Fragment(), PagedTextViewInterface {
|
abstract class BaseToki : Fragment(), PagedTextViewInterface {
|
||||||
|
|||||||
@ -1,97 +1,14 @@
|
|||||||
package bums.lunatic.launcher.tokiz
|
package bums.lunatic.launcher.tokiz
|
||||||
|
|
||||||
import android.content.DialogInterface
|
|
||||||
import android.content.Intent
|
|
||||||
import android.content.pm.ActivityInfo
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
import android.os.Message
|
|
||||||
import android.text.InputType
|
|
||||||
import android.text.SpannableStringBuilder
|
|
||||||
import android.text.style.RelativeSizeSpan
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.GONE
|
import android.view.View.GONE
|
||||||
import android.view.View.OnTouchListener
|
|
||||||
import android.view.View.VISIBLE
|
|
||||||
import android.view.View.inflate
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.webkit.WebView
|
|
||||||
import android.webkit.WebViewClient
|
|
||||||
import android.widget.ArrayAdapter
|
|
||||||
import android.widget.EditText
|
|
||||||
import android.widget.TextView
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
import androidx.core.net.toUri
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
|
||||||
import bums.lunatic.launcher.R
|
|
||||||
import bums.lunatic.launcher.tokiz.common.PairArray
|
|
||||||
import bums.lunatic.launcher.tokiz.common.TouchArea
|
import bums.lunatic.launcher.tokiz.common.TouchArea
|
||||||
import bums.lunatic.launcher.tokiz.common.colorz
|
|
||||||
import bums.lunatic.launcher.tokiz.common.getIndex
|
|
||||||
import bums.lunatic.launcher.tokiz.common.typesfacez
|
|
||||||
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PageInfosJ
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
|
||||||
import bums.lunatic.launcher.tokiz.dialog.DefaultList
|
|
||||||
import bums.lunatic.launcher.tokiz.view.JxEvent
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextLayout
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
||||||
import bums.lunatic.launcher.databinding.BooktokiBinding
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import com.google.gson.Gson
|
|
||||||
import io.realm.kotlin.Realm
|
|
||||||
import io.realm.kotlin.UpdatePolicy
|
|
||||||
import io.realm.kotlin.ext.copyFromRealm
|
|
||||||
import io.realm.kotlin.ext.query
|
|
||||||
import org.json.JSONException
|
|
||||||
import org.json.JSONObject
|
|
||||||
import org.mozilla.gecko.util.ThreadUtils
|
|
||||||
import org.mozilla.geckoview.GeckoResult
|
|
||||||
import org.mozilla.geckoview.GeckoSession
|
|
||||||
import org.mozilla.geckoview.MediaSession
|
|
||||||
import org.mozilla.geckoview.WebExtension
|
|
||||||
import org.mozilla.geckoview.WebExtension.MessageDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtension.PortDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtensionController.AddonManagerDelegate
|
|
||||||
import org.mozilla.geckoview.WebRequestError
|
|
||||||
import java.lang.System.currentTimeMillis
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Date
|
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.collections.List
|
|
||||||
import kotlin.collections.MutableList
|
|
||||||
import kotlin.collections.arrayListOf
|
|
||||||
import kotlin.collections.first
|
|
||||||
import kotlin.collections.isNotEmpty
|
|
||||||
import kotlin.collections.last
|
|
||||||
import kotlin.collections.sortBy
|
|
||||||
import kotlin.random.Random
|
|
||||||
import kotlin.text.contains
|
|
||||||
import kotlin.text.endsWith
|
|
||||||
import kotlin.text.equals
|
|
||||||
import kotlin.text.replace
|
|
||||||
import kotlin.text.split
|
|
||||||
import kotlin.text.startsWith
|
|
||||||
import kotlin.text.toInt
|
|
||||||
import kotlin.text.toRegex
|
|
||||||
import kotlin.text.trim
|
|
||||||
|
|
||||||
|
|
||||||
class Comics : BaseToki(), PagedTextViewInterface {
|
class Comics : BaseToki(), PagedTextViewInterface {
|
||||||
|
|||||||
@ -1,97 +1,14 @@
|
|||||||
package bums.lunatic.launcher.tokiz
|
package bums.lunatic.launcher.tokiz
|
||||||
|
|
||||||
import android.content.DialogInterface
|
|
||||||
import android.content.Intent
|
|
||||||
import android.content.pm.ActivityInfo
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
import android.os.Message
|
|
||||||
import android.text.InputType
|
|
||||||
import android.text.SpannableStringBuilder
|
|
||||||
import android.text.style.RelativeSizeSpan
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.GONE
|
import android.view.View.GONE
|
||||||
import android.view.View.OnTouchListener
|
|
||||||
import android.view.View.VISIBLE
|
|
||||||
import android.view.View.inflate
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.webkit.WebView
|
|
||||||
import android.webkit.WebViewClient
|
|
||||||
import android.widget.ArrayAdapter
|
|
||||||
import android.widget.EditText
|
|
||||||
import android.widget.TextView
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
import androidx.core.net.toUri
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
|
||||||
import bums.lunatic.launcher.R
|
|
||||||
import bums.lunatic.launcher.tokiz.common.PairArray
|
|
||||||
import bums.lunatic.launcher.tokiz.common.TouchArea
|
import bums.lunatic.launcher.tokiz.common.TouchArea
|
||||||
import bums.lunatic.launcher.tokiz.common.colorz
|
|
||||||
import bums.lunatic.launcher.tokiz.common.getIndex
|
|
||||||
import bums.lunatic.launcher.tokiz.common.typesfacez
|
|
||||||
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PageInfosJ
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
|
||||||
import bums.lunatic.launcher.tokiz.dialog.DefaultList
|
|
||||||
import bums.lunatic.launcher.tokiz.view.JxEvent
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextLayout
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
||||||
import bums.lunatic.launcher.databinding.BooktokiBinding
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import com.google.gson.Gson
|
|
||||||
import io.realm.kotlin.Realm
|
|
||||||
import io.realm.kotlin.UpdatePolicy
|
|
||||||
import io.realm.kotlin.ext.copyFromRealm
|
|
||||||
import io.realm.kotlin.ext.query
|
|
||||||
import org.json.JSONException
|
|
||||||
import org.json.JSONObject
|
|
||||||
import org.mozilla.gecko.util.ThreadUtils
|
|
||||||
import org.mozilla.geckoview.GeckoResult
|
|
||||||
import org.mozilla.geckoview.GeckoSession
|
|
||||||
import org.mozilla.geckoview.MediaSession
|
|
||||||
import org.mozilla.geckoview.WebExtension
|
|
||||||
import org.mozilla.geckoview.WebExtension.MessageDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtension.PortDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtensionController.AddonManagerDelegate
|
|
||||||
import org.mozilla.geckoview.WebRequestError
|
|
||||||
import java.lang.System.currentTimeMillis
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Date
|
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.collections.List
|
|
||||||
import kotlin.collections.MutableList
|
|
||||||
import kotlin.collections.arrayListOf
|
|
||||||
import kotlin.collections.first
|
|
||||||
import kotlin.collections.isNotEmpty
|
|
||||||
import kotlin.collections.last
|
|
||||||
import kotlin.collections.sortBy
|
|
||||||
import kotlin.random.Random
|
|
||||||
import kotlin.text.contains
|
|
||||||
import kotlin.text.endsWith
|
|
||||||
import kotlin.text.equals
|
|
||||||
import kotlin.text.replace
|
|
||||||
import kotlin.text.split
|
|
||||||
import kotlin.text.startsWith
|
|
||||||
import kotlin.text.toInt
|
|
||||||
import kotlin.text.toRegex
|
|
||||||
import kotlin.text.trim
|
|
||||||
|
|
||||||
|
|
||||||
class Magnet : BaseToki(), PagedTextViewInterface {
|
class Magnet : BaseToki(), PagedTextViewInterface {
|
||||||
|
|||||||
@ -1,95 +1,14 @@
|
|||||||
package bums.lunatic.launcher.tokiz
|
package bums.lunatic.launcher.tokiz
|
||||||
|
|
||||||
import android.content.DialogInterface
|
|
||||||
import android.content.Intent
|
|
||||||
import android.content.pm.ActivityInfo
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
import android.os.Message
|
|
||||||
import android.text.InputType
|
|
||||||
import android.text.SpannableStringBuilder
|
|
||||||
import android.text.style.RelativeSizeSpan
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.GONE
|
import android.view.View.GONE
|
||||||
import android.view.View.OnTouchListener
|
|
||||||
import android.view.View.VISIBLE
|
|
||||||
import android.view.View.inflate
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.webkit.WebView
|
|
||||||
import android.webkit.WebViewClient
|
|
||||||
import android.widget.ArrayAdapter
|
|
||||||
import android.widget.EditText
|
|
||||||
import android.widget.TextView
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.core.net.toUri
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
|
||||||
import bums.lunatic.launcher.R
|
|
||||||
import bums.lunatic.launcher.tokiz.common.PairArray
|
|
||||||
import bums.lunatic.launcher.tokiz.common.TouchArea
|
import bums.lunatic.launcher.tokiz.common.TouchArea
|
||||||
import bums.lunatic.launcher.tokiz.common.colorz
|
|
||||||
import bums.lunatic.launcher.tokiz.common.getIndex
|
|
||||||
import bums.lunatic.launcher.tokiz.common.typesfacez
|
|
||||||
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PageInfosJ
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
|
||||||
import bums.lunatic.launcher.tokiz.dialog.DefaultList
|
|
||||||
import bums.lunatic.launcher.tokiz.view.JxEvent
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextLayout
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
||||||
import bums.lunatic.launcher.databinding.BooktokiBinding
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import com.google.gson.Gson
|
|
||||||
import io.realm.kotlin.Realm
|
|
||||||
import io.realm.kotlin.UpdatePolicy
|
|
||||||
import io.realm.kotlin.ext.copyFromRealm
|
|
||||||
import io.realm.kotlin.ext.query
|
|
||||||
import org.json.JSONException
|
|
||||||
import org.json.JSONObject
|
|
||||||
import org.mozilla.gecko.util.ThreadUtils
|
|
||||||
import org.mozilla.geckoview.GeckoResult
|
|
||||||
import org.mozilla.geckoview.GeckoSession
|
|
||||||
import org.mozilla.geckoview.MediaSession
|
|
||||||
import org.mozilla.geckoview.WebExtension
|
|
||||||
import org.mozilla.geckoview.WebExtension.MessageDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtension.PortDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtensionController.AddonManagerDelegate
|
|
||||||
import org.mozilla.geckoview.WebRequestError
|
|
||||||
import java.lang.System.currentTimeMillis
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Date
|
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.collections.List
|
|
||||||
import kotlin.collections.MutableList
|
|
||||||
import kotlin.collections.arrayListOf
|
|
||||||
import kotlin.collections.first
|
|
||||||
import kotlin.collections.isNotEmpty
|
|
||||||
import kotlin.collections.last
|
|
||||||
import kotlin.collections.sortBy
|
|
||||||
import kotlin.random.Random
|
|
||||||
import kotlin.text.contains
|
|
||||||
import kotlin.text.endsWith
|
|
||||||
import kotlin.text.equals
|
|
||||||
import kotlin.text.replace
|
|
||||||
import kotlin.text.split
|
|
||||||
import kotlin.text.startsWith
|
|
||||||
import kotlin.text.toInt
|
|
||||||
import kotlin.text.toRegex
|
|
||||||
import kotlin.text.trim
|
|
||||||
|
|
||||||
|
|
||||||
class Novels : BaseToki(), PagedTextViewInterface {
|
class Novels : BaseToki(), PagedTextViewInterface {
|
||||||
|
|||||||
@ -1,97 +1,14 @@
|
|||||||
package bums.lunatic.launcher.tokiz
|
package bums.lunatic.launcher.tokiz
|
||||||
|
|
||||||
import android.content.DialogInterface
|
|
||||||
import android.content.Intent
|
|
||||||
import android.content.pm.ActivityInfo
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
import android.os.Message
|
|
||||||
import android.text.InputType
|
|
||||||
import android.text.SpannableStringBuilder
|
|
||||||
import android.text.style.RelativeSizeSpan
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.GONE
|
import android.view.View.GONE
|
||||||
import android.view.View.OnTouchListener
|
|
||||||
import android.view.View.VISIBLE
|
|
||||||
import android.view.View.inflate
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.webkit.WebView
|
|
||||||
import android.webkit.WebViewClient
|
|
||||||
import android.widget.ArrayAdapter
|
|
||||||
import android.widget.EditText
|
|
||||||
import android.widget.TextView
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
import androidx.core.net.toUri
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
|
||||||
import bums.lunatic.launcher.R
|
|
||||||
import bums.lunatic.launcher.tokiz.common.PairArray
|
|
||||||
import bums.lunatic.launcher.tokiz.common.TouchArea
|
import bums.lunatic.launcher.tokiz.common.TouchArea
|
||||||
import bums.lunatic.launcher.tokiz.common.colorz
|
|
||||||
import bums.lunatic.launcher.tokiz.common.getIndex
|
|
||||||
import bums.lunatic.launcher.tokiz.common.typesfacez
|
|
||||||
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PageInfosJ
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
|
||||||
import bums.lunatic.launcher.tokiz.dialog.DefaultList
|
|
||||||
import bums.lunatic.launcher.tokiz.view.JxEvent
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextLayout
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
||||||
import bums.lunatic.launcher.databinding.BooktokiBinding
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import com.google.gson.Gson
|
|
||||||
import io.realm.kotlin.Realm
|
|
||||||
import io.realm.kotlin.UpdatePolicy
|
|
||||||
import io.realm.kotlin.ext.copyFromRealm
|
|
||||||
import io.realm.kotlin.ext.query
|
|
||||||
import org.json.JSONException
|
|
||||||
import org.json.JSONObject
|
|
||||||
import org.mozilla.gecko.util.ThreadUtils
|
|
||||||
import org.mozilla.geckoview.GeckoResult
|
|
||||||
import org.mozilla.geckoview.GeckoSession
|
|
||||||
import org.mozilla.geckoview.MediaSession
|
|
||||||
import org.mozilla.geckoview.WebExtension
|
|
||||||
import org.mozilla.geckoview.WebExtension.MessageDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtension.PortDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtensionController.AddonManagerDelegate
|
|
||||||
import org.mozilla.geckoview.WebRequestError
|
|
||||||
import java.lang.System.currentTimeMillis
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Date
|
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.collections.List
|
|
||||||
import kotlin.collections.MutableList
|
|
||||||
import kotlin.collections.arrayListOf
|
|
||||||
import kotlin.collections.first
|
|
||||||
import kotlin.collections.isNotEmpty
|
|
||||||
import kotlin.collections.last
|
|
||||||
import kotlin.collections.sortBy
|
|
||||||
import kotlin.random.Random
|
|
||||||
import kotlin.text.contains
|
|
||||||
import kotlin.text.endsWith
|
|
||||||
import kotlin.text.equals
|
|
||||||
import kotlin.text.replace
|
|
||||||
import kotlin.text.split
|
|
||||||
import kotlin.text.startsWith
|
|
||||||
import kotlin.text.toInt
|
|
||||||
import kotlin.text.toRegex
|
|
||||||
import kotlin.text.trim
|
|
||||||
|
|
||||||
|
|
||||||
class Perplexity : BaseToki(), PagedTextViewInterface {
|
class Perplexity : BaseToki(), PagedTextViewInterface {
|
||||||
|
|||||||
@ -6,21 +6,16 @@ import android.os.Bundle
|
|||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.databinding.DataBindingUtil
|
import androidx.databinding.DataBindingUtil
|
||||||
import bums.lunatic.launcher.R
|
import bums.lunatic.launcher.R
|
||||||
|
import bums.lunatic.launcher.common.CommonActivity
|
||||||
|
import bums.lunatic.launcher.databinding.SettingsBinding
|
||||||
import bums.lunatic.launcher.tokiz.common.PairArray
|
import bums.lunatic.launcher.tokiz.common.PairArray
|
||||||
import bums.lunatic.launcher.tokiz.common.colorz
|
import bums.lunatic.launcher.tokiz.common.colorz
|
||||||
import bums.lunatic.launcher.tokiz.common.getIndex
|
import bums.lunatic.launcher.tokiz.common.getIndex
|
||||||
import bums.lunatic.launcher.tokiz.common.typesfacez
|
import bums.lunatic.launcher.tokiz.common.typesfacez
|
||||||
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
||||||
import bums.lunatic.launcher.common.CommonActivity
|
|
||||||
import bums.lunatic.launcher.databinding.SettingsBinding
|
|
||||||
import io.realm.kotlin.UpdatePolicy
|
import io.realm.kotlin.UpdatePolicy
|
||||||
import io.realm.kotlin.ext.query
|
import io.realm.kotlin.ext.query
|
||||||
import kotlin.collections.first
|
|
||||||
import kotlin.collections.last
|
|
||||||
import kotlin.collections.map
|
|
||||||
import kotlin.collections.toTypedArray
|
|
||||||
import kotlin.let
|
|
||||||
|
|
||||||
class Settings : CommonActivity() {
|
class Settings : CommonActivity() {
|
||||||
|
|
||||||
|
|||||||
@ -1,97 +1,14 @@
|
|||||||
package bums.lunatic.launcher.tokiz
|
package bums.lunatic.launcher.tokiz
|
||||||
|
|
||||||
import android.content.DialogInterface
|
|
||||||
import android.content.Intent
|
|
||||||
import android.content.pm.ActivityInfo
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
import android.os.Message
|
|
||||||
import android.text.InputType
|
|
||||||
import android.text.SpannableStringBuilder
|
|
||||||
import android.text.style.RelativeSizeSpan
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.GONE
|
import android.view.View.GONE
|
||||||
import android.view.View.OnTouchListener
|
|
||||||
import android.view.View.VISIBLE
|
|
||||||
import android.view.View.inflate
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.webkit.WebView
|
|
||||||
import android.webkit.WebViewClient
|
|
||||||
import android.widget.ArrayAdapter
|
|
||||||
import android.widget.EditText
|
|
||||||
import android.widget.TextView
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
import androidx.core.net.toUri
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
|
||||||
import bums.lunatic.launcher.R
|
|
||||||
import bums.lunatic.launcher.tokiz.common.PairArray
|
|
||||||
import bums.lunatic.launcher.tokiz.common.TouchArea
|
import bums.lunatic.launcher.tokiz.common.TouchArea
|
||||||
import bums.lunatic.launcher.tokiz.common.colorz
|
|
||||||
import bums.lunatic.launcher.tokiz.common.getIndex
|
|
||||||
import bums.lunatic.launcher.tokiz.common.typesfacez
|
|
||||||
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PageInfosJ
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
|
||||||
import bums.lunatic.launcher.tokiz.dialog.DefaultList
|
|
||||||
import bums.lunatic.launcher.tokiz.view.JxEvent
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextLayout
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
||||||
import bums.lunatic.launcher.databinding.BooktokiBinding
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import com.google.gson.Gson
|
|
||||||
import io.realm.kotlin.Realm
|
|
||||||
import io.realm.kotlin.UpdatePolicy
|
|
||||||
import io.realm.kotlin.ext.copyFromRealm
|
|
||||||
import io.realm.kotlin.ext.query
|
|
||||||
import org.json.JSONException
|
|
||||||
import org.json.JSONObject
|
|
||||||
import org.mozilla.gecko.util.ThreadUtils
|
|
||||||
import org.mozilla.geckoview.GeckoResult
|
|
||||||
import org.mozilla.geckoview.GeckoSession
|
|
||||||
import org.mozilla.geckoview.MediaSession
|
|
||||||
import org.mozilla.geckoview.WebExtension
|
|
||||||
import org.mozilla.geckoview.WebExtension.MessageDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtension.PortDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtensionController.AddonManagerDelegate
|
|
||||||
import org.mozilla.geckoview.WebRequestError
|
|
||||||
import java.lang.System.currentTimeMillis
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Date
|
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.collections.List
|
|
||||||
import kotlin.collections.MutableList
|
|
||||||
import kotlin.collections.arrayListOf
|
|
||||||
import kotlin.collections.first
|
|
||||||
import kotlin.collections.isNotEmpty
|
|
||||||
import kotlin.collections.last
|
|
||||||
import kotlin.collections.sortBy
|
|
||||||
import kotlin.random.Random
|
|
||||||
import kotlin.text.contains
|
|
||||||
import kotlin.text.endsWith
|
|
||||||
import kotlin.text.equals
|
|
||||||
import kotlin.text.replace
|
|
||||||
import kotlin.text.split
|
|
||||||
import kotlin.text.startsWith
|
|
||||||
import kotlin.text.toInt
|
|
||||||
import kotlin.text.toRegex
|
|
||||||
import kotlin.text.trim
|
|
||||||
|
|
||||||
|
|
||||||
class Twitter : BaseToki(), PagedTextViewInterface {
|
class Twitter : BaseToki(), PagedTextViewInterface {
|
||||||
|
|||||||
@ -1,96 +1,14 @@
|
|||||||
package bums.lunatic.launcher.tokiz
|
package bums.lunatic.launcher.tokiz
|
||||||
|
|
||||||
import android.content.DialogInterface
|
|
||||||
import android.content.Intent
|
|
||||||
import android.content.pm.ActivityInfo
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
import android.os.Message
|
|
||||||
import android.text.InputType
|
|
||||||
import android.text.SpannableStringBuilder
|
|
||||||
import android.text.style.RelativeSizeSpan
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.GONE
|
import android.view.View.GONE
|
||||||
import android.view.View.OnTouchListener
|
|
||||||
import android.view.View.VISIBLE
|
|
||||||
import android.view.View.inflate
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.webkit.WebView
|
|
||||||
import android.webkit.WebViewClient
|
|
||||||
import android.widget.ArrayAdapter
|
|
||||||
import android.widget.EditText
|
|
||||||
import android.widget.TextView
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.core.net.toUri
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
|
||||||
import bums.lunatic.launcher.R
|
|
||||||
import bums.lunatic.launcher.tokiz.common.PairArray
|
|
||||||
import bums.lunatic.launcher.tokiz.common.TouchArea
|
import bums.lunatic.launcher.tokiz.common.TouchArea
|
||||||
import bums.lunatic.launcher.tokiz.common.colorz
|
|
||||||
import bums.lunatic.launcher.tokiz.common.getIndex
|
|
||||||
import bums.lunatic.launcher.tokiz.common.typesfacez
|
|
||||||
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PageInfosJ
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
|
||||||
import bums.lunatic.launcher.tokiz.dialog.DefaultList
|
|
||||||
import bums.lunatic.launcher.tokiz.view.JxEvent
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextLayout
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
||||||
import bums.lunatic.launcher.databinding.BooktokiBinding
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import com.google.gson.Gson
|
|
||||||
import io.realm.kotlin.Realm
|
|
||||||
import io.realm.kotlin.UpdatePolicy
|
|
||||||
import io.realm.kotlin.ext.copyFromRealm
|
|
||||||
import io.realm.kotlin.ext.query
|
|
||||||
import org.json.JSONException
|
|
||||||
import org.json.JSONObject
|
|
||||||
import org.mozilla.gecko.util.ThreadUtils
|
|
||||||
import org.mozilla.geckoview.GeckoResult
|
|
||||||
import org.mozilla.geckoview.GeckoSession
|
|
||||||
import org.mozilla.geckoview.MediaSession
|
|
||||||
import org.mozilla.geckoview.WebExtension
|
|
||||||
import org.mozilla.geckoview.WebExtension.MessageDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtension.PortDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtensionController.AddonManagerDelegate
|
|
||||||
import org.mozilla.geckoview.WebRequestError
|
|
||||||
import java.lang.System.currentTimeMillis
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Date
|
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.collections.List
|
|
||||||
import kotlin.collections.MutableList
|
|
||||||
import kotlin.collections.arrayListOf
|
|
||||||
import kotlin.collections.first
|
|
||||||
import kotlin.collections.isNotEmpty
|
|
||||||
import kotlin.collections.last
|
|
||||||
import kotlin.collections.sortBy
|
|
||||||
import kotlin.random.Random
|
|
||||||
import kotlin.text.contains
|
|
||||||
import kotlin.text.endsWith
|
|
||||||
import kotlin.text.equals
|
|
||||||
import kotlin.text.replace
|
|
||||||
import kotlin.text.split
|
|
||||||
import kotlin.text.startsWith
|
|
||||||
import kotlin.text.toInt
|
|
||||||
import kotlin.text.toRegex
|
|
||||||
import kotlin.text.trim
|
|
||||||
|
|
||||||
|
|
||||||
class Webtoons : BaseToki(), PagedTextViewInterface {
|
class Webtoons : BaseToki(), PagedTextViewInterface {
|
||||||
|
|||||||
@ -5,7 +5,6 @@ import android.view.LayoutInflater
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import bums.lunatic.launcher.tokiz.common.TouchArea
|
import bums.lunatic.launcher.tokiz.common.TouchArea
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
|
||||||
|
|
||||||
class YouTube : BaseToki(){
|
class YouTube : BaseToki(){
|
||||||
override val contentsType = "youtube"
|
override val contentsType = "youtube"
|
||||||
|
|||||||
@ -1,97 +1,14 @@
|
|||||||
package bums.lunatic.launcher.tokiz
|
package bums.lunatic.launcher.tokiz
|
||||||
|
|
||||||
import android.content.DialogInterface
|
|
||||||
import android.content.Intent
|
|
||||||
import android.content.pm.ActivityInfo
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
import android.os.Message
|
|
||||||
import android.text.InputType
|
|
||||||
import android.text.SpannableStringBuilder
|
|
||||||
import android.text.style.RelativeSizeSpan
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.GONE
|
import android.view.View.GONE
|
||||||
import android.view.View.OnTouchListener
|
|
||||||
import android.view.View.VISIBLE
|
|
||||||
import android.view.View.inflate
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.webkit.WebView
|
|
||||||
import android.webkit.WebViewClient
|
|
||||||
import android.widget.ArrayAdapter
|
|
||||||
import android.widget.EditText
|
|
||||||
import android.widget.TextView
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
import androidx.core.net.toUri
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime
|
|
||||||
import bums.lunatic.launcher.R
|
|
||||||
import bums.lunatic.launcher.tokiz.common.PairArray
|
|
||||||
import bums.lunatic.launcher.tokiz.common.TouchArea
|
import bums.lunatic.launcher.tokiz.common.TouchArea
|
||||||
import bums.lunatic.launcher.tokiz.common.colorz
|
|
||||||
import bums.lunatic.launcher.tokiz.common.getIndex
|
|
||||||
import bums.lunatic.launcher.tokiz.common.typesfacez
|
|
||||||
import bums.lunatic.launcher.tokiz.data.HistoryManager
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PageInfosJ
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.PortMessage
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
|
||||||
import bums.lunatic.launcher.tokiz.dialog.DefaultList
|
|
||||||
import bums.lunatic.launcher.tokiz.view.JxEvent
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextLayout
|
|
||||||
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface
|
||||||
import bums.lunatic.launcher.databinding.BooktokiBinding
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import com.google.gson.Gson
|
|
||||||
import io.realm.kotlin.Realm
|
|
||||||
import io.realm.kotlin.UpdatePolicy
|
|
||||||
import io.realm.kotlin.ext.copyFromRealm
|
|
||||||
import io.realm.kotlin.ext.query
|
|
||||||
import org.json.JSONException
|
|
||||||
import org.json.JSONObject
|
|
||||||
import org.mozilla.gecko.util.ThreadUtils
|
|
||||||
import org.mozilla.geckoview.GeckoResult
|
|
||||||
import org.mozilla.geckoview.GeckoSession
|
|
||||||
import org.mozilla.geckoview.MediaSession
|
|
||||||
import org.mozilla.geckoview.WebExtension
|
|
||||||
import org.mozilla.geckoview.WebExtension.MessageDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtension.PortDelegate
|
|
||||||
import org.mozilla.geckoview.WebExtensionController.AddonManagerDelegate
|
|
||||||
import org.mozilla.geckoview.WebRequestError
|
|
||||||
import java.lang.System.currentTimeMillis
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Date
|
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.collections.List
|
|
||||||
import kotlin.collections.MutableList
|
|
||||||
import kotlin.collections.arrayListOf
|
|
||||||
import kotlin.collections.first
|
|
||||||
import kotlin.collections.isNotEmpty
|
|
||||||
import kotlin.collections.last
|
|
||||||
import kotlin.collections.sortBy
|
|
||||||
import kotlin.random.Random
|
|
||||||
import kotlin.text.contains
|
|
||||||
import kotlin.text.endsWith
|
|
||||||
import kotlin.text.equals
|
|
||||||
import kotlin.text.replace
|
|
||||||
import kotlin.text.split
|
|
||||||
import kotlin.text.startsWith
|
|
||||||
import kotlin.text.toInt
|
|
||||||
import kotlin.text.toRegex
|
|
||||||
import kotlin.text.trim
|
|
||||||
|
|
||||||
|
|
||||||
class Zota : BaseToki(), PagedTextViewInterface {
|
class Zota : BaseToki(), PagedTextViewInterface {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package bums.lunatic.launcher.tokiz.data
|
package bums.lunatic.launcher.tokiz.data
|
||||||
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
||||||
|
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
||||||
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
||||||
|
|||||||
@ -15,6 +15,9 @@ class PortMessage {
|
|||||||
var privates : ArrayList<RssData>? = null
|
var privates : ArrayList<RssData>? = null
|
||||||
var currentPage : String? = null
|
var currentPage : String? = null
|
||||||
var cookies : String? = null
|
var cookies : String? = null
|
||||||
|
|
||||||
|
var imgSrc: String? = null
|
||||||
|
var base64Data: String? = null
|
||||||
}
|
}
|
||||||
class BookContents {
|
class BookContents {
|
||||||
var chapterTitle : String? = null
|
var chapterTitle : String? = null
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
package bums.lunatic.launcher.tokiz.data.model
|
package bums.lunatic.launcher.tokiz.data.model
|
||||||
|
|
||||||
import android.content.pm.ActivityInfo
|
import android.content.pm.ActivityInfo
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
|
||||||
import io.realm.kotlin.types.RealmObject
|
import io.realm.kotlin.types.RealmObject
|
||||||
import io.realm.kotlin.types.annotations.PrimaryKey
|
import io.realm.kotlin.types.annotations.PrimaryKey
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
|
|||||||
@ -3,7 +3,6 @@ package bums.lunatic.launcher.tokiz.view
|
|||||||
import android.annotation.SuppressLint
|
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.os.Build
|
import android.os.Build
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
@ -15,7 +14,6 @@ import bums.lunatic.launcher.R
|
|||||||
import bums.lunatic.launcher.helpers.ForeGroundService
|
import bums.lunatic.launcher.helpers.ForeGroundService
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.ACTION_VIDEO_DOWNLOAD
|
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.ACTION_VIDEO_DOWNLOAD
|
||||||
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.EXTRA_TARGET_URL
|
import bums.lunatic.launcher.helpers.ForeGroundService.Companion.EXTRA_TARGET_URL
|
||||||
import bums.lunatic.launcher.tokiz.common.TouchArea
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import bums.lunatic.launcher.utils.SimpleFingerGestures
|
import bums.lunatic.launcher.utils.SimpleFingerGestures
|
||||||
import com.yausername.youtubedl_android.YoutubeDL
|
import com.yausername.youtubedl_android.YoutubeDL
|
||||||
|
|||||||
@ -9,17 +9,12 @@ import android.text.StaticLayout
|
|||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import androidx.appcompat.widget.AppCompatTextView
|
import androidx.appcompat.widget.AppCompatTextView
|
||||||
import androidx.core.view.marginBottom
|
|
||||||
import androidx.core.view.marginLeft
|
|
||||||
import androidx.core.view.marginRight
|
|
||||||
import androidx.core.view.marginTop
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import kotlinx.coroutines.MainScope
|
import kotlinx.coroutines.MainScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PagedTextView : AppCompatTextView {
|
class PagedTextView : AppCompatTextView {
|
||||||
|
|
||||||
private var needPaginate = false
|
private var needPaginate = false
|
||||||
|
|||||||
237
app/src/main/kotlin/bums/lunatic/launcher/utils/APILevel.kt
Normal file
237
app/src/main/kotlin/bums/lunatic/launcher/utils/APILevel.kt
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
package bums.lunatic.launcher.utils
|
||||||
|
|
||||||
|
import android.os.Build
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* APILevel helps to check device API [Build.VERSION] conveniently.
|
||||||
|
*
|
||||||
|
* @author Marcos Trujillo, Leonardo Taehwan Kim
|
||||||
|
*/
|
||||||
|
object APILevel {
|
||||||
|
/**
|
||||||
|
* @param level minimum API level version that has to support the device
|
||||||
|
* @return true when the caller API version is at least level
|
||||||
|
*/
|
||||||
|
fun require(level: Int): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= level
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least Cupcake 3
|
||||||
|
*/
|
||||||
|
fun requireCupcake(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least Donut 4
|
||||||
|
*/
|
||||||
|
fun requireDonut(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.DONUT
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least Eclair 5
|
||||||
|
*/
|
||||||
|
fun requireEclair(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least Froyo 8
|
||||||
|
*/
|
||||||
|
fun requireFroyo(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least GingerBread 9
|
||||||
|
*/
|
||||||
|
fun requireGingerbread(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least Honeycomb 11
|
||||||
|
*/
|
||||||
|
fun requireHoneycomb(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least Honeycomb 3.2, 13
|
||||||
|
*/
|
||||||
|
fun requireHoneycombMR2(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least ICS 14
|
||||||
|
*/
|
||||||
|
fun requireIceCreamSandwich(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least JellyBean 16
|
||||||
|
*/
|
||||||
|
fun requireJellyBean(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least JellyBean MR1 17
|
||||||
|
*/
|
||||||
|
fun requireJellyBeanMR1(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least JellyBean MR2 18
|
||||||
|
*/
|
||||||
|
fun requireJellyBeanMR2(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least Kitkat 19
|
||||||
|
*/
|
||||||
|
fun requireKitkat(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least Lollipop 21
|
||||||
|
*/
|
||||||
|
fun requireLollipop(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least Lollipop MR1 22
|
||||||
|
*/
|
||||||
|
fun requireLollipopMR1(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is at least Marshmallow 23
|
||||||
|
*/
|
||||||
|
fun requireMarshmallow(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param level API level version that specific method or variable has been deprecated
|
||||||
|
* @return true when the caller API version is less than level
|
||||||
|
*/
|
||||||
|
fun deprecatedAt(level: Int): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < level
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than Cupcake 3
|
||||||
|
*/
|
||||||
|
fun deprecatedAtCupcake(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.CUPCAKE
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than Donut 4
|
||||||
|
*/
|
||||||
|
fun deprecatedAtDonut(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.DONUT
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than Eclair 5
|
||||||
|
*/
|
||||||
|
fun deprecatedAtEclair(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.ECLAIR
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than Froyo 8
|
||||||
|
*/
|
||||||
|
fun deprecatedAtFroyo(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than GingerBread 9
|
||||||
|
*/
|
||||||
|
fun deprecatedAtGingerbread(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than Honeycomb 11
|
||||||
|
*/
|
||||||
|
fun deprecatedAtHoneycomb(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than Honeycomb 3.2, 13
|
||||||
|
*/
|
||||||
|
fun deprecatedAtHoneycombMR2(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than ICS 14
|
||||||
|
*/
|
||||||
|
fun deprecatedAtIceCreamSandwich(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than JellyBean 16
|
||||||
|
*/
|
||||||
|
fun deprecatedAtJellyBean(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than JellyBean MR1 17
|
||||||
|
*/
|
||||||
|
fun deprecatedAtJellyBeanMR1(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than JellyBean MR2 18
|
||||||
|
*/
|
||||||
|
fun deprecatedAtJellyBeanMR2(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than Kitkat 19
|
||||||
|
*/
|
||||||
|
fun deprecatedAtKitkat(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than Lollipop 21
|
||||||
|
*/
|
||||||
|
fun deprecatedAtLollipop(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than Lollipop MR1 22
|
||||||
|
*/
|
||||||
|
fun deprecatedAtLollipopMR1(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true when the caller API version is less than Marshmallow 23
|
||||||
|
*/
|
||||||
|
fun deprecatedAtMarshmallow(): Boolean {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,7 +3,6 @@ package bums.lunatic.launcher.utils
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import java.io.FileOutputStream
|
|
||||||
import android.webkit.MimeTypeMap
|
import android.webkit.MimeTypeMap
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@ -12,6 +11,7 @@ import kotlinx.coroutines.withContext
|
|||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.io.FileOutputStream
|
||||||
import java.net.URLConnection
|
import java.net.URLConnection
|
||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,71 @@
|
|||||||
|
package bums.lunatic.launcher.utils
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
import com.bumptech.glide.Registry
|
||||||
|
import com.bumptech.glide.annotation.GlideModule
|
||||||
|
import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader
|
||||||
|
import com.bumptech.glide.load.model.GlideUrl
|
||||||
|
import com.bumptech.glide.module.AppGlideModule
|
||||||
|
import okhttp3.Cache
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.logging.HttpLoggingInterceptor
|
||||||
|
import java.io.File
|
||||||
|
import java.io.InputStream
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
@GlideModule
|
||||||
|
class CustomOkHttpGlideModule : AppGlideModule() {
|
||||||
|
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
|
||||||
|
val logging = HttpLoggingInterceptor().apply {
|
||||||
|
level = HttpLoggingInterceptor.Level.HEADERS
|
||||||
|
}
|
||||||
|
val cacheSize = 1024L * 1024 * 1024 * 6 // 60MB
|
||||||
|
val cache = Cache(File(context.filesDir, "clide-cache"), cacheSize)
|
||||||
|
val okHttpClient = OkHttpClient.Builder()
|
||||||
|
.cache(cache)
|
||||||
|
.addInterceptor { chain ->
|
||||||
|
var request = chain.request()
|
||||||
|
val isA = request.url.host.contains("ijavtorrent")
|
||||||
|
val host = if (request.url.host.contains("ijavtorrent")) {
|
||||||
|
"ijavtorrent.com"
|
||||||
|
} else {
|
||||||
|
chain.request().url.host
|
||||||
|
}
|
||||||
|
val newRequestBuilder = request.newBuilder().addHeader("authority",host)
|
||||||
|
.addHeader("Host",host)
|
||||||
|
// .addHeader("User-Agent","Mozilla/5.0 (Android 15; Mobile; rv:139.0) Gecko/139.0 Firefox/139.0")
|
||||||
|
.addHeader("Accept",if (isA == false) {
|
||||||
|
"image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5"
|
||||||
|
} else {
|
||||||
|
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
|
||||||
|
})
|
||||||
|
.addHeader("Accept-Language","ko-KR,en-US;q=0.5")
|
||||||
|
.addHeader("Accept-Encoding","gzip, deflate, br, zstd")
|
||||||
|
.addHeader("Referer",host)
|
||||||
|
// .removeHeader("Cache-Control")
|
||||||
|
// if (isA) {
|
||||||
|
//// newRequestBuilder.addHeader("sec-ch-ua-platform","macOS")
|
||||||
|
// newRequestBuilder.addHeader("sec-fetch-dest","document")
|
||||||
|
// newRequestBuilder.addHeader("sec-fetch-mode","navigate")
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
Blog.LOGE("chain.request().url() >>> ${chain.request().url} : host : $host")
|
||||||
|
val response = chain.proceed(newRequestBuilder.build())
|
||||||
|
Blog.LOGE("응답 코드: ${response.code}:${response.message}")
|
||||||
|
response
|
||||||
|
}
|
||||||
|
.addInterceptor(logging)
|
||||||
|
.callTimeout(60, TimeUnit.SECONDS)
|
||||||
|
.connectTimeout(60, TimeUnit.SECONDS) // 연결 타임아웃
|
||||||
|
.readTimeout(60, TimeUnit.SECONDS) // 읽기 타임아웃
|
||||||
|
.writeTimeout(60, TimeUnit.SECONDS) // 쓰기 타임아웃
|
||||||
|
.build()
|
||||||
|
registry.replace(
|
||||||
|
GlideUrl::class.java, InputStream::class.java,
|
||||||
|
OkHttpUrlLoader.Factory(okHttpClient)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,17 +1,9 @@
|
|||||||
package bums.lunatic.launcher.utils
|
package bums.lunatic.launcher.utils
|
||||||
|
|
||||||
import bums.lunatic.launcher.home.RssHome.Companion.lastedFinishedPageUrl
|
|
||||||
import bums.lunatic.launcher.model.RssData
|
|
||||||
import bums.lunatic.launcher.model.RssDataType
|
|
||||||
import bums.lunatic.launcher.model.dateFormat
|
|
||||||
import bums.lunatic.launcher.model.getRssData
|
|
||||||
import bums.lunatic.launcher.workers.WorkersDb
|
|
||||||
import io.realm.kotlin.ext.query
|
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Base64
|
import java.util.Base64
|
||||||
import java.util.Date
|
|
||||||
|
|
||||||
val USAGT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15"
|
val USAGT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15"
|
||||||
fun String.getJ() : Document {
|
fun String.getJ() : Document {
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
package bums.lunatic.launcher.utils
|
package bums.lunatic.launcher.utils
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.media.MediaMetadataRetriever
|
import android.media.MediaMetadataRetriever
|
||||||
|
|||||||
@ -0,0 +1,256 @@
|
|||||||
|
package bums.lunatic.launcher.utils
|
||||||
|
|
||||||
|
import android.annotation.TargetApi
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.os.Build
|
||||||
|
import android.util.Base64
|
||||||
|
import java.io.ByteArrayInputStream
|
||||||
|
import java.io.ByteArrayOutputStream
|
||||||
|
import java.io.IOException
|
||||||
|
import java.io.ObjectInputStream
|
||||||
|
import java.io.ObjectOutputStream
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
interface PrefKey<T> {
|
||||||
|
fun getKey() : String
|
||||||
|
fun set(value : T)
|
||||||
|
fun get(def : T? = null) : T
|
||||||
|
}
|
||||||
|
interface PrefJsonConvert {
|
||||||
|
fun initialize(context: Context)
|
||||||
|
fun inject(SharedPreferences : SharedPreferences)
|
||||||
|
fun getSettings() : Map<String,Any>
|
||||||
|
fun putSetting(json : Map<String,Any>)
|
||||||
|
}
|
||||||
|
abstract class PreferencesHelper : PrefJsonConvert {
|
||||||
|
|
||||||
|
var sharedPreferences : SharedPreferences? = null
|
||||||
|
open fun allPrefKeys() : ArrayList<String> =arrayListOf()
|
||||||
|
open fun getBooleanPrefix() : String = getDefaultPrefix().plus(".BOOL.")
|
||||||
|
open fun getStringPrefix() : String = getDefaultPrefix().plus(".STRING.")
|
||||||
|
open fun getLongPrefix() : String = getDefaultPrefix().plus(".LONG.")
|
||||||
|
open fun getDefaultPrefix() : String = PreferencesHelper::class.java.canonicalName
|
||||||
|
abstract override fun getSettings() : Map<String,Any>
|
||||||
|
abstract override fun putSetting(json : Map<String,Any>)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
override fun initialize(context: Context) {
|
||||||
|
inject(context.getSharedPreferences(getDefaultPrefix(), Context.MODE_PRIVATE))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun inject(sharedPreferences : SharedPreferences) {
|
||||||
|
this.sharedPreferences = sharedPreferences
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun get(key: String?, defValue: Boolean): Boolean {
|
||||||
|
return get(getDefaultPrefix(), key, defValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(key: String?, defValue: Int): Int {
|
||||||
|
return get(getDefaultPrefix(), key, defValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(key: String?, defValue: Float): Float {
|
||||||
|
return get(getDefaultPrefix(), key, defValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(key: String?, defValue: Long): Long {
|
||||||
|
return get(getDefaultPrefix(), key, defValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(key: String?, defValue: String?): String? {
|
||||||
|
return get(getDefaultPrefix(), key, defValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
fun get(key: String?, defValue: Set<String?>?): Set<String>? {
|
||||||
|
return get(getDefaultPrefix(), key, defValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.FROYO)
|
||||||
|
fun <C : Serializable?> get(key: String?, defValue: C): C {
|
||||||
|
return get(getDefaultPrefix(), key, defValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(name: String, key: String?, defValue: Boolean): Boolean {
|
||||||
|
return getPreferences()?.getBoolean(key, defValue) ?: false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getPreferences(): SharedPreferences? {
|
||||||
|
return this.sharedPreferences
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(name: String, key: String?, defValue: Int): Int {
|
||||||
|
return getPreferences()?.getInt(key, defValue) ?: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(name: String, key: String?, defValue: Float): Float {
|
||||||
|
return getPreferences()?.getFloat(key, defValue) ?: 0f
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(name: String, key: String?, defValue: Long): Long {
|
||||||
|
return getPreferences()?.getLong(key, defValue) ?: 0L
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(name: String, key: String?, defValue: String?): String? {
|
||||||
|
return getPreferences()?.getString(key, defValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
fun get(name: String, key: String?, defValue: Set<String?>?): Set<String>? {
|
||||||
|
return getPreferences()?.getStringSet(key, defValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.FROYO)
|
||||||
|
fun <C : Serializable?> get(name: String, key: String?, defValue: C): C {
|
||||||
|
var bais: ByteArrayInputStream? = null
|
||||||
|
var ois: ObjectInputStream? = null
|
||||||
|
var result = defValue
|
||||||
|
|
||||||
|
val value = getPreferences()?.getString(key, null)
|
||||||
|
if (value != null) {
|
||||||
|
try {
|
||||||
|
val decoded = Base64.decode(value.toByteArray(), Base64.DEFAULT)
|
||||||
|
bais = ByteArrayInputStream(decoded)
|
||||||
|
ois = ObjectInputStream(bais)
|
||||||
|
result = ois.readObject() as C
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// Blog.LOGE(e.printStackTrace())
|
||||||
|
} finally {
|
||||||
|
if (ois != null) {
|
||||||
|
try {
|
||||||
|
ois.close()
|
||||||
|
} catch (e: IOException) {
|
||||||
|
// LogHelper.e(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bais != null) {
|
||||||
|
try {
|
||||||
|
bais.close()
|
||||||
|
} catch (e: IOException) {
|
||||||
|
// LogHelper.e(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun put(key: String?, value: Boolean) {
|
||||||
|
put(getDefaultPrefix(), key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun put(key: String?, value: Int) {
|
||||||
|
put(getDefaultPrefix(), key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun put(key: String?, value: Float) {
|
||||||
|
put(getDefaultPrefix(), key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun put(key: String?, value: Long) {
|
||||||
|
put(getDefaultPrefix(), key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun put(key: String?, value: String?) {
|
||||||
|
put(getDefaultPrefix(), key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
fun put(key: String?, value: Set<String?>?) {
|
||||||
|
put(getDefaultPrefix(), key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.FROYO)
|
||||||
|
fun <C : Serializable?> put(key: String?, value: C) {
|
||||||
|
put(getDefaultPrefix(), key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun put(name: String, key: String?, value: Boolean) {
|
||||||
|
if (APILevel.require(9)) getPreferences()?.edit()?.putBoolean(key, value)?.apply()
|
||||||
|
else getPreferences()?.edit()?.putBoolean(key, value)?.commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun put(name: String, key: String?, value: Int) {
|
||||||
|
if (APILevel.require(9)) getPreferences()?.edit()?.putInt(key, value)?.apply()
|
||||||
|
else getPreferences()?.edit()?.putInt(key, value)?.commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun put(name: String, key: String?, value: Float) {
|
||||||
|
if (APILevel.require(9)) getPreferences()?.edit()?.putFloat(key, value)?.apply()
|
||||||
|
else getPreferences()?.edit()?.putFloat(key, value)?.commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun put(name: String, key: String?, value: Long) {
|
||||||
|
if (APILevel.require(9)) getPreferences()?.edit()?.putLong(key, value)?.apply()
|
||||||
|
else getPreferences()?.edit()?.putLong(key, value)?.commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun put(name: String, key: String?, value: String?) {
|
||||||
|
if (APILevel.require(9)) getPreferences()?.edit()?.putString(key, value)?.apply()
|
||||||
|
else getPreferences()?.edit()?.putString(key, value)?.commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
fun put(name: String, key: String?, value: Set<String?>?) {
|
||||||
|
if (APILevel.require(9)) getPreferences()?.edit()?.putStringSet(key, value)?.apply()
|
||||||
|
else getPreferences()?.edit()?.putStringSet(key, value)?.commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.FROYO)
|
||||||
|
fun <C : Serializable?> put(name: String, key: String?, value: C) {
|
||||||
|
var baos: ByteArrayOutputStream? = null
|
||||||
|
var oos: ObjectOutputStream? = null
|
||||||
|
|
||||||
|
try {
|
||||||
|
baos = ByteArrayOutputStream()
|
||||||
|
oos = ObjectOutputStream(baos)
|
||||||
|
oos.writeObject(value)
|
||||||
|
val encoded = Base64.encode(baos.toByteArray(), Base64.DEFAULT)
|
||||||
|
if (APILevel.require(9)) getPreferences()?.edit()?.putString(key, String(encoded))?.apply()
|
||||||
|
else getPreferences()?.edit()?.putString(key, String(encoded))?.commit()
|
||||||
|
} catch (e: IOException) {
|
||||||
|
// LogHelper.e(e)
|
||||||
|
throw RuntimeException(e)
|
||||||
|
} finally {
|
||||||
|
if (oos != null) {
|
||||||
|
try {
|
||||||
|
oos.close()
|
||||||
|
} catch (e: IOException) {
|
||||||
|
// LogHelper.e(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (baos != null) {
|
||||||
|
try {
|
||||||
|
baos.close()
|
||||||
|
} catch (e: IOException) {
|
||||||
|
// LogHelper.e(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun remove(key: String?) {
|
||||||
|
remove(getDefaultPrefix(), key)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun remove(name: String, key: String?) {
|
||||||
|
if (APILevel.require(9)) getPreferences()?.edit()?.remove(key)?.apply()
|
||||||
|
else getPreferences()?.edit()?.remove(key)?.commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@JvmOverloads
|
||||||
|
fun clear(name: String = getDefaultPrefix()) {
|
||||||
|
if (APILevel.require(9)) getPreferences()?.edit()?.clear()?.apply()
|
||||||
|
else getPreferences()?.edit()?.clear()?.commit()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,7 +3,7 @@ package bums.lunatic.launcher.wall
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.Surface
|
import android.view.Surface
|
||||||
|
|
||||||
class NativeRenderer {
|
open class NativeRenderer {
|
||||||
|
|
||||||
interface NextMediaCallback {
|
interface NextMediaCallback {
|
||||||
fun onNextMediaRequested()
|
fun onNextMediaRequested()
|
||||||
|
|||||||
@ -1,16 +1,12 @@
|
|||||||
package bums.lunatic.launcher.workers
|
package bums.lunatic.launcher.workers
|
||||||
|
|
||||||
|
//import bums.lunatic.launcher.workers.WorkersDb.blockKeyword
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.work.WorkerParameters
|
import androidx.work.WorkerParameters
|
||||||
import bums.lunatic.launcher.model.Arca
|
import bums.lunatic.launcher.model.Arca
|
||||||
import bums.lunatic.launcher.model.RssDataInterface
|
import bums.lunatic.launcher.model.RssDataInterface
|
||||||
import bums.lunatic.launcher.model.RssDataType
|
|
||||||
import bums.lunatic.launcher.model.getRssData
|
|
||||||
import bums.lunatic.launcher.model.getT
|
import bums.lunatic.launcher.model.getT
|
||||||
import bums.lunatic.launcher.utils.Blog
|
|
||||||
import bums.lunatic.launcher.utils.beforeOneDay
|
import bums.lunatic.launcher.utils.beforeOneDay
|
||||||
//import bums.lunatic.launcher.workers.WorkersDb.blockKeyword
|
|
||||||
import org.jsoup.Jsoup
|
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
|
|
||||||
class ArcaGetter : BaseGetter {
|
class ArcaGetter : BaseGetter {
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import android.content.Context
|
|||||||
import androidx.annotation.CallSuper
|
import androidx.annotation.CallSuper
|
||||||
import androidx.work.Worker
|
import androidx.work.Worker
|
||||||
import androidx.work.WorkerParameters
|
import androidx.work.WorkerParameters
|
||||||
import bums.lunatic.launcher.LauncherActivity
|
|
||||||
import bums.lunatic.launcher.LunaticLauncher
|
import bums.lunatic.launcher.LunaticLauncher
|
||||||
import bums.lunatic.launcher.model.RssData
|
import bums.lunatic.launcher.model.RssData
|
||||||
import bums.lunatic.launcher.utils.beforeDay
|
import bums.lunatic.launcher.utils.beforeDay
|
||||||
|
|||||||
@ -4,16 +4,12 @@ import android.annotation.SuppressLint
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.work.WorkerParameters
|
import androidx.work.WorkerParameters
|
||||||
import bums.lunatic.launcher.LauncherActivity
|
import bums.lunatic.launcher.LauncherActivity
|
||||||
import bums.lunatic.launcher.home.GeckoWeb
|
|
||||||
import bums.lunatic.launcher.model.Dotax
|
|
||||||
import bums.lunatic.launcher.model.RssDataType
|
import bums.lunatic.launcher.model.RssDataType
|
||||||
import bums.lunatic.launcher.model.getRssData
|
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.jsoup.Jsoup
|
|
||||||
|
|
||||||
class DotaxGetter : BaseGetter {
|
class DotaxGetter : BaseGetter {
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@ -25,7 +25,6 @@ import com.google.gson.Gson
|
|||||||
import io.realm.kotlin.ext.query
|
import io.realm.kotlin.ext.query
|
||||||
import io.realm.kotlin.query.Sort
|
import io.realm.kotlin.query.Sort
|
||||||
import okhttp3.ConnectionPool
|
import okhttp3.ConnectionPool
|
||||||
import okhttp3.MediaType
|
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
|||||||
@ -2,11 +2,6 @@ package bums.lunatic.launcher.workers
|
|||||||
|
|
||||||
import bums.lunatic.launcher.BuildConfig
|
import bums.lunatic.launcher.BuildConfig
|
||||||
import bums.lunatic.launcher.apps.SimpleContact
|
import bums.lunatic.launcher.apps.SimpleContact
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
|
||||||
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
|
||||||
import bums.lunatic.launcher.common.letTrue
|
import bums.lunatic.launcher.common.letTrue
|
||||||
import bums.lunatic.launcher.model.AppInfo
|
import bums.lunatic.launcher.model.AppInfo
|
||||||
import bums.lunatic.launcher.model.Astro
|
import bums.lunatic.launcher.model.Astro
|
||||||
@ -30,12 +25,16 @@ import bums.lunatic.launcher.model.TelegramData
|
|||||||
import bums.lunatic.launcher.model.TelegramFrom
|
import bums.lunatic.launcher.model.TelegramFrom
|
||||||
import bums.lunatic.launcher.model.TelegramMessage
|
import bums.lunatic.launcher.model.TelegramMessage
|
||||||
import bums.lunatic.launcher.model.WeatherForcast
|
import bums.lunatic.launcher.model.WeatherForcast
|
||||||
|
import bums.lunatic.launcher.tokiz.data.model.ContentsCollection
|
||||||
|
import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo
|
||||||
|
import bums.lunatic.launcher.tokiz.data.model.HistoryItem
|
||||||
|
import bums.lunatic.launcher.tokiz.data.model.LastInfo
|
||||||
|
import bums.lunatic.launcher.tokiz.data.model.ReaderConfig
|
||||||
import bums.lunatic.launcher.utils.Blog
|
import bums.lunatic.launcher.utils.Blog
|
||||||
import bums.lunatic.launcher.utils.JamoUtils
|
import bums.lunatic.launcher.utils.JamoUtils
|
||||||
import bums.lunatic.launcher.utils.afterDay
|
import bums.lunatic.launcher.utils.afterDay
|
||||||
import bums.lunatic.launcher.utils.beforeDay
|
import bums.lunatic.launcher.utils.beforeDay
|
||||||
import bums.lunatic.launcher.utils.beforeOneDay
|
import bums.lunatic.launcher.utils.beforeOneDay
|
||||||
import com.google.gson.Gson
|
|
||||||
import io.realm.kotlin.Realm
|
import io.realm.kotlin.Realm
|
||||||
import io.realm.kotlin.RealmConfiguration
|
import io.realm.kotlin.RealmConfiguration
|
||||||
import io.realm.kotlin.UpdatePolicy
|
import io.realm.kotlin.UpdatePolicy
|
||||||
@ -45,9 +44,6 @@ import io.realm.kotlin.query.RealmQuery
|
|||||||
import io.realm.kotlin.query.Sort
|
import io.realm.kotlin.query.Sort
|
||||||
import io.realm.kotlin.types.BaseRealmObject
|
import io.realm.kotlin.types.BaseRealmObject
|
||||||
import io.realm.kotlin.types.TypedRealmObject
|
import io.realm.kotlin.types.TypedRealmObject
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Calendar
|
|
||||||
import java.util.Date
|
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|||||||
11
app/src/main/res/drawable/back_vector.xml
Normal file
11
app/src/main/res/drawable/back_vector.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:height="48dp"
|
||||||
|
android:viewportHeight="144.0"
|
||||||
|
android:viewportWidth="144.0"
|
||||||
|
android:width="48dp">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M84.5,89.3L64.4,70.5l20.2,-18.8c1.2,-1.1 1.3,-3 0.2,-4.2c-1.1,-1.2 -3,-1.3 -4.2,-0.2L58,68.3c-0.6,0.6 -1,1.4 -1,2.2c0,0.8 0.3,1.6 1,2.2l22.5,21c1.2,1.1 3.1,1.1 4.2,-0.1C85.8,92.3 85.8,90.4 84.5,89.3L84.5,89.3z"/>
|
||||||
|
</vector>
|
||||||
11
app/src/main/res/drawable/close_vector.xml
Normal file
11
app/src/main/res/drawable/close_vector.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:height="48dp"
|
||||||
|
android:viewportHeight="144.0"
|
||||||
|
android:viewportWidth="144.0"
|
||||||
|
android:width="48dp">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M76.8,72l16.3,-15.8c1.2,-1.2 1.2,-3.1 0.1,-4.2c-1.2,-1.2 -3.1,-1.2 -4.2,-0.1l-16.4,16l-16.4,-16c-1.2,-1.2 -3.1,-1.1 -4.2,0.1c-1.2,1.2 -1.1,3.1 0.1,4.2L68.2,72L51.9,87.8c-1.2,1.2 -1.2,3.1 -0.1,4.2c1.2,1.2 3.1,1.2 4.2,0.1l16.4,-16l16.4,16c1.2,1.2 3.1,1.1 4.2,-0.1c1.2,-1.2 1.1,-3.1 -0.1,-4.2L76.8,72z"/>
|
||||||
|
</vector>
|
||||||
@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
<selector>
|
||||||
|
|
||||||
</selector>
|
</selector>
|
||||||
@ -2,7 +2,7 @@
|
|||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="@color/grey_hex_20"
|
android:background="@color/finestSilver"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="@color/grey_hex_20"
|
android:background="@color/finestSilver"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
|
|||||||
@ -20,4 +20,6 @@
|
|||||||
|
|
||||||
<color name="button_color">#994CAF50</color>
|
<color name="button_color">#994CAF50</color>
|
||||||
<color name="button_color_tint">#99007ACC</color>
|
<color name="button_color_tint">#99007ACC</color>
|
||||||
|
<color name="Color_White">#FFF</color>
|
||||||
|
<color name="finestSilver">#A5A5A5</color>
|
||||||
</resources>
|
</resources>
|
||||||
@ -1,4 +1,4 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources>
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
|
|
||||||
<style name="Theme.LunarLauncher" parent="Theme.Material3.DynamicColors.DayNight.NoActionBar">
|
<style name="Theme.LunarLauncher" parent="Theme.Material3.DynamicColors.DayNight.NoActionBar">
|
||||||
|
|||||||
@ -1,18 +1,22 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
buildscript {
|
|
||||||
val kotlinVersion = "2.0.0"
|
|
||||||
extra ["kotlinVersion"] = kotlinVersion
|
|
||||||
|
|
||||||
dependencies {
|
buildscript {
|
||||||
classpath (kotlin("gradle-plugin", version = kotlinVersion))
|
val kotlinVersion = "2.0.10" // Define here
|
||||||
|
val realmVersion = "2.0.0"
|
||||||
|
|
||||||
|
extra ["kotlinVersion"] = kotlinVersion
|
||||||
|
extra ["realmVersion"] = realmVersion
|
||||||
|
|
||||||
|
dependencies { classpath (kotlin("gradle-plugin", version = kotlinVersion))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id ("com.android.application") version "8.10.1" apply false
|
val kotlinVersion: String by extra
|
||||||
id ("com.android.library") version "8.10.1" apply false
|
id ("com.android.application") version "8.6.0" apply false
|
||||||
|
id ("com.android.library") version "8.6.0" apply false
|
||||||
id ("io.realm.kotlin") version "2.0.0" apply false
|
id ("io.realm.kotlin") version "2.0.0" apply false
|
||||||
id("org.jetbrains.kotlin.android") version "2.0.0" apply false
|
id("org.jetbrains.kotlin.android") version kotlinVersion apply false
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
27
buildSrc/build.gradle.kts
Normal file
27
buildSrc/build.gradle.kts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
// 이것이 핵심입니다.
|
||||||
|
// Kotlin DSL 스크립트 플러그인을 적용합니다.
|
||||||
|
// 이 플러그인은 자동으로 'org.jetbrains.kotlin.jvm' 플러그인을 포함하고
|
||||||
|
// 'gradleApi()' 및 'kotlin-stdlib' 의존성을 추가해 줍니다.
|
||||||
|
`kotlin-dsl`
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
// 위 플러그인을 다운로드할 저장소가 필요합니다.
|
||||||
|
mavenCentral()
|
||||||
|
google()
|
||||||
|
}
|
||||||
|
|
||||||
|
// (선택 사항이지만 강력히 권장)
|
||||||
|
// buildSrc 코드를 컴파일할 JVM 버전을 프로젝트의 나머지 부분과 일치시킵니다.
|
||||||
|
// (최신 안드로이드 프로젝트는 JDK 17이 필요합니다)
|
||||||
|
java {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType<KotlinCompile> {
|
||||||
|
kotlinOptions.jvmTarget = "17"
|
||||||
|
}
|
||||||
6
buildSrc/src/main/kotlin/Libs.kt
Normal file
6
buildSrc/src/main/kotlin/Libs.kt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
object Versions {
|
||||||
|
const val retrofit = "2.9.0"
|
||||||
|
const val appcompat = "1.6.1"
|
||||||
|
const val kotlinVersion = "2.0.10" // Define here
|
||||||
|
const val realmVersion = "2.0.0"
|
||||||
|
}
|
||||||
@ -5,7 +5,7 @@ plugins {
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "kr.lunaticbum.awesomewebview"
|
namespace = "kr.lunaticbum.awesomewebview"
|
||||||
compileSdk = 35
|
compileSdk = 36
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// applicationId = "kr.lunaticbum.awesomewebview"
|
// applicationId = "kr.lunaticbum.awesomewebview"
|
||||||
|
|||||||
@ -5,7 +5,7 @@ plugins {
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "kr.lunaticbum.helpers"
|
namespace = "kr.lunaticbum.helpers"
|
||||||
compileSdk = 35
|
compileSdk = 36
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdk = 26
|
minSdk = 26
|
||||||
// targetSdk = 34
|
// targetSdk = 34
|
||||||
|
|||||||
@ -1,49 +1,49 @@
|
|||||||
package kr.lunaticbum
|
//package kr.lunaticbum
|
||||||
|
//
|
||||||
import android.annotation.SuppressLint
|
//import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
//import android.content.Context
|
||||||
import android.content.res.AssetManager
|
//import android.content.res.AssetManager
|
||||||
import android.content.res.Configuration
|
//import android.content.res.Configuration
|
||||||
import android.content.res.Resources
|
//import android.content.res.Resources
|
||||||
import android.content.res.Resources.Theme
|
//import android.content.res.Resources.Theme
|
||||||
import android.util.DisplayMetrics
|
//import android.util.DisplayMetrics
|
||||||
|
//
|
||||||
/**
|
///**
|
||||||
* Base helps to get [Context], [Resources], [AssetManager], [Configuration] and [DisplayMetrics] in any class.
|
// * Base helps to get [Context], [Resources], [AssetManager], [Configuration] and [DisplayMetrics] in any class.
|
||||||
*
|
// *
|
||||||
* @author Leonardo Taehwan Kim
|
// * @author Leonardo Taehwan Kim
|
||||||
*/
|
// */
|
||||||
@SuppressLint("StaticFieldLeak")
|
//@SuppressLint("StaticFieldLeak")
|
||||||
object Base {
|
//object Base {
|
||||||
private var context: Context? = null
|
// private var context: Context? = null
|
||||||
|
//
|
||||||
fun initialize(context: Context) {
|
// fun initialize(context: Context) {
|
||||||
Base.context = context
|
// Base.context = context
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
fun getContext(): Context {
|
// fun getContext(): Context {
|
||||||
synchronized(Base::class.java) {
|
// synchronized(Base::class.java) {
|
||||||
if (context == null) throw NullPointerException("Call Base.initialize(context) within your Application onCreate() method.")
|
// if (context == null) throw NullPointerException("Call Base.initialize(context) within your Application onCreate() method.")
|
||||||
return context!!.applicationContext
|
// return context!!.applicationContext
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
val resources: Resources
|
// val resources: Resources
|
||||||
get() = getContext().resources
|
// get() = getContext().resources
|
||||||
|
//
|
||||||
val theme: Theme
|
// val theme: Theme
|
||||||
get() = getContext().theme
|
// get() = getContext().theme
|
||||||
|
//
|
||||||
val assets: AssetManager
|
// val assets: AssetManager
|
||||||
get() = getContext().assets
|
// get() = getContext().assets
|
||||||
|
//
|
||||||
val configuration: Configuration
|
// val configuration: Configuration
|
||||||
get() = resources.configuration
|
// get() = resources.configuration
|
||||||
|
//
|
||||||
val displayMetrics: DisplayMetrics
|
// val displayMetrics: DisplayMetrics
|
||||||
get() = resources.displayMetrics
|
// get() = resources.displayMetrics
|
||||||
} // TODO: Thread safety
|
//} // TODO: Thread safety
|
||||||
// TODO: ripple, bitmap, time, contact list, picture list, video list, connectivity, wake lock, screen lock/off/on, get attributes, cookie, audio
|
//// TODO: ripple, bitmap, time, contact list, picture list, video list, connectivity, wake lock, screen lock/off/on, get attributes, cookie, audio
|
||||||
// TODO: keystore
|
//// TODO: keystore
|
||||||
// TODO: http://jo.centis1504.net/?p=1189
|
//// TODO: http://jo.centis1504.net/?p=1189
|
||||||
// TODO: Test codes
|
//// TODO: Test codes
|
||||||
Loading…
x
Reference in New Issue
Block a user