diff --git a/app/src/main/java/one/mixin/android/db/ConversationDao.kt b/app/src/main/java/one/mixin/android/db/ConversationDao.kt index 8f2703cfb5..cd21b61c38 100644 --- a/app/src/main/java/one/mixin/android/db/ConversationDao.kt +++ b/app/src/main/java/one/mixin/android/db/ConversationDao.kt @@ -29,7 +29,7 @@ interface ConversationDao : BaseDao { mu.full_name AS senderFullName, pu.full_name AS participantFullName, pu.user_id AS participantUserId, (SELECT count(1) FROM message_mentions me WHERE me.conversation_id = c.conversation_id AND me.has_read = 0) as mentionCount, - mm.mentions AS mentions, ou.membership AS membership + mm.mentions AS mentions, ou.membership AS membership, c.expire_in AS expireIn FROM conversations c INNER JOIN users ou ON ou.user_id = c.owner_id LEFT JOIN messages m ON c.last_message_id = m.id diff --git a/app/src/main/java/one/mixin/android/db/provider/DataConverter.kt b/app/src/main/java/one/mixin/android/db/provider/DataConverter.kt index 3898368d80..224e1a3755 100644 --- a/app/src/main/java/one/mixin/android/db/provider/DataConverter.kt +++ b/app/src/main/java/one/mixin/android/db/provider/DataConverter.kt @@ -59,6 +59,7 @@ fun convertToConversationItems(cursor: Cursor?): List { val cursorIndexOfMentionCount = getColumnIndexOrThrow(cursor, "mentionCount") val cursorIndexOfMentions = getColumnIndexOrThrow(cursor, "mentions") val cursorIndexOfMembership = getColumnIndexOrThrow(cursor, "membership") + val cursorIndexOfExpireIn = getColumnIndexOrThrow(cursor, "expireIn") val res = ArrayList(cursor.count) while (cursor.moveToNext()) { val item: ConversationItem @@ -107,6 +108,12 @@ fun convertToConversationItems(cursor: Cursor?): List { } val tmpMentions = cursor.getString(cursorIndexOfMentions) val tmpMembership = cursor.getString(cursorIndexOfMembership) + val tmpExpireIn = + if (cursor.isNull(cursorIndexOfExpireIn)) { + null + } else { + cursor.getLong(cursorIndexOfExpireIn) + } item = ConversationItem( tmpConversationId, @@ -136,7 +143,8 @@ fun convertToConversationItems(cursor: Cursor?): List { tmpAppId, tmpMentions, tmpMentionCount, - membershipConverter.revertData(tmpMembership) + membershipConverter.revertData(tmpMembership), + tmpExpireIn, ) res.add(item) } diff --git a/app/src/main/java/one/mixin/android/db/provider/DataProvider.kt b/app/src/main/java/one/mixin/android/db/provider/DataProvider.kt index 82a035129b..dcd9d52e23 100644 --- a/app/src/main/java/one/mixin/android/db/provider/DataProvider.kt +++ b/app/src/main/java/one/mixin/android/db/provider/DataProvider.kt @@ -67,7 +67,7 @@ class DataProvider { mu.full_name AS senderFullName, pu.full_name AS participantFullName, pu.user_id AS participantUserId, (SELECT count(1) FROM message_mentions me WHERE me.conversation_id = c.conversation_id AND me.has_read = 0) AS mentionCount, - mm.mentions AS mentions, ou.membership AS membership + mm.mentions AS mentions, ou.membership AS membership, c.expire_in AS expireIn FROM circle_conversations cc INNER JOIN conversations c ON cc.conversation_id = c.conversation_id INNER JOIN circles ci ON ci.circle_id = cc.circle_id diff --git a/app/src/main/java/one/mixin/android/ui/common/DisappearingFragment.kt b/app/src/main/java/one/mixin/android/ui/common/DisappearingFragment.kt index 4dabc67882..ad7a364792 100644 --- a/app/src/main/java/one/mixin/android/ui/common/DisappearingFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/common/DisappearingFragment.kt @@ -15,6 +15,9 @@ import one.mixin.android.extension.withArgs import one.mixin.android.ui.conversation.ConversationViewModel import one.mixin.android.util.ErrorHandler import one.mixin.android.util.viewBinding +import one.mixin.android.widget.picker.INTERVAL_DAY +import one.mixin.android.widget.picker.INTERVAL_MONTH +import one.mixin.android.widget.picker.INTERVAL_WEEK import one.mixin.android.widget.picker.toTimeInterval import one.mixin.android.widget.picker.toTimeIntervalIndex import timber.log.Timber @@ -53,8 +56,6 @@ class DisappearingFragment : BaseFragment(R.layout.fragment_disappearing) { disappearingOption1Iv, disappearingOption2Iv, disappearingOption3Iv, - disappearingOption4Iv, - disappearingOption5Iv, disappearingOption6Iv, ) } @@ -67,8 +68,6 @@ class DisappearingFragment : BaseFragment(R.layout.fragment_disappearing) { disappearingOption1Pb, disappearingOption2Pb, disappearingOption3Pb, - disappearingOption4Pb, - disappearingOption5Pb, disappearingOption6Pb, ) } @@ -77,13 +76,11 @@ class DisappearingFragment : BaseFragment(R.layout.fragment_disappearing) { private fun Long?.initOption() { when { this == null || this <= 0 -> updateOptionCheck(0) - this == 30L -> updateOptionCheck(1) - this == 600L -> updateOptionCheck(2) - this == 7200L -> updateOptionCheck(3) - this == 86400L -> updateOptionCheck(4) - this == 604800L -> updateOptionCheck(5) + this == INTERVAL_DAY -> updateOptionCheck(1) + this == INTERVAL_WEEK -> updateOptionCheck(2) + this == INTERVAL_MONTH -> updateOptionCheck(3) else -> { - updateOptionCheck(6) + updateOptionCheck(4) binding.disappearingOption6Interval.text = toTimeInterval(this) } } @@ -106,19 +103,13 @@ class DisappearingFragment : BaseFragment(R.layout.fragment_disappearing) { updateUI(0, 0L) } disappearingOption1.setOnClickListener { - updateUI(1, 30L) + updateUI(1, INTERVAL_DAY) } disappearingOption2.setOnClickListener { - updateUI(2, 600L) + updateUI(2, INTERVAL_WEEK) } disappearingOption3.setOnClickListener { - updateUI(3, 7200L) - } - disappearingOption4.setOnClickListener { - updateUI(4, 86400L) - } - disappearingOption5.setOnClickListener { - updateUI(5, 604800L) + updateUI(3, INTERVAL_MONTH) } disappearingOption6.setOnClickListener { @@ -126,10 +117,20 @@ class DisappearingFragment : BaseFragment(R.layout.fragment_disappearing) { .apply { onSetCallback { this@DisappearingFragment.lifecycleScope.launch { + val index = when (it) { + INTERVAL_DAY -> 1 + INTERVAL_WEEK -> 2 + INTERVAL_MONTH -> 3 + else -> 4 + } + if (it == timeInterval) { + updateOptionCheck(index) + return@launch + } disappearingOption6Iv.isVisible = false disappearingOption6Interval.isVisible = false disappearingOption6Arrow.isVisible = false - updateUI(6, it) + updateUI(index, it) disappearingOption6Interval.text = toTimeInterval(it) Timber.e( "Set interval ${toTimeInterval(it)} ${ @@ -203,7 +204,7 @@ class DisappearingFragment : BaseFragment(R.layout.fragment_disappearing) { for ((i, iv) in checkGroup.withIndex()) { iv.isVisible = index == i } - binding.disappearingOption6Arrow.isVisible = index != 6 - binding.disappearingOption6Interval.isVisible = index == 6 + binding.disappearingOption6Arrow.isVisible = index != 4 + binding.disappearingOption6Interval.isVisible = index == 4 } } diff --git a/app/src/main/java/one/mixin/android/ui/conversation/ConversationFragment.kt b/app/src/main/java/one/mixin/android/ui/conversation/ConversationFragment.kt index ab840c0a4a..d3014bfbdb 100644 --- a/app/src/main/java/one/mixin/android/ui/conversation/ConversationFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/conversation/ConversationFragment.kt @@ -1568,6 +1568,9 @@ class ConversationFragment() : } else { renderUser(recipient!!) } + chatViewModel.observeConversation(conversationId).observe(viewLifecycleOwner) { conversation -> + binding.actionBar.setExpireIconVisible((conversation?.expireIn ?: 0L) > 0L) + } binding.mentionRv.adapter = mentionAdapter binding.mentionRv.layoutManager = LinearLayoutManager(context) diff --git a/app/src/main/java/one/mixin/android/ui/conversation/ConversationViewModel.kt b/app/src/main/java/one/mixin/android/ui/conversation/ConversationViewModel.kt index ad0420c048..7f59d8b3f5 100644 --- a/app/src/main/java/one/mixin/android/ui/conversation/ConversationViewModel.kt +++ b/app/src/main/java/one/mixin/android/ui/conversation/ConversationViewModel.kt @@ -145,6 +145,9 @@ class ConversationViewModel conversationRepository.getConversation(id) } + fun observeConversation(id: String) = + conversationRepository.getConversationById(id) + fun findUserById(conversationId: String): LiveData = userRepository.findUserById(conversationId) diff --git a/app/src/main/java/one/mixin/android/ui/conversation/holder/base/BaseViewHolder.kt b/app/src/main/java/one/mixin/android/ui/conversation/holder/base/BaseViewHolder.kt index 896e4ead30..9bfcd8bd76 100644 --- a/app/src/main/java/one/mixin/android/ui/conversation/holder/base/BaseViewHolder.kt +++ b/app/src/main/java/one/mixin/android/ui/conversation/holder/base/BaseViewHolder.kt @@ -10,8 +10,6 @@ import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import androidx.annotation.IdRes import androidx.appcompat.content.res.AppCompatResources -import androidx.appcompat.widget.TooltipCompat -import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import com.uber.autodispose.android.autoDispose @@ -25,7 +23,6 @@ import one.mixin.android.event.BlinkEvent import one.mixin.android.extension.CodeType import one.mixin.android.extension.booleanFromAttribute import one.mixin.android.extension.dpToPx -import one.mixin.android.extension.fullTime import one.mixin.android.extension.getColorCode import one.mixin.android.session.Session import one.mixin.android.util.GsonHelper @@ -159,27 +156,12 @@ abstract class BaseViewHolder constructor(containerView: View) : fun chatJumpLayout( chatJump: ImageView, - isMe: Boolean, - expireIn: Long?, - expireAt: Long?, - @IdRes id: Int, + @Suppress("UNUSED_PARAMETER") isMe: Boolean, + @Suppress("UNUSED_PARAMETER") expireIn: Long?, + @Suppress("UNUSED_PARAMETER") expireAt: Long?, + @Suppress("UNUSED_PARAMETER") @IdRes id: Int, ) { - chatJump.isVisible = expireIn != null - if (expireIn != null) { - chatJump.setImageResource(R.drawable.ic_expire_message) - expireAt?.fullTime()?.let { - TooltipCompat.setTooltipText(chatJump, chatJump.context.getString(R.string.Expired_tip, it)) - } - (chatJump.layoutParams as ConstraintLayout.LayoutParams).apply { - if (isMe) { - endToStart = id - startToEnd = View.NO_ID - } else { - endToStart = View.NO_ID - startToEnd = id - } - } - } + chatJump.isVisible = false } private val argbEvaluator: ArgbEvaluator by lazy { diff --git a/app/src/main/java/one/mixin/android/ui/home/ConversationListFragment.kt b/app/src/main/java/one/mixin/android/ui/home/ConversationListFragment.kt index 2682ed0853..5cc9dd31a1 100644 --- a/app/src/main/java/one/mixin/android/ui/home/ConversationListFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/home/ConversationListFragment.kt @@ -849,7 +849,7 @@ class ConversationListFragment : LinkFragment() { val id = Session.getAccountId() binding.nameTv.setName(conversationItem) binding.groupNameTv.visibility = GONE - binding.msgExpire.isVisible = conversationItem.isExpire() + binding.msgExpire.isVisible = conversationItem.isDisappearingEnabled() binding.mentionFlag.isVisible = conversationItem.mentionCount != null && conversationItem.mentionCount > 0 when { diff --git a/app/src/main/java/one/mixin/android/vo/ConversationItem.kt b/app/src/main/java/one/mixin/android/vo/ConversationItem.kt index 5b2868589a..6f1849f455 100644 --- a/app/src/main/java/one/mixin/android/vo/ConversationItem.kt +++ b/app/src/main/java/one/mixin/android/vo/ConversationItem.kt @@ -34,7 +34,8 @@ data class ConversationItem( val appId: String?, val mentions: String?, val mentionCount: Int?, - val membership: Membership? + val membership: Membership?, + val expireIn: Long? = null, ) : ICategory, IConversationCategory { companion object { val DIFF_CALLBACK = @@ -87,6 +88,8 @@ data class ConversationItem( fun isExpire() = actionName == SystemConversationAction.EXPIRE.name + fun isDisappearingEnabled() = (expireIn ?: 0L) > 0L + fun isBot(): Boolean { return isContactConversation() && ownerIdentityNumber.isBotIdentityNumber() } diff --git a/app/src/main/java/one/mixin/android/widget/TitleView.kt b/app/src/main/java/one/mixin/android/widget/TitleView.kt index 3ead165a12..f095be41be 100644 --- a/app/src/main/java/one/mixin/android/widget/TitleView.kt +++ b/app/src/main/java/one/mixin/android/widget/TitleView.kt @@ -24,6 +24,7 @@ class TitleView(context: Context, attrs: AttributeSet) : RelativeLayout(context, ViewTitleBinding.inflate(LayoutInflater.from(context), this, true) val titleTv = binding.titleTv + val expireIv = binding.expireIv val leftIb = binding.leftIb val rightIb = binding.rightIb val rightTv = binding.rightTv @@ -204,6 +205,10 @@ class TitleView(context: Context, attrs: AttributeSet) : RelativeLayout(context, } } + fun setExpireIconVisible(visible: Boolean) { + binding.expireIv.isVisible = visible + } + fun setUser(user: User, onClickListener: OnClickListener) { binding.titleTv.setName(user) binding.titleTv.setOnIconClickListener(onClickListener) diff --git a/app/src/main/java/one/mixin/android/widget/picker/TimeInterval.kt b/app/src/main/java/one/mixin/android/widget/picker/TimeInterval.kt index 9039c6fa90..9707930d69 100644 --- a/app/src/main/java/one/mixin/android/widget/picker/TimeInterval.kt +++ b/app/src/main/java/one/mixin/android/widget/picker/TimeInterval.kt @@ -4,23 +4,44 @@ import android.content.res.Resources import one.mixin.android.MixinApplication import one.mixin.android.R +const val INTERVAL_SECOND = 1L +const val INTERVAL_MINUTE = 60L +const val INTERVAL_HOUR = 3_600L +const val INTERVAL_DAY = 86_400L +const val INTERVAL_WEEK = 604_800L +const val INTERVAL_MONTH = 2_592_000L +const val INTERVAL_YEAR = 31_536_000L + val timeIntervalUnits by lazy { + listOf( + R.plurals.time_interval_unit_day, + R.plurals.time_interval_unit_week, + R.plurals.time_interval_unit_month, + R.plurals.time_interval_unit_year, + ) +} + +private val displayTimeIntervalUnits by lazy { listOf( R.plurals.time_interval_unit_second, R.plurals.time_interval_unit_minute, R.plurals.time_interval_unit_hour, R.plurals.time_interval_unit_day, R.plurals.time_interval_unit_week, + R.plurals.time_interval_unit_month, + R.plurals.time_interval_unit_year, ) } +private val pickerIntervals = listOf(INTERVAL_DAY, INTERVAL_WEEK, INTERVAL_MONTH, INTERVAL_YEAR) + private fun timeString( resources: Resources, count: Long, - index: Int, + unitRes: Int, ) = resources.getQuantityString( - timeIntervalUnits[index], + unitRes, count.toInt(), ) @@ -28,19 +49,18 @@ private fun intervalString( resources: Resources, interval: Long, unit: Long, - index: Int, + unitRes: Int, ): String { val count = interval / unit - return "$count ${timeString(resources, count, index)}" + return "$count ${timeString(resources, count, unitRes)}" } val numberList by lazy { listOf( - (1..59).map { it.toString() }.toList(), - (1..59).map { it.toString() }.toList(), - (1..23).map { it.toString() }.toList(), - (1..6).map { it.toString() }.toList(), - (1..12).map { it.toString() }.toList(), + (1..6).map { it.toString() }, + (1..3).map { it.toString() }, + (1..6).map { it.toString() }, + listOf("1"), ) } @@ -49,24 +69,40 @@ internal fun toTimeInterval( interval: Long, ): String = when { - interval < 60L -> intervalString(resources, interval, 1L, 0) - interval < 3600L -> intervalString(resources, interval, 60L, 1) - interval < 86400L -> intervalString(resources, interval, 3600L, 2) - interval < 604800L -> intervalString(resources, interval, 86400L, 3) - else -> intervalString(resources, interval, 604800L, 4) + interval > 0 && interval % INTERVAL_YEAR == 0L -> + intervalString(resources, interval, INTERVAL_YEAR, displayTimeIntervalUnits[6]) + interval >= INTERVAL_MONTH && interval % INTERVAL_MONTH == 0L -> + intervalString(resources, interval, INTERVAL_MONTH, displayTimeIntervalUnits[5]) + interval >= INTERVAL_WEEK && interval % INTERVAL_WEEK == 0L -> + intervalString(resources, interval, INTERVAL_WEEK, displayTimeIntervalUnits[4]) + interval >= INTERVAL_DAY && interval % INTERVAL_DAY == 0L -> + intervalString(resources, interval, INTERVAL_DAY, displayTimeIntervalUnits[3]) + interval >= INTERVAL_HOUR && interval % INTERVAL_HOUR == 0L -> + intervalString(resources, interval, INTERVAL_HOUR, displayTimeIntervalUnits[2]) + interval >= INTERVAL_MINUTE && interval % INTERVAL_MINUTE == 0L -> + intervalString(resources, interval, INTERVAL_MINUTE, displayTimeIntervalUnits[1]) + else -> + intervalString(resources, interval, INTERVAL_SECOND, displayTimeIntervalUnits[0]) } fun toTimeInterval(interval: Long): String = toTimeInterval(MixinApplication.get().resources, interval) -fun toTimeIntervalIndex(interval: Long): Pair = - when { - interval < 60L -> Pair(0, (interval / 1L).toInt() - 1) - interval < 3600L -> Pair(1, (interval / 60L).toInt() - 1) - interval < 86400L -> Pair(2, (interval / 3600L).toInt() - 1) - interval < 604800L -> Pair(3, (interval / 86400L).toInt() - 1) - else -> Pair(4, (interval / 604800L).toInt() - 1) +fun toTimeIntervalIndex(interval: Long): Pair { + pickerIntervals.forEachIndexed { index, unit -> + if (interval >= unit && interval % unit == 0L) { + val count = (interval / unit).toInt() + val max = numberList[index].size + if (count in 1..max) { + return Pair(index, count - 1) + } + } } + return Pair(0, 0) +} + +fun pickerIntervalSeconds(unitIndex: Int): Long = + pickerIntervals.getOrElse(unitIndex) { INTERVAL_DAY } fun Long?.getTimeInterval(): String { return when { diff --git a/app/src/main/java/one/mixin/android/widget/picker/TimeIntervalPicker.kt b/app/src/main/java/one/mixin/android/widget/picker/TimeIntervalPicker.kt index d2db2ff0a5..ebd7efa798 100644 --- a/app/src/main/java/one/mixin/android/widget/picker/TimeIntervalPicker.kt +++ b/app/src/main/java/one/mixin/android/widget/picker/TimeIntervalPicker.kt @@ -29,13 +29,9 @@ class TimeIntervalPicker : LinearLayout { } fun getTimeInterval(): Long { - return when (binding.unitPicker.currentItemPosition) { - 1 -> 60L - 2 -> 3600L - 3 -> 86400L - 4 -> 604800L - else -> 1L - } * numberList[binding.unitPicker.currentItemPosition][binding.numberPicker.currentItemPosition].toInt() + val unitIndex = binding.unitPicker.currentItemPosition + val numberIndex = binding.numberPicker.currentItemPosition + return pickerIntervalSeconds(unitIndex) * numberList[unitIndex][numberIndex].toInt() } fun initTimeInterval(timeInterval: Long?) { diff --git a/app/src/main/res/layout/fragment_disappearing.xml b/app/src/main/res/layout/fragment_disappearing.xml index e78c833188..951d15a1d3 100644 --- a/app/src/main/res/layout/fragment_disappearing.xml +++ b/app/src/main/res/layout/fragment_disappearing.xml @@ -113,7 +113,7 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginStart="@dimen/activity_horizontal_margin" - android:text="@string/disappearing_option_1" + android:text="@string/disappearing_option_4" android:textSize="16sp" tools:ignore="RelativeOverlap" /> @@ -155,7 +155,7 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginStart="@dimen/activity_horizontal_margin" - android:text="@string/disappearing_option_2" + android:text="@string/disappearing_option_5" android:textSize="16sp" tools:ignore="RelativeOverlap" /> @@ -197,7 +197,7 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginStart="@dimen/activity_horizontal_margin" - android:text="@string/disappearing_option_3" + android:text="@string/disappearing_option_month" android:textSize="16sp" tools:ignore="RelativeOverlap" /> @@ -224,92 +224,6 @@ android:visibility="gone" /> - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/app/src/main/res/layout/view_title.xml b/app/src/main/res/layout/view_title.xml index 004abb93f8..c3d486a960 100644 --- a/app/src/main/res/layout/view_title.xml +++ b/app/src/main/res/layout/view_title.xml @@ -93,16 +93,33 @@ android:layout_marginEnd="56dp" android:orientation="vertical"> - + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + semana semanas + + mes + meses + + + año + años + Base de datos de Mixin diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7881d17587..9b5a7590a3 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -330,12 +330,13 @@ Deshabilitar depuración web Desactivado Mensajes que desaparecen - Cuando está habilitado, los nuevos mensajes enviados y recibidos en este chat desaparecerán después de que se hayan visto, lee el documento para **obtener más información**. + Cuando está habilitado, los nuevos mensajes enviados y recibidos en este chat desaparecerán después de un cierto período de tiempo, lee el documento para **obtener más información**. 30 segundos 10 minutos 2 horas 1 día 1 semana + 1 mes DESECHAR Descartar como administrador diff --git a/app/src/main/res/values-in/arrays.xml b/app/src/main/res/values-in/arrays.xml index ea937fae6e..030c6e1693 100644 --- a/app/src/main/res/values-in/arrays.xml +++ b/app/src/main/res/values-in/arrays.xml @@ -32,6 +32,12 @@ minggu + + bulan + + + tahun + Database Mixin diff --git a/app/src/main/res/values-ja/arrays.xml b/app/src/main/res/values-ja/arrays.xml index 0e4a7f6f06..f79aed9650 100644 --- a/app/src/main/res/values-ja/arrays.xml +++ b/app/src/main/res/values-ja/arrays.xml @@ -33,6 +33,12 @@ + + か月 + + + + Mixin データベース diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 9730327234..3a6ba576d5 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -309,12 +309,13 @@ Disable webデバッグの無効化 無効ずみ 表示されないメッセージ - 有効にすると、このチャットで送受信された新しいメッセージは、見た後に消えます。詳しくは、こちらをお読みください。 + 有効にすると、このチャットで送受信された新しいメッセージは一定時間後に消えます。詳しくは、こちらをお読みください。 30秒 10分間 2時間 1日 1週間 + 1か月 破棄 管理者権限を解除 , diff --git a/app/src/main/res/values-ko/arrays.xml b/app/src/main/res/values-ko/arrays.xml index 35fca24b38..64a513712b 100644 --- a/app/src/main/res/values-ko/arrays.xml +++ b/app/src/main/res/values-ko/arrays.xml @@ -33,6 +33,12 @@ + + 개월 + + + + Mixin 데이터베이스 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 910ed756df..28ab8a7b73 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -383,13 +383,14 @@ 웹 디버그 비활성화 비활성화됨 사라지는 메시지 - 활성화하면 이 채팅에서 주고받은 새 메시지는 확인한 후 사라집니다. **자세히 알아보려면** 문서를 읽어보세요. + 활성화하면 이 채팅에서 주고받은 새 메시지는 일정 시간이 지나면 사라집니다. **자세히 알아보려면** 문서를 읽어보세요. https://support.mixin.one/en/article/how-to-enable-disappearing-messages-2nzaz8 30초 10분 2시간 1일 1주 + 1개월 삭제 관리자 권한 해제 , diff --git a/app/src/main/res/values-ms/arrays.xml b/app/src/main/res/values-ms/arrays.xml index b61f7faa3d..3bd94760f0 100644 --- a/app/src/main/res/values-ms/arrays.xml +++ b/app/src/main/res/values-ms/arrays.xml @@ -32,6 +32,12 @@ minggu + + bulan + + + tahun + Pangkalan Data Mixin diff --git a/app/src/main/res/values-ru/arrays.xml b/app/src/main/res/values-ru/arrays.xml index 1d4722a52b..6384a6f921 100644 --- a/app/src/main/res/values-ru/arrays.xml +++ b/app/src/main/res/values-ru/arrays.xml @@ -48,6 +48,18 @@ недель недели + + месяц + месяца + месяцев + месяца + + + год + года + лет + года + База данных Mixin diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index aa7b80dabd..18c9ab49e3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -316,12 +316,13 @@ Отключить веб-отладку Отключенный Исчезающие сообщения - Если эта функция включена, отправленные и полученные новые сообщения в этом чате исчезнут после того, как они будут просмотрены. Прочтите документ, чтобы **узнать больше** + Если эта функция включена, отправленные и полученные новые сообщения в этом чате исчезнут через определённый период времени. Прочтите документ, чтобы **узнать больше** 30 секунд 10 минут 2 часа 1 день 1 неделя + 1 месяц ОТКАЗАТЬСЯ Закрыть как администратор diff --git a/app/src/main/res/values-zh-rCN/arrays.xml b/app/src/main/res/values-zh-rCN/arrays.xml index 526aa0bd4e..338b9983a1 100644 --- a/app/src/main/res/values-zh-rCN/arrays.xml +++ b/app/src/main/res/values-zh-rCN/arrays.xml @@ -34,6 +34,12 @@ + + 个月 + + + + Mixin 数据库 diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9c38f1b42f..de59ab716b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -380,13 +380,14 @@ 已关闭 Web 调试 已停用 限时消息 - 启用后,在此聊天中发送和接收的新信息在被看到后会消失,阅读文档以**了解更多**。 + 启用后,在此聊天中发送和接收的新消息将在一段时间后消失,阅读文档以**了解更多**。 https://support.mixin.one/zh/article/5aac5l2v5bya5zcv6zmq5pe25rai5ogv77yf-18dzv5i 30 秒 10 分 2 小时 1 天 1 周 + 1 个月 放弃 撤销管理员身份 diff --git a/app/src/main/res/values-zh-rTW/arrays.xml b/app/src/main/res/values-zh-rTW/arrays.xml index eb9eed60a6..e6f1ac6fc9 100644 --- a/app/src/main/res/values-zh-rTW/arrays.xml +++ b/app/src/main/res/values-zh-rTW/arrays.xml @@ -33,6 +33,12 @@ + + 個月 + + + + Mixin 資料庫 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 0878f9ad97..7e89987805 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -311,12 +311,13 @@ 已關閉 Web 除錯 已停用 限時訊息 - 啟用後,在此聊天中傳送和接收的新資訊在被看到後會消失,閱讀檔案以**瞭解更多**。 + 啟用後,在此聊天中傳送和接收的新訊息將在一段時間後消失,閱讀檔案以**瞭解更多**。 30 秒 10 分 2 小時 1 天 1 週 + 1 個月 放棄 撤銷管理員身份 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 3db5854843..7a6d8aa5da 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -112,6 +112,14 @@ week weeks + + month + months + + + year + years + Mixin Database Pending Database diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fff76e95aa..ba9eb3b387 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -384,13 +384,14 @@ Disable web debug Disabled Disappearing Messages - When enabled, new messages sent and received in this chat will disappear after they have been seen, read the document to **learn more**. + When enabled, new messages sent and received in this chat will disappear after a certain period of time, read the document to **learn more**. https://support.mixin.one/en/article/how-to-enable-disappearing-messages-2nzaz8 30 seconds 10 minutes 2 hours 1 day 1 week + 1 month DISCARD Dismiss as Admin