Revert "Remove use of MeasureUnit.internalGetInstance"
This reverts commit aa5629e60809e4775ca1f05e6f1f296a04a450dc. Test: m Bug: 70005649 Bug: 36994779 Change-Id: I4591870f564567c40fa450866c3050fd5a7a61ae
This commit is contained in:
parent
2301211526
commit
3305bce79d
@ -32,7 +32,6 @@ import android.text.BidiFormatter;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Locale;
|
||||
|
||||
@ -195,29 +194,13 @@ public final class Formatter {
|
||||
|
||||
/**
|
||||
* ICU doesn't support PETABYTE yet. Fake it so that we can treat all units the same way.
|
||||
* {@hide}
|
||||
*/
|
||||
private static final MeasureUnit PETABYTE = createPetaByte();
|
||||
public static final MeasureUnit PETABYTE = MeasureUnit.internalGetInstance(
|
||||
"digital", "petabyte");
|
||||
|
||||
/**
|
||||
* Create a petabyte MeasureUnit without registering it with ICU.
|
||||
* ICU doesn't support user-create MeasureUnit and the only public (but hidden) method to do so
|
||||
* is {@link MeasureUnit#internalGetInstance(String, String)} which also registers the unit as
|
||||
* an available type and thus leaks it to code that doesn't expect or support it.
|
||||
* <p>This method uses reflection to create an instance of MeasureUnit to avoid leaking it. This
|
||||
* instance is <b>only</b> to be used in this class.
|
||||
*/
|
||||
private static MeasureUnit createPetaByte() {
|
||||
try {
|
||||
Constructor<MeasureUnit> constructor = MeasureUnit.class
|
||||
.getDeclaredConstructor(String.class, String.class);
|
||||
constructor.setAccessible(true);
|
||||
return constructor.newInstance("digital", "petabyte");
|
||||
} catch (ReflectiveOperationException e) {
|
||||
throw new RuntimeException("Failed to create petabyte MeasureUnit", e);
|
||||
}
|
||||
}
|
||||
|
||||
private static class RoundedBytesResult {
|
||||
/** {@hide} */
|
||||
public static class RoundedBytesResult {
|
||||
public final float value;
|
||||
public final MeasureUnit units;
|
||||
public final int fractionDigits;
|
||||
@ -235,7 +218,7 @@ public final class Formatter {
|
||||
* Returns a RoundedBytesResult object based on the input size in bytes and the rounding
|
||||
* flags. The result can be used for formatting.
|
||||
*/
|
||||
static RoundedBytesResult roundBytes(long sizeBytes, int flags) {
|
||||
public static RoundedBytesResult roundBytes(long sizeBytes, int flags) {
|
||||
final boolean isNegative = (sizeBytes < 0);
|
||||
float result = isNegative ? -sizeBytes : sizeBytes;
|
||||
MeasureUnit units = MeasureUnit.BYTE;
|
||||
|
@ -17,7 +17,6 @@
|
||||
package android.text.format;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotEquals;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
@ -210,24 +209,4 @@ public class FormatterTest {
|
||||
|
||||
Locale.setDefault(locale);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that Formatter doesn't "leak" the locally defined petabyte unit into ICU via the
|
||||
* {@link MeasureUnit} registry. This test can fail for two reasons:
|
||||
* 1. we regressed and started leaking again. In this case the code needs to be fixed.
|
||||
* 2. ICU started supporting petabyte as a unit, in which case change one needs to revert this
|
||||
* change (I494fb59a3b3742f35cbdf6b8705817f404a2c6b0), remove Formatter.PETABYTE and replace any
|
||||
* usages of that field with just MeasureUnit.PETABYTE.
|
||||
*/
|
||||
// http://b/65632959
|
||||
@Test
|
||||
public void doesNotLeakPetabyte() {
|
||||
// Ensure that the Formatter class is loaded when we call .getAvailable().
|
||||
Formatter.formatFileSize(mContext, Long.MAX_VALUE);
|
||||
Set<MeasureUnit> digitalUnits = MeasureUnit.getAvailable("digital");
|
||||
for (MeasureUnit unit : digitalUnits) {
|
||||
// This assert can fail if we don't leak PETABYTE, but ICU has added it, see #2 above.
|
||||
assertNotEquals("petabyte", unit.getSubtype());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user