Inheritance: ViewModelBase
Example #1
0
        // Code to execute when the application is launching (eg, from Start)
        // This code will not execute when the application is reactivated
        private void Application_Launching(object sender, LaunchingEventArgs e)
        {
            Model = new Model.DataModel();
            Api = new EchoNestApi("R2O4VVBVN5EFMCJRP", false);
            bool songsOnDeviceReady = false;
            bool analyzedSongsReady = false;
            bool catalogIdReady = false;

            ExecutionQueue.Enqueue(
                new WaitCallback(BeatMachine.Model.DataModel.GetAnalyzedSongs),
                ExecutionQueue.Policy.Immediate);
            ExecutionQueue.Enqueue(
                new WaitCallback(BeatMachine.Model.DataModel.GetSongsOnDevice),
                ExecutionQueue.Policy.Immediate);
            ExecutionQueue.Enqueue(
                new WaitCallback(BeatMachine.Model.DataModel.LoadCatalogId),
                ExecutionQueue.Policy.Immediate);
            Model.PropertyChanged += new PropertyChangedEventHandler(
                (pSender, pE) =>
                {
                    if (String.Equals(pE.PropertyName, "CatalogId") &&
                        !String.IsNullOrEmpty(Model.CatalogId))
                    {
                        catalogIdReady = true;
                    }
                    else if (String.Equals(pE.PropertyName, "SongsOnDeviceLoaded"))
                    {
                        songsOnDeviceReady = true;
                    }
                    else if (String.Equals(pE.PropertyName, "AnalyzedSongsLoaded"))
                    {
                        analyzedSongsReady = true;
                    }
                    if (catalogIdReady && songsOnDeviceReady && analyzedSongsReady)
                    {
                        ExecutionQueue.Enqueue(
                            new WaitCallback(BeatMachine.Model.DataModel.DiffSongs),
                            ExecutionQueue.Policy.Immediate);

                        // Make sure we only run this once
                        catalogIdReady = false;
                        songsOnDeviceReady = false;
                        analyzedSongsReady = false;
                    }
                });
            Model.PropertyChanged += new PropertyChangedEventHandler(
                (pSender, pE) =>
                {
                    if (String.Equals(pE.PropertyName, "SongsToAnalyzeLoaded"))
                    {
                        if ((pSender as DataModel).SongsToAnalyzeLoaded)
                        {
                            ExecutionQueue.Enqueue(
                                new WaitCallback(
                                    BeatMachine.Model.DataModel.AnalyzeSongs),
                                ExecutionQueue.Policy.Immediate);
                        }
                    }
                    else if (String.Equals(pE.PropertyName, "SongsToAnalyzeBatchUploadReady"))
                    {
                        if ((pSender as DataModel).SongsToAnalyzeBatchUploadReady)
                        {
                            ExecutionQueue.Enqueue(
                                new WaitCallback(
                                    BeatMachine.Model.DataModel.DownloadAnalyzedSongs),
                                ExecutionQueue.Policy.Queued);
                        }
                    }
                    else if (String.Equals(pE.PropertyName, "SongsToAnalyzeBatchDownloadReady"))
                    {
                        if ((pSender as DataModel).SongsToAnalyzeBatchDownloadReady)
                        {
                            ExecutionQueue.Enqueue(
                                new WaitCallback(
                                    BeatMachine.Model.DataModel.AnalyzeSongs),
                                ExecutionQueue.Policy.Queued);
                        }
                    }
                });
        }
Example #2
0
        /// <summary>
        /// Constructor for the Application object.
        /// </summary>
        public App()
        {
            // Global handler for uncaught exceptions.
            UnhandledException += Application_UnhandledException;

            // Standard Silverlight initialization
            InitializeComponent();

            // Phone-specific initialization
            InitializePhoneApplication();

            // Show graphics profiling information while debugging.
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // Display the current frame rate counters.
                Application.Current.Host.Settings.EnableFrameRateCounter = true;

                // Show the areas of the app that are being redrawn in each frame.
                //Application.Current.Host.Settings.EnableRedrawRegions = true;

                // Enable non-production analysis visualization mode,
                // which shows areas of a page that are handed off to GPU with a colored overlay.
                //Application.Current.Host.Settings.EnableCacheVisualization = true;

                // Disable the application idle detection by setting the UserIdleDetectionMode property of the
                // application's PhoneApplicationService object to Disabled.
                // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run
                // and consume battery power when the user is not using the phone.
                //PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;

            }

            DispatcherHelper.Initialize();

            logger = LogManager.GetCurrentClassLogger();

            Model = new DataModel();

            Songs = new ObservableCollection<Group<AnalyzedSong>>();

            Cache = new Dictionary<Song,AnalyzedSong>();

            // Create the database if it does not exist.
            using (BeatMachineDataContext db =
                new BeatMachineDataContext(BeatMachineDataContext.DBConnectionString))
            {
                if (!db.DatabaseExists())
                {
                    logger.Info("Creating new database");
                    db.CreateDatabase();
                }
                else
                {
                    logger.Info("Database exists already");
                }
            }

            MessengerInstance.Register<NewSongsAddedMessage>(
                this,
                m =>
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(o =>
                    {
                        List<IGrouping<int, AnalyzedSong>> rawSongs;
                        using (BeatMachineDataContext context = new BeatMachineDataContext(
                            BeatMachineDataContext.DBConnectionString))
                        {
                            DataLoadOptions dlo = new DataLoadOptions();
                            dlo.LoadWith<AnalyzedSong>(p => p.AudioSummary);
                            context.LoadOptions = dlo;
                            context.ObjectTrackingEnabled = false;
                            rawSongs = context.AnalyzedSongs
                                .Where(s => s.AudioSummary != null)
                                .GroupBy(s => (int)Math.Floor((double)s.AudioSummary.Tempo / 10) * 10)
                                .OrderBy(g => g.Key)
                                .ToList();
                        }

                        foreach (IGrouping<int, AnalyzedSong> g in rawSongs)
                        {
                            List<AnalyzedSong> existingSongs = new List<AnalyzedSong>();
                            foreach (AnalyzedSong s in g)
                            {
                                Song mls = s.MediaLibrarySong;
                                if (mls != null)
                                {
                                    existingSongs.Add(s);
                                    Cache[mls] = s;
                                }
                            }
                            if (existingSongs.Count > 0)
                            {
                                Songs.Add(new Group<AnalyzedSong>(g.Key, g.Shuffle()));

                                SongGroupMessage message = new SongGroupMessage();
                                message.Songs = Songs;
                                message.Cache = Cache;
                                MessengerInstance.Send<SongGroupMessage>(message);
                            }
                        }

                    }));
                });

            // Clean up and restore MediaPlayer settings
            this.ApplicationLifetimeObjects.Add(new RunMediaPlayer(TimeSpan.FromMilliseconds(50)));
        }