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

Commit cdd3253d authored by James Lemieux's avatar James Lemieux
Browse files

Reduce memory churn for running stopwatches and timers

Bug: 28065873

String.format(...) was being called in a tight loop to format various
times (e.g. lap times, accumulated times, etc) when laps exist. This produces
more garbage for the VM to collect than is necessary. Formatting the
times directly into a reusable StringBuilder significantly reduces the
memory churn and removes intermittent GC pauses on older platforms
and low-memory devices.

Change-Id: Iad574cea7f827623bb4854458d43df76967d8c62
parent eb6c586a
Loading
Loading
Loading
Loading
+11 −44
Original line number Diff line number Diff line
@@ -22,87 +22,54 @@
        android:id="@+id/hours_tens"
        style="@style/timer_setup_digit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="none"
        android:fontFamily="sans-serif-thin"
        android:singleLine="true"
        android:textColor="@color/clock_white"/>
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/hours_ones"
        style="@style/timer_setup_digit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="none"
        android:fontFamily="sans-serif-thin"
        android:singleLine="true"
        android:textColor="@color/clock_white"/>
        android:layout_height="wrap_content" />

    <TextView
        style="@style/label"
        style="@style/timer_setup_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:contentDescription="@string/hours_label_description"
        android:ellipsize="none"
        android:fontFamily="sans-serif-thin"
        android:singleLine="true"
        android:text="@string/hours_label"
        android:textColor="@color/clock_white"/>
        android:text="@string/hours_label" />

    <TextView
        android:id="@+id/minutes_tens"
        style="@style/timer_setup_digit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="none"
        android:fontFamily="sans-serif-thin"
        android:singleLine="true"
        android:textColor="@color/clock_white"/>
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/minutes_ones"
        style="@style/timer_setup_digit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="none"
        android:fontFamily="sans-serif-thin"
        android:singleLine="true"
        android:textColor="@color/clock_white"/>
        android:layout_height="wrap_content" />

    <TextView
        style="@style/label"
        style="@style/timer_setup_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:contentDescription="@string/minutes_label_description"
        android:ellipsize="none"
        android:fontFamily="sans-serif-thin"
        android:singleLine="true"
        android:text="@string/minutes_label"
        android:textColor="@color/clock_white"/>
        android:text="@string/minutes_label" />

    <TextView
        android:id="@+id/seconds"
        style="@style/timer_setup_digit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:ellipsize="none"
        android:fontFamily="sans-serif-thin"
        android:singleLine="true"
        android:textColor="@color/clock_white"/>
        android:layout_height="wrap_content" />

    <TextView
        style="@style/label"
        style="@style/timer_setup_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:contentDescription="@string/seconds_label_description"
        android:ellipsize="none"
        android:fontFamily="sans-serif-thin"
        android:singleLine="true"
        android:text="@string/seconds_label"
        android:textColor="@color/clock_white"/>
        android:text="@string/seconds_label" />

</merge>
 No newline at end of file
+9 −0
Original line number Diff line number Diff line
@@ -16,4 +16,13 @@
        <item name="android:shadowDy">@dimen/widget_shadow_dy</item>
    </style>

    <style name="timer_setup_digit">
        <item name="android:ellipsize">none</item>
        <item name="android:fontFamily">sans-serif-thin</item>
        <item name="android:fontFeatureSettings">tnum</item>
        <item name="android:singleLine">true</item>
        <item name="android:textColor">@color/clock_white</item>
        <item name="android:textSize">@dimen/timer_setup_font_size</item>
    </style>

</resources>
 No newline at end of file
+9 −3
Original line number Diff line number Diff line
@@ -118,12 +118,18 @@
    </style>

    <style name="timer_setup_digit">
        <item name="android:textSize">@dimen/timer_setup_font_size</item>
        <item name="android:ellipsize">none</item>
        <item name="android:fontFamily">sans-serif-thin</item>
        <item name="android:singleLine">true</item>
        <item name="android:textColor">@color/clock_white</item>
        <item name="android:textSize">@dimen/timer_setup_font_size</item>
    </style>

    <style name="timer_setup_label">
        <item name="android:textSize">@dimen/timer_setup_label_size</item>
    <style name="timer_setup_label" parent="label">
        <item name="android:ellipsize">none</item>
        <item name="android:fontFamily">sans-serif-thin</item>
        <item name="android:singleLine">true</item>
        <item name="android:textColor">@color/clock_white</item>
    </style>

    <style name="medium_light">
+2 −5
Original line number Diff line number Diff line
@@ -14,7 +14,6 @@ import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.telephony.TelephonyManager;
import android.text.format.DateUtils;

@@ -170,16 +169,14 @@ public final class AsyncRingtonePlayer {
     * @return Uri of the ringtone to play when the user is in a telephone call
     */
    private static Uri getInCallRingtoneUri(Context context) {
        final String packageName = context.getPackageName();
        return Uri.parse("android.resource://" + packageName + "/" + R.raw.alarm_expire);
        return Utils.getResourceUri(context, R.raw.alarm_expire);
    }

    /**
     * @return Uri of the ringtone to play when the chosen ringtone fails to play
     */
    private static Uri getFallbackRingtoneUri(Context context) {
        final String packageName = context.getPackageName();
        return Uri.parse("android.resource://" + packageName + "/" + R.raw.alarm_expire);
        return Utils.getResourceUri(context, R.raw.alarm_expire);
    }

    /**
+14 −1
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import android.os.Bundle;
import android.os.Looper;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.support.annotation.AnyRes;
import android.support.annotation.DrawableRes;
import android.support.graphics.drawable.VectorDrawableCompat;
import android.support.v4.os.BuildCompat;
@@ -185,6 +186,18 @@ public class Utils {
       return BuildCompat.isAtLeastN();
    }

    /**
     * @param resourceId identifies an application resource
     * @return the Uri by which the application resource is accessed
     */
    public static Uri getResourceUri(Context context, @AnyRes int resourceId) {
        return new Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName())
                .path(String.valueOf(resourceId))
                .build();
    }

    /**
     * @param listView the scrollable list view to test
     * @return {@code true} iff the {@code listView} content is currently scrolled to the top
Loading