Verity writes propogate progress report

Test: tested on cuttlefish device with inc_ota from build 9263663 9419942. Ensured progress grows linearly from 0 - 0.6. Half time spent in read step, half in Verity Writes.
Change-Id: Iffa16571e828909cd6ac58f262736c0b6ca7b066
diff --git a/payload_consumer/filesystem_verifier_action.cc b/payload_consumer/filesystem_verifier_action.cc
index e88337b..dfbe513 100644
--- a/payload_consumer/filesystem_verifier_action.cc
+++ b/payload_consumer/filesystem_verifier_action.cc
@@ -80,7 +80,9 @@
 
 namespace {
 const off_t kReadFileBufferSize = 128 * 1024;
-constexpr float kVerityProgressPercent = 0.6;
+constexpr float kVerityProgressPercent = 0.3;
+constexpr float kEncodeFECPercent = 0.3;
+
 }  // namespace
 
 void FilesystemVerifierAction::PerformAction() {
@@ -239,6 +241,8 @@
     LOG(ERROR) << "Failed to write verity data";
     Cleanup(ErrorCode::kVerityCalculationError);
   }
+  UpdatePartitionProgress(kVerityProgressPercent +
+                          verity_writer_->GetProgress() * kEncodeFECPercent);
   CHECK(pending_task_id_.PostTask(
       FROM_HERE,
       base::BindOnce(&FilesystemVerifierAction::WriteVerityData,
@@ -333,8 +337,9 @@
   // verity writes and partition hashing. Otherwise, the entire progress bar is
   // dedicated to partition hashing for smooth progress.
   if (ShouldWriteVerity()) {
-    UpdatePartitionProgress(progress * (1 - kVerityProgressPercent) +
-                            kVerityProgressPercent);
+    UpdatePartitionProgress(
+        progress * (1 - (kVerityProgressPercent + kEncodeFECPercent)) +
+        kVerityProgressPercent + kEncodeFECPercent);
   } else {
     UpdatePartitionProgress(progress);
   }
diff --git a/payload_consumer/verity_writer_android.cc b/payload_consumer/verity_writer_android.cc
index 479231d..31d2875 100644
--- a/payload_consumer/verity_writer_android.cc
+++ b/payload_consumer/verity_writer_android.cc
@@ -150,6 +150,10 @@
   return current_step_ == EncodeFECStep::kComplete;
 }
 
+double IncrementalEncodeFEC::ReportProgress() const {
+  return static_cast<double>(current_round_) / num_rounds_;
+}
+
 namespace verity_writer {
 std::unique_ptr<VerityWriterInterface> CreateVerityWriter() {
   return std::make_unique<VerityWriterAndroid>();
@@ -312,6 +316,11 @@
   }
   return false;
 }
+
+double VerityWriterAndroid::GetProgress() {
+  return encodeFEC_.ReportProgress();
+}
+
 bool VerityWriterAndroid::EncodeFEC(FileDescriptor* read_fd,
                                     FileDescriptor* write_fd,
                                     uint64_t data_offset,
diff --git a/payload_consumer/verity_writer_android.h b/payload_consumer/verity_writer_android.h
index 0d48803..1aaafd5 100644
--- a/payload_consumer/verity_writer_android.h
+++ b/payload_consumer/verity_writer_android.h
@@ -55,6 +55,7 @@
   void UpdateState();
   bool Finished() const;
   void Reset();
+  double ReportProgress() const;
 
  private:
   brillo::Blob rs_blocks_;
@@ -88,7 +89,7 @@
   bool Finalize(FileDescriptor* read_fd, FileDescriptor* write_fd) override;
   bool IncrementalFinalize(FileDescriptor* read_fd,
                            FileDescriptor* write_fd) override;
-
+  double GetProgress() override;
   bool FECFinished() const override;
   // Read [data_offset : data_offset + data_size) from |path| and encode FEC
   // data, if |verify_mode|, then compare the encoded FEC with the one in
diff --git a/payload_consumer/verity_writer_interface.h b/payload_consumer/verity_writer_interface.h
index 8b4f080..3ebe768 100644
--- a/payload_consumer/verity_writer_interface.h
+++ b/payload_consumer/verity_writer_interface.h
@@ -55,6 +55,9 @@
   // Returns true once FEC data is finished writing
   virtual bool FECFinished() const = 0;
 
+  // Gets progress report on FEC write
+  virtual double GetProgress() = 0;
+
  protected:
   VerityWriterInterface() = default;