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