1 // 2 // Copyright (C) 2018 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 #include "update_engine/update_manager/weekly_time.h" 17 18 #include <base/strings/string_number_conversions.h> 19 #include <base/strings/stringprintf.h> 20 #include <base/time/time.h> 21 22 using base::Time; 23 using base::TimeDelta; 24 using std::string; 25 26 namespace { 27 const int kDaysInWeek = 7; 28 } 29 30 namespace chromeos_update_manager { 31 GetDurationTo(const WeeklyTime & other) const32TimeDelta WeeklyTime::GetDurationTo(const WeeklyTime& other) const { 33 if (other.TimeFromStartOfWeek() < TimeFromStartOfWeek()) { 34 return other.TimeFromStartOfWeek() + 35 (TimeDelta::FromDays(kDaysInWeek) - TimeFromStartOfWeek()); 36 } 37 return other.TimeFromStartOfWeek() - TimeFromStartOfWeek(); 38 } 39 TimeFromStartOfWeek() const40TimeDelta WeeklyTime::TimeFromStartOfWeek() const { 41 return TimeDelta::FromDays(day_of_week_) + time_; 42 } 43 AddTime(const TimeDelta & offset)44void WeeklyTime::AddTime(const TimeDelta& offset) { 45 time_ += offset; 46 int days_over = time_.InDays(); 47 time_ -= TimeDelta::FromDays(days_over); 48 day_of_week_ = (day_of_week_ + days_over - 1) % kDaysInWeek + 1; 49 } 50 51 // static FromTime(const Time & time)52WeeklyTime WeeklyTime::FromTime(const Time& time) { 53 Time::Exploded exploded; 54 time.LocalExplode(&exploded); 55 return WeeklyTime(exploded.day_of_week, 56 TimeDelta::FromHours(exploded.hour) + 57 TimeDelta::FromMinutes(exploded.minute)); 58 } 59 InRange(const WeeklyTime & time) const60bool WeeklyTimeInterval::InRange(const WeeklyTime& time) const { 61 return time == start_ || 62 (time.GetDurationTo(start_) >= time.GetDurationTo(end_) && 63 time != end_); 64 } 65 ToString() const66string WeeklyTimeInterval::ToString() const { 67 return base::StringPrintf( 68 "Start: day_of_week=%d time=%d\nEnd: day_of_week=%d time=%d", 69 start_.day_of_week(), 70 start_.time().InMinutes(), 71 end_.day_of_week(), 72 end_.time().InMinutes()); 73 } 74 75 } // namespace chromeos_update_manager 76