| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.bordeaux.services; |
| |
| import android.text.format.Time; |
| import android.util.Log; |
| |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| // import java.util.Date; |
| |
| // TODO: use build in functions in |
| // import android.text.format.Time; |
| public class TimeStatsAggregator extends Aggregator { |
| final String TAG = "TimeStatsAggregator"; |
| |
| public static final String TIME_OF_WEEK = "Time of Week"; |
| public static final String DAY_OF_WEEK = "Day of Week"; |
| public static final String TIME_OF_DAY = "Time of Day"; |
| public static final String PERIOD_OF_DAY = "Period of Day"; |
| |
| static final String WEEKEND = "Weekend"; |
| static final String WEEKDAY = "Weekday"; |
| static final String MONDAY = "Monday"; |
| static final String TUESDAY = "Tuesday"; |
| static final String WEDNESDAY = "Wednesday"; |
| static final String THURSDAY = "Thursday"; |
| static final String FRIDAY = "Friday"; |
| static final String SATURDAY = "Saturday"; |
| static final String SUNDAY = "Sunday"; |
| static final String MORNING = "Morning"; |
| static final String NOON = "Noon"; |
| static final String AFTERNOON = "AfterNoon"; |
| static final String EVENING = "Evening"; |
| static final String NIGHT = "Night"; |
| static final String LATENIGHT = "LateNight"; |
| static final String DAYTIME = "Daytime"; |
| static final String NIGHTTIME = "Nighttime"; |
| |
| static String mFakeTimeOfDay = null; |
| static String mFakeDayOfWeek = null; |
| |
| static final String[] TIME_OF_DAY_VALUES = |
| {MORNING, NOON, AFTERNOON, EVENING, NIGHT, LATENIGHT}; |
| |
| static final String[] DAY_OF_WEEK_VALUES = |
| {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; |
| |
| static final String[] DAYTIME_VALUES = {MORNING, NOON, AFTERNOON, EVENING}; |
| |
| public String[] getListOfFeatures(){ |
| String [] list = new String[4]; |
| list[0] = TIME_OF_WEEK; |
| list[1] = DAY_OF_WEEK; |
| list[2] = TIME_OF_DAY; |
| list[3] = PERIOD_OF_DAY; |
| return list; |
| } |
| |
| public Map<String,String> getFeatureValue(String featureName) { |
| HashMap<String,String> feature = new HashMap<String,String>(); |
| |
| HashMap<String, String> features = |
| getAllTimeFeatures(System.currentTimeMillis()); |
| if (features.containsKey(featureName)) { |
| feature.put(featureName, features.get(featureName)); |
| } else { |
| Log.e(TAG, "There is no Time feature called " + featureName); |
| } |
| return (Map)feature; |
| } |
| |
| private static String getTimeOfDay(int hour) { |
| if (hour >= 5 && hour < 11) { |
| return MORNING; |
| } else if (hour >= 11 && hour < 14) { |
| return NOON; |
| } else if (hour >= 14 && hour < 18) { |
| return AFTERNOON; |
| } else if (hour >= 18 && hour < 21) { |
| return EVENING; |
| } else if ((hour >= 21 && hour < 24) || |
| (hour >= 0 && hour < 1)) { |
| return NIGHT; |
| } else { |
| return LATENIGHT; |
| } |
| } |
| |
| private static String getDayOfWeek(int day) { |
| switch (day) { |
| case Time.SATURDAY: |
| return SATURDAY; |
| case Time.SUNDAY: |
| return SUNDAY; |
| case Time.MONDAY: |
| return MONDAY; |
| case Time.TUESDAY: |
| return TUESDAY; |
| case Time.WEDNESDAY: |
| return WEDNESDAY; |
| case Time.THURSDAY: |
| return THURSDAY; |
| default: |
| return FRIDAY; |
| } |
| } |
| |
| private static String getPeriodOfDay(int hour) { |
| if (hour > 6 && hour < 19) { |
| return DAYTIME; |
| } else { |
| return NIGHTTIME; |
| } |
| } |
| |
| static HashMap<String, String> getAllTimeFeatures(long utcTime) { |
| HashMap<String, String> features = new HashMap<String, String>(); |
| Time time = new Time(); |
| time.set(utcTime); |
| |
| if (mFakeTimeOfDay != null && mFakeTimeOfDay.length() != 0) { |
| List<String> day_list = Arrays.asList(DAYTIME_VALUES); |
| |
| if (day_list.contains(mFakeTimeOfDay)) { |
| features.put(PERIOD_OF_DAY, DAYTIME); |
| } else { |
| features.put(PERIOD_OF_DAY, NIGHTTIME); |
| } |
| features.put(TIME_OF_DAY, mFakeTimeOfDay); |
| } else { |
| features.put(PERIOD_OF_DAY, getPeriodOfDay(time.hour)); |
| features.put(TIME_OF_DAY, getTimeOfDay(time.hour)); |
| } |
| |
| if (mFakeDayOfWeek != null && mFakeDayOfWeek.length() != 0) { |
| features.put(DAY_OF_WEEK, mFakeDayOfWeek); |
| if (mFakeDayOfWeek.equals(SUNDAY) || |
| mFakeDayOfWeek.equals(SATURDAY) || |
| mFakeDayOfWeek.equals(FRIDAY) && |
| features.get(PERIOD_OF_DAY).equals(NIGHTTIME)) { |
| features.put(TIME_OF_WEEK, WEEKEND); |
| } else { |
| features.put(TIME_OF_WEEK, WEEKDAY); |
| } |
| } |
| else { |
| features.put(DAY_OF_WEEK, getDayOfWeek(time.weekDay)); |
| if (time.weekDay == Time.SUNDAY || time.weekDay == Time.SATURDAY || |
| (time.weekDay == Time.FRIDAY && |
| features.get(PERIOD_OF_DAY).equals(NIGHTTIME))) { |
| features.put(TIME_OF_WEEK, WEEKEND); |
| } else { |
| features.put(TIME_OF_WEEK, WEEKDAY); |
| } |
| } |
| |
| return features; |
| } |
| |
| // get all possible time_of_day values |
| public static List<String> getTimeOfDayValues() { |
| return Arrays.asList(TIME_OF_DAY_VALUES); |
| } |
| |
| // get all possible day values |
| public static List<String> getDayOfWeekValues() { |
| return Arrays.asList(DAY_OF_WEEK_VALUES); |
| } |
| |
| // set the fake time of day |
| // set to "" to disable the fake time |
| public static void setFakeTimeOfDay(String time_of_day) { |
| mFakeTimeOfDay = time_of_day; |
| } |
| |
| // set the fake day of week |
| // set to "" to disable the fake day |
| public static void setFakeDayOfWeek(String day_of_week) { |
| mFakeDayOfWeek = day_of_week; |
| } |
| } |