Skip to content

Commit 6143d7b

Browse files
author
sm-deployer
authored
Merge pull request #397 from salemove/feature/MOB-1592_handle_unstaffed_queue_ticket_using_ticket_subscription
2 parents 02ac0de + e5a536a commit 6143d7b

File tree

10 files changed

+239
-7
lines changed

10 files changed

+239
-7
lines changed

widgetssdk/src/main/java/com/glia/widgets/call/CallController.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.glia.widgets.core.permissions.domain.HasCallNotificationChannelEnabledUseCase;
3636
import com.glia.widgets.core.queue.domain.GliaCancelQueueTicketUseCase;
3737
import com.glia.widgets.core.queue.domain.GliaQueueForMediaEngagementUseCase;
38+
import com.glia.widgets.core.queue.domain.QueueTicketStateChangeToUnstaffedUseCase;
3839
import com.glia.widgets.core.queue.domain.exception.QueueingOngoingException;
3940
import com.glia.widgets.core.survey.OnSurveyListener;
4041
import com.glia.widgets.core.survey.domain.GliaSurveyUseCase;
@@ -95,6 +96,7 @@ public class CallController implements
9596
private final ToggleVisitorVideoUseCase toggleVisitorVideoUseCase;
9697
private final GetEngagementStateFlowableUseCase getGliaEngagementStateFlowableUseCase;
9798
private final UpdateFromCallScreenUseCase updateFromCallScreenUseCase;
99+
private final QueueTicketStateChangeToUnstaffedUseCase ticketStateChangeToUnstaffedUseCase;
98100

99101
private final GliaOperatorMediaRepository.OperatorMediaStateListener operatorMediaStateListener = this::onNewOperatorMediaState;
100102

