public Promise Start(Student student, Activity activity, bool resetActivityState = false)
		{
			Promise promise = new Promise();

			try
			{
				ActivityState activityState = null;

				activityService.LoadActivityState(student.Id, activity.Id, true).ThenAs<ActivityState>((ActivityState state) =>
				{
					activityState = state;
					if (resetActivityState || !activityState.CanResume)
					{
						// Generate a new trace ID for restarts or new games that don't have saved state
						activityState.TraceId = Guid.NewGuid().ToString();
					}

					DebugLog.Info("Start activity!");
//					startedEntry = TraceLog.Player(TraceLog.Action.Started, "Activity",
//					                               "Name", activity.Name,
//					                               "ActivityUri", activity.Uri,
//					                               "IsComplete", activityState.IsComplete,
//					                               "CanResume", activityState.CanResume,
//					                               "Restart", resetActivityState,
//					                               "StartDate", activityState.ModifiedDate.ToIso8601(),
//					                               "Username", student.Username,
//					                               "SubjectId", student.SubjectId,
//					                               "TraceId", activityState.TraceId);
//					
//					if (activity.Uri.Contains("episode"))
//					{
//						LaunchEpisode(activityState, activity.Name, activity.Uri, resetActivityState);                
//					}
//					else if (activity.Uri.Contains("assessment"))
//					{
//						LaunchAssessment(activityState, activity.Name, activity.Uri);                
//					}
//					else if (activity.Uri.Contains("http"))
//					{
//						LaunchUrl(activityState, activity.Name, activity.Uri);
//					} 
//					else
//					{
//						throw new Exception(String.Format("{0} has an unknown URI type: ", activity.Name, activity.Uri));
//					}	

					promise.Resolve(viewModelFactory.Resolve<ActivityViewModel>(Resolve(activity.Uri), vm =>
					{
						vm.Activity = activity;
						vm.ActivityState = activityState;
					}));

//					promise.Resolve(viewModelFactory.Resolve<WebActivityViewModel>(web => 
//					{
//						web.Title = "Web Browser Launched";
//						web.Message = "Complete web viewer action for " + activity.Name;
//						web.URL = "http://www.google.com";
//					}));

					return true;
				})
				.Catch((Exception e) => 
				{
					promise.Reject(e);
				});                 
			}
			catch (Exception e)
			{
				promise.Reject(e);
			}

			return promise;
		}
		public void OnClicked(Activity activity)
		{
			ViewModel.StartActivity(activity);
		}
		public void StartActivity(Activity activity)
		{
			try
			{
				Contract.ArgumentNotNull("activity", activity);
				
				DebugLog.Info("Started Activity {0}", activity.Name);

                navigator.Reveal<ProgressIndicatorViewModel>().ThenAs<ProgressIndicatorViewModel>((ProgressIndicatorViewModel progressIndicatorViewModel) =>
                {
                    ProgressIndicatorViewModel.ProgressInfo busyIndicator = progressIndicatorViewModel.Begin("Starting...");
                    activityLauncher.Start(sessionState.Student, activity, false)
                    .ThenAs<ViewModel>((ViewModel activityViewModel) =>
                    {
                        navigator.Transition(this, activityViewModel);
                        return true;
                    })
                    .Catch((Exception e) =>
                           {
                               navigator.Reveal<AlertViewModel>(alert =>
                                                                {
                                                                    alert.Title = "Unable to start activity";
                                                                    alert.Message = e.Message;
                                                                    alert.Error = e;
                                                                    alert.AlertDismissed += ((int index) => DebugLog.Info("Button {0} pressed", index));
                                                                });

                           }).Finally(() =>
                           {
                               busyIndicator.Dispose();
                           });
                    return true;
                });
			}
			catch (Exception e)
			{
				navigator.Reveal<AlertViewModel>(alert => 
				                                 {
					alert.Title = "Unable to start activity";
					alert.Message = e.Message;
					alert.Error = e;
				});
			}
		}