From 4a59663fa04104734bae286f311196509609de08 Mon Sep 17 00:00:00 2001 From: Andrii Horishnii Date: Wed, 7 Aug 2024 22:59:43 +0300 Subject: [PATCH] Update dialog buttons localizations MOB-3463 --- .../com/glia/widgets/call/CallController.kt | 12 ++- .../controller/CallVisualizerController.kt | 12 ++- .../widgets/chat/controller/ChatController.kt | 10 ++- .../domain/ConfirmationDialogLinksUseCase.kt | 22 ++--- .../dialog/model/ConfirmationDialogLinks.kt | 6 +- .../glia/widgets/di/ControllerFactory.java | 9 +- .../com/glia/widgets/di/UseCaseFactory.java | 9 +- .../com/glia/widgets/helper/ViewExtensions.kt | 4 +- .../com/glia/widgets/locale/LocaleProvider.kt | 9 +- .../java/com/glia/widgets/view/Dialogs.kt | 4 +- .../widgets/view/dialog/base/DialogPayload.kt | 9 +- .../view/dialog/base/DialogViewInflater.kt | 25 ++++-- .../ConfirmationDialogViewInflater.kt | 4 +- .../domain/GetUrlFromLinkUseCase.kt | 20 +++++ .../CallVisualizerActivityWatcherTest.kt | 12 +-- .../CallVisualizerControllerTest.kt | 17 +++- .../chat/controller/ChatControllerTest.kt | 6 +- .../ConfirmationDialogLinksUseCaseTest.kt | 87 ------------------- .../domain/GetUrlFromLinkUseCaseTest.kt | 40 +++++++++ .../java/com/glia/widgets/SnapshotTest.kt | 7 +- .../widgets/dialog/ConfirmationDialogTest.kt | 35 +++++--- .../widgets/snapshotutils/SnapshotDialog.kt | 13 +++ .../snapshotutils/SnapshotProviders.kt | 4 +- .../src/testSnapshot/res/values/strings.xml | 2 + 24 files changed, 217 insertions(+), 161 deletions(-) create mode 100644 widgetssdk/src/main/java/com/glia/widgets/webbrowser/domain/GetUrlFromLinkUseCase.kt delete mode 100644 widgetssdk/src/test/java/com/glia/widgets/core/dialog/domain/ConfirmationDialogLinksUseCaseTest.kt create mode 100644 widgetssdk/src/test/java/com/glia/widgets/webbrowser/domain/GetUrlFromLinkUseCaseTest.kt diff --git a/widgetssdk/src/main/java/com/glia/widgets/call/CallController.kt b/widgetssdk/src/main/java/com/glia/widgets/call/CallController.kt index e6143765e..8f71b7d15 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/call/CallController.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/call/CallController.kt @@ -43,7 +43,9 @@ import com.glia.widgets.engagement.domain.ScreenSharingUseCase import com.glia.widgets.engagement.domain.ToggleVisitorAudioMediaStateUseCase import com.glia.widgets.engagement.domain.ToggleVisitorVideoMediaStateUseCase import com.glia.widgets.engagement.domain.VisitorMediaUseCase +import com.glia.widgets.helper.Logger import com.glia.widgets.helper.Logger.d +import com.glia.widgets.helper.TAG import com.glia.widgets.helper.TimeCounter import com.glia.widgets.helper.TimeCounter.FormattedTimerStatusListener import com.glia.widgets.helper.TimeCounter.RawTimerStatusListener @@ -53,6 +55,7 @@ import com.glia.widgets.view.MessagesNotSeenHandler import com.glia.widgets.view.MessagesNotSeenHandler.MessagesNotSeenHandlerListener import com.glia.widgets.view.MinimizeHandler import com.glia.widgets.view.floatingvisitorvideoview.FloatingVisitorVideoContract +import com.glia.widgets.webbrowser.domain.GetUrlFromLinkUseCase import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.disposables.CompositeDisposable import java.util.Optional @@ -92,7 +95,8 @@ internal class CallController( private val isQueueingOrEngagementUseCase: IsQueueingOrEngagementUseCase, private val enqueueForEngagementUseCase: EnqueueForEngagementUseCase, private val decideOnQueueingUseCase: DecideOnQueueingUseCase, - private val screenSharingUseCase: ScreenSharingUseCase + private val screenSharingUseCase: ScreenSharingUseCase, + private val getUrlFromLinkUseCase: GetUrlFromLinkUseCase ) : CallContract.Controller { private val disposable = CompositeDisposable() private val mediaUpgradeDisposable = CompositeDisposable() @@ -257,7 +261,11 @@ internal class CallController( override fun onLinkClicked(link: Link) { d(TAG, "onLinkClicked") - view?.navigateToWebBrowserActivity(link.title, link.url) + getUrlFromLinkUseCase(link)?.let { + view?.navigateToWebBrowserActivity(link.title, it) + } ?: run { + Logger.e(TAG, "The URL is missing after the confirmation dialog link is clicked") + } } override fun onLiveObservationDialogAllowed() { diff --git a/widgetssdk/src/main/java/com/glia/widgets/callvisualizer/controller/CallVisualizerController.kt b/widgetssdk/src/main/java/com/glia/widgets/callvisualizer/controller/CallVisualizerController.kt index fe3ac442b..0c27f80ea 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/callvisualizer/controller/CallVisualizerController.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/callvisualizer/controller/CallVisualizerController.kt @@ -9,9 +9,12 @@ import com.glia.widgets.core.dialog.model.Link import com.glia.widgets.core.engagement.domain.ConfirmationDialogUseCase import com.glia.widgets.engagement.domain.EngagementRequestUseCase import com.glia.widgets.engagement.domain.EngagementStateUseCase +import com.glia.widgets.helper.Logger import com.glia.widgets.helper.OneTimeEvent +import com.glia.widgets.helper.TAG import com.glia.widgets.helper.asOneTimeStateFlowable import com.glia.widgets.helper.unSafeSubscribe +import com.glia.widgets.webbrowser.domain.GetUrlFromLinkUseCase import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.processors.PublishProcessor import com.glia.widgets.engagement.State as EngagementState @@ -46,7 +49,8 @@ internal class CallVisualizerController( private val confirmationDialogUseCase: ConfirmationDialogUseCase, private val engagementRequestUseCase: EngagementRequestUseCase, private val engagementStateUseCase: EngagementStateUseCase, - private val confirmationDialogLinksUseCase: ConfirmationDialogLinksUseCase + private val confirmationDialogLinksUseCase: ConfirmationDialogLinksUseCase, + private val getUrlFromLinkUseCase: GetUrlFromLinkUseCase ) : CallVisualizerContract.Controller { private val _state: PublishProcessor = PublishProcessor.create() @@ -100,7 +104,11 @@ internal class CallVisualizerController( override fun onLinkClicked(link: Link) { dialogController.dismissCurrentDialog() - _state.onNext(CallVisualizerContract.State.OpenWebBrowserScreen(link.title, link.url)) + getUrlFromLinkUseCase(link)?.let { + _state.onNext(CallVisualizerContract.State.OpenWebBrowserScreen(link.title, it)) + } ?: run { + Logger.e(TAG, "The URL is missing after the confirmation dialog link is clicked") + } } override fun onEngagementConfirmationDialogAllowed() { diff --git a/widgetssdk/src/main/java/com/glia/widgets/chat/controller/ChatController.kt b/widgetssdk/src/main/java/com/glia/widgets/chat/controller/ChatController.kt index ca98a67bc..d0faf28e6 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/chat/controller/ChatController.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/chat/controller/ChatController.kt @@ -80,6 +80,7 @@ import com.glia.widgets.helper.isValid import com.glia.widgets.helper.unSafeSubscribe import com.glia.widgets.view.MessagesNotSeenHandler import com.glia.widgets.view.MinimizeHandler +import com.glia.widgets.webbrowser.domain.GetUrlFromLinkUseCase import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.schedulers.Schedulers @@ -130,7 +131,8 @@ internal class ChatController( private val withCameraPermissionUseCase: WithCameraPermissionUseCase, private val withReadWritePermissionsUseCase: WithReadWritePermissionsUseCase, private val requestNotificationPermissionIfPushNotificationsSetUpUseCase: RequestNotificationPermissionIfPushNotificationsSetUpUseCase, - private val releaseResourcesUseCase: ReleaseResourcesUseCase + private val releaseResourcesUseCase: ReleaseResourcesUseCase, + private val getUrlFromLinkUseCase: GetUrlFromLinkUseCase ) : ChatContract.Controller { private var backClickedListener: ChatView.OnBackClickedListener? = null private var view: ChatContract.View? = null @@ -271,7 +273,11 @@ internal class ChatController( override fun onLinkClicked(link: Link) { Logger.d(TAG, "onLinkClicked") - view?.navigateToWebBrowserActivity(link.title, link.url) + getUrlFromLinkUseCase(link)?.let { + view?.navigateToWebBrowserActivity(link.title, it) + } ?: run { + Logger.e(TAG, "The URL is missing after the confirmation dialog link is clicked") + } } override fun onLiveObservationDialogAllowed() { diff --git a/widgetssdk/src/main/java/com/glia/widgets/core/dialog/domain/ConfirmationDialogLinksUseCase.kt b/widgetssdk/src/main/java/com/glia/widgets/core/dialog/domain/ConfirmationDialogLinksUseCase.kt index f0741194f..91b923576 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/core/dialog/domain/ConfirmationDialogLinksUseCase.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/core/dialog/domain/ConfirmationDialogLinksUseCase.kt @@ -1,32 +1,20 @@ package com.glia.widgets.core.dialog.domain -import androidx.annotation.VisibleForTesting import com.glia.widgets.locale.LocaleString import com.glia.widgets.R import com.glia.widgets.core.dialog.model.Link import com.glia.widgets.core.dialog.model.ConfirmationDialogLinks -import com.glia.widgets.locale.LocaleProvider -internal class ConfirmationDialogLinksUseCase( - private val localeProvider: LocaleProvider -) { +internal class ConfirmationDialogLinksUseCase { operator fun invoke(): ConfirmationDialogLinks { val link1Title = LocaleString(R.string.engagement_confirm_link1_text) - val link1Url = localeProvider.getString(R.string.engagement_confirm_link1_url) + val link1Url = LocaleString(R.string.engagement_confirm_link1_url) val link2Title = LocaleString(R.string.engagement_confirm_link2_text) - val link2Url = localeProvider.getString(R.string.engagement_confirm_link2_url) + val link2Url = LocaleString(R.string.engagement_confirm_link2_url) return ConfirmationDialogLinks( - link1 = makeLink(link1Title, link1Url), - link2 = makeLink(link2Title, link2Url) + link1 = Link(link1Title, link1Url), + link2 = Link(link2Title, link2Url) ) } - - @VisibleForTesting - fun makeLink(title: LocaleString, url: String?): Link? { - if (url.isNullOrEmpty()) { - return null - } - return Link(title, url) - } } diff --git a/widgetssdk/src/main/java/com/glia/widgets/core/dialog/model/ConfirmationDialogLinks.kt b/widgetssdk/src/main/java/com/glia/widgets/core/dialog/model/ConfirmationDialogLinks.kt index c096b4950..1dd5563e2 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/core/dialog/model/ConfirmationDialogLinks.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/core/dialog/model/ConfirmationDialogLinks.kt @@ -3,11 +3,11 @@ package com.glia.widgets.core.dialog.model import com.glia.widgets.locale.LocaleString internal data class ConfirmationDialogLinks( - val link1: Link? = null, - val link2: Link? = null + val link1: Link, + val link2: Link ) internal data class Link( val title: LocaleString, - val url: String + val url: LocaleString ) diff --git a/widgetssdk/src/main/java/com/glia/widgets/di/ControllerFactory.java b/widgetssdk/src/main/java/com/glia/widgets/di/ControllerFactory.java index 4d1701247..ceeed83de 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/di/ControllerFactory.java +++ b/widgetssdk/src/main/java/com/glia/widgets/di/ControllerFactory.java @@ -136,7 +136,8 @@ public ChatContract.Controller getChatController() { useCaseFactory.getWithCameraPermissionUseCase(), useCaseFactory.getWithReadWritePermissionsUseCase(), useCaseFactory.getRequestNotificationPermissionIfPushNotificationsSetUpUseCase(), - useCaseFactory.getReleaseResourcesUseCase(getDialogController()) + useCaseFactory.getReleaseResourcesUseCase(getDialogController()), + useCaseFactory.createGetUrlFromLinkUseCase() ); } @@ -175,7 +176,8 @@ public CallContract.Controller getCallController() { useCaseFactory.getIsQueueingOrEngagementUseCase(), useCaseFactory.getQueueForEngagementUseCase(), useCaseFactory.getDecideOnQueueingUseCase(), - useCaseFactory.getScreenSharingUseCase() + useCaseFactory.getScreenSharingUseCase(), + useCaseFactory.createGetUrlFromLinkUseCase() ); } @@ -278,7 +280,8 @@ public CallVisualizerContract.Controller getCallVisualizerController() { useCaseFactory.createConfirmationDialogUseCase(), useCaseFactory.getEngagementRequestUseCase(), useCaseFactory.getEngagementStateUseCase(), - useCaseFactory.createConfirmationDialogLinksUseCase() + useCaseFactory.createConfirmationDialogLinksUseCase(), + useCaseFactory.createGetUrlFromLinkUseCase() ); } return callVisualizerController; diff --git a/widgetssdk/src/main/java/com/glia/widgets/di/UseCaseFactory.java b/widgetssdk/src/main/java/com/glia/widgets/di/UseCaseFactory.java index 9ed225783..cac36080f 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/di/UseCaseFactory.java +++ b/widgetssdk/src/main/java/com/glia/widgets/di/UseCaseFactory.java @@ -187,6 +187,8 @@ import com.glia.widgets.push.notifications.IsPushNotificationsSetUpUseCase; import com.glia.widgets.push.notifications.IsPushNotificationsSetUpUseCaseImpl; import com.glia.widgets.view.snackbar.LiveObservationPopupUseCase; +import com.glia.widgets.webbrowser.domain.GetUrlFromLinkUseCase; +import com.glia.widgets.webbrowser.domain.GetUrlFromLinkUseCaseImpl; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -849,7 +851,12 @@ public ConfirmationDialogUseCase createConfirmationDialogUseCase() { @NonNull public ConfirmationDialogLinksUseCase createConfirmationDialogLinksUseCase() { - return new ConfirmationDialogLinksUseCase(localeProvider); + return new ConfirmationDialogLinksUseCase(); + } + + @NonNull + public GetUrlFromLinkUseCase createGetUrlFromLinkUseCase() { + return new GetUrlFromLinkUseCaseImpl(localeProvider); } public LiveObservationPopupUseCase createLiveObservationPopupUseCase() { diff --git a/widgetssdk/src/main/java/com/glia/widgets/helper/ViewExtensions.kt b/widgetssdk/src/main/java/com/glia/widgets/helper/ViewExtensions.kt index 3b48415eb..322ea0e9b 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/helper/ViewExtensions.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/helper/ViewExtensions.kt @@ -39,6 +39,7 @@ import com.squareup.picasso.Callback import com.squareup.picasso.Picasso import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.schedulers.Schedulers internal fun View.getColorCompat(@ColorRes resId: Int) = ContextCompat.getColor(context, resId) internal fun View.getColorStateListCompat(@ColorRes resId: Int) = @@ -159,13 +160,14 @@ internal fun TextView.setLocaleText(@StringRes stringKey: Int, vararg values: St } } -internal fun TextView.setText(locale: LocaleString?) { +internal fun TextView.setText(locale: LocaleString?, listener: ((String) -> Unit)? = null) { if (locale == null) { text = "" return } registerLocaleListener(locale.stringKey, *locale.values.toTypedArray()) { upToDateTranslation -> text = upToDateTranslation + listener?.invoke(upToDateTranslation) } } diff --git a/widgetssdk/src/main/java/com/glia/widgets/locale/LocaleProvider.kt b/widgetssdk/src/main/java/com/glia/widgets/locale/LocaleProvider.kt index 1068da97e..4c3144ff4 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/locale/LocaleProvider.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/locale/LocaleProvider.kt @@ -10,11 +10,11 @@ import com.glia.widgets.R import com.glia.widgets.StringProvider import com.glia.widgets.helper.IResourceProvider import com.glia.widgets.helper.Logger -import com.glia.widgets.helper.ResourceProvider import com.glia.widgets.helper.TAG import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observer +import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.PublishSubject import kotlinx.parcelize.Parcelize import java.lang.Exception @@ -47,7 +47,8 @@ internal open class LocaleProvider @JvmOverloads constructor( init { val localeSubject = PublishSubject.create() localeObservable = localeSubject - .subscribeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) .share() localeEmitter = localeSubject } @@ -92,6 +93,10 @@ internal open class LocaleProvider @JvmOverloads constructor( } } + fun getString(localeString: LocaleString): String { + return getString(localeString.stringKey, localeString.values) + } + @OpenForTesting open fun getStringInternal(stringKey: Int, values: List = emptyList()): String { val key = resourceProvider.getResourceKey(stringKey) diff --git a/widgetssdk/src/main/java/com/glia/widgets/view/Dialogs.kt b/widgetssdk/src/main/java/com/glia/widgets/view/Dialogs.kt index 2fc657b71..c4ff8a4c7 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/view/Dialogs.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/view/Dialogs.kt @@ -153,8 +153,8 @@ internal object Dialogs { val payload = DialogPayload.Confirmation( title = LocaleString(R.string.engagement_confirm_title), message = LocaleString(R.string.engagement_confirm_message), - link1Text = links.link1?.title, - link2Text = links.link2?.title, + link1 = links.link1, + link2 = links.link2, positiveButtonText = allow, negativeButtonText = cancel, poweredByText = poweredByText, diff --git a/widgetssdk/src/main/java/com/glia/widgets/view/dialog/base/DialogPayload.kt b/widgetssdk/src/main/java/com/glia/widgets/view/dialog/base/DialogPayload.kt index c8a06772a..944d50df4 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/view/dialog/base/DialogPayload.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/view/dialog/base/DialogPayload.kt @@ -2,6 +2,7 @@ package com.glia.widgets.view.dialog.base import android.view.View import androidx.annotation.DrawableRes +import com.glia.widgets.core.dialog.model.Link import com.glia.widgets.locale.LocaleString internal sealed interface DialogPayload { @@ -25,10 +26,10 @@ internal sealed interface DialogPayload { val poweredByText: LocaleString, val positiveButtonClickListener: View.OnClickListener, val negativeButtonClickListener: View.OnClickListener, - val link1Text: LocaleString? = null, - val link2Text: LocaleString? = null, - val link1ClickListener: View.OnClickListener? = null, - val link2ClickListener: View.OnClickListener? = null, + val link1: Link, + val link2: Link, + val link1ClickListener: View.OnClickListener, + val link2ClickListener: View.OnClickListener, ) : DialogPayload data class ScreenSharing( diff --git a/widgetssdk/src/main/java/com/glia/widgets/view/dialog/base/DialogViewInflater.kt b/widgetssdk/src/main/java/com/glia/widgets/view/dialog/base/DialogViewInflater.kt index 38c5e3b64..ff2e63d20 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/view/dialog/base/DialogViewInflater.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/view/dialog/base/DialogViewInflater.kt @@ -3,7 +3,10 @@ package com.glia.widgets.view.dialog.base import android.graphics.Typeface import android.view.View import android.widget.TextView +import androidx.core.view.isVisible import androidx.viewbinding.ViewBinding +import com.glia.widgets.core.dialog.model.Link +import com.glia.widgets.di.Dependencies import com.glia.widgets.locale.LocaleString import com.glia.widgets.helper.setText import com.glia.widgets.view.unifiedui.applyButtonTheme @@ -47,13 +50,25 @@ internal abstract class DialogViewInflater + this.text = upToDateTitle + + val localeManager = Dependencies.getLocaleProvider() + val upToDateUrl = localeManager.getString(link.url) + + this.isVisible = upToDateTitle.isNotBlank() && upToDateUrl.isNotBlank() } - this.setText(text) applyButtonTheme(btnTheme) setupTypeface(this, typeface) setOnClickListener(onClickListener) diff --git a/widgetssdk/src/main/java/com/glia/widgets/view/dialog/confirmation/ConfirmationDialogViewInflater.kt b/widgetssdk/src/main/java/com/glia/widgets/view/dialog/confirmation/ConfirmationDialogViewInflater.kt index 9172ab44f..d4cc756fb 100644 --- a/widgetssdk/src/main/java/com/glia/widgets/view/dialog/confirmation/ConfirmationDialogViewInflater.kt +++ b/widgetssdk/src/main/java/com/glia/widgets/view/dialog/confirmation/ConfirmationDialogViewInflater.kt @@ -33,14 +33,14 @@ internal open class DefaultConfirmationDialogViewInflater() @@ -216,8 +216,8 @@ class CallVisualizerActivityWatcherTest { every { Dialogs.showEngagementConfirmationDialog(any(), any(), any(), any(), any(), any()) } returns dialog val links = ConfirmationDialogLinks( - link1 = Link(mockLocale, "url1"), - link2 = Link(mockLocale, "url2") + link1 = Link(mockLocale, mockLocale), + link2 = Link(mockLocale, mockLocale) ) val activity = emitActivity() @@ -260,8 +260,8 @@ class CallVisualizerActivityWatcherTest { every { Dialogs.showEngagementConfirmationDialog(any(), any(), any(), any(), any(), any()) } returns dialog val links = ConfirmationDialogLinks( - link1 = Link(mockLocale, "url1"), - link2 = Link(mockLocale, "url2") + link1 = Link(mockLocale, mockLocale), + link2 = Link(mockLocale, mockLocale) ) val activity = emitActivity() diff --git a/widgetssdk/src/test/java/com/glia/widgets/callvisualizer/controller/CallVisualizerControllerTest.kt b/widgetssdk/src/test/java/com/glia/widgets/callvisualizer/controller/CallVisualizerControllerTest.kt index 957f0f07f..f2cec4511 100644 --- a/widgetssdk/src/test/java/com/glia/widgets/callvisualizer/controller/CallVisualizerControllerTest.kt +++ b/widgetssdk/src/test/java/com/glia/widgets/callvisualizer/controller/CallVisualizerControllerTest.kt @@ -10,6 +10,7 @@ import com.glia.widgets.engagement.State import com.glia.widgets.engagement.domain.EngagementRequestUseCase import com.glia.widgets.engagement.domain.EngagementStateUseCase import com.glia.widgets.locale.LocaleString +import com.glia.widgets.webbrowser.domain.GetUrlFromLinkUseCase import io.mockk.CapturingSlot import io.mockk.confirmVerified import io.mockk.every @@ -33,6 +34,7 @@ class CallVisualizerControllerTest { private lateinit var engagementRequestUseCase: EngagementRequestUseCase private lateinit var engagementStateUseCase: EngagementStateUseCase private lateinit var confirmationDialogLinksUseCase: ConfirmationDialogLinksUseCase + private lateinit var getUrlFromLinkUseCase: GetUrlFromLinkUseCase private lateinit var dialogCallback: CapturingSlot @@ -53,6 +55,8 @@ class CallVisualizerControllerTest { confirmationDialogLinksUseCase = mockk(relaxed = true) + getUrlFromLinkUseCase = mockk() + dialogCallback = slot() controller = CallVisualizerController( @@ -60,7 +64,8 @@ class CallVisualizerControllerTest { confirmationDialogUseCase, engagementRequestUseCase, engagementStateUseCase, - confirmationDialogLinksUseCase + confirmationDialogLinksUseCase, + getUrlFromLinkUseCase ) verify { dialogController.addCallback(capture(dialogCallback)) } @@ -144,16 +149,22 @@ class CallVisualizerControllerTest { @Test fun `onLinkClicked will produce OpenWebBrowserScreen state`() { - val link = Link(mockk(), "url") + val urlStringKey = 123 + val url = "https://glia.com" + val urlLocaleString = LocaleString(urlStringKey, emptyList()) + val link = Link(mockk(), urlLocaleString) + + every { getUrlFromLinkUseCase(link) } returns url val testState = controller.state.test() controller.onLinkClicked(link) verify { dialogController.dismissCurrentDialog() } + verify { getUrlFromLinkUseCase(link) } testState.assertNotComplete().assertValue { - it.value == CallVisualizerContract.State.OpenWebBrowserScreen(link.title, link.url) + it.value == CallVisualizerContract.State.OpenWebBrowserScreen(link.title, url) } } diff --git a/widgetssdk/src/test/java/com/glia/widgets/chat/controller/ChatControllerTest.kt b/widgetssdk/src/test/java/com/glia/widgets/chat/controller/ChatControllerTest.kt index a1b78425c..a04368db3 100644 --- a/widgetssdk/src/test/java/com/glia/widgets/chat/controller/ChatControllerTest.kt +++ b/widgetssdk/src/test/java/com/glia/widgets/chat/controller/ChatControllerTest.kt @@ -53,6 +53,7 @@ import com.glia.widgets.helper.Data import com.glia.widgets.helper.TimeCounter import com.glia.widgets.view.MessagesNotSeenHandler import com.glia.widgets.view.MinimizeHandler +import com.glia.widgets.webbrowser.domain.GetUrlFromLinkUseCase import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Single @@ -113,6 +114,7 @@ class ChatControllerTest { private lateinit var withReadWritePermissionsUseCase: WithReadWritePermissionsUseCase private lateinit var requestNotificationPermissionIfPushNotificationsSetUpUseCase: RequestNotificationPermissionIfPushNotificationsSetUpUseCase private lateinit var releaseResourcesUseCase: ReleaseResourcesUseCase + private lateinit var getUrlFromLinkUseCase: GetUrlFromLinkUseCase private lateinit var chatController: ChatController private lateinit var isAuthenticatedUseCase: IsAuthenticatedUseCase @@ -181,6 +183,7 @@ class ChatControllerTest { withReadWritePermissionsUseCase = mock() requestNotificationPermissionIfPushNotificationsSetUpUseCase = mock() releaseResourcesUseCase = mock() + getUrlFromLinkUseCase = mock() chatController = ChatController( callTimer = callTimer, @@ -227,7 +230,8 @@ class ChatControllerTest { withCameraPermissionUseCase = withCameraPermissionUseCase, withReadWritePermissionsUseCase = withReadWritePermissionsUseCase, requestNotificationPermissionIfPushNotificationsSetUpUseCase = requestNotificationPermissionIfPushNotificationsSetUpUseCase, - releaseResourcesUseCase = releaseResourcesUseCase + releaseResourcesUseCase = releaseResourcesUseCase, + getUrlFromLinkUseCase = getUrlFromLinkUseCase ) chatController.setView(chatView) } diff --git a/widgetssdk/src/test/java/com/glia/widgets/core/dialog/domain/ConfirmationDialogLinksUseCaseTest.kt b/widgetssdk/src/test/java/com/glia/widgets/core/dialog/domain/ConfirmationDialogLinksUseCaseTest.kt deleted file mode 100644 index 7b7d1e156..000000000 --- a/widgetssdk/src/test/java/com/glia/widgets/core/dialog/domain/ConfirmationDialogLinksUseCaseTest.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.glia.widgets.core.dialog.domain - -import com.glia.widgets.R -import com.glia.widgets.locale.LocaleProvider -import com.glia.widgets.locale.LocaleString -import junit.framework.TestCase.assertEquals -import junit.framework.TestCase.assertNotNull -import junit.framework.TestCase.assertNull -import org.junit.Before -import org.junit.Test -import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever - -class ConfirmationDialogLinksUseCaseTest { - private lateinit var useCase: ConfirmationDialogLinksUseCase - private lateinit var localeProvider: LocaleProvider - private lateinit var mockLocale: LocaleString - - @Before - fun setup() { - mockLocale = mock() - localeProvider = mock() - useCase = ConfirmationDialogLinksUseCase(localeProvider) - } - - @Test - fun `invoke returns both links if both title and url pair are not empty`() { - whenever(localeProvider.getString(R.string.engagement_confirm_link1_text)).thenReturn("Title1") - whenever(localeProvider.getString(R.string.engagement_confirm_link1_url)).thenReturn("https://link1") - whenever(localeProvider.getString(R.string.engagement_confirm_link2_text)).thenReturn("Title2") - whenever(localeProvider.getString(R.string.engagement_confirm_link2_url)).thenReturn("https://link2") - - val links = useCase() - assertNotNull(links.link1) - assertEquals(LocaleString(R.string.engagement_confirm_link1_text), links.link1!!.title) - assertEquals("https://link1", links.link1!!.url) - assertEquals(LocaleString(R.string.engagement_confirm_link2_text), links.link2!!.title) - assertEquals("https://link2", links.link2!!.url) - } - - @Test - fun `invoke returns first link if only first title and url pair is not empty`() { - whenever(localeProvider.getString(R.string.engagement_confirm_link1_text)).thenReturn("Title1") - whenever(localeProvider.getString(R.string.engagement_confirm_link1_url)).thenReturn("https://link1") - whenever(localeProvider.getString(R.string.engagement_confirm_link2_text)).thenReturn("Title2") - whenever(localeProvider.getString(R.string.engagement_confirm_link2_url)).thenReturn("") - - val links = useCase() - assertNotNull(links.link1) - assertEquals(LocaleString(R.string.engagement_confirm_link1_text), links.link1!!.title) - assertEquals("https://link1", links.link1!!.url) - assertNull(links.link2) - } - - @Test - fun `invoke returns second link if only second title and url pair is not empty`() { - whenever(localeProvider.getString(R.string.engagement_confirm_link1_text)).thenReturn(null) - whenever(localeProvider.getString(R.string.engagement_confirm_link1_url)).thenReturn("https://link1") - whenever(localeProvider.getString(R.string.engagement_confirm_link2_text)).thenReturn("Title2") - whenever(localeProvider.getString(R.string.engagement_confirm_link2_url)).thenReturn("https://link2") - - val links = useCase() - assertNotNull(links.link2) - assertEquals(LocaleString(R.string.engagement_confirm_link2_text), links.link2!!.title) - assertEquals("https://link2", links.link2!!.url) - } - - @Test - fun `makeLink returns link if title and url are valid`() { - val link = useCase.makeLink( - title = mockLocale, - url = "https://glia.com" - ) - assertNotNull(link) - assertEquals(mockLocale, link!!.title) - assertEquals("https://glia.com", link.url) - } - - @Test - fun `makeLink returns null if url is empty`() { - val link = useCase.makeLink( - title = mockLocale, - url = "" - ) - assertNull(link) - } -} diff --git a/widgetssdk/src/test/java/com/glia/widgets/webbrowser/domain/GetUrlFromLinkUseCaseTest.kt b/widgetssdk/src/test/java/com/glia/widgets/webbrowser/domain/GetUrlFromLinkUseCaseTest.kt new file mode 100644 index 000000000..204c252c1 --- /dev/null +++ b/widgetssdk/src/test/java/com/glia/widgets/webbrowser/domain/GetUrlFromLinkUseCaseTest.kt @@ -0,0 +1,40 @@ +package com.glia.widgets.webbrowser.domain + +import com.glia.widgets.core.dialog.model.Link +import com.glia.widgets.locale.LocaleProvider +import io.mockk.every +import io.mockk.mockk +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Before +import org.junit.Test + +class GetUrlFromLinkUseCaseTest { + private lateinit var localeProvider: LocaleProvider + + private lateinit var useCase: GetUrlFromLinkUseCase + + @Before + fun setUp() { + localeProvider = mockk() + useCase = GetUrlFromLinkUseCaseImpl(localeProvider) + } + + @Test + fun `should return null when link url is blank`() { + val link = Link(mockk(), mockk()) + + every { localeProvider.getString(link.url) } returns "" + + assertNull(useCase(link)) + } + + @Test + fun `should return url when link url is not blank`() { + val link = Link(mockk(), mockk()) + + every { localeProvider.getString(link.url) } returns "https://glia.com" + + assertEquals("https://glia.com", useCase(link)) + } +} diff --git a/widgetssdk/src/testSnapshot/java/com/glia/widgets/SnapshotTest.kt b/widgetssdk/src/testSnapshot/java/com/glia/widgets/SnapshotTest.kt index 6bf9d9c86..a1bb30e6e 100644 --- a/widgetssdk/src/testSnapshot/java/com/glia/widgets/SnapshotTest.kt +++ b/widgetssdk/src/testSnapshot/java/com/glia/widgets/SnapshotTest.kt @@ -9,20 +9,16 @@ import app.cash.paparazzi.DeviceConfig import app.cash.paparazzi.InstantAnimationsRule import app.cash.paparazzi.Paparazzi import com.android.ide.common.rendering.api.SessionParams.RenderingMode -import com.android.ide.common.symbols.readAarRTxt import com.glia.widgets.snapshotutils.OnTestEnded import com.glia.widgets.snapshotutils.SnapshotContent import com.glia.widgets.snapshotutils.SnapshotProviders import com.glia.widgets.snapshotutils.SnapshotStrings import com.glia.widgets.snapshotutils.SnapshotTheme import com.glia.widgets.snapshotutils.SnapshotTestLifecycle -import io.mockk.every -import io.mockk.mockk import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.rules.TestRule -import org.mockito.kotlin.anyVararg import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import java.io.BufferedReader @@ -62,6 +58,8 @@ open class SnapshotTest( } } + override val snapshotLocales: MutableMap = mutableMapOf() + fun snapshot( view: View, name: String? = null, @@ -83,6 +81,7 @@ open class SnapshotTest( open fun tearDown() { onEndListeners.forEach { it() } onEndListeners.clear() + snapshotLocales.clear() } private val onEndListeners: MutableList = mutableListOf() diff --git a/widgetssdk/src/testSnapshot/java/com/glia/widgets/dialog/ConfirmationDialogTest.kt b/widgetssdk/src/testSnapshot/java/com/glia/widgets/dialog/ConfirmationDialogTest.kt index b3400d57f..251a4b735 100644 --- a/widgetssdk/src/testSnapshot/java/com/glia/widgets/dialog/ConfirmationDialogTest.kt +++ b/widgetssdk/src/testSnapshot/java/com/glia/widgets/dialog/ConfirmationDialogTest.kt @@ -1,7 +1,7 @@ package com.glia.widgets.dialog import com.glia.widgets.SnapshotTest -import com.glia.widgets.locale.LocaleString +import com.glia.widgets.core.dialog.model.Link import com.glia.widgets.snapshotutils.SnapshotDialog import com.glia.widgets.view.dialog.base.DialogPayload import com.glia.widgets.view.dialog.base.DialogType @@ -11,10 +11,7 @@ class ConfirmationDialogTest : SnapshotTest( renderingMode = fullWidthRenderMode ), SnapshotDialog { - private fun dialogType( - link1Text: LocaleString? = this.link1Text, - link2Text: LocaleString? = this.link2Text, - ) = DialogType.Confirmation( + private fun dialogType() = DialogType.Confirmation( DialogPayload.Confirmation( title = title, message = message, @@ -23,13 +20,19 @@ class ConfirmationDialogTest : SnapshotTest( poweredByText = poweredByText, positiveButtonClickListener = {}, negativeButtonClickListener = {}, - link1Text = link1Text, - link2Text = link2Text, + link1 = link1, + link2 = link2, link1ClickListener = {}, link2ClickListener = {} ) ) + private fun disableLinkButton(vararg links: Link) { + links.forEach { + snapshotLocales[it.url.stringKey] = "" + } + } + // MARK: tests with links @Test @@ -87,19 +90,21 @@ class ConfirmationDialogTest : SnapshotTest( @Test fun withLink1WithDefaultTheme() { + disableLinkButton(link2) val view = inflateView( context = context, - dialogType = dialogType(link2Text = null) + dialogType = dialogType() ) snapshot(view) } @Test fun withLink1WithGlobalColors() { + disableLinkButton(link2) val view = inflateView( context = context, unifiedTheme = unifiedThemeWithGlobalColors(), - dialogType = dialogType(link2Text = null) + dialogType = dialogType() ) snapshot(view) } @@ -108,19 +113,21 @@ class ConfirmationDialogTest : SnapshotTest( @Test fun withLink2WithDefaultTheme() { + disableLinkButton(link1) val view = inflateView( context = context, - dialogType = dialogType(link1Text = null) + dialogType = dialogType() ) snapshot(view) } @Test fun withLink2WithGlobalColors() { + disableLinkButton(link1) val view = inflateView( context = context, unifiedTheme = unifiedThemeWithGlobalColors(), - dialogType = dialogType(link1Text = null) + dialogType = dialogType() ) snapshot(view) } @@ -129,19 +136,21 @@ class ConfirmationDialogTest : SnapshotTest( @Test fun withoutLinksWithDefaultTheme() { + disableLinkButton(link1, link2) val view = inflateView( context = context, - dialogType = dialogType(null, null) + dialogType = dialogType() ) snapshot(view) } @Test fun withoutLinksWithGlobalColors() { + disableLinkButton(link1, link2) val view = inflateView( context = context, unifiedTheme = unifiedThemeWithGlobalColors(), - dialogType = dialogType(null, null) + dialogType = dialogType() ) snapshot(view) } diff --git a/widgetssdk/src/testSnapshot/java/com/glia/widgets/snapshotutils/SnapshotDialog.kt b/widgetssdk/src/testSnapshot/java/com/glia/widgets/snapshotutils/SnapshotDialog.kt index 33ea30626..08c34afa3 100644 --- a/widgetssdk/src/testSnapshot/java/com/glia/widgets/snapshotutils/SnapshotDialog.kt +++ b/widgetssdk/src/testSnapshot/java/com/glia/widgets/snapshotutils/SnapshotDialog.kt @@ -5,6 +5,7 @@ import android.view.View import androidx.annotation.DrawableRes import com.glia.widgets.R import com.glia.widgets.UiTheme +import com.glia.widgets.core.dialog.model.Link import com.glia.widgets.locale.LocaleString import com.glia.widgets.view.dialog.base.DialogType import com.glia.widgets.view.dialog.base.DialogViewFactory @@ -30,9 +31,21 @@ internal interface SnapshotDialog: SnapshotTheme, SnapshotProviders { val link1Text: LocaleString get() = LocaleString(R.string.dialog_link1_text) + val link1Url: LocaleString + get() = LocaleString(R.string.dialog_link1_url) + + val link1: Link + get() = Link(link1Text, link1Url) + val link2Text: LocaleString get() = LocaleString(R.string.dialog_link2_text) + val link2Url: LocaleString + get() = LocaleString(R.string.dialog_link2_url) + + val link2: Link + get() = Link(link2Text, link2Url) + @get:DrawableRes val icon: Int get() = R.drawable.test_ic_placeholder diff --git a/widgetssdk/src/testSnapshot/java/com/glia/widgets/snapshotutils/SnapshotProviders.kt b/widgetssdk/src/testSnapshot/java/com/glia/widgets/snapshotutils/SnapshotProviders.kt index 92f1a04ec..de3b62956 100644 --- a/widgetssdk/src/testSnapshot/java/com/glia/widgets/snapshotutils/SnapshotProviders.kt +++ b/widgetssdk/src/testSnapshot/java/com/glia/widgets/snapshotutils/SnapshotProviders.kt @@ -7,11 +7,13 @@ import com.glia.widgets.locale.StringKeyPair internal interface SnapshotProviders: SnapshotContent, SnapshotTestLifecycle { + val snapshotLocales: Map + fun localeProviderMock(): LocaleProvider { val resourceProvider = resourceProviderMock() val localeProvider = object: LocaleProvider(resourceProvider, null) { override fun getStringInternal(stringKey: Int, values: List): String { - return context.resources.getResourceName(stringKey).split("/")[1] + return snapshotLocales[stringKey] ?: context.resources.getResourceName(stringKey).split("/")[1] } } diff --git a/widgetssdk/src/testSnapshot/res/values/strings.xml b/widgetssdk/src/testSnapshot/res/values/strings.xml index 6a739e3dd..cca6e0742 100644 --- a/widgetssdk/src/testSnapshot/res/values/strings.xml +++ b/widgetssdk/src/testSnapshot/res/values/strings.xml @@ -6,6 +6,8 @@ Cancel Terms and Conditions Privacy Policies + https://link.one + https://link.two button description Powered by Glia \ No newline at end of file