FormattedDateBuilder.java revision 35c3bb793ac3ea8f63ff73d282c0dabfee5a49ce
1326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira/*
2326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * Copyright (C) 2012 Google Inc.
3326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * Licensed to The Android Open Source Project.
4326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira *
5326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License");
6326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * you may not use this file except in compliance with the License.
7326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * You may obtain a copy of the License at
8326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira *
9326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira *      http://www.apache.org/licenses/LICENSE-2.0
10326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira *
11326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * Unless required by applicable law or agreed to in writing, software
12326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
13326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * See the License for the specific language governing permissions and
15326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * limitations under the License.
16326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira */
1730e2c24b056542f3b1b438aeb798305d1226d0c8Andy Huangpackage com.android.mail;
18326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira
19326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereiraimport android.content.Context;
2035c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sappersteinimport android.content.res.Resources;
21326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereiraimport android.text.format.DateUtils;
2235c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sappersteinimport android.text.format.Time;
23326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira
24326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereiraimport java.util.Formatter;
25326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira
26326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira/**
27326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * Convenience class to efficiently make multiple short date strings. Instantiating and reusing
28326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira * one of these builders is faster than repeatedly bringing up all the locale stuff.
29326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira *
30326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira */
31326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereirapublic class FormattedDateBuilder {
32326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira
33326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira    private StringBuilder sb;
34326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira    private Formatter dateFormatter;
35326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira    private Context mContext;
36326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira
37326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira    public FormattedDateBuilder(Context context) {
38326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira        mContext = context;
39326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira        sb = new StringBuilder();
40326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira        dateFormatter = new Formatter(sb);
41326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira    }
42326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira
4335c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein    public CharSequence formatShortDate(long when) {
4435c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        return DateUtils.getRelativeTimeSpanString(mContext, when);
45326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira    }
46326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira
4735c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein    public CharSequence formatLongDateTime(long when) {
4835c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        final Resources resources = mContext.getResources();
4935c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein
5035c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        if (DateUtils.isToday(when)) {
5135c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein            return resources.getString(R.string.date_message_received_today, formatLongTime(when));
5235c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        } else if (isYesterday(when)) {
5335c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein            return resources.getString(
5435c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein                    R.string.date_message_received_yesterday, formatLongTime(when));
5535c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        } else {
5635c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein            return resources.getString(R.string.date_message_received,
5735c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein                    formatLongDayAndDate(when), formatLongTime(when));
5835c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        }
5935c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein    }
6035c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein
6135c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein    private CharSequence formatLongDayAndDate(long when) {
62326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira        sb.setLength(0);
6335c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        DateUtils.formatDateRange(mContext, dateFormatter, when, when,
64326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira                DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY
6535c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein                        | DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_ABBREV_ALL);
6635c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        return sb.toString();
6735c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein    }
6835c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein
6935c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein    private CharSequence formatLongTime(long when) {
7035c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        sb.setLength(0);
7135c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        DateUtils.formatDateRange(mContext, dateFormatter, when, when,
72326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira                DateUtils.FORMAT_SHOW_TIME);
73326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira        return sb.toString();
74326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira    }
75326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira
7635c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein    /**
7735c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein     * @return true if the supplied when is today else false
7835c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein     */
7935c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein    private static boolean isYesterday(long when) {
8035c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        final Time time = new Time();
8135c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        time.set(when);
8235c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein
8335c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        final int thenYear = time.year;
8435c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        final int thenMonth = time.month;
8535c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        final int thenMonthDay = time.monthDay;
8635c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein
8735c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        time.set(System.currentTimeMillis());
8835c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein        return (thenYear == time.year)
8935c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein                && (thenMonth == time.month)
9035c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein                && (thenMonthDay == (time.monthDay-1));
9135c3bb793ac3ea8f63ff73d282c0dabfee5a49ceAndrew Sapperstein    }
92326c660df0a0a36a52ae74d8bafaa22d6f253561Mindy Pereira}
93