summaryrefslogtreecommitdiffstats
path: root/mobile/android/base/java/org/mozilla/gecko/home/HistorySectionsHelper.java
blob: 7a49559f672e9bb9b6543bc4d4592dde9fd0b0cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.gecko.home;

import android.content.res.Resources;

import org.mozilla.gecko.home.CombinedHistoryAdapter.SectionHeader;
import org.mozilla.gecko.R;

import java.util.Calendar;
import java.util.Locale;


public class HistorySectionsHelper {

    // Constants for different time sections.
    private static final long MS_PER_DAY = 86400000;
    private static final long MS_PER_WEEK = MS_PER_DAY * 7;

    public static class SectionDateRange {
        public final long start;
        public final long end;
        public final String displayName;

        private SectionDateRange(long start, long end, String displayName) {
            this.start = start;
            this.end = end;
            this.displayName = displayName;
        }
    }

    /**
     * Updates the time range in milliseconds covered by each section header and sets the title.
     * @param res Resources for fetching string names
     * @param sectionsArray Array of section bookkeeping objects
     */
    public static void updateRecentSectionOffset(final Resources res, SectionDateRange[] sectionsArray) {
        final long now = System.currentTimeMillis();
        final Calendar cal  = Calendar.getInstance();

        // Update calendar to this day.
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 1);
        final long currentDayMS = cal.getTimeInMillis();

        // Calculate the start and end time for each section header and set its display text.
        sectionsArray[SectionHeader.TODAY.ordinal()] =
                new SectionDateRange(currentDayMS, now, res.getString(R.string.history_today_section));

        sectionsArray[SectionHeader.YESTERDAY.ordinal()] =
                new SectionDateRange(currentDayMS - MS_PER_DAY, currentDayMS, res.getString(R.string.history_yesterday_section));

        sectionsArray[SectionHeader.WEEK.ordinal()] =
                new SectionDateRange(currentDayMS - MS_PER_WEEK, now, res.getString(R.string.history_week_section));

        // Update the calendar to beginning of next month to avoid problems calculating the last day of this month.
        cal.add(Calendar.MONTH, 1);
        cal.set(Calendar.DAY_OF_MONTH, cal.getMinimum(Calendar.DAY_OF_MONTH));

        // Iterate over the remaining history sections, moving backwards in time.
        for (int i = SectionHeader.THIS_MONTH.ordinal(); i < SectionHeader.OLDER_THAN_SIX_MONTHS.ordinal(); i++) {
            final long end = cal.getTimeInMillis();

            cal.add(Calendar.MONTH, -1);
            final long start = cal.getTimeInMillis();

            final String displayName = cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());

            sectionsArray[i] = new SectionDateRange(start, end, displayName);
        }

        sectionsArray[SectionHeader.OLDER_THAN_SIX_MONTHS.ordinal()] =
                new SectionDateRange(0L, cal.getTimeInMillis(), res.getString(R.string.history_older_section));
    }
}