示例#1
0
        public PBApp(IResolver moduleLoader, string[] args)
        {
            this.args = args == null ? new string[0] : args;
            clipboardTimer.Elapsed += clipboardTimer_Elapsed;
            this.moduleLoader       = moduleLoader;
            pbData = moduleLoader.GetInstanceOf <IPBData>();
            // pbData.OnProfileUnlock += pbData_OnProfileUnlock;
            pbData.OnUserLoggedIn += pbData_OnUserLoggedIn;
            pbData.OnCloseProfile += pbData_OnCloseProfile;
            currentLanguage        = pbData.GetConfigurationValueByAccountAndKey(DefaultProperties.Configuration_DefaultAccount, "last_selected_lang");
            if (string.IsNullOrWhiteSpace(currentLanguage))
            {
                currentLanguage = "en";
            }
            sync = moduleLoader.GetInstanceOf <IPBSync>();
            sync.OnGetMergePassword(GetMergePassword);
            webAPI         = moduleLoader.GetInstanceOf <IPBWebAPI>();
            BrowserMonitor = moduleLoader.GetInstanceOf <IBrowserMonitor>();
            updater        = moduleLoader.GetInstanceOf <IAppUpdater>();
            updater.UpdatedVersionDetected += UpdatedVersionDetected;
            categories    = new Dictionary <string, string>();
            resourcePaths = new Dictionary <string, Uri>();
            resourcePaths.Add("Fonts", new Uri("/font;component/FontProperty.xaml", UriKind.RelativeOrAbsolute));
            resourcePaths.Add("Themes", new Uri("/theme;component/Theme.xaml", UriKind.RelativeOrAbsolute));
            resourcePaths.Add("Images", new Uri("/image;component/ImageResource.xaml", UriKind.RelativeOrAbsolute));
            resourcePaths.Add("LocalStyles1", new Uri("pack://application:,,,/PBAppUI;component/resources/dictionary/styles/passwordbossresource.xaml", UriKind.RelativeOrAbsolute));
            resourcePaths.Add("LocalStyles2", new Uri("pack://application:,,,/PBAppUI;component/resources/dictionary/styles/primarydashboardresource.xaml", UriKind.RelativeOrAbsolute));
            resourcePaths.Add("LocalStyles3", new Uri("pack://application:,,,/PBAppUI;component/resources/dictionary/styles/AddControlStyles.xaml", UriKind.RelativeOrAbsolute));
            foreach (var uri in resourcePaths.Values)
            {
                LoadAndMerge(uri);
            }
            SetLanguage(currentLanguage);
            SystemTray.SetResolver(moduleLoader);
            sysTray = new SystemTray();
            sysTray.InitializeTrayProperties();
            SystemTray.OnBeforeShutDownHandler += SystemTray_OnBeforeShutDownHandler;
            LoginWindow loginWindow = new LoginWindow(moduleLoader);

            Navigator.NavigationService = loginWindow.MainFrame.NavigationService;
            if (!pbData.ControllerIsUpToDate())
            {
                pbData_OnInvalidVersion(DBFileType.Controller);
            }
            else
            {
                pbData.OnInvalidVersion += pbData_OnInvalidVersion;
            }

            Application.Current.Dispatcher.UnhandledException += onDispatcherUnhandledException;
            systemIdlePoller = new SystemIdlePoller();
        }
        void sync_OnSyncFinished(bool status)
        {
            try
            {
                IPBSync sync = resolver.GetInstanceOf <IPBSync>();
                sync.OnSyncFinished -= sync_OnSyncFinished;
                var browserImporters = resolver.GetAllInstancesOf <BrowserImportStrategyBase>();

                var results = browserImporters.Select(s => s.Import());

                var importedSitesNum       = results.Sum(r => r.Imported);
                var alredyImportedSitesNum = 0;

                List <SecureItem> userSites = pbData.GetSecureItemsByItemType(PasswordBoss.Helpers.DefaultProperties.SecurityItemType_PasswordVault).Where(x => x.Site.IsRecommendedSite == false).ToList();

                if (userSites.Count == 0)
                {
                    alredyImportedSitesNum = 0; //we didn't have anything previous. alredyImportedSitesNum can also mean overlapping between browsers
                }
                else
                {
                    alredyImportedSitesNum = results.Sum(r => r.AlreadyImported);
                }

                var inAppAnalyitics = resolver.GetInstanceOf <IInAppAnalytics>();
                if (inAppAnalyitics != null)
                {
                    ImportPasswordsItem item = new ImportPasswordsItem(importedSitesNum, ImportPasswordsTrigger.Installer, null);
                    var analytics            = inAppAnalyitics.Get <Events.ImportPasswords, ImportPasswordsItem>();
                    analytics.Log(item);
                }

                pbData.ChangePrivateSetting("setup_wizard_imported_passwords_number", importedSitesNum.ToString());
                pbData.ChangePrivateSetting("setup_wizard_already_passwords_number", alredyImportedSitesNum.ToString());

                AddEmailToPI();

                logger.Debug("sync images");
                SyncImagesHelper syncImages = new SyncImagesHelper(pbData, webApi);
                //syncImages.SyncImagesAsync();
                syncImages.SyncImages();

                logger.Debug("Finished");
            }
            finally
            {
                evDone.Set();
            }
        }
