182b318634af1b6594e60cfd1f2df4d3845f80587Erik/*
282b318634af1b6594e60cfd1f2df4d3845f80587Erik * Copyright (C) 2010 The Android Open Source Project
382b318634af1b6594e60cfd1f2df4d3845f80587Erik *
482b318634af1b6594e60cfd1f2df4d3845f80587Erik * Licensed under the Apache License, Version 2.0 (the "License");
582b318634af1b6594e60cfd1f2df4d3845f80587Erik * you may not use this file except in compliance with the License.
682b318634af1b6594e60cfd1f2df4d3845f80587Erik * You may obtain a copy of the License at
782b318634af1b6594e60cfd1f2df4d3845f80587Erik *
882b318634af1b6594e60cfd1f2df4d3845f80587Erik *      http://www.apache.org/licenses/LICENSE-2.0
982b318634af1b6594e60cfd1f2df4d3845f80587Erik *
1082b318634af1b6594e60cfd1f2df4d3845f80587Erik * Unless required by applicable law or agreed to in writing, software
1182b318634af1b6594e60cfd1f2df4d3845f80587Erik * distributed under the License is distributed on an "AS IS" BASIS,
1282b318634af1b6594e60cfd1f2df4d3845f80587Erik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1382b318634af1b6594e60cfd1f2df4d3845f80587Erik * See the License for the specific language governing permissions and
1482b318634af1b6594e60cfd1f2df4d3845f80587Erik * limitations under the License.
1582b318634af1b6594e60cfd1f2df4d3845f80587Erik */
1682b318634af1b6594e60cfd1f2df4d3845f80587Erik
1782b318634af1b6594e60cfd1f2df4d3845f80587Erikpackage com.android.calendar.month;
1882b318634af1b6594e60cfd1f2df4d3845f80587Erik
1982b318634af1b6594e60cfd1f2df4d3845f80587Erik// TODO Remove calendar imports when the required methods have been
2082b318634af1b6594e60cfd1f2df4d3845f80587Erik// refactored into the public api
2182b318634af1b6594e60cfd1f2df4d3845f80587Erikimport com.android.calendar.CalendarController;
2282b318634af1b6594e60cfd1f2df4d3845f80587Erikimport com.android.calendar.Utils;
2382b318634af1b6594e60cfd1f2df4d3845f80587Erik
2482b318634af1b6594e60cfd1f2df4d3845f80587Erikimport android.content.Context;
2582b318634af1b6594e60cfd1f2df4d3845f80587Erikimport android.text.format.Time;
2682b318634af1b6594e60cfd1f2df4d3845f80587Erikimport android.util.Log;
2782b318634af1b6594e60cfd1f2df4d3845f80587Erikimport android.view.GestureDetector;
2882b318634af1b6594e60cfd1f2df4d3845f80587Erikimport android.view.MotionEvent;
2982b318634af1b6594e60cfd1f2df4d3845f80587Erikimport android.view.View;
3082b318634af1b6594e60cfd1f2df4d3845f80587Erikimport android.view.View.OnTouchListener;
3182b318634af1b6594e60cfd1f2df4d3845f80587Erikimport android.view.ViewGroup;
3282b318634af1b6594e60cfd1f2df4d3845f80587Erikimport android.widget.AbsListView.LayoutParams;
3382b318634af1b6594e60cfd1f2df4d3845f80587Erikimport android.widget.BaseAdapter;
3459a44aa4bb3fac90f7ceab65da191e7fd81905f2Isaac Katzenelsonimport android.widget.ListView;
3582b318634af1b6594e60cfd1f2df4d3845f80587Erik
36636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport java.util.Calendar;
3782b318634af1b6594e60cfd1f2df4d3845f80587Erikimport java.util.HashMap;
38e566836781f2a653624dceee3399bef25a0ea119Erikimport java.util.Locale;
39e566836781f2a653624dceee3399bef25a0ea119Erik
40ca56a02bc75ca52eca0c2670be0ee4146f292624Erik/**
41ca56a02bc75ca52eca0c2670be0ee4146f292624Erik * <p>
42ca56a02bc75ca52eca0c2670be0ee4146f292624Erik * This is a specialized adapter for creating a list of weeks with selectable
43ca56a02bc75ca52eca0c2670be0ee4146f292624Erik * days. It can be configured to display the week number, start the week on a
44ca56a02bc75ca52eca0c2670be0ee4146f292624Erik * given day, show a reduced number of days, or display an arbitrary number of
45e21674aefc9755ba519dfc5b3ff4348be4814903Erik * weeks at a time. See {@link SimpleDayPickerFragment} for usage.
46ca56a02bc75ca52eca0c2670be0ee4146f292624Erik * </p>
47ca56a02bc75ca52eca0c2670be0ee4146f292624Erik */
48e21674aefc9755ba519dfc5b3ff4348be4814903Erikpublic class SimpleWeeksAdapter extends BaseAdapter implements OnTouchListener {
4982b318634af1b6594e60cfd1f2df4d3845f80587Erik
503553621c824afe1f3eacbe8555678005ca1264a1Erik    private static final String TAG = "MonthByWeek";
5182b318634af1b6594e60cfd1f2df4d3845f80587Erik
52e566836781f2a653624dceee3399bef25a0ea119Erik    /**
53e566836781f2a653624dceee3399bef25a0ea119Erik     * The number of weeks to display at a time.
54e566836781f2a653624dceee3399bef25a0ea119Erik     */
5582b318634af1b6594e60cfd1f2df4d3845f80587Erik    public static final String WEEK_PARAMS_NUM_WEEKS = "num_weeks";
56e566836781f2a653624dceee3399bef25a0ea119Erik    /**
57e566836781f2a653624dceee3399bef25a0ea119Erik     * Which month should be in focus currently.
58e566836781f2a653624dceee3399bef25a0ea119Erik     */
5982b318634af1b6594e60cfd1f2df4d3845f80587Erik    public static final String WEEK_PARAMS_FOCUS_MONTH = "focus_month";
60e566836781f2a653624dceee3399bef25a0ea119Erik    /**
61e566836781f2a653624dceee3399bef25a0ea119Erik     * Whether the week number should be shown. Non-zero to show them.
62e566836781f2a653624dceee3399bef25a0ea119Erik     */
6382b318634af1b6594e60cfd1f2df4d3845f80587Erik    public static final String WEEK_PARAMS_SHOW_WEEK = "week_numbers";
64e566836781f2a653624dceee3399bef25a0ea119Erik    /**
65e566836781f2a653624dceee3399bef25a0ea119Erik     * Which day the week should start on. {@link Time#SUNDAY} through
66e566836781f2a653624dceee3399bef25a0ea119Erik     * {@link Time#SATURDAY}.
67e566836781f2a653624dceee3399bef25a0ea119Erik     */
6882b318634af1b6594e60cfd1f2df4d3845f80587Erik    public static final String WEEK_PARAMS_WEEK_START = "week_start";
69e566836781f2a653624dceee3399bef25a0ea119Erik    /**
70e566836781f2a653624dceee3399bef25a0ea119Erik     * The Julian day to highlight as selected.
71e566836781f2a653624dceee3399bef25a0ea119Erik     */
72e566836781f2a653624dceee3399bef25a0ea119Erik    public static final String WEEK_PARAMS_JULIAN_DAY = "selected_day";
73e566836781f2a653624dceee3399bef25a0ea119Erik    /**
74e566836781f2a653624dceee3399bef25a0ea119Erik     * How many days of the week to display [1-7].
75e566836781f2a653624dceee3399bef25a0ea119Erik     */
7691b01ed605e36fc5a7a924c226597a62c789b50dErik    public static final String WEEK_PARAMS_DAYS_PER_WEEK = "days_per_week";
7782b318634af1b6594e60cfd1f2df4d3845f80587Erik
7882b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static final int WEEK_COUNT = CalendarController.MAX_CALENDAR_WEEK
7982b318634af1b6594e60cfd1f2df4d3845f80587Erik            - CalendarController.MIN_CALENDAR_WEEK;
8082b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int DEFAULT_NUM_WEEKS = 6;
8182b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int DEFAULT_MONTH_FOCUS = 0;
8282b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int DEFAULT_DAYS_PER_WEEK = 7;
8382b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int DEFAULT_WEEK_HEIGHT = 32;
8482b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int WEEK_7_OVERHANG_HEIGHT = 7;
85e566836781f2a653624dceee3399bef25a0ea119Erik
8682b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static float mScale = 0;
8782b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected Context mContext;
88e566836781f2a653624dceee3399bef25a0ea119Erik    // The day to highlight as selected
8982b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected Time mSelectedDay;
90e566836781f2a653624dceee3399bef25a0ea119Erik    // The week since 1970 that the selected day is in
9182b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected int mSelectedWeek;
92636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden    // When the week starts; numbered like Time.<WEEKDAY> (e.g. SUNDAY=0).
93636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden    protected int mFirstDayOfWeek;
9482b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected boolean mShowWeekNumber = false;
9582b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected GestureDetector mGestureDetector;
963553621c824afe1f3eacbe8555678005ca1264a1Erik    protected int mNumWeeks = DEFAULT_NUM_WEEKS;
9791b01ed605e36fc5a7a924c226597a62c789b50dErik    protected int mDaysPerWeek = DEFAULT_DAYS_PER_WEEK;
983553621c824afe1f3eacbe8555678005ca1264a1Erik    protected int mFocusMonth = DEFAULT_MONTH_FOCUS;
9982b318634af1b6594e60cfd1f2df4d3845f80587Erik
100e21674aefc9755ba519dfc5b3ff4348be4814903Erik    public SimpleWeeksAdapter(Context context, HashMap<String, Integer> params) {
10182b318634af1b6594e60cfd1f2df4d3845f80587Erik        mContext = context;
10282b318634af1b6594e60cfd1f2df4d3845f80587Erik
103636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden        // Get default week start based on locale, subtracting one for use with android Time.
104636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden        Calendar cal = Calendar.getInstance(Locale.getDefault());
105636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden        mFirstDayOfWeek = cal.getFirstDayOfWeek() - 1;
10682b318634af1b6594e60cfd1f2df4d3845f80587Erik
10782b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (mScale == 0) {
10882b318634af1b6594e60cfd1f2df4d3845f80587Erik            mScale = context.getResources().getDisplayMetrics().density;
10982b318634af1b6594e60cfd1f2df4d3845f80587Erik            if (mScale != 1) {
11082b318634af1b6594e60cfd1f2df4d3845f80587Erik                WEEK_7_OVERHANG_HEIGHT *= mScale;
11182b318634af1b6594e60cfd1f2df4d3845f80587Erik            }
11282b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
11382b318634af1b6594e60cfd1f2df4d3845f80587Erik        init();
11482b318634af1b6594e60cfd1f2df4d3845f80587Erik        updateParams(params);
11582b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
11682b318634af1b6594e60cfd1f2df4d3845f80587Erik
117e566836781f2a653624dceee3399bef25a0ea119Erik    /**
118e566836781f2a653624dceee3399bef25a0ea119Erik     * Set up the gesture detector and selected time
119e566836781f2a653624dceee3399bef25a0ea119Erik     */
12082b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected void init() {
12182b318634af1b6594e60cfd1f2df4d3845f80587Erik        mGestureDetector = new GestureDetector(mContext, new CalendarGestureListener());
12282b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedDay = new Time();
12382b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedDay.setToNow();
12482b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
12582b318634af1b6594e60cfd1f2df4d3845f80587Erik
126e566836781f2a653624dceee3399bef25a0ea119Erik    /**
127e566836781f2a653624dceee3399bef25a0ea119Erik     * Parse the parameters and set any necessary fields. See
128e566836781f2a653624dceee3399bef25a0ea119Erik     * {@link #WEEK_PARAMS_NUM_WEEKS} for parameter details.
129e566836781f2a653624dceee3399bef25a0ea119Erik     *
130e566836781f2a653624dceee3399bef25a0ea119Erik     * @param params A list of parameters for this adapter
131e566836781f2a653624dceee3399bef25a0ea119Erik     */
13282b318634af1b6594e60cfd1f2df4d3845f80587Erik    public void updateParams(HashMap<String, Integer> params) {
13382b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (params == null) {
13482b318634af1b6594e60cfd1f2df4d3845f80587Erik            Log.e(TAG, "WeekParameters are null! Cannot update adapter.");
13582b318634af1b6594e60cfd1f2df4d3845f80587Erik            return;
13682b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
13782b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (params.containsKey(WEEK_PARAMS_FOCUS_MONTH)) {
13882b318634af1b6594e60cfd1f2df4d3845f80587Erik            mFocusMonth = params.get(WEEK_PARAMS_FOCUS_MONTH);
13982b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
14082b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (params.containsKey(WEEK_PARAMS_FOCUS_MONTH)) {
14182b318634af1b6594e60cfd1f2df4d3845f80587Erik            mNumWeeks = params.get(WEEK_PARAMS_NUM_WEEKS);
14282b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
14382b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (params.containsKey(WEEK_PARAMS_SHOW_WEEK)) {
14482b318634af1b6594e60cfd1f2df4d3845f80587Erik            mShowWeekNumber = params.get(WEEK_PARAMS_SHOW_WEEK) != 0;
14582b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
14682b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (params.containsKey(WEEK_PARAMS_WEEK_START)) {
14782b318634af1b6594e60cfd1f2df4d3845f80587Erik            mFirstDayOfWeek = params.get(WEEK_PARAMS_WEEK_START);
14882b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
14940bcd101b212c9863c3110c05a487a7ae6ebc3caErik        if (params.containsKey(WEEK_PARAMS_JULIAN_DAY)) {
150e566836781f2a653624dceee3399bef25a0ea119Erik            int julianDay = params.get(WEEK_PARAMS_JULIAN_DAY);
151e566836781f2a653624dceee3399bef25a0ea119Erik            mSelectedDay.setJulianDay(julianDay);
152e566836781f2a653624dceee3399bef25a0ea119Erik            mSelectedWeek = Utils.getWeeksSinceEpochFromJulianDay(julianDay, mFirstDayOfWeek);
15340bcd101b212c9863c3110c05a487a7ae6ebc3caErik        }
15491b01ed605e36fc5a7a924c226597a62c789b50dErik        if (params.containsKey(WEEK_PARAMS_DAYS_PER_WEEK)) {
15591b01ed605e36fc5a7a924c226597a62c789b50dErik            mDaysPerWeek = params.get(WEEK_PARAMS_DAYS_PER_WEEK);
15691b01ed605e36fc5a7a924c226597a62c789b50dErik        }
15782b318634af1b6594e60cfd1f2df4d3845f80587Erik        refresh();
15882b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
15982b318634af1b6594e60cfd1f2df4d3845f80587Erik
160e566836781f2a653624dceee3399bef25a0ea119Erik    /**
161e566836781f2a653624dceee3399bef25a0ea119Erik     * Updates the selected day and related parameters.
162e566836781f2a653624dceee3399bef25a0ea119Erik     *
163e566836781f2a653624dceee3399bef25a0ea119Erik     * @param selectedTime The time to highlight
164e566836781f2a653624dceee3399bef25a0ea119Erik     */
16582b318634af1b6594e60cfd1f2df4d3845f80587Erik    public void setSelectedDay(Time selectedTime) {
16682b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedDay.set(selectedTime);
16782b318634af1b6594e60cfd1f2df4d3845f80587Erik        long millis = mSelectedDay.normalize(true);
16882b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedWeek = Utils.getWeeksSinceEpochFromJulianDay(
16982b318634af1b6594e60cfd1f2df4d3845f80587Erik                Time.getJulianDay(millis, mSelectedDay.gmtoff), mFirstDayOfWeek);
17082b318634af1b6594e60cfd1f2df4d3845f80587Erik        notifyDataSetChanged();
17182b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
17282b318634af1b6594e60cfd1f2df4d3845f80587Erik
173e566836781f2a653624dceee3399bef25a0ea119Erik    /**
174e566836781f2a653624dceee3399bef25a0ea119Erik     * Returns the currently highlighted day
175e566836781f2a653624dceee3399bef25a0ea119Erik     *
176e566836781f2a653624dceee3399bef25a0ea119Erik     * @return
177e566836781f2a653624dceee3399bef25a0ea119Erik     */
17882b318634af1b6594e60cfd1f2df4d3845f80587Erik    public Time getSelectedDay() {
17982b318634af1b6594e60cfd1f2df4d3845f80587Erik        return mSelectedDay;
18082b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
18182b318634af1b6594e60cfd1f2df4d3845f80587Erik
182e566836781f2a653624dceee3399bef25a0ea119Erik    /**
183e566836781f2a653624dceee3399bef25a0ea119Erik     * updates any config options that may have changed and refreshes the view
184e566836781f2a653624dceee3399bef25a0ea119Erik     */
18582b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected void refresh() {
18682b318634af1b6594e60cfd1f2df4d3845f80587Erik        notifyDataSetChanged();
18782b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
18882b318634af1b6594e60cfd1f2df4d3845f80587Erik
18982b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
19082b318634af1b6594e60cfd1f2df4d3845f80587Erik    public int getCount() {
19182b318634af1b6594e60cfd1f2df4d3845f80587Erik        return WEEK_COUNT;
19282b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
19382b318634af1b6594e60cfd1f2df4d3845f80587Erik
19482b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
19582b318634af1b6594e60cfd1f2df4d3845f80587Erik    public Object getItem(int position) {
19682b318634af1b6594e60cfd1f2df4d3845f80587Erik        return null;
19782b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
19882b318634af1b6594e60cfd1f2df4d3845f80587Erik
19982b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
20082b318634af1b6594e60cfd1f2df4d3845f80587Erik    public long getItemId(int position) {
20182b318634af1b6594e60cfd1f2df4d3845f80587Erik        return position;
20282b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
20382b318634af1b6594e60cfd1f2df4d3845f80587Erik
20482b318634af1b6594e60cfd1f2df4d3845f80587Erik    @SuppressWarnings("unchecked")
20582b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
20682b318634af1b6594e60cfd1f2df4d3845f80587Erik    public View getView(int position, View convertView, ViewGroup parent) {
207e21674aefc9755ba519dfc5b3ff4348be4814903Erik        SimpleWeekView v;
20882b318634af1b6594e60cfd1f2df4d3845f80587Erik        HashMap<String, Integer> drawingParams = null;
20982b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (convertView != null) {
210e21674aefc9755ba519dfc5b3ff4348be4814903Erik            v = (SimpleWeekView) convertView;
211e566836781f2a653624dceee3399bef25a0ea119Erik            // We store the drawing parameters in the view so it can be recycled
21282b318634af1b6594e60cfd1f2df4d3845f80587Erik            drawingParams = (HashMap<String, Integer>) v.getTag();
21382b318634af1b6594e60cfd1f2df4d3845f80587Erik        } else {
214e21674aefc9755ba519dfc5b3ff4348be4814903Erik            v = new SimpleWeekView(mContext);
215e566836781f2a653624dceee3399bef25a0ea119Erik            // Set up the new view
216e566836781f2a653624dceee3399bef25a0ea119Erik            LayoutParams params = new LayoutParams(
217e566836781f2a653624dceee3399bef25a0ea119Erik                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
218e566836781f2a653624dceee3399bef25a0ea119Erik            v.setLayoutParams(params);
219e566836781f2a653624dceee3399bef25a0ea119Erik            v.setClickable(true);
220e566836781f2a653624dceee3399bef25a0ea119Erik            v.setOnTouchListener(this);
22182b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
22282b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (drawingParams == null) {
22382b318634af1b6594e60cfd1f2df4d3845f80587Erik            drawingParams = new HashMap<String, Integer>();
22482b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
22582b318634af1b6594e60cfd1f2df4d3845f80587Erik        drawingParams.clear();
22682b318634af1b6594e60cfd1f2df4d3845f80587Erik
22782b318634af1b6594e60cfd1f2df4d3845f80587Erik        int selectedDay = -1;
22882b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (mSelectedWeek == position) {
22982b318634af1b6594e60cfd1f2df4d3845f80587Erik            selectedDay = mSelectedDay.weekDay;
23082b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
23182b318634af1b6594e60cfd1f2df4d3845f80587Erik
232e566836781f2a653624dceee3399bef25a0ea119Erik        // pass in all the view parameters
233e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_HEIGHT,
23482b318634af1b6594e60cfd1f2df4d3845f80587Erik                (parent.getHeight() - WEEK_7_OVERHANG_HEIGHT) / mNumWeeks);
235e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_SELECTED_DAY, selectedDay);
236e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_SHOW_WK_NUM, mShowWeekNumber ? 1 : 0);
237e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_WEEK_START, mFirstDayOfWeek);
238e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_NUM_DAYS, mDaysPerWeek);
239e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_WEEK, position);
240e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_FOCUS_MONTH, mFocusMonth);
24182b318634af1b6594e60cfd1f2df4d3845f80587Erik        v.setWeekParams(drawingParams, mSelectedDay.timezone);
242c485b45ef36fe103428b50cef399ba199c57b385Erik        v.invalidate();
24382b318634af1b6594e60cfd1f2df4d3845f80587Erik
24482b318634af1b6594e60cfd1f2df4d3845f80587Erik        return v;
24582b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
24682b318634af1b6594e60cfd1f2df4d3845f80587Erik
247e566836781f2a653624dceee3399bef25a0ea119Erik    /**
248e566836781f2a653624dceee3399bef25a0ea119Erik     * Changes which month is in focus and updates the view.
249e566836781f2a653624dceee3399bef25a0ea119Erik     *
250e566836781f2a653624dceee3399bef25a0ea119Erik     * @param month The month to show as in focus [0-11]
251e566836781f2a653624dceee3399bef25a0ea119Erik     */
25282b318634af1b6594e60cfd1f2df4d3845f80587Erik    public void updateFocusMonth(int month) {
25382b318634af1b6594e60cfd1f2df4d3845f80587Erik        mFocusMonth = month;
25482b318634af1b6594e60cfd1f2df4d3845f80587Erik        notifyDataSetChanged();
25582b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
25682b318634af1b6594e60cfd1f2df4d3845f80587Erik
25782b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
25882b318634af1b6594e60cfd1f2df4d3845f80587Erik    public boolean onTouch(View v, MotionEvent event) {
25982b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (mGestureDetector.onTouchEvent(event)) {
260e21674aefc9755ba519dfc5b3ff4348be4814903Erik            SimpleWeekView view = (SimpleWeekView) v;
261e21674aefc9755ba519dfc5b3ff4348be4814903Erik            Time day = ((SimpleWeekView)v).getDayFromLocation(event.getX());
26282b318634af1b6594e60cfd1f2df4d3845f80587Erik            if (Log.isLoggable(TAG, Log.DEBUG)) {
26340bcd101b212c9863c3110c05a487a7ae6ebc3caErik                Log.d(TAG, "Touched day at Row=" + view.mWeek + " day=" + day.toString());
26482b318634af1b6594e60cfd1f2df4d3845f80587Erik            }
26582b318634af1b6594e60cfd1f2df4d3845f80587Erik            if (day != null) {
26682b318634af1b6594e60cfd1f2df4d3845f80587Erik                onDayTapped(day);
26782b318634af1b6594e60cfd1f2df4d3845f80587Erik            }
26882b318634af1b6594e60cfd1f2df4d3845f80587Erik            return true;
26982b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
27082b318634af1b6594e60cfd1f2df4d3845f80587Erik        return false;
27182b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
27282b318634af1b6594e60cfd1f2df4d3845f80587Erik
27382b318634af1b6594e60cfd1f2df4d3845f80587Erik    /**
274e566836781f2a653624dceee3399bef25a0ea119Erik     * Maintains the same hour/min/sec but moves the day to the tapped day.
275e566836781f2a653624dceee3399bef25a0ea119Erik     *
27682b318634af1b6594e60cfd1f2df4d3845f80587Erik     * @param day The day that was tapped
27782b318634af1b6594e60cfd1f2df4d3845f80587Erik     */
27882b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected void onDayTapped(Time day) {
27982b318634af1b6594e60cfd1f2df4d3845f80587Erik        day.hour = mSelectedDay.hour;
28082b318634af1b6594e60cfd1f2df4d3845f80587Erik        day.minute = mSelectedDay.minute;
28182b318634af1b6594e60cfd1f2df4d3845f80587Erik        day.second = mSelectedDay.second;
28282b318634af1b6594e60cfd1f2df4d3845f80587Erik        setSelectedDay(day);
28382b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
28482b318634af1b6594e60cfd1f2df4d3845f80587Erik
28582b318634af1b6594e60cfd1f2df4d3845f80587Erik
286e566836781f2a653624dceee3399bef25a0ea119Erik    /**
287e566836781f2a653624dceee3399bef25a0ea119Erik     * This is here so we can identify single tap events and set the selected
288e566836781f2a653624dceee3399bef25a0ea119Erik     * day correctly
289e566836781f2a653624dceee3399bef25a0ea119Erik     */
29082b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected class CalendarGestureListener extends GestureDetector.SimpleOnGestureListener {
29182b318634af1b6594e60cfd1f2df4d3845f80587Erik        @Override
29282b318634af1b6594e60cfd1f2df4d3845f80587Erik        public boolean onSingleTapUp(MotionEvent e) {
29382b318634af1b6594e60cfd1f2df4d3845f80587Erik            return true;
29482b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
29582b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
29659a44aa4bb3fac90f7ceab65da191e7fd81905f2Isaac Katzenelson
29759a44aa4bb3fac90f7ceab65da191e7fd81905f2Isaac Katzenelson    ListView mListView;
29859a44aa4bb3fac90f7ceab65da191e7fd81905f2Isaac Katzenelson
29959a44aa4bb3fac90f7ceab65da191e7fd81905f2Isaac Katzenelson    public void setListView(ListView lv) {
30059a44aa4bb3fac90f7ceab65da191e7fd81905f2Isaac Katzenelson        mListView = lv;
30159a44aa4bb3fac90f7ceab65da191e7fd81905f2Isaac Katzenelson    }
30282b318634af1b6594e60cfd1f2df4d3845f80587Erik}
303