Use AtomicFile in CarTelemetryService

All usages of File are replaced with AtomicFile, with the exception of
simple deletion, because AtomicFile uses the same method underneath.

Bug: 205049095
Test: atest CarServiceUnitTest:ResultStoreTest
Test: atest CarServiceUnitTest:MetricsConfigStoreTest
Test: atest CarServiceUnitTest:StatsPublisherTest
Test: atest CarServiceUnitTest:CarTelemetryServiceTest

Change-Id: Ib74202b5d69cfb158d502a579e9d953a34ffb75b
Merged-In: Ib74202b5d69cfb158d502a579e9d953a34ffb75b
(cherry picked from commit 3f1dce5dc692b717d960b7a9d7afe669c194fa05)
diff --git a/service/src/com/android/car/telemetry/MetricsConfigStore.java b/service/src/com/android/car/telemetry/MetricsConfigStore.java
index 5a6e1ca..d369085 100644
--- a/service/src/com/android/car/telemetry/MetricsConfigStore.java
+++ b/service/src/com/android/car/telemetry/MetricsConfigStore.java
@@ -23,12 +23,14 @@
 
 import android.car.telemetry.MetricsConfigKey;
 import android.util.ArrayMap;
+import android.util.AtomicFile;
 
 import com.android.car.CarLog;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.utils.Slogf;
 
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
@@ -54,14 +56,14 @@
         mActiveConfigs = new ArrayMap<>();
         // TODO(b/197336485): Add expiration date check for MetricsConfig
         for (File file : mConfigDirectory.listFiles()) {
+            AtomicFile atomicFile = new AtomicFile(file);
             try {
-                byte[] serializedConfig = Files.readAllBytes(file.toPath());
                 TelemetryProto.MetricsConfig config =
-                        TelemetryProto.MetricsConfig.parseFrom(serializedConfig);
+                        TelemetryProto.MetricsConfig.parseFrom(atomicFile.readFully());
                 mActiveConfigs.put(config.getName(), config);
             } catch (IOException e) {
                 // TODO(b/197336655): record failure
-                file.delete();
+                atomicFile.delete();
             }
         }
     }
@@ -94,12 +96,15 @@
             }
         }
         mActiveConfigs.put(metricsConfig.getName(), metricsConfig);
+        AtomicFile atomicFile = new AtomicFile(new File(mConfigDirectory, metricsConfig.getName()));
+        FileOutputStream fos = null;
         try {
-            Files.write(
-                    new File(mConfigDirectory, metricsConfig.getName()).toPath(),
-                    metricsConfig.toByteArray());
+            fos = atomicFile.startWrite();
+            fos.write(metricsConfig.toByteArray());
+            atomicFile.finishWrite(fos);
         } catch (IOException e) {
             // TODO(b/197336655): record failure
+            atomicFile.failWrite(fos);
             Slogf.w(CarLog.TAG_TELEMETRY, "Failed to write metrics config to disk", e);
             return ERROR_METRICS_CONFIG_UNKNOWN;
         }