< Summary

Class:DCLFeatures.ScreencaptureCamera.CameraObject.ScreencaptureCameraBehaviour
Assembly:ScreencaptureCamera
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/ScreencaptureCamera/CameraObject/Scripts/ScreencaptureCameraBehaviour.cs
Covered lines:0
Uncovered lines:131
Coverable lines:131
Total lines:327
Line coverage:0% (0 of 131)
Covered branches:0
Total branches:0
Covered methods:0
Total methods:29
Method coverage:0% (0 of 29)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ScreencaptureCameraBehaviour()0%2100%
Awake()0%2100%
Start()0%2100%
OnDestroy()0%12300%
OpenCameraReelGallery(...)0%2100%
OpenCameraReelGallery(...)0%12300%
SetExternalDependencies(...)0%2100%
CaptureScreenshot(...)0%30500%
>c__DisplayClass69_0/<<CaptureScreenshot()0%12300%
ToggleScreenshotCamera(...)0%56700%
OpenCameraAsync()0%12300%
CloseScreenshotCamera(...)0%2100%
ToggleScreenshotCamera(...)0%2100%
ToggleCameraSystems(...)0%30500%
SetScreenshotCameraActive(...)0%2100%
SetPlayerCameraActive(...)0%2100%
ToggleExternalSystems(...)0%6200%
UpdateStorageInfo()0%12300%
InstantiateCameraObjects()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/ScreencaptureCamera/CameraObject/Scripts/ScreencaptureCameraBehaviour.cs

