예제 #1
0
            public void RestricsAccessForApiDeprecatedException()
            {
                ErrorHandlingService.TryHandleDeprecationError(exception);

                AccessRestrictionStorage.Received().SetApiOutdated();
            }
예제 #2
0
            public void RestrictsAccessForNoWorkspaceException()
            {
                ErrorHandlingService.TryHandleNoDefaultWorkspaceError(new NoDefaultWorkspaceException());

                AccessRestrictionStorage.Received().SetNoDefaultWorkspaceStateReached(true);
            }
예제 #3
0
            public void ReturnsTrueForApiDeprecatedException()
            {
                var result = ErrorHandlingService.TryHandleDeprecationError(exception);

                result.Should().BeTrue();
            }
예제 #4
0
            public void DoesNotNavigateForDifferentExceptions()
            {
                ErrorHandlingService.TryHandleUnauthorizedError(exception);

                NavigationService.DidNotReceive().Navigate <TokenResetViewModel>();
            }
예제 #5
0
            public void ReturnsTrueForNoWorkspaceException()
            {
                var result = ErrorHandlingService.TryHandleNoDefaultWorkspaceError(new NoDefaultWorkspaceException());

                result.Should().BeTrue();
            }
예제 #6
0
            public void NavigatesToOutdatedAppViewModelForClientDeprecatedException()
            {
                ErrorHandlingService.TryHandleUnauthorizedError(exception);

                NavigationService.Received().Navigate <TokenResetViewModel>();
            }
예제 #7
0
            public void DoesNotRestrictAccessForDifferentExceptions()
            {
                ErrorHandlingService.TryHandleUnauthorizedError(exception);

                AccessRestrictionStorage.DidNotReceive().SetUnauthorizedAccess(Arg.Any <string>());
            }
예제 #8
0
            public void RestricsAccessForClientDeprecatedException()
            {
                ErrorHandlingService.TryHandleUnauthorizedError(exception);

                AccessRestrictionStorage.Received().SetUnauthorizedAccess(Arg.Is(User.ApiToken));
            }
예제 #9
0
            public void ReturnsTrueForClientDeprecatedException()
            {
                var result = ErrorHandlingService.TryHandleUnauthorizedError(exception);

                result.Should().BeTrue();
            }
예제 #10
0
            public void DoesNotNavigateForDifferentExceptions()
            {
                ErrorHandlingService.TryHandleDeprecationError(exception);

                NavigationService.DidNotReceive().Navigate <OutdatedAppViewModel>();
            }
