public LoginPresenter(ILoginView view, IServerCommunicator serverCommunicator, IMobileConfigurationReader mobileConfigurationReader, INavigationManager navigationManager,
                              IFileSystem fileSystem, IVaultRepositoryFactory vaultRepositoryFactory, ISynchronizer synchronizer, IAlertDisplayer alertDisplayer,
                              ISecureStringConverter secureStringConverter, IApplicationContext applicationContext)
        {
            this.View = view;
            this.MobileConfigurationReader = mobileConfigurationReader;
            this.NavigationManager         = navigationManager;
            this.FileSystem             = fileSystem;
            this.Synchronizer           = synchronizer;
            this.VaultRepositoryFactory = vaultRepositoryFactory;
            this.AlertDisplayer         = alertDisplayer;
            this.SecureStringConverter  = secureStringConverter;
            this.ApplicationContext     = applicationContext;

            var config = MobileConfigurationReader.GetConfiguration();

            this.View.SyncButtonVisible = config.ApplicationMode == ApplicationMode.Client;
            var repository = VaultRepositoryFactory.CreateInstance();
            var vaults     = repository.GetAllVaultNames();

            this.View.VaultNames        = vaults;
            this.View.SelectedVaultName = vaults.FirstOrDefault();


            this.View.Login += OnLogin;
            this.View.NavigateToConfiguration += OnNavigateToConfiguration;
            this.View.Sync += OnSync;
            this.Synchronizer.StatusUpdate += (message) => this.View.ActivityIndicatorText = message;
            this.View.Initialize           += OnInitialize;
        }
        public void OnInitialize()
        {
            var repository = VaultRepositoryFactory.CreateInstance();
            var vaults     = repository.GetAllVaultNames();
            var config     = MobileConfigurationReader.GetConfiguration();

            if (vaults.Count() == 0 && config.ApplicationMode == ApplicationMode.Client && config.AlreadyInitialized)
            {
                OnSync();
            }
        }
        public ConfigurationPresenter(IConfigurationView view, IUrlValidator urlValidator,
                                      IMobileConfigurationReader configurationReader, IMobileConfigurationWriter configurationWriter,
                                      INavigationManager navigationManager, IAlertDisplayer alertDisplayer, ISynchronizationServiceManager synchronizationServiceManager)
        {
            this.View                          = view;
            this.UrlValidator                  = urlValidator;
            this.ConfigurationReader           = configurationReader;
            this.ConfigurationWriter           = configurationWriter;
            this.NavigationManager             = navigationManager;
            this.AlertDisplayer                = alertDisplayer;
            this.SynchronizationServiceManager = synchronizationServiceManager;


            this.View.ApplicationModes = Enum.GetValues(typeof(ApplicationMode)).Cast <ApplicationMode>();
            var configuration = ConfigurationReader.GetConfiguration();

            this.View.SelectedApplicationMode = configuration.ApplicationMode;
            this.View.ServerUrlInputEnabled   = configuration.ApplicationMode == ApplicationMode.Client;
            this.View.ServerUrlInputText      = configuration.ServerUrl ?? "https://";
            this.View.Save += OnSave;
            this.View.ApplicationModeChange += OnSelectedApplicationModeChange;
        }
        public async void OnSave()
        {
            bool goToLogin = !ConfigurationReader.GetConfiguration().AlreadyInitialized;

            var configuration = new MobileConfiguration();

            configuration.ApplicationMode    = this.View.SelectedApplicationMode;
            configuration.Language           = "en"; //TODO make an option
            configuration.AlreadyInitialized = true;

            if (configuration.ApplicationMode == ApplicationMode.Client)
            {
                configuration.ServerUrl = this.View.ServerUrlInputText;
                bool isValid = this.UrlValidator.IsUrlValid(configuration.ServerUrl);

                if (!isValid)
                {
                    this.AlertDisplayer.DisplayAlert(StringResources.InvalidUrl, StringResources.InvalidUrlMessage);
                    return;
                }

                this.SynchronizationServiceManager.StartSynchronizationService();
            }
            else
            {
                this.SynchronizationServiceManager.StopSynchronizationService();
            }

            this.ConfigurationWriter.SaveConfiguration(configuration);
            if (goToLogin)
            {
                await this.NavigationManager.NavigateAsNewStack <ILoginPresenter>();
            }
            else
            {
                await this.NavigationManager.PopCurrent();
            }
        }