The function below is part of the code for Google’s Camera app. I didn’t understand the logic of the statements in bold. Please help.
int seconds = intent.getIntExtra(MediaStore.EXTRA_DURATION_LIMIT, 0);
mMaxVideoDurationInMs = 1000 * seconds;
mMediaRecorder.setMaxDuration(mMaxVideoDurationInMs);
//this function is to update the recording time
private void updateRecordingTime() {
if (!mMediaRecorderRecording) {
return;
}
long now = SystemClock.uptimeMillis();
long delta = now – mRecordingStartTime;
// Starting a minute before reaching the max duration
// limit, we'll countdown the remaining time instead.
boolean countdownRemainingTime = (mMaxVideoDurationInMs != 0
&& delta >= mMaxVideoDurationInMs - 60000);
long next_update_delay = 1000 - (delta % 1000);
long seconds;
if (countdownRemainingTime) {
**delta = Math.max(0, mMaxVideoDurationInMs - delta);
seconds = (delta + 999) / 1000;**
} else {
**seconds = delta / 1000; // round to nearest**
}
long minutes = seconds / 60;
long hours = minutes / 60;
long remainderMinutes = minutes - (hours * 60);
long remainderSeconds = seconds - (minutes * 60);
String secondsString = Long.toString(remainderSeconds);
if (secondsString.length() < 2) {
secondsString = "0" + secondsString;
}
String minutesString = Long.toString(remainderMinutes);
if (minutesString.length() < 2) {
minutesString = "0" + minutesString;
}
String text = minutesString + ":" + secondsString;
if (hours > 0) {
String hoursString = Long.toString(hours);
if (hoursString.length() < 2) {
hoursString = "0" + hoursString;
}
text = hoursString + ":" + text;
}
mRecordingTimeView.setText(text);
if (mRecordingTimeCountsDown != countdownRemainingTime) {
// Avoid setting the color on every update, do it only
// when it needs changing.
mRecordingTimeCountsDown = countdownRemainingTime;
int color = getResources().getColor(countdownRemainingTime
? R.color.recording_time_remaining_text
: R.color.recording_time_elapsed_text);
mRecordingTimeView.setTextColor(color);
}
// Work around a limitation of the T-Mobile G1: The T-Mobile
// hardware blitter can't pixel-accurately scale and clip at the
// same time, and the SurfaceFlinger doesn't attempt to work around
// this limitation. In order to avoid visual corruption we must
// manually refresh the entire surface view when changing any
// overlapping view's contents.
mVideoPreview.invalidate();
mHandler.sendEmptyMessageDelayed(
UPDATE_RECORD_TIME, next_update_delay);
}
Are you referring to these lines?
and
It’s hard to tell exactly, as nothing was bold in your question (but the ** before and after these lines makes me think that’s what you’re referring to).
deltais in milliseconds, of which there are1000in a second.Line 1: Ensures a 0 is shown instead of a negative number
Line 2: Rounds up to the nearest second. Since
secondsis an integer, any value ofdeltafrom1001(1s 1ms) to1999(1s, 999ms) would be returned asseconds = 2.Line 3: Simply drops the ms portion, so
delta = 1returns0, but so doesdelta = 999.Delta means “change in” as in the amount of time change.
The two are almost the same, but when the code is displaying seconds remaining, it chooses to round up so that, e.g. 1.5s (1500ms) remaining is displayed as 1 second.
When it’s counting seconds elapsed, it rounds down, so that, e.g. 1.5s (1500ms) elapsed is displayed as 1s.
Since seconds is an int, any floating point number will have the decimal portion chopped off. So:
When you add the 999 you instead have: