public StatusChangePage(Planning planning) { InitializeComponent(); hasNavigatedFrom = HasNavigatedFrom.PreviousPage; this.planning = planning; this.Title = AppResources.btnStatusChange; lvStatus.ItemTapped += async(object sender, ItemTappedEventArgs e) => { Status status = e.Item as Status; lvStatus.SelectedItem = null; newStatusID = status.ID; await PrepareStatusChange(status.ID); }; // end event ItemTapped }
async protected override void OnAppearing() { base.OnAppearing(); StatusChangePage.IsStillRunning = true; if (hasNavigatedFrom == HasNavigatedFrom.PreviousPage) { Status status = Common.GetStatus(planning.StatusID); imgStatus.Source = Common.FormatImageName(status.iconBlack); lbStatus.Text = $"{AppResources.Status} : {status.Text}"; lbStatusTime.Text = planning.StatusDateTime.ToString("dd-MMM-yyyy HH:mm:ss"); panelStatus.BackgroundColor = Color.FromRgb(status.R, status.G, status.B); bool isDemoMode = App.appSettings.loginVars.userID.Equals(Guid.Parse(ProgramVars.DemoUserID)); statusSequences = StatusSequenceBuilder.Run(isDemoMode); int statusID = planning.StatusID; StatusSequence s = (from sq in statusSequences where sq.current.ID == statusID select sq).FirstOrDefault(); if (s != null) { lvStatus.ItemsSource = s.next; } } if (hasNavigatedFrom == HasNavigatedFrom.InfoPage) { // Continue processing Started status after returning from SummaryPage // hasNavigatedFrom = HasNavigatedFrom.PreviousPage; // Check if no status DriveTo and first Started => set planning.ExecStartDateTime = time int driveToCount = (from h in db.Table <PlanningHistory>() where h.PlanningID == planning.ID && h.StatusID == StatusTypes.DriveTo select h).Count(); if (startCount == 0 && driveToCount == 0) { planning.ExecStartDateTime = time; } if (planning.StatusID == StatusTypes.Pauzed) { planning.PauzeTime += (time.Ticks - previousTime.Ticks); } await PerformStatusChange(newStatusID); } if (hasNavigatedFrom == HasNavigatedFrom.SignaturePage) { planning.Signature = null; //if (Device.OS == TargetPlatform.Android) { if (Device.RuntimePlatform == Device.Android) { await Task.Run(() => { do { } while(SignaturePage.IsStillrunning); }); } // Check signature // if (planning.SignaturePoints == null || planning.SignaturePoints.Length <= 200 || string.IsNullOrEmpty(planning.SignatureName)) { await DisplayAlert(AppResources.Error, AppResources.MissingSignature, AppResources.OK); } else { // Save Registrations, ArticleReg, Planning (selected fields) and pictures to server // if (await SaveRegistrationsAndSignatureDataToServer(planning, newStatusID)) { // Update status on server // await PerformStatusChange(newStatusID); } } } }
protected async Task PrepareStatusChange(int selectedStatusID) { // Check if network available // if (Connectivity.NetworkAccess != NetworkAccess.Internet) { await DisplayAlert(AppResources.Warning, AppResources.NoNetwork, AppResources.OK); } // Set variables // db = App.dbHandler.db; //originalStatusID = planning.StatusID; //save original value on entry //orginalPauzeTime = planning.PauzeTime; //save original value on entry previousTime = planning.StatusDateTime; time = DateTime.Now; Summary summary; UpdateUI(false); // Check before status change is allowed // switch (selectedStatusID) { case StatusTypes.DriveTo: planning.ExecStartDateTime = time; await PerformStatusChange(selectedStatusID); break; case StatusTypes.Started: // Check for end of pauze if (planning.StatusID == StatusTypes.Pauzed) { planning.PauzeTime += (time.Ticks - previousTime.Ticks); } startCount = (from h in db.Table <PlanningHistory> () where h.PlanningID == planning.ID && h.StatusID == StatusTypes.Started select h).Count(); if (startCount == 0) //if first time ever the planning is started, show the to display registrations if any { int regsCount = (from r in db.Table <Registration> () where r.PlanningID == planning.ID && !r.IsDeleted && r.IsDisplayed select r).Count(); if (regsCount > 0) //only show when there are registrations to display { hasNavigatedFrom = HasNavigatedFrom.InfoPage; summary = new Summary() { Planning = planning, StopTime = time, PauzeTime = 0, SummaryType = SummaryTypes.Display //Display summary }; await App.Current.MainPage.Navigation.PushAsync(new InfoPage (summary)); } else { await PerformStatusChange(selectedStatusID); } } else { await PerformStatusChange(selectedStatusID); } break; case StatusTypes.Stopped: // Check for end of pauze if (planning.StatusID == StatusTypes.Pauzed) { planning.PauzeTime += (time.Ticks - previousTime.Ticks); } // Get count of missing required registrations // int count = (from r in db.Table <Registration> () where r.PlanningID == planning.ID && r.IsRequired && r.Result == "" && !r.IsDeleted select r).Count(); if (count > 0) { await DisplayAlert(AppResources.Warning, AppResources.NotAllRequiredRegistrationsProcessed, AppResources.OK); return; } // Check if all pictures are taken // //var regPics = from r in db.Table<Registration> () // where r.PlanningID == planning.ID && r.RegTypeID == RegistrationTypes.Picture && !r.IsDeleted // select r; //foreach (Registration r in regPics) { //string fileName = string.Format(@"{0}\{1}.jpg", ProgramVars.pictureDirectory, r.ID.ToString()); //if (!System.IO.File.Exists(fileName)) //possibility that picture does not exist, show message box but keep going // Common.ShowMessage(string.Format(text.MissingPictures, r.Caption)); //} // Get signature // summary = new Summary() { Planning = planning, StopTime = time, PauzeTime = planning.PauzeTime, SummaryType = SummaryTypes.Completed }; hasNavigatedFrom = HasNavigatedFrom.SignaturePage; await App.Current.MainPage.Navigation.PushAsync(new SignaturePage (summary)); break; default: await PerformStatusChange(selectedStatusID); break; } //end switch } //end method