Clover Coverage Report - AnCal Coverage Report
Coverage timestamp: gio dic 18 2014 12:18:42 EST
../../../../../img/srcFileCovDistChart9.png 40% of files have more coverage
156   347   52   6,24
48   271   0,33   8,33
25     2,08  
3    
This report was generated with an evaluation server license. Purchase Clover or configure your license.
 
  ViewWeekDayItem       Line # 13 156 52 90,8% 0.90829694
  ViewWeekDayItem.TimeItem       Line # 17 0 0 - -1.0
  ViewWeekDayItem.OnItemClick       Line # 24 0 0 - -1.0
 
No Tests
 
1    package pl.magot.vetch.ancal.views;
2   
3    import java.util.*;
4   
5    import pl.magot.vetch.ancal.AnCalDateUtils;
6    import pl.magot.vetch.ancal.Utils;
7    import android.content.*;
8    import android.graphics.*;
9    import android.widget.LinearLayout;
10    import android.widget.LinearLayout.LayoutParams;
11    import android.view.*;
12   
 
13    public class ViewWeekDayItem extends View {
14    private final static int iStartHour = 3;
15    private final static int iTotalHours = 24;
16   
 
17    private class TimeItem {
18    public int iHour = -1;
19    public int iMinute = -1;
20    @SuppressWarnings("unused")
21    public int iDurationInMinutes = 0;
22    }
23   
 
24    public interface OnItemClick {
25    public void OnClick(ViewWeekDayItem item);
26    }
27   
28    private ArrayList<TimeItem> vecTimeItems = new ArrayList<TimeItem>();
29    private RectF rectDayView = new RectF();
30    private RectF rectDayViewFrame = new RectF();
31    private int iHeaderHeight = 0;
32    private boolean b24HourMode = false;
33    private boolean bTouchedDown = false;
34    private int iTimeMarginWidth = 0;
35    private int iCurrentHour = -1;
36   
37    private static final int iTimeFontSize = 12;
38    private static final int iWeekNameFontSize = 12;
39    private static final int iWeekDayFontSize = 18;
40    private static final int iMargin = 1;
41    private static final Typeface tfMono = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL);
42   
43    private boolean bToday = false;
44    private boolean bHoliday = false;
45   
46    protected Paint mpt = null;
47    protected OnItemClick itemClick = null;
48    private Calendar calDate = Calendar.getInstance();
49    private String sStrDayNr = "";
50    private String sStrDayName = "";
51    private LayoutParams lparamsItem = new LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
52    android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
53   
 
54  7 toggle public ViewWeekDayItem(Context context, int iHeaderHeight) {
55  7 super(context);
56  7 this.iHeaderHeight = iHeaderHeight;
57  7 mpt = new Paint();
58  7 setFocusable(true);
59  7 setLayoutParams(lparamsItem);
60    }
61   
 
62  7 toggle public void SetSize(int iWidth, int iHeight) {
63  7 lparamsItem.width = iWidth;
64  7 lparamsItem.height = iHeight;
65    }
66   
 
67  7 toggle public void SetItemClick(OnItemClick itemClick) {
68  7 this.itemClick = itemClick;
69    }
70   
 
71  252 toggle public void SetCurrentHour(int iCurrentHour) {
72  252 this.iCurrentHour = iCurrentHour;
73    }
74   
 
75  1 toggle public static int GetSpaceWidthTime(Paint mpt, boolean b24HourMode) {
76  1 mpt.setTypeface(tfMono);
77  1 mpt.setTextSize(iTimeFontSize);
78  1 mpt.setFakeBoldText(true);
79  1 return 2 + (int) mpt.measureText((b24HourMode ? "00" : "00XX")) + 2;
80    }
81   
 
