1984e52f31d596840cfa51b1238e1c43d2e1918f8saberian/* 2984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * Copyright (C) 2012 The Android Open Source Project 3984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * 4984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * Licensed under the Apache License, Version 2.0 (the "License"); 5984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * you may not use this file except in compliance with the License. 6984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * You may obtain a copy of the License at 7984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * 8984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * http://www.apache.org/licenses/LICENSE-2.0 9984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * 10984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * Unless required by applicable law or agreed to in writing, software 11984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * distributed under the License is distributed on an "AS IS" BASIS, 12984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * See the License for the specific language governing permissions and 14984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * limitations under the License. 15984e52f31d596840cfa51b1238e1c43d2e1918f8saberian */ 16984e52f31d596840cfa51b1238e1c43d2e1918f8saberian 17984e52f31d596840cfa51b1238e1c43d2e1918f8saberianpackage android.bordeaux.services; 18984e52f31d596840cfa51b1238e1c43d2e1918f8saberian 19f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linimport android.text.format.Time; 20984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport android.util.Log; 21f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin 22828043fd24533ff38eeef18322e0db2a611bfd5fWei Huaimport java.util.Arrays; 23984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport java.util.HashMap; 24828043fd24533ff38eeef18322e0db2a611bfd5fWei Huaimport java.util.List; 25984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport java.util.Map; 26984e52f31d596840cfa51b1238e1c43d2e1918f8saberian 27f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin// import java.util.Date; 28f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin 29f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin// TODO: use build in functions in 30f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin// import android.text.format.Time; 31f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linpublic class TimeStatsAggregator extends Aggregator { 32984e52f31d596840cfa51b1238e1c43d2e1918f8saberian final String TAG = "TimeStatsAggregator"; 33f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin 34f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin public static final String TIME_OF_WEEK = "Time of Week"; 35f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin public static final String DAY_OF_WEEK = "Day of Week"; 36f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin public static final String TIME_OF_DAY = "Time of Day"; 37f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin public static final String PERIOD_OF_DAY = "Period of Day"; 38f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin 39f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String WEEKEND = "Weekend"; 40f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String WEEKDAY = "Weekday"; 41f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String MONDAY = "Monday"; 42f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String TUESDAY = "Tuesday"; 43f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String WEDNESDAY = "Wednesday"; 445d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin static final String THURSDAY = "Thursday"; 45f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String FRIDAY = "Friday"; 46f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String SATURDAY = "Saturday"; 47f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String SUNDAY = "Sunday"; 48f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String MORNING = "Morning"; 49f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String NOON = "Noon"; 50f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String AFTERNOON = "AfterNoon"; 51f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String EVENING = "Evening"; 52f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String NIGHT = "Night"; 53f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String LATENIGHT = "LateNight"; 54f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String DAYTIME = "Daytime"; 55f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin static final String NIGHTTIME = "Nighttime"; 56f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin 57828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua static String mFakeTimeOfDay = null; 58828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua static String mFakeDayOfWeek = null; 59828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua 60828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua static final String[] TIME_OF_DAY_VALUES = 61828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua {MORNING, NOON, AFTERNOON, EVENING, NIGHT, LATENIGHT}; 62828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua 63828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua static final String[] DAY_OF_WEEK_VALUES = 64828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; 65828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua 66828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua static final String[] DAYTIME_VALUES = {MORNING, NOON, AFTERNOON, EVENING}; 67828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua 68984e52f31d596840cfa51b1238e1c43d2e1918f8saberian public String[] getListOfFeatures(){ 69f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin String [] list = new String[4]; 70f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin list[0] = TIME_OF_WEEK; 71f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin list[1] = DAY_OF_WEEK; 72f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin list[2] = TIME_OF_DAY; 73f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin list[3] = PERIOD_OF_DAY; 74984e52f31d596840cfa51b1238e1c43d2e1918f8saberian return list; 75984e52f31d596840cfa51b1238e1c43d2e1918f8saberian } 76984e52f31d596840cfa51b1238e1c43d2e1918f8saberian 77984e52f31d596840cfa51b1238e1c43d2e1918f8saberian public Map<String,String> getFeatureValue(String featureName) { 78f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin HashMap<String,String> feature = new HashMap<String,String>(); 79f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin 805d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin HashMap<String, String> features = 815d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin getAllTimeFeatures(System.currentTimeMillis()); 825d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin if (features.containsKey(featureName)) { 835d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin feature.put(featureName, features.get(featureName)); 84f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin } else { 85984e52f31d596840cfa51b1238e1c43d2e1918f8saberian Log.e(TAG, "There is no Time feature called " + featureName); 86f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin } 87f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin return (Map)feature; 88984e52f31d596840cfa51b1238e1c43d2e1918f8saberian } 89984e52f31d596840cfa51b1238e1c43d2e1918f8saberian 905d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin private static String getTimeOfDay(int hour) { 915d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin if (hour >= 5 && hour < 11) { 925d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return MORNING; 935d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin } else if (hour >= 11 && hour < 14) { 945d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return NOON; 955d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin } else if (hour >= 14 && hour < 18) { 965d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return AFTERNOON; 975d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin } else if (hour >= 18 && hour < 21) { 985d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return EVENING; 995d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin } else if ((hour >= 21 && hour < 24) || 1005d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin (hour >= 0 && hour < 1)) { 1015d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return NIGHT; 1025d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin } else { 1035d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return LATENIGHT; 1045d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin } 1055d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin } 106f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin 1075d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin private static String getDayOfWeek(int day) { 1085d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin switch (day) { 109f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin case Time.SATURDAY: 1105d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return SATURDAY; 111f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin case Time.SUNDAY: 1125d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return SUNDAY; 113f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin case Time.MONDAY: 1145d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return MONDAY; 115f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin case Time.TUESDAY: 1165d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return TUESDAY; 117f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin case Time.WEDNESDAY: 1185d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return WEDNESDAY; 119f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin case Time.THURSDAY: 1205d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return THURSDAY; 121f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin default: 1225d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return FRIDAY; 123f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin } 1245d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin } 125f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin 1265d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin private static String getPeriodOfDay(int hour) { 1275d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin if (hour > 6 && hour < 19) { 1285d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return DAYTIME; 129f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin } else { 1305d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return NIGHTTIME; 131f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin } 1325d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin } 133f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin 1345d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin static HashMap<String, String> getAllTimeFeatures(long utcTime) { 1355d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin HashMap<String, String> features = new HashMap<String, String>(); 1365d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin Time time = new Time(); 1375d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin time.set(utcTime); 1385d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin 139828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua if (mFakeTimeOfDay != null && mFakeTimeOfDay.length() != 0) { 140828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua List<String> day_list = Arrays.asList(DAYTIME_VALUES); 141f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin 142828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua if (day_list.contains(mFakeTimeOfDay)) { 143828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(PERIOD_OF_DAY, DAYTIME); 144828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } else { 145828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(PERIOD_OF_DAY, NIGHTTIME); 146828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } 147828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(TIME_OF_DAY, mFakeTimeOfDay); 148f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin } else { 149828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(PERIOD_OF_DAY, getPeriodOfDay(time.hour)); 150828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(TIME_OF_DAY, getTimeOfDay(time.hour)); 151f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin } 152828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua 153828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua if (mFakeDayOfWeek != null && mFakeDayOfWeek.length() != 0) { 154828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(DAY_OF_WEEK, mFakeDayOfWeek); 155828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua if (mFakeDayOfWeek.equals(SUNDAY) || 156828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua mFakeDayOfWeek.equals(SATURDAY) || 157828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua mFakeDayOfWeek.equals(FRIDAY) && 158828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.get(PERIOD_OF_DAY).equals(NIGHTTIME)) { 159828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(TIME_OF_WEEK, WEEKEND); 160828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } else { 161828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(TIME_OF_WEEK, WEEKDAY); 162828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } 163828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } 164828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua else { 165828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(DAY_OF_WEEK, getDayOfWeek(time.weekDay)); 166828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua if (time.weekDay == Time.SUNDAY || time.weekDay == Time.SATURDAY || 167828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua (time.weekDay == Time.FRIDAY && 168828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.get(PERIOD_OF_DAY).equals(NIGHTTIME))) { 169828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(TIME_OF_WEEK, WEEKEND); 170828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } else { 171828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua features.put(TIME_OF_WEEK, WEEKDAY); 172828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } 173828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } 174828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua 1755d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return features; 176984e52f31d596840cfa51b1238e1c43d2e1918f8saberian } 177828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua 178828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua // get all possible time_of_day values 179828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua public static List<String> getTimeOfDayValues() { 180828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua return Arrays.asList(TIME_OF_DAY_VALUES); 181828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } 182828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua 183828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua // get all possible day values 184828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua public static List<String> getDayOfWeekValues() { 185828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua return Arrays.asList(DAY_OF_WEEK_VALUES); 186828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } 187828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua 188828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua // set the fake time of day 189828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua // set to "" to disable the fake time 190828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua public static void setFakeTimeOfDay(String time_of_day) { 191828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua mFakeTimeOfDay = time_of_day; 192828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } 193828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua 194828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua // set the fake day of week 195828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua // set to "" to disable the fake day 196828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua public static void setFakeDayOfWeek(String day_of_week) { 197828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua mFakeDayOfWeek = day_of_week; 198828043fd24533ff38eeef18322e0db2a611bfd5fWei Hua } 199984e52f31d596840cfa51b1238e1c43d2e1918f8saberian} 200