..
This commit is contained in:
@@ -838,10 +838,13 @@ open class LauncherActivity : CommonActivity() {
|
||||
// }
|
||||
|
||||
|
||||
try {
|
||||
val widgets = WorkersDb.getRealm().query<WidgetData>().find()
|
||||
widgets.forEach { widgetData ->
|
||||
createWidget(null, widgetData)
|
||||
}
|
||||
}catch (e : Exception) {
|
||||
|
||||
val widgets = WorkersDb.getRealm().query<WidgetData>().find()
|
||||
widgets.forEach { widgetData ->
|
||||
createWidget(null, widgetData)
|
||||
}
|
||||
}
|
||||
lateinit var scaleDetector: android.view.ScaleGestureDetector
|
||||
|
||||
@@ -499,6 +499,29 @@ class CompletedFilesFragment : Fragment() {
|
||||
FileViewMode.GRID_SMALL -> "apps"
|
||||
}
|
||||
}
|
||||
|
||||
private fun saveFolderSortSetting(folderPath: String, sortType: FileSortType, isDesc: Boolean) {
|
||||
val prefs = requireContext().getSharedPreferences("FolderSortPrefs", Context.MODE_PRIVATE)
|
||||
prefs.edit()
|
||||
.putString("${folderPath}_sort", sortType.name)
|
||||
.putBoolean("${folderPath}_desc", isDesc)
|
||||
.apply()
|
||||
}
|
||||
|
||||
// 💡 폴더별로 저장된 정렬 방식 불러오기 (기본값은 최신순 / 내림차순)
|
||||
private fun loadFolderSortSetting(folderPath: String) {
|
||||
val prefs = requireContext().getSharedPreferences("FolderSortPrefs", Context.MODE_PRIVATE)
|
||||
|
||||
val savedSortName = prefs.getString("${folderPath}_sort", FileSortType.LAST_USED.name)
|
||||
currentSort = try {
|
||||
FileSortType.valueOf(savedSortName ?: FileSortType.LAST_USED.name)
|
||||
} catch (e: Exception) {
|
||||
FileSortType.LAST_USED
|
||||
}
|
||||
|
||||
isDescending = prefs.getBoolean("${folderPath}_desc", true)
|
||||
}
|
||||
|
||||
val MAX_COUNT = 9
|
||||
private fun setupControls(view: View) {
|
||||
val layoutTitleDefault = view.findViewById<View>(R.id.layoutTitleDefault)
|
||||
@@ -660,6 +683,7 @@ class CompletedFilesFragment : Fragment() {
|
||||
spinnerSort.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
||||
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, position: Int, p3: Long) {
|
||||
currentSort = FileSortType.values()[position]
|
||||
saveFolderSortSetting(currentDir.absolutePath, currentSort, isDescending)
|
||||
applyFilterAndSort()
|
||||
}
|
||||
override fun onNothingSelected(p0: AdapterView<*>?) {}
|
||||
@@ -669,6 +693,7 @@ class CompletedFilesFragment : Fragment() {
|
||||
tvSortOrder.setOnClickListener {
|
||||
isDescending = !isDescending
|
||||
tvSortOrder.text = if (isDescending) "arrow_downward" else "arrow_upward"
|
||||
saveFolderSortSetting(currentDir.absolutePath, currentSort, isDescending)
|
||||
applyFilterAndSort()
|
||||
}
|
||||
}
|
||||
@@ -954,6 +979,20 @@ class CompletedFilesFragment : Fragment() {
|
||||
private fun loadFiles() {
|
||||
allFiles = if (currentDir.exists()) currentDir.listFiles()?.toList() ?: emptyList() else emptyList()
|
||||
backPressedCallback.isEnabled = isSelectionMode || currentDir.absolutePath != rootDir.absolutePath
|
||||
|
||||
// 💡 1. 현재 진입한 폴더의 정렬 설정을 로드합니다.
|
||||
loadFolderSortSetting(currentDir.absolutePath)
|
||||
|
||||
// 💡 2. 불러온 설정에 맞게 UI 컴포넌트(스피너, 화살표) 상태를 동기화합니다.
|
||||
view?.let { root ->
|
||||
val spinnerSort = root.findViewById<Spinner>(R.id.spinnerSort)
|
||||
val tvSortOrder = root.findViewById<TextView>(R.id.tvSortOrder)
|
||||
|
||||
// 정렬타입 스피너 인덱스 찾아 바꾸기 (선택 시 이벤트 발생으로 applyFilterAndSort 자동 호출 차단 처리 포함)
|
||||
spinnerSort.setSelection(currentSort.ordinal, false)
|
||||
tvSortOrder.text = if (isDescending) "arrow_downward" else "arrow_upward"
|
||||
}
|
||||
|
||||
applyFilterAndSort()
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,9 @@ import bums.lunatic.launcher.home.tokiz.TouchArea
|
||||
import bums.lunatic.launcher.home.tokiz.view.PagedTextLayout
|
||||
import bums.lunatic.launcher.home.tokiz.view.PagedTextViewInterface
|
||||
import bums.lunatic.launcher.utils.FileUtils.detectFileEncoding
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.File
|
||||
import java.io.RandomAccessFile
|
||||
import java.nio.charset.Charset
|
||||
@@ -212,31 +214,36 @@ class DocumentViewerActivity : AppCompatActivity(), PagedTextViewInterface {
|
||||
if (!::pageIndexer.isInitialized || pageIndex !in pageIndexer.pageOffsets.indices) return
|
||||
currentPageIndex = pageIndex
|
||||
|
||||
// 페이지가 정상적으로 변경될 때마다 최종 페이지 인덱스를 SharedPreferences에 저장
|
||||
currentFile?.let { file ->
|
||||
sharedPreferences.edit().putInt(file.absolutePath, currentPageIndex).apply()
|
||||
}
|
||||
|
||||
val startOffset = pageIndexer.pageOffsets[pageIndex]
|
||||
val endOffset = if (pageIndex + 1 < pageIndexer.pageOffsets.size) {
|
||||
pageIndexer.pageOffsets[pageIndex + 1]
|
||||
} else {
|
||||
raf.length()
|
||||
}
|
||||
lifecycleScope.launch {
|
||||
val pageText = withContext(Dispatchers.IO) {
|
||||
val startOffset = pageIndexer.pageOffsets[pageIndex]
|
||||
val endOffset = if (pageIndex + 1 < pageIndexer.pageOffsets.size) {
|
||||
pageIndexer.pageOffsets[pageIndex + 1]
|
||||
} else {
|
||||
raf.length()
|
||||
}
|
||||
|
||||
val pageSize = (endOffset - startOffset).toInt()
|
||||
val buffer = ByteArray(pageSize)
|
||||
val pageSize = (endOffset - startOffset).toInt()
|
||||
val buffer = ByteArray(pageSize)
|
||||
|
||||
raf.seek(startOffset)
|
||||
raf.read(buffer)
|
||||
raf.seek(startOffset)
|
||||
raf.read(buffer)
|
||||
String(buffer, Charset.forName(encoding))
|
||||
}
|
||||
|
||||
val pageText = String(buffer, Charset.forName(encoding))
|
||||
pagedLayout.text = pageText
|
||||
pagedLayout.currentPageTextView?.text = "${currentPageIndex + 1} / ${pageIndexer.pageOffsets.size}"
|
||||
pagedLayout.currentChapter?.text = pageIndexer.getChapterForPage(currentPageIndex)?.title
|
||||
pagedLayout.currentChapter?.setOnClickListener {
|
||||
if (!::pageIndexer.isInitialized || pageIndexer.pageOffsets.isEmpty()) return@setOnClickListener
|
||||
showChapterListDialog()
|
||||
// 메인 스레드에서 UI 업데이트
|
||||
pagedLayout.text = pageText
|
||||
pagedLayout.currentPageTextView?.text = "${currentPageIndex + 1} / ${pageIndexer.pageOffsets.size}"
|
||||
pagedLayout.currentChapter?.text = pageIndexer.getChapterForPage(currentPageIndex)?.title
|
||||
|
||||
pagedLayout.currentChapter?.setOnClickListener {
|
||||
if (!::pageIndexer.isInitialized || pageIndexer.pageOffsets.isEmpty()) return@setOnClickListener
|
||||
showChapterListDialog()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ class PageIndexer(
|
||||
val raf = RandomAccessFile(file, "r")
|
||||
val fileLength = raf.length()
|
||||
var currentOffset = 0L
|
||||
|
||||
var lastProgress = -1
|
||||
pageOffsets.add(currentOffset)
|
||||
|
||||
val bufferSize = 40000
|
||||
@@ -137,7 +137,10 @@ class PageIndexer(
|
||||
}
|
||||
|
||||
val progress = ((currentOffset * 100) / fileLength).toInt()
|
||||
onProgress(progress)
|
||||
if (progress != lastProgress) {
|
||||
onProgress(progress)
|
||||
lastProgress = progress
|
||||
}
|
||||
|
||||
startLine = endLine + 1
|
||||
}
|
||||
|
||||
@@ -36,13 +36,13 @@
|
||||
</LinearLayout>
|
||||
<TextView
|
||||
android:id="@+id/current_chapter"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:layout_marginLeft="10dp"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
<TextView
|
||||
android:layout_marginRight="30dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:id="@+id/current_page"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
||||
Reference in New Issue
Block a user