Skip to content
34 changes: 17 additions & 17 deletions app/src/main/java/org/wikipedia/dataclient/mwapi/MwQueryPage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import org.wikipedia.dataclient.page.Protection
import org.wikipedia.gallery.ImageInfo
import org.wikipedia.json.JsonUtil
import org.wikipedia.page.Namespace
import org.wikipedia.util.DateUtil
import kotlin.time.ExperimentalTime
import kotlin.time.Instant

@Serializable
class MwQueryPage {
Expand Down Expand Up @@ -88,20 +89,21 @@ class MwQueryPage {
}

@Serializable
class Revision {
private val slots: Map<String, RevisionSlot>? = null
val minor = false
@SerialName("revid") val revId: Long = 0
@SerialName("parentid") val parentRevId: Long = 0
@SerialName("anon") val isAnon = false
@SerialName("temp") val isTemp = false
@SerialName("timestamp") val timeStamp: String = ""
val size = 0
val user: String = ""
val comment: String = ""
val parsedcomment: String = ""

private val oresscores: JsonElement? = null
@OptIn(ExperimentalTime::class)
class Revision(
private val slots: Map<String, RevisionSlot>? = null,
val minor: Boolean = false,
@SerialName("revid") val revId: Long = 0,
@SerialName("parentid") val parentRevId: Long = 0,
@SerialName("anon") val isAnon: Boolean = false,
@SerialName("temp") val isTemp: Boolean = false,
val timestamp: Instant,
val size: Int = 0,
val user: String = "",
val comment: String = "",
val parsedcomment: String = "",
private val oresscores: JsonElement? = null,
) {
val ores: MwQueryResult.OresResult?
get() = if (oresscores != null && oresscores !is JsonArray) {
JsonUtil.json.decodeFromJsonElement<MwQueryResult.OresResult>(oresscores)
Expand All @@ -111,8 +113,6 @@ class MwQueryPage {

var diffSize = 0

val localDateTime by lazy { DateUtil.iso8601LocalDateTimeParse(timeStamp) }

fun getContentFromSlot(slot: String): String {
return slots?.get(slot)?.content.orEmpty()
}
Expand Down
101 changes: 46 additions & 55 deletions app/src/main/java/org/wikipedia/dataclient/mwapi/MwQueryResult.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,12 @@ import org.wikipedia.notifications.db.Notification.SeenTime
import org.wikipedia.notifications.db.Notification.UnreadNotificationWikiItem
import org.wikipedia.page.PageTitle
import org.wikipedia.settings.SiteInfo
import org.wikipedia.util.DateUtil
import org.wikipedia.util.StringUtil
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
import java.util.*
import kotlin.time.ExperimentalTime
import kotlin.time.Instant

@Serializable
@OptIn(ExperimentalTime::class)
class MwQueryResult {

@SerialName("userinfo") val userInfo: UserInfo? = null
Expand Down Expand Up @@ -167,58 +165,51 @@ class MwQueryResult {
@SerialName("continue") val continueStr: String? = null)

@Serializable
class WatchlistItem {

@SerialName("new") val isNew = false
@SerialName("anon") val isAnon = false
@SerialName("minor") val isMinor = false
@SerialName("bot") val isBot = false
@SerialName("old_revid") private val oldRevid: Long = 0
private val timestamp: String? = null
private val comment: String? = null
val type: String = ""
@SerialName("pageid") val pageId = 0
val revid: Long = 0
val ns = 0
val title: String = ""
val user: String = ""
val logtype: String = ""
val logdisplay: String = ""
val oldlen = 0
val newlen = 0
var wiki: WikiSite? = null
@SerialName("parsedcomment") val parsedComment: String = ""
val date: Date
get() = DateUtil.iso8601DateParse(timestamp.orEmpty())
}
class WatchlistItem(
@SerialName("new") val isNew: Boolean = false,
@SerialName("anon") val isAnon: Boolean = false,
@SerialName("minor") val isMinor: Boolean = false,
@SerialName("bot") val isBot: Boolean = false,
@SerialName("old_revid") private val oldRevid: Long = 0,
val timestamp: Instant,
private val comment: String? = null,
val type: String = "",
@SerialName("pageid") val pageId: Int = 0,
val revid: Long = 0,
val ns: Int = 0,
val title: String = "",
val user: String = "",
val logtype: String = "",
val logdisplay: String = "",
val oldlen: Int = 0,
val newlen: Int = 0,
var wiki: WikiSite? = null,
@SerialName("parsedcomment") val parsedComment: String = "",
)

@Serializable
class RecentChange {
private val type: String = ""
private val ns = 0
val title: String = ""
val pageid: Int = 0
@SerialName("revid") val curRev: Long = 0
@SerialName("old_revid") val revFrom: Long = 0
val rcid: Long = 0
val user: String = ""
val anon = false
val bot = false

@SerialName("new") private val isNew = false
private val minor = false
val oldlen = 0
val newlen = 0
private val timestamp: String = ""

@SerialName("parsedcomment") val parsedComment: String = ""
private val tags: List<String>? = null
private val oresscores: JsonElement? = null

val parsedInstant: Instant by lazy { Instant.parse(timestamp) }
val parsedDateTime: LocalDateTime by lazy {
LocalDateTime.ofInstant(parsedInstant, ZoneId.systemDefault())
}
class RecentChange(
private val type: String = "",
private val ns: Int = 0,
val title: String = "",
val pageid: Int = 0,
@SerialName("revid") val curRev: Long = 0,
@SerialName("old_revid") val revFrom: Long = 0,
val rcid: Long = 0,
val user: String = "",
val anon: Boolean = false,
val bot: Boolean = false,

@SerialName("new") private val isNew: Boolean = false,
private val minor: Boolean = false,
val oldlen: Int = 0,
val newlen: Int = 0,
val timestamp: Instant,

@SerialName("parsedcomment") val parsedComment: String = "",
private val tags: List<String>? = null,
private val oresscores: JsonElement? = null,
) {
val joinedTags by lazy { tags?.joinToString(separator = ", ").orEmpty() }

override fun toString(): String {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
package org.wikipedia.dataclient.mwapi

import kotlinx.serialization.Serializable
import org.wikipedia.util.DateUtil
import kotlin.time.ExperimentalTime
import kotlin.time.Instant

@Serializable
class UserContribution {
val userid: Int = 0
val user: String = ""
val pageid: Int = 0
val revid: Long = 0
val parentid: Long = 0
val ns: Int = 0
val title: String = ""
private val timestamp: String = ""
val comment: String = ""
val new: Boolean = false
val minor: Boolean = false
val top: Boolean = false
val size: Int = 0
val sizediff: Int = 0
val tags: List<String> = emptyList()

val parsedDateTime by lazy { DateUtil.iso8601LocalDateTimeParse(timestamp) }
}
@OptIn(ExperimentalTime::class)
class UserContribution(
val userid: Int = 0,
val user: String = "",
val pageid: Int = 0,
val revid: Long = 0,
val parentid: Long = 0,
val ns: Int = 0,
val title: String = "",
val timestamp: Instant,
val comment: String = "",
val new: Boolean = false,
val minor: Boolean = false,
val top: Boolean = false,
val size: Int = 0,
val sizediff: Int = 0,
val tags: List<String> = emptyList(),
)
39 changes: 16 additions & 23 deletions app/src/main/java/org/wikipedia/dataclient/mwapi/UserInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,20 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement
import org.wikipedia.dataclient.mwapi.MwServiceError.BlockInfo
import org.wikipedia.util.DateUtil
import java.util.*
import java.time.LocalDate
import java.time.ZoneId
import kotlin.time.ExperimentalTime
import kotlin.time.Instant
import kotlin.time.toJavaInstant

@Serializable
@OptIn(ExperimentalTime::class)
class UserInfo : BlockInfo() {
val id = 0
private val groups: List<String>? = null
@SerialName("latestcontrib") private val latestContrib: String? = null
@SerialName("registrationdate") private val regDate: String? = null
@SerialName("registration") private val registration: String? = null
@SerialName("latestcontrib") private val latestContrib: Instant = Instant.DISTANT_PAST
@SerialName("registrationdate") private val regInstant: Instant? = null
private val registration: Instant? = null
@SerialName("editcount") val editCount = -1
val name: String = ""
val anon: Boolean = false
Expand All @@ -30,25 +34,14 @@ class UserInfo : BlockInfo() {
return groups?.toSet() ?: emptySet()
}

val latestContribDate: Date
get() {
var date = Date(0)
if (!latestContrib.isNullOrEmpty()) {
date = DateUtil.iso8601DateParse(latestContrib)
}
return date
}
val latestContribDate: LocalDate by lazy {
LocalDate.ofInstant(latestContrib.toJavaInstant(), ZoneId.systemDefault())
}

val registrationDate: Date
get() {
var date = Date(0)
if (!regDate.isNullOrEmpty()) {
date = DateUtil.iso8601DateParse(regDate)
} else if (!registration.isNullOrEmpty()) {
date = DateUtil.iso8601DateParse(registration)
}
return date
}
val registrationDate: LocalDate by lazy {
val instant = regInstant ?: registration ?: Instant.DISTANT_PAST
LocalDate.ofInstant(instant.toJavaInstant(), ZoneId.systemDefault())
}

@Serializable
class Options {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ import org.wikipedia.util.log.L
import org.wikipedia.views.SurveyDialog
import org.wikipedia.watchlist.WatchlistExpiry
import org.wikipedia.watchlist.WatchlistExpiryDialog
import kotlin.time.ExperimentalTime

class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, MenuProvider {
interface Callback {
Expand Down Expand Up @@ -447,12 +448,13 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M
binding.newerIdButton.isVisible = false
}

@OptIn(ExperimentalTime::class)
private fun updateAfterRevisionFetchSuccess() {
binding.articleTitleView.text = StringUtil.fromHtml(viewModel.pageTitle.displayText)

if (viewModel.revisionFrom != null) {
binding.usernameFromButton.text = viewModel.revisionFrom!!.user
binding.revisionFromTimestamp.text = DateUtil.getTimeAndDateString(requireContext(), viewModel.revisionFrom!!.timeStamp)
binding.revisionFromTimestamp.text = DateUtil.getTimeAndDateString(requireContext(), viewModel.revisionFrom!!.timestamp)
binding.revisionFromEditComment.text = StringUtil.fromHtml(viewModel.revisionFrom!!.parsedcomment.trim())
binding.revisionFromTimestamp.setTextColor(ResourceUtil.getThemedColor(requireContext(), R.attr.progressive_color))
binding.overlayRevisionFromTimestamp.setTextColor(ResourceUtil.getThemedColor(requireContext(), R.attr.progressive_color))
Expand All @@ -472,7 +474,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, M

viewModel.revisionTo?.let {
binding.usernameToButton.text = it.user
binding.revisionToTimestamp.text = DateUtil.getTimeAndDateString(requireContext(), it.timeStamp)
binding.revisionToTimestamp.text = DateUtil.getTimeAndDateString(requireContext(), it.timestamp)
binding.overlayRevisionToTimestamp.text = binding.revisionToTimestamp.text
binding.revisionToEditComment.text = StringUtil.fromHtml(it.parsedcomment.trim())

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,24 @@ import org.wikipedia.dataclient.WikiSite
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import org.wikipedia.page.PageTitle
import org.wikipedia.settings.Prefs
import org.wikipedia.util.DateUtil
import java.util.Date
import java.util.concurrent.TimeUnit
import kotlin.time.Clock
import kotlin.time.Duration.Companion.days
import kotlin.time.ExperimentalTime
import kotlin.time.Instant

@OptIn(ExperimentalTime::class)
object AnonymousNotificationHelper {
private const val NOTIFICATION_DURATION_DAYS = 7L
private val NOTIFICATION_DURATION_DAYS = 7.days

fun onEditSubmitted() {
if (!AccountUtil.isLoggedIn) {
Prefs.lastAnonEditTime = Date().time
Prefs.lastAnonEditTime = System.currentTimeMillis()
}
}

suspend fun maybeGetAnonUserInfo(wikiSite: WikiSite): MwQueryResponse {
return if (Date().time - Prefs.lastAnonEditTime < TimeUnit.DAYS.toMillis(NOTIFICATION_DURATION_DAYS)) {
val lastAnon = Instant.fromEpochMilliseconds(Prefs.lastAnonEditTime)
return if (Clock.System.now() - lastAnon < NOTIFICATION_DURATION_DAYS) {
ServiceFactory.get(wikiSite).getUserInfo()
} else {
MwQueryResponse()
Expand All @@ -41,10 +44,11 @@ object AnonymousNotificationHelper {
}

fun anonTalkPageHasRecentMessage(response: MwQueryResponse, title: PageTitle): Boolean {
response.query?.firstPage()?.revisions?.firstOrNull()?.timeStamp?.let {
if (Date().time - DateUtil.iso8601DateParse(it).time < TimeUnit.DAYS.toMillis(NOTIFICATION_DURATION_DAYS)) {
response.query?.firstPage()?.revisions?.firstOrNull()?.timestamp?.let {
val now = Clock.System.now()
if (now - it < NOTIFICATION_DURATION_DAYS) {
Prefs.hasAnonymousNotification = true
Prefs.lastAnonNotificationTime = Date().time
Prefs.lastAnonNotificationTime = now.toEpochMilliseconds()
Prefs.lastAnonNotificationLang = title.wikiSite.languageCode
return true
}
Expand All @@ -53,6 +57,7 @@ object AnonymousNotificationHelper {
}

fun isWithinAnonNotificationTime(): Boolean {
return Date().time - Prefs.lastAnonNotificationTime < TimeUnit.DAYS.toMillis(NOTIFICATION_DURATION_DAYS)
val lastAnon = Instant.fromEpochMilliseconds(Prefs.lastAnonNotificationTime)
return Clock.System.now() - lastAnon < NOTIFICATION_DURATION_DAYS
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import org.wikipedia.dataclient.mwapi.MwQueryPage
import org.wikipedia.util.DateUtil
import org.wikipedia.util.ResourceUtil
import org.wikipedia.util.StringUtil
import kotlin.time.ExperimentalTime

class EditHistoryItemView(context: Context) : FrameLayout(context) {
interface Listener {
Expand Down Expand Up @@ -70,7 +71,8 @@ class EditHistoryItemView(context: Context) : FrameLayout(context) {
StringUtil.setHighlightedAndBoldenedText(binding.editHistoryTitle, historyTitle, currentQuery)
}
StringUtil.setHighlightedAndBoldenedText(binding.userNameText, itemRevision.user, currentQuery)
binding.editHistoryTimeText.text = DateUtil.getTimeString(context, DateUtil.iso8601DateParse(itemRevision.timeStamp))
@OptIn(ExperimentalTime::class)
binding.editHistoryTimeText.text = DateUtil.getTimeString(context, itemRevision.timestamp)
}

fun setSelectedState(selectedState: Int) {
Expand Down
Loading
Loading