#LineLine coverage
 1using Cinemachine;
 2using Cysharp.Threading.Tasks;
 3using DCL;
 4using DCL.Camera;
 5using DCL.CameraTool;
 6using DCL.Helpers;
 7using DCL.Skybox;
 8using DCL.Tasks;
 9using DCLFeatures.ScreencaptureCamera.UI;
 10using DCLServices.CameraReelService;
 11using System;
 12using System.Threading;
 13using UnityEngine;
 14using Environment = DCL.Environment;
 15
 16namespace DCLFeatures.ScreencaptureCamera.CameraObject
 17{
 18    public class ScreencaptureCameraBehaviour : MonoBehaviour
 19    {
 20        private const string UPLOADING_ERROR_MESSAGE = "There was an unexpected error when uploading the picture. Try ag
 21        private const string STORAGE_LIMIT_REACHED_MESSAGE = "You can't take more pictures because you have reached the 
 22
 23        private const float SPLASH_FX_DURATION = 0.5f;
 24        private const float MIDDLE_PAUSE_FX_DURATION = 0.1f;
 25        private const float IMAGE_TRANSITION_FX_DURATION = 0.5f;
 26
 27        private const float MIN_PLAYERNAME_HEIGHT = 1.14f;
 28
 29        [Header("MAIN COMPONENTS")]
 30        [SerializeField] internal Camera cameraPrefab;
 31        [SerializeField] internal ScreencaptureCameraHUDView screencaptureCameraHUDViewPrefab;
 32        [SerializeField] private PlayerName playerNamePrefab;
 33
 34        [SerializeField] private CharacterController cameraTarget;
 35        [SerializeField] private CinemachineVirtualCamera virtualCamera;
 36
 37        internal Camera mainCamera;
 38        internal DCLCharacterController characterController;
 39        internal CameraController cameraController;
 40
 41        internal Camera screenshotCamera;
 42        internal BooleanVariable isScreencaptureCameraActive;
 43
 44        internal ScreenRecorder screenRecorderLazyValue;
 45        internal IAvatarsLODController avatarsLODControllerLazyValue;
 46
 047        internal ScreencaptureCameraFactory factory = new ();
 48
 49        private bool isInstantiated;
 050        private float lastScreenshotTime = -Mathf.Infinity;
 51        private CameraReelStorageStatus storageStatus;
 52        private string playerId;
 53        private PlayerName playerName;
 54        private CancellationTokenSource uploadPictureCancellationToken;
 55
 56        // UI
 57        private Canvas enableCameraButton;
 58        private ScreencaptureCameraHUDView screencaptureCameraHUDView;
 59        private ScreencaptureCameraHUDController screencaptureCameraHUDController;
 60
 61        // Lazy Values
 62        private CinemachineBrain characterCinemachineBrainLazyValue;
 63        private ICameraReelStorageService cameraReelStorageServiceLazyValue;
 64
 65        // Cached states
 66        private bool prevMouseLockState;
 67        private bool prevMouseButtonCursorLockMode;
 68        private Camera prevSkyboxCamera;
 69
 70        // DataStore Variables
 71        private BooleanVariable allUIHidden;
 72        private BooleanVariable cameraModeInputLocked;
 73        private BaseVariable<bool> cameraLeftMouseButtonCursorLock;
 74        private BooleanVariable cameraBlocked;
 75        private BooleanVariable featureKeyTriggersBlocked;
 76        private BooleanVariable userMovementKeysBlocked;
 77
 78        private bool isInTransition;
 79
 80        private InputAction_Trigger toggleScreenshotCameraAction;
 81        private InputAction_Trigger toggleCameraReelAction;
 82        private InputAction_Trigger exitScreenshotModeAction;
 83
 084        public DataStore_Player Player { private get; set; }
 085        public bool HasStorageSpace => storageStatus.HasFreeSpace;
 86
 087        private ICameraReelStorageService cameraReelStorageService => cameraReelStorageServiceLazyValue ??= Environment.
 088        private ICameraReelAnalyticsService analytics => Environment.i.serviceLocator.Get<ICameraReelAnalyticsService>()
 89
 090        private Transform characterCameraTransform => mainCamera.transform;
 091        private CinemachineBrain characterCinemachineBrain => characterCinemachineBrainLazyValue ??= mainCamera.GetCompo
 092        private IAvatarsLODController avatarsLODController => avatarsLODControllerLazyValue ??= Environment.i.serviceLoc
 93
 94        private ScreenRecorder screenRecorderLazy
 95        {
 96            get
 97            {
 098                if (isInstantiated)
 099                    return screenRecorderLazyValue;
 100
 0101                InstantiateCameraObjects();
 102
 0103                return screenRecorderLazyValue;
 104            }
 105        }
 106
 0107        private bool isOnCooldown => Time.time - lastScreenshotTime < SPLASH_FX_DURATION + IMAGE_TRANSITION_FX_DURATION 
 108
 109        internal void Awake()
 110        {
 0111            toggleScreenshotCameraAction = Resources.Load<InputAction_Trigger>("ToggleScreenshotCamera");
 0112            toggleCameraReelAction = Resources.Load<InputAction_Trigger>("ToggleCameraReelSection");
 0113            exitScreenshotModeAction = Resources.Load<InputAction_Trigger>("CloseScreenshotCamera");
 114
 0115            toggleScreenshotCameraAction.OnTriggered += ToggleScreenshotCamera;
 0116            toggleCameraReelAction.OnTriggered += OpenCameraReelGallery;
 117
 0118            exitScreenshotModeAction.OnTriggered += CloseScreenshotCamera;
 119
 0120            uploadPictureCancellationToken = new CancellationTokenSource();
 0121        }
 122
 123        private void Start()
 124        {
 0125            playerId = Player.ownPlayer.Get().id;
 0126            storageStatus = new CameraReelStorageStatus(0, 0);
 127
 0128            UpdateStorageInfo();
 129
 0130            characterController = DCLCharacterController.i;
 0131            cameraController = SceneReferences.i.cameraController;
 0132            mainCamera = cameraController.GetCamera();
 0133        }
 134
 135        internal void OnDestroy()
 136        {
 0137            uploadPictureCancellationToken?.Cancel();
 0138            uploadPictureCancellationToken?.Dispose();
 139
 0140            toggleScreenshotCameraAction.OnTriggered -= ToggleScreenshotCamera;
 0141            toggleCameraReelAction.OnTriggered -= OpenCameraReelGallery;
 0142            exitScreenshotModeAction.OnTriggered -= CloseScreenshotCamera;
 0143        }
 144
 145        private void OpenCameraReelGallery(DCLAction_Trigger _) =>
 0146            OpenCameraReelGallery("Shortcut");
 147
 148        private void OpenCameraReelGallery(string source)
 149        {
 0150            if (isScreencaptureCameraActive.Get())
 0151                ToggleScreenshotCamera(isEnabled: false);
 152
 0153            bool cameraReelWasOpen = DataStore.i.HUDs.cameraReelSectionVisible.Get();
 154
 0155            if (!cameraReelWasOpen)
 0156                DataStore.i.HUDs.cameraReelOpenSource.Set(source);
 157
 0158            DataStore.i.HUDs.cameraReelSectionVisible.Set(!cameraReelWasOpen);
 0159        }
 160
 161        public void SetExternalDependencies(BooleanVariable allUIHidden, BooleanVariable cameraModeInputLocked, BaseVari
 162            BooleanVariable cameraBlocked, BooleanVariable featureKeyTriggersBlocked, BooleanVariable userMovementKeysBl
 163        {
 0164            this.allUIHidden = allUIHidden;
 0165            this.cameraModeInputLocked = cameraModeInputLocked;
 0166            this.cameraLeftMouseButtonCursorLock = cameraLeftMouseButtonCursorLock;
 0167            this.cameraBlocked = cameraBlocked;
 0168            this.featureKeyTriggersBlocked = featureKeyTriggersBlocked;
 0169            this.userMovementKeysBlocked = userMovementKeysBlocked;
 0170            isScreencaptureCameraActive = isScreenshotCameraActive;
 0171        }
 172
 173        public void CaptureScreenshot(string source)
 174        {
 0175            if (isOnCooldown || !storageStatus.HasFreeSpace || !isScreencaptureCameraActive.Get() || screenRecorderLazy.
 176
 0177            lastScreenshotTime = Time.time;
 0178            screencaptureCameraHUDController.SetVisibility(false, storageStatus.HasFreeSpace);
 179
 0180            StartCoroutine(screenRecorderLazy.CaptureScreenshot(OnComplete));
 0181            return;
 182
 183            void OnComplete(Texture2D screenshot)
 184            {
 0185                screencaptureCameraHUDController.SetVisibility(true, storageStatus.HasFreeSpace);
 0186                screencaptureCameraHUDController.PlayScreenshotFX(screenshot, SPLASH_FX_DURATION, MIDDLE_PAUSE_FX_DURATI
 187
 0188                var metadata = ScreenshotMetadata.Create(Player, avatarsLODController, screenshotCamera);
 0189                UploadScreenshotAsync(screenshot, metadata, source, uploadPictureCancellationToken.Token).Forget();
 0190            }
 191
 192            async UniTaskVoid UploadScreenshotAsync(Texture2D screenshot, ScreenshotMetadata metadata, string source, Ca
 193            {
 194                try
 195                {
 0196                    storageStatus = await cameraReelStorageService.UploadScreenshot(screenshot, metadata, cancellationTo
 197
 0198                    analytics.TakePhoto(metadata.userAddress,
 199                        $"{metadata.scene.location.x},{metadata.scene.location.y}",
 200                        metadata.visiblePeople.Length,
 201                        source);
 0202                }
 0203                catch (OperationCanceledException) { }
 0204                catch (ScreenshotLimitReachedException) { DataStore.i.notifications.DefaultErrorNotification.Set(STORAGE
 205                catch (Exception e)
 206                {
 0207                    DataStore.i.notifications.DefaultErrorNotification.Set(UPLOADING_ERROR_MESSAGE, true);
 0208                    Debug.LogException(e);
 0209                }
 0210            }
 211        }
 212
 213        public void ToggleScreenshotCamera(string source = null, bool isEnabled = true)
 214        {
 0215            if (isInTransition || isEnabled == isScreencaptureCameraActive.Get()) return;
 216
 0217            if (isEnabled && !string.IsNullOrEmpty(source))
 0218                analytics.OpenCamera(source);
 219
 0220            UpdateStorageInfo();
 221
 0222            bool activateScreenshotCamera = !(isInstantiated && screenshotCamera.gameObject.activeSelf);
 0223            Utils.UnlockCursor();
 224
 0225            if (activateScreenshotCamera)
 0226                OpenCameraAsync();
 227            else
 228            {
 0229                ToggleExternalSystems(activateScreenshotCamera: false);
 0230                ToggleCameraSystems(activateScreenshotCamera: false);
 0231                isScreencaptureCameraActive.Set(false);
 232            }
 0233        }
 234
 235        private async void OpenCameraAsync()
 236        {
 0237            isInTransition = true;
 238
 0239            cameraModeInputLocked.Set(true);
 0240            cameraController.SetCameraMode(CameraMode.ModeId.ThirdPerson);
 241
 0242            await UniTask.WaitWhile(() => cameraController.CameraIsBlending);
 0243            isInTransition = false;
 244
 0245            ToggleExternalSystems(activateScreenshotCamera: true);
 0246            ToggleCameraSystems(activateScreenshotCamera: true);
 0247            isScreencaptureCameraActive.Set(true);
 0248        }
 249
 250        private void CloseScreenshotCamera(DCLAction_Trigger _) =>
 0251            ToggleScreenshotCamera("Shortcut", isEnabled: false);
 252
 253        private void ToggleScreenshotCamera(DCLAction_Trigger _) =>
 0254            ToggleScreenshotCamera("Shortcut", isEnabled: !isScreencaptureCameraActive.Get());
 255
 256        private void ToggleCameraSystems(bool activateScreenshotCamera)
 257        {
 0258            if (activateScreenshotCamera)
 259            {
 0260                if (!isInstantiated)
 0261                    InstantiateCameraObjects();
 262
 0263                prevSkyboxCamera = SkyboxController.i.SkyboxCamera.CurrentCamera;
 0264                SkyboxController.i.AssignMainOverlayCamera(screenshotCamera.transform);
 0265                playerName.Show();
 266            }
 267            else
 268            {
 0269                SkyboxController.i.AssignMainOverlayCamera(prevSkyboxCamera.transform);
 0270                playerName.Hide();
 271            }
 272
 0273            SetPlayerCameraActive(isActive: !activateScreenshotCamera);
 0274            SetScreenshotCameraActive(isActive: activateScreenshotCamera);
 0275            avatarsLODController.SetCamera(activateScreenshotCamera ? screenshotCamera : mainCamera);
 0276        }
 277
 278        private void SetScreenshotCameraActive(bool isActive)
 279        {
 0280            screenshotCamera.gameObject.SetActive(isActive);
 0281            screencaptureCameraHUDController.SetVisibility(isActive, storageStatus.HasFreeSpace);
 0282        }
 283
 284        private void SetPlayerCameraActive(bool isActive)
 285        {
 0286            cameraController.SetCameraEnabledState(isActive);
 0287            characterController.SetMovementInputToZero();
 0288            characterCinemachineBrain.enabled = isActive;
 0289        }
 290
 291        private void ToggleExternalSystems(bool activateScreenshotCamera)
 292        {
 0293            if (activateScreenshotCamera)
 294            {
 0295                allUIHidden.Set(true);
 296
 0297                cameraModeInputLocked.Set(true);
 298
 0299                prevMouseButtonCursorLockMode = cameraLeftMouseButtonCursorLock.Get();
 0300                cameraLeftMouseButtonCursorLock.Set(true);
 301            }
 302            else
 303            {
 0304                allUIHidden.Set(false);
 0305                cameraModeInputLocked.Set(false);
 0306                cameraLeftMouseButtonCursorLock.Set(prevMouseButtonCursorLockMode);
 307            }
 308
 0309            cameraBlocked.Set(activateScreenshotCamera);
 0310            featureKeyTriggersBlocked.Set(activateScreenshotCamera);
 0311            userMovementKeysBlocked.Set(activateScreenshotCamera);
 0312        }
 313
 314        private async void UpdateStorageInfo() =>
 0315            storageStatus = await cameraReelStorageService.GetUserGalleryStorageInfo(playerId);
 316
 317        internal void InstantiateCameraObjects()
 318        {
 0319            (screencaptureCameraHUDController, screencaptureCameraHUDView) = factory.CreateHUD(this, screencaptureCamera
 0320            screenRecorderLazyValue = factory.CreateScreenRecorder(screencaptureCameraHUDView.RectTransform);
 0321            screenshotCamera = factory.CreateScreencaptureCamera(cameraPrefab, characterCameraTransform, transform, char
 0322            playerName = factory.CreatePlayerNameUI(playerNamePrefab, MIN_PLAYERNAME_HEIGHT, Player, playerAvatar: chara
 323
 0324            isInstantiated = true;
 0325        }
 326    }
 327}