@@ -132,7 +134,8 @@ public CallController(
132134
ToggleVisitorAudioMediaMuteUseCase toggleVisitorAudioMediaMuteUseCase,
133135
ToggleVisitorVideoUseCase toggleVisitorVideoUseCase,
134136
GetEngagementStateFlowableUseCase getGliaEngagementStateFlowableUseCase,
135-
UpdateFromCallScreenUseCase updateFromCallScreenUseCase) {
137+
UpdateFromCallScreenUseCase updateFromCallScreenUseCase,
138+
QueueTicketStateChangeToUnstaffedUseCase ticketStateChangeToUnstaffedUseCase) {
136139
Logger.d(TAG, "constructor");
137140
this.viewCallback = callViewCallback;
138141
this.callState = new CallState.Builder()
@@ -173,6 +176,7 @@ public CallController(
173176
this.toggleVisitorVideoUseCase = toggleVisitorVideoUseCase;
174177
this.getGliaEngagementStateFlowableUseCase = getGliaEngagementStateFlowableUseCase;
175178
this.updateFromCallScreenUseCase = updateFromCallScreenUseCase;
179+
this.ticketStateChangeToUnstaffedUseCase = ticketStateChangeToUnstaffedUseCase;
176180
}
177181

178182
@Override
@@ -448,6 +452,7 @@ public void onSpeakerButtonPressed() {
448452

449453
public void queueForEngagementStarted() {
450454
Logger.d(TAG, "queueForEngagementStarted");
455+
observeQueueTicketState();
451456
}
452457

453458
public void queueForEngagementStopped() {
@@ -477,6 +482,10 @@ public boolean shouldShowMediaEngagementView(boolean isUpgradeToCall) {
477482
return shouldShowMediaEngagementViewUseCase.execute(isUpgradeToCall);
478483
}
479484

485+
public void onBackClicked() {
486+
updateFromCallScreenUseCase.updateFromCallScreen(false);
487+
}
488+
480489
private synchronized void emitViewState(CallState state) {
481490
if (setState(state) && viewCallback != null) {
482491
Logger.d(TAG, "Emit state:\n" + state.toString());
@@ -793,7 +802,14 @@ private void minimizeView() {
793802
if (viewCallback != null) viewCallback.minimizeView();
794803
}
795804

796-
public void onBackClicked() {
797-
updateFromCallScreenUseCase.updateFromCallScreen(false);
805+
private void observeQueueTicketState() {
806+
Logger.d(TAG, "observeQueueTicketState");
807+
disposable.add(
808+
ticketStateChangeToUnstaffedUseCase
809+
.execute()
810+
.subscribe(dialogController::showNoMoreOperatorsAvailableDialog,
811+
error -> Logger.e(TAG, "Error happened while observing queue state : " + error.toString())
812+
)
813+
);
798814
}
799815
}

widgetssdk/src/main/java/com/glia/widgets/chat/controller/ChatController.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import com.glia.widgets.core.operator.domain.AddOperatorMediaStateListenerUseCase;
8080
import com.glia.widgets.core.queue.domain.GliaCancelQueueTicketUseCase;
8181
import com.glia.widgets.core.queue.domain.GliaQueueForChatEngagementUseCase;
82+
import com.glia.widgets.core.queue.domain.QueueTicketStateChangeToUnstaffedUseCase;
8283
import com.glia.widgets.core.queue.domain.exception.QueueingOngoingException;
8384
import com.glia.widgets.core.survey.OnSurveyListener;
8485
import com.glia.widgets.core.survey.domain.GliaSurveyUseCase;
@@ -201,6 +202,7 @@ public void error(GliaException ex) {
201202
private final CustomCardTypeUseCase customCardTypeUseCase;
202203
private final CustomCardInteractableUseCase customCardInteractableUseCase;
203204
private final CustomCardShouldShowUseCase customCardShouldShowUseCase;
205+
private final QueueTicketStateChangeToUnstaffedUseCase ticketStateChangeToUnstaffedUseCase;
204206

205207
private boolean isVisitorEndEngagement = false;
206208
private volatile boolean isChatViewPaused = false;
@@ -247,7 +249,8 @@ public ChatController(
247249
CustomCardAdapterTypeUseCase customCardAdapterTypeUseCase,
248250
CustomCardTypeUseCase customCardTypeUseCase,
249251
CustomCardInteractableUseCase customCardInteractableUseCase,
250-
CustomCardShouldShowUseCase customCardShouldShowUseCase) {
252+
CustomCardShouldShowUseCase customCardShouldShowUseCase,
253+
QueueTicketStateChangeToUnstaffedUseCase ticketStateChangeToUnstaffedUseCase) {
251254
this.isFromCallScreenUseCase = isFromCallScreenUseCase;
252255
this.updateFromCallScreenUseCase = updateFromCallScreenUseCase;
253256
Logger.d(TAG, "constructor");
@@ -314,6 +317,7 @@ public ChatController(
314317
this.customCardTypeUseCase = customCardTypeUseCase;
315318
this.customCardInteractableUseCase = customCardInteractableUseCase;
316319
this.customCardShouldShowUseCase = customCardShouldShowUseCase;
320+
this.ticketStateChangeToUnstaffedUseCase = ticketStateChangeToUnstaffedUseCase;
317321
}
318322

319323
public void setPhotoCaptureFileUri(Uri photoCaptureFileUri) {
@@ -1472,6 +1476,7 @@ public void notificationsDialogDismissed() {
14721476

14731477
public void queueForEngagementStarted() {
14741478
Logger.d(TAG, "queueForEngagementStarted");
1479+
observeQueueTicketState();
14751480
viewInitQueueing();
14761481
}
14771482

@@ -1560,4 +1565,15 @@ private void updateAllowFileSendState() {
15601565
private void onSiteInfoReceived(@Nullable SiteInfo siteInfo) {
15611566
emitViewState(chatState.allowSendAttachmentStateChanged(siteInfo == null || siteInfo.getAllowedFileSenders().isVisitorAllowed()));
15621567
}
1568+
1569+
private void observeQueueTicketState() {
1570+
Logger.d(TAG, "observeQueueTicketState");
1571+
disposable.add(
1572+
ticketStateChangeToUnstaffedUseCase
1573+
.execute()
1574+
.subscribe(dialogController::showNoMoreOperatorsAvailableDialog,
1575+
error -> Logger.e(TAG, "Error happened while observing queue state : " + error.toString())
1576+
)
1577+
);
1578+
}
15631579
}

widgetssdk/src/main/java/com/glia/widgets/core/queue/GliaQueueRepository.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package com.glia.widgets.core.queue;
22

3+
import androidx.annotation.NonNull;
4+
import androidx.annotation.VisibleForTesting;
5+
36
import com.glia.androidsdk.Engagement;
47
import com.glia.androidsdk.Glia;
58
import com.glia.androidsdk.GliaException;
9+
import com.glia.androidsdk.RequestCallback;
610
import com.glia.androidsdk.queuing.QueueTicket;
711
import com.glia.widgets.core.queue.model.GliaQueueingState;
812
import com.glia.widgets.di.GliaCore;
913
import com.glia.widgets.helper.Logger;
1014

1115
import io.reactivex.Completable;
16+
import io.reactivex.CompletableEmitter;
1217
import io.reactivex.Single;
1318

1419
public class GliaQueueRepository {
@@ -22,6 +27,12 @@ public GliaQueueRepository(GliaCore gliaCore) {
2227
this.gliaCore = gliaCore;
2328
}
2429

30+
@VisibleForTesting
31+
public GliaQueueRepository(GliaCore gliaCore, GliaQueueingState queueingState) {
32+
this.gliaCore = gliaCore;
33+
this.queueingState = queueingState;
34+
}
35+
2536
public Completable startQueueingForEngagement(
2637
String queueId,
2738
String visitorContextAssetId
@@ -124,4 +135,26 @@ public Completable setQueueingChat(String queueId, String queueTicket) {
124135
public GliaQueueingState getQueueingState() {
125136
return queueingState;
126137
}
138+
139+
/**
140+
* Completes when ongoing queue ticket state changes to {@link QueueTicket.State.UNSTAFFED}
141+
*/
142+
public Completable observeQueueTicketStateChangeToUnstaffed() {
143+
return Completable.create(emitter ->
144+
gliaCore.subscribeToQueueTicketUpdates(
145+
queueingState.getTicketId(),
146+
emitOnQueueTicketChangeToUnstaffed(emitter)));
147+
}
148+
149+
@VisibleForTesting
150+
@NonNull
151+
public RequestCallback<QueueTicket> emitOnQueueTicketChangeToUnstaffed(CompletableEmitter emitter) {
152+
return (queueTicket, e) -> {
153+
if (queueTicket.getState() == QueueTicket.State.UNSTAFFED) {
154+
emitter.onComplete();
155+
}
156+
};
157+
}
158+
159+
127160
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.glia.widgets.core.queue.domain;
2+
3+
import com.glia.widgets.core.queue.GliaQueueRepository;
4+
5+
import io.reactivex.Completable;
6+
7+
public class QueueTicketStateChangeToUnstaffedUseCase {
8+
private final GliaQueueRepository gliaQueueRepository;
9+
10+
public QueueTicketStateChangeToUnstaffedUseCase(GliaQueueRepository gliaQueueRepository) {
11+
this.gliaQueueRepository = gliaQueueRepository;
12+
}
13+
14+
public Completable execute() {
15+
return gliaQueueRepository.observeQueueTicketStateChangeToUnstaffed();
16+
}
17+
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ public ChatController getChatController(ChatViewCallback chatViewCallback) {
110110
useCaseFactory.createCustomCardAdapterTypeUseCase(),
111111
useCaseFactory.createCustomCardTypeUseCase(),
112112
useCaseFactory.createCustomCardInteractableUseCase(),
113-
useCaseFactory.createCustomCardShouldShowUseCase());
113+
useCaseFactory.createCustomCardShouldShowUseCase(),
114+
useCaseFactory.createQueueTicketStateChangeToUnstaffedUseCase());
114115
} else {
115116
Logger.d(TAG, "retained chat controller");
116117
retainedChatController.setViewCallback(chatViewCallback);
@@ -149,7 +150,8 @@ public CallController getCallController(CallViewCallback callViewCallback) {
149150
useCaseFactory.createToggleVisitorAudioMediaMuteUseCase(),
150151
useCaseFactory.createToggleVisitorVideoUseCase(),
151152
useCaseFactory.createGetGliaEngagementStateFlowableUseCase(),
152-
useCaseFactory.createUpdateFromCallScreenUseCase());
153+
useCaseFactory.createUpdateFromCallScreenUseCase(),
154+
useCaseFactory.createQueueTicketStateChangeToUnstaffedUseCase());
153155
} else {
154156
Logger.d(TAG, "retained call controller");
155157
retainedCallController.setViewCallback(callViewCallback);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.glia.androidsdk.engagement.Survey;
1818
import com.glia.androidsdk.fcm.PushNotifications;
1919
import com.glia.androidsdk.queuing.Queue;
20+
import com.glia.androidsdk.queuing.QueueTicket;
2021
import com.glia.androidsdk.site.SiteInfo;
2122
import com.glia.androidsdk.visitor.VisitorInfo;
2223
import com.glia.androidsdk.visitor.VisitorInfoUpdateRequest;
@@ -74,6 +75,8 @@ void queueForEngagement(@NonNull String queueId,
7475

7576
void unsubscribeFromQueueUpdates(Consumer<GliaException> onError, Consumer<Queue> callback);
7677

78+
void subscribeToQueueTicketUpdates(@NonNull String ticketId, RequestCallback<QueueTicket> callback);
79+
7780
void onRequestPermissionsResult(int requestCode, String[] permissions, @NonNull int[] grantResults);
7881

7982
void submitSurveyAnswers(@NonNull List<Survey.Answer> answers,

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.glia.androidsdk.engagement.Survey;
1818
import com.glia.androidsdk.fcm.PushNotifications;
1919
import com.glia.androidsdk.queuing.Queue;
20+
import com.glia.androidsdk.queuing.QueueTicket;
2021
import com.glia.androidsdk.site.SiteInfo;
2122
import com.glia.androidsdk.visitor.VisitorInfo;
2223
import com.glia.androidsdk.visitor.VisitorInfoUpdateRequest;
@@ -140,6 +141,12 @@ public void unsubscribeFromQueueUpdates(Consumer<GliaException> onError,
140141
Glia.unsubscribeFromQueueUpdates(onError, callback);
141142
}
142143

144+
@Override
145+
public void subscribeToQueueTicketUpdates(@NonNull String ticketId,
146+
RequestCallback<QueueTicket> callback) {
147+
Glia.subscribeToQueueTicketUpdates(ticketId, callback);
148+
}
149+
143150
@Override
144151
public void onRequestPermissionsResult(int requestCode,
145152
String[] permissions,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.glia.widgets.core.engagement.domain.GliaOnEngagementEndUseCase;
3535
import com.glia.widgets.core.engagement.domain.GliaOnEngagementUseCase;
3636
import com.glia.widgets.core.engagement.domain.MapOperatorUseCase;
37+
import com.glia.widgets.core.queue.domain.QueueTicketStateChangeToUnstaffedUseCase;
3738
import com.glia.widgets.core.survey.domain.GliaSurveyUseCase;
3839
import com.glia.widgets.core.engagement.domain.ShouldShowMediaEngagementViewUseCase;
3940
import com.glia.widgets.core.fileupload.domain.AddFileAttachmentsObserverUseCase;
@@ -435,4 +436,8 @@ public CustomCardInteractableUseCase createCustomCardInteractableUseCase() {
435436
public CustomCardShouldShowUseCase createCustomCardShouldShowUseCase() {
436437
return new CustomCardShouldShowUseCase(GliaWidgets.getCustomCardAdapter());
437438
}
439+
440+
public QueueTicketStateChangeToUnstaffedUseCase createQueueTicketStateChangeToUnstaffedUseCase() {
441+
return new QueueTicketStateChangeToUnstaffedUseCase(repositoryFactory.getGliaQueueRepository());
442+
}
438443
}

widgetssdk/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
<string name="glia_dialog_upgrade_decline">@string/glia_dialog_decline</string>
9494

9595
<!-- Operators unavailable AlertDialog -->
96-
<string name="glia_dialog_operators_unavailable_title">Operators Not Available</string>
96+
<string name="glia_dialog_operators_unavailable_title">We\'re sorry</string>
9797
<string name="glia_dialog_operators_unavailable_message">Operators are no longer available. Please try again later.</string>
9898

9999
<!-- Unexpected error AlertDialog -->

0 commit comments

Comments
 (0)