33
33
34
34
/**
35
35
* Created by Raquib-ul-Alam Kanak on 7/21/2014.
36
- * Website: http://april-shower.com
36
+ * Website: http://alamkanak.me
37
37
*/
38
38
public class WeekView extends View {
39
39
@@ -101,7 +101,7 @@ public class WeekView extends View {
101
101
private EventClickListener mEventClickListener ;
102
102
private EventLongPressListener mEventLongPressListener ;
103
103
private MonthChangeListener mMonthChangeListener ;
104
- private HourClickListener mHourClickListener ;
104
+ private TimeClickListener mTimeClickListener ;
105
105
106
106
private final GestureDetector .SimpleOnGestureListener mGestureListener = new GestureDetector .SimpleOnGestureListener () {
107
107
@@ -153,6 +153,7 @@ else if (mCurrentFlingDirection == Direction.VERTICAL){
153
153
154
154
@ Override
155
155
public boolean onSingleTapConfirmed (MotionEvent e ) {
156
+ // If the tap was on an event then trigger the callback.
156
157
if (mEventRects != null && mEventClickListener != null ) {
157
158
List <EventRect > reversedEventRects = mEventRects ;
158
159
Collections .reverse (reversedEventRects );
@@ -164,12 +165,14 @@ public boolean onSingleTapConfirmed(MotionEvent e) {
164
165
}
165
166
}
166
167
}
167
- if (mHourClickListener != null ) {
168
+
169
+ // If the tap was on in an empty space, then trigger the callback.
170
+ if (mTimeClickListener != null && e .getX () > mHeaderColumnWidth && e .getY () > (mHeaderTextHeight + mHeaderRowPadding * 2 + mHeaderMarginBottom )) {
168
171
Calendar selectedTime = getTimeFromPoint (e .getX (), e .getY ());
169
- mHourClickListener . onHourClicked (selectedTime );
170
- }
171
- else {
172
- throw new IllegalStateException ( "You must provide a HourClickListener" );
172
+ if (selectedTime != null ) {
173
+ playSoundEffect ( SoundEffectConstants . CLICK );
174
+ mTimeClickListener . onTimeClicked ( selectedTime );
175
+ }
173
176
}
174
177
175
178
return super .onSingleTapConfirmed (e );
@@ -396,7 +399,7 @@ private void drawHeaderRowAndEvents(Canvas canvas) {
396
399
lineCount = (lineCount ) * (mNumberOfVisibleDays +1 );
397
400
float [] hourLines = new float [lineCount * 4 ];
398
401
399
- // Clear the cache for events rectangles.
402
+ // Clear the cache for event rectangles.
400
403
if (mEventRects != null ) {
401
404
for (EventRect eventRect : mEventRects ) {
402
405
eventRect .rectF = null ;
@@ -471,11 +474,16 @@ private void drawHeaderRowAndEvents(Canvas canvas) {
471
474
472
475
}
473
476
477
+ /**
478
+ * Get the time and date where the user clicked on.
479
+ * @param x The x position of the touch event.
480
+ * @param y The y position of the touch event.
481
+ * @return The time and date at the clicked position.
482
+ */
474
483
private Calendar getTimeFromPoint (float x , float y ){
475
484
int leftDaysWithGaps = (int ) -(Math .ceil (mCurrentOrigin .x / (mWidthPerDay + mColumnGap )));
476
- float startFromPixel = mCurrentOrigin .x + (mWidthPerDay + mColumnGap ) * leftDaysWithGaps +
485
+ float startPixel = mCurrentOrigin .x + (mWidthPerDay + mColumnGap ) * leftDaysWithGaps +
477
486
mHeaderColumnWidth ;
478
- float startPixel = startFromPixel ;
479
487
for (int dayNumber = leftDaysWithGaps + 1 ;
480
488
dayNumber <= leftDaysWithGaps + mNumberOfVisibleDays + 1 ;
481
489
dayNumber ++) {
@@ -487,7 +495,9 @@ private Calendar getTimeFromPoint(float x, float y){
487
495
float pixelsFromZero = y - mCurrentOrigin .y - mHeaderTextHeight
488
496
- mHeaderRowPadding * 2 - mTimeTextHeight /2 - mHeaderMarginBottom ;
489
497
int hour = (int )(pixelsFromZero / mHourHeight );
498
+ int minute = (int ) (60 * (pixelsFromZero - hour * mHourHeight ) / mHourHeight );
490
499
day .add (Calendar .HOUR , hour );
500
+ day .set (Calendar .MINUTE , minute );
491
501
return day ;
492
502
}
493
503
startPixel += mWidthPerDay + mColumnGap ;
@@ -705,13 +715,17 @@ private void getMoreEvents(Calendar day) {
705
715
}
706
716
}
707
717
718
+ /**
719
+ * Cache the event for smooth scrolling functionality.
720
+ * @param event The event to cache.
721
+ */
708
722
private void cacheEvent (WeekViewEvent event ) {
709
723
if (!isSameDay (event .getStartTime (), event .getEndTime ())) {
710
724
Calendar endTime = (Calendar ) event .getStartTime ().clone ();
711
725
endTime .set (Calendar .HOUR_OF_DAY , 23 );
712
726
endTime .set (Calendar .MINUTE , 59 );
713
727
Calendar startTime = (Calendar ) event .getEndTime ().clone ();
714
- startTime .set (Calendar .HOUR_OF_DAY , 00 );
728
+ startTime .set (Calendar .HOUR_OF_DAY , 0 );
715
729
startTime .set (Calendar .MINUTE , 0 );
716
730
WeekViewEvent event1 = new WeekViewEvent (event .getId (), event .getName (), event .getStartTime (), endTime );
717
731
event1 .setColor (event .getColor ());
@@ -914,12 +928,12 @@ public void setEventLongPressListener(EventLongPressListener eventLongPressListe
914
928
this .mEventLongPressListener = eventLongPressListener ;
915
929
}
916
930
917
- public HourClickListener getHourClickListener (){
918
- return mHourClickListener ;
931
+ public TimeClickListener getHourClickListener (){
932
+ return mTimeClickListener ;
919
933
}
920
934
921
- public void setHourClickListener (HourClickListener mHourClickListener ){
922
- this .mHourClickListener = mHourClickListener ;
935
+ public void setHourClickListener (TimeClickListener mTimeClickListener ){
936
+ this .mTimeClickListener = mTimeClickListener ;
923
937
}
924
938
925
939
@@ -1310,11 +1324,8 @@ public interface EventLongPressListener {
1310
1324
public void onEventLongPress (WeekViewEvent event , RectF eventRect );
1311
1325
}
1312
1326
1313
- /**
1314
- * Added by Fan Chen on 12/19/2014
1315
- */
1316
- public interface HourClickListener {
1317
- public void onHourClicked (Calendar startTime );
1327
+ public interface TimeClickListener {
1328
+ public void onTimeClicked (Calendar time );
1318
1329
}
1319
1330
1320
1331
0 commit comments