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