Dump the BatteryReattribute from the database into bugreport (2/5)

Example:

    BatteryReattributeEntity{
    	Jun 18, 2024, 16:22:51
    	Jun 18, 2024, 16:23:01
    reattribute_data {
      key: 1001
      value: 0.1
    }
    reattribute_data {
      key: 1002
      value: 0.99
    }
    timestamp_end: 1718727781368
    timestamp_start: 1718727771368
    }

    BatteryReattributeEntity{
    	Jun 18, 2024, 16:22:31
    	Jun 18, 2024, 16:22:51
    reattribute_data {
      key: 1003
      value: 1.0
    }
    timestamp_end: 1718727771368
    timestamp_start: 1718727751368
    }

Bug: 346706894
Test: atest SettingsRoboTests:com.android.settings.fuelgauge.batteryusage.bugreport
Flag: EXEMPT bug fix
Change-Id: Ie2544b9f43e399d87eb29354b401834372c3a9f7
diff --git a/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java b/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java
index 7613d9a..baae109 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/bugreport/BugReportContentProvider.java
@@ -60,6 +60,7 @@
         LogUtils.dumpBatteryUsageSlotDatabaseHist(context, writer);
         LogUtils.dumpBatteryEventDatabaseHist(context, writer);
         LogUtils.dumpBatteryStateDatabaseHist(context, writer);
+        LogUtils.dumpBatteryReattributeDatabaseHist(context, writer);
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtils.java b/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtils.java
index b230030..d2f3adc 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtils.java
@@ -19,6 +19,8 @@
 import android.content.Context;
 import android.util.Log;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.fuelgauge.batteryusage.AppOptModeSharedPreferencesUtils;
 import com.android.settings.fuelgauge.batteryusage.AppOptimizationModeEvent;
@@ -29,6 +31,8 @@
 import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
 import com.android.settings.fuelgauge.batteryusage.db.BatteryEventDao;
 import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity;
+import com.android.settings.fuelgauge.batteryusage.db.BatteryReattributeDao;
+import com.android.settings.fuelgauge.batteryusage.db.BatteryReattributeEntity;
 import com.android.settings.fuelgauge.batteryusage.db.BatteryState;
 import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDao;
 import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
@@ -127,6 +131,24 @@
         dumpListItems(writer, entities, entity -> entity);
     }
 
+    static void dumpBatteryReattributeDatabaseHist(Context context, PrintWriter writer) {
+        dumpBatteryReattributeDatabaseHist(
+                BatteryStateDatabase.getInstance(context).batteryReattributeDao(),
+                writer);
+    }
+
+    @VisibleForTesting
+    static void dumpBatteryReattributeDatabaseHist(
+            BatteryReattributeDao batteryReattributeDao, PrintWriter writer) {
+        writer.println("\n\tBatteryReattribute DatabaseHistory:");
+        final List<BatteryReattributeEntity> entities =
+                batteryReattributeDao.getAllAfter(
+                        Clock.systemUTC().millis() - DUMP_TIME_OFFSET.toMillis());
+        if (entities != null && !entities.isEmpty()) {
+            dumpListItems(writer, entities, entity -> entity);
+        }
+    }
+
     private static <T, S> void dumpListItems(
             PrintWriter writer, List<T> itemList, Function<T, S> itemConverter) {
         final AtomicInteger counter = new AtomicInteger(0);
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeEntity.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeEntity.java
index aa7e50e..d518230 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeEntity.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeEntity.java
@@ -62,6 +62,7 @@
                 .append("\nBatteryReattributeEntity{")
                 .append("\n\t" + utcToLocalTimeForLogging(timestampStart))
                 .append("\n\t" + utcToLocalTimeForLogging(timestampEnd))
+                .append("\n\t" + ConvertUtils.decodeBatteryReattribute(reattributeData))
                 .append("\n}");
         return builder.toString();
     }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtilsTest.java
new file mode 100644
index 0000000..bf2b191
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtilsTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge.batteryusage.bugreport;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.fuelgauge.batteryusage.BatteryReattribute;
+import com.android.settings.fuelgauge.batteryusage.db.BatteryReattributeDao;
+import com.android.settings.fuelgauge.batteryusage.db.BatteryReattributeEntity;
+import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
+import com.android.settings.testutils.BatteryTestUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.robolectric.RobolectricTestRunner;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@RunWith(RobolectricTestRunner.class)
+public final class LogUtilsTest {
+
+    private StringWriter mTestStringWriter;
+    private PrintWriter mTestPrintWriter;
+    private Context mContext;
+    private BatteryStateDatabase mDatabase;
+    private BatteryReattributeDao mBatteryReattributeDao;
+
+    @Before
+    public void setUp() {
+        mContext = ApplicationProvider.getApplicationContext();
+        mTestStringWriter = new StringWriter();
+        mTestPrintWriter = new PrintWriter(mTestStringWriter);
+        mDatabase = BatteryTestUtils.setUpBatteryStateDatabase(mContext);
+        mBatteryReattributeDao = mDatabase.batteryReattributeDao();
+    }
+
+    @After
+    public void cleanUp() {
+        mBatteryReattributeDao.clearAll();
+    }
+
+    @Test
+    public void dumpBatteryReattributeDatabaseHist_noData_printExpectedResult() {
+        LogUtils.dumpBatteryReattributeDatabaseHist(mBatteryReattributeDao, mTestPrintWriter);
+
+        assertThat(mTestStringWriter.toString())
+                .contains("BatteryReattribute DatabaseHistory:");
+    }
+
+    @Test
+    public void dumpBatteryReattributeDatabaseHist_printExpectedResult() {
+        final long currentTimeMillis = System.currentTimeMillis();
+        // Insert the first testing data.
+        final BatteryReattribute batteryReattribute1 =
+                BatteryReattribute.newBuilder()
+                        .setTimestampStart(currentTimeMillis - 20000)
+                        .setTimestampEnd(currentTimeMillis - 10000)
+                        .putReattributeData(1001, 0.1f)
+                        .putReattributeData(1002, 0.99f)
+                        .build();
+        mBatteryReattributeDao.insert(new BatteryReattributeEntity(batteryReattribute1));
+        // Insert the second testing data.
+        final BatteryReattribute batteryReattribute2 =
+                BatteryReattribute.newBuilder()
+                        .setTimestampStart(currentTimeMillis - 40000)
+                        .setTimestampEnd(currentTimeMillis - 20000)
+                        .putReattributeData(1003, 1f)
+                        .build();
+        mBatteryReattributeDao.insert(new BatteryReattributeEntity(batteryReattribute2));
+
+        LogUtils.dumpBatteryReattributeDatabaseHist(mBatteryReattributeDao, mTestPrintWriter);
+
+        final String result = mTestStringWriter.toString();
+        assertThat(result).contains("BatteryReattribute DatabaseHistory:");
+        assertThat(result).contains(batteryReattribute1.toString());
+        assertThat(result).contains(batteryReattribute2.toString());
+    }
+}