18188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski/*
28188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * Copyright (C) 2013 The Android Open Source Project
38188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski *
48188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * Licensed under the Apache License, Version 2.0 (the "License");
58188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * you may not use this file except in compliance with the License.
68188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * You may obtain a copy of the License at
78188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski *
88188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski *      http://www.apache.org/licenses/LICENSE-2.0
98188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski *
108188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * Unless required by applicable law or agreed to in writing, software
118188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * distributed under the License is distributed on an "AS IS" BASIS,
128188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * See the License for the specific language governing permissions and
148188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * limitations under the License.
158188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski */
168188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
178188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowskipackage com.android.deskclock.provider;
188188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
198188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowskiimport android.content.Context;
208188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
218188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowskiimport com.android.deskclock.R;
228188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
238188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowskiimport java.text.DateFormatSymbols;
248188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowskiimport java.util.Calendar;
258188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowskiimport java.util.HashSet;
268188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
278188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski/*
288188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * Days of week code as a single int.
298188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * 0x00: no day
308188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * 0x01: Monday
318188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * 0x02: Tuesday
328188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * 0x04: Wednesday
338188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * 0x08: Thursday
348188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * 0x10: Friday
358188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * 0x20: Saturday
368188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski * 0x40: Sunday
378188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski */
388188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowskipublic final class DaysOfWeek {
398188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    // Number if days in the week.
408188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public static final int DAYS_IN_A_WEEK = 7;
418188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
428188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    // Value when all days are set
438188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public static final int ALL_DAYS_SET = 0x7f;
448188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
458188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    // Value when no days are set
468188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public static final int NO_DAYS_SET = 0;
478188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
488188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    /**
498188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     * Need to have monday start at index 0 to be backwards compatible. This converts
508188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     * Calendar.DAY_OF_WEEK constants to our internal bit structure.
518188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     */
52ba426c1edb808f19f3b79bd751f595ffb505be5fBudi Kusmiantoro    static int convertDayToBitIndex(int day) {
538188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        return (day + 5) % DAYS_IN_A_WEEK;
548188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
558188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
568188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    /**
578188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     * Need to have monday start at index 0 to be backwards compatible. This converts
588188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     * our bit structure to Calendar.DAY_OF_WEEK constant value.
598188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     */
60ba426c1edb808f19f3b79bd751f595ffb505be5fBudi Kusmiantoro    static int convertBitIndexToDay(int bitIndex) {
618188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        return (bitIndex + 1) % DAYS_IN_A_WEEK + 1;
628188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
638188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
648188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    // Bitmask of all repeating days
658188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    private int mBitSet;
668188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
678188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public DaysOfWeek(int bitSet) {
688188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        mBitSet = bitSet;
698188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
708188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
7115734572c8122da905014781dfa25d24a57c62c3Annie Chin    public String toString(Context context, int firstDay) {
7215734572c8122da905014781dfa25d24a57c62c3Annie Chin        return toString(context, firstDay, false /* forAccessibility */);
738188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
748188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
7515734572c8122da905014781dfa25d24a57c62c3Annie Chin    public String toAccessibilityString(Context context, int firstDay) {
7615734572c8122da905014781dfa25d24a57c62c3Annie Chin        return toString(context, firstDay, true /* forAccessibility */);
778188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
788188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
7915734572c8122da905014781dfa25d24a57c62c3Annie Chin    private String toString(Context context, int firstDay, boolean forAccessibility) {
808188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        StringBuilder ret = new StringBuilder();
818188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
828188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        // no days
838188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        if (mBitSet == NO_DAYS_SET) {
84ba426c1edb808f19f3b79bd751f595ffb505be5fBudi Kusmiantoro            return "";
858188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        }
868188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
878188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        // every day
888188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        if (mBitSet == ALL_DAYS_SET) {
898188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            return context.getText(R.string.every_day).toString();
908188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        }
918188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
928188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        // count selected days
938188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        int dayCount = 0;
948188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        int bitSet = mBitSet;
958188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        while (bitSet > 0) {
968188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            if ((bitSet & 1) == 1) dayCount++;
978188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            bitSet >>= 1;
988188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        }
998188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
1008188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        // short or long form?
1018188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        DateFormatSymbols dfs = new DateFormatSymbols();
1028188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        String[] dayList = (forAccessibility || dayCount <= 1) ?
1038188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski                dfs.getWeekdays() :
1048188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski                dfs.getShortWeekdays();
1058188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
106955d95ca5dbce921adf1939b508b7f3a58ad903eAnnie Chin        // In this system, Mon = 0, Sun = 6, etc.
107955d95ca5dbce921adf1939b508b7f3a58ad903eAnnie Chin        // startDay is stored corresponding to Calendar.DAY_OF_WEEK where Sun = 0, Mon = 2, etc.
10815734572c8122da905014781dfa25d24a57c62c3Annie Chin        final int startDay = convertDayToBitIndex(firstDay);
109955d95ca5dbce921adf1939b508b7f3a58ad903eAnnie Chin
110955d95ca5dbce921adf1939b508b7f3a58ad903eAnnie Chin        // selected days, starting from user-selected start day of week
111955d95ca5dbce921adf1939b508b7f3a58ad903eAnnie Chin        // iterate starting from user-selected start of day
112955d95ca5dbce921adf1939b508b7f3a58ad903eAnnie Chin        for (int bitIndex = startDay; bitIndex < DAYS_IN_A_WEEK + startDay; ++bitIndex) {
113955d95ca5dbce921adf1939b508b7f3a58ad903eAnnie Chin            if ((mBitSet & (1 << (bitIndex % DAYS_IN_A_WEEK))) != 0) {
1148188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski                ret.append(dayList[convertBitIndexToDay(bitIndex)]);
1158188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski                dayCount -= 1;
1168188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski                if (dayCount > 0) ret.append(context.getText(R.string.day_concat));
1178188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            }
1188188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        }
1198188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        return ret.toString();
1208188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
1218188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
1228188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    /**
1238188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     * Enables or disable certain days of the week.
1248188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     *
1258188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     * @param daysOfWeek Calendar.SUNDAY, Calendar.MONDAY, Calendar.TUESDAY, etc.
1268188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     */
1278188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public void setDaysOfWeek(boolean value, int ... daysOfWeek) {
1288188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        for (int day : daysOfWeek) {
1298188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            setBit(convertDayToBitIndex(day), value);
1308188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        }
1318188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
1328188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
1338188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    private boolean isBitEnabled(int bitIndex) {
1348188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        return ((mBitSet & (1 << bitIndex)) > 0);
1358188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
1368188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
1378188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    private void setBit(int bitIndex, boolean set) {
1388188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        if (set) {
1398188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            mBitSet |= (1 << bitIndex);
1408188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        } else {
1418188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            mBitSet &= ~(1 << bitIndex);
1428188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        }
1438188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
1448188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
1458188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public void setBitSet(int bitSet) {
1468188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        mBitSet = bitSet;
1478188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
1488188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
1498188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public int getBitSet() {
1508188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        return mBitSet;
1518188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
1528188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
153ba426c1edb808f19f3b79bd751f595ffb505be5fBudi Kusmiantoro    /**
154ba426c1edb808f19f3b79bd751f595ffb505be5fBudi Kusmiantoro     * Returns set of Calendar.MONDAY, Calendar.TUESDAY, etc based on the current mBitSet value
155ba426c1edb808f19f3b79bd751f595ffb505be5fBudi Kusmiantoro     */
1568188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public HashSet<Integer> getSetDays() {
157ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        final HashSet<Integer> result = new HashSet<Integer>();
1588188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        for (int bitIndex = 0; bitIndex < DAYS_IN_A_WEEK; bitIndex++) {
1598188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            if (isBitEnabled(bitIndex)) {
160ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                result.add(convertBitIndexToDay(bitIndex));
1618188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            }
1628188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        }
163ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        return result;
1648188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
1658188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
1668188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public boolean isRepeating() {
1678188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        return mBitSet != NO_DAYS_SET;
1688188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
1698188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
1708188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    /**
171d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin     * Returns number of days backwards from today to previous alarm.
172d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin     * ex:
173d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin     * Daily alarm, current = Tuesday -> 1
174d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin     * Weekly alarm on Wednesday, current = Tuesday -> 6
175d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin     * One time alarm -> -1
1768188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     *
1778188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     * @param current must be set to today
1788188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski     */
179d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin    public int calculateDaysToPreviousAlarm(Calendar current) {
180d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        if (!isRepeating()) {
181d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin            return -1;
182d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        }
183d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin
184d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        // We only use this on preemptively dismissed alarms, and alarms can only fire once a day,
185d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        // so there is no chance that the previous fire time is on the same day. Start dayCount on
186d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        // previous day.
187d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        int dayCount = -1;
188d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        int currentDayIndex = convertDayToBitIndex(current.get(Calendar.DAY_OF_WEEK));
189d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        for (; dayCount >= -DAYS_IN_A_WEEK; dayCount--) {
190d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin            int previousAlarmBitIndex = (currentDayIndex + dayCount);
191d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin            if (previousAlarmBitIndex < 0) {
192d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin                // Ex. previousAlarmBitIndex = -1 means the day before index 0 = index 6
193d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin                previousAlarmBitIndex = previousAlarmBitIndex + DAYS_IN_A_WEEK;
194d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin            }
195d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin            if (isBitEnabled(previousAlarmBitIndex)) {
196d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin                break;
197d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin            }
198d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        }
199d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        // return a positive value
200d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        return dayCount * -1;
201d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin    }
202d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin
203d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin    /**
204d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin     * Returns number of days from today until next alarm.
205d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin     *
206d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin     * @param current must be set to today or the day after the currentTime
207d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin     */
2088188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public int calculateDaysToNextAlarm(Calendar current) {
2098188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        if (!isRepeating()) {
2108188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            return -1;
2118188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        }
2128188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
2138188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        int dayCount = 0;
214d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin        int currentDayIndex = convertDayToBitIndex(current.get(Calendar.DAY_OF_WEEK));
2158188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        for (; dayCount < DAYS_IN_A_WEEK; dayCount++) {
216d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin            int nextAlarmBitIndex = (currentDayIndex + dayCount) % DAYS_IN_A_WEEK;
217d68d58de285756f5094a33b12385f4989c76d9c4Annie Chin            if (isBitEnabled(nextAlarmBitIndex)) {
2188188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski                break;
2198188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski            }
2208188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        }
2218188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        return dayCount;
2228188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
2238188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
2248188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public void clearAllDays() {
225ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        mBitSet = NO_DAYS_SET;
2268188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
2278188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski
2288188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    @Override
2298188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    public String toString() {
2308188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski        return "DaysOfWeek{" +
2318188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski                "mBitSet=" + mBitSet +
2328188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski                '}';
2338188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski    }
2348188813bc869d3df4885f9c2972f9cc85745b59bPaul Sliwowski}
235