From bb925fb03422332b3f8fdcc5519a0b85ced0be7a Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Wed, 19 Jan 2022 15:52:19 -0800 Subject: [PATCH] Add SparseLongArray.incrementValue() This method is used for accumulation of long values: if the key does not exist, one is created. If one already exists, the passed value is added to the previous value. This method is similar to the existing SparseDoubleArray.incrementValue() method Bug: 215427055 Test: atest FrameworksCoreTests:SparseLongArrayTest Change-Id: I771d9bc2bdd12ca4260b20186ced70f5862b6f56 --- core/java/android/util/SparseDoubleArray.java | 2 +- core/java/android/util/SparseLongArray.java | 24 +++++++++++++++++++ .../android/internal/os/BatteryStatsImpl.java | 16 ++++++------- .../android/util/SparseDoubleArrayTest.java | 6 ++--- .../src/android/util/SparseLongArrayTest.java | 12 ++++++++++ 5 files changed, 48 insertions(+), 12 deletions(-) diff --git a/core/java/android/util/SparseDoubleArray.java b/core/java/android/util/SparseDoubleArray.java index dc93a473fe448..ccae92e53c5e1 100644 --- a/core/java/android/util/SparseDoubleArray.java +++ b/core/java/android/util/SparseDoubleArray.java @@ -105,7 +105,7 @@ public class SparseDoubleArray implements Cloneable { *

This differs from {@link #put} because instead of replacing any previous value, it adds * (in the numerical sense) to it. */ - public void add(int key, double summand) { + public void incrementValue(int key, double summand) { final double oldValue = get(key); put(key, oldValue + summand); } diff --git a/core/java/android/util/SparseLongArray.java b/core/java/android/util/SparseLongArray.java index f2bc0c5a34d60..7185972b85bf8 100644 --- a/core/java/android/util/SparseLongArray.java +++ b/core/java/android/util/SparseLongArray.java @@ -163,6 +163,30 @@ public class SparseLongArray implements Cloneable { } } + /** + * Adds a mapping from the specified key to the specified value, + * adding its value to the previous mapping from the specified key if there + * was one. + * + *

This differs from {@link #put} because instead of replacing any previous value, it adds + * (in the numerical sense) to it. + * + * @hide + */ + public void incrementValue(int key, long summand) { + int i = ContainerHelpers.binarySearch(mKeys, mSize, key); + + if (i >= 0) { + mValues[i] += summand; + } else { + i = ~i; + + mKeys = GrowingArrayUtils.insert(mKeys, mSize, i, key); + mValues = GrowingArrayUtils.insert(mValues, mSize, i, summand); + mSize++; + } + } + /** * Returns the number of key-value mappings that this SparseLongArray * currently stores. diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index a4183ca8f163a..b7df6fe8b9e97 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -12828,7 +12828,7 @@ public class BatteryStatsImpl extends BatteryStats { } } - uidEstimatedConsumptionMah.add(u.getUid(), + uidEstimatedConsumptionMah.incrementValue(u.getUid(), mWifiPowerCalculator.calcPowerWithoutControllerDataMah( entry.rxPackets, entry.txPackets, uidRunningMs, uidScanMs, uidBatchScanMs)); @@ -12955,7 +12955,7 @@ public class BatteryStatsImpl extends BatteryStats { if (uidEstimatedConsumptionMah != null) { double uidEstMah = mWifiPowerCalculator.calcPowerFromControllerDataMah( scanRxTimeSinceMarkMs, scanTxTimeSinceMarkMs, myIdleTimeMs); - uidEstimatedConsumptionMah.add(uid.getUid(), uidEstMah); + uidEstimatedConsumptionMah.incrementValue(uid.getUid(), uidEstMah); } } @@ -12977,7 +12977,7 @@ public class BatteryStatsImpl extends BatteryStats { uid.getOrCreateWifiControllerActivityLocked().getOrCreateTxTimeCounters()[0] .increment(myTxTimeMs, elapsedRealtimeMs); if (uidEstimatedConsumptionMah != null) { - uidEstimatedConsumptionMah.add(uid.getUid(), + uidEstimatedConsumptionMah.incrementValue(uid.getUid(), mWifiPowerCalculator.calcPowerFromControllerDataMah( 0, myTxTimeMs, 0)); } @@ -12996,7 +12996,7 @@ public class BatteryStatsImpl extends BatteryStats { uid.getOrCreateWifiControllerActivityLocked().getOrCreateRxTimeCounter() .increment(myRxTimeMs, elapsedRealtimeMs); if (uidEstimatedConsumptionMah != null) { - uidEstimatedConsumptionMah.add(uid.getUid(), + uidEstimatedConsumptionMah.incrementValue(uid.getUid(), mWifiPowerCalculator.calcPowerFromControllerDataMah( myRxTimeMs, 0, 0)); } @@ -13224,7 +13224,7 @@ public class BatteryStatsImpl extends BatteryStats { // Distribute measured mobile radio charge consumption based on app radio // active time if (uidEstimatedConsumptionMah != null) { - uidEstimatedConsumptionMah.add(u.getUid(), + uidEstimatedConsumptionMah.incrementValue(u.getUid(), mMobileRadioPowerCalculator.calcPowerFromRadioActiveDurationMah( appRadioTimeUs / 1000)); } @@ -13479,7 +13479,7 @@ public class BatteryStatsImpl extends BatteryStats { .increment(scanTimeTxSinceMarkMs, elapsedRealtimeMs); if (uidEstimatedConsumptionMah != null) { - uidEstimatedConsumptionMah.add(u.getUid(), + uidEstimatedConsumptionMah.incrementValue(u.getUid(), mBluetoothPowerCalculator.calculatePowerMah( scanTimeRxSinceMarkMs, scanTimeTxSinceMarkMs, 0)); } @@ -13546,7 +13546,7 @@ public class BatteryStatsImpl extends BatteryStats { counter.getOrCreateRxTimeCounter().increment(timeRxMs, elapsedRealtimeMs); if (uidEstimatedConsumptionMah != null) { - uidEstimatedConsumptionMah.add(u.getUid(), + uidEstimatedConsumptionMah.incrementValue(u.getUid(), mBluetoothPowerCalculator.calculatePowerMah(timeRxMs, 0, 0)); } } @@ -13560,7 +13560,7 @@ public class BatteryStatsImpl extends BatteryStats { .increment(timeTxMs, elapsedRealtimeMs); if (uidEstimatedConsumptionMah != null) { - uidEstimatedConsumptionMah.add(u.getUid(), + uidEstimatedConsumptionMah.incrementValue(u.getUid(), mBluetoothPowerCalculator.calculatePowerMah(0, timeTxMs, 0)); } } diff --git a/core/tests/coretests/src/android/util/SparseDoubleArrayTest.java b/core/tests/coretests/src/android/util/SparseDoubleArrayTest.java index 2dd3f69852c1d..ba9c8d92e173f 100644 --- a/core/tests/coretests/src/android/util/SparseDoubleArrayTest.java +++ b/core/tests/coretests/src/android/util/SparseDoubleArrayTest.java @@ -64,12 +64,12 @@ public class SparseDoubleArrayTest { } @Test - public void testAdd() { + public void testIncrementValue() { final SparseDoubleArray sda = new SparseDoubleArray(); sda.put(4, 6.1); - sda.add(4, -1.2); - sda.add(2, -1.2); + sda.incrementValue(4, -1.2); + sda.incrementValue(2, -1.2); assertEquals(6.1 - 1.2, sda.get(4), PRECISION); assertEquals(-1.2, sda.get(2), PRECISION); diff --git a/core/tests/coretests/src/android/util/SparseLongArrayTest.java b/core/tests/coretests/src/android/util/SparseLongArrayTest.java index df2d752e04b9b..b29b6f1f8e9d4 100644 --- a/core/tests/coretests/src/android/util/SparseLongArrayTest.java +++ b/core/tests/coretests/src/android/util/SparseLongArrayTest.java @@ -154,4 +154,16 @@ public class SparseLongArrayTest { assertRemoved(startIndex, endIndex); assertTrue(isSame(sparseLongArray2, mSparseLongArray)); } + + @Test + public void testIncrementValue() { + final SparseLongArray sla = new SparseLongArray(); + + sla.put(4, 6); + sla.incrementValue(4, 4); + sla.incrementValue(2, 5); + + assertEquals(6 + 4, sla.get(4)); + assertEquals(5, sla.get(2)); + } }