SimpleWeeksAdapter.java revision 82b318634af1b6594e60cfd1f2df4d3845f80587
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;
3482b318634af1b6594e60cfd1f2df4d3845f80587Erik
3582b318634af1b6594e60cfd1f2df4d3845f80587Erikimport java.util.Calendar;
3682b318634af1b6594e60cfd1f2df4d3845f80587Erikimport java.util.HashMap;
3782b318634af1b6594e60cfd1f2df4d3845f80587Erik
3882b318634af1b6594e60cfd1f2df4d3845f80587Erikpublic class MonthByWeekSimpleAdapter extends BaseAdapter implements OnTouchListener {
3982b318634af1b6594e60cfd1f2df4d3845f80587Erik
4082b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static final String TAG = "MonthByWeek";
4182b318634af1b6594e60cfd1f2df4d3845f80587Erik
4282b318634af1b6594e60cfd1f2df4d3845f80587Erik    public static final String WEEK_PARAMS_NUM_WEEKS = "num_weeks";
4382b318634af1b6594e60cfd1f2df4d3845f80587Erik    public static final String WEEK_PARAMS_FOCUS_MONTH = "focus_month";
4482b318634af1b6594e60cfd1f2df4d3845f80587Erik    public static final String WEEK_PARAMS_SHOW_WEEK = "week_numbers";
4582b318634af1b6594e60cfd1f2df4d3845f80587Erik    public static final String WEEK_PARAMS_WEEK_START = "week_start";
4682b318634af1b6594e60cfd1f2df4d3845f80587Erik
4782b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static final int WEEK_COUNT = CalendarController.MAX_CALENDAR_WEEK
4882b318634af1b6594e60cfd1f2df4d3845f80587Erik            - CalendarController.MIN_CALENDAR_WEEK;
4982b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int DEFAULT_NUM_WEEKS = 6;
5082b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int DEFAULT_MONTH_FOCUS = 0;
5182b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int DEFAULT_DAYS_PER_WEEK = 7;
5282b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int DEFAULT_WEEK_HEIGHT = 32;
5382b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int WEEK_7_OVERHANG_HEIGHT = 7;
5482b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static float mScale = 0;
5582b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected Context mContext;
5682b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected Time mSelectedDay;
5782b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected int mSelectedWeek;
5882b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected int mFirstDayOfWeek = Calendar.getInstance().getFirstDayOfWeek();
5982b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected boolean mShowWeekNumber = false;
6082b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected GestureDetector mGestureDetector;
6182b318634af1b6594e60cfd1f2df4d3845f80587Erik    private int mNumWeeks = DEFAULT_NUM_WEEKS;
6282b318634af1b6594e60cfd1f2df4d3845f80587Erik    private int mFocusMonth = DEFAULT_MONTH_FOCUS;
6382b318634af1b6594e60cfd1f2df4d3845f80587Erik
6482b318634af1b6594e60cfd1f2df4d3845f80587Erik    public MonthByWeekSimpleAdapter(Context context, HashMap<String, Integer> params) {
6582b318634af1b6594e60cfd1f2df4d3845f80587Erik        mContext = context;
6682b318634af1b6594e60cfd1f2df4d3845f80587Erik
6782b318634af1b6594e60cfd1f2df4d3845f80587Erik
6882b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (mScale == 0) {
6982b318634af1b6594e60cfd1f2df4d3845f80587Erik            mScale = context.getResources().getDisplayMetrics().density;
7082b318634af1b6594e60cfd1f2df4d3845f80587Erik            if (mScale != 1) {
7182b318634af1b6594e60cfd1f2df4d3845f80587Erik                WEEK_7_OVERHANG_HEIGHT *= mScale;
7282b318634af1b6594e60cfd1f2df4d3845f80587Erik            }
7382b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
7482b318634af1b6594e60cfd1f2df4d3845f80587Erik        init();
7582b318634af1b6594e60cfd1f2df4d3845f80587Erik        updateParams(params);
7682b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
7782b318634af1b6594e60cfd1f2df4d3845f80587Erik
7882b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected void init() {
7982b318634af1b6594e60cfd1f2df4d3845f80587Erik        mGestureDetector = new GestureDetector(mContext, new CalendarGestureListener());
8082b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedDay = new Time();
8182b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedDay.setToNow();
8282b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
8382b318634af1b6594e60cfd1f2df4d3845f80587Erik
8482b318634af1b6594e60cfd1f2df4d3845f80587Erik    public void updateParams(HashMap<String, Integer> params) {
8582b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (params == null) {
8682b318634af1b6594e60cfd1f2df4d3845f80587Erik            Log.e(TAG, "WeekParameters are null! Cannot update adapter.");
8782b318634af1b6594e60cfd1f2df4d3845f80587Erik            return;
8882b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
8982b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (params.containsKey(WEEK_PARAMS_FOCUS_MONTH)) {
9082b318634af1b6594e60cfd1f2df4d3845f80587Erik            mFocusMonth = params.get(WEEK_PARAMS_FOCUS_MONTH);
9182b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
9282b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (params.containsKey(WEEK_PARAMS_FOCUS_MONTH)) {
9382b318634af1b6594e60cfd1f2df4d3845f80587Erik            mNumWeeks = params.get(WEEK_PARAMS_NUM_WEEKS);
9482b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
9582b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (params.containsKey(WEEK_PARAMS_SHOW_WEEK)) {
9682b318634af1b6594e60cfd1f2df4d3845f80587Erik            mShowWeekNumber = params.get(WEEK_PARAMS_SHOW_WEEK) != 0;
9782b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
9882b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (params.containsKey(WEEK_PARAMS_WEEK_START)) {
9982b318634af1b6594e60cfd1f2df4d3845f80587Erik            mFirstDayOfWeek = params.get(WEEK_PARAMS_WEEK_START);
10082b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
10182b318634af1b6594e60cfd1f2df4d3845f80587Erik        refresh();
10282b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
10382b318634af1b6594e60cfd1f2df4d3845f80587Erik
10482b318634af1b6594e60cfd1f2df4d3845f80587Erik    public void setSelectedDay(Time selectedTime) {
10582b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedDay.set(selectedTime);
10682b318634af1b6594e60cfd1f2df4d3845f80587Erik        long millis = mSelectedDay.normalize(true);
10782b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedWeek = Utils.getWeeksSinceEpochFromJulianDay(
10882b318634af1b6594e60cfd1f2df4d3845f80587Erik                Time.getJulianDay(millis, mSelectedDay.gmtoff), mFirstDayOfWeek);
10982b318634af1b6594e60cfd1f2df4d3845f80587Erik        notifyDataSetChanged();
11082b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
11182b318634af1b6594e60cfd1f2df4d3845f80587Erik
11282b318634af1b6594e60cfd1f2df4d3845f80587Erik    public Time getSelectedDay() {
11382b318634af1b6594e60cfd1f2df4d3845f80587Erik        return mSelectedDay;
11482b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
11582b318634af1b6594e60cfd1f2df4d3845f80587Erik
11682b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected void refresh() {
11782b318634af1b6594e60cfd1f2df4d3845f80587Erik        // TODO Add system support for first day of week and week numbers
11882b318634af1b6594e60cfd1f2df4d3845f80587Erik        // mFirstDayOfWeek = Utils.getFirstDayOfWeek(mContext);
11982b318634af1b6594e60cfd1f2df4d3845f80587Erik        // mShowWeekNumber = Utils.getShowWeekNumber(mContext);
12082b318634af1b6594e60cfd1f2df4d3845f80587Erik        notifyDataSetChanged();
12182b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
12282b318634af1b6594e60cfd1f2df4d3845f80587Erik
12382b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
12482b318634af1b6594e60cfd1f2df4d3845f80587Erik    public int getCount() {
12582b318634af1b6594e60cfd1f2df4d3845f80587Erik        return WEEK_COUNT;
12682b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
12782b318634af1b6594e60cfd1f2df4d3845f80587Erik
12882b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
12982b318634af1b6594e60cfd1f2df4d3845f80587Erik    public Object getItem(int position) {
13082b318634af1b6594e60cfd1f2df4d3845f80587Erik        return null;
13182b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
13282b318634af1b6594e60cfd1f2df4d3845f80587Erik
13382b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
13482b318634af1b6594e60cfd1f2df4d3845f80587Erik    public long getItemId(int position) {
13582b318634af1b6594e60cfd1f2df4d3845f80587Erik        return position;
13682b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
13782b318634af1b6594e60cfd1f2df4d3845f80587Erik
13882b318634af1b6594e60cfd1f2df4d3845f80587Erik    @SuppressWarnings("unchecked")
13982b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
14082b318634af1b6594e60cfd1f2df4d3845f80587Erik    public View getView(int position, View convertView, ViewGroup parent) {
14182b318634af1b6594e60cfd1f2df4d3845f80587Erik        MonthWeekSimpleView v;
14282b318634af1b6594e60cfd1f2df4d3845f80587Erik        LayoutParams params = new LayoutParams(
14382b318634af1b6594e60cfd1f2df4d3845f80587Erik                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
14482b318634af1b6594e60cfd1f2df4d3845f80587Erik        HashMap<String, Integer> drawingParams = null;
14582b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (convertView != null) {
14682b318634af1b6594e60cfd1f2df4d3845f80587Erik            v = (MonthWeekSimpleView) convertView;
14782b318634af1b6594e60cfd1f2df4d3845f80587Erik            // TODO Store drawing params in the view's Tag instead of having a
14882b318634af1b6594e60cfd1f2df4d3845f80587Erik            // new getter method
14982b318634af1b6594e60cfd1f2df4d3845f80587Erik            drawingParams = (HashMap<String, Integer>) v.getTag();
15082b318634af1b6594e60cfd1f2df4d3845f80587Erik        } else {
15182b318634af1b6594e60cfd1f2df4d3845f80587Erik            v = new MonthWeekSimpleView(mContext);
15282b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
15382b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (drawingParams == null) {
15482b318634af1b6594e60cfd1f2df4d3845f80587Erik            drawingParams = new HashMap<String, Integer>();
15582b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
15682b318634af1b6594e60cfd1f2df4d3845f80587Erik        drawingParams.clear();
15782b318634af1b6594e60cfd1f2df4d3845f80587Erik
15882b318634af1b6594e60cfd1f2df4d3845f80587Erik        v.setLayoutParams(params);
15982b318634af1b6594e60cfd1f2df4d3845f80587Erik        v.setClickable(true);
16082b318634af1b6594e60cfd1f2df4d3845f80587Erik        v.setOnTouchListener(this);
16182b318634af1b6594e60cfd1f2df4d3845f80587Erik
16282b318634af1b6594e60cfd1f2df4d3845f80587Erik        int selectedDay = -1;
16382b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (mSelectedWeek == position) {
16482b318634af1b6594e60cfd1f2df4d3845f80587Erik            selectedDay = mSelectedDay.weekDay;
16582b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
16682b318634af1b6594e60cfd1f2df4d3845f80587Erik
16782b318634af1b6594e60cfd1f2df4d3845f80587Erik        drawingParams.put(MonthWeekSimpleView.VIEW_PARAMS_HEIGHT,
16882b318634af1b6594e60cfd1f2df4d3845f80587Erik                (parent.getHeight() - WEEK_7_OVERHANG_HEIGHT) / mNumWeeks);
16982b318634af1b6594e60cfd1f2df4d3845f80587Erik        drawingParams.put(MonthWeekSimpleView.VIEW_PARAMS_SELECTED_DAY, selectedDay);
17082b318634af1b6594e60cfd1f2df4d3845f80587Erik        drawingParams.put(MonthWeekSimpleView.VIEW_PARAMS_SHOW_WK_NUM, mShowWeekNumber ? 1 : 0);
17182b318634af1b6594e60cfd1f2df4d3845f80587Erik        drawingParams.put(MonthWeekSimpleView.VIEW_PARAMS_WEEK_START, mFirstDayOfWeek);
17282b318634af1b6594e60cfd1f2df4d3845f80587Erik        drawingParams.put(MonthWeekSimpleView.VIEW_PARAMS_NUM_DAYS, DEFAULT_DAYS_PER_WEEK);
17382b318634af1b6594e60cfd1f2df4d3845f80587Erik        drawingParams.put(MonthWeekSimpleView.VIEW_PARAMS_NUM_WEEKS, mNumWeeks);
17482b318634af1b6594e60cfd1f2df4d3845f80587Erik        drawingParams.put(MonthWeekSimpleView.VIEW_PARAMS_WEEK, position);
17582b318634af1b6594e60cfd1f2df4d3845f80587Erik        drawingParams.put(MonthWeekSimpleView.VIEW_PARAMS_FOCUS_MONTH, mFocusMonth);
17682b318634af1b6594e60cfd1f2df4d3845f80587Erik        v.setWeekParams(drawingParams, mSelectedDay.timezone);
17782b318634af1b6594e60cfd1f2df4d3845f80587Erik
17882b318634af1b6594e60cfd1f2df4d3845f80587Erik        return v;
17982b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
18082b318634af1b6594e60cfd1f2df4d3845f80587Erik
18182b318634af1b6594e60cfd1f2df4d3845f80587Erik    public void updateFocusMonth(int month) {
18282b318634af1b6594e60cfd1f2df4d3845f80587Erik        mFocusMonth = month;
18382b318634af1b6594e60cfd1f2df4d3845f80587Erik        notifyDataSetChanged();
18482b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
18582b318634af1b6594e60cfd1f2df4d3845f80587Erik
18682b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
18782b318634af1b6594e60cfd1f2df4d3845f80587Erik    public boolean onTouch(View v, MotionEvent event) {
18882b318634af1b6594e60cfd1f2df4d3845f80587Erik        if (mGestureDetector.onTouchEvent(event)) {
18982b318634af1b6594e60cfd1f2df4d3845f80587Erik            MonthWeekSimpleView view = (MonthWeekSimpleView) v;
19082b318634af1b6594e60cfd1f2df4d3845f80587Erik            Log.d(TAG, "Row=" + view.mWeek + " day=" + view.getDayFromLocation(event.getX()));
19182b318634af1b6594e60cfd1f2df4d3845f80587Erik            Time day = ((MonthWeekSimpleView)v).getDayFromLocation(event.getX());
19282b318634af1b6594e60cfd1f2df4d3845f80587Erik            if (Log.isLoggable(TAG, Log.DEBUG)) {
19382b318634af1b6594e60cfd1f2df4d3845f80587Erik                Log.d(TAG, "Day returned " + day);
19482b318634af1b6594e60cfd1f2df4d3845f80587Erik            }
19582b318634af1b6594e60cfd1f2df4d3845f80587Erik            if (day != null) {
19682b318634af1b6594e60cfd1f2df4d3845f80587Erik                onDayTapped(day);
19782b318634af1b6594e60cfd1f2df4d3845f80587Erik            }
19882b318634af1b6594e60cfd1f2df4d3845f80587Erik            return true;
19982b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
20082b318634af1b6594e60cfd1f2df4d3845f80587Erik        return false;
20182b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
20282b318634af1b6594e60cfd1f2df4d3845f80587Erik
20382b318634af1b6594e60cfd1f2df4d3845f80587Erik    /**
20482b318634af1b6594e60cfd1f2df4d3845f80587Erik     * @param day The day that was tapped
20582b318634af1b6594e60cfd1f2df4d3845f80587Erik     */
20682b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected void onDayTapped(Time day) {
20782b318634af1b6594e60cfd1f2df4d3845f80587Erik        day.hour = mSelectedDay.hour;
20882b318634af1b6594e60cfd1f2df4d3845f80587Erik        day.minute = mSelectedDay.minute;
20982b318634af1b6594e60cfd1f2df4d3845f80587Erik        day.second = mSelectedDay.second;
21082b318634af1b6594e60cfd1f2df4d3845f80587Erik        setSelectedDay(day);
21182b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
21282b318634af1b6594e60cfd1f2df4d3845f80587Erik
21382b318634af1b6594e60cfd1f2df4d3845f80587Erik
21482b318634af1b6594e60cfd1f2df4d3845f80587Erik    // This is here so we can identify single tap events and set the selected
21582b318634af1b6594e60cfd1f2df4d3845f80587Erik    // day correctly
21682b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected class CalendarGestureListener extends GestureDetector.SimpleOnGestureListener {
21782b318634af1b6594e60cfd1f2df4d3845f80587Erik        @Override
21882b318634af1b6594e60cfd1f2df4d3845f80587Erik        public boolean onSingleTapUp(MotionEvent e) {
21982b318634af1b6594e60cfd1f2df4d3845f80587Erik            return true;
22082b318634af1b6594e60cfd1f2df4d3845f80587Erik        }
22182b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
22282b318634af1b6594e60cfd1f2df4d3845f80587Erik}
223