예제 #11
0
        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            _deferral = taskInstance.GetDeferral();

            // Set the API to use depending on the settings
            SdkService.MegaSdk.changeApiUrl(SettingsService.LoadSetting(
                                                ResourceService.SettingsResources.GetString("SR_UseStagingServer"), false) ?
                                            "https://staging.api.mega.co.nz/" : "https://g.api.mega.co.nz/");

            // Load the connection upload settings
            CameraUploadsConnectionType cameraUploadsConnectionType = CameraUploadsConnectionType.EthernetWifiOnly;

            try
            {
                cameraUploadsConnectionType = (CameraUploadsConnectionType)await SettingsService.LoadSettingFromFileAsync <int>("CameraUploadsSettingsHowKey");
            }
            catch (Exception e)
            {
                LogService.Log(MLogLevel.LOG_LEVEL_ERROR, "Could not load settings", e);
            }


            if (!CheckNetWork(cameraUploadsConnectionType))
            {
                _deferral.Complete();
                return;
            }

            SdkService.InitializeSdkParams();

            var loggedIn = await LoginAsync();

            if (loggedIn)
            {
                var fetched = await FetchNodesAsync();

                if (fetched)
                {
                    // Enable the transfers resumption for the Camera Uploads service
                    SdkService.MegaSdk.enableTransferResumption();

                    var megaGlobalListener = new MegaGlobalListener();
                    SdkService.MegaSdk.addGlobalListener(megaGlobalListener);
                    await megaGlobalListener.ExecuteAsync(() => SdkService.MegaSdk.enableTransferResumption());

                    var cameraUploadRootNode = await SdkService.GetCameraUploadRootNodeAsync();

                    if (cameraUploadRootNode == null)
                    {
                        // No camera upload node found or created
                        // Just finish this run and try again next time
                        LogService.Log(MLogLevel.LOG_LEVEL_ERROR, "No Camera Uploads folder detected/created");
                        _deferral.Complete();
                        return;
                    }

                    // Load the file upload settings
                    CameraUploadsFileType cameraUploadsFileType = CameraUploadsFileType.PhotoAndVideo;
                    try
                    {
                        cameraUploadsFileType = (CameraUploadsFileType)await SettingsService.LoadSettingFromFileAsync <int>("CameraUploadsSettingsFileKey");
                    }
                    catch (Exception e)
                    {
                        LogService.Log(MLogLevel.LOG_LEVEL_ERROR, "Could not load settings", e);
                    }

                    var uploadFolders = new List <StorageFolder>();
                    switch (cameraUploadsFileType)
                    {
                    case CameraUploadsFileType.PhotoAndVideo:
                        uploadFolders.Add(KnownFolders.PicturesLibrary);
                        uploadFolders.Add(KnownFolders.VideosLibrary);
                        break;

                    case CameraUploadsFileType.PhotoOnly:
                        uploadFolders.Add(KnownFolders.PicturesLibrary);
                        break;

                    case CameraUploadsFileType.VideoOnly:
                        uploadFolders.Add(KnownFolders.VideosLibrary);
                        break;
                    }

                    // Get the IMAGE and/or VIDEO files to upload to MEGA
                    var fileToUpload = await TaskService.GetAvailableUploadAsync(
                        TaskService.ImageDateSetting, uploadFolders.ToArray());

                    foreach (var storageFile in fileToUpload)
                    {
                        // Skip the current file if it has failed more than the max error count
                        if (await ErrorHandlingService.SkipFileAsync(
                                storageFile.Name,
                                ErrorHandlingService.ImageErrorFileSetting,
                                ErrorHandlingService.ImageErrorCountSetting))
                        {
                            continue;
                        }

                        if (!CheckNetWork(cameraUploadsConnectionType))
                        {
                            break;
                        }

                        // Calculate time for fingerprint check and upload
                        ulong mtime = TaskService.CalculateMtime(storageFile.DateCreated.DateTime);
                        try
                        {
                            using (var fs = await storageFile.OpenStreamForReadAsync())
                            {
                                var isUploaded = SdkService.IsAlreadyUploaded(storageFile, fs, cameraUploadRootNode, mtime);
                                if (isUploaded)
                                {
                                    await TaskService.SaveLastUploadDateAsync(storageFile, TaskService.ImageDateSetting);

                                    continue;
                                }
                                await SdkService.UploadAsync(storageFile, fs, cameraUploadRootNode, mtime);

                                // No error, clear error storage
                                await ErrorHandlingService.ClearAsync(ErrorHandlingService.ImageErrorFileSetting,
                                                                      ErrorHandlingService.ImageErrorCountSetting);
                            }
                        }
                        catch (OutOfMemoryException e)
                        {
                            // Something went wrong (could be memory limit)
                            // Just finish this run and try again next time
                            LogService.Log(MLogLevel.LOG_LEVEL_ERROR, "Out of memory while uploading", e);
                            break;
                        }
                        catch (Exception e)
                        {
                            LogService.Log(MLogLevel.LOG_LEVEL_ERROR, "Error uploading item", e);
                            await ErrorHandlingService.SetFileErrorAsync(storageFile.Name,
                                                                         ErrorHandlingService.ImageErrorFileSetting, ErrorHandlingService.ImageErrorCountSetting);
                        }
                    }
                }
                else
                {
                    LogService.Log(MLogLevel.LOG_LEVEL_ERROR, "Failed to fetch nodes");
                }
            }
            else
            {
                LogService.Log(MLogLevel.LOG_LEVEL_ERROR, "Failed to login");
            }

            _deferral.Complete();
        }
