Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduce much memory usage #405

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,10 +228,15 @@ Changelog

* Added support for overlapping events

**Lai Kitman Fork**

* remove almost all calendar instance to avoid memory leak
* optimize performance on large amount of events

License
----------

Copyright 2014 Raquib-ul-Alam
   Copyright 2017 Lai Kitman

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath 'com.android.tools.build:gradle:2.3.0'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Fri Sep 19 19:16:06 BDT 2014
#Fri Mar 03 14:28:32 CST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-2.2.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
8 changes: 4 additions & 4 deletions library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ repositories {
}

android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
compileSdkVersion 25
buildToolsVersion "25.0.2"

defaultConfig {
minSdkVersion 9
targetSdkVersion 23
targetSdkVersion 25
}
}

dependencies {
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:appcompat-v7:25.2.0'
}

apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'
182 changes: 105 additions & 77 deletions library/src/main/java/com/alamkanak/weekview/WeekView.java

Large diffs are not rendered by default.

175 changes: 131 additions & 44 deletions library/src/main/java/com/alamkanak/weekview/WeekViewEvent.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.alamkanak.weekview;

import android.graphics.Typeface;
import android.text.SpannableStringBuilder;
import android.text.StaticLayout;
import android.text.style.StyleSpan;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
Expand All @@ -11,12 +15,21 @@
* Website: http://april-shower.com
*/
public class WeekViewEvent {

private static final Calendar sStartCalendar = Calendar.getInstance();
private static final Calendar sEndCalendar = Calendar.getInstance();

private long mId;
private Calendar mStartTime;
private Calendar mEndTime;
private long mStartTime;
private long mEndTime;
private String mName;
private String mLocation;
private int mColor;
private int mAvailableHeight;
private int mAvailableWidth;
private StaticLayout mTextLayout;
private SpannableStringBuilder mStringBuilder = new SpannableStringBuilder();

private boolean mAllDay;

public WeekViewEvent(){
Expand All @@ -41,19 +54,21 @@ public WeekViewEvent(){
public WeekViewEvent(long id, String name, int startYear, int startMonth, int startDay, int startHour, int startMinute, int endYear, int endMonth, int endDay, int endHour, int endMinute) {
this.mId = id;

this.mStartTime = Calendar.getInstance();
this.mStartTime.set(Calendar.YEAR, startYear);
this.mStartTime.set(Calendar.MONTH, startMonth-1);
this.mStartTime.set(Calendar.DAY_OF_MONTH, startDay);
this.mStartTime.set(Calendar.HOUR_OF_DAY, startHour);
this.mStartTime.set(Calendar.MINUTE, startMinute);
sStartCalendar.set(Calendar.YEAR, startYear);
sStartCalendar.set(Calendar.MONTH, startMonth-1);
sStartCalendar.set(Calendar.DAY_OF_MONTH, startDay);
sStartCalendar.set(Calendar.HOUR_OF_DAY, startHour);
sStartCalendar.set(Calendar.MINUTE, startMinute);

this.mEndTime = Calendar.getInstance();
this.mEndTime.set(Calendar.YEAR, endYear);
this.mEndTime.set(Calendar.MONTH, endMonth-1);
this.mEndTime.set(Calendar.DAY_OF_MONTH, endDay);
this.mEndTime.set(Calendar.HOUR_OF_DAY, endHour);
this.mEndTime.set(Calendar.MINUTE, endMinute);
mStartTime = sStartCalendar.getTimeInMillis();

sEndCalendar.set(Calendar.YEAR, endYear);
sEndCalendar.set(Calendar.MONTH, endMonth-1);
sEndCalendar.set(Calendar.DAY_OF_MONTH, endDay);
sEndCalendar.set(Calendar.HOUR_OF_DAY, endHour);
sEndCalendar.set(Calendar.MINUTE, endMinute);

mEndTime = sEndCalendar.getTimeInMillis();

this.mName = name;
}
Expand All @@ -68,6 +83,24 @@ public WeekViewEvent(long id, String name, int startYear, int startMonth, int st
* @param allDay Is the event an all day event.
*/
public WeekViewEvent(long id, String name, String location, Calendar startTime, Calendar endTime, boolean allDay) {
this.mId = id;
this.mName = name;
this.mLocation = location;
this.mStartTime = startTime.getTimeInMillis();
this.mEndTime = endTime.getTimeInMillis();
this.mAllDay = allDay;
}

/**
* Initializes the event for week view.
* @param id The id of the event.
* @param name Name of the event.
* @param location The location of the event.
* @param startTime The time when the event starts.
* @param endTime The time when the event ends.
* @param allDay Is the event an all day event.
*/
public WeekViewEvent(long id, String name, String location, long startTime, long endTime, boolean allDay) {
this.mId = id;
this.mName = name;
this.mLocation = location;
Expand All @@ -76,6 +109,7 @@ public WeekViewEvent(long id, String name, String location, Calendar startTime,
this.mAllDay = allDay;
}


/**
* Initializes the event for week view.
* @param id The id of the event.
Expand All @@ -100,20 +134,28 @@ public WeekViewEvent(long id, String name, Calendar startTime, Calendar endTime)
}


public Calendar getStartTime() {
public long getStartTime() {
return mStartTime;
}

public void setStartTime(Calendar startTime) {
this.mStartTime = startTime;
this.mStartTime = startTime.getTimeInMillis();
}

public void setStartTime(long startTime) {
mStartTime = startTime;
}

public Calendar getEndTime() {
public long getEndTime() {
return mEndTime;
}

public void setEndTime(Calendar endTime) {
this.mEndTime = endTime;
this.mEndTime = endTime.getTimeInMillis();
}

public void setEndTime(long endTime) {
mEndTime = endTime;
}

public String getName() {
Expand All @@ -122,6 +164,7 @@ public String getName() {

public void setName(String name) {
this.mName = name;
refreshStringBuilder();
}

public String getLocation() {
Expand All @@ -130,6 +173,8 @@ public String getLocation() {

public void setLocation(String location) {
this.mLocation = location;
// Prepare the location of the event.
refreshStringBuilder();
}

public int getColor() {
Expand All @@ -156,6 +201,35 @@ public void setId(long id) {
this.mId = id;
}

public int getmAvailableHeight() {
return mAvailableHeight;
}

public void setmAvailableHeight(int mAvailableHeight) {
this.mAvailableHeight = mAvailableHeight;
}

public int getmAvailableWidth() {
return mAvailableWidth;
}

public void setmAvailableWidth(int mAvailableWidth) {
this.mAvailableWidth = mAvailableWidth;
}

public StaticLayout getTextLayout() {
return mTextLayout;
}

public void setTextLayout(StaticLayout mTextLayout) {
this.mTextLayout = mTextLayout;
}

public SpannableStringBuilder getStringBuilder() {
return mStringBuilder;
}


@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand All @@ -172,50 +246,63 @@ public int hashCode() {
return (int) (mId ^ (mId >>> 32));
}

private static Calendar sEndTimeCalendar = Calendar.getInstance();
private static Calendar sOverDayCalendar = Calendar.getInstance();
public List<WeekViewEvent> splitWeekViewEvents(){
//This function splits the WeekViewEvent in WeekViewEvents by day
List<WeekViewEvent> events = new ArrayList<WeekViewEvent>();
// The first millisecond of the next day is still the same day. (no need to split events for this).
Calendar endTime = (Calendar) this.getEndTime().clone();
endTime.add(Calendar.MILLISECOND, -1);
if (!isSameDay(this.getStartTime(), endTime)) {
endTime = (Calendar) this.getStartTime().clone();
endTime.set(Calendar.HOUR_OF_DAY, 23);
endTime.set(Calendar.MINUTE, 59);
WeekViewEvent event1 = new WeekViewEvent(this.getId(), this.getName(), this.getLocation(), this.getStartTime(), endTime, this.isAllDay());
if (!isSameDay(mStartTime, mEndTime - 1)) {
sEndTimeCalendar.setTimeInMillis(mStartTime);
sEndTimeCalendar.set(Calendar.HOUR_OF_DAY, 23);
sEndTimeCalendar.set(Calendar.MINUTE, 59);
WeekViewEvent event1 = new WeekViewEvent(this.getId(), this.getName(), this.getLocation(), this.getStartTime(), sEndCalendar.getTimeInMillis(), this.isAllDay());
event1.setColor(this.getColor());
events.add(event1);

// Add other days.
Calendar otherDay = (Calendar) this.getStartTime().clone();
otherDay.add(Calendar.DATE, 1);
while (!isSameDay(otherDay, this.getEndTime())) {
Calendar overDay = (Calendar) otherDay.clone();
overDay.set(Calendar.HOUR_OF_DAY, 0);
overDay.set(Calendar.MINUTE, 0);
Calendar endOfOverDay = (Calendar) overDay.clone();
endOfOverDay.set(Calendar.HOUR_OF_DAY, 23);
endOfOverDay.set(Calendar.MINUTE, 59);
WeekViewEvent eventMore = new WeekViewEvent(this.getId(), this.getName(), null, overDay, endOfOverDay, this.isAllDay());
eventMore.setColor(this.getColor());
sEndTimeCalendar.add(Calendar.DATE, 1);
while (!isSameDay(sEndTimeCalendar.getTimeInMillis(), mEndTime)) {
sOverDayCalendar.setTimeInMillis(sEndTimeCalendar.getTimeInMillis());
sOverDayCalendar.set(Calendar.HOUR_OF_DAY, 0);
sOverDayCalendar.set(Calendar.MINUTE, 0);
long startOfOverDay = sOverDayCalendar.getTimeInMillis();
sOverDayCalendar.set(Calendar.HOUR_OF_DAY, 23);
sOverDayCalendar.set(Calendar.MINUTE, 59);
long endOfOverDay = sOverDayCalendar.getTimeInMillis();
WeekViewEvent eventMore = new WeekViewEvent(mId, mName, null,
startOfOverDay, endOfOverDay, mAllDay);
eventMore.setColor(mColor);
events.add(eventMore);

// Add next day.
otherDay.add(Calendar.DATE, 1);
sEndTimeCalendar.add(Calendar.DATE, 1);
}

// Add last day.
Calendar startTime = (Calendar) this.getEndTime().clone();
startTime.set(Calendar.HOUR_OF_DAY, 0);
startTime.set(Calendar.MINUTE, 0);
WeekViewEvent event2 = new WeekViewEvent(this.getId(), this.getName(), this.getLocation(), startTime, this.getEndTime(), this.isAllDay());
event2.setColor(this.getColor());
sEndTimeCalendar.setTimeInMillis(mEndTime);
sEndTimeCalendar.set(Calendar.HOUR_OF_DAY, 0);
sEndTimeCalendar.set(Calendar.MINUTE, 0);
WeekViewEvent event2 = new WeekViewEvent(mId, mName, mLocation,
sEndTimeCalendar.getTimeInMillis(), mEndTime, mAllDay);
event2.setColor(mColor);
events.add(event2);
}
else{
} else {
events.add(this);
}

return events;
}

private void refreshStringBuilder() {
mStringBuilder.clear();
if (mName != null) {
mStringBuilder.append(mName);
mStringBuilder.setSpan(new StyleSpan(Typeface.BOLD), 0, mStringBuilder.length(), 0);
mStringBuilder.append(' ');
}
if (mLocation != null) {
mStringBuilder.append(mLocation);
}
}
}
22 changes: 16 additions & 6 deletions library/src/main/java/com/alamkanak/weekview/WeekViewUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,26 @@ public static boolean isSameDay(Calendar dayOne, Calendar dayTwo) {
return dayOne.get(Calendar.YEAR) == dayTwo.get(Calendar.YEAR) && dayOne.get(Calendar.DAY_OF_YEAR) == dayTwo.get(Calendar.DAY_OF_YEAR);
}

private static Calendar sDayOne = Calendar.getInstance();
private static Calendar sDayTwo = Calendar.getInstance();
public static boolean isSameDay(long dayOne, long dayTwo) {
sDayOne.setTimeInMillis(dayOne);
sDayTwo.setTimeInMillis(dayTwo);
return isSameDay(sDayOne, sDayTwo);
}


private static final Calendar sToday = Calendar.getInstance();
/**
* Returns a calendar instance at the start of this day
* @return the calendar instance
*/
public static Calendar today(){
Calendar today = Calendar.getInstance();
today.set(Calendar.HOUR_OF_DAY, 0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.SECOND, 0);
today.set(Calendar.MILLISECOND, 0);
return today;
sToday.setTimeInMillis(System.currentTimeMillis());
sToday.set(Calendar.HOUR_OF_DAY, 0);
sToday.set(Calendar.MINUTE, 0);
sToday.set(Calendar.SECOND, 0);
sToday.set(Calendar.MILLISECOND, 0);
return sToday;
}
}
8 changes: 4 additions & 4 deletions sample/build.gradle
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
compileSdkVersion 25
buildToolsVersion "25.0.2"

defaultConfig {
applicationId "com.alamkanak.weekview"
minSdkVersion 9
targetSdkVersion 23
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
Expand All @@ -22,6 +22,6 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':library')
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
}
Loading