Skip to content

Commit 64b41f7

Browse files
authored
Merge pull request #756 from salemove/release/2.1.1
Release 2.1.1
2 parents 864f2fc + 38fc298 commit 64b41f7

18 files changed

+793
-9
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ ext {
7575
mockitoVersion = '5.1.1'
7676
mockitoKotlinVersion = '4.1.0'
7777
mockitoAndroidTestVersion = '4.3.1'
78+
mockkVersion = '1.13.7'
7879
archCoreVersion = '2.1.0'
7980
testRulesVersion = '1.5.0'
8081
robolectricVersion = '4.9.2'

version.properties

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#Mon Sep 04 15:11:36 UTC 2023
2-
dependency.coreSdk.version=1.1.0
3-
widgets.versionCode=68
4-
widgets.versionName=2.1.0
1+
#Wed Sep 06 16:08:35 UTC 2023
2+
dependency.coreSdk.version=1.1.1
3+
widgets.versionCode=69
4+
widgets.versionName=2.1.1

widgetssdk/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ dependencies {
9797
testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
9898
testImplementation "androidx.arch.core:core-testing:$archCoreVersion"
9999
testImplementation "org.robolectric:robolectric:$robolectricVersion"
100+
testImplementation "io.mockk:mockk-android:${mockkVersion}"
101+
testImplementation "io.mockk:mockk-agent:${mockkVersion}"
100102
androidTestImplementation "org.mockito:mockito-android:$mockitoAndroidTestVersion"
101103
androidTestImplementation "androidx.test.ext:junit:$androidXTestVersion"
102104
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"

widgetssdk/src/main/java/com/glia/widgets/chat/ChatView.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import android.view.View
2020
import android.view.accessibility.AccessibilityEvent
2121
import android.widget.Toast
2222
import androidx.annotation.StringRes
23+
import androidx.annotation.VisibleForTesting
2324
import androidx.appcompat.app.AlertDialog
2425
import androidx.constraintlayout.widget.ConstraintLayout
2526
import androidx.core.app.ActivityOptionsCompat
@@ -101,6 +102,7 @@ import com.google.android.material.shape.MarkerEdgeTreatment
101102
import com.google.android.material.theme.overlay.MaterialThemeOverlay
102103
import java.io.File
103104
import java.io.IOException
105+
import java.util.concurrent.Executor
104106
import kotlin.properties.Delegates
105107

106108
class ChatView(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) :
@@ -1302,6 +1304,14 @@ class ChatView(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defSty
13021304
chatRecyclerView.updatePadding(bottom = dialogHeight)
13031305
chatRecyclerView.scrollBy(0, dialogHeight)
13041306
groupChatControls.isGone = true
1307+
operatorTypingAnimationView.isGone = true
13051308
}
13061309
}
1310+
1311+
@VisibleForTesting
1312+
internal var executor: Executor? = null
1313+
1314+
override fun post(action: Runnable?): Boolean {
1315+
return executor?.execute(action)?.let { true } ?: super.post(action)
1316+
}
13071317
}

widgetssdk/src/main/java/com/glia/widgets/di/Dependencies.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@ public static void setControllerFactory(ControllerFactory controllerFactory) {
136136
Dependencies.controllerFactory = controllerFactory;
137137
}
138138

