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 |
|
|
|
|
| 90,8% |
Uncovered Elements: 21 (229) |
Complexity: 52 |
Complexity Density: 0,33 |
|
13 |
|
public class ViewWeekDayItem extends View { |
14 |
|
private final static int iStartHour = 3; |
15 |
|
private final static int iTotalHours = 24; |
16 |
|
|
|
|
| - |
Uncovered Elements: 0 (0) |
Complexity: 0 |
Complexity Density: - |
|
17 |
|
private class TimeItem { |
18 |
|
public int iHour = -1; |
19 |
|
public int iMinute = -1; |
20 |
|
@SuppressWarnings("unused") |
21 |
|
public int iDurationInMinutes = 0; |
22 |
|
} |
23 |
|
|
|
|
| - |
Uncovered Elements: 0 (0) |
Complexity: 0 |
Complexity Density: - |
|
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 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 1 |
Complexity Density: 0,2 |
|
54 |
7
|
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 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (2) |
Complexity: 1 |
Complexity Density: 0,5 |
|
62 |
7
|
public void SetSize(int iWidth, int iHeight) {... |
63 |
7
|
lparamsItem.width = iWidth; |
64 |
7
|
lparamsItem.height = iHeight; |
65 |
|
} |
66 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
67 |
7
|
public void SetItemClick(OnItemClick itemClick) {... |
68 |
7
|
this.itemClick = itemClick; |
69 |
|
} |
70 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
71 |
252
|
public void SetCurrentHour(int iCurrentHour) {... |
72 |
252
|
this.iCurrentHour = iCurrentHour; |
73 |
|
} |
74 |
|
|
|
|
| 83,3% |
Uncovered Elements: 1 (6) |
Complexity: 2 |
Complexity Density: 0,5 |
|
75 |
1
|
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 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (7) |
Complexity: 1 |
Complexity Density: 0,14 |
|
82 |
1
|
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 |
|
|
|
|
| 78,9% |
Uncovered Elements: 4 (19) |
Complexity: 5 |
Complexity Density: 0,45 |
|
95 |
385
|
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 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
111 |
252
|
public void ClearTimeItems() {... |
112 |
252
|
vecTimeItems.clear(); |
113 |
|
} |
114 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 1 |
Complexity Density: 0,2 |
|
115 |
44
|
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 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (2) |
Complexity: 1 |
Complexity Density: 0,5 |
|
123 |
1
|
public void SetTimeMargin(int iTimeMarginWidth, boolean b24HourMode) {... |
124 |
1
|
this.iTimeMarginWidth = iTimeMarginWidth; |
125 |
1
|
this.b24HourMode = b24HourMode; |
126 |
|
} |
127 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 1 |
Complexity Density: 0,2 |
|
128 |
252
|
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 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
136 |
2
|
public Calendar GetDate() {... |
137 |
2
|
return calDate; |
138 |
|
} |
139 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
140 |
0
|
public int GetTextHeight() {... |
141 |
0
|
return (int) (-mpt.ascent() + mpt.descent()); |
142 |
|
} |
143 |
|
|
|
|
| 0% |
Uncovered Elements: 2 (2) |
Complexity: 1 |
Complexity Density: 0,5 |
|
144 |
0
|
@Override... |
145 |
|
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { |
146 |
0
|
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); |
147 |
0
|
invalidate(); |
148 |
|
} |
149 |
|
|
|
|
| 90,9% |
Uncovered Elements: 1 (11) |
Complexity: 4 |
Complexity Density: 0,8 |
|
150 |
252
|
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 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (13) |
Complexity: 5 |
Complexity Density: 0,71 |
|
158 |
252
|
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 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 1 |
Complexity Density: 0,2 |
|
168 |
386
|
private void initRectangles() {... |
169 |
|
|
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 |
|
|
174 |
386
|
rectDayViewFrame.left += iTimeMarginWidth; |
175 |
386
|
rectDayView.left += iTimeMarginWidth; |
176 |
|
} |
177 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (19) |
Complexity: 2 |
Complexity Density: 0,12 |
|
178 |
386
|
private void drawDayHeader(Canvas canvas) {... |
179 |
|
|
180 |
386
|
mpt.setTypeface(null); |
181 |
386
|
mpt.setAntiAlias(true); |
182 |
386
|
mpt.setFakeBoldText(true); |
183 |
|
|
184 |
|
|
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 |
|
|
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 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (11) |
Complexity: 2 |
Complexity Density: 0,22 |
|
207 |
386
|
private void drawDayViewBackground(Canvas canvas, boolean bFocused) {... |
208 |
|
|
209 |
386
|
mpt.setColor(dayStyle.getColorFrame(bHoliday, false)); |
210 |
386
|
canvas.drawRoundRect(rectDayViewFrame, 2, 2, mpt); |
211 |
|
|
212 |
|
|
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 |
|
|
|
|
| 95,8% |
Uncovered Elements: 2 (48) |
Complexity: 8 |
Complexity Density: 0,22 |
|
228 |
386
|
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 |
|
|
238 |
8492
|
for (int iHour = iStartHour; iHour < iTotalHours; iHour++) { |
239 |
8106
|
final float fItemPosY = rectDayView.top + (fHourItemHeight * (iHour - iStartHour)); |
240 |
|
|
241 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
275 |
73
|
if (iTimeItemTop + iTimeItemHeight > iViewBottom) |
276 |
0
|
iTimeItemTop = iViewBottom - iTimeItemHeight; |
277 |
|
|
278 |
73
|
if (iTimeItemTop + iTimeItemHeight < iViewTop) |
279 |
33
|
continue; |
280 |
|
|
281 |
|
|
282 |
40
|
mpt.setColor(dayStyle.getColorTimeItem(bFocused)); |
283 |
40
|
canvas.drawRect(rectDayView.left + 1, iTimeItemTop, rectDayView.right - 1, iTimeItemTop + iTimeItemHeight, |
284 |
|
mpt); |
285 |
|
|
286 |
|
|
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 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (6) |
Complexity: 1 |
Complexity Density: 0,17 |
|
293 |
386
|
@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 |
|
|
|
|
| 0% |
Uncovered Elements: 6 (6) |
Complexity: 3 |
Complexity Density: 0,75 |
|
306 |
0
|
@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 |
|
|
|
|
| 75% |
Uncovered Elements: 1 (4) |
Complexity: 2 |
Complexity Density: 1 |
|
315 |
2
|
public void doItemClick() {... |
316 |
2
|
if (itemClick != null) |
317 |
2
|
itemClick.OnClick(this); |
318 |
|
} |
319 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
320 |
386
|
public boolean IsViewFocused() {... |
321 |
386
|
return (this.isFocused() || bTouchedDown); |
322 |
|
} |
323 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (22) |
Complexity: 4 |
Complexity Density: 0,25 |
|
324 |
8
|
@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 |
|
} |