Reduce allocations in playback activity song position code

This commit is contained in:
Christopher Eby 2011-09-25 01:50:14 -05:00
parent 6da2526648
commit ae78e46517

View File

@ -27,6 +27,7 @@ import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
@ -65,10 +66,22 @@ public class FullPlaybackActivity extends PlaybackActivity implements SeekBar.On
private TextView mAlbum;
private TextView mArtist;
/**
* Current song duration in milliseconds.
*/
private long mDuration;
/**
* Current song duration in human-readable form.
*/
private String mDurationString;
private boolean mSeekBarTracking;
private boolean mPaused;
/**
* Cached StringBuilder for formatting track position.
*/
private StringBuilder mTimeBuilder = new StringBuilder();
@Override
public void onCreate(Bundle icicle)
{
@ -131,6 +144,7 @@ public class FullPlaybackActivity extends PlaybackActivity implements SeekBar.On
mSeekBar = (SeekBar)findViewById(R.id.seek_bar);
mSeekBar.setMax(1000);
mSeekBar.setOnSeekBarChangeListener(this);
setDuration(0);
}
@Override
@ -222,7 +236,7 @@ public class FullPlaybackActivity extends PlaybackActivity implements SeekBar.On
{
super.onSongChange(song);
mDuration = song == null ? 0 : song.duration;
setDuration(song == null ? 0 : song.duration);
if (mTitle != null) {
if (song == null) {
@ -239,6 +253,17 @@ public class FullPlaybackActivity extends PlaybackActivity implements SeekBar.On
updateProgress();
}
/**
* Update the current song duration fields.
*
* @param duration The new duration, in milliseconds.
*/
private void setDuration(long duration)
{
mDuration = duration;
mDurationString = DateUtils.formatElapsedTime(mTimeBuilder, duration / 1000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
@ -295,24 +320,6 @@ public class FullPlaybackActivity extends PlaybackActivity implements SeekBar.On
return super.onKeyUp(keyCode, event);
}
/**
* Converts a duration in milliseconds to [HH:]MM:SS
*/
private String stringForTime(long ms)
{
int seconds = (int)(ms / 1000);
int hours = seconds / 3600;
seconds -= hours * 3600;
int minutes = seconds / 60;
seconds -= minutes * 60;
if (hours > 0)
return String.format("%d:%02d:%02d", hours, minutes, seconds);
else
return String.format("%02d:%02d", minutes, seconds);
}
/**
* Update seek bar progress and schedule another update in one second
*/
@ -320,9 +327,18 @@ public class FullPlaybackActivity extends PlaybackActivity implements SeekBar.On
{
int position = PlaybackService.hasInstance() ? PlaybackService.get(this).getPosition() : 0;
if (!mSeekBarTracking)
mSeekBar.setProgress(mDuration == 0 ? 0 : (int)(1000 * position / mDuration));
mSeekText.setText(stringForTime((int)position) + " / " + stringForTime(mDuration));
if (!mSeekBarTracking) {
long duration = mDuration;
mSeekBar.setProgress(duration == 0 ? 0 : (int)(1000 * position / duration));
}
StringBuilder builder = mTimeBuilder;
String current = DateUtils.formatElapsedTime(builder, position / 1000);
builder.setLength(0);
builder.append(current);
builder.append(" / ");
builder.append(mDurationString);
mSeekText.setText(builder.toString());
if (!mPaused && mControlsTop.getVisibility() == View.VISIBLE && (mState & PlaybackService.FLAG_PLAYING) != 0) {
// Try to update right when the duration increases by one second