1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/notifications/scheduler/public/schedule_service_utils.h"
#include "base/check_op.h"
namespace notifications {
namespace {
bool ValidateTimeWindow(const TimeDeltaPair& window) {
return (window.second - window.first < base::Hours(12) &&
window.second >= window.first);
}
} // namespace
bool ToLocalHour(int hour,
const base::Time& today,
int day_delta,
base::Time* out) {
DCHECK_GE(hour, 0);
DCHECK_LE(hour, 23);
DCHECK(out);
// Gets the local time at |hour| in yesterday.
base::Time another_day = today + base::Days(day_delta);
base::Time::Exploded another_day_exploded;
another_day.LocalExplode(&another_day_exploded);
another_day_exploded.hour = hour;
another_day_exploded.minute = 0;
another_day_exploded.second = 0;
another_day_exploded.millisecond = 0;
// Converts local exploded time to time stamp.
return base::Time::FromLocalExploded(another_day_exploded, out);
}
bool NextTimeWindow(base::Clock* clock,
const TimeDeltaPair& morning,
const TimeDeltaPair& evening,
TimePair* out) {
auto now = clock->Now();
base::Time beginning_of_today;
// verify the inputs.
if (!ToLocalHour(0, now, 0, &beginning_of_today) ||
!ValidateTimeWindow(morning) || !ValidateTimeWindow(evening) ||
morning.second > evening.first) {
return false;
}
auto today_morning_window = std::pair<base::Time, base::Time>(
beginning_of_today + morning.first, beginning_of_today + morning.second);
if (now <= today_morning_window.second) {
*out = std::move(today_morning_window);
return true;
}
auto today_evening_window = std::pair<base::Time, base::Time>(
beginning_of_today + evening.first, beginning_of_today + evening.second);
if (now <= today_evening_window.second) {
*out = std::move(today_evening_window);
return true;
}
// tomorrow morning window.
*out = std::pair<base::Time, base::Time>(
beginning_of_today + base::Days(1) + morning.first,
beginning_of_today + base::Days(1) + morning.second);
return true;
}
} // namespace notifications
|