From bb3dfcedb7ea9057dd75db2adef579639823a896 Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Mon, 30 Jul 2018 20:47:05 +0200 Subject: [PATCH] Added colors to schedule --- .../fuplanner/fragments/ScheduleFragment.java | 7 ++- .../fuplanner/services/KVV/KVVModuleList.java | 3 +- .../fuplanner/services/KVV/types/Event.java | 57 ++++++++++++++++++- .../java/de/sebse/fuplanner/tools/Color.java | 7 +++ .../de/sebse/fuplanner/tools/ColorRGB.java | 24 ++++++++ .../de/sebse/fuplanner/tools/ColorRes.java | 17 ++++++ .../fuplanner/tools/ui/weekview/WeekView.java | 13 ++++- .../tools/ui/weekview/WeekViewEvent.java | 19 +++---- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 10 files changed, 130 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/Color.java create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/ColorRGB.java create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/ColorRes.java diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java index 88df9cd..c42b245 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/ScheduleFragment.java @@ -39,7 +39,6 @@ public class ScheduleFragment extends Fragment implements MonthLoader.MonthChang private WeekView mWeekView; private Logger log = new Logger(this); private Modules mModules = null; - private Calendar firstVisibleDay; public ScheduleFragment() { // Required empty public constructor @@ -133,7 +132,9 @@ public class ScheduleFragment extends Fragment implements MonthLoader.MonthChang Calendar start = Calendar.getInstance(); start.setTimeInMillis(e.getStartDate()); - events.add(new WeekViewEvent(e.getId(), e.getTitle(), start.get(Calendar.YEAR), start.get(Calendar.MONTH) + 1, start.get(Calendar.DAY_OF_MONTH), start.get(Calendar.HOUR_OF_DAY), start.get(Calendar.MINUTE), ende.get(Calendar.YEAR), ende.get(Calendar.MONTH) + 1, ende.get(Calendar.DAY_OF_MONTH), ende.get(Calendar.HOUR_OF_DAY), ende.get(Calendar.MINUTE))); + WeekViewEvent weekViewEvent = new WeekViewEvent(e.getId(), e.getTitle(), start.get(Calendar.YEAR), start.get(Calendar.MONTH) + 1, start.get(Calendar.DAY_OF_MONTH), start.get(Calendar.HOUR_OF_DAY), start.get(Calendar.MINUTE), ende.get(Calendar.YEAR), ende.get(Calendar.MONTH) + 1, ende.get(Calendar.DAY_OF_MONTH), ende.get(Calendar.HOUR_OF_DAY), ende.get(Calendar.MINUTE)); + weekViewEvent.setColor(e.getColor()); + events.add(weekViewEvent); } } } @@ -147,7 +148,6 @@ public class ScheduleFragment extends Fragment implements MonthLoader.MonthChang @Override public void onFirstVisibleDayChanged(Calendar newFirstVisibleDay, Calendar oldFirstVisibleDay) { - firstVisibleDay = newFirstVisibleDay; Calendar newLastVisibleDay = (Calendar) newFirstVisibleDay.clone(); newLastVisibleDay.add(Calendar.HOUR, 24*mWeekView.getNumberOfVisibleDays()); //mListener.onScheduleFragmentInteraction(newFirstVisibleDay, newLastVisibleDay); @@ -161,6 +161,7 @@ public class ScheduleFragment extends Fragment implements MonthLoader.MonthChang @Override public void mOnDoubleTapListener(Calendar time) { + Calendar firstVisibleDay = mWeekView.getFirstVisibleDay(); Calendar c = Calendar.getInstance(); c.set(firstVisibleDay.get(Calendar.YEAR), firstVisibleDay.get(Calendar.MONTH), firstVisibleDay.get(Calendar.DAY_OF_MONTH), 0,0 ); c.add(Calendar.DATE, 2); // die Grenze beim tippen, wann ver nach vorne und wann nach hinten springt diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java index 4bd7d55..8410956 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java @@ -352,9 +352,10 @@ public class KVVModuleList extends HTTPService { String id = site.getString("eventId"); String type = site.getString("type"); String title = site.getString("title"); + String siteId = site.getString("siteId"); long duration = site.getLong("duration"); long firstTime = site.getJSONObject("firstTime").getLong("time"); - events.add(new Event(id, type, title, duration, firstTime)); + events.add(new Event(id, type, title, duration, firstTime, siteId)); } } catch (JSONException e) { e.printStackTrace(); diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java index a18bb7d..1405fcd 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java @@ -1,6 +1,12 @@ package de.sebse.fuplanner.services.KVV.types; import java.io.Serializable; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import de.sebse.fuplanner.tools.ColorRGB; +import de.sebse.fuplanner.tools.logging.Logger; public class Event implements Serializable { private final String id; @@ -8,13 +14,15 @@ public class Event implements Serializable { private final String title; private final long duration; private final long firstTime; + private String siteId; - public Event(String id, String type, String title, long duration, long firstTime) { + public Event(String id, String type, String title, long duration, long firstTime, String siteId) { this.id = id; this.type = type; this.title = title; this.duration = duration; this.firstTime = firstTime; + this.siteId = siteId; } public String getId() { @@ -37,6 +45,53 @@ public class Event implements Serializable { return this.firstTime+this.duration; } + public ColorRGB getColor() { + MessageDigest digest = null; + try { + digest = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return null; + } + byte[] encodedHash; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { + encodedHash = digest.digest(siteId.getBytes(StandardCharsets.UTF_8)); + } else { + encodedHash = digest.digest(siteId.getBytes()); + } + int h = (0xff & encodedHash[0]) + (0xff & encodedHash[1]) * 255; + h = h * 360 / 0xffff; + int s = 0xff & encodedHash[2]; + s = s * 100 / 0xffff; + int v = 0xff & encodedHash[3]; + v = v * 100 / 0xffff; + + // range for more beautiful colors + h = h / 30 * 30; + s = 100; + v = 50; + + return hsvToRgb(h/360.0, s/100.0, v/100.0); + } + + public static ColorRGB hsvToRgb(double hue, double saturation, double value) { + int h = (int)(hue * 6); + double f = hue * 6 - h; + double p = value * (1 - saturation); + double q = value * (1 - f * saturation); + double t = value * (1 - (1 - f) * saturation); + + switch (h) { + case 0: return new ColorRGB(value, t, p); + case 1: return new ColorRGB(q, value, p); + case 2: return new ColorRGB(p, value, t); + case 3: return new ColorRGB(p, q, value); + case 4: return new ColorRGB(t, p, value); + case 5: return new ColorRGB(value, p, q); + default: throw new RuntimeException("Something went wrong when converting from HSV to RGB. Input was " + hue + ", " + saturation + ", " + value); + } + } + @Override public String toString() { return "ID: "+getId()+ diff --git a/app/src/main/java/de/sebse/fuplanner/tools/Color.java b/app/src/main/java/de/sebse/fuplanner/tools/Color.java new file mode 100644 index 0000000..fdd2dc4 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/Color.java @@ -0,0 +1,7 @@ +package de.sebse.fuplanner.tools; + +import android.graphics.Paint; + +public interface Color { + void setPaintColor(Paint paint); +} diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ColorRGB.java b/app/src/main/java/de/sebse/fuplanner/tools/ColorRGB.java new file mode 100644 index 0000000..b53b361 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/ColorRGB.java @@ -0,0 +1,24 @@ +package de.sebse.fuplanner.tools; + +import android.graphics.Paint; + +public class ColorRGB implements Color { + private final int mRed; + private final int mGreen; + private final int mBlue; + + public ColorRGB(int red, int green, int blue) { + this.mRed = red; + this.mGreen = green; + this.mBlue = blue; + } + + public ColorRGB(double red, double green, double blue) { + this((int) (red*255), (int) (green*255), (int) (blue*255)); + } + + @Override + public void setPaintColor(Paint paint) { + paint.setARGB(255, mRed, mGreen, mBlue); + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ColorRes.java b/app/src/main/java/de/sebse/fuplanner/tools/ColorRes.java new file mode 100644 index 0000000..4d59659 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/ColorRes.java @@ -0,0 +1,17 @@ +package de.sebse.fuplanner.tools; + +import android.graphics.Paint; +import android.support.annotation.ColorInt; + +public class ColorRes implements Color { + @ColorInt private final int mResId; + + public ColorRes(@ColorInt int color) { + this.mResId = color; + } + + @Override + public void setPaintColor(Paint paint) { + paint.setColor(mResId); + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekView.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekView.java index 07ef4b0..25a770c 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekView.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekView.java @@ -46,6 +46,7 @@ import java.util.List; import java.util.Locale; import de.sebse.fuplanner.R; +import de.sebse.fuplanner.tools.ColorRes; import de.sebse.fuplanner.tools.DateUtils; import de.sebse.fuplanner.tools.logging.Logger; @@ -394,7 +395,7 @@ public class WeekView extends View { bottom > 0 ) { RectF dayRectF = new RectF(left, top, right, bottom - mCurrentOrigin.y); - newEvent.setColor(mNewEventColor); + newEvent.setColor(new ColorRes(mNewEventColor)); mNewEventRect = new EventRect(newEvent, newEvent, dayRectF); tempEvents.add(newEvent); WeekView.this.clearEvents(); @@ -1100,7 +1101,10 @@ public class WeekView extends View { bottom > mHeaderHeight + mHeaderRowPadding * 2 + mTimeTextHeight / 2 + mHeaderMarginBottom ) { mEventRects.get(i).rectF = new RectF(left, top, right, bottom); - mEventBackgroundPaint.setColor(mEventRects.get(i).event.getColor() == 0 ? mDefaultEventColor : mEventRects.get(i).event.getColor()); + if (mEventRects.get(i).event.getColor() != null) + mEventRects.get(i).event.getColor().setPaintColor(mEventBackgroundPaint); + else + mEventBackgroundPaint.setColor(mDefaultEventColor); mEventBackgroundPaint.setShader(mEventRects.get(i).event.getShader()); canvas.drawRoundRect(mEventRects.get(i).rectF, mEventCornerRadius, mEventCornerRadius, mEventBackgroundPaint); float topToUse = top; @@ -1153,7 +1157,10 @@ public class WeekView extends View { bottom > 0 ) { mEventRects.get(i).rectF = new RectF(left, top, right, bottom); - mEventBackgroundPaint.setColor(mEventRects.get(i).event.getColor() == 0 ? mDefaultEventColor : mEventRects.get(i).event.getColor()); + if (mEventRects.get(i).event.getColor() != null) + mEventRects.get(i).event.getColor().setPaintColor(mEventBackgroundPaint); + else + mEventBackgroundPaint.setColor(mDefaultEventColor); mEventBackgroundPaint.setShader(mEventRects.get(i).event.getShader()); canvas.drawRoundRect(mEventRects.get(i).rectF, mEventCornerRadius, mEventCornerRadius, mEventBackgroundPaint); drawEventTitle(mEventRects.get(i).event, mEventRects.get(i).rectF, canvas, top, left); diff --git a/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekViewEvent.java b/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekViewEvent.java index 3d279a7..bc75e15 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekViewEvent.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/ui/weekview/WeekViewEvent.java @@ -1,12 +1,13 @@ package de.sebse.fuplanner.tools.ui.weekview; import android.graphics.Shader; -import android.support.annotation.ColorInt; import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import de.sebse.fuplanner.tools.Color; + import static de.sebse.fuplanner.tools.ui.weekview.WeekViewUtil.isSameDay; @@ -20,9 +21,7 @@ public class WeekViewEvent { private Calendar mEndTime; private String mName; private String mLocation; - private - @ColorInt - int mColor; + private Color mColor; private boolean mAllDay; private Shader mShader; @@ -237,13 +236,11 @@ public class WeekViewEvent { this.mLocation = location; } - public - @ColorInt - int getColor() { + public Color getColor() { return mColor; } - public void setColor(int color) { + public void setColor(Color color) { this.mColor = color; } @@ -307,7 +304,7 @@ public class WeekViewEvent { endTime.set(Calendar.HOUR_OF_DAY, 23); endTime.set(Calendar.MINUTE, 59); WeekViewEvent event1 = new WeekViewEvent(this.getIdentifier(), this.getName(), this.getLocation(), this.getStartTime(), endTime, this.isAllDay()); - event1.setColor(this.getColor()); + event1.setColor(this.mColor); events.add(event1); // Add other days. @@ -321,7 +318,7 @@ public class WeekViewEvent { endOfOverDay.set(Calendar.HOUR_OF_DAY, 23); endOfOverDay.set(Calendar.MINUTE, 59); WeekViewEvent eventMore = new WeekViewEvent(this.getIdentifier(), this.getName(), null, overDay, endOfOverDay, this.isAllDay()); - eventMore.setColor(this.getColor()); + eventMore.setColor(this.mColor); events.add(eventMore); // Add next day. @@ -333,7 +330,7 @@ public class WeekViewEvent { startTime.set(Calendar.HOUR_OF_DAY, 0); startTime.set(Calendar.MINUTE, 0); WeekViewEvent event2 = new WeekViewEvent(this.getIdentifier(), this.getName(), this.getLocation(), startTime, this.getEndTime(), this.isAllDay()); - event2.setColor(this.getColor()); + event2.setColor(this.mColor); events.add(event2); } else { events.add(this); diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index dff9237..9beebeb 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -31,7 +31,7 @@ Vergangene Veranstaltungen Veranstaltungen Noten - Aktuelle Prozentzahl + Aktuelle Prozentzahl Offline-Modus Aktualisieren fehlgeschlagen… Hey, schau\' dir die neue KVV App an: %1$s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 607a07f..d48387a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -37,7 +37,7 @@ Past Events Events Gradebook - Current Percentage + Current Percentage Offline Mode Refresh failed… Hey, check out the new KVV app: %1$s