82  1 toggle public static int GetSpaceHeightHeader(Paint mpt) {
83  1 mpt.setTypeface(null);
84  1 mpt.setFakeBoldText(true);
85   
86  1 mpt.setTextSize(iWeekDayFontSize);
87  1 int iTextHeight = (int) (-mpt.ascent() + mpt.descent()) + iMargin + iMargin + iMargin;
88   
89  1 mpt.setTextSize(iWeekNameFontSize);
90  1 iTextHeight += (int) (-mpt.ascent() + mpt.descent()) + iMargin;
91   
92  1 return iTextHeight + iMargin + iMargin + iMargin;
93    }
94   
 
95  385 toggle private String GetListShortTime(int iHour) {
96  385 if (b24HourMode) {
97  0 return Integer.toString(iHour);
98    } else {
99  385 String sm = "am";
100  385 if (iHour >= 12)
101  220 sm = "pm";
102  385 int iDisplayHour = iHour;
103  385 if (iDisplayHour == 0)
104  0 iDisplayHour = 12;
105  385 if (iDisplayHour > 12)
106  165 iDisplayHour -= 12;
107  385 return Integer.toString(iDisplayHour) + sm;
108    }
109    }
110   
 
111  252 toggle public void ClearTimeItems() {
112  252 vecTimeItems.clear();
113    }
114   
 
115  44 toggle public void AddTimeItem(int iHour, int iMinute, int iDurationInMinutes) {
116  44 TimeItem item = new TimeItem();
117  44 item.iHour = iHour;
118  44 item.iMinute = iMinute;
119  44 item.iDurationInMinutes = iDurationInMinutes;
120  44 vecTimeItems.add(item);
121    }
122   
 
123  1 toggle public void SetTimeMargin(int iTimeMarginWidth, boolean b24HourMode) {
124  1 this.iTimeMarginWidth = iTimeMarginWidth;
125  1 this.b24HourMode = b24HourMode;
126    }
127   
 
128  252 toggle public void SetDate(Calendar dateDay, Calendar dateToday) {
129  252 this.calDate.setTimeInMillis(dateDay.getTimeInMillis());
130  252 this.sStrDayNr = Integer.toString(calDate.get(Calendar.DAY_OF_MONTH));
131  252 this.sStrDayName = AnCalDateUtils.getAbbrevDayOfWeekString(calDate);
132  252 this.bToday = IsToday(dateToday);
133  252 this.bHoliday = IsHoliday();
134    }
135   
 
136  2 toggle public Calendar GetDate() {
137  2 return calDate;
138    }
139   
 
140  0 toggle public int GetTextHeight() {
141  0 return (int) (-mpt.ascent() + mpt.descent());
142    }
143   
 
144  0 toggle @Override
145    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
146  0 super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
147  0 invalidate();
148    }
149   
 
150  252 toggle private boolean IsToday(Calendar calDateToday) {
151  252 if (calDate.get(Calendar.YEAR) == calDateToday.get(Calendar.YEAR))
152  181 if (calDate.get(Calendar.MONTH) == calDateToday.get(Calendar.MONTH))
153  181 if (calDate.get(Calendar.DAY_OF_YEAR) == calDateToday.get(Calendar.DAY_OF_YEAR))
154  18 return true;
155  234 return false;
156    }
157   
 