예제 #12
0
        protected override void InitializeApp(IMvxPluginManager pluginManager, IMvxApplication app)
        {
            const string clientName                  = "Giskard";
            var          packageInfo                 = ApplicationContext.PackageManager.GetPackageInfo(ApplicationContext.PackageName, 0);
            var          version                     = packageInfo.VersionName;
            var          sharedPreferences           = ApplicationContext.GetSharedPreferences(clientName, FileCreationMode.Private);
            var          database                    = new Database();
            var          scheduler                   = Scheduler.Default;
            var          timeService                 = new TimeService(scheduler);
            var          backgroundService           = new BackgroundService(timeService, analyticsService);
            var          suggestionProviderContainer = new SuggestionProviderContainer(
                new MostUsedTimeEntrySuggestionProvider(database, timeService, maxNumberOfSuggestions)
                );

            var appVersion              = Version.Parse(version);
            var userAgent               = new UserAgent(clientName, version);
            var dialogService           = new DialogServiceAndroid();
            var platformInfo            = new PlatformInfoAndroid();
            var keyValueStorage         = new SharedPreferencesStorageAndroid(sharedPreferences);
            var settingsStorage         = new SettingsStorage(appVersion, keyValueStorage);
            var schedulerProvider       = new AndroidSchedulerProvider();
            var permissionsService      = new PermissionsServiceAndroid();
            var calendarService         = new CalendarServiceAndroid(permissionsService);
            var automaticSyncingService = new AutomaticSyncingService(backgroundService, timeService, analyticsService);
            var errorHandlingService    = new ErrorHandlingService(navigationService, settingsStorage);

            ApplicationContext.RegisterReceiver(new TimezoneChangedBroadcastReceiver(timeService),
                                                new IntentFilter(Intent.ActionTimezoneChanged));

            var foundation =
                TogglFoundation
                .ForClient(userAgent, appVersion)
                .WithDatabase(database)
                .WithScheduler(scheduler)
                .WithTimeService(timeService)
                .WithApiEnvironment(environment)
                .WithGoogleService <GoogleServiceAndroid>()
                .WithRatingService(new RatingServiceAndroid(ApplicationContext))
                .WithLicenseProvider <LicenseProviderAndroid>()
                .WithAnalyticsService(analyticsService)
                .WithSchedulerProvider(schedulerProvider)
                .WithPlatformInfo(platformInfo)
                .WithNotificationService <NotificationServiceAndroid>()
                .WithRemoteConfigService <RemoteConfigServiceAndroid>()
                .WithApiFactory(new ApiFactory(environment, userAgent))
                .WithBackgroundService(backgroundService)
                .WithAutomaticSyncingService(automaticSyncingService)
                .WithSuggestionProviderContainer(suggestionProviderContainer)
                .WithApplicationShortcutCreator(new ApplicationShortcutCreator(ApplicationContext))
                .WithStopwatchProvider <FirebaseStopwatchProviderAndroid>()
                .WithIntentDonationService(new NoopIntentDonationServiceAndroid())
                .WithPrivateSharedStorageService(new NoopPrivateSharedStorageServiceAndroid())
                .WithBackgroundSyncService <BackgroundSyncServiceAndroid>()
                .StartRegisteringPlatformServices()
                .WithDialogService(dialogService)
                .WithLastTimeUsageStorage(settingsStorage)
                .WithBrowserService <BrowserServiceAndroid>()
                .WithCalendarService(calendarService)
                .WithKeyValueStorage(keyValueStorage)
                .WithUserPreferences(settingsStorage)
                .WithOnboardingStorage(settingsStorage)
                .WithNavigationService(navigationService)
                .WithPermissionsService(permissionsService)
                .WithAccessRestrictionStorage(settingsStorage)
                .WithErrorHandlingService(errorHandlingService)
                .WithSyncErrorHandlingService(new SyncErrorHandlingService(errorHandlingService))
                .WithRxActionFactory(new RxActionFactory(schedulerProvider))
                .Build();

            foundation.RevokeNewUserIfNeeded().Initialize();

            ensureDataSourceInitializationIfLoggedIn();
            createApplicationLifecycleObserver(backgroundService);

            base.InitializeApp(pluginManager, app);
        }