139+
@VisibleForTesting
140+
public static void setUseCaseFactory(UseCaseFactory useCaseFactory) {
141+
Dependencies.useCaseFactory = useCaseFactory;
142+
}
143+
139144
public static GliaCore glia() {
140145
return gliaCore;
141146
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package com.glia.widgets.view.unifiedui.theme
22

3+
import androidx.annotation.VisibleForTesting
34
import com.glia.widgets.view.unifiedui.parse.RemoteConfigurationParser
45

56
internal class UnifiedThemeManager {
67
private val parser: RemoteConfigurationParser by lazy { RemoteConfigurationParser() }
78

8-
private var _theme: UnifiedTheme? = null
9-
val theme: UnifiedTheme?
10-
get() = _theme
9+
@VisibleForTesting
10+
internal var theme: UnifiedTheme? = null
1111

1212
fun applyJsonConfig(jsonConfig: String?) {
13-
_theme = jsonConfig?.let(parser::parseRemoteConfiguration)?.toUnifiedTheme()
13+
theme = jsonConfig?.let(parser::parseRemoteConfiguration)?.toUnifiedTheme()
1414
}
1515
}

widgetssdk/src/main/res/layout/chat_view.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,6 @@
163163
android:id="@+id/group_chat_controls"
164164
android:layout_width="wrap_content"
165165
android:layout_height="wrap_content"
166-
app:constraint_referenced_ids="operator_typing_animation_view, divider_view, add_attachment_queue, chat_message_layout" />
166+
app:constraint_referenced_ids="divider_view, add_attachment_queue, chat_message_layout" />
167167

168168
</merge>
Loading
Loading
Loading
Loading
Loading
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.glia.widgets.chat
2+
3+
import com.glia.widgets.SnapshotTest
4+
import com.glia.widgets.chat.model.ChatState
5+
import com.glia.widgets.chat.model.GvaButton
6+
import com.glia.widgets.snapshotutils.SnapshotChatView
7+
import com.glia.widgets.snapshotutils.SnapshotGva
8+
import org.junit.Test
9+
10+
internal class ChatViewQuickReplySnapshotTest : SnapshotTest(), SnapshotChatView, SnapshotGva {
11+
12+
override val chatViewMock = SnapshotChatView.Mock(this)
13+
14+
override fun setUp() {
15+
super.setUp()
16+
chatViewMock.setUp()
17+
}
18+
19+
override fun tearDown() {
20+
chatViewMock.tearDown()
21+
super.tearDown()
22+
}
23+
24+
private fun gvaButtons() = shortLengthTexts().map { GvaButton(it) }
25+
26+
private fun chatState() = ChatState()
27+
.changeVisibility(true)
28+
.copy(gvaQuickReplies = gvaButtons())
29+
30+
@Test
31+
fun defaultTheme() {
32+
snapshot(
33+
setupView(
34+
chatState = chatState()
35+
).root
36+
)
37+
}
38+
39+
@Test
40+
fun withUiTheme() {
41+
snapshot(
42+
setupView(
43+
chatState = chatState(),
44+
uiTheme = uiTheme()
45+
).root
46+
)
47+
}
48+
49+
@Test
50+
fun withGlobalColors() {
51+
snapshot(
52+
setupView(
53+
chatState = chatState(),
54+
unifiedTheme = unifiedThemeWithGlobalColors()
55+
).root
56+
)
57+
}
58+
59+
@Test
60+
fun withWithUnifiedTheme() {
61+
snapshot(
62+
setupView(
63+
chatState = chatState(),
64+
unifiedTheme = unifiedTheme()
65+
).root
66+
)
67+
}
68+
69+
@Test
70+
fun withWithUnifiedThemeWithoutGva() {
71+
snapshot(
72+
setupView(
73+
chatState = chatState(),
74+
unifiedTheme = unifiedThemeWithoutGva()
75+
).root
76+
)
77+
}
78+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.glia.widgets.chat
2+
3+
import com.glia.widgets.SnapshotTest
4+
import com.glia.widgets.chat.model.ChatState
5+
import com.glia.widgets.snapshotutils.SnapshotChatView
6+
import org.junit.Test
7+
8+
internal class ChatViewSnapshotTest : SnapshotTest(), SnapshotChatView {
9+
10+
override val chatViewMock = SnapshotChatView.Mock(this)
11+
12+
override fun setUp() {
13+
super.setUp()
14+
chatViewMock.setUp()
15+
}
16+
17+
@Test
18+
fun initialState() {
19+
snapshot(
20+
setupView(
21+
chatState = ChatState()
22+
).root
23+
)
24+
}
25+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.glia.widgets.snapshotutils
2+
3+
import android.app.Activity
4+
import android.content.Context
5+
import android.view.View
6+
import android.view.Window
7+
import androidx.core.graphics.toColorInt
8+
import com.glia.widgets.UiTheme
9+
import com.glia.widgets.chat.ChatView
10+
import com.glia.widgets.chat.ChatViewCallback
11+
import com.glia.widgets.chat.controller.ChatController
12+
import com.glia.widgets.chat.model.ChatItem
13+
import com.glia.widgets.chat.model.ChatState
14+
import com.glia.widgets.core.fileupload.model.FileAttachment
15+
import com.glia.widgets.databinding.ChatActivityBinding
16+
import com.glia.widgets.di.ControllerFactory
17+
import com.glia.widgets.di.Dependencies
18+
import com.glia.widgets.di.UseCaseFactory
19+
import com.glia.widgets.filepreview.domain.usecase.GetImageFileFromCacheUseCase
20+
import com.glia.widgets.filepreview.domain.usecase.GetImageFileFromDownloadsUseCase
21+
import com.glia.widgets.filepreview.domain.usecase.GetImageFileFromNetworkUseCase
22+
import com.glia.widgets.helper.ResourceProvider
23+
import com.glia.widgets.helper.requireActivity
24+
import com.glia.widgets.view.unifiedui.theme.UnifiedTheme
25+
import io.mockk.every
26+
import io.mockk.mockkStatic
27+
import org.mockito.ArgumentCaptor
28+
import org.mockito.kotlin.mock
29+
import org.mockito.kotlin.whenever
30+
import java.util.concurrent.Executor
31+
32+
internal interface SnapshotChatView : SnapshotContent {
33+
val chatViewMock: Mock
34+
35+
class Mock(private val snapshotContent: SnapshotContent) {
36+
lateinit var activityMock: Activity
37+
lateinit var windowMock: Window
38+
39+
lateinit var controllerFactoryMock: ControllerFactory
40+
lateinit var chatControllerMock: ChatController
41+
42+
lateinit var useCaseFactoryMock: UseCaseFactory
43+
lateinit var getImageFileFromCacheUseCaseMock: GetImageFileFromCacheUseCase
44+
lateinit var getImageFileFromDownloadsUseCaseMock: GetImageFileFromDownloadsUseCase
45+
lateinit var getImageFileFromNetworkUseCaseMock: GetImageFileFromNetworkUseCase
46+
47+
lateinit var chatViewCallbackCaptor: ArgumentCaptor<ChatViewCallback>
48+
49+
fun setUp(statusBarColor: Int = "#123456".toColorInt()) {
50+
activityMock = mock()
51+
windowMock = mock()
52+
whenever(activityMock.window).thenReturn(windowMock)
53+
whenever(windowMock.statusBarColor).thenReturn(statusBarColor)
54+
mockkStatic("com.glia.widgets.helper.ContextExtensionsKt")
55+
every { any<Context>().requireActivity() } returns activityMock
56+
57+
chatViewCallbackCaptor = ArgumentCaptor.forClass(ChatViewCallback::class.java)
58+
chatControllerMock = mock()
59+
controllerFactoryMock = mock()
60+
whenever(controllerFactoryMock.getChatController(chatViewCallbackCaptor.capture())).thenReturn(chatControllerMock)
61+
62+
getImageFileFromCacheUseCaseMock = mock()
63+
getImageFileFromDownloadsUseCaseMock = mock()
64+
getImageFileFromNetworkUseCaseMock = mock()
65+
useCaseFactoryMock = mock()
66+
whenever(useCaseFactoryMock.createGetImageFileFromCacheUseCase()).thenReturn(getImageFileFromCacheUseCaseMock)
67+
whenever(useCaseFactoryMock.createGetImageFileFromDownloadsUseCase()).thenReturn(getImageFileFromDownloadsUseCaseMock)
68+
whenever(useCaseFactoryMock.createGetImageFileFromNetworkUseCase()).thenReturn(getImageFileFromNetworkUseCaseMock)
69+
70+
Dependencies.setControllerFactory(controllerFactoryMock)
71+
Dependencies.setUseCaseFactory(useCaseFactoryMock)
72+
Dependencies.setResourceProvider(ResourceProvider(snapshotContent.context))
73+
}
74+
75+
fun tearDown() {
76+
Dependencies.getGliaThemeManager().theme = null
77+
}
78+
}
79+
80+
data class ViewData(
81+
val root: View,
82+
val chatView: ChatView
83+
)
84+
85+
fun setupView(
86+
chatState: ChatState? = null,
87+
chatItems: List<ChatItem>? = null,
88+
fileAttachments: List<FileAttachment>? = null,
89+
executor: Executor? = Executor(Runnable::run),
90+
unifiedTheme: UnifiedTheme? = null,
91+
uiTheme: UiTheme? = null,
92+
callback: ((ChatViewCallback) -> Unit)? = null
93+
): ViewData {
94+
unifiedTheme?.let { Dependencies.getGliaThemeManager().theme = it }
95+
96+
val chatActivityBinding = ChatActivityBinding.inflate(layoutInflater)
97+
val root = chatActivityBinding.root
98+
val chatView = chatActivityBinding.chatView
99+
100+
chatView.setUiTheme(uiTheme)
101+
102+
chatView.executor = executor
103+
104+
val chatViewCallback = chatViewMock.chatViewCallbackCaptor.value
105+
chatState?.let { chatViewCallback.emitState(it) }
106+
chatItems?.let { chatViewCallback.emitItems(it) }
107+
fileAttachments?.let { chatViewCallback.emitUploadAttachments(it) }
108+
callback?.invoke(chatViewCallback)
109+
110+
return ViewData(root, chatView)
111+
}
112+
}

widgetssdk/src/testSnapshot/java/com/glia/widgets/snapshotutils/SnapshotStrings.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,8 @@ interface SnapshotStrings {
99
"In pulvinar id turpis ut interdum",
1010
"Sed quis ex nisl vestibulum risus"
1111
)
12+
13+
fun shortLengthTexts() = listOf(
14+
"Maecenas dolor", "Dignissim", "Vestibulum risus", "Ut posuere", "Interdum", "Sed quis ex nisl"
15+
)
1216
}

0 commit comments

Comments
 (0)