158  252 toggle private boolean IsHoliday() {
159  252 if (calDate.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY)
160  36 return true;
161  216 if (calDate.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
162  36 return true;
163  180 if ((calDate.get(Calendar.MONTH) == Calendar.JANUARY) && ((calDate.get(Calendar.DAY_OF_MONTH) == 1)))
164  4 return true;
165  176 return false;
166    }
167   
 
168  386 toggle private void initRectangles() {
169    // init day view rectangle frame
170  386 rectDayViewFrame.set(iMargin, iMargin, this.getWidth() - iMargin, this.getBottom() - iMargin);
171  386 rectDayView.set(rectDayViewFrame);
172  386 rectDayView.top = iMargin + iHeaderHeight + iMargin + iMargin + iMargin;
173    // add left time margin
174  386 rectDayViewFrame.left += iTimeMarginWidth;
175  386 rectDayView.left += iTimeMarginWidth;
176    }
177   
 
178  386 toggle private void drawDayHeader(Canvas canvas) {
179    // text
180  386 mpt.setTypeface(null);
181  386 mpt.setAntiAlias(true);
182  386 mpt.setFakeBoldText(true);
183   
184    // draw day number
185  386 mpt.setUnderlineText(false);
186  386 if (bToday)
187  33 mpt.setUnderlineText(true);
188   
189  386 mpt.setColor(dayStyle.getColorTextHeaderLight(bHoliday, bToday));
190  386 mpt.setTextSize(iWeekDayFontSize);
191  386 final int iDayTextHeight = -(int) mpt.ascent() + (int) mpt.descent();
192  386 final int iDayNrPosX = (int) rectDayViewFrame.left + ((int) rectDayViewFrame.width() >> 1)
193    - ((int) mpt.measureText(sStrDayNr) >> 1);
194  386 canvas.drawText(sStrDayNr, iDayNrPosX, rectDayViewFrame.top + iDayTextHeight, mpt);
195   
196    // draw day name
197  386 mpt.setUnderlineText(false);
198  386 mpt.setColor(dayStyle.getColorTextHeader(bHoliday, bToday));
199  386 mpt.setTextSize(iWeekNameFontSize);
200  386 final int iNameTextHeight = -(int) mpt.ascent() + (int) mpt.descent();
201  386 final int iDayNamePosX = (int) rectDayViewFrame.left + ((int) rectDayViewFrame.width() >> 1)
202    - ((int) mpt.measureText(sStrDayName) >> 1);
203  386 canvas.drawText(sStrDayName, iDayNamePosX, iMargin + iDayTextHeight + iMargin + iMargin + iMargin
204    + iNameTextHeight, mpt);
205    }
206   
 
207  386 toggle private void drawDayViewBackground(Canvas canvas, boolean bFocused) {
208    // frame
209  386 mpt.setColor(dayStyle.getColorFrame(bHoliday, false));
210  386 canvas.drawRoundRect(rectDayViewFrame, 2, 2, mpt);
211   
212    // background
213  386 if (bFocused) {
214   
215  5 LinearGradient lGradBkg = new LinearGradient(rectDayView.left, 0, rectDayView.right, 0,
216    dayStyle.iColorBkgFocusDark, dayStyle.iColorBkgFocusLight, Shader.TileMode.CLAMP);
217  5 mpt.setShader(lGradBkg);
218  5 canvas.drawRoundRect(rectDayView, 2, 2, mpt);
219  5 mpt.setShader(null);
220   
221    } else {
222   
223  381 mpt.setColor(dayStyle.getColorBkg(bHoliday, bToday));
224  381 canvas.drawRoundRect(rectDayView, 2, 2, mpt);
225    }
226    }
227   
 
228  386 toggle private void drawHourItems(Canvas canvas, boolean bFocused) {
229  386 mpt.setTextSize(iTimeFontSize);
230  386 mpt.setAntiAlias(true);
231  386 mpt.setTypeface(tfMono);
232  386 mpt.setShader(null);
233  386 mpt.setFakeBoldText(true);
234   
235  386 final float fHourItemHeight = (rectDayView.height() / (iTotalHours - iStartHour));
236   
237    // draw hours
238  8492 for (int iHour = iStartHour; iHour < iTotalHours; iHour++) {
239  8106 final float fItemPosY = rectDayView.top + (fHourItemHeight * (iHour - iStartHour));
240   
241    // draw hour
242  8106 if ((iTimeMarginWidth > 0) && ((iHour % 3) == 0)) {
243  385 final String sTime = GetListShortTime(iHour);
244  385 float fTextPosX = iTimeMarginWidth - mpt.measureText(sTime) - 3;
245  385 float fTextPosY = fItemPosY - mpt.ascent();
246  385 mpt.setColor(dayStyle.iColorTextHour);
247   
248  385 mpt.setUnderlineText(false);
249  385 if (iCurrentHour == iHour)
250  20 mpt.setUnderlineText(true);
251   
252  385 canvas.drawText(sTime, fTextPosX, fTextPosY, mpt);
253    }
254    }
255   
256    // draw time items
257  386 mpt.setAntiAlias(false);
258  386 mpt.setShader(null);
259  386 mpt.setUnderlineText(false);
260   
261  386 final int iViewTop = (int) rectDayView.top + 1;
262  386 final int iViewBottom = (int) rectDayView.bottom - 1;
263   
264    // iterate time items
265  386 final int iTimeItemHeight = (int) (fHourItemHeight) >> 1;
266  459 for (int index = 0; index < vecTimeItems.size(); index++) {
267  73 TimeItem item = vecTimeItems.get(index);
268   
269    // draw time item
270  73 final float fItemPosY = iViewTop + (fHourItemHeight * (item.iHour - iStartHour));
271  73 final float fMinuteOffset = (fHourItemHeight / 60) * item.iMinute;
272  73 int iTimeItemTop = (int) (fItemPosY + fMinuteOffset);
273   
274    // correct item position if out of time range
275  73 if (iTimeItemTop + iTimeItemHeight > iViewBottom)
276  0 iTimeItemTop = iViewBottom - iTimeItemHeight;
277   
278  73 if (iTimeItemTop + iTimeItemHeight < iViewTop)
279  33 continue;
280   
281    // outer frame
282  40 mpt.setColor(dayStyle.getColorTimeItem(bFocused));
283  40 canvas.drawRect(rectDayView.left + 1, iTimeItemTop, rectDayView.right - 1, iTimeItemTop + iTimeItemHeight,
284    mpt);
285   
286    // inner bkg
287  40 mpt.setColor(dayStyle.getColorTimeItemBkg(bFocused));
288  40 canvas.drawRect(rectDayView.left + 1 + 1, iTimeItemTop + 1, rectDayView.right - 1 - 1, iTimeItemTop
289    + iTimeItemHeight - 1, mpt);
290    }
291    }
292   
 
293  386 toggle @Override
294    protected void onDraw(Canvas canvas) {
295  386 super.onDraw(canvas);
296   
297  386 initRectangles();
298   
299  386 final boolean bFocused = IsViewFocused();
300   
301  386 drawDayViewBackground(canvas, bFocused);
302  386 drawDayHeader(canvas);
303  386 drawHourItems(canvas, bFocused);
304    }
305   
 
306  0 toggle @Override
307    public boolean onKeyDown(int keyCode, KeyEvent event) {
308  0 boolean bResult = super.onKeyDown(keyCode, event);
309  0 if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) || (keyCode == KeyEvent.KEYCODE_ENTER)) {
310  0 doItemClick();
311    }
312  0 return bResult;
313    }
314   
 
315  2 toggle public void doItemClick() {
316  2 if (itemClick != null)
317  2 itemClick.OnClick(this);
318    }
319   
 
320  386 toggle public boolean IsViewFocused() {
321  386 return (this.isFocused() || bTouchedDown);
322    }
323   
 
324  8 toggle @Override
325    public boolean onTouchEvent(MotionEvent event) {
326  8 boolean bHandled = false;
327  8 if (event.getAction() == MotionEvent.ACTION_DOWN) {
328  2 bHandled = true;
329  2 bTouchedDown = true;
330  2 invalidate();
331  2 Utils.startAlphaAnimIn(ViewWeekDayItem.this);
332    }
333  8 if (event.getAction() == MotionEvent.ACTION_CANCEL) {
334  2 bHandled = true;
335  2 bTouchedDown = false;
336  2 invalidate();
337    }
338  8 if (event.getAction() == MotionEvent.ACTION_UP) {
339  2 bHandled = true;
340  2 bTouchedDown = false;
341  2 invalidate();
342  2 doItemClick();
343    }
344  8 return bHandled;
345    }
346   
347    }