1 /*
2  * Copyright (C) 2006 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 
17 package android.webkit;
18 
19 import android.content.Context;
20 import android.content.res.Resources;
21 
22 import com.android.icu.text.DateSorterBridge;
23 
24 import java.util.Calendar;
25 import java.util.Locale;
26 
27 /**
28  * Sorts dates into the following groups:
29  *   Today
30  *   Yesterday
31  *   seven days ago
32  *   one month ago
33  *   older than a month ago
34  */
35 
36 public class DateSorter {
37 
38     private static final String LOGTAG = "webkit";
39 
40     /** must be >= 3 */
41     public static final int DAY_COUNT = 5;
42 
43     private long [] mBins = new long[DAY_COUNT-1];
44     private String [] mLabels = new String[DAY_COUNT];
45 
46     private static final int NUM_DAYS_AGO = 7;
47 
48     /**
49      * @param context Application context
50      */
DateSorter(Context context)51     public DateSorter(Context context) {
52         Resources resources = context.getResources();
53 
54         Calendar c = Calendar.getInstance();
55         beginningOfDay(c);
56 
57         // Create the bins
58         mBins[0] = c.getTimeInMillis(); // Today
59         c.add(Calendar.DAY_OF_YEAR, -1);
60         mBins[1] = c.getTimeInMillis();  // Yesterday
61         c.add(Calendar.DAY_OF_YEAR, -(NUM_DAYS_AGO - 1));
62         mBins[2] = c.getTimeInMillis();  // Five days ago
63         c.add(Calendar.DAY_OF_YEAR, NUM_DAYS_AGO); // move back to today
64         c.add(Calendar.MONTH, -1);
65         mBins[3] = c.getTimeInMillis();  // One month ago
66 
67         // build labels
68         Locale locale = resources.getConfiguration().locale;
69         if (locale == null) {
70             locale = Locale.getDefault();
71         }
72         DateSorterBridge dateSorterBridge = DateSorterBridge.createInstance(locale);
73         mLabels[0] = dateSorterBridge.getToday();
74         mLabels[1] = dateSorterBridge.getYesterday();
75 
76         int resId = com.android.internal.R.plurals.last_num_days;
77         String format = resources.getQuantityString(resId, NUM_DAYS_AGO);
78         mLabels[2] = String.format(format, NUM_DAYS_AGO);
79 
80         mLabels[3] = context.getString(com.android.internal.R.string.last_month);
81         mLabels[4] = context.getString(com.android.internal.R.string.older);
82     }
83 
84     /**
85      * @param time time since the Epoch in milliseconds, such as that
86      * returned by Calendar.getTimeInMillis()
87      * @return an index from 0 to (DAY_COUNT - 1) that identifies which
88      * date bin this date belongs to
89      */
getIndex(long time)90     public int getIndex(long time) {
91         int lastDay = DAY_COUNT - 1;
92         for (int i = 0; i < lastDay; i++) {
93             if (time > mBins[i]) return i;
94         }
95         return lastDay;
96     }
97 
98     /**
99      * @param index date bin index as returned by getIndex()
100      * @return string label suitable for display to user
101      */
getLabel(int index)102     public String getLabel(int index) {
103         if (index < 0 || index >= DAY_COUNT) return "";
104         return mLabels[index];
105     }
106 
107 
108     /**
109      * @param index date bin index as returned by getIndex()
110      * @return date boundary at given index
111      */
getBoundary(int index)112     public long getBoundary(int index) {
113         int lastDay = DAY_COUNT - 1;
114         // Error case
115         if (index < 0 || index > lastDay) index = 0;
116         // Since this provides a lower boundary on dates that will be included
117         // in the given bin, provide the smallest value
118         if (index == lastDay) return Long.MIN_VALUE;
119         return mBins[index];
120     }
121 
122     /**
123      * Calcuate 12:00am by zeroing out hour, minute, second, millisecond
124      */
beginningOfDay(Calendar c)125     private void beginningOfDay(Calendar c) {
126         c.set(Calendar.HOUR_OF_DAY, 0);
127         c.set(Calendar.MINUTE, 0);
128         c.set(Calendar.SECOND, 0);
129         c.set(Calendar.MILLISECOND, 0);
130     }
131 }
132