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