db: Store timestamps to the sqlite db.

Test: make
Bug: 137786053
Change-Id: I401e80e6168c717258644a37e9d8753c61248acd
diff --git a/src/db/models.h b/src/db/models.h
index f2ff651..0eac13f 100644
--- a/src/db/models.h
+++ b/src/db/models.h
@@ -306,9 +306,18 @@
     return static_cast<int>(last_rowid);
   }
 
-  // Returns the row ID that was inserted last.
   template <typename... Args>
   static bool Delete(DbHandle db, const std::string& sql, Args&&... args) {
+    return ExecuteOnce(db, sql, std::forward<Args>(args)...);
+  }
+
+  template <typename... Args>
+  static bool Update(DbHandle db, const std::string& sql, Args&&... args) {
+    return ExecuteOnce(db, sql, std::forward<Args>(args)...);
+  }
+
+  template <typename... Args>
+  static bool ExecuteOnce(DbHandle db, const std::string& sql, Args&&... args) {
     ScopedLockDb lock{db};
 
     DbStatement stmt = DbStatement::Prepare(db, sql, std::forward<Args>(args)...);
@@ -705,6 +714,7 @@
                                     p.temperature,
                                     p.trace_enabled,
                                     p.readahead_enabled,
+                                    p.intent_started_ns,
                                     p.total_time_ns,
                                     p.report_fully_drawn_ns)) {
       return std::nullopt;
@@ -718,13 +728,14 @@
                                                      AppLaunchHistoryModel::Temperature temperature,
                                                      bool trace_enabled,
                                                      bool readahead_enabled,
+                                                     std::optional<uint64_t> intent_started_ns,
                                                      std::optional<uint64_t> total_time_ns,
                                                      std::optional<uint64_t> report_fully_drawn_ns)
   {
     const char* sql = "INSERT INTO app_launch_histories (activity_id, temperature, trace_enabled, "
-                                                        "readahead_enabled, total_time_ns, "
-                                                        "report_fully_drawn_ns) "
-                      "VALUES (?1, ?2, ?3, ?4, ?5, ?6);";
+                                                        "readahead_enabled, intent_started_ns, "
+                                                        "total_time_ns, report_fully_drawn_ns) "
+                      "VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7);";
 
     std::optional<int> inserted_row_id =
         DbQueryBuilder::Insert(db,
@@ -733,6 +744,7 @@
                                temperature,
                                trace_enabled,
                                readahead_enabled,
+                               intent_started_ns,
                                total_time_ns,
                                report_fully_drawn_ns);
     if (!inserted_row_id) {
@@ -745,17 +757,36 @@
     p.temperature = temperature;
     p.trace_enabled = trace_enabled;
     p.readahead_enabled = readahead_enabled;
+    p.intent_started_ns = intent_started_ns;
     p.total_time_ns = total_time_ns;
     p.report_fully_drawn_ns = report_fully_drawn_ns;
 
     return p;
   }
 
+  static bool UpdateReportFullyDrawn(DbHandle db,
+                                     int history_id,
+                                     std::optional<uint64_t> report_fully_drawn_ns)
+  {
+    const char* sql = "UPDATE app_launch_histories "
+                      "SET report_fully_drawn_ns = ?1 "
+                      "WHERE id = ?2;";
+
+    bool result = DbQueryBuilder::Update(db, sql, history_id, report_fully_drawn_ns);
+
+    if (!result) {
+      LOG(ERROR)<< "Failed to update history_id:"<< history_id
+                << ", report_fully_drawn_ns: " << report_fully_drawn_ns.value();
+    }
+    return result;
+  }
+
   int id;
   int activity_id;  // ActivityModel::id
   Temperature temperature = Temperature::kUninitialized;
   bool trace_enabled;
   bool readahead_enabled;
+  std::optional<uint64_t> intent_started_ns;
   std::optional<uint64_t> total_time_ns;
   std::optional<uint64_t> report_fully_drawn_ns;
 };
@@ -766,7 +797,14 @@
      << "temperature=" << static_cast<int>(p.temperature) << ","
      << "trace_enabled=" << p.trace_enabled << ","
      << "readahead_enabled=" << p.readahead_enabled << ","
-     << "total_time_ns=";
+     << "intent_started_ns=";
+  if (p.intent_started_ns) {
+    os << *p.intent_started_ns;
+  } else {
+    os << "(nullopt)";
+  }
+  os << ",";
+  os << "total_time_ns=";
   if (p.total_time_ns) {
     os << *p.total_time_ns;
   } else {