1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker /* 4*0e209d39SAndroid Build Coastguard Worker ***************************************************************************** 5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2007-2013, International Business Machines Corporation 6*0e209d39SAndroid Build Coastguard Worker * and others. All Rights Reserved. 7*0e209d39SAndroid Build Coastguard Worker ***************************************************************************** 8*0e209d39SAndroid Build Coastguard Worker * 9*0e209d39SAndroid Build Coastguard Worker * File CHNSECAL.H 10*0e209d39SAndroid Build Coastguard Worker * 11*0e209d39SAndroid Build Coastguard Worker * Modification History: 12*0e209d39SAndroid Build Coastguard Worker * 13*0e209d39SAndroid Build Coastguard Worker * Date Name Description 14*0e209d39SAndroid Build Coastguard Worker * 9/18/2007 ajmacher ported from java ChineseCalendar 15*0e209d39SAndroid Build Coastguard Worker ***************************************************************************** 16*0e209d39SAndroid Build Coastguard Worker */ 17*0e209d39SAndroid Build Coastguard Worker 18*0e209d39SAndroid Build Coastguard Worker #ifndef CHNSECAL_H 19*0e209d39SAndroid Build Coastguard Worker #define CHNSECAL_H 20*0e209d39SAndroid Build Coastguard Worker 21*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 24*0e209d39SAndroid Build Coastguard Worker 25*0e209d39SAndroid Build Coastguard Worker #include "unicode/calendar.h" 26*0e209d39SAndroid Build Coastguard Worker #include "unicode/timezone.h" 27*0e209d39SAndroid Build Coastguard Worker 28*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 29*0e209d39SAndroid Build Coastguard Worker 30*0e209d39SAndroid Build Coastguard Worker class CalendarCache; 31*0e209d39SAndroid Build Coastguard Worker /** 32*0e209d39SAndroid Build Coastguard Worker * <code>ChineseCalendar</code> is a concrete subclass of {@link Calendar} 33*0e209d39SAndroid Build Coastguard Worker * that implements a traditional Chinese calendar. The traditional Chinese 34*0e209d39SAndroid Build Coastguard Worker * calendar is a lunisolar calendar: Each month starts on a new moon, and 35*0e209d39SAndroid Build Coastguard Worker * the months are numbered according to solar events, specifically, to 36*0e209d39SAndroid Build Coastguard Worker * guarantee that month 11 always contains the winter solstice. In order 37*0e209d39SAndroid Build Coastguard Worker * to accomplish this, leap months are inserted in certain years. Leap 38*0e209d39SAndroid Build Coastguard Worker * months are numbered the same as the month they follow. The decision of 39*0e209d39SAndroid Build Coastguard Worker * which month is a leap month depends on the relative movements of the sun 40*0e209d39SAndroid Build Coastguard Worker * and moon. 41*0e209d39SAndroid Build Coastguard Worker * 42*0e209d39SAndroid Build Coastguard Worker * <p>This class defines one addition field beyond those defined by 43*0e209d39SAndroid Build Coastguard Worker * <code>Calendar</code>: The <code>IS_LEAP_MONTH</code> field takes the 44*0e209d39SAndroid Build Coastguard Worker * value of 0 for normal months, or 1 for leap months. 45*0e209d39SAndroid Build Coastguard Worker * 46*0e209d39SAndroid Build Coastguard Worker * <p>All astronomical computations are performed with respect to a time 47*0e209d39SAndroid Build Coastguard Worker * zone of GMT+8:00 and a longitude of 120 degrees east. Although some 48*0e209d39SAndroid Build Coastguard Worker * calendars implement a historically more accurate convention of using 49*0e209d39SAndroid Build Coastguard Worker * Beijing's local longitude (116 degrees 25 minutes east) and time zone 50*0e209d39SAndroid Build Coastguard Worker * (GMT+7:45:40) for dates before 1929, we do not implement this here. 51*0e209d39SAndroid Build Coastguard Worker * 52*0e209d39SAndroid Build Coastguard Worker * <p>Years are counted in two different ways in the Chinese calendar. The 53*0e209d39SAndroid Build Coastguard Worker * first method is by sequential numbering from the 61st year of the reign 54*0e209d39SAndroid Build Coastguard Worker * of Huang Di, 2637 BCE, which is designated year 1 on the Chinese 55*0e209d39SAndroid Build Coastguard Worker * calendar. The second method uses 60-year cycles from the same starting 56*0e209d39SAndroid Build Coastguard Worker * point, which is designated year 1 of cycle 1. In this class, the 57*0e209d39SAndroid Build Coastguard Worker * <code>EXTENDED_YEAR</code> field contains the sequential year count. 58*0e209d39SAndroid Build Coastguard Worker * The <code>ERA</code> field contains the cycle number, and the 59*0e209d39SAndroid Build Coastguard Worker * <code>YEAR</code> field contains the year of the cycle, a value between 60*0e209d39SAndroid Build Coastguard Worker * 1 and 60. 61*0e209d39SAndroid Build Coastguard Worker * 62*0e209d39SAndroid Build Coastguard Worker * <p>There is some variation in what is considered the starting point of 63*0e209d39SAndroid Build Coastguard Worker * the calendar, with some sources starting in the first year of the reign 64*0e209d39SAndroid Build Coastguard Worker * of Huang Di, rather than the 61st. This gives continuous year numbers 65*0e209d39SAndroid Build Coastguard Worker * 60 years greater and cycle numbers one greater than what this class 66*0e209d39SAndroid Build Coastguard Worker * implements. 67*0e209d39SAndroid Build Coastguard Worker * 68*0e209d39SAndroid Build Coastguard Worker * <p>Because <code>ChineseCalendar</code> defines an additional field and 69*0e209d39SAndroid Build Coastguard Worker * redefines the way the <code>ERA</code> field is used, it requires a new 70*0e209d39SAndroid Build Coastguard Worker * format class, <code>ChineseDateFormat</code>. As always, use the 71*0e209d39SAndroid Build Coastguard Worker * methods <code>DateFormat.getXxxInstance(Calendar cal,...)</code> to 72*0e209d39SAndroid Build Coastguard Worker * obtain a formatter for this calendar. 73*0e209d39SAndroid Build Coastguard Worker * 74*0e209d39SAndroid Build Coastguard Worker * <p>References:<ul> 75*0e209d39SAndroid Build Coastguard Worker * 76*0e209d39SAndroid Build Coastguard Worker * <li>Dershowitz and Reingold, <i>Calendrical Calculations</i>, 77*0e209d39SAndroid Build Coastguard Worker * Cambridge University Press, 1997</li> 78*0e209d39SAndroid Build Coastguard Worker * 79*0e209d39SAndroid Build Coastguard Worker * <li>The <a href="http://www.tondering.dk/claus/calendar.html"> 80*0e209d39SAndroid Build Coastguard Worker * Calendar FAQ</a></li> 81*0e209d39SAndroid Build Coastguard Worker * 82*0e209d39SAndroid Build Coastguard Worker * </ul> 83*0e209d39SAndroid Build Coastguard Worker * 84*0e209d39SAndroid Build Coastguard Worker * <p> 85*0e209d39SAndroid Build Coastguard Worker * This class should only be subclassed to implement variants of the Chinese lunar calendar.</p> 86*0e209d39SAndroid Build Coastguard Worker * <p> 87*0e209d39SAndroid Build Coastguard Worker * ChineseCalendar usually should be instantiated using 88*0e209d39SAndroid Build Coastguard Worker * {@link com.ibm.icu.util.Calendar#getInstance(ULocale)} passing in a <code>ULocale</code> 89*0e209d39SAndroid Build Coastguard Worker * with the tag <code>"@calendar=chinese"</code>.</p> 90*0e209d39SAndroid Build Coastguard Worker * 91*0e209d39SAndroid Build Coastguard Worker * @see com.ibm.icu.text.ChineseDateFormat 92*0e209d39SAndroid Build Coastguard Worker * @see com.ibm.icu.util.Calendar 93*0e209d39SAndroid Build Coastguard Worker * @author Alan Liu 94*0e209d39SAndroid Build Coastguard Worker * @internal 95*0e209d39SAndroid Build Coastguard Worker */ 96*0e209d39SAndroid Build Coastguard Worker class U_I18N_API ChineseCalendar : public Calendar { 97*0e209d39SAndroid Build Coastguard Worker public: 98*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 99*0e209d39SAndroid Build Coastguard Worker // Constructors... 100*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 101*0e209d39SAndroid Build Coastguard Worker 102*0e209d39SAndroid Build Coastguard Worker /** 103*0e209d39SAndroid Build Coastguard Worker * Constructs a ChineseCalendar based on the current time in the default time zone 104*0e209d39SAndroid Build Coastguard Worker * with the given locale. 105*0e209d39SAndroid Build Coastguard Worker * 106*0e209d39SAndroid Build Coastguard Worker * @param aLocale The given locale. 107*0e209d39SAndroid Build Coastguard Worker * @param success Indicates the status of ChineseCalendar object construction. 108*0e209d39SAndroid Build Coastguard Worker * Returns U_ZERO_ERROR if constructed successfully. 109*0e209d39SAndroid Build Coastguard Worker * @internal 110*0e209d39SAndroid Build Coastguard Worker */ 111*0e209d39SAndroid Build Coastguard Worker ChineseCalendar(const Locale& aLocale, UErrorCode &success); 112*0e209d39SAndroid Build Coastguard Worker 113*0e209d39SAndroid Build Coastguard Worker /** 114*0e209d39SAndroid Build Coastguard Worker * Returns true if the date is in a leap year. 115*0e209d39SAndroid Build Coastguard Worker * 116*0e209d39SAndroid Build Coastguard Worker * @param status ICU Error Code 117*0e209d39SAndroid Build Coastguard Worker * @return True if the date in the fields is in a Temporal proposal 118*0e209d39SAndroid Build Coastguard Worker * defined leap year. False otherwise. 119*0e209d39SAndroid Build Coastguard Worker */ 120*0e209d39SAndroid Build Coastguard Worker virtual bool inTemporalLeapYear(UErrorCode &status) const override; 121*0e209d39SAndroid Build Coastguard Worker 122*0e209d39SAndroid Build Coastguard Worker /** 123*0e209d39SAndroid Build Coastguard Worker * Gets The Temporal monthCode value corresponding to the month for the date. 124*0e209d39SAndroid Build Coastguard Worker * The value is a string identifier that starts with the literal grapheme 125*0e209d39SAndroid Build Coastguard Worker * "M" followed by two graphemes representing the zero-padded month number 126*0e209d39SAndroid Build Coastguard Worker * of the current month in a normal (non-leap) year and suffixed by an 127*0e209d39SAndroid Build Coastguard Worker * optional literal grapheme "L" if this is a leap month in a lunisolar 128*0e209d39SAndroid Build Coastguard Worker * calendar. For Chinese calendars (including Dangi), the values are 129*0e209d39SAndroid Build Coastguard Worker * "M01" .. "M12" for non-leap year, and "M01" .. "M12" with one of 130*0e209d39SAndroid Build Coastguard Worker * "M01L" .. "M12L" for leap year. 131*0e209d39SAndroid Build Coastguard Worker * 132*0e209d39SAndroid Build Coastguard Worker * @param status ICU Error Code 133*0e209d39SAndroid Build Coastguard Worker * @return One of 24 possible strings in 134*0e209d39SAndroid Build Coastguard Worker * {"M01" .. "M12", "M01L" .. "M12L"}. 135*0e209d39SAndroid Build Coastguard Worker * @draft ICU 73 136*0e209d39SAndroid Build Coastguard Worker */ 137*0e209d39SAndroid Build Coastguard Worker virtual const char* getTemporalMonthCode(UErrorCode &status) const override; 138*0e209d39SAndroid Build Coastguard Worker 139*0e209d39SAndroid Build Coastguard Worker /** 140*0e209d39SAndroid Build Coastguard Worker * Sets The Temporal monthCode which is a string identifier that starts 141*0e209d39SAndroid Build Coastguard Worker * with the literal grapheme "M" followed by two graphemes representing 142*0e209d39SAndroid Build Coastguard Worker * the zero-padded month number of the current month in a normal 143*0e209d39SAndroid Build Coastguard Worker * (non-leap) year and suffixed by an optional literal grapheme "L" if this 144*0e209d39SAndroid Build Coastguard Worker * is a leap month in a lunisolar calendar. For Chinese calendars, the values 145*0e209d39SAndroid Build Coastguard Worker * are "M01" .. "M12" for non-leap years, and "M01" .. "M12" plus one in 146*0e209d39SAndroid Build Coastguard Worker * "M01L" .. "M12L" for leap year. 147*0e209d39SAndroid Build Coastguard Worker * 148*0e209d39SAndroid Build Coastguard Worker * @param temporalMonth The value to be set for temporal monthCode. One of 149*0e209d39SAndroid Build Coastguard Worker * 24 possible strings in {"M01" .. "M12", "M01L" .. "M12L"}. 150*0e209d39SAndroid Build Coastguard Worker * @param status ICU Error Code 151*0e209d39SAndroid Build Coastguard Worker * 152*0e209d39SAndroid Build Coastguard Worker * @draft ICU 73 153*0e209d39SAndroid Build Coastguard Worker */ 154*0e209d39SAndroid Build Coastguard Worker virtual void setTemporalMonthCode(const char* code, UErrorCode& status) override; 155*0e209d39SAndroid Build Coastguard Worker 156*0e209d39SAndroid Build Coastguard Worker public: 157*0e209d39SAndroid Build Coastguard Worker /** 158*0e209d39SAndroid Build Coastguard Worker * Copy Constructor 159*0e209d39SAndroid Build Coastguard Worker * @internal 160*0e209d39SAndroid Build Coastguard Worker */ 161*0e209d39SAndroid Build Coastguard Worker ChineseCalendar(const ChineseCalendar& other); 162*0e209d39SAndroid Build Coastguard Worker 163*0e209d39SAndroid Build Coastguard Worker /** 164*0e209d39SAndroid Build Coastguard Worker * Destructor. 165*0e209d39SAndroid Build Coastguard Worker * @internal 166*0e209d39SAndroid Build Coastguard Worker */ 167*0e209d39SAndroid Build Coastguard Worker virtual ~ChineseCalendar(); 168*0e209d39SAndroid Build Coastguard Worker 169*0e209d39SAndroid Build Coastguard Worker // clone 170*0e209d39SAndroid Build Coastguard Worker virtual ChineseCalendar* clone() const override; 171*0e209d39SAndroid Build Coastguard Worker 172*0e209d39SAndroid Build Coastguard Worker private: 173*0e209d39SAndroid Build Coastguard Worker 174*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 175*0e209d39SAndroid Build Coastguard Worker // Internal data.... 176*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 177*0e209d39SAndroid Build Coastguard Worker 178*0e209d39SAndroid Build Coastguard Worker // There is a leap month between the Winter Solstice before and after the 179*0e209d39SAndroid Build Coastguard Worker // current date.This is different from leap year because in some year, such as 180*0e209d39SAndroid Build Coastguard Worker // 1813 and 2033, the leap month is after the Winter Solstice of that year. So 181*0e209d39SAndroid Build Coastguard Worker // this value could be false for a date prior to the Winter Solstice of that 182*0e209d39SAndroid Build Coastguard Worker // year but that year still has a leap month and therefor is a leap year. 183*0e209d39SAndroid Build Coastguard Worker UBool hasLeapMonthBetweenWinterSolstices; 184*0e209d39SAndroid Build Coastguard Worker 185*0e209d39SAndroid Build Coastguard Worker //---------------------------------------------------------------------- 186*0e209d39SAndroid Build Coastguard Worker // Calendar framework 187*0e209d39SAndroid Build Coastguard Worker //---------------------------------------------------------------------- 188*0e209d39SAndroid Build Coastguard Worker 189*0e209d39SAndroid Build Coastguard Worker protected: 190*0e209d39SAndroid Build Coastguard Worker virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; 191*0e209d39SAndroid Build Coastguard Worker virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; 192*0e209d39SAndroid Build Coastguard Worker virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; 193*0e209d39SAndroid Build Coastguard Worker virtual int32_t handleGetExtendedYear(UErrorCode& status) override; 194*0e209d39SAndroid Build Coastguard Worker virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; 195*0e209d39SAndroid Build Coastguard Worker virtual const UFieldResolutionTable* getFieldResolutionTable() const override; 196*0e209d39SAndroid Build Coastguard Worker 197*0e209d39SAndroid Build Coastguard Worker public: 198*0e209d39SAndroid Build Coastguard Worker virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode &status) override; 199*0e209d39SAndroid Build Coastguard Worker virtual void add(EDateFields field, int32_t amount, UErrorCode &status) override; 200*0e209d39SAndroid Build Coastguard Worker virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode &status) override; 201*0e209d39SAndroid Build Coastguard Worker virtual void roll(EDateFields field, int32_t amount, UErrorCode &status) override; 202*0e209d39SAndroid Build Coastguard Worker 203*0e209d39SAndroid Build Coastguard Worker /** 204*0e209d39SAndroid Build Coastguard Worker * @return The related Gregorian year; will be obtained by modifying the value 205*0e209d39SAndroid Build Coastguard Worker * obtained by get from UCAL_EXTENDED_YEAR field 206*0e209d39SAndroid Build Coastguard Worker * @internal 207*0e209d39SAndroid Build Coastguard Worker */ 208*0e209d39SAndroid Build Coastguard Worker virtual int32_t getRelatedYear(UErrorCode &status) const override; 209*0e209d39SAndroid Build Coastguard Worker 210*0e209d39SAndroid Build Coastguard Worker /** 211*0e209d39SAndroid Build Coastguard Worker * @param year The related Gregorian year to set; will be modified as necessary then 212*0e209d39SAndroid Build Coastguard Worker * set in UCAL_EXTENDED_YEAR field 213*0e209d39SAndroid Build Coastguard Worker * @internal 214*0e209d39SAndroid Build Coastguard Worker */ 215*0e209d39SAndroid Build Coastguard Worker virtual void setRelatedYear(int32_t year) override; 216*0e209d39SAndroid Build Coastguard Worker 217*0e209d39SAndroid Build Coastguard Worker //---------------------------------------------------------------------- 218*0e209d39SAndroid Build Coastguard Worker // Internal methods & astronomical calculations 219*0e209d39SAndroid Build Coastguard Worker //---------------------------------------------------------------------- 220*0e209d39SAndroid Build Coastguard Worker 221*0e209d39SAndroid Build Coastguard Worker private: 222*0e209d39SAndroid Build Coastguard Worker 223*0e209d39SAndroid Build Coastguard Worker static const UFieldResolutionTable CHINESE_DATE_PRECEDENCE[]; 224*0e209d39SAndroid Build Coastguard Worker 225*0e209d39SAndroid Build Coastguard Worker virtual void offsetMonth(int32_t newMoon, int32_t dom, int32_t delta, UErrorCode& status); 226*0e209d39SAndroid Build Coastguard Worker 227*0e209d39SAndroid Build Coastguard Worker // UObject stuff 228*0e209d39SAndroid Build Coastguard Worker public: 229*0e209d39SAndroid Build Coastguard Worker /** 230*0e209d39SAndroid Build Coastguard Worker * @return The class ID for this object. All objects of a given class have the 231*0e209d39SAndroid Build Coastguard Worker * same class ID. Objects of other classes have different class IDs. 232*0e209d39SAndroid Build Coastguard Worker * @internal 233*0e209d39SAndroid Build Coastguard Worker */ 234*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 235*0e209d39SAndroid Build Coastguard Worker 236*0e209d39SAndroid Build Coastguard Worker /** 237*0e209d39SAndroid Build Coastguard Worker * Return the class ID for this class. This is useful only for comparing to a return 238*0e209d39SAndroid Build Coastguard Worker * value from getDynamicClassID(). For example: 239*0e209d39SAndroid Build Coastguard Worker * 240*0e209d39SAndroid Build Coastguard Worker * Base* polymorphic_pointer = createPolymorphicObject(); 241*0e209d39SAndroid Build Coastguard Worker * if (polymorphic_pointer->getDynamicClassID() == 242*0e209d39SAndroid Build Coastguard Worker * Derived::getStaticClassID()) ... 243*0e209d39SAndroid Build Coastguard Worker * 244*0e209d39SAndroid Build Coastguard Worker * @return The class ID for all objects of this class. 245*0e209d39SAndroid Build Coastguard Worker * @internal 246*0e209d39SAndroid Build Coastguard Worker */ 247*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 248*0e209d39SAndroid Build Coastguard Worker 249*0e209d39SAndroid Build Coastguard Worker /** 250*0e209d39SAndroid Build Coastguard Worker * return the calendar type, "chinese". 251*0e209d39SAndroid Build Coastguard Worker * 252*0e209d39SAndroid Build Coastguard Worker * @return calendar type 253*0e209d39SAndroid Build Coastguard Worker * @internal 254*0e209d39SAndroid Build Coastguard Worker */ 255*0e209d39SAndroid Build Coastguard Worker virtual const char * getType() const override; 256*0e209d39SAndroid Build Coastguard Worker 257*0e209d39SAndroid Build Coastguard Worker struct Setting { 258*0e209d39SAndroid Build Coastguard Worker int32_t epochYear; 259*0e209d39SAndroid Build Coastguard Worker const TimeZone* zoneAstroCalc; 260*0e209d39SAndroid Build Coastguard Worker CalendarCache** winterSolsticeCache; 261*0e209d39SAndroid Build Coastguard Worker CalendarCache** newYearCache; 262*0e209d39SAndroid Build Coastguard Worker }; 263*0e209d39SAndroid Build Coastguard Worker protected: 264*0e209d39SAndroid Build Coastguard Worker virtual Setting getSetting(UErrorCode& status) const; 265*0e209d39SAndroid Build Coastguard Worker virtual int32_t internalGetMonth(int32_t defaultValue, UErrorCode& status) const override; 266*0e209d39SAndroid Build Coastguard Worker 267*0e209d39SAndroid Build Coastguard Worker virtual int32_t internalGetMonth(UErrorCode& status) const override; 268*0e209d39SAndroid Build Coastguard Worker 269*0e209d39SAndroid Build Coastguard Worker protected: 270*0e209d39SAndroid Build Coastguard Worker 271*0e209d39SAndroid Build Coastguard Worker DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY 272*0e209d39SAndroid Build Coastguard Worker 273*0e209d39SAndroid Build Coastguard Worker private: // default century stuff. 274*0e209d39SAndroid Build Coastguard Worker 275*0e209d39SAndroid Build Coastguard Worker ChineseCalendar() = delete; // default constructor not implemented 276*0e209d39SAndroid Build Coastguard Worker 277*0e209d39SAndroid Build Coastguard Worker #ifdef __CalendarTest__ 278*0e209d39SAndroid Build Coastguard Worker friend void CalendarTest::TestChineseCalendarComputeMonthStart(); 279*0e209d39SAndroid Build Coastguard Worker #endif 280*0e209d39SAndroid Build Coastguard Worker }; 281*0e209d39SAndroid Build Coastguard Worker 282*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 283*0e209d39SAndroid Build Coastguard Worker 284*0e209d39SAndroid Build Coastguard Worker #endif 285*0e209d39SAndroid Build Coastguard Worker #endif 286