示例#3
0
        public MainWindowAdvertising(IResolver resolver)
        {
            InitializeComponent();
            this.resolver = resolver;
            pbData        = resolver.GetInstanceOf <IPBData>();

            sync = resolver.GetInstanceOf <IPBSync>();
            if (sync != null)
            {
                sync.OnSyncFinished += sync_OnSyncSuccess;
            }

            this.Loaded += MainWindowAdvertising_Loaded;


            SetChildren();
        }
        public LoginWindowAdvertising(IResolver resolver)
        {
            InitializeComponent();
            this.resolver = resolver;
            pbData        = resolver.GetInstanceOf <IPBData>();
            sync          = resolver.GetInstanceOf <IPBSync>();
            if (sync != null)
            {
                sync.OnSyncFinished += sync_OnSyncSuccess;
            }
            if (pbData != null)
            {
                pbData.OnUserLoggedIn += pbData_OnUserLoggedIn;
            }

            SetChildren();
        }
示例#5
0
        public ShareCenterViewModel(IResolver resolver)
        {
            this.resolver = resolver;
            this.pbData   = resolver.GetInstanceOf <IPBData>();
            this.pbSync   = resolver.GetInstanceOf <IPBSync>();
            shareCommon   = new ShareCommon(resolver);
            InitializeCommands();
            SelectedIndexTabControl = 0;
            //vedo - async
            System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                categoryList = pbData.GetFoldersBySecureItemType();
            });

            SortSharedWithMeAscendingVisibility  = true;
            SortSharedWithMeDescendingVisibility = false;

            SortSharedByMeAscendingVisibility  = true;
            SortSharedByMeDescendingVisibility = false;
        }
        private void PerformInitialSync()
        {
            try
            {
                //TODO register device
                //if not default device goto verification

                dynamic deviceRegistrationResponse = webApi.RegisterDevice(
                    new WEBApiJSON.DeviceRegistrationRequest()
                {     /*application_language = "en-us", device_language = "en-us",*/
                    installation     = pbData.InstallationUUID,
                    nickname         = Environment.MachineName,
                    software_version = Assembly.GetExecutingAssembly().GetName().Version.ToString()
                }, pbData.ActiveUser);
                if (deviceRegistrationResponse == null)
                {
                    MessageBox.Show("Error in device registration");
                    return;
                }
                else
                {
                    if (deviceRegistrationResponse.error != null)
                    {
                        MessageBox.Show(deviceRegistrationResponse.error.message.ToString());
                        if (deviceRegistrationResponse.error.code.ToString() == "403")
                        {
                            //todo send verification post
                            dynamic verificationRequestResponse = webApi.RequestVerificationCode(pbData.ActiveUser);
                            var     verificationScreen          = resolver.GetInstanceOf <VerificationRequired>();
                            Navigator.NavigationService.Navigate(verificationScreen);
                        }

                        return;
                    }
                }
                pbData.DeviceUUID = deviceRegistrationResponse.devices[0].uuid.ToString();
                Guid g;
                if (!Guid.TryParse(pbData.DeviceUUID, out g))
                {
                    MessageBox.Show("Invalid device ID");
                    return;
                }
                logger.Debug("Adding device");
                if (pbData.AddDevice(
                        new DTO.Device()
                {
                    InstallationId = pbData.InstallationUUID, UUID = pbData.DeviceUUID, Nickname = System.Windows.Forms.SystemInformation.ComputerName
                }) == null)
                {
                    MessageBox.Show("Failed to save device data");
                    return;
                }

                evDone.Reset();
                IPBSync sync = resolver.GetInstanceOf <IPBSync>();
                //sync.OnGetMergePassword(GetMergePassword);
                sync.OnSyncFinished += sync_OnSyncFinished;
                Task.Factory.StartNew(() =>
                {
                    try
                    {
                        if (!sync.Sync(3, ProgressInfo))
                        {
                            logger.Error("Initial sync failed");
                        }
                        else
                        {
                            if (masterPasswordDiffers)
                            {
                                //Treba reci da se pass razlikuje lokalno i na cloud-u i pitati da li zeli promijeniti lokalni pass na onaj sa cloud-a
                                //Ako kaze da onda treba uraditi pbData.ChangeMasterPassword(newPass)
                                masterPasswordDiffers = true;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex.Message);
                    }
                    finally
                    {
                        evSyncDone.Set();
                    }
                });

                evSyncDone.WaitOne();

                evDone.WaitOne();
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
            }
        }
示例#7
0
        public MainWindow([Import(typeof(IResolver))] IResolver resolver)//[ImportMany] IEnumerable<IUIComponent> components, [Import(typeof(IPBData))]IPBData pbData)
        {
            Application.Current.MainWindow = this;
            application = (PBApp)Application.Current;
            //masterDialog = new MasterPwdBox();
            this.resolver = resolver;


            this.components = resolver.GetAllInstancesOf <IUIComponent>();
            if (this.components == null)
            {
                this.components = new List <IUIComponent>();
            }

            this.subComponents = resolver.GetAllInstancesOf <IUISubComponent>();
            if (this.subComponents == null)
            {
                this.subComponents = new List <IUISubComponent>();
            }

            this.dialogs = resolver.GetAllInstancesOf <IDialog>();
            if (this.dialogs == null)
            {
                this.dialogs = new List <IDialog>();
            }

            this.pbData = resolver.GetInstanceOf <IPBData>();
            ServiceLocator.Register <IFolderService>(new FolderService(pbData));

            this.webApi = resolver.GetInstanceOf <IPBWebAPI>();
            this.accountSettingsUserControl = new AccountSettings.AccountSettings(resolver)
            {
                Visibility = System.Windows.Visibility.Collapsed
            };
            this.accountSettingsUserControl.Loaded += accountSettingsUserControl_Loaded;
            this.searchViewModel              = new SearchViewModel(resolver, SecureHolderCollection);
            searchViewModel.ChangeVisibility += (o, e) =>
            {
                topGrid.Visibility = searchViewModel.IsOpen ? Visibility.Collapsed : Visibility.Visible;
                var component = components.FirstOrDefault(x => x.ID == selectedUIComponentID);
                if (component != null)
                {
                    component.Selected = !searchViewModel.IsOpen;
                }
            };

            folderTreeViewModel = new FoldersTreeViewModel(resolver);
            folderTreeViewModel.SelectedFolder_Changed += (o, e) =>
            {
                if (selectedUIComponentID != null)
                {
                    var component = components.FirstOrDefault(x => x.ID == selectedUIComponentID);
                    if (component != null && component.ViewModel is ISecureHolder)
                    {
                        ((ISecureHolder)component.ViewModel).UpdateTreeView();
                    }
                }
            };
            folderTreeViewModel.FolderList_Changed += (o, e) =>
            {
                Reload();
            };
            folderTreeViewModel.ItemsToFolder_Moved += (o, e) =>
            {
                if (selectedUIComponentID != null)
                {
                    foreach (var item in e.Items.GroupBy(x => (x as ISecureItemVM).Type))
                    {
                        var holder = SecureHolderCollection.FirstOrDefault(x => x.SecureItemType == item.Key);
                        if (holder != null)
                        {
                            holder.MoveSecureItemToFolder(item, e.FolderId);
                        }
                    }
                }
            };

            foreach (var holder in SecureHolderCollection)
            {
                holder.FolderListUpdated += (o, e) => { folderTreeViewModel.UpdateFolderTree(); };
                holder.DataUpdated       += (o, e) => { searchViewModel.Update(); };
                holder.AddSecureItem     += (o, e) => { addBtn_Click(null, null); };
            }


            syncImagesHelper = new SyncImagesHelper(pbData, webApi);
            //this.pbData.OnLoginToProfile(pbData_LoginToProfile);
            this.pbData.OnProfileLock  += ProfileLock;
            this.pbData.OnUserLoggedIn += pbData_OnUserLoggedIn;

            Title = this.pbData.ActiveUser;

            resizer = new WindowResizer(this);
            InitializeComponent();

            LoadMenu();
            //LoadDialog(dialogOrder);
            Closing += OnMainClosing;
            sync     = resolver.GetInstanceOf <IPBSync>();
            if (sync != null)
            {
                sync.OnSyncFinished      += sync_OnSyncFinished;
                sync.OnSyncDeviceDeleted += sync_OnSyncDeviceDeleted;
                //sync.OnSyncSuccess += sync_OnSyncSuccess;
            }

            var advertControl = new MainWindowAdvertising(resolver);

            inAppAdvertisingGrid.Children.Add(advertControl);
            Grid.SetColumn(advertControl, 1);

            ucMainSearchBox.DataContext       = searchViewModel;
            mainSearchResultPanel.DataContext = searchViewModel;
            selectFolderControl.DataContext   = folderTreeViewModel;

            this.ResizeMode    = System.Windows.ResizeMode.CanMinimize;
            this.ShowInTaskbar = true;
            LoadForShowOnStartup();
            if (_pbExtSecureBrowserBridge == null)
            {
                _pbExtSecureBrowserBridge = resolver.GetInstanceOf <IPBExtSecureBrowserBridge>();
            }
            this.Activated += MainWindow_Activated;
            SyncAsync();
            var test = this.FindName("menuUserControl") as MenuUserControl;

            this.DataContext = new MainWindowViewModel();
        }
示例#8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="obj"></param>
        private void SubmitButtonClick(object obj)
        {
            try
            {
                evtDone.Reset();
                successVerification = false;

                if (String.IsNullOrWhiteSpace(VerificationText))
                {
                    MessageBoxInfoVisibility = true;
                    MessageBoxInfoText       = Application.Current.FindResource("CodeVerificationErrorNoCode").ToString();
                    return;
                }


                dynamic deviceRegistrationResponse = webAPI.RegisterDevice(new WEBApiJSON.DeviceRegistrationRequest()
                {
                    installation     = pbData.InstallationUUID,
                    nickname         = System.Windows.Forms.SystemInformation.ComputerName,
                    software_version = Assembly.GetAssembly(typeof(PasswordBoss.PBApp)).GetName().Version.ToString(),
                    verification     = VerificationText
                }, email);
                if (deviceRegistrationResponse == null)
                {
                    MessageBoxInfoVisibility = true;
                    MessageBoxInfoText       = Application.Current.FindResource("CodeVerificationErrorDeviceRegistration").ToString();
                    return;
                }
                else
                {
                    if (deviceRegistrationResponse.error != null)
                    {
                        VerificationErrorMessage       = Application.Current.FindResource("IncorrectVerificationCodeDescription").ToString();
                        VerificationApiErrorVisibility = true;

                        return;
                    }
                }
                pbData.DeviceUUID = deviceRegistrationResponse.devices[0].uuid.ToString();
                Guid g;
                if (!Guid.TryParse(pbData.DeviceUUID, out g))
                {
                    MessageBoxInfoVisibility = true;
                    MessageBoxInfoText       = "Invalid device ID";
                    return;
                }
                if (!pbData.CreateProfile(email, mastePassword))
                {
                    MessageBoxInfoVisibility = true;
                    MessageBoxInfoText       = Application.Current.FindResource("ErrorSecureDatabaseCreating").ToString();
                }
                if (pbData.AddDevice(
                        new DTO.Device()
                {
                    InstallationId = pbData.InstallationUUID, UUID = pbData.DeviceUUID, Nickname = System.Windows.Forms.SystemInformation.ComputerName
                }) == null)
                {
                    MessageBoxInfoVisibility = true;
                    MessageBoxInfoText       = "Failed to save device data";
                    return;
                }
                // Account created, can delete pre-registrate message history
                pbData.TryToClearMessageHistory();

                IPBSync sync = resolver.GetInstanceOf <IPBSync>();
                sync.OnSyncFinished += sync_OnSyncFinished;

                Task.Factory.StartNew(() =>
                {
                    try
                    {
                        if (!sync.Sync(3, ProgressInfo))
                        {
                            logger.Error("Initial sync failed");
                        }
                        else
                        {
                            if (masterPasswordDiffers)
                            {
                                //Treba reci da se pass razlikuje lokalno i na cloud-u i pitati da li zeli promijeniti lokalni pass na onaj sa cloud-a
                                //Ako kaze da onda treba uraditi pbData.ChangeMasterPassword(newPass)
                                masterPasswordDiffers = true;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex.Message);
                    }
                    finally
                    {
                        evSyncDone.Set();
                    }
                });

                evSyncDone.WaitOne();

                evtDone.WaitOne();
                sync.OnSyncFinished -= sync_OnSyncFinished;
                if (_finishVerification)
                {
                    ConfirmMasterPasswordViewModel.SetDefaultSettings(pbData);

                    successVerification = true;
                }
            }
            catch (Exception ex)
            {
                logger.Debug(ex.ToString());
            }
        }
示例#9
0
        void sync_OnSyncFinished(bool status)
        {
            try
            {
                IPBSync sync = resolver.GetInstanceOf <IPBSync>();
                sync.OnSyncFinished -= sync_OnSyncFinished;
                List <LoginInfo> chromeLoginInfo = new List <LoginInfo>();
                List <LoginInfo> ieLoginInfo     = new List <LoginInfo>();
                List <LoginInfo> ffLoginInfo     = new List <LoginInfo>();

                Parallel.Invoke(() =>
                {
                    //loading chrome items parallel
                    if (Browsers.BrowserVersionGetter.GetChromeVersion() != null)
                    {
                        //if (!BrowserHelper.IsChromeOpened)
                        //{
                        var tmploginInfo = pbData.GetChromeAccounts();
                        chromeLoginInfo.AddRange(tmploginInfo);
                        //}
                    }
                }
                                , () =>
                {
                    if (Browsers.BrowserVersionGetter.GetIEVersion() != null)
                    {
                        //if (!BrowserHelper.IsIEOpened)
                        //{
                        var tmploginInfo = pbData.GetIEAccounts();
                        ieLoginInfo.AddRange(tmploginInfo);
                        //}
                    }
                }
                                , () =>
                {
                    if (Browsers.BrowserVersionGetter.GetFFVersion() != null)
                    {
                        //if (!BrowserHelper.IsFFOpened)
                        //{
                        var tmploginInfo = pbData.GetFFAccounts(() => { return(null); });
                        ffLoginInfo.AddRange(tmploginInfo);
                        //}
                    }
                });

                SecureItemHelper siHelper        = new SecureItemHelper(pbData, sync);
                int ieImportedSitesNum           = 0;
                int ffImportedSitesNum           = 0;
                int chromeImportedSitesNum       = 0;
                int ieAlredyImportedSitesNum     = 0;
                int ffAlredyImportedSitesNum     = 0;
                int chromeAlredyImportedSitesNum = 0;
                int alredyImportedSitesNum       = 0;

                List <SecureItem> userSites = pbData.GetSecureItemsByItemType(PasswordBoss.Helpers.DefaultProperties.SecurityItemType_PasswordVault).Where(x => x.Site.IsRecommendedSite == false).ToList();
                logger.Debug("Importing sites from browsers - Start");

                siHelper.ImportLoginInfoList(chromeLoginInfo.Where(x => !string.IsNullOrWhiteSpace(x.UserName)).Distinct().ToList(), ref chromeImportedSitesNum, ref chromeAlredyImportedSitesNum);
                siHelper.ImportLoginInfoList(ieLoginInfo.Where(x => !string.IsNullOrWhiteSpace(x.UserName)).Distinct().ToList(), ref ieImportedSitesNum, ref ieAlredyImportedSitesNum);
                siHelper.ImportLoginInfoList(ffLoginInfo.Where(x => !string.IsNullOrWhiteSpace(x.UserName)).Distinct().ToList(), ref ffImportedSitesNum, ref ffAlredyImportedSitesNum);

                logger.Debug("Importing sites from browsers - Finish");

                var importedSitesNum = ieImportedSitesNum + ffImportedSitesNum + chromeImportedSitesNum;

                if (userSites.Count == 0)
                {
                    alredyImportedSitesNum = 0;                     //we didn't have anything previous. alredyImportedSitesNum can also mean overlapping between browsers
                }
                else
                {
                    alredyImportedSitesNum = ieAlredyImportedSitesNum + ffAlredyImportedSitesNum + chromeAlredyImportedSitesNum;
                }

                var inAppAnalyitics = resolver.GetInstanceOf <IInAppAnalytics>();
                if (inAppAnalyitics != null)
                {
                    ImportPasswordsItem item = new ImportPasswordsItem(importedSitesNum, ImportPasswordsTrigger.Installer, null);
                    var analytics            = inAppAnalyitics.Get <Events.ImportPasswords, ImportPasswordsItem>();
                    analytics.Log(item);
                }

                pbData.ChangePrivateSetting("setup_wizard_imported_passwords_number", importedSitesNum.ToString());
                pbData.ChangePrivateSetting("setup_wizard_already_passwords_number", alredyImportedSitesNum.ToString());

                logger.Debug("private settings modified");
                AddEmailToPI();
                logger.Debug("added email to PI");

                SyncImagesHelper syncImages = new SyncImagesHelper(pbData, webApi);
                syncImages.SyncImages();

                logger.Debug("Finished");
            }
            finally
            {
                evDone.Set();
            }
        }
示例#10
0
        private void PerformInitialSync()
        {
            try
            {
                //if not default device goto verification
                string uuid = "";
                if (!TryToRegisterDevice(pbData.ActiveUser, out uuid))
                {
                    return;
                }

                pbData.DeviceUUID = uuid;
                Guid g;
                if (!Guid.TryParse(pbData.DeviceUUID, out g))
                {
                    OnMessageRaised("Invalid device ID");
                    return;
                }
                logger.Debug("Adding device");
                if (pbData.AddDevice(
                        new DTO.Device()
                {
                    InstallationId = pbData.InstallationUUID, UUID = pbData.DeviceUUID, Nickname = System.Windows.Forms.SystemInformation.ComputerName
                }) == null)
                {
                    OnMessageRaised("Failed to save device data");
                    return;
                }

                evDone.Reset();
                IPBSync sync = resolver.GetInstanceOf <IPBSync>();
                //sync.OnGetMergePassword(GetMergePassword);
                sync.OnSyncFinished += sync_OnSyncFinished;
                Task.Factory.StartNew(() =>
                {
                    var sw = Stopwatch.StartNew();
                    try
                    {
                        if (!sync.Sync(3, ProgressInfo))
                        {
                            logger.Error("Initial sync failed");
                        }
                        else
                        {
                        }
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex.Message);
                    }
                    finally
                    {
                        var str = sw.Elapsed.ToString();
                        logger.Info("Sync elasped {0}", str);
                        evSyncDone.Set();
                    }
                });

                evSyncDone.WaitOne();

                evDone.WaitOne();
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
            }
        }
示例#11
0
        /// <summary>
        /// Sets the system tray icon with menus and events binded
        /// </summary>
        public void InitializeTrayProperties()
        {
            sync = resolver.GetInstanceOf <IPBSync>();
            if (sync != null)
            {
                sync.OnSyncSuccess += syncSuccessed;
            }
            forceMessageShowing = true;

            if (_trayNotify != null)
            {
                return;
            }
            //Set up the system tray icon
            _trayNotify = new System.Windows.Forms.NotifyIcon
            {
                //BalloonTipTitle = PBApp.ReturnResourceString(AppTitleKey),
                //BalloonTipText = PBApp.ReturnResourceString(ToolTipKey),
                Text = PBApp.ReturnResourceString(AppTitleKey)
            };

            _trayNotify.MouseClick       += _trayNotify_MouseClick;
            _trayNotify.MouseDoubleClick += _trayNotify_MouseDoubleClick;

            _trayMenu.Renderer = new MyRenderer();
            _trayMenu.Opening += _trayMenu_Opening;

            _menuOpen.MouseEnter += item_MouseEnter;
            _menuOpen.MouseLeave += item_MouseLeave;
            _menuOpen.Click      += _menuOpen_Click;
            _menuOpen.BackColor   = System.Drawing.Color.White;

            _trayMenu.Items.Add(_menuOpen);

            _trayMenu.Items.Add(new System.Windows.Forms.ToolStripSeparator());

            _menuManageDevices.MouseEnter += item_MouseEnter;
            _menuManageDevices.MouseLeave += item_MouseLeave;
            _menuManageDevices.Click      += _menuManageDevices_Click;
            _menuManageDevices.BackColor   = System.Drawing.Color.White;

            _trayMenu.Items.Add(_menuManageDevices);

            _menuCheckUpdates.MouseEnter += item_MouseEnter;
            _menuCheckUpdates.MouseLeave += item_MouseLeave;
            _menuCheckUpdates.Click      += _menuCheckUpdates_Click;
            _menuCheckUpdates.BackColor   = System.Drawing.Color.White;

            _trayMenu.Items.Add(_menuCheckUpdates);

            _menuBackupNow.MouseEnter += item_MouseEnter;
            _menuBackupNow.MouseLeave += item_MouseLeave;
            _menuBackupNow.Click      += _menuBackupNow_Click;
            _menuBackupNow.BackColor   = System.Drawing.Color.White;

            _trayMenu.Items.Add(_menuBackupNow);

            _trayMenu.Items.Add(new System.Windows.Forms.ToolStripSeparator());

            _menuSetting.MouseEnter += item_MouseEnter;
            _menuSetting.MouseLeave += item_MouseLeave;
            _menuSetting.Click      += _menuSetting_Click;
            _menuSetting.BackColor   = System.Drawing.Color.White;

            _trayMenu.Items.Add(_menuSetting);

            _menuSupport.MouseEnter += item_MouseEnter;
            _menuSupport.MouseLeave += item_MouseLeave;
            _menuSupport.Click      += _menuSupport_Click;
            _menuSupport.BackColor   = System.Drawing.Color.White;
            _trayMenu.Items.Add(_menuSupport);

            _menuSysInfo.MouseEnter += item_MouseEnter;
            _menuSysInfo.MouseLeave += item_MouseLeave;
            _menuSysInfo.Click      += _menuSysInfo_Click;
            _menuSysInfo.BackColor   = System.Drawing.Color.White;
            _trayMenu.Items.Add(_menuSysInfo);

#if DEBUG
            _trayMenu.Items.Add(new System.Windows.Forms.ToolStripSeparator());

            _menuExit.MouseEnter += item_MouseEnter;
            _menuExit.MouseLeave += item_MouseLeave;
            _menuExit.Click      += _menuExit_Click;
            _menuExit.BackColor   = System.Drawing.Color.White;
            _trayMenu.Items.Add(_menuExit);
#endif
            _trayNotify.ContextMenuStrip = _trayMenu;

            try
            {
                _trayNotify.Icon = new System.Drawing.Icon(TrayIconStream);
                if (_trayNotify != null)
                {
                    // Show the icon
                    _trayNotify.Visible = true;

                    // Show the balloon tip
                    // _trayNotify.ShowBalloonTip(2000);
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show((string)System.Windows.Application.Current.FindResource("GeneralErrorText"));
                logger.Error(ex.Message);
            }
        }