Skip to content

Commit

Permalink
Merge tag 'v6.27.10' into molly-6.27
Browse files Browse the repository at this point in the history
  • Loading branch information
valldrac committed Aug 4, 2023
2 parents f54f9a7 + c82ed47 commit 3a12765
Show file tree
Hide file tree
Showing 545 changed files with 33,476 additions and 22,082 deletions.
6 changes: 3 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ ext {
MAPS_API_KEY = getEnv('CI_MAPS_API_KEY') ?: mapsApiKey
}

def canonicalVersionCode = 1289
def canonicalVersionName = "6.25.5"
def canonicalVersionCode = 1304
def canonicalVersionName = "6.27.10"
def mollyRevision = 0

def postFixSize = 100
Expand Down Expand Up @@ -234,7 +234,7 @@ android {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
}

resConfigs autoResConfig()
resourceConfigurations += []

bundle {
language {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,11 @@ import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.mock
import org.signal.core.util.ThreadUtil
import org.signal.libsignal.protocol.state.SignedPreKeyRecord
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.dependencies.InstrumentationApplicationDependencyProvider
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.pin.KbsRepository
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.registration.VerifyAccountRepository
import org.thoughtcrime.securesms.registration.VerifyResponseProcessor
Expand Down Expand Up @@ -48,20 +46,17 @@ class ChangeNumberViewModelTest {
val harness = SignalActivityRule()

private lateinit var viewModel: ChangeNumberViewModel
private lateinit var kbsRepository: KbsRepository

@Before
fun setUp() {
ApplicationDependencies.getSignalServiceAccountManager().setSoTimeoutMillis(1000)
kbsRepository = mock()
ThreadUtil.runOnMainSync {
viewModel = ChangeNumberViewModel(
localNumber = harness.self.requireE164(),
changeNumberRepository = ChangeNumberRepository(),
savedState = SavedStateHandle(),
password = SignalStore.account().servicePassword!!,
verifyAccountRepository = VerifyAccountRepository(harness.application),
kbsRepository = kbsRepository
verifyAccountRepository = VerifyAccountRepository(harness.application)
)

viewModel.setNewCountry(1)
Expand Down Expand Up @@ -235,7 +230,7 @@ class ChangeNumberViewModelTest {
lateinit var changeNumberRequest: ChangePhoneNumberRequest
lateinit var setPreKeysRequest: PreKeyState

MockProvider.mockGetRegistrationLockStringFlow(kbsRepository)
MockProvider.mockGetRegistrationLockStringFlow()

InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers(
Post("/v1/verification/session") { MockResponse().success(MockProvider.sessionMetadataJson.copy(verified = false)) },
Expand Down Expand Up @@ -323,7 +318,7 @@ class ChangeNumberViewModelTest {
lateinit var changeNumberRequest: ChangePhoneNumberRequest
lateinit var setPreKeysRequest: PreKeyState

MockProvider.mockGetRegistrationLockStringFlow(kbsRepository)
MockProvider.mockGetRegistrationLockStringFlow()

InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers(
Post("/v1/verification/session") { MockResponse().success(MockProvider.sessionMetadataJson.copy(verified = false)) },
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,324 @@
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/

package org.thoughtcrime.securesms.conversation.v2.items

import android.net.Uri
import android.view.View
import androidx.lifecycle.Observer
import org.junit.Assert.assertEquals
import org.junit.Rule
import org.junit.Test
import org.signal.ringrtc.CallLinkRootKey
import org.thoughtcrime.securesms.components.voice.VoiceNotePlaybackState
import org.thoughtcrime.securesms.contactshare.Contact
import org.thoughtcrime.securesms.conversation.ConversationAdapter
import org.thoughtcrime.securesms.conversation.ConversationItem
import org.thoughtcrime.securesms.conversation.ConversationItemDisplayMode
import org.thoughtcrime.securesms.conversation.ConversationMessage
import org.thoughtcrime.securesms.conversation.colors.Colorizer
import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart
import org.thoughtcrime.securesms.database.FakeMessageRecords
import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord
import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
import org.thoughtcrime.securesms.groups.GroupId
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange
import org.thoughtcrime.securesms.linkpreview.LinkPreview
import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.stickers.StickerLocator
import org.thoughtcrime.securesms.testing.SignalActivityRule
import kotlin.time.Duration.Companion.minutes

class V2ConversationItemShapeTest {

@get:Rule
val harness = SignalActivityRule(othersCount = 10)

@Test
fun givenNextAndPreviousMessageDoNotExist_whenISetMessageShape_thenIExpectSingle() {
val testSubject = V2ConversationItemShape(FakeConversationContext())

val expected = V2ConversationItemShape.MessageShape.SINGLE
val actual = testSubject.setMessageShape(
isLtr = true,
currentMessage = getMessageRecord(),
isGroupThread = false,
adapterPosition = 5
)

assertEquals(expected, actual)
}

@Test
fun givenPreviousWithinTimeoutAndNoNext_whenISetMessageShape_thenIExpectEnd() {
val now = System.currentTimeMillis()
val prev = now - 2.minutes.inWholeMilliseconds

val testSubject = V2ConversationItemShape(
FakeConversationContext(
previousMessage = getMessageRecord(prev)
)
)

val expected = V2ConversationItemShape.MessageShape.END
val actual = testSubject.setMessageShape(
isLtr = true,
currentMessage = getMessageRecord(now),
isGroupThread = false,
adapterPosition = 5
)

assertEquals(expected, actual)
}

@Test
fun givenNextWithinTimeoutAndNoPrevious_whenISetMessageShape_thenIExpectStart() {
val now = System.currentTimeMillis()
val prev = now - 2.minutes.inWholeMilliseconds

val testSubject = V2ConversationItemShape(
FakeConversationContext(
nextMessage = getMessageRecord(now)
)
)

val expected = V2ConversationItemShape.MessageShape.START
val actual = testSubject.setMessageShape(
isLtr = true,
currentMessage = getMessageRecord(prev),
isGroupThread = false,
adapterPosition = 5
)

assertEquals(expected, actual)
}

@Test
fun givenPreviousAndNextWithinTimeout_whenISetMessageShape_thenIExpectMiddle() {
val now = System.currentTimeMillis()
val prev = now - 2.minutes.inWholeMilliseconds
val next = now + 2.minutes.inWholeMilliseconds

val testSubject = V2ConversationItemShape(
FakeConversationContext(
previousMessage = getMessageRecord(prev),
nextMessage = getMessageRecord(next)
)
)

val expected = V2ConversationItemShape.MessageShape.MIDDLE
val actual = testSubject.setMessageShape(
isLtr = true,
currentMessage = getMessageRecord(now),
isGroupThread = false,
adapterPosition = 5
)

assertEquals(expected, actual)
}

@Test
fun givenPreviousOutsideTimeoutAndNoNext_whenISetMessageShape_thenIExpectSingle() {
val now = System.currentTimeMillis()
val prev = now - 4.minutes.inWholeMilliseconds

val testSubject = V2ConversationItemShape(
FakeConversationContext(
previousMessage = getMessageRecord(prev)
)
)

val expected = V2ConversationItemShape.MessageShape.SINGLE
val actual = testSubject.setMessageShape(
isLtr = true,
currentMessage = getMessageRecord(now),
isGroupThread = false,
adapterPosition = 5
)

assertEquals(expected, actual)
}

@Test
fun givenNextOutsideTimeoutAndNoPrevious_whenISetMessageShape_thenIExpectSingle() {
val now = System.currentTimeMillis()
val prev = now - 4.minutes.inWholeMilliseconds

val testSubject = V2ConversationItemShape(
FakeConversationContext(
nextMessage = getMessageRecord(now)
)
)

val expected = V2ConversationItemShape.MessageShape.SINGLE
val actual = testSubject.setMessageShape(
isLtr = true,
currentMessage = getMessageRecord(prev),
isGroupThread = false,
adapterPosition = 5
)

assertEquals(expected, actual)
}

@Test
fun givenPreviousAndNextOutsideTimeout_whenISetMessageShape_thenIExpectSingle() {
val now = System.currentTimeMillis()
val prev = now - 4.minutes.inWholeMilliseconds
val next = now + 4.minutes.inWholeMilliseconds

val testSubject = V2ConversationItemShape(
FakeConversationContext(
previousMessage = getMessageRecord(prev),
nextMessage = getMessageRecord(next)
)
)

val expected = V2ConversationItemShape.MessageShape.SINGLE
val actual = testSubject.setMessageShape(
isLtr = true,
currentMessage = getMessageRecord(now),
isGroupThread = false,
adapterPosition = 5
)

assertEquals(expected, actual)
}

private fun getMessageRecord(
timestamp: Long = System.currentTimeMillis()
): MessageRecord {
return FakeMessageRecords.buildMediaMmsMessageRecord(
dateReceived = timestamp,
dateSent = timestamp,
dateServer = timestamp
)
}

private class FakeConversationContext(
private val hasWallpaper: Boolean = false,
private val previousMessage: MessageRecord? = null,
private val nextMessage: MessageRecord? = null
) : V2ConversationContext {

private val colorizer = Colorizer()

override val displayMode: ConversationItemDisplayMode = ConversationItemDisplayMode.STANDARD

override val clickListener: ConversationAdapter.ItemClickListener = FakeConversationItemClickListener
override val selectedItems: Set<MultiselectPart> = emptySet()
override val isMessageRequestAccepted: Boolean = true
override val searchQuery: String? = null

override fun onStartExpirationTimeout(messageRecord: MessageRecord) = Unit

override fun hasWallpaper(): Boolean = hasWallpaper

override fun getColorizer(): Colorizer = colorizer

override fun getNextMessage(adapterPosition: Int): MessageRecord? = nextMessage

override fun getPreviousMessage(adapterPosition: Int): MessageRecord? = previousMessage
}

private object FakeConversationItemClickListener : ConversationAdapter.ItemClickListener {
override fun onQuoteClicked(messageRecord: MmsMessageRecord?) = Unit

override fun onLinkPreviewClicked(linkPreview: LinkPreview) = Unit

override fun onQuotedIndicatorClicked(messageRecord: MessageRecord) = Unit

override fun onMoreTextClicked(conversationRecipientId: RecipientId, messageId: Long, isMms: Boolean) = Unit

override fun onStickerClicked(stickerLocator: StickerLocator) = Unit

override fun onViewOnceMessageClicked(messageRecord: MmsMessageRecord) = Unit

override fun onSharedContactDetailsClicked(contact: Contact, avatarTransitionView: View) = Unit

override fun onAddToContactsClicked(contact: Contact) = Unit

override fun onMessageSharedContactClicked(choices: MutableList<Recipient>) = Unit

override fun onInviteSharedContactClicked(choices: MutableList<Recipient>) = Unit

override fun onReactionClicked(multiselectPart: MultiselectPart, messageId: Long, isMms: Boolean) = Unit

override fun onGroupMemberClicked(recipientId: RecipientId, groupId: GroupId) = Unit

override fun onMessageWithErrorClicked(messageRecord: MessageRecord) = Unit

override fun onMessageWithRecaptchaNeededClicked(messageRecord: MessageRecord) = Unit

override fun onIncomingIdentityMismatchClicked(recipientId: RecipientId) = Unit

override fun onRegisterVoiceNoteCallbacks(onPlaybackStartObserver: Observer<VoiceNotePlaybackState>) = Unit

override fun onUnregisterVoiceNoteCallbacks(onPlaybackStartObserver: Observer<VoiceNotePlaybackState>) = Unit

override fun onVoiceNotePause(uri: Uri) = Unit

override fun onVoiceNotePlay(uri: Uri, messageId: Long, position: Double) = Unit

override fun onVoiceNoteSeekTo(uri: Uri, position: Double) = Unit

override fun onVoiceNotePlaybackSpeedChanged(uri: Uri, speed: Float) = Unit

override fun onGroupMigrationLearnMoreClicked(membershipChange: GroupMigrationMembershipChange) = Unit

override fun onChatSessionRefreshLearnMoreClicked() = Unit

override fun onBadDecryptLearnMoreClicked(author: RecipientId) = Unit

override fun onSafetyNumberLearnMoreClicked(recipient: Recipient) = Unit

override fun onJoinGroupCallClicked() = Unit

override fun onInviteFriendsToGroupClicked(groupId: GroupId.V2) = Unit

override fun onEnableCallNotificationsClicked() = Unit

override fun onPlayInlineContent(conversationMessage: ConversationMessage?) = Unit

override fun onInMemoryMessageClicked(messageRecord: InMemoryMessageRecord) = Unit

override fun onViewGroupDescriptionChange(groupId: GroupId?, description: String, isMessageRequestAccepted: Boolean) = Unit

override fun onChangeNumberUpdateContact(recipient: Recipient) = Unit

override fun onCallToAction(action: String) = Unit

override fun onDonateClicked() = Unit

override fun onBlockJoinRequest(recipient: Recipient) = Unit

override fun onRecipientNameClicked(target: RecipientId) = Unit

override fun onInviteToSignalClicked() = Unit

override fun onActivatePaymentsClicked() = Unit

override fun onSendPaymentClicked(recipientId: RecipientId) = Unit

override fun onScheduledIndicatorClicked(view: View, conversationMessage: ConversationMessage) = Unit

override fun onUrlClicked(url: String): Boolean = false

override fun goToMediaPreview(parent: ConversationItem?, sharedElement: View?, args: MediaIntentFactory.MediaPreviewArgs?) = Unit

override fun onEditedIndicatorClicked(messageRecord: MessageRecord) = Unit

override fun onShowGroupDescriptionClicked(groupName: String, description: String, shouldLinkifyWebLinks: Boolean) = Unit

override fun onJoinCallLink(callLinkRootKey: CallLinkRootKey) = Unit

override fun onItemClick(item: MultiselectPart?) = Unit

override fun onItemLongClick(itemView: View?, item: MultiselectPart?) = Unit
}
}
Loading

0 comments on commit 3a12765

Please sign in to comment.