Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit acd4d23f authored by Christopher Tate's avatar Christopher Tate
Browse files

Avoid churning NumberFormat instances in ProgressBar

Don't construct a new locale-specific NumberFormat every time a progress
bar's state is refreshed or updated.  We now do this only when necessary
due to a locale change.

Bug: 161264248
Test: atest ProgressBarTest
Change-Id: I349ec28268a3471184e5746b164f81428ad80cc8
parent 25ec4f68
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ import com.android.internal.R;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Locale;

/**
 * <p>
@@ -249,6 +250,9 @@ public class ProgressBar extends View {

    private ObjectAnimator mLastProgressAnimator;

    private NumberFormat mPercentFormat;
    private Locale mCachedLocale;

    /**
     * Create a new progress bar with range 0...100 and initial progress of 0.
     * @param context the application environment
@@ -1591,8 +1595,15 @@ public class ProgressBar extends View {
     * @return state description based on progress
     */
    private CharSequence formatStateDescription(int progress) {
        return NumberFormat.getPercentInstance(mContext.getResources().getConfiguration().locale)
                .format(getPercent(progress));
        // Cache the locale-appropriate NumberFormat.  Configuration locale is guaranteed
        // non-null, so the first time this is called we will always get the appropriate
        // NumberFormat, then never regenerate it unless the locale changes on the fly.
        final Locale curLocale = mContext.getResources().getConfiguration().getLocales().get(0);
        if (!curLocale.equals(mCachedLocale)) {
            mCachedLocale = curLocale;
            mPercentFormat = NumberFormat.getPercentInstance(curLocale);
        }
        return mPercentFormat.format(getPercent(progress));
    }

    /**