diff --git a/src/org/kreed/vanilla/FullPlaybackActivity.java b/src/org/kreed/vanilla/FullPlaybackActivity.java index 7eea6ca8..e9f11221 100644 --- a/src/org/kreed/vanilla/FullPlaybackActivity.java +++ b/src/org/kreed/vanilla/FullPlaybackActivity.java @@ -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