< Summary

Class:DCL.PortableExperiences.Confirmation.ExperiencesConfirmationPopupController
Assembly:ExperienciesConfirmation
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ExperiencesConfirmation/ExperiencesConfirmationPopupController.cs
Covered lines:49
Uncovered lines:5
Coverable lines:54
Total lines:137
Line coverage:90.7% (49 of 54)
Covered branches:0
Total branches:0
Covered methods:3
Total methods:4
Method coverage:75% (3 of 4)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ExperiencesConfirmationPopupController(...)0%110100%
Dispose()0%2100%
<OnConfirmRequested()0%19.0819093.94%
OnConfirmRequested(...)0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ExperiencesConfirmation/ExperiencesConfirmationPopupController.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL.Tasks;
 3using DCL.World.PortableExperiences;
 4using DCLServices.PortableExperiences.Analytics;
 5using System;
 6using System.Collections.Generic;
 7using System.Threading;
 8using UnityEngine;
 9
 10namespace DCL.PortableExperiences.Confirmation
 11{
 12    public class ExperiencesConfirmationPopupController
 13    {
 14        private enum InputType
 15        {
 16            Accept,
 17            Reject,
 18            Cancel,
 19        }
 20
 21        private readonly IExperiencesConfirmationPopupView view;
 22        private readonly DataStore dataStore;
 23        private readonly IConfirmedExperiencesRepository confirmedExperiencesRepository;
 24        private readonly IUserProfileBridge userProfileBridge;
 25        private readonly IPortableExperiencesAnalyticsService analytics;
 1226        private readonly List<string> descriptionBuffer = new ();
 27
 28        private string experienceId;
 29        private bool dontShowAnymore;
 1230        private CancellationTokenSource openProcessCancellationToken = new ();
 1231        private UniTaskCompletionSource<InputType> userInputTask = new ();
 32
 1233        public ExperiencesConfirmationPopupController(IExperiencesConfirmationPopupView view,
 34            DataStore dataStore,
 35            IConfirmedExperiencesRepository confirmedExperiencesRepository,
 36            IUserProfileBridge userProfileBridge,
 37            IPortableExperiencesAnalyticsService analytics)
 38        {
 1239            this.view = view;
 1240            this.dataStore = dataStore;
 1241            this.confirmedExperiencesRepository = confirmedExperiencesRepository;
 1242            this.userProfileBridge = userProfileBridge;
 1243            this.analytics = analytics;
 44
 1245            view.Hide(true);
 46
 1447            view.OnAccepted += () => userInputTask.TrySetResult(InputType.Accept);
 1448            view.OnRejected += () => userInputTask.TrySetResult(InputType.Reject);
 1349            view.OnCancelled += () => userInputTask.TrySetResult(InputType.Cancel);
 1550            view.OnDontShowAnymore += () => dontShowAnymore = true;
 1451            view.OnKeepShowing += () => dontShowAnymore = false;
 52
 1253            dataStore.world.portableExperiencePendingToConfirm.OnChange += OnConfirmRequested;
 1254        }
 55
 56        public void Dispose()
 57        {
 058            view.Dispose();
 059            openProcessCancellationToken.SafeCancelAndDispose();
 60
 061            dataStore.world.portableExperiencePendingToConfirm.OnChange -= OnConfirmRequested;
 062        }
 63
 64        private void OnConfirmRequested(ExperiencesConfirmationData current, ExperiencesConfirmationData previous)
 65        {
 66            async UniTaskVoid ShowAndWaitForUserInputThenHide(
 67                ExperiencesConfirmationData confirmationData,
 68                CancellationToken cancellationToken)
 69            {
 7870                string pxId = confirmationData.Experience.ExperienceId;
 71
 7872                ExperiencesConfirmationData.ExperienceMetadata metadata = confirmationData.Experience;
 73
 7874                experienceId = pxId;
 75
 7876                descriptionBuffer.Clear();
 77
 7878                if (metadata.Permissions != null)
 79                {
 27280                    foreach (string permission in metadata.Permissions)
 7781                        descriptionBuffer.Add(permission);
 82                }
 83
 7884                view.Show();
 85
 7886                bool isSmartWearable = userProfileBridge.GetOwn().avatar.wearables.Contains(pxId);
 87
 7888                view.SetModel(new ExperiencesConfirmationViewModel
 89                {
 90                    Name = metadata.ExperienceName,
 91                    IconUrl = metadata.IconUrl,
 92                    Permissions = descriptionBuffer,
 93                    Description = metadata.Description,
 94                    IsSmartWearable = isSmartWearable,
 95                });
 96
 97                try
 98                {
 22299                    InputType inputType = await userInputTask.Task.AttachExternalCancellation(cancellationToken);
 100
 101                    switch (inputType)
 102                    {
 103                        case InputType.Accept:
 2104                            if (dontShowAnymore)
 1105                                confirmedExperiencesRepository.Set(experienceId, true);
 106
 2107                            analytics.Accept(experienceId, dontShowAnymore, isSmartWearable ? "smart_wearable" : "scene"
 108
 2109                            confirmationData.OnAcceptCallback?.Invoke();
 2110                            break;
 111                        case InputType.Reject:
 2112                            if (dontShowAnymore)
 1113                                confirmedExperiencesRepository.Set(experienceId, false);
 114
 2115                            analytics.Reject(experienceId, dontShowAnymore, isSmartWearable ? "smart_wearable" : "scene"
 116
 2117                            confirmationData.OnRejectCallback?.Invoke();
 2118                            break;
 119                        case InputType.Cancel:
 1120                            confirmationData.OnRejectCallback?.Invoke();
 121                            break;
 122                    }
 123
 5124                    view.Hide();
 5125                }
 122126                catch (OperationCanceledException) { }
 0127                catch (Exception e) { Debug.LogException(e); }
 66128            }
 129
 78130            openProcessCancellationToken = openProcessCancellationToken.SafeRestart();
 78131            openProcessCancellationToken = new CancellationTokenSource();
 78132            userInputTask.TrySetCanceled();
 78133            userInputTask = new UniTaskCompletionSource<InputType>();
 78134            ShowAndWaitForUserInputThenHide(current, openProcessCancellationToken.Token).Forget();
 78135        }
 136    }
 137}