From a4e21be0eca8f600bb096038a3cc8e765ae8c4b3 Mon Sep 17 00:00:00 2001 From: lunaticbum Date: Tue, 23 Sep 2025 15:37:38 +0900 Subject: [PATCH] ... --- app/build.gradle.kts | 1 + .../extensions/my_extension/sb_pics.html | 186 +++++++ .../bums/lunatic/launcher/BookmarkUploader.kt | 3 + .../bums/lunatic/launcher/LauncherActivity.kt | 12 +- .../bums/lunatic/launcher/home/GeckoWeb.kt | 2 +- .../home/adapters/BookmarkPagerAdapter.kt | 101 +++- .../launcher/home/adapters/RssItemAdapter.kt | 12 +- .../bums/lunatic/launcher/tokiz/BaseToki.kt | 517 +++++++++++++++++- .../bums/lunatic/launcher/tokiz/Comics.kt | 99 ---- .../lunatic/launcher/tokiz/HistoryManager.kt | 459 ++++++++++++++++ .../bums/lunatic/launcher/tokiz/Magnet.kt | 102 ---- .../bums/lunatic/launcher/tokiz/Novels.kt | 100 ---- .../bums/lunatic/launcher/tokiz/Perplexity.kt | 102 ---- .../bums/lunatic/launcher/tokiz/Settings.kt | 90 ++- .../bums/lunatic/launcher/tokiz/Twitter.kt | 102 ---- .../bums/lunatic/launcher/tokiz/Webtoons.kt | 101 ---- .../bums/lunatic/launcher/tokiz/YouTube.kt | 61 --- .../bums/lunatic/launcher/tokiz/Zota.kt | 99 ---- .../lunatic/launcher/tokiz/common/Definez.kt | 88 --- .../launcher/tokiz/common/PrefManager.kt | 29 - .../launcher/tokiz/data/HistoryManager.kt | 189 ------- .../tokiz/data/model/ContentsPageInfo.kt | 143 ----- .../launcher/tokiz/data/model/FakeSession.kt | 47 -- .../launcher/tokiz/data/model/PageInfo.kt | 70 --- .../launcher/tokiz/data/model/ReaderConfig.kt | 17 - .../launcher/tokiz/dialog/DefaultList.kt | 55 -- .../launcher/tokiz/dialog/DialogManager.kt | 17 - .../lunatic/launcher/tokiz/dialog/Stylez.kt | 97 ---- .../tokiz/view/PagedTextGenerateInterface.kt | 5 - .../launcher/tokiz/view/PagedTextLayout.kt | 266 ++++++++- .../launcher/tokiz/view/PagedTextView.kt | 259 --------- .../tokiz/view/PagedTextViewInterface.kt | 13 - .../launcher/tokiz/view/ScopeEditor.kt | 61 --- .../launcher/tokiz/view/SideButtonTextView.kt | 81 +++ .../launcher/tokiz/view/StepsEditor.kt | 31 -- .../tokiz/webcontents/BWebviewClient.kt | 226 -------- .../webcontents/BaseWebContentsViewer.kt | 416 -------------- .../launcher/tokiz/webcontents/DefineTypes.kt | 5 - .../webcontents/MainControllInterface.kt | 22 - .../tokiz/webcontents/WebContentsManger.kt | 20 - .../contentsinfo/BaseWebContents.kt | 5 - .../contentsinfo/BooktokiStruct.kt | 16 - .../contentsinfo/ContentsInfoInterface.kt | 20 - .../lunatic/launcher/workers/WorkersDb.kt | 10 +- .../drawable/progress_bar_double_circle.xml | 26 + .../main/res/layout/item_bookmark_image.xml | 26 +- app/src/main/res/layout/launcher_activity.xml | 11 +- 47 files changed, 1734 insertions(+), 2686 deletions(-) create mode 100644 app/src/main/assets/extensions/my_extension/sb_pics.html delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/Comics.kt create mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/HistoryManager.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/Magnet.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/Novels.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/Perplexity.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/Twitter.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/Webtoons.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/YouTube.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/Zota.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/common/Definez.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/common/PrefManager.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/HistoryManager.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/ContentsPageInfo.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/FakeSession.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/PageInfo.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/ReaderConfig.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/DefaultList.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/DialogManager.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/Stylez.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextGenerateInterface.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextView.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextViewInterface.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/ScopeEditor.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/StepsEditor.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/BWebviewClient.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/BaseWebContentsViewer.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/DefineTypes.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/MainControllInterface.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/WebContentsManger.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/BaseWebContents.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/BooktokiStruct.kt delete mode 100644 app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/ContentsInfoInterface.kt create mode 100644 app/src/main/res/drawable/progress_bar_double_circle.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c491ede6..96ce70c0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -155,6 +155,7 @@ dependencies { implementation("io.github.junkfood02.youtubedl-android:ffmpeg:0.17.4") implementation("io.github.junkfood02.youtubedl-android:aria2c:0.17.4") implementation("io.coil-kt:coil:2.5.0") + implementation("io.coil-kt:coil-gif:2.5.0") implementation ("com.squareup.okhttp3:logging-interceptor:4.11.0") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.3") diff --git a/app/src/main/assets/extensions/my_extension/sb_pics.html b/app/src/main/assets/extensions/my_extension/sb_pics.html new file mode 100644 index 00000000..5beb9200 --- /dev/null +++ b/app/src/main/assets/extensions/my_extension/sb_pics.html @@ -0,0 +1,186 @@ + + + + + + Synology Photos Random Slideshow + + + + +
+

시놀로지 포토 로그인

+ + + + +

+
+ +
+ Loading photo... +
+ + + + \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/BookmarkUploader.kt b/app/src/main/kotlin/bums/lunatic/launcher/BookmarkUploader.kt index 2b246c25..3654d465 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/BookmarkUploader.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/BookmarkUploader.kt @@ -405,6 +405,9 @@ class BookmarkApiService { val pageType = object : TypeToken>() {}.type val page: Page = Gson().fromJson(responseJson, pageType) println("✅ 북마크 ${page.content.size}개 로딩 성공!") + page.content.forEach { + println("it.images >>> ${it.images}") + } return@withContext page.content // Page 객체에서 실제 북마크 목록만 반환 } return@withContext null diff --git a/app/src/main/kotlin/bums/lunatic/launcher/LauncherActivity.kt b/app/src/main/kotlin/bums/lunatic/launcher/LauncherActivity.kt index 693d9371..b2e94cb0 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/LauncherActivity.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/LauncherActivity.kt @@ -67,10 +67,8 @@ import bums.lunatic.launcher.tokiz.Comics import bums.lunatic.launcher.tokiz.Magnet import bums.lunatic.launcher.tokiz.Novels import bums.lunatic.launcher.tokiz.Perplexity -import bums.lunatic.launcher.tokiz.Twitter import bums.lunatic.launcher.tokiz.Webtoons import bums.lunatic.launcher.tokiz.YouTube -import bums.lunatic.launcher.tokiz.Zota import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.workers.WorkersDb import com.google.android.material.color.DynamicColors @@ -511,7 +509,7 @@ open class LauncherActivity : CommonActivity() { R.id.webtoons ->{ supportFragmentManager.beginTransaction() - .replace(R.id.fragment_container, BookmarkPagerFragment()) + .replace(R.id.fragment_container, Webtoons()) .commit() } R.id.comics ->{ @@ -531,14 +529,10 @@ open class LauncherActivity : CommonActivity() { } R.id.zota ->{ supportFragmentManager.beginTransaction() - .replace(R.id.fragment_container, Zota()) - .commit() - } - R.id.twitter ->{ - supportFragmentManager.beginTransaction() - .replace(R.id.fragment_container, Twitter()) + .replace(R.id.fragment_container, BookmarkPagerFragment()) .commit() } + R.id.magnet ->{ supportFragmentManager.beginTransaction() .replace(R.id.fragment_container, Magnet()) diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt index c1e34152..a5d62c2f 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/home/GeckoWeb.kt @@ -46,7 +46,7 @@ import bums.lunatic.launcher.R import bums.lunatic.launcher.model.Dotax import bums.lunatic.launcher.model.DotaxArticles import bums.lunatic.launcher.model.getRssData -import bums.lunatic.launcher.tokiz.data.model.PortMessage +import bums.lunatic.launcher.tokiz.PortMessage import bums.lunatic.launcher.tokiz.view.BWebview import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.CommonUtils diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/BookmarkPagerAdapter.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/BookmarkPagerAdapter.kt index 49e85cf1..d1737b9c 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/BookmarkPagerAdapter.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/BookmarkPagerAdapter.kt @@ -1,9 +1,12 @@ package bums.lunatic.launcher.home.adapters +import android.app.Application +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.AnimationUtils import android.widget.ImageView import android.widget.TextView import androidx.fragment.app.Fragment @@ -30,12 +33,54 @@ import android.widget.Toast import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels +import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.lifecycleScope import androidx.viewpager2.widget.ViewPager2 import bums.lunatic.launcher.utils.Blog +import coil.ImageLoader +import coil.decode.GifDecoder +import coil.decode.ImageDecoderDecoder +import coil.disk.DiskCache +import coil.memory.MemoryCache +import coil.request.ImageRequest import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch +object CoilInstance { + + private var imageLoader: ImageLoader? = null + + fun getImageLoader(context: Context): ImageLoader { + // 이미 인스턴스가 있으면 그것을 반환 (싱글턴) + if (imageLoader == null) { + imageLoader = ImageLoader.Builder(context) + .components { + // GIF 지원 + if (android.os.Build.VERSION.SDK_INT >= 28) { + add(ImageDecoderDecoder.Factory()) + } else { + add(GifDecoder.Factory()) + } + } + // --- 캐시 설정 추가 --- + .memoryCache { + MemoryCache.Builder(context) + .maxSizePercent(0.05) // 앱 메모리의 25%를 메모리 캐시로 사용 + .build() + } + .diskCache { + DiskCache.Builder() + .directory(context.cacheDir.resolve("image_cache")) // 캐시 파일 저장 위치 + .maxSizePercent(0.05) // 디스크 공간의 2%를 디스크 캐시로 사용 + .build() + } + // --- 캐시 설정 끝 --- + .build() + } + return imageLoader!! + } +} + class BookmarkPagerFragment : Fragment() { // by viewModels() 델리게이트를 사용해 ViewModel 인스턴스 생성 @@ -139,6 +184,12 @@ enum class BookmarkType { IMAGE, // 하나 이상의 이미지 VIDEO // 하나 이상의 비디오 } +data class BookmarkImage( + val url: String = "", + var isVisible: Boolean = true +) + + data class WebBookmark( var id: String? = null, var userId: String, // 누가 저장했는지 @@ -147,6 +198,7 @@ data class WebBookmark( var bookmarkType: String = BookmarkType.URL.name, // [신규] 콘텐츠 URL 목록 (웹페이지는 1개, 이미지는 여러 개 가능) var contentUrls: List = emptyList(), + var images: List = emptyList(), var title: String? = null, // 페이지 제목 var description: String? = null, // 페이지 요약 (메타 태그) var thumbnailUrl: String? = null, // 페이지 썸네일 (메타 태그) @@ -182,6 +234,7 @@ init { } class ImageViewHolder(view: View) : RecyclerView.ViewHolder(view) { val imageView: ImageView = view.findViewById(R.id.bookmarkImageView) + val progressBar: ProgressBar = view.findViewById(R.id.imageProgressBar) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder { @@ -193,11 +246,29 @@ init { override fun onBindViewHolder(holder: ImageViewHolder, position: Int) { val imageUrl = imageUrls[position] // Coil을 사용해 URL로부터 이미지를 로드하고 ImageView에 표시합니다. + val imageLoader = CoilInstance.getImageLoader(holder.itemView.context) + + Blog.LOGE("imageUrl >>> ${imageUrl}") - holder.imageView.load("https://lunaticbum.kr$imageUrl") { + holder.imageView.load("https://lunaticbum.kr$imageUrl",imageLoader) { crossfade(true) - placeholder(R.drawable.ic_launcher) // 로딩 중 보여줄 이미지 (ic_placeholder.xml 같은 drawable 필요) error(R.drawable.ic_news) // 에러 시 보여줄 이미지 (ic_error.xml 같은 drawable 필요) + listener( + onStart = { + // 로딩 시작: 프로그레스 바를 보여줌 + holder.progressBar.visibility = View.VISIBLE + }, + onSuccess = { _, _ -> + // 로딩 성공: 프로그레스 바를 숨김 + holder.progressBar.visibility = View.GONE + val fadeInAnimation = AnimationUtils.loadAnimation(holder.itemView.context, R.anim.fade_in) + holder.imageView.startAnimation(fadeInAnimation) + }, + onError = { _, _ -> + // 로딩 실패: 프로그레스 바를 숨김 + holder.progressBar.visibility = View.GONE + } + ) } } @@ -279,7 +350,7 @@ class BookmarkDetailFragment : Fragment() { // RecyclerView 설정 recyclerView.layoutManager = LinearLayoutManager(context) // contentUrls에 있는 이미지 목록으로 어댑터를 생성하고 RecyclerView에 연결합니다. - recyclerView.adapter = BookmarkImageAdapter(bookmark.contentUrls) + recyclerView.adapter = BookmarkImageAdapter(bookmark.images.filter { it.isVisible }.map { it.url }) } companion object { @@ -305,7 +376,7 @@ sealed class UiState { data class Error(val message: String) : UiState() // 에러 (에러 메시지 보여줌) } -class BookmarkViewModel : ViewModel() { +class BookmarkViewModel(application: Application) : AndroidViewModel(application) { private val apiService = BookmarkApiService() @@ -338,6 +409,27 @@ class BookmarkViewModel : ViewModel() { } } + private fun preloadImages(bookmarks: List) { + // 싱글턴 ImageLoader 가져오기 + val imageLoader = CoilInstance.getImageLoader(getApplication()) + + // 모든 북마크의 모든 이미지 URL을 하나의 리스트로 만듦 + val allImageUrls = bookmarks.flatMap { bookmark -> + bookmark.images.filter { it.isVisible }.map { it.url } + } + + // 각 이미지 URL에 대해 캐시 저장 요청을 보냄 + allImageUrls.forEach { imageUrl -> + val fullUrl = "https://lunaticbum.kr$imageUrl" + val request = ImageRequest.Builder(getApplication()) + .data(fullUrl) + // 중요: .target()을 설정하지 않으면 이미지를 뷰에 표시하지 않고 + // 캐시에만 저장합니다. + .build() + imageLoader.enqueue(request) // 요청을 대기열에 추가 + } + } + private fun fetchBookmarks() { viewModelScope.launch { _uiState.value = UiState.Loading // 로딩 상태로 변경 @@ -346,6 +438,7 @@ class BookmarkViewModel : ViewModel() { if (bookmarks.isEmpty()){ _uiState.value = UiState.Error("저장된 북마크가 없습니다.") } else { + preloadImages(bookmarks) _uiState.value = UiState.Success(bookmarks) // 성공 상태와 데이터 전달 } } else { diff --git a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/RssItemAdapter.kt b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/RssItemAdapter.kt index 6772899a..1b61f334 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/RssItemAdapter.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/home/adapters/RssItemAdapter.kt @@ -181,7 +181,7 @@ internal class RssItemAdapter ( } else { holder.view.date.text = emptyDate } - + Picasso.get().cancelRequest(holder.view.circlePreview) holder.view.title.text = "".plus(if (rssData.vote) " * " else "") .plus(rssData.title().plus("[R:${rssData.read}]")) @@ -191,7 +191,7 @@ internal class RssItemAdapter ( holder.view.circlePreview.layoutParams = ConstraintLayout.LayoutParams(rssData.category().defaultImgSize(), param.height) holder.view.circlePreview.visibility = rssData.category().getDefaultVisibiliy() - Picasso.get().cancelRequest(holder.view.circlePreview) + if (rssData.category().getResId() > 0) { holder.view.circlePreview.setImageResource(rssData.category().getResId()) @@ -199,9 +199,9 @@ internal class RssItemAdapter ( if (rssData.thumbnailUrl()?.length ?: 0 > 6) { Blog.LOGE("rssData.thumbnailUrl() >>> ${rssData.thumbnailUrl()}") - val requestOptions = RequestOptions() - .diskCacheStrategy(DiskCacheStrategy.ALL) - .timeout(3000) // 3초 +// val requestOptions = RequestOptions() +// .diskCacheStrategy(DiskCacheStrategy.ALL) +// .timeout(3000) // 3초 Picasso.get().load(rssData.thumbnailUrl().replace("&", "&").toUri()) .error(rssData.category().getResId()) @@ -210,7 +210,7 @@ internal class RssItemAdapter ( // 캐시에서 이미지 성공적으로 로드됨 } override fun onError(e: Exception?) { - Glide.with(holder.view.circlePreview).load(rssData.thumbnailUrl().replace("&", "&")).apply(requestOptions).error(rssData.category().getResId()).into(holder.view.circlePreview) +// Glide.with(holder.view.circlePreview).load(rssData.thumbnailUrl().replace("&", "&")).apply(requestOptions).error(rssData.category().getResId()).into(holder.view.circlePreview) } }) } diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/BaseToki.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/BaseToki.kt index 88fb26ed..f0a31e27 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/BaseToki.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/BaseToki.kt @@ -38,21 +38,6 @@ import bums.lunatic.launcher.LauncherActivity.Companion.getRuntime 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.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.ContentsCollection -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.LastInfo -import bums.lunatic.launcher.tokiz.data.model.PageInfosJ -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.BWebview import bums.lunatic.launcher.tokiz.view.JxEvent import bums.lunatic.launcher.tokiz.view.PagedTextLayout @@ -684,7 +669,7 @@ abstract class BaseToki : Fragment(), PagedTextViewInterface { private fun getHistory() : List? { try { var realm = openRealm() - return realm.query().query("contentsType == $0", contentsType).find()?.copyFromRealm() + return realm.query().query("contentsType == $0", contentsType).find()?.copyFromRealm()?.reversed() }catch (e: Exception){ e.printStackTrace() } @@ -1163,13 +1148,6 @@ abstract class BaseToki : Fragment(), PagedTextViewInterface { fun onStateChange(sessionState: GeckoSession.SessionState) { - var fakeSession : FakeSessions? = null - try { - fakeSession = Gson().fromJson(Gson().toJson(sessionState), FakeSessions::class.java) - Blog.LOGE("fakeSession >>> $fakeSession") - }catch (e: Exception){ - e.printStackTrace() - } if (sessionState.last().uri.length > 10) { lastedUrl?.let { @@ -1546,4 +1524,497 @@ abstract class BaseToki : Fragment(), PagedTextViewInterface { // binding.menuWeb.session?.goBack() } +} + +class YouTube : BaseToki(){ + override val contentsType = "youtube" + override var lastNumber : Int = 143 + override val webcontentsName : String = "youtube" + override val afterDot = "com" + override var isPrivateMode: Boolean = true + + override fun getLastedDoamin(): String { + return String.format("https://%s.%s", webcontentsName, afterDot) + } + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + super.onCreateView(inflater, container, savedInstanceState) + return binding.root + } + + override fun onStart() { + super.onStart() + } + + override fun onResume() { + super.onResume() + loadLastInfo() + } + + override fun back() { + binding.menuWeb.session?.goBack() + } + + override fun onTouch(touchArea: TouchArea) { + } + + override fun onTimeoverTouch() { + } + + override fun onSwipeLeft(touchCount: Int) { + } + + override fun onSwipeRight(touchCount: Int) { + } + + override fun onSwipeDown(touchCount: Int) { + } + + override fun onSwipeUp(touchCount: Int) { + } + + override fun onLongClick() { + } +} +class Comics : BaseToki(), PagedTextViewInterface { + + override val contentsType = "comics" + override var lastNumber : Int = 468 + override val webcontentsName : String = "manatoki" + override val afterDot = "net" + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + super.onCreateView(inflater, container, savedInstanceState) + return binding.root + } + + override fun onStart() { + super.onStart() + } + + override fun onResume() { + super.onResume() + loadLastInfo() + } + + override fun onTouch(touchArea: TouchArea) { + Blog.LOGD(log = "onTouch ${touchArea}") + when (touchArea) { + TouchArea.Center -> { + + } + + TouchArea.Right -> { + actionNextEvent() + } + + TouchArea.Left -> { + actionPrevEvent() + } + + TouchArea.DoubleRight -> { + actionNextEvent(true) + } + + TouchArea.DoubleLeft -> { + actionPrevEvent(true) + } + else -> { + + } + } + + + } + + override fun onLongClick() { + Blog.LOGD(log = "onLongClick") + + } + + override fun onSwipeLeft(count: Int) { + Blog.LOGD(log = "onSwipeLeft ${count}") + actionNextEvent(count > 1) + + } + + override fun onSwipeRight(count: Int) { + Blog.LOGD(log = "onSwipeRight ${count}") + actionPrevEvent(count > 1) + } + + override fun onSwipeUp(touchCount: Int) { + + } + + override fun onSwipeDown(touchCount: Int) { + if (touchCount == 2) { + if (binding.pagedLayer.isVisible) { + binding.pagedLayer.visibility = GONE + } + } + } + + override fun onTimeoverTouch() { + + } +} +class Magnet : BaseToki(), PagedTextViewInterface { + // "https://btsearch.love/ + override val contentsType = "btsearch" + override var lastNumber : Int = 143 + override val webcontentsName : String = "btsearch" + override val afterDot = "love" + override fun getLastedDoamin(): String { + return String.format("https://%s.%s", webcontentsName, afterDot) + } + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + super.onCreateView(inflater, container, savedInstanceState) + return binding.root + } + + override fun onStart() { + super.onStart() + } + + override fun onResume() { + super.onResume() + loadLastInfo() + } + + override fun onTouch(touchArea: TouchArea) { + Blog.LOGD(log = "onTouch ${touchArea}") + when (touchArea) { + TouchArea.Center -> { + + } + + TouchArea.Right -> { + actionNextEvent() + } + + TouchArea.Left -> { + actionPrevEvent() + } + + TouchArea.DoubleRight -> { + actionNextEvent(true) + } + + TouchArea.DoubleLeft -> { + actionPrevEvent(true) + } + else -> { + + } + } + + + } + + override fun onLongClick() { + Blog.LOGD(log = "onLongClick") + + } + + override fun onSwipeLeft(count: Int) { + Blog.LOGD(log = "onSwipeLeft ${count}") + actionNextEvent(count > 1) + + } + + override fun onSwipeRight(count: Int) { + Blog.LOGD(log = "onSwipeRight ${count}") + actionPrevEvent(count > 1) + } + + override fun onSwipeUp(touchCount: Int) { + + } + + override fun onSwipeDown(touchCount: Int) { + if (touchCount == 2) { + if (binding.pagedLayer.isVisible) { + binding.pagedLayer.visibility = GONE + } + } + } + + override fun onTimeoverTouch() { + + } +} +class Novels : BaseToki(), PagedTextViewInterface { + + override val contentsType = "book" + override var lastNumber : Int = 468 + override val webcontentsName : String = "booktoki" + override val afterDot = "com" + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + super.onCreateView(inflater, container, savedInstanceState) + return binding.root + } + + override fun onStart() { + super.onStart() + } + + override fun onResume() { + super.onResume() + loadLastInfo() + } + + override fun onTouch(touchArea: TouchArea) { + Blog.LOGD(log = "onTouch ${touchArea}") + when (touchArea) { + TouchArea.Center -> { + + } + + TouchArea.Right -> { + actionNextEvent() + } + + TouchArea.Left -> { + actionPrevEvent() + } + + TouchArea.DoubleRight -> { + actionNextEvent(true) + } + + TouchArea.DoubleLeft -> { + actionPrevEvent(true) + } + else -> { + + } + } + + + } + + override fun onLongClick() { + Blog.LOGD(log = "onLongClick") + + } + + override fun onSwipeLeft(count: Int) { + Blog.LOGD(log = "onSwipeLeft ${count}") + actionNextEvent(count > 1) + + } + + override fun onSwipeRight(count: Int) { + Blog.LOGD(log = "onSwipeRight ${count}") + actionPrevEvent(count > 1) + } + + override fun onSwipeUp(touchCount: Int) { + + } + + override fun onSwipeDown(touchCount: Int) { + if (touchCount == 2) { + if (binding.pagedLayer.isVisible) { + binding.pagedLayer.visibility = GONE + } + binding.menuWeb.visibility = View.VISIBLE + } + } + + override fun onTimeoverTouch() { + + } +} +class Perplexity : BaseToki(), PagedTextViewInterface { + // "https://btsearch.love/ + override val contentsType = "perplexity" + override var lastNumber : Int = 143 + override val webcontentsName : String = "www.perplexity" + override val afterDot = "ai" + override fun getLastedDoamin(): String { + return String.format("https://%s.%s", webcontentsName, afterDot) + } + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + super.onCreateView(inflater, container, savedInstanceState) + return binding.root + } + + override fun onStart() { + super.onStart() + } + + override fun onResume() { + super.onResume() + loadLastInfo() + } + + override fun onTouch(touchArea: TouchArea) { + Blog.LOGD(log = "onTouch ${touchArea}") + when (touchArea) { + TouchArea.Center -> { + + } + + TouchArea.Right -> { + actionNextEvent() + } + + TouchArea.Left -> { + actionPrevEvent() + } + + TouchArea.DoubleRight -> { + actionNextEvent(true) + } + + TouchArea.DoubleLeft -> { + actionPrevEvent(true) + } + else -> { + + } + } + + + } + + override fun onLongClick() { + Blog.LOGD(log = "onLongClick") + + } + + override fun onSwipeLeft(count: Int) { + Blog.LOGD(log = "onSwipeLeft ${count}") + actionNextEvent(count > 1) + + } + + override fun onSwipeRight(count: Int) { + Blog.LOGD(log = "onSwipeRight ${count}") + actionPrevEvent(count > 1) + } + + override fun onSwipeUp(touchCount: Int) { + + } + + override fun onSwipeDown(touchCount: Int) { + if (touchCount == 2) { + if (binding.pagedLayer.isVisible) { + binding.pagedLayer.visibility = GONE + } + } + } + + override fun onTimeoverTouch() { + + } +} +class Webtoons : BaseToki(), PagedTextViewInterface { + + override val contentsType = "webtoon" + override var lastNumber : Int = 468 + override val webcontentsName : String = "newtoki" + override val afterDot = "com" + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + super.onCreateView(inflater, container, savedInstanceState) + return binding.root + } + + + override fun onStart() { + super.onStart() + } + + override fun onResume() { + super.onResume() + loadLastInfo() + Blog.LOGE("binding.root >>> ${binding.root}") + } + + override fun onTouch(touchArea: TouchArea) { + Blog.LOGD(log = "onTouch ${touchArea}") + when (touchArea) { + TouchArea.Center -> { + + } + + TouchArea.Right -> { + actionNextEvent() + } + + TouchArea.Left -> { + actionPrevEvent() + } + + TouchArea.DoubleRight -> { + actionNextEvent(true) + } + + TouchArea.DoubleLeft -> { + actionPrevEvent(true) + } + else -> { + + } + } + + + } + + override fun onLongClick() { + Blog.LOGD(log = "onLongClick") + + } + + override fun onSwipeLeft(count: Int) { + Blog.LOGD(log = "onSwipeLeft ${count}") + actionNextEvent(count > 1) + + } + + override fun onSwipeRight(count: Int) { + Blog.LOGD(log = "onSwipeRight ${count}") + actionPrevEvent(count > 1) + } + + override fun onSwipeUp(touchCount: Int) { + + } + + override fun onSwipeDown(touchCount: Int) { + if (touchCount == 2) { + if (binding.pagedLayer.isVisible) { + binding.pagedLayer.visibility = GONE + } + } + } + + override fun onTimeoverTouch() { + + } } \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Comics.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Comics.kt deleted file mode 100644 index 9d4164a9..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Comics.kt +++ /dev/null @@ -1,99 +0,0 @@ -package bums.lunatic.launcher.tokiz - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.View.GONE -import android.view.ViewGroup -import androidx.core.view.isVisible -import bums.lunatic.launcher.tokiz.common.TouchArea -import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface -import bums.lunatic.launcher.utils.Blog - - -class Comics : BaseToki(), PagedTextViewInterface { - - override val contentsType = "comics" - override var lastNumber : Int = 468 - override val webcontentsName : String = "manatoki" - override val afterDot = "net" - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - super.onCreateView(inflater, container, savedInstanceState) - return binding.root - } - - override fun onStart() { - super.onStart() - } - - override fun onResume() { - super.onResume() - loadLastInfo() - } - - override fun onTouch(touchArea: TouchArea) { - Blog.LOGD(log = "onTouch ${touchArea}") - when (touchArea) { - TouchArea.Center -> { - - } - - TouchArea.Right -> { - actionNextEvent() - } - - TouchArea.Left -> { - actionPrevEvent() - } - - TouchArea.DoubleRight -> { - actionNextEvent(true) - } - - TouchArea.DoubleLeft -> { - actionPrevEvent(true) - } - else -> { - - } - } - - - } - - override fun onLongClick() { - Blog.LOGD(log = "onLongClick") - - } - - override fun onSwipeLeft(count: Int) { - Blog.LOGD(log = "onSwipeLeft ${count}") - actionNextEvent(count > 1) - - } - - override fun onSwipeRight(count: Int) { - Blog.LOGD(log = "onSwipeRight ${count}") - actionPrevEvent(count > 1) - } - - override fun onSwipeUp(touchCount: Int) { - - } - - override fun onSwipeDown(touchCount: Int) { - if (touchCount == 2) { - if (binding.pagedLayer.isVisible) { - binding.pagedLayer.visibility = GONE - } - } - } - - override fun onTimeoverTouch() { - - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/HistoryManager.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/HistoryManager.kt new file mode 100644 index 00000000..625aa217 --- /dev/null +++ b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/HistoryManager.kt @@ -0,0 +1,459 @@ +package bums.lunatic.launcher.tokiz + +import android.R +import android.content.Context +import android.content.DialogInterface +import android.content.pm.ActivityInfo +import android.widget.ArrayAdapter +import androidx.activity.ComponentDialog +import androidx.appcompat.app.AlertDialog +import bums.lunatic.launcher.model.RssData +import bums.lunatic.launcher.utils.Blog +import bums.lunatic.launcher.workers.WorkersDb +import io.realm.kotlin.Realm +import io.realm.kotlin.UpdatePolicy +import io.realm.kotlin.ext.realmListOf +import io.realm.kotlin.types.RealmList +import io.realm.kotlin.types.RealmObject +import io.realm.kotlin.types.annotations.PrimaryKey +import java.text.SimpleDateFormat +import java.util.Date + +class LastInfo : RealmObject { + @PrimaryKey + var _id : String = "" + var pageUrl : String = "" + var title : String = "" + var chapter : Int = 0 + var pageIndex : Int = 0 + var contentsName : String = "" + var contentsType : String? = "" + set(value) { + _id = value ?: "" + field = value + } + var displayOrientation : Int = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + + fun makeHistoryItem() : HistoryItem = HistoryItem().apply { + title = this@LastInfo.title + pageUrl = this@LastInfo.pageUrl + chapter = this@LastInfo.chapter + pageIndex = this@LastInfo.pageIndex + contentsName = this@LastInfo.contentsName + displayOrientation = this@LastInfo.displayOrientation + contentsType = this@LastInfo.contentsType + } +} +class HistoryItem : RealmObject { + @PrimaryKey + var title : String = "" + var pageUrl : String = "" + var chapter : Int = 0 + var pageIndex : Int = 0 + var contentsName : String = "" + var displayOrientation : Int = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + var contentsType : String? = "" + + fun makeLastInfo() = LastInfo().apply{ + _id = "UniqLastId" + title = this@HistoryItem.title + pageUrl = this@HistoryItem.pageUrl + chapter = this@HistoryItem.chapter + pageIndex = this@HistoryItem.pageIndex + contentsName = this@HistoryItem.contentsName + displayOrientation = this@HistoryItem.displayOrientation + contentsType = this@HistoryItem.contentsType + } + fun putHistory(contentsPageInfo: ContentsPageInfo?, currentPath : String) : HistoryItem { + title = contentsPageInfo?.bookTitle ?: SimpleDateFormat("YY-mm-DD-HH:mm").format(Date()) + pageUrl = contentsPageInfo?.pathUrl ?: currentPath + chapter = contentsPageInfo?.chapterNum ?: 0 + pageIndex = contentsPageInfo?.lastPage ?: 0 + contentsName = contentsPageInfo?.chapterTitle ?: "" + contentsType = contentsPageInfo?.contentsType ?: "" + return this + } +} +class Bookmark() : RealmObject { + @PrimaryKey + var pageUrl : String = "" +} +class ReaderConfig : RealmObject { + @PrimaryKey + var id : String? = "ReaderConfig" + var textSize : Int? = 14 + var textColor : String? = "#FFFFFF" + var bgColor : String? = "#000000" + var style : Int? = 0 + var lineSpace : Int? = 1 + var letterSpace : Int? = 1 + var font : String? = "" + var padding : Int? = 5 +} +class PortMessage { + var type : String? = "" + var bookInfos : PageInfosJ? = null + var book : BookContents? = null + var msg : String? = null + var contents : String? = null + var privates : ArrayList? = null + var currentPage : String? = null + var cookies : String? = null + var urls : List = emptyList() + var imgSrc: String? = null + var base64Data: String? = null +} +class BookContents { + var chapterTitle : String? = null + var bookContents : String? = null +} +class PageInfosJ { + var bookTitle : String = "" + var bookPageUrl : String = "" + var contentsType : String? = "" + var pages : ArrayList = arrayListOf() + + fun getTitleArray() : ArrayList { + var arrayList = ArrayList() + pages.forEach { arrayList.add(it.bookTitle ?: "") } + return arrayList + } + + fun getR() : ContentsCollection{ + var r = ContentsCollection() + r.bookTitle = this.bookTitle + r.bookPageUrl = this.bookPageUrl + r.contentsType = this.contentsType + return r + } +} +class PageInfoJ { + var chapterID : Int = 0 + var contents : String? = "" + var bookPageUrl : String? = "" + var chapterTitle : String? = "" + var bookTitle : String? = "" + var chapterNum : Int = 0 + var lastPage : Int? = 0 + var pathUrl : String? = "" + var contentsType : String? = "" + + fun getRealm() : ContentsPageInfo { + var r = ContentsPageInfo() + r.chapterID = this.chapterID + r.contents = this.contents + r.bookPageUrl = this.bookPageUrl ?: "" + r.chapterTitle = this.chapterTitle + r.bookTitle = this.bookTitle ?: "" + r.chapterNum = this.chapterNum + r.lastPage = this.lastPage + r.pathUrl = this.pathUrl?.replace("'","") + r.contentsType = this.contentsType + return r + } +} +class ContentsCollection : RealmObject { + + var bookTitle : String = "" + + @PrimaryKey + var bookPageUrl : String? = "" + var pages : RealmList = realmListOf() + var contentsType : String? = "" + + fun getTitleArray() : ArrayList { + var arrayList = ArrayList() + pages.forEach { + arrayList.add(it.getTitleItem())} + return arrayList + } + + fun sort() { + val comparator : Comparator = compareBy { it.chapterID } + pages.sortWith(comparator) + } + + fun hasItem(item: ContentsPageInfo) : Boolean { + var hasItem = false + for (c in pages) { + if (!hasItem) { + hasItem = c.pathUrl.equals(item.pathUrl) + } + } + return hasItem + } + + +} +class ContentsPageInfo : RealmObject { + + var chapterID : Int = 0 + var contents : String? = "" + + var bookPageUrl : String? = "" + var chapterTitle : String? = "" + var bookTitle : String? = "" + var chapterNum : Int = 0 + var lastPage : Int? = 0 + var contentsType : String? = "" + + fun isValidBook() = (pathUrl?.length ?: 0) > 1 + + @PrimaryKey + var pathUrl : String? = "" + + fun getTitleItem() : String { + var result = StringBuilder() + result.append(if ((contents?.length ?: 0) > 10) { + "S:[0] " + } else { + "[X] " + }) + + result.append(chapterTitle?: "") + + result.append(if ((lastPage ?: 0) > 0) { + " [0] " + } else { + " [X] " + }) + + return result.toString() + } +} +object HistoryManager { + + + val openRealm : Realm = WorkersDb.getRealm() + + fun save(lastInfo: LastInfo) { + openRealm.apply{ + this.writeBlocking { + copyToRealm(lastInfo, UpdatePolicy.ALL) + } + } + } + + fun save(historyItem: HistoryItem) { + openRealm.apply{ + this.writeBlocking { + copyToRealm(historyItem, UpdatePolicy.ALL) + } + } + } + + fun requestLastInfo(callback : (LastInfo)->Unit) { + openRealm.apply{ + + } + } + + fun save(config : ReaderConfig) { + openRealm.apply{ + this.writeBlocking { + copyToRealm(config,UpdatePolicy.ALL) + } + } + } + + fun getBookInfos(contentsType : String,aUrl : String, callback : (ContentsCollection?)->Unit) { + var url : String = aUrl + Blog.LOGE("aUrl >>> ${aUrl} , contentsType ${contentsType}") + openRealm.apply{ + if (url.startsWith("//")) { + while (url.startsWith("//")) { + url = url.replace("//","/").trim() + } + } + Blog.LOGE("aUrl >>> ${url}") + var contentsPageInfo = this.query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0 || bookPageUrl == $0","${url}").find() + if (contentsPageInfo != null && contentsPageInfo.count() > 0) { + Blog.LOGE("get ${contentsPageInfo}" ) + var pgs = this.query(ContentsCollection::class,"bookPageUrl == $0", contentsPageInfo.first().bookPageUrl).find() + if (pgs.size > 0) { + pgs.first().let { + Blog.LOGE("get ${it} , ${it?.pages}") + callback.invoke(this.copyFromRealm(it)) + } + } else { + callback.invoke(null) + } + } else { + callback.invoke(null) + } + } + } + + fun getBookPageInfo(contentsType : String, aUrl : String, callback : (ContentsPageInfo?)->Unit) { + var url : String = aUrl + openRealm.apply{ + if (url.startsWith("//")) { + while (url.startsWith("//")) { + url = url.replace("//","/").trim() + } + } + var result = this.query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0","${url}").find() + if (result.size > 0) { + var bookPageInfo = result?.first() + if (bookPageInfo != null) { + callback.invoke(bookPageInfo) + } else { + callback.invoke(null) + } + } else { + callback.invoke(null) + } + } + } + + fun setBookPageInfo(contentsType : String,aUrl : String, page :Int) { + var url : String = aUrl + openRealm.writeBlocking { + if (url.startsWith("//")) { + while (url.startsWith("//")) { + url = url.replace("//","/").trim() + } + } + var result = this.query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0","${url}").find() + if (result.size > 0) { + var bookPageInfo = result?.first() + if (bookPageInfo != null) { + bookPageInfo.lastPage = page + } + } + } + } + + fun getBooPageInfoContentsSave(contentsType : String,aUrl : String, contents : String) { + var url : String = if (aUrl.startsWith("//") || aUrl.startsWith("///") || aUrl.startsWith("////")) { + aUrl.replace("////","/").replace("///","/").replace("//","/") + } else aUrl + openRealm.writeBlocking { + Blog.LOGE("getBooPageInfoContentsSave ${url}") + val result = query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0", "${url}").find() + if (result.size > 0) { + result.first().contents = contents + copyToRealm(result.first(), UpdatePolicy.ALL) + } + } + } + + + + + fun getNextPage(contentsType : String,aUrl : String ,callback : (ContentsPageInfo?)->Unit) { + var url : String = aUrl + openRealm.apply{ + if (url.startsWith("//")) { + while (url.startsWith("//")) { + url = url.replace("//","/").trim() + } + } + var contentsPageInfo = + this.query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0", url).find() + if (contentsPageInfo.size > 0) { + Blog.LOGE("getNextPage 2 => chapterNum : ${contentsPageInfo.first().chapterNum} , bookPageInfo.bookPageUrl : ${contentsPageInfo.first().bookPageUrl}" ) + var results = this.query(ContentsPageInfo::class).query("chapterNum == $0",contentsPageInfo.first().chapterNum + 1).query("bookPageUrl == $0","${contentsPageInfo.first().bookPageUrl}").find() + if(results.size > 0) { + results.first().let { + Blog.LOGE("getNextPage 2 nextBook pathUrl : ${it.pathUrl}" ) + callback.invoke(it) + } + } else {callback.invoke(null)} + } else {callback.invoke(null)} + } + } + + + fun getPrevPage(contentsType : String,aUrl : String ,callback : (ContentsPageInfo?)->Unit) { + var url : String = aUrl + openRealm.apply{ + Blog.LOGE("getPrevPage ${url}" ) + if (url.startsWith("//")) { + while (url.startsWith("//")) { + url = url.replace("//","/").trim() + } + } + Blog.LOGE("getPrevPage ${url}" ) + var contentsPageInfo = + this.query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0", url).find() + Blog.LOGE("getPrevPage ${contentsPageInfo}" ) + if (contentsPageInfo.size > 0) { + Blog.LOGE("getPrevPage 2 ${contentsPageInfo?.first()?.chapterNum}" ) + Blog.LOGE("getPrevPage 2 ${contentsPageInfo?.first()?.bookPageUrl}" ) + var results = this.query(ContentsPageInfo::class).query("chapterNum == $0",contentsPageInfo.first().chapterNum - 1).query("bookPageUrl == $0","${contentsPageInfo.first().bookPageUrl}").find() + if(results.size > 0) { + results.first()?.let { + Blog.LOGE("getPrevPage 2 ${it.bookPageUrl}" ) + Blog.LOGE("getPrevPage 2 ${it.pathUrl}" ) + callback.invoke(it) + } + } else { + callback.invoke(null) + } + } else { + callback.invoke(null) + } + } + } + +} +object DefaultList { + fun showDefaultList(context: Context, title : String, items : Collection, firstPosition : Int, choosedTitle : (Int)->String, chooedPositive : (Int)->Unit, saveCalback : (Int)->Unit ) { + val builderSingle: AlertDialog.Builder = AlertDialog.Builder(context) + builderSingle.setTitle(title) + val arrayAdapter = + ArrayAdapter(context, R.layout.select_dialog_singlechoice) + for (item in items) { + arrayAdapter.add(item.getTitleItem()) + } + builderSingle.setNeutralButton("전체 저장") { dialog, which -> + saveCalback.invoke(-1) + dialog.dismiss() + } + builderSingle.setNegativeButton("닫기", + DialogInterface.OnClickListener { dialog, which -> + dialog.dismiss() }) + builderSingle.setAdapter(arrayAdapter, + DialogInterface.OnClickListener { dialog, position -> + val strName = arrayAdapter.getItem(position) + val builderInner: AlertDialog.Builder = AlertDialog.Builder(context) + builderInner.setMessage(strName) + builderInner.setTitle(choosedTitle.invoke(position)) + builderInner.setNegativeButton("닫기") { dialog, which -> + + } +// builderInner.setNeutralButton("자동 저장") { dialog, which -> +// saveCalback.invoke(position) +// } + builderInner.setPositiveButton("이동"){ dialog, which -> + chooedPositive.invoke(position) + dialog.dismiss() + } + builderInner.show().apply { + DialogManager.add(this) + } + }) + builderSingle.create()?.apply{ + setOnShowListener { d-> + (d as? AlertDialog)?.let{ + it.listView?.setSelection(firstPosition) + } + } + DialogManager.add(this) + }?.show() + } +} +object DialogManager { + val dialogs = arrayListOf() + fun add(item : ComponentDialog) = dialogs.add(item) + fun closeAll() { + for (dialog in dialogs) { + try { + dialog?.dismiss() + } catch(e : Exception) { + + } + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Magnet.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Magnet.kt deleted file mode 100644 index 37044609..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Magnet.kt +++ /dev/null @@ -1,102 +0,0 @@ -package bums.lunatic.launcher.tokiz - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.View.GONE -import android.view.ViewGroup -import androidx.core.view.isVisible -import bums.lunatic.launcher.tokiz.common.TouchArea -import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface -import bums.lunatic.launcher.utils.Blog - - -class Magnet : BaseToki(), PagedTextViewInterface { -// "https://btsearch.love/ - override val contentsType = "btsearch" - override var lastNumber : Int = 143 - override val webcontentsName : String = "btsearch" - override val afterDot = "love" - override fun getLastedDoamin(): String { - return String.format("https://%s.%s", webcontentsName, afterDot) - } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - super.onCreateView(inflater, container, savedInstanceState) - return binding.root - } - - override fun onStart() { - super.onStart() - } - - override fun onResume() { - super.onResume() - loadLastInfo() - } - - override fun onTouch(touchArea: TouchArea) { - Blog.LOGD(log = "onTouch ${touchArea}") - when (touchArea) { - TouchArea.Center -> { - - } - - TouchArea.Right -> { - actionNextEvent() - } - - TouchArea.Left -> { - actionPrevEvent() - } - - TouchArea.DoubleRight -> { - actionNextEvent(true) - } - - TouchArea.DoubleLeft -> { - actionPrevEvent(true) - } - else -> { - - } - } - - - } - - override fun onLongClick() { - Blog.LOGD(log = "onLongClick") - - } - - override fun onSwipeLeft(count: Int) { - Blog.LOGD(log = "onSwipeLeft ${count}") - actionNextEvent(count > 1) - - } - - override fun onSwipeRight(count: Int) { - Blog.LOGD(log = "onSwipeRight ${count}") - actionPrevEvent(count > 1) - } - - override fun onSwipeUp(touchCount: Int) { - - } - - override fun onSwipeDown(touchCount: Int) { - if (touchCount == 2) { - if (binding.pagedLayer.isVisible) { - binding.pagedLayer.visibility = GONE - } - } - } - - override fun onTimeoverTouch() { - - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Novels.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Novels.kt deleted file mode 100644 index 183b93b0..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Novels.kt +++ /dev/null @@ -1,100 +0,0 @@ -package bums.lunatic.launcher.tokiz - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.View.GONE -import android.view.ViewGroup -import androidx.core.view.isVisible -import bums.lunatic.launcher.tokiz.common.TouchArea -import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface -import bums.lunatic.launcher.utils.Blog - - -class Novels : BaseToki(), PagedTextViewInterface { - - override val contentsType = "book" - override var lastNumber : Int = 468 - override val webcontentsName : String = "booktoki" - override val afterDot = "com" - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - super.onCreateView(inflater, container, savedInstanceState) - return binding.root - } - - override fun onStart() { - super.onStart() - } - - override fun onResume() { - super.onResume() - loadLastInfo() - } - - override fun onTouch(touchArea: TouchArea) { - Blog.LOGD(log = "onTouch ${touchArea}") - when (touchArea) { - TouchArea.Center -> { - - } - - TouchArea.Right -> { - actionNextEvent() - } - - TouchArea.Left -> { - actionPrevEvent() - } - - TouchArea.DoubleRight -> { - actionNextEvent(true) - } - - TouchArea.DoubleLeft -> { - actionPrevEvent(true) - } - else -> { - - } - } - - - } - - override fun onLongClick() { - Blog.LOGD(log = "onLongClick") - - } - - override fun onSwipeLeft(count: Int) { - Blog.LOGD(log = "onSwipeLeft ${count}") - actionNextEvent(count > 1) - - } - - override fun onSwipeRight(count: Int) { - Blog.LOGD(log = "onSwipeRight ${count}") - actionPrevEvent(count > 1) - } - - override fun onSwipeUp(touchCount: Int) { - - } - - override fun onSwipeDown(touchCount: Int) { - if (touchCount == 2) { - if (binding.pagedLayer.isVisible) { - binding.pagedLayer.visibility = GONE - } - binding.menuWeb.visibility = View.VISIBLE - } - } - - override fun onTimeoverTouch() { - - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Perplexity.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Perplexity.kt deleted file mode 100644 index 1c9928d9..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Perplexity.kt +++ /dev/null @@ -1,102 +0,0 @@ -package bums.lunatic.launcher.tokiz - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.View.GONE -import android.view.ViewGroup -import androidx.core.view.isVisible -import bums.lunatic.launcher.tokiz.common.TouchArea -import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface -import bums.lunatic.launcher.utils.Blog - - -class Perplexity : BaseToki(), PagedTextViewInterface { -// "https://btsearch.love/ - override val contentsType = "perplexity" - override var lastNumber : Int = 143 - override val webcontentsName : String = "www.perplexity" - override val afterDot = "ai" - override fun getLastedDoamin(): String { - return String.format("https://%s.%s", webcontentsName, afterDot) - } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - super.onCreateView(inflater, container, savedInstanceState) - return binding.root - } - - override fun onStart() { - super.onStart() - } - - override fun onResume() { - super.onResume() - loadLastInfo() - } - - override fun onTouch(touchArea: TouchArea) { - Blog.LOGD(log = "onTouch ${touchArea}") - when (touchArea) { - TouchArea.Center -> { - - } - - TouchArea.Right -> { - actionNextEvent() - } - - TouchArea.Left -> { - actionPrevEvent() - } - - TouchArea.DoubleRight -> { - actionNextEvent(true) - } - - TouchArea.DoubleLeft -> { - actionPrevEvent(true) - } - else -> { - - } - } - - - } - - override fun onLongClick() { - Blog.LOGD(log = "onLongClick") - - } - - override fun onSwipeLeft(count: Int) { - Blog.LOGD(log = "onSwipeLeft ${count}") - actionNextEvent(count > 1) - - } - - override fun onSwipeRight(count: Int) { - Blog.LOGD(log = "onSwipeRight ${count}") - actionPrevEvent(count > 1) - } - - override fun onSwipeUp(touchCount: Int) { - - } - - override fun onSwipeDown(touchCount: Int) { - if (touchCount == 2) { - if (binding.pagedLayer.isVisible) { - binding.pagedLayer.visibility = GONE - } - } - } - - override fun onTimeoverTouch() { - - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Settings.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Settings.kt index d94b0358..a6f34bf4 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Settings.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Settings.kt @@ -8,15 +8,93 @@ import androidx.databinding.DataBindingUtil 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.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.ReaderConfig import io.realm.kotlin.UpdatePolicy import io.realm.kotlin.ext.query +typealias PairArray = Array> +val colorz : PairArray> = arrayOf>>( + Pair("color set 01",arrayOf("#E1F5FE", "#263238")), + Pair("color set 02",arrayOf("#F0F4C3", "#37474F")), + Pair("color set 03",arrayOf("#ECEFF1", "#455A64")), + Pair("color set 04",arrayOf("#E0F7FA", "#263238")), + Pair("color set 05",arrayOf("#F5F5F5", "#263238")), + Pair("color set 06",arrayOf("#ECEFF1", "#263238")), + Pair("color set 07",arrayOf("#F8BBD0", "#263238")), + Pair("color set 08",arrayOf("#E6EE9C", "#455A64")), + Pair("color set 09",arrayOf("#CFD8DC", "#455A64")), + Pair("color set 10",arrayOf("#FFF59D", "#37474F")), + Pair("color set 21",arrayOf("#263238","#E1F5FE")), + Pair("color set 22",arrayOf("#37474F","#F0F4C3")), + Pair("color set 23",arrayOf("#455A64","#ECEFF1")), + Pair("color set 24",arrayOf("#263238","#E0F7FA")), + Pair("color set 25",arrayOf("#263238","#F5F5F5")), + Pair("color set 26",arrayOf("#263238","#ECEFF1")), + Pair("color set 27",arrayOf("#263238","#F8BBD0")), + Pair("color set 28",arrayOf("#455A64","#E6EE9C")), + Pair("color set 29",arrayOf("#455A64","#CFD8DC")), + Pair("color set 30",arrayOf("#37474F","#FFF59D")), + Pair("color set 31",arrayOf("#FFFFFF","#1C1B1B")), + Pair("color set 32",arrayOf("#272727","#FFFFFF")), + Pair("color set 33",arrayOf("#1C1B1B","#FFFFFF")), + Pair("color set 34",arrayOf("#FFFFFF","#272727")) +) +val typesfacez : PairArray = arrayOf>( + Pair("정선 아리랑 혼", R.font.jsarirang_hon), + Pair("정선 아리랑 뿌리", R.font.jsarirang_ppuri), + Pair("정선 동강 레귤러", R.font.jsdongkang_regular), + Pair("손기정체", R.font.kcc_sonkeechung), + Pair("교보 손글씨", R.font.kyobo_handwriting_2021sjy), + Pair("태백 은하수", R.font.taebaek_milkyway), + Pair("taebaek_milkyway",R.font.taebaek_milkyway), + Pair("kccahnjunggeun",R.font.kccahnjunggeun), + Pair("kotra_songeulssi",R.font.kotra_songeulssi), + Pair("kotra_bold",R.font.kotra_bold), + Pair("cafe24oneprettynight",R.font.cafe24oneprettynight), + Pair("nnsgc_wsjidyp",R.font.nnsgc_wsjidyp), + Pair("nnsgc_yjc",R.font.nnsgc_yjc), + Pair("nnsgc_brhp",R.font.nnsgc_brhp), + Pair("nnsgc_md",R.font.nnsgc_md), + Pair("nnsgc_gd_an_gd",R.font.nnsgc_gd_an_gd), + Pair("dovemayo",R.font.dovemayo), + Pair("gabia_solmee",R.font.gabia_solmee), + Pair("ylee_mortal_heart_immortal_memory",R.font.ylee_mortal_heart_immortal_memory), + Pair("kcc_kimhoon",R.font.kcc_kimhoon), + Pair("taefont_tsthlml",R.font.taefont_tsthlml), + Pair("ssshinb7",R.font.ssshinb7), + Pair("godomaum",R.font.godomaum), + Pair("tvn_jguiyg_medium",R.font.tvn_jguiyg_medium), + Pair("tvn_jguiyg_light",R.font.tvn_jguiyg_light), + Pair("on_jsuhr",R.font.on_jsuhr), + Pair("on_jsuhl",R.font.on_jsuhl), + Pair("on_ychyuhr",R.font.on_ychyuhr), + Pair("on_ychyuhl",R.font.on_ychyuhl), + Pair("on_treeususimgul_r",R.font.on_treeususimgul_r), + Pair("on_treeususimgul",R.font.on_treeususimgul), + Pair("on_wibsr",R.font.on_wibsr), + Pair("on_wisbl",R.font.on_wisbl), + Pair("on_sbsjl",R.font.on_sbsjl), + Pair("on_sbsjr",R.font.on_sbsjr), + Pair("wandohoper",R.font.wandohoper), + Pair("ebs_r",R.font.ebs_r), +) + +@JvmName("getIndexAny") +fun PairArray.getIndex(key : String) = getIndex(this, key) +fun getIndex(collection : PairArray, key : String) : Int { + var index = 0 + var returns = 0 + for (item in collection) { + if(item.first.equals(key)) { + returns = index + } + index = index.inc() + } + return returns +} +enum class TouchArea { + Left,Center,Right, DoubleLeft, DoubleRight +} + class Settings : CommonActivity() { lateinit var binding : SettingsBinding diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Twitter.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Twitter.kt deleted file mode 100644 index cb6c6823..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Twitter.kt +++ /dev/null @@ -1,102 +0,0 @@ -package bums.lunatic.launcher.tokiz - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.View.GONE -import android.view.ViewGroup -import androidx.core.view.isVisible -import bums.lunatic.launcher.tokiz.common.TouchArea -import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface -import bums.lunatic.launcher.utils.Blog - - -class Twitter : BaseToki(), PagedTextViewInterface { - - override val contentsType = "twitter" - override var lastNumber : Int = 143 - override val webcontentsName : String = "twitter" - override val afterDot = "com" - override fun getLastedDoamin(): String { - return String.format("https://%s.%s", webcontentsName, afterDot) - } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - super.onCreateView(inflater, container, savedInstanceState) - return binding.root - } - - override fun onStart() { - super.onStart() - } - - override fun onResume() { - super.onResume() - loadLastInfo() - } - - override fun onTouch(touchArea: TouchArea) { - Blog.LOGD(log = "onTouch ${touchArea}") - when (touchArea) { - TouchArea.Center -> { - - } - - TouchArea.Right -> { - actionNextEvent() - } - - TouchArea.Left -> { - actionPrevEvent() - } - - TouchArea.DoubleRight -> { - actionNextEvent(true) - } - - TouchArea.DoubleLeft -> { - actionPrevEvent(true) - } - else -> { - - } - } - - - } - - override fun onLongClick() { - Blog.LOGD(log = "onLongClick") - - } - - override fun onSwipeLeft(count: Int) { - Blog.LOGD(log = "onSwipeLeft ${count}") - actionNextEvent(count > 1) - - } - - override fun onSwipeRight(count: Int) { - Blog.LOGD(log = "onSwipeRight ${count}") - actionPrevEvent(count > 1) - } - - override fun onSwipeUp(touchCount: Int) { - - } - - override fun onSwipeDown(touchCount: Int) { - if (touchCount == 2) { - if (binding.pagedLayer.isVisible) { - binding.pagedLayer.visibility = GONE - } - } - } - - override fun onTimeoverTouch() { - - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Webtoons.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Webtoons.kt deleted file mode 100644 index e89e32e7..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Webtoons.kt +++ /dev/null @@ -1,101 +0,0 @@ -package bums.lunatic.launcher.tokiz - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.View.GONE -import android.view.ViewGroup -import androidx.core.view.isVisible -import bums.lunatic.launcher.tokiz.common.TouchArea -import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface -import bums.lunatic.launcher.utils.Blog - - -class Webtoons : BaseToki(), PagedTextViewInterface { - - override val contentsType = "webtoon" - override var lastNumber : Int = 468 - override val webcontentsName : String = "newtoki" - override val afterDot = "com" - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - super.onCreateView(inflater, container, savedInstanceState) - return binding.root - } - - - override fun onStart() { - super.onStart() - } - - override fun onResume() { - super.onResume() - loadLastInfo() - Blog.LOGE("binding.root >>> ${binding.root}") - } - - override fun onTouch(touchArea: TouchArea) { - Blog.LOGD(log = "onTouch ${touchArea}") - when (touchArea) { - TouchArea.Center -> { - - } - - TouchArea.Right -> { - actionNextEvent() - } - - TouchArea.Left -> { - actionPrevEvent() - } - - TouchArea.DoubleRight -> { - actionNextEvent(true) - } - - TouchArea.DoubleLeft -> { - actionPrevEvent(true) - } - else -> { - - } - } - - - } - - override fun onLongClick() { - Blog.LOGD(log = "onLongClick") - - } - - override fun onSwipeLeft(count: Int) { - Blog.LOGD(log = "onSwipeLeft ${count}") - actionNextEvent(count > 1) - - } - - override fun onSwipeRight(count: Int) { - Blog.LOGD(log = "onSwipeRight ${count}") - actionPrevEvent(count > 1) - } - - override fun onSwipeUp(touchCount: Int) { - - } - - override fun onSwipeDown(touchCount: Int) { - if (touchCount == 2) { - if (binding.pagedLayer.isVisible) { - binding.pagedLayer.visibility = GONE - } - } - } - - override fun onTimeoverTouch() { - - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/YouTube.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/YouTube.kt deleted file mode 100644 index df28e63d..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/YouTube.kt +++ /dev/null @@ -1,61 +0,0 @@ -package bums.lunatic.launcher.tokiz - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import bums.lunatic.launcher.tokiz.common.TouchArea - -class YouTube : BaseToki(){ - override val contentsType = "youtube" - override var lastNumber : Int = 143 - override val webcontentsName : String = "youtube" - override val afterDot = "com" - override var isPrivateMode: Boolean = true - - override fun getLastedDoamin(): String { - return String.format("https://%s.%s", webcontentsName, afterDot) - } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - super.onCreateView(inflater, container, savedInstanceState) - return binding.root - } - - override fun onStart() { - super.onStart() - } - - override fun onResume() { - super.onResume() - loadLastInfo() - } - - override fun back() { - binding.menuWeb.session?.goBack() - } - - override fun onTouch(touchArea: TouchArea) { - } - - override fun onTimeoverTouch() { - } - - override fun onSwipeLeft(touchCount: Int) { - } - - override fun onSwipeRight(touchCount: Int) { - } - - override fun onSwipeDown(touchCount: Int) { - } - - override fun onSwipeUp(touchCount: Int) { - } - - override fun onLongClick() { - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Zota.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Zota.kt deleted file mode 100644 index 97c95f3c..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/Zota.kt +++ /dev/null @@ -1,99 +0,0 @@ -package bums.lunatic.launcher.tokiz - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.View.GONE -import android.view.ViewGroup -import androidx.core.view.isVisible -import bums.lunatic.launcher.tokiz.common.TouchArea -import bums.lunatic.launcher.tokiz.view.PagedTextViewInterface -import bums.lunatic.launcher.utils.Blog - - -class Zota : BaseToki(), PagedTextViewInterface { - - override val contentsType = "Torrent" - override var lastNumber : Int = 143 - override val webcontentsName : String = "torrentzota" - override val afterDot = "com" - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - super.onCreateView(inflater, container, savedInstanceState) - return binding.root - } - - override fun onStart() { - super.onStart() - } - - override fun onResume() { - super.onResume() - loadLastInfo() - } - - override fun onTouch(touchArea: TouchArea) { - Blog.LOGD(log = "onTouch ${touchArea}") - when (touchArea) { - TouchArea.Center -> { - - } - - TouchArea.Right -> { - actionNextEvent() - } - - TouchArea.Left -> { - actionPrevEvent() - } - - TouchArea.DoubleRight -> { - actionNextEvent(true) - } - - TouchArea.DoubleLeft -> { - actionPrevEvent(true) - } - else -> { - - } - } - - - } - - override fun onLongClick() { - Blog.LOGD(log = "onLongClick") - - } - - override fun onSwipeLeft(count: Int) { - Blog.LOGD(log = "onSwipeLeft ${count}") - actionNextEvent(count > 1) - - } - - override fun onSwipeRight(count: Int) { - Blog.LOGD(log = "onSwipeRight ${count}") - actionPrevEvent(count > 1) - } - - override fun onSwipeUp(touchCount: Int) { - - } - - override fun onSwipeDown(touchCount: Int) { - if (touchCount == 2) { - if (binding.pagedLayer.isVisible) { - binding.pagedLayer.visibility = GONE - } - } - } - - override fun onTimeoverTouch() { - - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/common/Definez.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/common/Definez.kt deleted file mode 100644 index 91559239..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/common/Definez.kt +++ /dev/null @@ -1,88 +0,0 @@ -package bums.lunatic.launcher.tokiz.common - -import bums.lunatic.launcher.R - - -typealias PairArray = Array> -val colorz : PairArray> = arrayOf>>( - Pair("color set 01",arrayOf("#E1F5FE", "#263238")), - Pair("color set 02",arrayOf("#F0F4C3", "#37474F")), - Pair("color set 03",arrayOf("#ECEFF1", "#455A64")), - Pair("color set 04",arrayOf("#E0F7FA", "#263238")), - Pair("color set 05",arrayOf("#F5F5F5", "#263238")), - Pair("color set 06",arrayOf("#ECEFF1", "#263238")), - Pair("color set 07",arrayOf("#F8BBD0", "#263238")), - Pair("color set 08",arrayOf("#E6EE9C", "#455A64")), - Pair("color set 09",arrayOf("#CFD8DC", "#455A64")), - Pair("color set 10",arrayOf("#FFF59D", "#37474F")), - Pair("color set 21",arrayOf("#263238","#E1F5FE")), - Pair("color set 22",arrayOf("#37474F","#F0F4C3")), - Pair("color set 23",arrayOf("#455A64","#ECEFF1")), - Pair("color set 24",arrayOf("#263238","#E0F7FA")), - Pair("color set 25",arrayOf("#263238","#F5F5F5")), - Pair("color set 26",arrayOf("#263238","#ECEFF1")), - Pair("color set 27",arrayOf("#263238","#F8BBD0")), - Pair("color set 28",arrayOf("#455A64","#E6EE9C")), - Pair("color set 29",arrayOf("#455A64","#CFD8DC")), - Pair("color set 30",arrayOf("#37474F","#FFF59D")), - Pair("color set 31",arrayOf("#FFFFFF","#1C1B1B")), - Pair("color set 32",arrayOf("#272727","#FFFFFF")), - Pair("color set 33",arrayOf("#1C1B1B","#FFFFFF")), - Pair("color set 34",arrayOf("#FFFFFF","#272727")) -) -val typesfacez : PairArray = arrayOf>( - Pair("정선 아리랑 혼", R.font.jsarirang_hon), - Pair("정선 아리랑 뿌리", R.font.jsarirang_ppuri), - Pair("정선 동강 레귤러", R.font.jsdongkang_regular), - Pair("손기정체", R.font.kcc_sonkeechung), - Pair("교보 손글씨", R.font.kyobo_handwriting_2021sjy), - Pair("태백 은하수", R.font.taebaek_milkyway), - Pair("taebaek_milkyway",R.font.taebaek_milkyway), - Pair("kccahnjunggeun",R.font.kccahnjunggeun), - Pair("kotra_songeulssi",R.font.kotra_songeulssi), - Pair("kotra_bold",R.font.kotra_bold), - Pair("cafe24oneprettynight",R.font.cafe24oneprettynight), - Pair("nnsgc_wsjidyp",R.font.nnsgc_wsjidyp), - Pair("nnsgc_yjc",R.font.nnsgc_yjc), - Pair("nnsgc_brhp",R.font.nnsgc_brhp), - Pair("nnsgc_md",R.font.nnsgc_md), - Pair("nnsgc_gd_an_gd",R.font.nnsgc_gd_an_gd), - Pair("dovemayo",R.font.dovemayo), - Pair("gabia_solmee",R.font.gabia_solmee), - Pair("ylee_mortal_heart_immortal_memory",R.font.ylee_mortal_heart_immortal_memory), - Pair("kcc_kimhoon",R.font.kcc_kimhoon), - Pair("taefont_tsthlml",R.font.taefont_tsthlml), - Pair("ssshinb7",R.font.ssshinb7), - Pair("godomaum",R.font.godomaum), - Pair("tvn_jguiyg_medium",R.font.tvn_jguiyg_medium), - Pair("tvn_jguiyg_light",R.font.tvn_jguiyg_light), - Pair("on_jsuhr",R.font.on_jsuhr), - Pair("on_jsuhl",R.font.on_jsuhl), - Pair("on_ychyuhr",R.font.on_ychyuhr), - Pair("on_ychyuhl",R.font.on_ychyuhl), - Pair("on_treeususimgul_r",R.font.on_treeususimgul_r), - Pair("on_treeususimgul",R.font.on_treeususimgul), - Pair("on_wibsr",R.font.on_wibsr), - Pair("on_wisbl",R.font.on_wisbl), - Pair("on_sbsjl",R.font.on_sbsjl), - Pair("on_sbsjr",R.font.on_sbsjr), - Pair("wandohoper",R.font.wandohoper), - Pair("ebs_r",R.font.ebs_r), -) - -@JvmName("getIndexAny") -fun PairArray.getIndex(key : String) = getIndex(this, key) -fun getIndex(collection : PairArray, key : String) : Int { - var index = 0 - var returns = 0 - for (item in collection) { - if(item.first.equals(key)) { - returns = index - } - index = index.inc() - } - return returns -} -enum class TouchArea { - Left,Center,Right, DoubleLeft, DoubleRight -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/common/PrefManager.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/common/PrefManager.kt deleted file mode 100644 index 9bbd3233..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/common/PrefManager.kt +++ /dev/null @@ -1,29 +0,0 @@ -package bums.lunatic.launcher.tokiz.common - -import android.content.Context -import android.content.SharedPreferences -import bums.lunatic.launcher.utils.Blog - -object PrefManager { - private val mainName = "Main_Pref_" - private val domainKey = "Last_Domain_" - private lateinit var main : SharedPreferences - fun init(context: Context) { - main = context.getSharedPreferences(mainName,Context.MODE_PRIVATE) - } - - fun save(key : String, value : String?) { - main.edit().putString(key,value).apply() - } - fun load(key : String) : String? { - return main.getString(key, "") - } - -// fun getLastDomain() : String { -// return main.getString(domainKey, BooktokiStruct.getLastedDoamin()) ?: BooktokiStruct.getLastedDoamin() -// } - fun putLastDomain(domain : String) { - Blog.LOGE("domain >>> ${domain}") - main.edit().putString(domainKey,domain).apply() - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/HistoryManager.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/HistoryManager.kt deleted file mode 100644 index 9669ecf1..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/HistoryManager.kt +++ /dev/null @@ -1,189 +0,0 @@ -package bums.lunatic.launcher.tokiz.data - -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.workers.WorkersDb -import io.realm.kotlin.Realm -import io.realm.kotlin.UpdatePolicy - -object HistoryManager { - - - val openRealm : Realm = WorkersDb.getRealm() - - fun save(lastInfo: LastInfo) { - openRealm.apply{ - this.writeBlocking { - copyToRealm(lastInfo, UpdatePolicy.ALL) - } - } - } - - fun save(historyItem: HistoryItem) { - openRealm.apply{ - this.writeBlocking { - copyToRealm(historyItem, UpdatePolicy.ALL) - } - } - } - - fun requestLastInfo(callback : (LastInfo)->Unit) { - openRealm.apply{ - - } - } - - fun save(config : ReaderConfig) { - openRealm.apply{ - this.writeBlocking { - copyToRealm(config,UpdatePolicy.ALL) - } - } - } - - fun getBookInfos(contentsType : String,aUrl : String, callback : (ContentsCollection?)->Unit) { - var url : String = aUrl - Blog.LOGE("aUrl >>> ${aUrl} , contentsType ${contentsType}") - openRealm.apply{ - if (url.startsWith("//")) { - while (url.startsWith("//")) { - url = url.replace("//","/").trim() - } - } - Blog.LOGE("aUrl >>> ${url}") - var contentsPageInfo = this.query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0 || bookPageUrl == $0","${url}").find() - if (contentsPageInfo != null && contentsPageInfo.count() > 0) { - Blog.LOGE("get ${contentsPageInfo}" ) - var pgs = this.query(ContentsCollection::class,"bookPageUrl == $0", contentsPageInfo.first().bookPageUrl).find() - if (pgs.size > 0) { - pgs.first().let { - Blog.LOGE("get ${it} , ${it?.pages}") - callback.invoke(this.copyFromRealm(it)) - } - } else { - callback.invoke(null) - } - } else { - callback.invoke(null) - } - } - } - - fun getBookPageInfo(contentsType : String, aUrl : String, callback : (ContentsPageInfo?)->Unit) { - var url : String = aUrl - openRealm.apply{ - if (url.startsWith("//")) { - while (url.startsWith("//")) { - url = url.replace("//","/").trim() - } - } - var result = this.query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0","${url}").find() - if (result.size > 0) { - var bookPageInfo = result?.first() - if (bookPageInfo != null) { - callback.invoke(bookPageInfo) - } else { - callback.invoke(null) - } - } else { - callback.invoke(null) - } - } - } - - fun setBookPageInfo(contentsType : String,aUrl : String, page :Int) { - var url : String = aUrl - openRealm.writeBlocking { - if (url.startsWith("//")) { - while (url.startsWith("//")) { - url = url.replace("//","/").trim() - } - } - var result = this.query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0","${url}").find() - if (result.size > 0) { - var bookPageInfo = result?.first() - if (bookPageInfo != null) { - bookPageInfo.lastPage = page - } - } - } - } - - fun getBooPageInfoContentsSave(contentsType : String,aUrl : String, contents : String) { - var url : String = if (aUrl.startsWith("//") || aUrl.startsWith("///") || aUrl.startsWith("////")) { - aUrl.replace("////","/").replace("///","/").replace("//","/") - } else aUrl - openRealm.writeBlocking { - Blog.LOGE("getBooPageInfoContentsSave ${url}") - val result = query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0", "${url}").find() - if (result.size > 0) { - result.first().contents = contents - copyToRealm(result.first(), UpdatePolicy.ALL) - } - } - } - - - - - fun getNextPage(contentsType : String,aUrl : String ,callback : (ContentsPageInfo?)->Unit) { - var url : String = aUrl - openRealm.apply{ - if (url.startsWith("//")) { - while (url.startsWith("//")) { - url = url.replace("//","/").trim() - } - } - var contentsPageInfo = - this.query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0", url).find() - if (contentsPageInfo.size > 0) { - Blog.LOGE("getNextPage 2 => chapterNum : ${contentsPageInfo.first().chapterNum} , bookPageInfo.bookPageUrl : ${contentsPageInfo.first().bookPageUrl}" ) - var results = this.query(ContentsPageInfo::class).query("chapterNum == $0",contentsPageInfo.first().chapterNum + 1).query("bookPageUrl == $0","${contentsPageInfo.first().bookPageUrl}").find() - if(results.size > 0) { - results.first().let { - Blog.LOGE("getNextPage 2 nextBook pathUrl : ${it.pathUrl}" ) - callback.invoke(it) - } - } else {callback.invoke(null)} - } else {callback.invoke(null)} - } - } - - - fun getPrevPage(contentsType : String,aUrl : String ,callback : (ContentsPageInfo?)->Unit) { - var url : String = aUrl - openRealm.apply{ - Blog.LOGE("getPrevPage ${url}" ) - if (url.startsWith("//")) { - while (url.startsWith("//")) { - url = url.replace("//","/").trim() - } - } - Blog.LOGE("getPrevPage ${url}" ) - var contentsPageInfo = - this.query(ContentsPageInfo::class).query("contentsType == $0", contentsType).query("pathUrl == $0", url).find() - Blog.LOGE("getPrevPage ${contentsPageInfo}" ) - if (contentsPageInfo.size > 0) { - Blog.LOGE("getPrevPage 2 ${contentsPageInfo?.first()?.chapterNum}" ) - Blog.LOGE("getPrevPage 2 ${contentsPageInfo?.first()?.bookPageUrl}" ) - var results = this.query(ContentsPageInfo::class).query("chapterNum == $0",contentsPageInfo.first().chapterNum - 1).query("bookPageUrl == $0","${contentsPageInfo.first().bookPageUrl}").find() - if(results.size > 0) { - results.first()?.let { - Blog.LOGE("getPrevPage 2 ${it.bookPageUrl}" ) - Blog.LOGE("getPrevPage 2 ${it.pathUrl}" ) - callback.invoke(it) - } - } else { - callback.invoke(null) - } - } else { - callback.invoke(null) - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/ContentsPageInfo.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/ContentsPageInfo.kt deleted file mode 100644 index b8b19344..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/ContentsPageInfo.kt +++ /dev/null @@ -1,143 +0,0 @@ -package bums.lunatic.launcher.tokiz.data.model - -import bums.lunatic.launcher.model.RssData -import io.realm.kotlin.ext.realmListOf -import io.realm.kotlin.types.RealmList -import io.realm.kotlin.types.RealmObject -import io.realm.kotlin.types.annotations.PrimaryKey - -class PortMessage { - var type : String? = "" - var bookInfos : PageInfosJ? = null - var book : BookContents? = null - var msg : String? = null - var contents : String? = null - var privates : ArrayList? = null - var currentPage : String? = null - var cookies : String? = null - var urls : List = emptyList() - var imgSrc: String? = null - var base64Data: String? = null -} -class BookContents { - var chapterTitle : String? = null - var bookContents : String? = null -} - -class PageInfosJ { - var bookTitle : String = "" - var bookPageUrl : String = "" - var contentsType : String? = "" - var pages : ArrayList = arrayListOf() - - fun getTitleArray() : ArrayList { - var arrayList = ArrayList() - pages.forEach { arrayList.add(it.bookTitle ?: "") } - return arrayList - } - - fun getR() : ContentsCollection{ - var r = ContentsCollection() - r.bookTitle = this.bookTitle - r.bookPageUrl = this.bookPageUrl - r.contentsType = this.contentsType - return r - } -} - -class PageInfoJ { - var chapterID : Int = 0 - var contents : String? = "" - var bookPageUrl : String? = "" - var chapterTitle : String? = "" - var bookTitle : String? = "" - var chapterNum : Int = 0 - var lastPage : Int? = 0 - var pathUrl : String? = "" - var contentsType : String? = "" - - fun getRealm() : ContentsPageInfo { - var r = ContentsPageInfo() - r.chapterID = this.chapterID - r.contents = this.contents - r.bookPageUrl = this.bookPageUrl ?: "" - r.chapterTitle = this.chapterTitle - r.bookTitle = this.bookTitle ?: "" - r.chapterNum = this.chapterNum - r.lastPage = this.lastPage - r.pathUrl = this.pathUrl?.replace("'","") - r.contentsType = this.contentsType - return r - } -} - - -class ContentsCollection : RealmObject { - - var bookTitle : String = "" - - @PrimaryKey - var bookPageUrl : String? = "" - var pages : RealmList = realmListOf() - var contentsType : String? = "" - - fun getTitleArray() : ArrayList { - var arrayList = ArrayList() - pages.forEach { - arrayList.add(it.getTitleItem())} - return arrayList - } - - fun sort() { - val comparator : Comparator = compareBy { it.chapterID } - pages.sortWith(comparator) - } - - fun hasItem(item: ContentsPageInfo) : Boolean { - var hasItem = false - for (c in pages) { - if (!hasItem) { - hasItem = c.pathUrl.equals(item.pathUrl) - } - } - return hasItem - } - - -} -class ContentsPageInfo : RealmObject { - - var chapterID : Int = 0 - var contents : String? = "" - - var bookPageUrl : String? = "" - var chapterTitle : String? = "" - var bookTitle : String? = "" - var chapterNum : Int = 0 - var lastPage : Int? = 0 - var contentsType : String? = "" - - fun isValidBook() = (pathUrl?.length ?: 0) > 1 - - @PrimaryKey - var pathUrl : String? = "" - - fun getTitleItem() : String { - var result = StringBuilder() - result.append(if ((contents?.length ?: 0) > 10) { - "S:[0] " - } else { - "[X] " - }) - - result.append(chapterTitle?: "") - - result.append(if ((lastPage ?: 0) > 0) { - " [0] " - } else { - " [X] " - }) - - return result.toString() - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/FakeSession.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/FakeSession.kt deleted file mode 100644 index c258f391..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/FakeSession.kt +++ /dev/null @@ -1,47 +0,0 @@ -package bums.lunatic.launcher.tokiz.data.model -class FakeSessions : ArrayList{ - constructor(initialCapacity: Int) : super(initialCapacity) - constructor() : super() - constructor(c: MutableCollection) : super(c) -} -data class FakeSession (val scrolldata: ScrollData, val history: History ) -data class ScrollData( - val scroll: String, - val zoom: Zoom -) - -data class Zoom( - val resolution: Int, - val displaySize: DisplaySize -) - -data class DisplaySize( - val height: Int, - val width: Int -) - -data class History( - val entries: List, - val requestedIndex: Int, - val fromIdx: Int, - val index: Int -) - -data class HistoryEntry( - val persist: Boolean, - val cacheKey: Int, - val ID: Int, - val url: String, - val title: String, - val loadReplace: Boolean, - val docIdentifier: Long, - val loadReplace2: Boolean, - val partitionedPrincipalToInherit_base64: Map>, - val triggeringPrincipal_base64: Map>, - val principalToInherit_base64: Map>, - val resultPrincipalURI: String, - val hasUserInteraction: Boolean, - val originalURI: String, - val docshellUUID: String -) - diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/PageInfo.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/PageInfo.kt deleted file mode 100644 index cfd8f9ef..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/PageInfo.kt +++ /dev/null @@ -1,70 +0,0 @@ -package bums.lunatic.launcher.tokiz.data.model - -import android.content.pm.ActivityInfo -import io.realm.kotlin.types.RealmObject -import io.realm.kotlin.types.annotations.PrimaryKey -import java.text.SimpleDateFormat -import java.util.Date - - -class LastInfo : RealmObject { - @PrimaryKey - var _id : String = "" - var pageUrl : String = "" - var title : String = "" - var chapter : Int = 0 - var pageIndex : Int = 0 - var contentsName : String = "" - var contentsType : String? = "" - set(value) { - _id = value ?: "" - field = value - } - var displayOrientation : Int = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - - fun makeHistoryItem() : HistoryItem = HistoryItem().apply { - title = this@LastInfo.title - pageUrl = this@LastInfo.pageUrl - chapter = this@LastInfo.chapter - pageIndex = this@LastInfo.pageIndex - contentsName = this@LastInfo.contentsName - displayOrientation = this@LastInfo.displayOrientation - contentsType = this@LastInfo.contentsType - } -} -class HistoryItem : RealmObject { - @PrimaryKey - var title : String = "" - var pageUrl : String = "" - var chapter : Int = 0 - var pageIndex : Int = 0 - var contentsName : String = "" - var displayOrientation : Int = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - var contentsType : String? = "" - - fun makeLastInfo() = LastInfo().apply{ - _id = "UniqLastId" - title = this@HistoryItem.title - pageUrl = this@HistoryItem.pageUrl - chapter = this@HistoryItem.chapter - pageIndex = this@HistoryItem.pageIndex - contentsName = this@HistoryItem.contentsName - displayOrientation = this@HistoryItem.displayOrientation - contentsType = this@HistoryItem.contentsType - } - fun putHistory(contentsPageInfo: ContentsPageInfo?, currentPath : String) : HistoryItem { - title = contentsPageInfo?.bookTitle ?: SimpleDateFormat("YY-mm-DD-HH:mm").format(Date()) - pageUrl = contentsPageInfo?.pathUrl ?: currentPath - chapter = contentsPageInfo?.chapterNum ?: 0 - pageIndex = contentsPageInfo?.lastPage ?: 0 - contentsName = contentsPageInfo?.chapterTitle ?: "" - contentsType = contentsPageInfo?.contentsType ?: "" - return this - } -} -class Bookmark() : RealmObject { - @PrimaryKey - var pageUrl : String = "" -} - - diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/ReaderConfig.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/ReaderConfig.kt deleted file mode 100644 index 61dbe841..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/data/model/ReaderConfig.kt +++ /dev/null @@ -1,17 +0,0 @@ -package bums.lunatic.launcher.tokiz.data.model - -import io.realm.kotlin.types.RealmObject -import io.realm.kotlin.types.annotations.PrimaryKey - -class ReaderConfig : RealmObject { - @PrimaryKey - var id : String? = "ReaderConfig" - var textSize : Int? = 14 - var textColor : String? = "#FFFFFF" - var bgColor : String? = "#000000" - var style : Int? = 0 - var lineSpace : Int? = 1 - var letterSpace : Int? = 1 - var font : String? = "" - var padding : Int? = 5 -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/DefaultList.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/DefaultList.kt deleted file mode 100644 index 0a7f9674..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/DefaultList.kt +++ /dev/null @@ -1,55 +0,0 @@ -package bums.lunatic.launcher.tokiz.dialog - -import android.R -import android.content.Context -import android.content.DialogInterface -import android.widget.ArrayAdapter -import androidx.appcompat.app.AlertDialog -import bums.lunatic.launcher.tokiz.data.model.ContentsPageInfo - -object DefaultList { - fun showDefaultList(context: Context, title : String, items : Collection, firstPosition : Int, choosedTitle : (Int)->String, chooedPositive : (Int)->Unit, saveCalback : (Int)->Unit ) { - val builderSingle: AlertDialog.Builder = AlertDialog.Builder(context) - builderSingle.setTitle(title) - val arrayAdapter = - ArrayAdapter(context, R.layout.select_dialog_singlechoice) - for (item in items) { - arrayAdapter.add(item.getTitleItem()) - } - builderSingle.setNeutralButton("전체 저장") { dialog, which -> - saveCalback.invoke(-1) - dialog.dismiss() - } - builderSingle.setNegativeButton("닫기", - DialogInterface.OnClickListener { dialog, which -> - dialog.dismiss() }) - builderSingle.setAdapter(arrayAdapter, - DialogInterface.OnClickListener { dialog, position -> - val strName = arrayAdapter.getItem(position) - val builderInner: AlertDialog.Builder = AlertDialog.Builder(context) - builderInner.setMessage(strName) - builderInner.setTitle(choosedTitle.invoke(position)) - builderInner.setNegativeButton("닫기") { dialog, which -> - - } -// builderInner.setNeutralButton("자동 저장") { dialog, which -> -// saveCalback.invoke(position) -// } - builderInner.setPositiveButton("이동"){ dialog, which -> - chooedPositive.invoke(position) - dialog.dismiss() - } - builderInner.show().apply { - DialogManager.add(this) - } - }) - builderSingle.create()?.apply{ - setOnShowListener { d-> - (d as? AlertDialog)?.let{ - it.listView?.setSelection(firstPosition) - } - } - DialogManager.add(this) - }?.show() - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/DialogManager.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/DialogManager.kt deleted file mode 100644 index 898ac18b..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/DialogManager.kt +++ /dev/null @@ -1,17 +0,0 @@ -package bums.lunatic.launcher.tokiz.dialog - -import androidx.activity.ComponentDialog - -object DialogManager { - val dialogs = arrayListOf() - fun add(item : ComponentDialog) = dialogs.add(item) - fun closeAll() { - for (dialog in dialogs) { - try { - dialog?.dismiss() - } catch(e : Exception) { - - } - } - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/Stylez.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/Stylez.kt deleted file mode 100644 index ba1de9e9..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/dialog/Stylez.kt +++ /dev/null @@ -1,97 +0,0 @@ -package bums.lunatic.launcher.tokiz.dialog//package com.mime.dualscreenview.dialog -// -//import android.app.Dialog -//import android.content.Context -//import android.content.DialogInterface -//import android.graphics.Color -//import android.os.Bundle -//import android.view.LayoutInflater -//import android.view.View -//import android.view.ViewGroup -//import android.view.Window -//import android.widget.TextView -//import androidx.recyclerview.widget.GridLayoutManager -//import androidx.recyclerview.widget.RecyclerView -//import com.mime.dualscreenview.R -//import kotlin.random.Random -// -//interface StyleSelectInterface { -// fun onSelectStyle(bgColor : String, textColor : String) -//} -//class Stylez : Dialog { -// constructor(context: Context) : super(context) {initView(context)} -// constructor(context: Context, themeResId: Int) : super(context, themeResId) {initView(context)} -// constructor( -// context: Context, -// cancelable: Boolean, -// cancelListener: DialogInterface.OnCancelListener? -// ) : super(context, cancelable, cancelListener) {initView(context)} -// -// var styleSelectInterface : StyleSelectInterface? = null -// -// fun initView(context: Context) { -// -// } -// -// override fun onCreate(savedInstanceState: Bundle?) { -// super.onCreate(savedInstanceState) -// this.requestWindowFeature(Window.FEATURE_NO_TITLE); -// setCancelable(true) -// setContentView(R.layout.dialog_stylesz) -// val recyclerView: RecyclerView = findViewById(R.id.stylez_recyclerview) -// val adapterRe = AdapterRe(context, colorz) -// recyclerView.adapter = adapterRe -// recyclerView.layoutManager = -// GridLayoutManager(context, 2, GridLayoutManager.VERTICAL, false) -// } -// -// inner class AdapterRe(ctx: Context, myImageNameList: Array>) : -// RecyclerView.Adapter() { -// private val inflater: LayoutInflater -// private val myImageNameList: Array> -// private val ctx : Context -// init { -// inflater = LayoutInflater.from(ctx) -// this.ctx = ctx -// this.myImageNameList = myImageNameList -// } -// -// override fun onCreateViewHolder ( -// parent: ViewGroup, -// viewType: Int -// ): StylezViewHolder { -// val view: View = inflater.inflate(R.layout.item_colorz, parent, false) -// return StylezViewHolder(view) -// } -// -// override fun onBindViewHolder(holder: StylezViewHolder, position: Int) { -// var colorz = myImageNameList.get(position) -// var sampleTextz = ctx.resources.getStringArray(R.array.sample_textz) -// holder?.setStyle(bgColor = colorz.get(1), textColor = colorz.get(0),sampleTextz.get(Random.nextInt(9876) % sampleTextz.size)) -// } -// -// -// override fun getItemCount(): Int { -// return myImageNameList.size -// } -// -// } -// -// inner class StylezViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { -// var textView: TextView -// var bg : View -// init { -// textView = itemView.findViewById(R.id.textview_sample) -// bg = itemView.findViewById(R.id.bg_sample) -// } -// fun setStyle(bgColor : String, textColor : String, sampleText : String ) { -// bg.setBackgroundColor(Color.parseColor(bgColor)) -// textView.setTextColor(Color.parseColor(textColor)) -// textView.text = sampleText -// itemView?.setOnClickListener { v -> -// styleSelectInterface?.onSelectStyle(bgColor,textColor) -// dismiss() -// } -// } -// } -//} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextGenerateInterface.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextGenerateInterface.kt deleted file mode 100644 index a3849bc3..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextGenerateInterface.kt +++ /dev/null @@ -1,5 +0,0 @@ -package bums.lunatic.launcher.tokiz.view - -interface PagedTextGenerateInterface { - fun completePagination(pageList: ArrayList) -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextLayout.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextLayout.kt index b434fe80..f33da79a 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextLayout.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextLayout.kt @@ -6,16 +6,280 @@ import android.graphics.Color import android.graphics.Typeface import android.os.Build import android.os.Handler +import android.text.Layout +import android.text.StaticLayout import android.util.AttributeSet +import android.util.TypedValue import android.view.View import android.widget.TextView +import android.widget.TextView.BufferType +import androidx.appcompat.widget.AppCompatTextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.Guideline import bums.lunatic.launcher.R -import bums.lunatic.launcher.tokiz.common.TouchArea +import bums.lunatic.launcher.tokiz.TouchArea import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.SimpleFingerGestures +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch +import kotlin.math.min + +interface PagedTextViewInterface { + fun onTouch(touchArea: TouchArea) + fun onTimeoverTouch() + fun onSwipeLeft(touchCount : Int) + fun onSwipeRight(touchCount : Int) + fun onSwipeDown(touchCount : Int) + fun onSwipeUp(touchCount : Int) + fun onLongClick() +} +class PagedTextView : AppCompatTextView { + + private var needPaginate = false + private var isPaginating = false + private val pageList = arrayListOf() + private var pageIndex: Int = 0 + private var pageHeight: Int = 0 + private var originalText: CharSequence = "" + + var mPagedTextGenerateInterface : PagedTextGenerateInterface? = null + + + constructor(context: Context?) : super(context!!){initView(context)} + + constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs){initView(context)} + + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context!!, attrs, defStyleAttr){initView(context)} + + fun initView(context: Context?){ + + } + + + + + + fun size(): Int = pageList.size + fun current() : Int = pageIndex + + fun doPrev() { + if (pageIndex > 0 ) + pageIndex = pageIndex - 1 + setPageText() + } + + fun doNext() { + if (pageIndex < pageList.size) + pageIndex = pageIndex + 1 + setPageText() + } + + fun next(index: Int) { + pageIndex = index + setPageText() + } + + private fun setPageText() { + if(pageList.size > 0) { + isPaginating = true + text = pageList[pageIndex] + isPaginating = false + } + } + + fun setTxtF(text: CharSequence?) { + needPaginate = true + this.setText(text , null) + } + + override fun setText(text: CharSequence?, type: BufferType?) { + if (!isPaginating) { + needPaginate = true + originalText = text ?: "" + } + super.setText(text, type) + } + + + + override fun setTextSize(size: Float) { + setTextSize(TypedValue.COMPLEX_UNIT_SP, size) + } + + override fun setTextSize(unit: Int, size: Float) { + super.setTextSize(unit, size) + paint.textSize = TypedValue.applyDimension(unit, size, context.resources.getDisplayMetrics()) + needPaginate = true + } + + override fun setPadding(left: Int, top: Int, right: Int, bottom: Int) { + super.setPadding(left, top, right, bottom) + needPaginate = true + } + + override fun setPaddingRelative(start: Int, top: Int, end: Int, bottom: Int) { + super.setPaddingRelative(start, top, end, bottom) + needPaginate = true + } + + override fun setTextScaleX(size: Float) { + if (size != textScaleX) { + needPaginate = true + } + super.setTextScaleX(size) + } + + override fun setTypeface(tf: Typeface?) { + if (typeface != null && tf != typeface) { + needPaginate = true + paint.typeface = tf + } + super.setTypeface(tf) + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + override fun setLetterSpacing(letterSpacing: Float) { + if (letterSpacing != this.letterSpacing) { + needPaginate = true + } + super.setLetterSpacing(letterSpacing) + } + + override fun setHorizontallyScrolling(whether: Boolean) { + super.setHorizontallyScrolling(false) + } + + override fun setLineSpacing(add: Float, mult: Float) { + if (add != lineSpacingExtra || mult != lineSpacingMultiplier) { + needPaginate = true + } + super.setLineSpacing(add, mult) + } + + override fun setMaxLines(maxLines: Int) { + if (maxLines != this.maxLines) { + needPaginate = true + } + + super.setMaxLines(maxLines) + } + + override fun setLines(lines: Int) { + super.setLines(lines) + + if (lines != this.lineCount) { + needPaginate = true + } + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + pageHeight = h - (paddingTop + paddingBottom) // 마진 제외 + } + + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + Blog.LOGD(log = "onLayout>> ${this::class.java.name} changed >> ${changed}") + if (changed || needPaginate) { + paginate() + setPageText() + needPaginate = false + } + + } + fun doUpdate() { + if (needPaginate && layout != null) { + paginate() + setPageText() + needPaginate = false + } + } + private fun paginate() { + if (layout != null) { + MainScope().launch { + pageList.clear() +// Blog.LOGD(log = "paginate>> ${this::class.java.name} && ${layout.text}") + val layout = from(layout) + val lines = if(min(maxLines, layout.lineCount) > 10) {min(maxLines, layout.lineCount) - 1} else {min(maxLines, layout.lineCount)} + var startOffset = 0 + val heightWithoutPaddings = pageHeight //- (marginTop + marginBottom + paddingTop + paddingBottom) + var height = heightWithoutPaddings + + for (i in 0 until lines) { + if (height < layout.getLineBottom(i)) { + pageList.add( + layout.text.subSequence(startOffset, layout.getLineStart(i)) + ) + startOffset = layout.getLineStart(i) + height = layout.getLineTop(i) + heightWithoutPaddings + } + + if (i == lines - 1) { + pageList.add( + if(layout.lineCount > i) { + layout.text.subSequence(startOffset, layout.getLineEnd(i + 1)) + } else { + layout.text.subSequence(startOffset, layout.getLineEnd(i)) + } + ) + + } + } + mPagedTextGenerateInterface?.completePagination(pageList) + } + } + } + + private fun from(layout: Layout): Layout = + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + @Suppress("DEPRECATION") + StaticLayout( + originalText, + paint, + layout.width - paddingLeft - paddingRight, // margin 제외 + layout.alignment, + lineSpacingMultiplier, + lineSpacingExtra, + includeFontPadding + ) + } else { + StaticLayout.Builder + .obtain( + originalText, 0, originalText.length, paint, + (layout.width - paddingLeft - paddingRight) + ) + .setAlignment(layout.alignment) + .setLineSpacing(lineSpacingExtra, lineSpacingMultiplier) + .setIncludePad(includeFontPadding) + .setUseLineSpacingFromFallbacks() + .setBreakStrategy(breakStrategy) + .setHyphenationFrequency(hyphenationFrequency) + .setMaxLines(maxLines) + .build() + } + + private fun StaticLayout.Builder.setUseLineSpacingFromFallbacks(): StaticLayout.Builder { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + this.setUseLineSpacingFromFallbacks(isFallbackLineSpacing) + } + + return this + } + + private fun StaticLayout.Builder.setJustificationMode(): StaticLayout.Builder { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + this.setJustificationMode(justificationMode) + } + + return this + } + +} + +interface PagedTextGenerateInterface { + fun completePagination(pageList: ArrayList) +} class PagedTextLayout : ConstraintLayout , PagedTextGenerateInterface { constructor(context: Context) : super(context) {initView(context)} constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {initView(context)} diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextView.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextView.kt deleted file mode 100644 index 2f825a68..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextView.kt +++ /dev/null @@ -1,259 +0,0 @@ -package bums.lunatic.launcher.tokiz.view - -import android.annotation.TargetApi -import android.content.Context -import android.graphics.Typeface -import android.os.Build -import android.text.Layout -import android.text.StaticLayout -import android.util.AttributeSet -import android.util.TypedValue -import androidx.appcompat.widget.AppCompatTextView -import bums.lunatic.launcher.utils.Blog -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.launch -import kotlin.math.min - - -class PagedTextView : AppCompatTextView { - - private var needPaginate = false - private var isPaginating = false - private val pageList = arrayListOf() - private var pageIndex: Int = 0 - private var pageHeight: Int = 0 - private var originalText: CharSequence = "" - - var mPagedTextGenerateInterface : PagedTextGenerateInterface? = null - - - constructor(context: Context?) : super(context!!){initView(context)} - - constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs){initView(context)} - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context!!, attrs, defStyleAttr){initView(context)} - - fun initView(context: Context?){ - - } - - - - - - fun size(): Int = pageList.size - fun current() : Int = pageIndex - - fun doPrev() { - if (pageIndex > 0 ) - pageIndex = pageIndex - 1 - setPageText() - } - - fun doNext() { - if (pageIndex < pageList.size) - pageIndex = pageIndex + 1 - setPageText() - } - - fun next(index: Int) { - pageIndex = index - setPageText() - } - - private fun setPageText() { - if(pageList.size > 0) { - isPaginating = true - text = pageList[pageIndex] - isPaginating = false - } - } - - fun setTxtF(text: CharSequence?) { - needPaginate = true - this.setText(text , null) - } - - override fun setText(text: CharSequence?, type: BufferType?) { - if (!isPaginating) { - needPaginate = true - originalText = text ?: "" - } - super.setText(text, type) - } - - - - override fun setTextSize(size: Float) { - setTextSize(TypedValue.COMPLEX_UNIT_SP, size) - } - - override fun setTextSize(unit: Int, size: Float) { - super.setTextSize(unit, size) - paint.textSize = TypedValue.applyDimension(unit, size, context.resources.getDisplayMetrics()) - needPaginate = true - } - - override fun setPadding(left: Int, top: Int, right: Int, bottom: Int) { - super.setPadding(left, top, right, bottom) - needPaginate = true - } - - override fun setPaddingRelative(start: Int, top: Int, end: Int, bottom: Int) { - super.setPaddingRelative(start, top, end, bottom) - needPaginate = true - } - - override fun setTextScaleX(size: Float) { - if (size != textScaleX) { - needPaginate = true - } - super.setTextScaleX(size) - } - - override fun setTypeface(tf: Typeface?) { - if (typeface != null && tf != typeface) { - needPaginate = true - paint.typeface = tf - } - super.setTypeface(tf) - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - override fun setLetterSpacing(letterSpacing: Float) { - if (letterSpacing != this.letterSpacing) { - needPaginate = true - } - super.setLetterSpacing(letterSpacing) - } - - override fun setHorizontallyScrolling(whether: Boolean) { - super.setHorizontallyScrolling(false) - } - - override fun setLineSpacing(add: Float, mult: Float) { - if (add != lineSpacingExtra || mult != lineSpacingMultiplier) { - needPaginate = true - } - super.setLineSpacing(add, mult) - } - - override fun setMaxLines(maxLines: Int) { - if (maxLines != this.maxLines) { - needPaginate = true - } - - super.setMaxLines(maxLines) - } - - override fun setLines(lines: Int) { - super.setLines(lines) - - if (lines != this.lineCount) { - needPaginate = true - } - } - - override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { - super.onSizeChanged(w, h, oldw, oldh) - pageHeight = h - (paddingTop + paddingBottom) // 마진 제외 - } - - override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { - super.onLayout(changed, left, top, right, bottom) - Blog.LOGD(log = "onLayout>> ${this::class.java.name} changed >> ${changed}") - if (changed || needPaginate) { - paginate() - setPageText() - needPaginate = false - } - - } - fun doUpdate() { - if (needPaginate && layout != null) { - paginate() - setPageText() - needPaginate = false - } - } - private fun paginate() { - if (layout != null) { - MainScope().launch { - pageList.clear() -// Blog.LOGD(log = "paginate>> ${this::class.java.name} && ${layout.text}") - val layout = from(layout) - val lines = if(min(maxLines, layout.lineCount) > 10) {min(maxLines, layout.lineCount) - 1} else {min(maxLines, layout.lineCount)} - var startOffset = 0 - val heightWithoutPaddings = pageHeight //- (marginTop + marginBottom + paddingTop + paddingBottom) - var height = heightWithoutPaddings - - for (i in 0 until lines) { - if (height < layout.getLineBottom(i)) { - pageList.add( - layout.text.subSequence(startOffset, layout.getLineStart(i)) - ) - startOffset = layout.getLineStart(i) - height = layout.getLineTop(i) + heightWithoutPaddings - } - - if (i == lines - 1) { - pageList.add( - if(layout.lineCount > i) { - layout.text.subSequence(startOffset, layout.getLineEnd(i + 1)) - } else { - layout.text.subSequence(startOffset, layout.getLineEnd(i)) - } - ) - - } - } - mPagedTextGenerateInterface?.completePagination(pageList) - } - } - } - - private fun from(layout: Layout): Layout = - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - @Suppress("DEPRECATION") - StaticLayout( - originalText, - paint, - layout.width - paddingLeft - paddingRight, // margin 제외 - layout.alignment, - lineSpacingMultiplier, - lineSpacingExtra, - includeFontPadding - ) - } else { - StaticLayout.Builder - .obtain( - originalText, 0, originalText.length, paint, - (layout.width - paddingLeft - paddingRight) - ) - .setAlignment(layout.alignment) - .setLineSpacing(lineSpacingExtra, lineSpacingMultiplier) - .setIncludePad(includeFontPadding) - .setUseLineSpacingFromFallbacks() - .setBreakStrategy(breakStrategy) - .setHyphenationFrequency(hyphenationFrequency) - .setMaxLines(maxLines) - .build() - } - - private fun StaticLayout.Builder.setUseLineSpacingFromFallbacks(): StaticLayout.Builder { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - this.setUseLineSpacingFromFallbacks(isFallbackLineSpacing) - } - - return this - } - - private fun StaticLayout.Builder.setJustificationMode(): StaticLayout.Builder { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - this.setJustificationMode(justificationMode) - } - - return this - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextViewInterface.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextViewInterface.kt deleted file mode 100644 index acc56181..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/PagedTextViewInterface.kt +++ /dev/null @@ -1,13 +0,0 @@ -package bums.lunatic.launcher.tokiz.view - -import bums.lunatic.launcher.tokiz.common.TouchArea - -interface PagedTextViewInterface { - fun onTouch(touchArea: TouchArea) - fun onTimeoverTouch() - fun onSwipeLeft(touchCount : Int) - fun onSwipeRight(touchCount : Int) - fun onSwipeDown(touchCount : Int) - fun onSwipeUp(touchCount : Int) - fun onLongClick() -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/ScopeEditor.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/ScopeEditor.kt deleted file mode 100644 index 473a54de..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/ScopeEditor.kt +++ /dev/null @@ -1,61 +0,0 @@ -package bums.lunatic.launcher.tokiz.view - -import android.content.Context -import android.util.AttributeSet - -class ScopeEditor: SideButtonTextView { - constructor(context: Context) : super(context) - constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) - var titleArray : Array? = null - set(value) { - if(value != null && value.size < 1) { - Error("titleArray는 최소 한개 이상이여야됨.") - return - } - field = value - maxValue = field!!.size - } - - var maxValue : Int = 1 - set(value) { - if (value < 1) { - Error("maxValue는 무조건 0보다 커야하눈뎅....") - return - } - field = value - } - - override var value : Int = 14 - set(newValue) { - field = newValue - text_value?.text = displayFormat.format(titleArray?.get(field) ?:"defulat") - mValueChange?.invoke(field) - } - - - constructor( - context: Context, - attrs: AttributeSet?, - defStyleAttr: Int, - defStyleRes: Int - ) : super(context, attrs, defStyleAttr, defStyleRes) - - - - init { -// super.i -// inflate(context, R.layout.layout_steps_editor,this) - btn_decrement?.setOnClickListener { value = Math.abs(value.dec()).rem(maxValue) } - btn_increment?.setOnClickListener { value = value.inc().rem(maxValue) } - leftButtonTitle = "<" - rightButtonTitle = ">" - } - - - -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/SideButtonTextView.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/SideButtonTextView.kt index a5ef91d3..2490b18a 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/SideButtonTextView.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/SideButtonTextView.kt @@ -6,6 +6,7 @@ import android.widget.TextView import androidx.appcompat.widget.AppCompatButton import androidx.constraintlayout.widget.ConstraintLayout import bums.lunatic.launcher.R +typealias ValueChange = (Int)->Unit open class SideButtonTextView : ConstraintLayout { constructor(context: Context) : super(context) @@ -72,4 +73,84 @@ open class SideButtonTextView : ConstraintLayout { btn_decrement?.setOnClickListener { value = value.dec() } btn_increment?.setOnClickListener { value = value.inc() } } +} +class ScopeEditor: SideButtonTextView { + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) + var titleArray : Array? = null + set(value) { + if(value != null && value.size < 1) { + Error("titleArray는 최소 한개 이상이여야됨.") + return + } + field = value + maxValue = field!!.size + } + + var maxValue : Int = 1 + set(value) { + if (value < 1) { + Error("maxValue는 무조건 0보다 커야하눈뎅....") + return + } + field = value + } + + override var value : Int = 14 + set(newValue) { + field = newValue + text_value?.text = displayFormat.format(titleArray?.get(field) ?:"defulat") + mValueChange?.invoke(field) + } + + + constructor( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int, + defStyleRes: Int + ) : super(context, attrs, defStyleAttr, defStyleRes) + + + + init { +// super.i +// inflate(context, R.layout.layout_steps_editor,this) + btn_decrement?.setOnClickListener { value = Math.abs(value.dec()).rem(maxValue) } + btn_increment?.setOnClickListener { value = value.inc().rem(maxValue) } + leftButtonTitle = "<" + rightButtonTitle = ">" + } + + + +} +class StepsEditor : SideButtonTextView { + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) + + constructor( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int, + defStyleRes: Int + ) : super(context, attrs, defStyleAttr, defStyleRes) + + init { +// inflate(context, R.layout.layout_steps_editor,this) + btn_decrement?.setOnClickListener { value = value.dec() } + btn_increment?.setOnClickListener { value = value.inc() } + leftButtonTitle = "-" + rightButtonTitle = "+" + } } \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/StepsEditor.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/StepsEditor.kt deleted file mode 100644 index 03ab88fc..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/view/StepsEditor.kt +++ /dev/null @@ -1,31 +0,0 @@ -package bums.lunatic.launcher.tokiz.view - -import android.content.Context -import android.util.AttributeSet - -typealias ValueChange = (Int)->Unit - -class StepsEditor : SideButtonTextView { - constructor(context: Context) : super(context) - constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) - - constructor( - context: Context, - attrs: AttributeSet?, - defStyleAttr: Int, - defStyleRes: Int - ) : super(context, attrs, defStyleAttr, defStyleRes) - - init { -// inflate(context, R.layout.layout_steps_editor,this) - btn_decrement?.setOnClickListener { value = value.dec() } - btn_increment?.setOnClickListener { value = value.inc() } - leftButtonTitle = "-" - rightButtonTitle = "+" - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/BWebviewClient.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/BWebviewClient.kt deleted file mode 100644 index a3bc825f..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/BWebviewClient.kt +++ /dev/null @@ -1,226 +0,0 @@ -package bums.lunatic.launcher.tokiz.webcontents//package com.mime.dualscreenview.webcontents -// -//import android.annotation.SuppressLint -//import android.content.Context -//import android.graphics.Bitmap -//import android.net.http.SslError -//import android.os.Build -//import android.util.Log -//import android.webkit.SslErrorHandler -//import android.webkit.WebResourceRequest -//import android.webkit.WebResourceResponse -//import android.webkit.WebView -//import android.webkit.WebViewClient -//import androidx.core.net.toUri -//import com.mime.dualscreenview.common.Blog -//import com.mime.dualscreenview.common.PrefManager -//import com.mime.dualscreenview.data.model.LastInfo -// -//import okhttp3.ConnectionPool -//import okhttp3.Headers -//import okhttp3.Headers.Companion.toHeaders -//import okhttp3.Interceptor -//import okhttp3.MediaType.Companion.toMediaTypeOrNull -//import okhttp3.OkHttpClient -//import okhttp3.Request -//import okhttp3.RequestBody -//import okhttp3.Response -// -//import java.io.IOException -//import java.net.SocketException -//import java.util.concurrent.TimeUnit -// -// -//class BWebviewClient -// ( -// private val mainControllInterface : MainControllInterface, -// private val context: Context, ) : WebViewClient() { -// -// var currentContentsProvider : BaseWebContents? = null -// // OkHttp 클라이언트 (싱글톤 권장) -// private val httpClient by lazy { -// OkHttpClient.Builder() -// .retryOnConnectionFailure(true) -// .connectionPool(ConnectionPool(5, 30, TimeUnit.SECONDS)) -// .pingInterval(20, TimeUnit.SECONDS) -// .addInterceptor(RetryInterceptor(maxRetries = 3)) -// .build() -// } -// -// override fun shouldInterceptRequest( -// view: WebView?, -// request: WebResourceRequest? -// ): WebResourceResponse? { -// request ?: return null -// -// // HTTPS/HTTP 요청만 처리 -// if (request.url.scheme !in listOf("http", "https")) { -// return super.shouldInterceptRequest(view, request) -// } -// -// if (request.method != "GET" || -// request.url.scheme !in listOf("http", "https")) { -// return super.shouldInterceptRequest(view, request) -// } -// -// // 웹뷰 요청을 OkHttp로 변환 -// return try { -// val okHttpRequest = Request.Builder() -// .url(request.url.toString()) -// .headers(request.requestHeaders.toHeaders()) -// .get() // GET 요청으로 고정 -// .build() -// -// val response = httpClient.newCall(okHttpRequest).execute() -// createWebResourceResponse(response) -// -// } catch (e: SocketException) { -// // Connection reset 오류 처리 -// Log.e("WebViewClient", "SocketException: ${e.message}") -// null // WebView 기본 동작 사용 -// } catch (e: IOException) { -// null // 오류 시 WebView 기본 동작 -// } -// } -// -//// private fun getRequestBody(request: WebResourceRequest): RequestBody? { -//// // POST 요청 바디 처리 (API 21+) -//// return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && -//// request.method == "POST" && -//// request.requestBody != null) { -//// -//// val body = request.requestBody!! -//// RequestBody.create( -//// body.mimeType?.toMediaTypeOrNull(), -//// body.inputStream.readBytes() -//// ) -//// } else { -//// null -//// } -//// } -// -// private fun createWebResourceResponse(response: Response): WebResourceResponse { -// return WebResourceResponse( -// response.body?.contentType()?.type + "/" + response.body?.contentType()?.subtype, -// response.body?.contentType()?.charset()?.name(), -// response.code, -// response.message, -// response.headers.toMultimap().mapValues { it.value.joinToString(",") }, -// response.body?.byteStream() -// ) -// } -// -// // Connection reset 재시도 인터셉터 -// inner class RetryInterceptor( -// private val maxRetries: Int -// ) : Interceptor { -// override fun intercept(chain: Interceptor.Chain): Response { -// var response: Response? = null -// var retryCount = 0 -// var lastException: Exception? = null -// -// while (retryCount <= maxRetries) { -// try { -// response = chain.proceed(chain.request()) -// if (response.isSuccessful) return response -// } catch (e: SocketException) { -// lastException = e -// if (e.message?.contains("Connection reset") == true) { -// Thread.sleep(1000L * (retryCount + 1)) -// } else throw e -// } catch (e: IOException) { -// lastException = e -// } -// retryCount++ -// } -// throw lastException ?: IOException("Max retries reached") -// } -// } -// -// -// override fun shouldOverrideUrlLoading( -// view: WebView?, -// request: WebResourceRequest? -// ): Boolean { -// Log.e("shouldOverrideUrlLoading", " >>>> ${request?.url?.toString()} ") -// return super.shouldOverrideUrlLoading(view, request) -// } -// -// -// override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { -// super.onPageStarted(view, url, favicon) -// mainControllInterface?.onStartLoad() -// } -// -// @SuppressLint("WebViewClientOnReceivedSslError") -// override fun onReceivedSslError( -// view: WebView?, -// handler: SslErrorHandler?, -// error: SslError? -// ) { -//// super.onReceivedSslError(view, handler, error) -// Blog.LOGE(log= "onReceivedSslError >> ${error}") -// handler?.proceed() -// } -// override fun onReceivedHttpError( -// view: WebView?, -// request: WebResourceRequest?, -// errorResponse: WebResourceResponse? -// ) { -// Blog.LOGE(log= "onReceivedHttpError >> ${errorResponse?.reasonPhrase}") -// -// super.onReceivedHttpError(view, request, errorResponse) -// } -// -// -// override fun onPageFinished(view: WebView?, url: String?) { -// super.onPageFinished(view, url) -// finishedUrl = url ?: "" -// -// view?.let { -// url?.toUri()?.let { -// PrefManager.putLastDomain(it.scheme.plus("::/").plus(it.host)) -// } -// -// if(url?.contains("/list/") ?: false && url?.contains("agit") ?: false){ -// findListItem { -// Blog.LOGE("onPageFinished", url ?: "") -// } -// } else if (url?.contains("booktoki") ?: false){ -//// findListItem { -//// Blog.LOGE("onPageFinished", url ?: "") -//// } -// } -// view?.postDelayed({ -// if (url?.contains("booktoki") ?: false){ -// findListItem { -// Blog.LOGE("onPageFinished", url ?: "") -// } -// } -//// view?.evaluateJavascript( -//// "function getAll() {\n" + -//// " MyJavaScriptInterface.sendValueFromHtml(document.getElementsByTagName('html')[0].innerHTML)" + -//// " };getAll()" -//// ) { result -> -//// (result as? String)?.let { -//// -//// } -//// } -// -// }, 500L) -// currentContentsProvider?.doOnloaded(it , { result -> -// result?.let { mainControllInterface.onLoadedContents(it) } -// } , { complete -> -// if(complete) { -// mainControllInterface?.completePageLoad(LastInfo().apply { -// this.pageUrl = url?.toUri()?.path ?: currentContentsProvider?.getLastedDoamin() ?: "" -// this.contentsName = currentContentsProvider?.getWebcontentsName() ?: "" -// this.pageIndex = 0 -// }) -// } -// }) -// -// } -// } -// -//} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/BaseWebContentsViewer.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/BaseWebContentsViewer.kt deleted file mode 100644 index 264fbd43..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/BaseWebContentsViewer.kt +++ /dev/null @@ -1,416 +0,0 @@ -package bums.lunatic.launcher.tokiz.webcontents - -import org.jsoup.select.Elements - - -//open class BaseWebContentsViewer { -// -//// var currentContentsProvider : BaseWebContents? = null -//// lateinit var webview : BWebview -// lateinit var webview: BWebview -// lateinit var mainControllInterface : MainControllInterface -//// -//// @JavascriptInterface -//// fun onBookInfo(jsonData : String) { -//// GlobalScope.launch { -//// try { -//// Blog.LOGE("BaseWebContentsViewer",jsonData) -//// val data: JSONObject = JSONObject(jsonData) -//// Blog.LOGE("BaseWebContentsViewer",data.toString()) -//// mainControllInterface?.onBookInfos(jsonData) -//// } catch (e : Exception) { -//// -//// } -//// } -//// } -// -// fun getDeviceIpAddress(): String? { -// try { -// val en = NetworkInterface.getNetworkInterfaces() -// while (en.hasMoreElements()) { -// val intf = en.nextElement() -// val enumIpAddr = intf.inetAddresses -// while (enumIpAddr.hasMoreElements()) { -// val inetAddress = enumIpAddr.nextElement() -// if (!inetAddress.isLoopbackAddress && inetAddress is Inet4Address) { -// return inetAddress.getHostAddress() -// } -// } -// } -// } catch (ex: SocketException) { -// ex.printStackTrace() -// } -// return null -// } -// -// constructor(geckoView: BWebview, mainControllInterface : MainControllInterface ) { -//// val wifiManager = webview.context.getSystemService(Context.WIFI_SERVICE) as WifiManager -//// wifiManager.disconnect() -//// Thread.sleep(1000) // 잠시 대기 -//// wifiManager.reconnect() -// -// this.webview = geckoView -//// this.mainControllInterface = mainControllInterface -// -// } -//// -////// @SuppressLint("JavascriptInterface", "SetJavaScriptEnabled") -////// constructor(webview : BWebview, mainControllInterface : MainControllInterface ) { -//////// val wifiManager = webview.context.getSystemService(Context.WIFI_SERVICE) as WifiManager -//////// wifiManager.disconnect() -//////// Thread.sleep(1000) // 잠시 대기 -//////// wifiManager.reconnect() -////// -////// this.webview = webview -////// this.mainControllInterface = mainControllInterface -////// //137.0.0.0 -////// webview.clearHistory(); -////// webview.clearSslPreferences(); -////// WebView.setWebContentsDebuggingEnabled(true) -////// webview.clearCache(true) // 디스크와 메모리 캐시 모두 삭제 -////// -////// val cookieManager = CookieManager.getInstance() -////// cookieManager.removeAllCookies(null) // 모든 쿠키 삭제 -////// cookieManager.flush() -//////// webview.settings.userAgentString = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" -//////// webview.settings.userAgentString ="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" -//////// webview.settings.userAgentString ="Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36" -////// webview.webChromeClient = rootWebChromeClient -////// webview.webViewClient = rootWebViewClient -////// webview.settings.textZoom = 100 -////// webview.addJavascriptInterface(this,"PAgit") -////// webview.settings.javaScriptEnabled = true -////// webview.settings.javaScriptCanOpenWindowsAutomatically = false -////// webview.settings.loadWithOverviewMode = true -////// webview.settings.setPluginState(WebSettings.PluginState.ON) -////// webview.settings.domStorageEnabled = true -////// webview.settings.allowContentAccess = true -////// webview.settings.mixedContentMode = 0 -////// -////// webview.getSettings().setJavaScriptEnabled(true) -//////// webview.loadUrl(stringExtra) -//////// webview.setWebViewClient(WebViewClientClass()) -////// webview.setScrollBarStyle(0) -////// webview.settings.safeBrowsingEnabled = false -////// webview.settings.loadsImagesAutomatically = true -////// webview.getSettings().setCacheMode(-1) -////// webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(false) -////// webview.getSettings().setLoadsImagesAutomatically(true) -////// webview.getSettings().setUseWideViewPort(true) -////// webview.getSettings().setDomStorageEnabled(true) -////// webview.getSettings().setAllowFileAccess(true) -////// -////// webview.getSettings() -////// .setUserAgentString("Mozilla/5.0 (Linux; Android 6.0; Android SDK built for x86 Build/MASTER; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.119 Mobile Safari/537.36") -////// webview.settings.userAgentString = "Mozilla/5.0 (Linux; Android 6.0; Android SDK built for x86 Build/MASTER; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.119 Mobile Safari/537.36" -////// webview.getSettings().setSupportZoom(true) -////// webview.getSettings().setBuiltInZoomControls(true) -////// webview.getSettings().setDisplayZoomControls(false) -////// val settings: WebSettings = webview.getSettings() -////// settings.javaScriptEnabled = true -////// settings.javaScriptCanOpenWindowsAutomatically = false -////// settings.setSupportMultipleWindows(false) -////// webview.clearCache(true); -////// -////// -////// -////// -////// try { -////// val settings: WebSettings =webview.getSettings() -//////// 네트워크 및 기능 관련 -////// settings.javaScriptEnabled = true // 자바스크립트 활성화 -////// settings.javaScriptCanOpenWindowsAutomatically = true // JS로 새창 열기 허용 -////// settings.loadsImagesAutomatically = true // 이미지 자동 로드 -////// settings.domStorageEnabled = true // DOM Storage 활성화 -////// settings.databaseEnabled = true // DB 저장소 활성화 -//////// settings.app -//////// settings.setAppCacheEnabled(true) // 앱 캐시 활성화 (deprecated, 참고용) -////// settings.allowFileAccess = true // 파일 접근 허용 -////// settings.allowContentAccess = true // 컨텐츠 접근 허용 -////// settings.allowFileAccessFromFileURLs = true // file://에서 file:// 접근 허용 -////// settings.allowUniversalAccessFromFileURLs = true // file://에서 모든 도메인 접근 허용 -////// settings.setSupportMultipleWindows(true) // 멀티 윈도우 지원 -////// settings.useWideViewPort = true // 뷰포트 확대 지원 -////// settings.loadWithOverviewMode = true // 화면에 맞게 컨텐츠 축소 -////// settings.setSupportZoom(true) // 줌 지원 -////// settings.builtInZoomControls = true // 기본 줌 컨트롤 활성화 -////// settings.displayZoomControls = false // 줌 컨트롤 UI 숨김 -////// -////// -//////// 보안 및 고급 -////// settings.mixedContentMode = -////// WebSettings.MIXED_CONTENT_ALWAYS_ALLOW // HTTP/HTTPS 혼합 콘텐츠 허용 -////// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { -////// settings.safeBrowsingEnabled = true // Safe Browsing 활성화 -////// } -////// settings.mediaPlaybackRequiresUserGesture = false // 미디어 자동재생 허용 -////// -////// -//////// 기타 -////// settings.cacheMode = WebSettings.LOAD_NO_CACHE // 기본 캐시 모드 -//////// settings.setGeolocationEnabled(true) // 위치 정보 허용 -////// webview.removeJavascriptInterface("MyJavaScriptInterface") -////// }catch (e :Exception){e.printStackTrace()} -////// webview.addJavascriptInterface( BookHelper(),"MyJavaScriptInterface") -////// } -//// -//// constructor() -//// -//// fun loadContents(url: String) { -//// webview.loadUrl(url) -//// } -//// -//// val rootWebChromeClient = object : WebChromeClient() { -//// override fun onProgressChanged(view: WebView?, newProgress: Int) { -//// super.onProgressChanged(view, newProgress) -//// } -//// -//// override fun onJsAlert( -//// view: WebView?, -//// url: String?, -//// message: String?, -//// result: JsResult? -//// ): Boolean { -//// Blog.LOGE("message") -//// result?.cancel() -//// return super.onJsAlert(view, url, message, result) -//// } -//// -//// override fun onJsPrompt( -//// view: WebView?, -//// url: String?, -//// message: String?, -//// defaultValue: String?, -//// result: JsPromptResult? -//// ): Boolean { -//// Blog.LOGE("message") -//// result?.cancel() -//// return super.onJsPrompt(view, url, message, defaultValue, result) -//// } -//// -//// override fun onJsConfirm( -//// view: WebView?, -//// url: String?, -//// message: String?, -//// result: JsResult? -//// ): Boolean { -//// Blog.LOGE("message") -//// result?.cancel() -//// return super.onJsConfirm(view, url, message, result) -//// } -//// } -//// -//// fun findListItem(callBakItems : DidFindContents) { -////// currentContentsProvider?.findListItem(webview,callBakItems) -//// } -//// -// fun loadLastInfo(lastInfo: LastInfo) { -// lastInfo?.let { last -> -// if (last.pageUrl.startsWith("https://")) { -// webview.loadUrl(last.pageUrl) -// } else { -// try { -// webview.loadUrl(PrefManager.getLastDomain().plus(last.pageUrl)) -// } catch (e : Exception) { -// webview.loadUrl(PrefManager.getLastDomain()) -// } -// } -// } -// } -//// -//// val rootWebViewClient = object : WebViewClient() { -//// override fun shouldOverrideUrlLoading( -//// view: WebView?, -//// request: WebResourceRequest? -//// ): Boolean { -//// Log.e("shouldOverrideUrlLoading", " >>>> ${request?.url?.toString()} ") -//// return super.shouldOverrideUrlLoading(view, request) -//// } -//// override fun shouldInterceptRequest( -//// view: WebView?, -//// request: WebResourceRequest? -//// ): WebResourceResponse? { -//// Log.e("shouldInterceptRequest", " >>>> ${request?.url?.toString()} , ${request?.url?.toString()?.contains("gif")}") -//// -////// if(request?.url?.toString()?.contains("gif") ?: false) { -////// return WebResourceResponse("text/javascript", "UTF-8", null); -////// } -////// if(request?.url?.toString()?.contains(currentContentsProvider?.acccceptResourceKeyword() ?: "") == false && request?.url?.toString()?.contains(currentContentsProvider?.getLastedDoamin() ?: "") == false) { -////// return WebResourceResponse("text/javascript", "UTF-8", null); -////// } -//// return super.shouldInterceptRequest(view, request) -//// } -//// -//// override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { -//// super.onPageStarted(view, url, favicon) -//// mainControllInterface?.onStartLoad() -//// try { -//// handler.removeCallbacks(reloadPostHandle) -//// }catch (e : Exception) { -//// -//// } -//// } -//// -////// @SuppressLint("WebViewClientOnReceivedSslError") -//// override fun onReceivedSslError( -//// view: WebView?, -//// handler: SslErrorHandler?, -//// error: SslError? -//// ) { -////// super.onReceivedSslError(view, handler, error) -//// Blog.LOGE(log= "onReceivedSslError >> ${error}") -//// handler?.cancel() -//// -//// } -//// -//// val maxRetryCount = 10; -//// var webView : WebView? = null -//// var reloadPostHandle = Runnable { -//// webView?.reload() -//// BWebview.currentRetryCount += 1 -//// webView?.context?.let { -//// Toast.makeText(it,"retry reload currnent : ${BWebview.currentRetryCount}", Toast.LENGTH_SHORT).show() -//// } -//// } -//// override fun onReceivedError( -//// view: WebView?, -//// request: WebResourceRequest?, -//// error: WebResourceError? -//// ) { -//// super.onReceivedError(view, request, error) -//// handler.removeCallbacks(reloadPostHandle) -//// if ((error!!.errorCode == ERROR_CONNECT || error!!.errorCode == ERROR_TIMEOUT) && BWebview.currentRetryCount < maxRetryCount) { -//// webView = view -//// -//// handler.postDelayed(reloadPostHandle,5000) -//// } else { -//// view?.context?.let { -//// Toast.makeText(it,"fail load cause: ${error.description} : ${error.errorCode}", Toast.LENGTH_SHORT).show() -//// } -//// } -//// } -//// -//// val handler : Handler = Handler(Looper.getMainLooper()) -////// override fun onReceivedHttpError( -////// view: WebView?, -////// request: WebResourceRequest?, -////// errorResponse: WebResourceResponse? -////// ) { -////// Blog.LOGE(log= "onReceivedHttpError >> ${errorResponse?.reasonPhrase}") -////// -////// -////// } -//// -//// -//// override fun onPageFinished(view: WebView?, url: String?) { -//// super.onPageFinished(view, url) -//// finishedUrl = url ?: "" -//// -//// view?.let { -//// url?.toUri()?.let { -//// PrefManager.putLastDomain(it.scheme.plus("::/").plus(it.host)) -//// } -//// -//// if(url?.contains("/list/") ?: false && url?.contains("agit") ?: false){ -//// findListItem { -//// Blog.LOGE("onPageFinished", url ?: "") -//// } -//// } else if (url?.contains("booktoki") ?: false){ -////// findListItem { -////// Blog.LOGE("onPageFinished", url ?: "") -////// } -//// } -//// view?.postDelayed({ -//// if (url?.contains("booktoki") ?: false){ -//// findListItem { -//// Blog.LOGE("onPageFinished", url ?: "") -//// } -//// } -////// view?.evaluateJavascript( -////// "function getAll() {\n" + -////// " MyJavaScriptInterface.sendValueFromHtml(document.getElementsByTagName('html')[0].innerHTML)" + -////// " };getAll()" -////// ) { result -> -////// (result as? String)?.let { -////// -////// } -////// } -//// -//// }, 500L) -//// currentContentsProvider?.doOnloaded(it , { result -> -//// result?.let { mainControllInterface.onLoadedContents(it) } -//// } , { complete -> -//// if(complete) { -//// mainControllInterface?.completePageLoad(LastInfo().apply { -//// this.pageUrl = url?.toUri()?.path ?: currentContentsProvider?.getLastedDoamin() ?: "" -//// this.contentsName = currentContentsProvider?.getWebcontentsName() ?: "" -//// this.pageIndex = 0 -//// }) -//// } -//// }) -//// -//// } -//// } -//// } -//// var finishedUrl : String = "" -//// inner class BookHelper { -//// @JavascriptInterface -//// fun sendValueFromHtml(string: String) { -//// -//// Jsoup.parse(string)?.let { html -> -//// -//// val toon_intro = html.getElementById("toon_intro") -//// val view_padding = html.getElementsByClass("view-padding") -//// if (toon_intro != null) { -////// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: ${html.title()}") -//// val bookPageInfos = BookPageInfos() -//// bookPageInfos.bookPageUrl = Uri.parse(finishedUrl).path -//// bookPageInfos.bookTitle = if (toon_intro.getElementsByTag("h3").size > 0) toon_intro.getElementsByTag("h3").get(0).text() else "" -//// bookPageInfos.pages = realmListOf() -////// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: bookPageInfos >>>> ${Gson().toJson(bookPageInfos)}") -//// val listParent = html.getElementById("list_type") -//// if (listParent != null) { -//// listParent.getElementsByClass("row").forEach { bookitem -> -////// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: bookItemInfo ${bookitem}") -//// try { -//// val bookPageInfo = BookPageInfo() -//// bookPageInfo.bookTitle = bookPageInfos.bookTitle -//// bookPageInfo.chapterNum = bookitem.getElementsByClass("cell_num").getT().toInt() -//// bookPageInfo.chapterID = bookitem.getElementsByClass("cell_num").getT().toInt() -//// bookPageInfo.chapterTitle = bookitem.getElementsByTag("a").getT() -//// bookPageInfo.bookPageUrl = bookPageInfos.bookPageUrl -//// val href = bookitem.getElementsByTag("a").get(0).attr("href") -//// bookPageInfo.pathUrl = Uri.parse(href).path -//// bookPageInfos.pages.add(bookPageInfo) -//// }catch (nfe : NumberFormatException) { -//// nfe.printStackTrace() -//// } -//// }.apply { -//// -//// HistoryManager.openRealm.writeBlocking { -//// copyToRealm(bookPageInfos, UpdatePolicy.ALL) -////// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: bookPageInfos saved >>>> ${bookPageInfos.bookPageUrl}") -//// } -//// mainControllInterface.onBookInfos(bookPageInfos) -//// } -//// } -//// }else if (view_padding.size > 0){ -////// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: ${html.title()}") -//// val contents = view_padding.get(0).children().html().replace("

"," ").replace("

","\n\n") -////// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: view_padding.get(0)\n${contents}") -//// if (contents.length > 20) { -//// Uri.parse(finishedUrl).path?.let { -//// HistoryManager.getBooPageInfoContentsSave(it, contents) -//// mainControllInterface.onLoadedContents(contents) -//// } -//// } -//// } else { -//// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: ${html.title()}") -//// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: whole body ${html}") -//// } -//// } -//// } -//// } -//} - -fun Elements.getT() = if (size > 0) get(0).text() else "" \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/DefineTypes.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/DefineTypes.kt deleted file mode 100644 index 9951351d..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/DefineTypes.kt +++ /dev/null @@ -1,5 +0,0 @@ -package bums.lunatic.launcher.tokiz.webcontents//package bums.lunatic.launcher.booktoki.webcontents -// -//typealias ActionByBool = (Boolean) -> Unit -//typealias DidFindContents = (String?) -> Unit -//typealias GotoSomeWhere = () -> Unit diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/MainControllInterface.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/MainControllInterface.kt deleted file mode 100644 index ad6e8346..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/MainControllInterface.kt +++ /dev/null @@ -1,22 +0,0 @@ -package bums.lunatic.launcher.tokiz.webcontents//package bums.lunatic.launcher.booktoki.webcontents -// -//import com.mime.dualscreenview.data.model.BookPageInfos -//import com.mime.dualscreenview.data.model.LastInfo -//import com.mime.dualscreenview.webcontents.contentsinfo.GotoSomeWhere -// -//interface MainControllInterface { -// fun onStartLoad() -// fun completePageLoad(apply: LastInfo) -// -// fun showNextBtn(finnd : Boolean, onClickAction: GotoSomeWhere) -// fun showPrevBtn(finnd : Boolean,onClickAction: GotoSomeWhere) -// -// fun showAlert(alert :String) -// -// fun onLoadedContents(contents :String) -// fun onFindTitle(contents :String) -// -// fun onBookInfos(jsonString : String) -// fun onBookInfos(infos : BookPageInfos) -// -//} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/WebContentsManger.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/WebContentsManger.kt deleted file mode 100644 index e9af7dc1..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/WebContentsManger.kt +++ /dev/null @@ -1,20 +0,0 @@ -package bums.lunatic.launcher.tokiz.webcontents//package bums.lunatic.launcher.booktoki.webcontents -// -//import com.mime.dualscreenview.webcontents.contentsinfo.Agit -//import com.mime.dualscreenview.webcontents.contentsinfo.Booktoki -//import com.mime.dualscreenview.webcontents.contentsinfo.NewtokiOne -// -//object WebContentsManger { -// val allContentsList : ArrayList = arrayListOf(Booktoki) -// -// fun getBaseWebContentsBy(name : String) : BaseWebContents { -// var correctContents : BaseWebContents = Booktoki -// for (contents in allContentsList) { -// if(name.equals(contents.getWebcontentsName())) { -// correctContents = contents -// break -// } -// } -// return correctContents -// } -//} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/BaseWebContents.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/BaseWebContents.kt deleted file mode 100644 index fed214f1..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/BaseWebContents.kt +++ /dev/null @@ -1,5 +0,0 @@ -package bums.lunatic.launcher.tokiz.webcontents.contentsinfo - -abstract class BaseWebContents : ContentsInfoInterface { - open var lastNumber : Int = 221 -} diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/BooktokiStruct.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/BooktokiStruct.kt deleted file mode 100644 index fad8f96d..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/BooktokiStruct.kt +++ /dev/null @@ -1,16 +0,0 @@ -//package bums.lunatic.launcher.tokiz.webcontents.contentsinfo -// -// -//object BooktokiStruct : BaseWebContents() { -// -// override var lastNumber : Int = 468 -// -// override fun getWebcontentsName(): String { -// return "Booktoki" -// } -// -// override fun getLastedDoamin(): String { -// return String.format("https://booktoki%d.com", lastNumber) -// } -// -//} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/ContentsInfoInterface.kt b/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/ContentsInfoInterface.kt deleted file mode 100644 index e30e96ae..00000000 --- a/app/src/main/kotlin/bums/lunatic/launcher/tokiz/webcontents/contentsinfo/ContentsInfoInterface.kt +++ /dev/null @@ -1,20 +0,0 @@ -package bums.lunatic.launcher.tokiz.webcontents.contentsinfo - - - -typealias ActionByBool = (Boolean) -> Unit -typealias DidFindContents = (String?) -> Unit -typealias GotoSomeWhere = () -> Unit - -interface ContentsInfoInterface { - fun getWebcontentsName() : String -// fun getNextButtonJs() : String -// fun getPrevButtonJs() : String -// fun getTitleJs() : String -// fun getFindContentsJs() : String -// fun checkCorrectContents(contents: String) : String - fun getLastedDoamin() : String -// fun onLoadedJs() : String -// fun acccceptResourceKeyword() : String -// fun getContentsList() : String -} \ No newline at end of file diff --git a/app/src/main/kotlin/bums/lunatic/launcher/workers/WorkersDb.kt b/app/src/main/kotlin/bums/lunatic/launcher/workers/WorkersDb.kt index 5d1d0cf3..1b2a8937 100644 --- a/app/src/main/kotlin/bums/lunatic/launcher/workers/WorkersDb.kt +++ b/app/src/main/kotlin/bums/lunatic/launcher/workers/WorkersDb.kt @@ -25,11 +25,11 @@ import bums.lunatic.launcher.model.TelegramData import bums.lunatic.launcher.model.TelegramFrom import bums.lunatic.launcher.model.TelegramMessage 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.tokiz.ContentsCollection +import bums.lunatic.launcher.tokiz.ContentsPageInfo +import bums.lunatic.launcher.tokiz.HistoryItem +import bums.lunatic.launcher.tokiz.LastInfo +import bums.lunatic.launcher.tokiz.ReaderConfig import bums.lunatic.launcher.utils.Blog import bums.lunatic.launcher.utils.JamoUtils import bums.lunatic.launcher.utils.afterDay diff --git a/app/src/main/res/drawable/progress_bar_double_circle.xml b/app/src/main/res/drawable/progress_bar_double_circle.xml new file mode 100644 index 00000000..28f601ed --- /dev/null +++ b/app/src/main/res/drawable/progress_bar_double_circle.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_bookmark_image.xml b/app/src/main/res/layout/item_bookmark_image.xml index b7d228ed..9b18b621 100644 --- a/app/src/main/res/layout/item_bookmark_image.xml +++ b/app/src/main/res/layout/item_bookmark_image.xml @@ -1,8 +1,24 @@ - \ No newline at end of file + android:layout_marginBottom="8dp"> + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/launcher_activity.xml b/app/src/main/res/layout/launcher_activity.xml index 4471b012..007e2502 100644 --- a/app/src/main/res/layout/launcher_activity.xml +++ b/app/src/main/res/layout/launcher_activity.xml @@ -129,21 +129,14 @@ android:layout_width="wrap_content" android:layout_height="20dp"/> - +