Skip to content

Commit 620a94a

Browse files
committed
Added a shiny new time click listener
1 parent 941728b commit 620a94a

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

library/src/main/java/com/alamkanak/weekview/WeekView.java

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
/**
3535
* Created by Raquib-ul-Alam Kanak on 7/21/2014.
36-
* Website: http://april-shower.com
36+
* Website: http://alamkanak.me
3737
*/
3838
public class WeekView extends View {
3939

@@ -101,7 +101,7 @@ public class WeekView extends View {
101101
private EventClickListener mEventClickListener;
102102
private EventLongPressListener mEventLongPressListener;
103103
private MonthChangeListener mMonthChangeListener;
104-
private HourClickListener mHourClickListener;
104+
private TimeClickListener mTimeClickListener;
105105

106106
private final GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() {
107107

@@ -153,6 +153,7 @@ else if (mCurrentFlingDirection == Direction.VERTICAL){
153153

154154
@Override
155155
public boolean onSingleTapConfirmed(MotionEvent e) {
156+
// If the tap was on an event then trigger the callback.
156157
if (mEventRects != null && mEventClickListener != null) {
157158
List<EventRect> reversedEventRects = mEventRects;
158159
Collections.reverse(reversedEventRects);
@@ -164,12 +165,14 @@ public boolean onSingleTapConfirmed(MotionEvent e) {
164165
}
165166
}
166167
}
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)) {
168171
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+
}
173176
}
174177

175178
return super.onSingleTapConfirmed(e);
@@ -396,7 +399,7 @@ private void drawHeaderRowAndEvents(Canvas canvas) {
396399
lineCount = (lineCount) * (mNumberOfVisibleDays+1);
397400
float[] hourLines = new float[lineCount * 4];
398401

399-
// Clear the cache for events rectangles.
402+
// Clear the cache for event rectangles.
400403
if (mEventRects != null) {
401404
for (EventRect eventRect: mEventRects) {
402405
eventRect.rectF = null;
@@ -471,11 +474,16 @@ private void drawHeaderRowAndEvents(Canvas canvas) {
471474

472475
}
473476

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+
*/
474483
private Calendar getTimeFromPoint(float x, float y){
475484
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 +
477486
mHeaderColumnWidth;
478-
float startPixel = startFromPixel;
479487
for (int dayNumber = leftDaysWithGaps + 1;
480488
dayNumber <= leftDaysWithGaps + mNumberOfVisibleDays + 1;
481489
dayNumber++) {
@@ -487,7 +495,9 @@ private Calendar getTimeFromPoint(float x, float y){
487495
float pixelsFromZero = y - mCurrentOrigin.y - mHeaderTextHeight
488496
- mHeaderRowPadding * 2 - mTimeTextHeight/2 - mHeaderMarginBottom;
489497
int hour = (int)(pixelsFromZero / mHourHeight);
498+
int minute = (int) (60 * (pixelsFromZero - hour * mHourHeight) / mHourHeight);
490499
day.add(Calendar.HOUR, hour);
500+
day.set(Calendar.MINUTE, minute);
491501
return day;
492502
}
493503
startPixel += mWidthPerDay + mColumnGap;
@@ -705,13 +715,17 @@ private void getMoreEvents(Calendar day) {
705715
}
706716
}
707717

718+
/**
719+
* Cache the event for smooth scrolling functionality.
720+
* @param event The event to cache.
721+
*/
708722
private void cacheEvent(WeekViewEvent event) {
709723
if (!isSameDay(event.getStartTime(), event.getEndTime())) {
710724
Calendar endTime = (Calendar) event.getStartTime().clone();
711725
endTime.set(Calendar.HOUR_OF_DAY, 23);
712726
endTime.set(Calendar.MINUTE, 59);
713727
Calendar startTime = (Calendar) event.getEndTime().clone();
714-
startTime.set(Calendar.HOUR_OF_DAY, 00);
728+
startTime.set(Calendar.HOUR_OF_DAY, 0);
715729
startTime.set(Calendar.MINUTE, 0);
716730
WeekViewEvent event1 = new WeekViewEvent(event.getId(), event.getName(), event.getStartTime(), endTime);
717731
event1.setColor(event.getColor());
@@ -914,12 +928,12 @@ public void setEventLongPressListener(EventLongPressListener eventLongPressListe
914928
this.mEventLongPressListener = eventLongPressListener;
915929
}
916930

917-
public HourClickListener getHourClickListener(){
918-
return mHourClickListener;
931+
public TimeClickListener getHourClickListener(){
932+
return mTimeClickListener;
919933
}
920934

921-
public void setHourClickListener(HourClickListener mHourClickListener){
922-
this.mHourClickListener = mHourClickListener;
935+
public void setHourClickListener(TimeClickListener mTimeClickListener){
936+
this.mTimeClickListener = mTimeClickListener;
923937
}
924938

925939

@@ -1310,11 +1324,8 @@ public interface EventLongPressListener {
13101324
public void onEventLongPress(WeekViewEvent event, RectF eventRect);
13111325
}
13121326

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);
13181329
}
13191330

13201331

0 commit comments

Comments
 (0)