Reputation: 16790
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);
}
Upvotes: 0
Views: 232
Reputation: 2296
Are you referring to these lines?
1. delta = Math.max(0, mMaxVideoDurationInMs - delta);
2. seconds = (delta + 999) / 1000;
and
3. seconds = delta / 1000; // round to nearest
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).
delta
is in milliseconds, of which there are 1000
in a second.
Line 1: Ensures a 0 is shown instead of a negative number
Line 2: Rounds up to the nearest second. Since seconds
is an integer, any value of delta
from 1001
(1s 1ms) to 1999
(1s, 999ms) would be returned as seconds = 2
.
Line 3: Simply drops the ms portion, so delta = 1
returns 0
, but so does delta = 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:
1500 / 1000 = 1.500
(int)1.500 = 1
When you add the 999 you instead have:
(1500 + 999) / 1000 = 2499 / 1000 = 2.499
(int)2.499 = 2
Upvotes: 1