Use relative date format
This commit is contained in:
@@ -22,8 +22,6 @@ import org.koitharu.kotatsu.utils.ext.observe
|
|||||||
import org.koitharu.kotatsu.utils.ext.putEnumValue
|
import org.koitharu.kotatsu.utils.ext.putEnumValue
|
||||||
import org.koitharu.kotatsu.utils.ext.toUriOrNull
|
import org.koitharu.kotatsu.utils.ext.toUriOrNull
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.text.DateFormat
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Collections
|
import java.util.Collections
|
||||||
import java.util.EnumSet
|
import java.util.EnumSet
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
@@ -263,12 +261,6 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|||||||
return policy.isNetworkAllowed(connectivityManager)
|
return policy.isNetworkAllowed(connectivityManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getDateFormat(format: String = prefs.getString(KEY_DATE_FORMAT, "").orEmpty()): DateFormat =
|
|
||||||
when (format) {
|
|
||||||
"" -> DateFormat.getDateInstance(DateFormat.SHORT)
|
|
||||||
else -> SimpleDateFormat(format, Locale.getDefault())
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getSuggestionsTagsBlacklistRegex(): Regex? {
|
fun getSuggestionsTagsBlacklistRegex(): Regex? {
|
||||||
val string = prefs.getString(KEY_SUGGESTIONS_EXCLUDE_TAGS, null)?.trimEnd(' ', ',')
|
val string = prefs.getString(KEY_SUGGESTIONS_EXCLUDE_TAGS, null)?.trimEnd(' ', ',')
|
||||||
if (string.isNullOrEmpty()) {
|
if (string.isNullOrEmpty()) {
|
||||||
@@ -317,7 +309,6 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|||||||
const val KEY_THEME = "theme"
|
const val KEY_THEME = "theme"
|
||||||
const val KEY_COLOR_THEME = "color_theme"
|
const val KEY_COLOR_THEME = "color_theme"
|
||||||
const val KEY_THEME_AMOLED = "amoled_theme"
|
const val KEY_THEME_AMOLED = "amoled_theme"
|
||||||
const val KEY_DATE_FORMAT = "date_format"
|
|
||||||
const val KEY_SOURCES_ORDER = "sources_order_2"
|
const val KEY_SOURCES_ORDER = "sources_order_2"
|
||||||
const val KEY_SOURCES_HIDDEN = "sources_hidden"
|
const val KEY_SOURCES_HIDDEN = "sources_hidden"
|
||||||
const val KEY_TRAFFIC_WARNING = "traffic_warning"
|
const val KEY_TRAFFIC_WARNING = "traffic_warning"
|
||||||
|
|||||||
@@ -72,7 +72,6 @@ class DetailsViewModel @AssistedInject constructor(
|
|||||||
|
|
||||||
private val delegate = MangaDetailsDelegate(
|
private val delegate = MangaDetailsDelegate(
|
||||||
intent = intent,
|
intent = intent,
|
||||||
settings = settings,
|
|
||||||
mangaDataRepository = mangaDataRepository,
|
mangaDataRepository = mangaDataRepository,
|
||||||
historyRepository = historyRepository,
|
historyRepository = historyRepository,
|
||||||
localMangaRepository = localMangaRepository,
|
localMangaRepository = localMangaRepository,
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import org.koitharu.kotatsu.base.domain.MangaIntent
|
|||||||
import org.koitharu.kotatsu.core.model.MangaHistory
|
import org.koitharu.kotatsu.core.model.MangaHistory
|
||||||
import org.koitharu.kotatsu.core.model.getPreferredBranch
|
import org.koitharu.kotatsu.core.model.getPreferredBranch
|
||||||
import org.koitharu.kotatsu.core.parser.MangaRepository
|
import org.koitharu.kotatsu.core.parser.MangaRepository
|
||||||
import org.koitharu.kotatsu.core.prefs.AppSettings
|
|
||||||
import org.koitharu.kotatsu.details.ui.model.ChapterListItem
|
import org.koitharu.kotatsu.details.ui.model.ChapterListItem
|
||||||
import org.koitharu.kotatsu.details.ui.model.toListItem
|
import org.koitharu.kotatsu.details.ui.model.toListItem
|
||||||
import org.koitharu.kotatsu.history.domain.HistoryRepository
|
import org.koitharu.kotatsu.history.domain.HistoryRepository
|
||||||
@@ -21,7 +20,6 @@ import org.koitharu.kotatsu.utils.ext.runCatchingCancellable
|
|||||||
|
|
||||||
class MangaDetailsDelegate(
|
class MangaDetailsDelegate(
|
||||||
private val intent: MangaIntent,
|
private val intent: MangaIntent,
|
||||||
private val settings: AppSettings,
|
|
||||||
private val mangaDataRepository: MangaDataRepository,
|
private val mangaDataRepository: MangaDataRepository,
|
||||||
private val historyRepository: HistoryRepository,
|
private val historyRepository: HistoryRepository,
|
||||||
private val localMangaRepository: LocalMangaRepository,
|
private val localMangaRepository: LocalMangaRepository,
|
||||||
@@ -82,7 +80,6 @@ class MangaDetailsDelegate(
|
|||||||
branch: String?,
|
branch: String?,
|
||||||
): List<ChapterListItem> {
|
): List<ChapterListItem> {
|
||||||
val result = ArrayList<ChapterListItem>(chapters.size)
|
val result = ArrayList<ChapterListItem>(chapters.size)
|
||||||
val dateFormat = settings.getDateFormat()
|
|
||||||
val currentIndex = chapters.indexOfFirst { it.id == currentId }
|
val currentIndex = chapters.indexOfFirst { it.id == currentId }
|
||||||
val firstNewIndex = chapters.size - newCount
|
val firstNewIndex = chapters.size - newCount
|
||||||
val downloadedIds = downloadedChapters?.mapTo(HashSet(downloadedChapters.size)) { it.id }
|
val downloadedIds = downloadedChapters?.mapTo(HashSet(downloadedChapters.size)) { it.id }
|
||||||
@@ -97,7 +94,6 @@ class MangaDetailsDelegate(
|
|||||||
isNew = i >= firstNewIndex,
|
isNew = i >= firstNewIndex,
|
||||||
isMissing = false,
|
isMissing = false,
|
||||||
isDownloaded = downloadedIds?.contains(chapter.id) == true,
|
isDownloaded = downloadedIds?.contains(chapter.id) == true,
|
||||||
dateFormat = dateFormat,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (result.size < chapters.size / 2) {
|
if (result.size < chapters.size / 2) {
|
||||||
@@ -117,7 +113,6 @@ class MangaDetailsDelegate(
|
|||||||
val result = ArrayList<ChapterListItem>(sourceChapters.size)
|
val result = ArrayList<ChapterListItem>(sourceChapters.size)
|
||||||
val currentIndex = sourceChapters.indexOfFirst { it.id == currentId }
|
val currentIndex = sourceChapters.indexOfFirst { it.id == currentId }
|
||||||
val firstNewIndex = sourceChapters.size - newCount
|
val firstNewIndex = sourceChapters.size - newCount
|
||||||
val dateFormat = settings.getDateFormat()
|
|
||||||
for (i in sourceChapters.indices) {
|
for (i in sourceChapters.indices) {
|
||||||
val chapter = sourceChapters[i]
|
val chapter = sourceChapters[i]
|
||||||
val localChapter = chaptersMap.remove(chapter.id)
|
val localChapter = chaptersMap.remove(chapter.id)
|
||||||
@@ -130,14 +125,12 @@ class MangaDetailsDelegate(
|
|||||||
isNew = i >= firstNewIndex,
|
isNew = i >= firstNewIndex,
|
||||||
isMissing = false,
|
isMissing = false,
|
||||||
isDownloaded = false,
|
isDownloaded = false,
|
||||||
dateFormat = dateFormat,
|
|
||||||
) ?: chapter.toListItem(
|
) ?: chapter.toListItem(
|
||||||
isCurrent = i == currentIndex,
|
isCurrent = i == currentIndex,
|
||||||
isUnread = i > currentIndex,
|
isUnread = i > currentIndex,
|
||||||
isNew = i >= firstNewIndex,
|
isNew = i >= firstNewIndex,
|
||||||
isMissing = true,
|
isMissing = true,
|
||||||
isDownloaded = false,
|
isDownloaded = false,
|
||||||
dateFormat = dateFormat,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (chaptersMap.isNotEmpty()) { // some chapters on device but not online source
|
if (chaptersMap.isNotEmpty()) { // some chapters on device but not online source
|
||||||
@@ -150,7 +143,6 @@ class MangaDetailsDelegate(
|
|||||||
isNew = false,
|
isNew = false,
|
||||||
isMissing = false,
|
isMissing = false,
|
||||||
isDownloaded = false,
|
isDownloaded = false,
|
||||||
dateFormat = dateFormat,
|
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
|
|||||||
@@ -1,21 +1,24 @@
|
|||||||
package org.koitharu.kotatsu.details.ui.model
|
package org.koitharu.kotatsu.details.ui.model
|
||||||
|
|
||||||
import java.text.DateFormat
|
import android.text.format.DateUtils
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||||
|
|
||||||
class ChapterListItem(
|
class ChapterListItem(
|
||||||
val chapter: MangaChapter,
|
val chapter: MangaChapter,
|
||||||
val flags: Int,
|
val flags: Int,
|
||||||
private val uploadDateMs: Long,
|
private val uploadDateMs: Long,
|
||||||
private val dateFormat: DateFormat,
|
|
||||||
) {
|
) {
|
||||||
|
|
||||||
var uploadDate: String? = null
|
var uploadDate: CharSequence? = null
|
||||||
private set
|
private set
|
||||||
get() {
|
get() {
|
||||||
if (field != null) return field
|
if (field != null) return field
|
||||||
if (uploadDateMs == 0L) return null
|
if (uploadDateMs == 0L) return null
|
||||||
field = dateFormat.format(uploadDateMs)
|
field = DateUtils.getRelativeTimeSpanString(
|
||||||
|
uploadDateMs,
|
||||||
|
System.currentTimeMillis(),
|
||||||
|
DateUtils.DAY_IN_MILLIS,
|
||||||
|
)
|
||||||
return field
|
return field
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,7 +47,6 @@ class ChapterListItem(
|
|||||||
if (chapter != other.chapter) return false
|
if (chapter != other.chapter) return false
|
||||||
if (flags != other.flags) return false
|
if (flags != other.flags) return false
|
||||||
if (uploadDateMs != other.uploadDateMs) return false
|
if (uploadDateMs != other.uploadDateMs) return false
|
||||||
if (dateFormat != other.dateFormat) return false
|
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -53,7 +55,6 @@ class ChapterListItem(
|
|||||||
var result = chapter.hashCode()
|
var result = chapter.hashCode()
|
||||||
result = 31 * result + flags
|
result = 31 * result + flags
|
||||||
result = 31 * result + uploadDateMs.hashCode()
|
result = 31 * result + uploadDateMs.hashCode()
|
||||||
result = 31 * result + dateFormat.hashCode()
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package org.koitharu.kotatsu.details.ui.model
|
package org.koitharu.kotatsu.details.ui.model
|
||||||
|
|
||||||
import java.text.DateFormat
|
|
||||||
import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_CURRENT
|
import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_CURRENT
|
||||||
import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_DOWNLOADED
|
import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_DOWNLOADED
|
||||||
import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_MISSING
|
import org.koitharu.kotatsu.details.ui.model.ChapterListItem.Companion.FLAG_MISSING
|
||||||
@@ -14,7 +13,6 @@ fun MangaChapter.toListItem(
|
|||||||
isNew: Boolean,
|
isNew: Boolean,
|
||||||
isMissing: Boolean,
|
isMissing: Boolean,
|
||||||
isDownloaded: Boolean,
|
isDownloaded: Boolean,
|
||||||
dateFormat: DateFormat,
|
|
||||||
): ChapterListItem {
|
): ChapterListItem {
|
||||||
var flags = 0
|
var flags = 0
|
||||||
if (isCurrent) flags = flags or FLAG_CURRENT
|
if (isCurrent) flags = flags or FLAG_CURRENT
|
||||||
@@ -26,6 +24,5 @@ fun MangaChapter.toListItem(
|
|||||||
chapter = this,
|
chapter = this,
|
||||||
flags = flags,
|
flags = flags,
|
||||||
uploadDateMs = uploadDate,
|
uploadDateMs = uploadDate,
|
||||||
dateFormat = dateFormat,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import javax.inject.Inject
|
|
||||||
import kotlin.math.roundToInt
|
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.base.ui.BaseBottomSheet
|
import org.koitharu.kotatsu.base.ui.BaseBottomSheet
|
||||||
import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener
|
import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener
|
||||||
@@ -21,6 +19,8 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter
|
|||||||
import org.koitharu.kotatsu.utils.RecyclerViewScrollCallback
|
import org.koitharu.kotatsu.utils.RecyclerViewScrollCallback
|
||||||
import org.koitharu.kotatsu.utils.ext.getParcelableCompat
|
import org.koitharu.kotatsu.utils.ext.getParcelableCompat
|
||||||
import org.koitharu.kotatsu.utils.ext.withArgs
|
import org.koitharu.kotatsu.utils.ext.withArgs
|
||||||
|
import javax.inject.Inject
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class ChaptersBottomSheet : BaseBottomSheet<SheetChaptersBinding>(), OnListItemClickListener<ChapterListItem> {
|
class ChaptersBottomSheet : BaseBottomSheet<SheetChaptersBinding>(), OnListItemClickListener<ChapterListItem> {
|
||||||
@@ -41,7 +41,6 @@ class ChaptersBottomSheet : BaseBottomSheet<SheetChaptersBinding>(), OnListItemC
|
|||||||
}
|
}
|
||||||
val currentId = requireArguments().getLong(ARG_CURRENT_ID, 0L)
|
val currentId = requireArguments().getLong(ARG_CURRENT_ID, 0L)
|
||||||
val currentPosition = chapters.indexOfFirst { it.id == currentId }
|
val currentPosition = chapters.indexOfFirst { it.id == currentId }
|
||||||
val dateFormat = settings.getDateFormat()
|
|
||||||
val items = chapters.mapIndexed { index, chapter ->
|
val items = chapters.mapIndexed { index, chapter ->
|
||||||
chapter.toListItem(
|
chapter.toListItem(
|
||||||
isCurrent = index == currentPosition,
|
isCurrent = index == currentPosition,
|
||||||
@@ -49,7 +48,6 @@ class ChaptersBottomSheet : BaseBottomSheet<SheetChaptersBinding>(), OnListItemC
|
|||||||
isNew = false,
|
isNew = false,
|
||||||
isMissing = false,
|
isMissing = false,
|
||||||
isDownloaded = false,
|
isDownloaded = false,
|
||||||
dateFormat = dateFormat,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
binding.recyclerView.adapter = ChaptersAdapter(this).also { adapter ->
|
binding.recyclerView.adapter = ChaptersAdapter(this).also { adapter ->
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import org.koitharu.kotatsu.utils.ext.getLocalesConfig
|
|||||||
import org.koitharu.kotatsu.utils.ext.map
|
import org.koitharu.kotatsu.utils.ext.map
|
||||||
import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat
|
import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat
|
||||||
import org.koitharu.kotatsu.utils.ext.toList
|
import org.koitharu.kotatsu.utils.ext.toList
|
||||||
import java.util.Date
|
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@@ -55,20 +54,6 @@ class AppearanceSettingsFragment :
|
|||||||
entryValues = ListMode.values().names()
|
entryValues = ListMode.values().names()
|
||||||
setDefaultValueCompat(ListMode.GRID.name)
|
setDefaultValueCompat(ListMode.GRID.name)
|
||||||
}
|
}
|
||||||
findPreference<ListPreference>(AppSettings.KEY_DATE_FORMAT)?.run {
|
|
||||||
entryValues = resources.getStringArray(R.array.date_formats)
|
|
||||||
val now = Date().time
|
|
||||||
entries = entryValues.map { value ->
|
|
||||||
val formattedDate = settings.getDateFormat(value.toString()).format(now)
|
|
||||||
if (value == "") {
|
|
||||||
getString(R.string.default_s, formattedDate)
|
|
||||||
} else {
|
|
||||||
formattedDate
|
|
||||||
}
|
|
||||||
}.toTypedArray()
|
|
||||||
setDefaultValueCompat("")
|
|
||||||
summary = "%s"
|
|
||||||
}
|
|
||||||
findPreference<TwoStatePreference>(AppSettings.KEY_PROTECT_APP)
|
findPreference<TwoStatePreference>(AppSettings.KEY_PROTECT_APP)
|
||||||
?.isChecked = !settings.appPassword.isNullOrEmpty()
|
?.isChecked = !settings.appPassword.isNullOrEmpty()
|
||||||
findPreference<ActivityListPreference>(AppSettings.KEY_APP_LOCALE)?.run {
|
findPreference<ActivityListPreference>(AppSettings.KEY_APP_LOCALE)?.run {
|
||||||
|
|||||||
@@ -38,12 +38,4 @@
|
|||||||
<item>2</item>
|
<item>2</item>
|
||||||
<item>0</item>
|
<item>0</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="date_formats">
|
|
||||||
<item />
|
|
||||||
<item>MM/dd/yy</item>
|
|
||||||
<item>dd/MM/yy</item>
|
|
||||||
<item>yyyy-MM-dd</item>
|
|
||||||
<item>dd MMM yyyy</item>
|
|
||||||
<item>MMM dd, yyyy</item>
|
|
||||||
</string-array>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -27,10 +27,6 @@
|
|||||||
android:title="@string/language"
|
android:title="@string/language"
|
||||||
app:allowDividerAbove="true" />
|
app:allowDividerAbove="true" />
|
||||||
|
|
||||||
<ListPreference
|
|
||||||
android:key="date_format"
|
|
||||||
android:title="@string/date_format" />
|
|
||||||
|
|
||||||
<ListPreference
|
<ListPreference
|
||||||
android:entries="@array/list_modes"
|
android:entries="@array/list_modes"
|
||||||
android:key="list_mode_2"
|
android:key="list_mode_2"
|
||||||
|
|||||||
Reference in New Issue
Block a user