Loading packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java +21 −10 Original line number Diff line number Diff line Loading @@ -24,11 +24,10 @@ import android.icu.util.Measure; import android.icu.util.MeasureUnit; import android.support.annotation.Nullable; import android.text.TextUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.R; import java.time.Clock; import java.time.Instant; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.concurrent.TimeUnit; Loading Loading @@ -102,7 +101,7 @@ public class PowerUtil { private static String getMoreThanOneDayString(Context context, long drainTimeMs, String percentageString, boolean basedOnUsage) { final long roundedTimeMs = roundToNearestThreshold(drainTimeMs, ONE_HOUR_MILLIS); final long roundedTimeMs = roundTimeToNearestThreshold(drainTimeMs, ONE_HOUR_MILLIS); CharSequence timeString = StringUtil.formatElapsedTime(context, roundedTimeMs, false /* withSeconds */); Loading Loading @@ -139,7 +138,7 @@ public class PowerUtil { String percentageString, boolean basedOnUsage) { // Get the time of day we think device will die rounded to the nearest 15 min. final long roundedTimeOfDayMs = roundToNearestThreshold( roundTimeToNearestThreshold( System.currentTimeMillis() + drainTimeMs, FIFTEEN_MINUTES_MILLIS); Loading Loading @@ -170,12 +169,24 @@ public class PowerUtil { return timeMs * 1000; } private static long roundToNearestThreshold(long drainTime, long threshold) { final long remainder = drainTime % threshold; if (remainder < threshold / 2) { return drainTime - remainder; /** * Rounds a time to the nearest multiple of the provided threshold. Note: This function takes * the absolute value of the inputs since it is only meant to be used for times, not general * purpose rounding. * * ex: roundTimeToNearestThreshold(41, 24) = 48 * @param drainTime The amount to round * @param threshold The value to round to a multiple of * @return The rounded value as a long */ public static long roundTimeToNearestThreshold(long drainTime, long threshold) { long time = Math.abs(drainTime); long multiple = Math.abs(threshold); final long remainder = time % multiple; if (remainder < multiple / 2) { return time - remainder; } else { return drainTime - remainder + threshold; return time - remainder + multiple; } } } packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java +14 −0 Original line number Diff line number Diff line Loading @@ -175,4 +175,18 @@ public class PowerUtilTest { // Add percentage to string when provided assertThat(info2).isEqualTo("More than 2 days remaining (10%)"); } @Test public void testRoundToNearestThreshold_roundsCorrectly() { // test some pretty normal values assertThat(PowerUtil.roundTimeToNearestThreshold(1200, 1000)).isEqualTo(1000); assertThat(PowerUtil.roundTimeToNearestThreshold(800, 1000)).isEqualTo(1000); assertThat(PowerUtil.roundTimeToNearestThreshold(1000, 1000)).isEqualTo(1000); // test the weird stuff assertThat(PowerUtil.roundTimeToNearestThreshold(80, -200)).isEqualTo(0); assertThat(PowerUtil.roundTimeToNearestThreshold(-150, 100)).isEqualTo(200); assertThat(PowerUtil.roundTimeToNearestThreshold(-120, 100)).isEqualTo(100); assertThat(PowerUtil.roundTimeToNearestThreshold(-200, -75)).isEqualTo(225); } } Loading
packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java +21 −10 Original line number Diff line number Diff line Loading @@ -24,11 +24,10 @@ import android.icu.util.Measure; import android.icu.util.MeasureUnit; import android.support.annotation.Nullable; import android.text.TextUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.R; import java.time.Clock; import java.time.Instant; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.concurrent.TimeUnit; Loading Loading @@ -102,7 +101,7 @@ public class PowerUtil { private static String getMoreThanOneDayString(Context context, long drainTimeMs, String percentageString, boolean basedOnUsage) { final long roundedTimeMs = roundToNearestThreshold(drainTimeMs, ONE_HOUR_MILLIS); final long roundedTimeMs = roundTimeToNearestThreshold(drainTimeMs, ONE_HOUR_MILLIS); CharSequence timeString = StringUtil.formatElapsedTime(context, roundedTimeMs, false /* withSeconds */); Loading Loading @@ -139,7 +138,7 @@ public class PowerUtil { String percentageString, boolean basedOnUsage) { // Get the time of day we think device will die rounded to the nearest 15 min. final long roundedTimeOfDayMs = roundToNearestThreshold( roundTimeToNearestThreshold( System.currentTimeMillis() + drainTimeMs, FIFTEEN_MINUTES_MILLIS); Loading Loading @@ -170,12 +169,24 @@ public class PowerUtil { return timeMs * 1000; } private static long roundToNearestThreshold(long drainTime, long threshold) { final long remainder = drainTime % threshold; if (remainder < threshold / 2) { return drainTime - remainder; /** * Rounds a time to the nearest multiple of the provided threshold. Note: This function takes * the absolute value of the inputs since it is only meant to be used for times, not general * purpose rounding. * * ex: roundTimeToNearestThreshold(41, 24) = 48 * @param drainTime The amount to round * @param threshold The value to round to a multiple of * @return The rounded value as a long */ public static long roundTimeToNearestThreshold(long drainTime, long threshold) { long time = Math.abs(drainTime); long multiple = Math.abs(threshold); final long remainder = time % multiple; if (remainder < multiple / 2) { return time - remainder; } else { return drainTime - remainder + threshold; return time - remainder + multiple; } } }
packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java +14 −0 Original line number Diff line number Diff line Loading @@ -175,4 +175,18 @@ public class PowerUtilTest { // Add percentage to string when provided assertThat(info2).isEqualTo("More than 2 days remaining (10%)"); } @Test public void testRoundToNearestThreshold_roundsCorrectly() { // test some pretty normal values assertThat(PowerUtil.roundTimeToNearestThreshold(1200, 1000)).isEqualTo(1000); assertThat(PowerUtil.roundTimeToNearestThreshold(800, 1000)).isEqualTo(1000); assertThat(PowerUtil.roundTimeToNearestThreshold(1000, 1000)).isEqualTo(1000); // test the weird stuff assertThat(PowerUtil.roundTimeToNearestThreshold(80, -200)).isEqualTo(0); assertThat(PowerUtil.roundTimeToNearestThreshold(-150, 100)).isEqualTo(200); assertThat(PowerUtil.roundTimeToNearestThreshold(-120, 100)).isEqualTo(100); assertThat(PowerUtil.roundTimeToNearestThreshold(-200, -75)).isEqualTo(225); } }