blob: 597edc8702c41780477fdb48aacf9e93d5e1fc07 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/policy/off_hours/weekly_time.h"
#include "base/time/time.h"
namespace policy {
namespace off_hours {
namespace {
constexpr base::TimeDelta kWeek = base::TimeDelta::FromDays(7);
constexpr base::TimeDelta kDay = base::TimeDelta::FromDays(1);
constexpr base::TimeDelta kHour = base::TimeDelta::FromHours(1);
constexpr base::TimeDelta kMinute = base::TimeDelta::FromMinutes(1);
constexpr base::TimeDelta kSecond = base::TimeDelta::FromSeconds(1);
} // namespace
WeeklyTime::WeeklyTime(int day_of_week, int milliseconds)
: day_of_week_(day_of_week), milliseconds_(milliseconds) {
DCHECK_GT(day_of_week, 0);
DCHECK_LE(day_of_week, 7);
DCHECK_GE(milliseconds, 0);
DCHECK_LT(milliseconds, kDay.InMilliseconds());
}
std::unique_ptr<base::DictionaryValue> WeeklyTime::ToValue() const {
auto weekly_time = std::make_unique<base::DictionaryValue>();
weekly_time->SetInteger("day_of_week", day_of_week_);
weekly_time->SetInteger("time", milliseconds_);
return weekly_time;
}
base::TimeDelta WeeklyTime::GetDurationTo(const WeeklyTime& other) const {
int duration = (other.day_of_week() - day_of_week_) * kDay.InMilliseconds() +
other.milliseconds() - milliseconds_;
if (duration < 0)
duration += kWeek.InMilliseconds();
return base::TimeDelta::FromMilliseconds(duration);
}
WeeklyTime WeeklyTime::AddMilliseconds(int milliseconds) const {
milliseconds %= kWeek.InMilliseconds();
// Make |milliseconds| positive number (add number of milliseconds per week)
// for easier evaluation.
milliseconds += kWeek.InMilliseconds();
int shifted_milliseconds = milliseconds_ + milliseconds;
// Get milliseconds from the start of the day.
int result_milliseconds = shifted_milliseconds % kDay.InMilliseconds();
int day_offset = shifted_milliseconds / kDay.InMilliseconds();
// Convert day of week considering week is cyclic. +/- 1 is
// because day of week is from 1 to 7.
int result_day_of_week = (day_of_week_ + day_offset - 1) % 7 + 1;
return WeeklyTime(result_day_of_week, result_milliseconds);
}
// static
WeeklyTime WeeklyTime::GetCurrentWeeklyTime(base::Clock* clock) {
base::Time::Exploded exploded;
clock->Now().UTCExplode(&exploded);
int day_of_week = exploded.day_of_week;
// Exploded contains 0-based day of week (0 = Sunday, etc.)
if (day_of_week == 0)
day_of_week = 7;
return WeeklyTime(day_of_week,
exploded.hour * kHour.InMilliseconds() +
exploded.minute * kMinute.InMilliseconds() +
exploded.second * kSecond.InMilliseconds());
}
} // namespace off_hours
} // namespace policy