Merge pull request #3 from szkolny-eu/feature/module-refactor

Refactor Gradle dependencies and project modules
This commit is contained in:
Kuba Szczodrzyński 2021-03-22 19:05:30 +01:00 committed by GitHub
commit 07561c6484
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
285 changed files with 677 additions and 19637 deletions

View File

@ -1 +0,0 @@
/build

View File

@ -1,54 +0,0 @@
apply plugin: 'com.android.library'
//apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion setup.compileSdk
android {
lintOptions {
abortOnError false
}
}
defaultConfig {
minSdkVersion 14
targetSdkVersion setup.targetSdk
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debugMinify {
debuggable = true
minifyEnabled = true
proguardFiles 'proguard-android.txt'
}
}
sourceSets {
main {
assets.srcDirs = ['assets']
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
//apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// Google libraries
implementation "androidx.appcompat:appcompat:${versions.appcompat}"
implementation "androidx.recyclerview:recyclerview:${versions.recyclerView}"
implementation "com.google.android.material:material:${versions.material}"
// other libraries
//implementation 'se.emilsjolander:stickylistheaders:2.7.0'
implementation 'com.github.edisonw:StickyListHeaders:master-SNAPSHOT@aar'
implementation 'io.reactivex:rxjava:1.1.1'
}

View File

@ -1,3 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.tibolte.agendacalendarview">
</manifest>

View File

@ -1,264 +0,0 @@
package com.github.tibolte.agendacalendarview;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.os.Handler;
import androidx.annotation.NonNull;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.github.tibolte.agendacalendarview.agenda.AgendaAdapter;
import com.github.tibolte.agendacalendarview.agenda.AgendaView;
import com.github.tibolte.agendacalendarview.calendar.CalendarView;
import com.github.tibolte.agendacalendarview.models.BaseCalendarEvent;
import com.github.tibolte.agendacalendarview.models.CalendarEvent;
import com.github.tibolte.agendacalendarview.models.DayItem;
import com.github.tibolte.agendacalendarview.models.IDayItem;
import com.github.tibolte.agendacalendarview.models.IWeekItem;
import com.github.tibolte.agendacalendarview.models.WeekItem;
import com.github.tibolte.agendacalendarview.render.DefaultEventRenderer;
import com.github.tibolte.agendacalendarview.render.EventRenderer;
import com.github.tibolte.agendacalendarview.utils.BusProvider;
import com.github.tibolte.agendacalendarview.utils.Events;
import com.github.tibolte.agendacalendarview.utils.ListViewScrollTracker;
import com.github.tibolte.agendacalendarview.widgets.FloatingActionButton;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
/**
* View holding the agenda and calendar view together.
*/
public class AgendaCalendarView extends FrameLayout implements StickyListHeadersListView.OnStickyHeaderChangedListener {
private static final String LOG_TAG = AgendaCalendarView.class.getSimpleName();
private CalendarView mCalendarView;
private AgendaView mAgendaView;
private FloatingActionButton mFloatingActionButton;
private int mAgendaCurrentDayTextColor, mCalendarHeaderColor, mCalendarHeaderTextColor, mCalendarBackgroundColor, mCalendarDayTextColor, mCalendarPastDayTextColor, mCalendarCurrentDayColor, mFabColor;
private CalendarPickerController mCalendarPickerController;
public AgendaView getAgendaView() {
return mAgendaView;
}
private ListViewScrollTracker mAgendaListViewScrollTracker;
private AbsListView.OnScrollListener mAgendaScrollListener = new AbsListView.OnScrollListener() {
int mCurrentAngle;
int mMaxAngle = 85;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int scrollY = mAgendaListViewScrollTracker.calculateScrollY(firstVisibleItem, visibleItemCount);
if (scrollY != 0) {
mFloatingActionButton.show();
}
//Log.d(LOG_TAG, String.format("Agenda listView scrollY: %d", scrollY));
/*int toAngle = scrollY / 100;
if (toAngle > mMaxAngle) {
toAngle = mMaxAngle;
} else if (toAngle < -mMaxAngle) {
toAngle = -mMaxAngle;
}
RotateAnimation rotate = new RotateAnimation(mCurrentAngle, toAngle, mFloatingActionButton.getWidth() / 2, mFloatingActionButton.getHeight() / 2);
rotate.setFillAfter(true);
mCurrentAngle = toAngle;
mFloatingActionButton.startAnimation(rotate);*/
}
};
// region Constructors
public AgendaCalendarView(Context context) {
super(context);
}
public AgendaCalendarView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ColorOptionsView, 0, 0);
mAgendaCurrentDayTextColor = a.getColor(R.styleable.ColorOptionsView_agendaCurrentDayTextColor, getResources().getColor(R.color.theme_primary));
mCalendarHeaderColor = a.getColor(R.styleable.ColorOptionsView_calendarHeaderColor, getResources().getColor(R.color.theme_primary_dark));
mCalendarHeaderTextColor = a.getColor(R.styleable.ColorOptionsView_calendarHeaderTextColor, getResources().getColor(R.color.theme_text_icons));
mCalendarBackgroundColor = a.getColor(R.styleable.ColorOptionsView_calendarColor, getResources().getColor(R.color.theme_primary));
mCalendarDayTextColor = a.getColor(R.styleable.ColorOptionsView_calendarDayTextColor, getResources().getColor(R.color.theme_text_icons));
mCalendarCurrentDayColor = a.getColor(R.styleable.ColorOptionsView_calendarCurrentDayTextColor, getResources().getColor(R.color.calendar_text_current_day));
mCalendarPastDayTextColor = a.getColor(R.styleable.ColorOptionsView_calendarPastDayTextColor, getResources().getColor(R.color.theme_light_primary));
mFabColor = a.getColor(R.styleable.ColorOptionsView_fabColor, getResources().getColor(R.color.theme_accent));
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_agendacalendar, this, true);
setAlpha(0f);
}
// endregion
// region Class - View
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mCalendarView = (CalendarView) findViewById(R.id.calendar_view);
mAgendaView = (AgendaView) findViewById(R.id.agenda_view);
mFloatingActionButton = (FloatingActionButton) findViewById(R.id.floating_action_button);
ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{mFabColor});
mFloatingActionButton.setBackgroundTintList(csl);
LinearLayout mDayNamesHeader = mCalendarView.findViewById(R.id.cal_day_names);
mDayNamesHeader.setBackgroundColor(mCalendarHeaderColor);
for (int i = 0; i < mDayNamesHeader.getChildCount(); i++) {
TextView txtDay = (TextView) mDayNamesHeader.getChildAt(i);
txtDay.setTextColor(mCalendarHeaderTextColor);
}
mCalendarView.findViewById(R.id.list_week).setBackgroundColor(mCalendarBackgroundColor);
mAgendaView.getAgendaListView().setOnItemClickListener((AdapterView<?> parent, View view, int position, long id) -> {
mCalendarPickerController.onEventSelected(CalendarManager.getInstance().getEvents().get(position));
});
BusProvider.getInstance().toObserverable()
.subscribe(event -> {
if (event instanceof Events.DayClickedEvent) {
if (mCalendarPickerController != null)
mCalendarPickerController.onDaySelected(((Events.DayClickedEvent) event).getDay());
} else if (event instanceof Events.EventsFetched) {
ObjectAnimator alphaAnimation = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), 1f).setDuration(500);
alphaAnimation.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
long fabAnimationDelay = 500;
// Just after setting the alpha from this view to 1, we hide the fab.
// It will reappear as soon as the user is scrolling the Agenda view.
new Handler().postDelayed(() -> {
mFloatingActionButton.hide();
mAgendaListViewScrollTracker = new ListViewScrollTracker(mAgendaView.getAgendaListView());
mAgendaView.getAgendaListView().setOnScrollListener(mAgendaScrollListener);
mFloatingActionButton.setOnClickListener((v) -> {
mAgendaView.translateList(0);
mAgendaView.getAgendaListView().smoothScrollBy(0, 0);
//mAgendaView.getAgendaListView().getWrappedList().smoothScrollBy(0, 0);
mAgendaView.getAgendaListView().scrollToCurrentDate(CalendarManager.getInstance().getToday());
new Handler().postDelayed(() -> mFloatingActionButton.hide(), fabAnimationDelay);
});
}, fabAnimationDelay);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
alphaAnimation.start();
}
});
}
// endregion
// region Interface - StickyListHeadersListView.OnStickyHeaderChangedListener
@Override
public void onStickyHeaderChanged(StickyListHeadersListView stickyListHeadersListView, View header, int position, long headerId) {
//Log.d(LOG_TAG, String.format("onStickyHeaderChanged, position = %d, headerId = %d", position, headerId));
if (CalendarManager.getInstance().getEvents().size() > 0) {
CalendarEvent event = CalendarManager.getInstance().getEvents().get(position);
if (event != null) {
mCalendarView.scrollToDate(event);
mCalendarPickerController.onScrollToDate(event.getInstanceDay());
}
}
}
// endregion
// region Public methods
public void init(List<CalendarEvent> eventList, Calendar minDate, Calendar maxDate, Locale locale, CalendarPickerController calendarPickerController, EventRenderer<?> ... renderers) {
mCalendarPickerController = calendarPickerController;
CalendarManager.getInstance(getContext()).buildCal(minDate, maxDate, locale, new DayItem(), new WeekItem());
// Feed our views with weeks list and events
mCalendarView.init(CalendarManager.getInstance(getContext()), mCalendarDayTextColor, mCalendarCurrentDayColor, mCalendarPastDayTextColor, eventList);
// Load agenda events and scroll to current day
AgendaAdapter agendaAdapter = new AgendaAdapter(mAgendaCurrentDayTextColor);
mAgendaView.getAgendaListView().setAdapter(agendaAdapter);
mAgendaView.getAgendaListView().setOnStickyHeaderChangedListener(this);
CalendarManager.getInstance().loadEvents(eventList, new BaseCalendarEvent());
BusProvider.getInstance().send(new Events.EventsFetched());
Log.d(LOG_TAG, "CalendarEventTask finished, event count "+eventList.size());
// add default event renderer
addEventRenderer(new DefaultEventRenderer());
for (EventRenderer<?> renderer: renderers) {
addEventRenderer(renderer);
}
}
public void init(Locale locale, List<IWeekItem> lWeeks, List<IDayItem> lDays, List<CalendarEvent> lEvents, CalendarPickerController calendarPickerController) {
mCalendarPickerController = calendarPickerController;
CalendarManager.getInstance(getContext()).loadCal(locale, lWeeks, lDays, lEvents);
// Feed our views with weeks list and events
mCalendarView.init(CalendarManager.getInstance(getContext()), mCalendarDayTextColor, mCalendarCurrentDayColor, mCalendarPastDayTextColor, lEvents);
// Load agenda events and scroll to current day
AgendaAdapter agendaAdapter = new AgendaAdapter(mAgendaCurrentDayTextColor);
mAgendaView.getAgendaListView().setAdapter(agendaAdapter);
mAgendaView.getAgendaListView().setOnStickyHeaderChangedListener(this);
// notify that actually everything is loaded
BusProvider.getInstance().send(new Events.EventsFetched());
Log.d(LOG_TAG, "CalendarEventTask finished");
// add default event renderer
addEventRenderer(new DefaultEventRenderer());
}
public void addEventRenderer(@NonNull final EventRenderer<?> renderer) {
AgendaAdapter adapter = (AgendaAdapter) mAgendaView.getAgendaListView().getAdapter();
adapter.addEventRenderer(renderer);
}
public void enableFloatingIndicator(boolean enable) {
mFloatingActionButton.setVisibility(enable ? VISIBLE : GONE);
}
// endregion
}

View File

@ -1,267 +0,0 @@
package com.github.tibolte.agendacalendarview;
import com.github.tibolte.agendacalendarview.models.CalendarEvent;
import com.github.tibolte.agendacalendarview.models.IDayItem;
import com.github.tibolte.agendacalendarview.models.IWeekItem;
import com.github.tibolte.agendacalendarview.utils.DateHelper;
import android.content.Context;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
* This class manages information about the calendar. (Events, weather info...)
* Holds reference to the days list of the calendar.
* As the app is using several views, we want to keep everything in one place.
*/
public class CalendarManager {
private static final String LOG_TAG = CalendarManager.class.getSimpleName();
private static CalendarManager mInstance;
private Context mContext;
private Locale mLocale;
private Calendar mToday = Calendar.getInstance();
private SimpleDateFormat mWeekdayFormatter;
private SimpleDateFormat mMonthHalfNameFormat;
/// instances of classes provided from outside
private IDayItem mCleanDay;
private IWeekItem mCleanWeek;
/**
* List of days used by the calendar
*/
private List<IDayItem> mDays = new ArrayList<>();
/**
* List of weeks used by the calendar
*/
private List<IWeekItem> mWeeks = new ArrayList<>();
/**
* List of events instances
*/
private List<CalendarEvent> mEvents = new ArrayList<>();
// region Constructors
public CalendarManager(Context context) {
this.mContext = context;
}
public static CalendarManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new CalendarManager(context);
}
return mInstance;
}
public static CalendarManager getInstance() {
return mInstance;
}
// endregion
// region Getters/Setters
public Locale getLocale() {
return mLocale;
}
public Context getContext() {
return mContext;
}
public Calendar getToday() {
return mToday;
}
public void setToday(Calendar today) {
this.mToday = today;
}
public List<IWeekItem> getWeeks() {
return mWeeks;
}
public List<CalendarEvent> getEvents() {
return mEvents;
}
public List<IDayItem> getDays() {
return mDays;
}
public SimpleDateFormat getWeekdayFormatter() {
return mWeekdayFormatter;
}
public SimpleDateFormat getMonthHalfNameFormat() {
return mMonthHalfNameFormat;
}
// endregion
// region Public methods
public void buildCal(Calendar minDate, Calendar maxDate, Locale locale, IDayItem cleanDay, IWeekItem cleanWeek) {
if (minDate == null || maxDate == null) {
throw new IllegalArgumentException(
"minDate and maxDate must be non-null.");
}
if (minDate.after(maxDate)) {
throw new IllegalArgumentException(
"minDate must be before maxDate.");
}
if (locale == null) {
throw new IllegalArgumentException("Locale is null.");
}
setLocale(locale);
mDays.clear();
mWeeks.clear();
mEvents.clear();
mCleanDay = cleanDay;
mCleanWeek = cleanWeek;
Calendar mMinCal = Calendar.getInstance(mLocale);
Calendar mMaxCal = Calendar.getInstance(mLocale);
Calendar mWeekCounter = Calendar.getInstance(mLocale);
mMinCal.setTime(minDate.getTime());
mMaxCal.setTime(maxDate.getTime());
// maxDate is exclusive, here we bump back to the previous day, as maxDate if December 1st, 2020,
// we don't include that month in our list
mMaxCal.add(Calendar.MINUTE, -1);
// Now iterate we iterate between mMinCal and mMaxCal so we build our list of weeks
mWeekCounter.setTime(mMinCal.getTime());
int maxMonth = mMaxCal.get(Calendar.MONTH);
int maxYear = mMaxCal.get(Calendar.YEAR);
int currentMonth = mWeekCounter.get(Calendar.MONTH);
int currentYear = mWeekCounter.get(Calendar.YEAR);
// Loop through the weeks
while ((currentMonth <= maxMonth // Up to, including the month.
|| currentYear < maxYear) // Up to the year.
&& currentYear < maxYear + 1) { // But not > next yr.
Date date = mWeekCounter.getTime();
// Build our week list
int currentWeekOfYear = mWeekCounter.get(Calendar.WEEK_OF_YEAR);
IWeekItem weekItem = cleanWeek.copy();
weekItem.setWeekInYear(currentWeekOfYear);
weekItem.setYear(currentYear);
weekItem.setDate(date);
weekItem.setMonth(currentMonth);
weekItem.setLabel(mMonthHalfNameFormat.format(date));
List<IDayItem> dayItems = getDayCells(mWeekCounter); // gather days for the built week
weekItem.setDayItems(dayItems);
mWeeks.add(weekItem);
//Log.d(LOG_TAG, String.format("Adding week: %s", weekItem));
mWeekCounter.add(Calendar.WEEK_OF_YEAR, 1);
currentMonth = mWeekCounter.get(Calendar.MONTH);
currentYear = mWeekCounter.get(Calendar.YEAR);
}
}
public void loadEvents(List<CalendarEvent> eventList, CalendarEvent noEvent) {
for (IWeekItem weekItem : getWeeks()) {
for (IDayItem dayItem : weekItem.getDayItems()) {
boolean isEventForDay = false;
boolean isShowBadgeForDay = false;
for (CalendarEvent event : eventList) {
if (DateHelper.isBetweenInclusive(dayItem.getDate(), event.getStartTime(), event.getEndTime())) {
CalendarEvent copy = event.copy();
if (copy.getShowBadge()) {
isShowBadgeForDay = true;
}
Calendar dayInstance = Calendar.getInstance();
dayInstance.setTime(dayItem.getDate());
copy.setInstanceDay(dayInstance);
copy.setDayReference(dayItem);
copy.setWeekReference(weekItem);
// add instances in chronological order
getEvents().add(copy);
isEventForDay = true;
}
}
if (!isEventForDay) {
Calendar dayInstance = Calendar.getInstance();
dayInstance.setTime(dayItem.getDate());
CalendarEvent copy = noEvent.copy();
copy.setInstanceDay(dayInstance);
copy.setDayReference(dayItem);
copy.setWeekReference(weekItem);
copy.setLocation("");
copy.setTitle(getContext().getResources().getString(R.string.agenda_event_no_events));
copy.setPlaceholder(true);
getEvents().add(copy);
}
dayItem.setShowBadge(isShowBadgeForDay);
}
}
}
public void loadCal (Locale locale, List<IWeekItem> lWeeks, List<IDayItem> lDays, List<CalendarEvent> lEvents) {
mWeeks = lWeeks;
mDays = lDays;
mEvents = lEvents;
setLocale(locale);
}
// endregion
// region Private methods
private List<IDayItem> getDayCells(Calendar startCal) {
Calendar cal = Calendar.getInstance(mLocale);
cal.setTime(startCal.getTime());
List<IDayItem> dayItems = new ArrayList<>();
int firstDayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
int offset = cal.getFirstDayOfWeek() - firstDayOfWeek;
if (offset > 0) {
offset -= 7;
}
cal.add(Calendar.DATE, offset);
//Log.d(LOG_TAG, String.format("Buiding row week starting at %s", cal.getTime()));
for (int c = 0; c < 7; c++) {
IDayItem dayItem = mCleanDay.copy();
dayItem.buildDayItemFromCal(cal);
dayItems.add(dayItem);
cal.add(Calendar.DATE, 1);
}
mDays.addAll(dayItems);
return dayItems;
}
private void setLocale(Locale locale) {
this.mLocale = locale;
setToday(Calendar.getInstance(mLocale));
mWeekdayFormatter = new SimpleDateFormat(getContext().getString(R.string.day_name_format), mLocale);
mMonthHalfNameFormat = new SimpleDateFormat(getContext().getString(R.string.month_half_name_format), locale);
}
// endregion
}

View File

@ -1,14 +0,0 @@
package com.github.tibolte.agendacalendarview;
import com.github.tibolte.agendacalendarview.models.CalendarEvent;
import com.github.tibolte.agendacalendarview.models.IDayItem;
import java.util.Calendar;
public interface CalendarPickerController {
void onDaySelected(IDayItem dayItem);
void onEventSelected(CalendarEvent event);
void onScrollToDate(Calendar calendar);
}

View File

@ -1,105 +0,0 @@
package com.github.tibolte.agendacalendarview.agenda;
import com.github.tibolte.agendacalendarview.models.CalendarEvent;
import com.github.tibolte.agendacalendarview.render.DefaultEventRenderer;
import com.github.tibolte.agendacalendarview.render.EventRenderer;
import androidx.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.ArrayList;
import java.util.List;
import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
/**
* Adapter for the agenda, implements StickyListHeadersAdapter.
* Days as sections and CalendarEvents as list items.
*/
public class AgendaAdapter extends BaseAdapter implements StickyListHeadersAdapter {
private List<CalendarEvent> mEvents = new ArrayList<>();
private List<EventRenderer<?>> mRenderers = new ArrayList<>();
private int mCurrentDayColor;
// region Constructor
public AgendaAdapter(int currentDayTextColor) {
this.mCurrentDayColor = currentDayTextColor;
}
// endregion
// region Public methods
public void updateEvents(List<CalendarEvent> events) {
this.mEvents.clear();
this.mEvents.addAll(events);
notifyDataSetChanged();
}
// endregion
// region Interface - StickyListHeadersAdapter
@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) {
AgendaHeaderView agendaHeaderView = (AgendaHeaderView) convertView;
if (agendaHeaderView == null) {
agendaHeaderView = AgendaHeaderView.inflate(parent);
}
agendaHeaderView.setDay(getItem(position).getInstanceDay(), mCurrentDayColor, getItem(position).getDayReference().getShowBadge());
return agendaHeaderView;
}
@Override
public long getHeaderId(int position) {
return mEvents.get(position).getInstanceDay().getTimeInMillis();
}
// endregion
// region Class - BaseAdapter
@Override
public int getCount() {
return mEvents.size();
}
@Override
public CalendarEvent getItem(int position) {
return mEvents.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
EventRenderer eventRenderer = new DefaultEventRenderer();
final CalendarEvent event = getItem(position);
// Search for the correct event renderer
for (EventRenderer renderer : mRenderers) {
if(event.getClass().isAssignableFrom(renderer.getRenderType())) {
eventRenderer = renderer;
break;
}
}
convertView = LayoutInflater.from(parent.getContext())
.inflate(eventRenderer.getEventLayout(), parent, false);
eventRenderer.render(convertView, event);
return convertView;
}
public void addEventRenderer(@NonNull final EventRenderer<?> renderer) {
mRenderers.add(renderer);
}
// endregion
}

View File

@ -1,38 +0,0 @@
package com.github.tibolte.agendacalendarview.agenda;
import com.github.tibolte.agendacalendarview.R;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.LinearLayout;
/**
* List item view for the StickyHeaderListView of the agenda view
*/
public class AgendaEventView extends LinearLayout {
public static AgendaEventView inflate(ViewGroup parent) {
return (AgendaEventView) LayoutInflater.from(parent.getContext()).inflate(R.layout.view_agenda_event, parent, false);
}
// region Constructors
public AgendaEventView(Context context) {
this(context, null);
}
public AgendaEventView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AgendaEventView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setPadding(getResources().getDimensionPixelSize(R.dimen.agenda_event_view_padding_left),
getResources().getDimensionPixelSize(R.dimen.agenda_event_view_padding_top),
getResources().getDimensionPixelSize(R.dimen.agenda_event_view_padding_right),
getResources().getDimensionPixelSize(R.dimen.agenda_event_view_padding_bottom));
}
// endregion
}

View File

@ -1,81 +0,0 @@
package com.github.tibolte.agendacalendarview.agenda;
import com.github.tibolte.agendacalendarview.CalendarManager;
import com.github.tibolte.agendacalendarview.R;
import com.github.tibolte.agendacalendarview.utils.DateHelper;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.GradientDrawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/**
* Header view for the StickyHeaderListView of the agenda view
*/
public class AgendaHeaderView extends LinearLayout {
public static AgendaHeaderView inflate(ViewGroup parent) {
return (AgendaHeaderView) LayoutInflater.from(parent.getContext()).inflate(R.layout.view_agenda_header, parent, false);
}
// region Constructors
public AgendaHeaderView(Context context) {
super(context);
}
public AgendaHeaderView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AgendaHeaderView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// endregion
// region Public methods
public void setDay(Calendar day, int currentDayTextColor, boolean showBadge) {
TextView txtDayOfMonth = (TextView) findViewById(R.id.view_agenda_day_of_month);
TextView txtDayOfWeek = (TextView) findViewById(R.id.view_agenda_day_of_week);
TextView txtDay = (TextView) findViewById(R.id.view_agenda_day_text);
View circleView = findViewById(R.id.view_day_circle_selected);
Calendar today = CalendarManager.getInstance().getToday();
SimpleDateFormat dayWeekFormatter = new SimpleDateFormat(getContext().getString(R.string.day_name_format), CalendarManager.getInstance().getLocale());
SimpleDateFormat dayWeekLongFormatter = new SimpleDateFormat("EEEE", CalendarManager.getInstance().getLocale());
txtDayOfMonth.setTextColor(getResources().getColor(R.color.calendar_text_default));
txtDayOfWeek.setTextColor(getResources().getColor(R.color.calendar_text_default));
if (DateHelper.sameDate(day, today)) {
txtDayOfMonth.setTextColor(currentDayTextColor);
circleView.setVisibility(VISIBLE);
GradientDrawable drawable = (GradientDrawable) circleView.getBackground();
drawable.setStroke((int) (2 * Resources.getSystem().getDisplayMetrics().density), currentDayTextColor);
} else if (showBadge) {
circleView.setVisibility(VISIBLE);
GradientDrawable drawable = (GradientDrawable) circleView.getBackground();
drawable.setStroke((int) (2 * Resources.getSystem().getDisplayMetrics().density), 0xffff0000);
}
else {
circleView.setVisibility(INVISIBLE);
}
txtDayOfMonth.setText(String.valueOf(day.get(Calendar.DAY_OF_MONTH)));
txtDayOfWeek.setText(dayWeekFormatter.format(day.getTime()));
//txtDay.setText(dayWeekLongFormatter.format(day.getTime()));
}
// endregion
}

View File

@ -1,54 +0,0 @@
package com.github.tibolte.agendacalendarview.agenda;
import com.github.tibolte.agendacalendarview.CalendarManager;
import com.github.tibolte.agendacalendarview.models.CalendarEvent;
import com.github.tibolte.agendacalendarview.utils.DateHelper;
import android.content.Context;
import android.util.AttributeSet;
import java.util.Calendar;
import java.util.List;
import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
/**
* StickyListHeadersListView to scroll chronologically through events.
*/
public class AgendaListView extends StickyListHeadersListView {
// region Constructors
public AgendaListView(Context context) {
super(context);
}
public AgendaListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AgendaListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// endregion
// region Public methods
public void scrollToCurrentDate(Calendar today) {
List<CalendarEvent> events = CalendarManager.getInstance().getEvents();
int toIndex = 0;
for (int i = 0; i < events.size(); i++) {
if (DateHelper.sameDate(today, events.get(i).getInstanceDay())) {
toIndex = i;
break;
}
}
final int finalToIndex = toIndex;
post(()->setSelection(finalToIndex));
}
// endregion
}

View File

@ -1,145 +0,0 @@
package com.github.tibolte.agendacalendarview.agenda;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import com.github.tibolte.agendacalendarview.CalendarManager;
import com.github.tibolte.agendacalendarview.R;
import com.github.tibolte.agendacalendarview.utils.BusProvider;
import com.github.tibolte.agendacalendarview.utils.Events;
public class AgendaView extends FrameLayout {
private AgendaListView mAgendaListView;
private View mShadowView;
// region Constructors
public AgendaView(Context context) {
super(context);
}
public AgendaView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_agenda, this, true);
}
// endregion
// region Class - View
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mAgendaListView = (AgendaListView) findViewById(R.id.agenda_listview);
mShadowView = findViewById(R.id.view_shadow);
BusProvider.getInstance().toObserverable()
.subscribe(event -> {
if (event instanceof Events.DayClickedEvent) {
Events.DayClickedEvent clickedEvent = (Events.DayClickedEvent) event;
getAgendaListView().scrollToCurrentDate(clickedEvent.getCalendar());
} else if (event instanceof Events.CalendarScrolledEvent) {
int offset = (int) (3 * getResources().getDimension(R.dimen.day_cell_height));
translateList(offset);
} else if (event instanceof Events.EventsFetched) {
if (getAgendaListView().getAdapter() != null)
((AgendaAdapter) getAgendaListView().getAdapter()).updateEvents(CalendarManager.getInstance().getEvents());
getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (getWidth() != 0 && getHeight() != 0) {
// display only two visible rows on the calendar view
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
int height = getHeight();
int margin = (int) (getContext().getResources().getDimension(R.dimen.calendar_header_height) + 2 * getContext().getResources().getDimension(R.dimen.day_cell_height));
layoutParams.height = height;
layoutParams.setMargins(0, margin, 0, 0);
setLayoutParams(layoutParams);
getAgendaListView().scrollToCurrentDate(CalendarManager.getInstance().getToday());
getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
}
);
} else if (event instanceof Events.ForecastFetched) {
((AgendaAdapter) getAgendaListView().getAdapter()).updateEvents(CalendarManager.getInstance().getEvents());
}
});
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
int eventaction = event.getAction();
switch (eventaction) {
case MotionEvent.ACTION_DOWN:
// if the user touches the listView, we put it back to the top
translateList(0);
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
// endregion
// region Public methods
public AgendaListView getAgendaListView() {
return mAgendaListView;
}
public void translateList(int targetY) {
if (targetY != getTranslationY()) {
ObjectAnimator mover = ObjectAnimator.ofFloat(this, "translationY", targetY);
mover.setDuration(150);
mover.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//mShadowView.setVisibility(GONE);
}
@Override
public void onAnimationEnd(Animator animation) {
if (targetY == 0) {
BusProvider.getInstance().send(new Events.AgendaListViewTouchedEvent());
}
//mShadowView.setVisibility(VISIBLE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
mover.start();
}
}
// endregion
}

View File

@ -1,279 +0,0 @@
package com.github.tibolte.agendacalendarview.calendar;
import com.github.tibolte.agendacalendarview.CalendarManager;
import com.github.tibolte.agendacalendarview.R;
import com.github.tibolte.agendacalendarview.calendar.weekslist.WeekListView;
import com.github.tibolte.agendacalendarview.calendar.weekslist.WeeksAdapter;
import com.github.tibolte.agendacalendarview.models.CalendarEvent;
import com.github.tibolte.agendacalendarview.models.IDayItem;
import com.github.tibolte.agendacalendarview.models.IWeekItem;
import com.github.tibolte.agendacalendarview.utils.BusProvider;
import com.github.tibolte.agendacalendarview.utils.DateHelper;
import com.github.tibolte.agendacalendarview.utils.Events;
import android.content.Context;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
/**
* The calendar view is a freely scrolling view that allows the user to browse between days of the
* year.
*/
public class CalendarView extends LinearLayout {
private static final String LOG_TAG = CalendarView.class.getSimpleName();
/**
* Top of the calendar view layout, the week days list
*/
private LinearLayout mDayNamesHeader;
/**
* Part of the calendar view layout always visible, the weeks list
*/
private WeekListView mListViewWeeks;
/**
* The adapter for the weeks list
*/
private WeeksAdapter mWeeksAdapter;
/**
* The current highlighted day in blue
*/
private IDayItem mSelectedDay;
/**
* The current row displayed at top of the list
*/
private int mCurrentListPosition;
// region Constructors
public CalendarView(Context context) {
super(context);
}
public CalendarView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_calendar, this, true);
setOrientation(VERTICAL);
}
// endregion
public IDayItem getSelectedDay() {
return mSelectedDay;
}
public void setSelectedDay(IDayItem mSelectedDay) {
this.mSelectedDay = mSelectedDay;
}
public WeekListView getListViewWeeks() {
return mListViewWeeks;
}
// region Class - View
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mDayNamesHeader = (LinearLayout) findViewById(R.id.cal_day_names);
mListViewWeeks = (WeekListView) findViewById(R.id.list_week);
mListViewWeeks.setLayoutManager(new LinearLayoutManager(getContext()));
mListViewWeeks.setHasFixedSize(true);
mListViewWeeks.setItemAnimator(null);
mListViewWeeks.setSnapEnabled(true);
// display only two visible rows on the calendar view
getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (getWidth() != 0 && getHeight() != 0) {
collapseCalendarView();
getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
}
);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
BusProvider.getInstance().toObserverable()
.subscribe(event -> {
if (event instanceof Events.CalendarScrolledEvent) {
expandCalendarView();
} else if (event instanceof Events.AgendaListViewTouchedEvent) {
collapseCalendarView();
} else if (event instanceof Events.DayClickedEvent) {
Events.DayClickedEvent clickedEvent = (Events.DayClickedEvent) event;
updateSelectedDay(clickedEvent.getCalendar(), clickedEvent.getDay());
}
});
}
// endregion
// region Public methods
public void init(CalendarManager calendarManager, int dayTextColor, int currentDayTextColor, int pastDayTextColor, List<CalendarEvent> eventList) {
Calendar today = calendarManager.getToday();
Locale locale = calendarManager.getLocale();
SimpleDateFormat weekDayFormatter = calendarManager.getWeekdayFormatter();
List<IWeekItem> weeks = calendarManager.getWeeks();
setUpHeader(today, weekDayFormatter, locale);
setUpAdapter(today, weeks, dayTextColor, currentDayTextColor, pastDayTextColor, eventList);
scrollToDate(today, weeks);
}
/**
* Fired when the Agenda list view changes section.
*
* @param calendarEvent The event for the selected position in the agenda listview.
*/
public void scrollToDate(final CalendarEvent calendarEvent) {
mListViewWeeks.post(()->scrollToPosition(updateSelectedDay(calendarEvent.getInstanceDay(), calendarEvent.getDayReference())));
}
public void scrollToDate(Calendar today, List<IWeekItem> weeks) {
Integer currentWeekIndex = null;
for (int c = 0; c < weeks.size(); c++) {
if (DateHelper.sameWeek(today, weeks.get(c))) {
currentWeekIndex = c;
break;
}
}
if (currentWeekIndex != null) {
final Integer finalCurrentWeekIndex = currentWeekIndex;
mListViewWeeks.post(() -> scrollToPosition(finalCurrentWeekIndex));
}
}
public void setBackgroundColor(int color) {
mListViewWeeks.setBackgroundColor(color);
}
// endregion
// region Private methods
private void scrollToPosition(int targetPosition) {
LinearLayoutManager layoutManager = ((LinearLayoutManager) mListViewWeeks.getLayoutManager());
layoutManager.scrollToPosition(targetPosition);
}
private void updateItemAtPosition(int position) {
WeeksAdapter weeksAdapter = (WeeksAdapter) mListViewWeeks.getAdapter();
weeksAdapter.notifyItemChanged(position);
}
/**
* Creates a new adapter if necessary and sets up its parameters.
*/
private void setUpAdapter(Calendar today, List<IWeekItem> weeks, int dayTextColor, int currentDayTextColor, int pastDayTextColor, List<CalendarEvent> events) {
BusProvider.getInstance().toObserverable()
.subscribe(event -> {
if (event instanceof Events.EventsFetched) {
//Log.d("CalendarView", "events size "+events.size());
if (mWeeksAdapter == null) {
//Log.d(LOG_TAG, "Setting adapter with today's calendar: " + today.toString());
mWeeksAdapter = new WeeksAdapter(getContext(), today, dayTextColor, currentDayTextColor, pastDayTextColor, events);
mListViewWeeks.setAdapter(mWeeksAdapter);
}
mWeeksAdapter.updateWeeksItems(weeks);
}});
}
private void setUpHeader(Calendar today, SimpleDateFormat weekDayFormatter, Locale locale) {
int daysPerWeek = 7;
String[] dayLabels = new String[daysPerWeek];
Calendar cal = Calendar.getInstance(CalendarManager.getInstance(getContext()).getLocale());
cal.setTime(today.getTime());
int firstDayOfWeek = cal.getFirstDayOfWeek();
for (int count = 0; count < 7; count++) {
cal.set(Calendar.DAY_OF_WEEK, firstDayOfWeek + count);
if (locale.getLanguage().equals("en")) {
dayLabels[count] = weekDayFormatter.format(cal.getTime()).toUpperCase(locale);
} else {
dayLabels[count] = weekDayFormatter.format(cal.getTime());
}
}
for (int i = 0; i < mDayNamesHeader.getChildCount(); i++) {
TextView txtDay = (TextView) mDayNamesHeader.getChildAt(i);
txtDay.setText(dayLabels[i]);
}
}
private void expandCalendarView() {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.height = (int) (getResources().getDimension(R.dimen.calendar_header_height) + 5 * getResources().getDimension(R.dimen.day_cell_height));
setLayoutParams(layoutParams);
}
private void collapseCalendarView() {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.height = (int) (getResources().getDimension(R.dimen.calendar_header_height) + 2 * getResources().getDimension(R.dimen.day_cell_height));
setLayoutParams(layoutParams);
}
/**
* Update a selected cell day item.
*
* @param calendar The Calendar instance of the day selected.
* @param dayItem The DayItem information held by the cell item.
* @return The selected row of the weeks list, to be updated.
*/
private int updateSelectedDay(Calendar calendar, IDayItem dayItem) {
Integer currentWeekIndex = null;
// update highlighted/selected day
if (!dayItem.equals(getSelectedDay())) {
dayItem.setSelected(true);
if (getSelectedDay() != null) {
getSelectedDay().setSelected(false);
}
setSelectedDay(dayItem);
}
for (int c = 0; c < CalendarManager.getInstance().getWeeks().size(); c++) {
if (DateHelper.sameWeek(calendar, CalendarManager.getInstance().getWeeks().get(c))) {
currentWeekIndex = c;
break;
}
}
if (currentWeekIndex != null) {
// highlighted day has changed, update the rows concerned
if (currentWeekIndex != mCurrentListPosition) {
updateItemAtPosition(mCurrentListPosition);
}
mCurrentListPosition = currentWeekIndex;
updateItemAtPosition(currentWeekIndex);
}
return mCurrentListPosition;
}
// endregion
}

View File

@ -1,144 +0,0 @@
package com.github.tibolte.agendacalendarview.calendar.weekslist;
import com.github.tibolte.agendacalendarview.utils.BusProvider;
import com.github.tibolte.agendacalendarview.utils.Events;
import android.content.Context;
import androidx.recyclerview.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
public class WeekListView extends RecyclerView {
private boolean mUserScrolling = false;
private boolean mScrolling = false;
// region Constructors
public WeekListView(Context context) {
super(context);
}
public WeekListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WeekListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// endregion
// region Public methods
/**
* Enable snapping behaviour for this recyclerView
*
* @param enabled enable or disable the snapping behaviour
*/
public void setSnapEnabled(boolean enabled) {
if (enabled) {
addOnScrollListener(mScrollListener);
} else {
removeOnScrollListener(mScrollListener);
}
}
// endregion
// region Private methods
private OnScrollListener mScrollListener = new OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
final WeeksAdapter weeksAdapter = (WeeksAdapter) getAdapter();
switch (newState) {
case SCROLL_STATE_IDLE:
if (mUserScrolling) {
scrollToView(getCenterView());
postDelayed(() -> weeksAdapter.setDragging(false), 700); // Wait for recyclerView to settle
}
mUserScrolling = false;
mScrolling = false;
break;
// If scroll is caused by a touch (scroll touch, not any touch)
case SCROLL_STATE_DRAGGING:
BusProvider.getInstance().send(new Events.CalendarScrolledEvent());
// If scroll was initiated already, this is not a user scrolling, but probably a tap, else set userScrolling
if (!mScrolling) {
mUserScrolling = true;
}
weeksAdapter.setDragging(true);
break;
case SCROLL_STATE_SETTLING:
// The user's finger is not touching the list anymore, no need
// for any alpha animation then
weeksAdapter.setAlphaSet(true);
mScrolling = true;
break;
}
}
};
private View getChildClosestToPosition(int y) {
if (getChildCount() <= 0) {
return null;
}
int itemHeight = getChildAt(0).getMeasuredHeight();
int closestY = 9999;
View closestChild = null;
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
int childCenterY = ((int) child.getY() + (itemHeight / 2));
int yDistance = childCenterY - y;
// If child center is closer than previous closest, set it as closest
if (Math.abs(yDistance) < Math.abs(closestY)) {
closestY = yDistance;
closestChild = child;
}
}
return closestChild;
}
private View getCenterView() {
return getChildClosestToPosition(getMeasuredHeight() / 2);
}
private void scrollToView(View child) {
if (child == null) {
return;
}
stopScroll();
int scrollDistance = getScrollDistance(child);
if (scrollDistance != 0) {
smoothScrollBy(0, scrollDistance);
}
}
private int getScrollDistance(View child) {
int itemHeight = getChildAt(0).getMeasuredHeight();
int centerY = getMeasuredHeight() / 2;
int childCenterY = ((int) child.getY() + (itemHeight / 2));
return childCenterY - centerY;
}
// endregion
}

View File

@ -1,321 +0,0 @@
package com.github.tibolte.agendacalendarview.calendar.weekslist;
import com.github.tibolte.agendacalendarview.CalendarManager;
import com.github.tibolte.agendacalendarview.R;
import com.github.tibolte.agendacalendarview.models.CalendarEvent;
import com.github.tibolte.agendacalendarview.models.IDayItem;
import com.github.tibolte.agendacalendarview.models.IWeekItem;
import com.github.tibolte.agendacalendarview.utils.BusProvider;
import com.github.tibolte.agendacalendarview.utils.DateHelper;
import com.github.tibolte.agendacalendarview.utils.Events;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Typeface;
import android.graphics.drawable.GradientDrawable;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class WeeksAdapter extends RecyclerView.Adapter<WeeksAdapter.WeekViewHolder> {
public static final long FADE_DURATION = 250;
private Context mContext;
private Calendar mToday;
private List<IWeekItem> mWeeksList = new ArrayList<>();
private List<CalendarEvent> mEventList = new ArrayList<>();
private boolean mDragging;
private boolean mAlphaSet;
private int mDayTextColor, mPastDayTextColor, mCurrentDayColor;
// region Constructor
public WeeksAdapter(Context context, Calendar today, int dayTextColor, int currentDayTextColor, int pastDayTextColor, List<CalendarEvent> events) {
this.mToday = today;
this.mContext = context;
this.mDayTextColor = dayTextColor;
this.mCurrentDayColor = currentDayTextColor;
this.mPastDayTextColor = pastDayTextColor;
this.mEventList = events;
}
// endregion
public void updateWeeksItems(List<IWeekItem> weekItems) {
this.mWeeksList.clear();
this.mWeeksList.addAll(weekItems);
notifyDataSetChanged();
}
// region Getters/setters
public List<IWeekItem> getWeeksList() {
return mWeeksList;
}
public boolean isDragging() {
return mDragging;
}
public void setDragging(boolean dragging) {
if (dragging != this.mDragging) {
this.mDragging = dragging;
notifyItemRangeChanged(0, mWeeksList.size());
}
}
public boolean isAlphaSet() {
return mAlphaSet;
}
public void setAlphaSet(boolean alphaSet) {
mAlphaSet = alphaSet;
}
// endregion
// region RecyclerView.Adapter<WeeksAdapter.WeekViewHolder> methods
@Override
public WeekViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_week, parent, false);
return new WeekViewHolder(view);
}
@Override
public void onBindViewHolder(WeekViewHolder weekViewHolder, int position) {
IWeekItem weekItem = mWeeksList.get(position);
weekViewHolder.bindWeek(weekItem, mToday);
}
@Override
public int getItemCount() {
return mWeeksList.size();
}
// endregion
// region Class - WeekViewHolder
public class WeekViewHolder extends RecyclerView.ViewHolder {
/**
* List of layout containers for each day
*/
private List<LinearLayout> mCells;
private TextView mTxtMonth;
private FrameLayout mMonthBackground;
public WeekViewHolder(View itemView) {
super(itemView);
mTxtMonth = (TextView) itemView.findViewById(R.id.month_label);
mMonthBackground = (FrameLayout) itemView.findViewById(R.id.month_background);
LinearLayout daysContainer = (LinearLayout) itemView.findViewById(R.id.week_days_container);
setUpChildren(daysContainer);
}
public void bindWeek(IWeekItem weekItem, Calendar today) {
setUpMonthOverlay();
List<IDayItem> dayItems = weekItem.getDayItems();
for (int c = 0; c < dayItems.size(); c++) {
final IDayItem dayItem = dayItems.get(c);
LinearLayout cellItem = mCells.get(c);
TextView txtDay = (TextView) cellItem.findViewById(R.id.view_day_day_label);
TextView txtMonth = (TextView) cellItem.findViewById(R.id.view_day_month_label);
View circleView = cellItem.findViewById(R.id.view_day_circle_selected);
View eventIndicator1 = cellItem.findViewById(R.id.view_day_event_indicator1);
View eventIndicator2 = cellItem.findViewById(R.id.view_day_event_indicator2);
View eventIndicator3 = cellItem.findViewById(R.id.view_day_event_indicator3);
cellItem.setOnClickListener(v->BusProvider.getInstance().send(new Events.DayClickedEvent(dayItem)));
eventIndicator1.setVisibility(View.INVISIBLE);
eventIndicator2.setVisibility(View.INVISIBLE);
eventIndicator3.setVisibility(View.INVISIBLE);
Calendar dayItemCalendar = Calendar.getInstance();
dayItemCalendar.setTime(dayItem.getDate());
int eventCount = 0;
for (CalendarEvent event: mEventList) {
if (event.getStartTime().get(Calendar.YEAR) == dayItemCalendar.get(Calendar.YEAR)
&& event.getStartTime().get(Calendar.MONTH) == dayItemCalendar.get(Calendar.MONTH)
&& event.getStartTime().get(Calendar.DAY_OF_MONTH) == dayItemCalendar.get(Calendar.DAY_OF_MONTH)) {
eventCount++;
if (eventCount == 1) {
eventIndicator1.setVisibility(View.VISIBLE);
eventIndicator1.getBackground().setColorFilter(new PorterDuffColorFilter(event.getColor(),PorterDuff.Mode.MULTIPLY));
}
if (eventCount == 2) {
eventIndicator2.setVisibility(View.VISIBLE);
eventIndicator2.getBackground().setColorFilter(new PorterDuffColorFilter(event.getColor(),PorterDuff.Mode.MULTIPLY));
}
if (eventCount == 3) {
eventIndicator3.setVisibility(View.VISIBLE);
eventIndicator3.getBackground().setColorFilter(new PorterDuffColorFilter(event.getColor(),PorterDuff.Mode.MULTIPLY));
}
}
}
//Log.d("CalendarView", "Event count for day "+dayItem.getValue()+" is "+eventCount);
txtMonth.setVisibility(View.GONE);
txtDay.setTextColor(mDayTextColor);
txtMonth.setTextColor(mDayTextColor);
circleView.setVisibility(View.GONE);
txtDay.setTypeface(null, Typeface.NORMAL);
txtMonth.setTypeface(null, Typeface.NORMAL);
// Display the day
txtDay.setText(Integer.toString(dayItem.getValue()));
// Highlight first day of the month
if (dayItem.isFirstDayOfTheMonth() && !dayItem.isSelected()) {
txtMonth.setVisibility(View.VISIBLE);
txtMonth.setText(dayItem.getMonth());
txtDay.setTypeface(null, Typeface.BOLD);
txtMonth.setTypeface(null, Typeface.BOLD);
}
// Check if this day is in the past
if (today.getTime().after(dayItem.getDate()) && !DateHelper.sameDate(today, dayItem.getDate())) {
txtDay.setTextColor(mPastDayTextColor);
txtMonth.setTextColor(mPastDayTextColor);
}
// Highlight the cell if this day is today
if (dayItem.isToday() && !dayItem.isSelected()) {
txtDay.setTextColor(mCurrentDayColor);
}
if (dayItem.getShowBadge()) {
circleView.setVisibility(View.VISIBLE);
GradientDrawable drawable = (GradientDrawable) circleView.getBackground();
drawable.setStroke((int) (2 * Resources.getSystem().getDisplayMetrics().density), 0xffff0000);
}
// Show a circle if the day is selected
if (dayItem.isSelected()) {
txtDay.setTextColor(mDayTextColor);
circleView.setVisibility(View.VISIBLE);
GradientDrawable drawable = (GradientDrawable) circleView.getBackground();
drawable.setStroke((int) (1 * Resources.getSystem().getDisplayMetrics().density), mDayTextColor);
}
// Check if the month label has to be displayed
if (dayItem.getValue() == 15) {
mTxtMonth.setVisibility(View.VISIBLE);
SimpleDateFormat monthDateFormat = new SimpleDateFormat(mContext.getResources().getString(R.string.month_name_format), CalendarManager.getInstance().getLocale());
String month = monthDateFormat.format(weekItem.getDate()).toUpperCase();
if (today.get(Calendar.YEAR) != weekItem.getYear()) {
month = month + String.format(" %d", weekItem.getYear());
}
mTxtMonth.setText(month);
}
}
}
private void setUpChildren(LinearLayout daysContainer) {
mCells = new ArrayList<>();
for (int i = 0; i < daysContainer.getChildCount(); i++) {
mCells.add((LinearLayout) daysContainer.getChildAt(i));
}
}
private void setUpMonthOverlay() {
mTxtMonth.setVisibility(View.GONE);
if (isDragging()) {
AnimatorSet animatorSetFadeIn = new AnimatorSet();
animatorSetFadeIn.setDuration(FADE_DURATION);
ObjectAnimator animatorTxtAlphaIn = ObjectAnimator.ofFloat(mTxtMonth, "alpha", mTxtMonth.getAlpha(), 1f);
ObjectAnimator animatorBackgroundAlphaIn = ObjectAnimator.ofFloat(mMonthBackground, "alpha", mMonthBackground.getAlpha(), 1f);
animatorSetFadeIn.playTogether(
animatorTxtAlphaIn
//animatorBackgroundAlphaIn
);
animatorSetFadeIn.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
setAlphaSet(true);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animatorSetFadeIn.start();
} else {
AnimatorSet animatorSetFadeOut = new AnimatorSet();
animatorSetFadeOut.setDuration(FADE_DURATION);
ObjectAnimator animatorTxtAlphaOut = ObjectAnimator.ofFloat(mTxtMonth, "alpha", mTxtMonth.getAlpha(), 0f);
ObjectAnimator animatorBackgroundAlphaOut = ObjectAnimator.ofFloat(mMonthBackground, "alpha", mMonthBackground.getAlpha(), 0f);
animatorSetFadeOut.playTogether(
animatorTxtAlphaOut
//animatorBackgroundAlphaOut
);
animatorSetFadeOut.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
setAlphaSet(false);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animatorSetFadeOut.start();
}
if (isAlphaSet()) {
//mMonthBackground.setAlpha(1f);
mTxtMonth.setAlpha(1f);
} else {
//mMonthBackground.setAlpha(0f);
mTxtMonth.setAlpha(0f);
}
}
}
// endregion
}

View File

@ -1,345 +0,0 @@
package com.github.tibolte.agendacalendarview.models;
import java.util.Calendar;
/**
* Event model class containing the information to be displayed on the agenda view.
*/
public class BaseCalendarEvent implements CalendarEvent {
/**
* Id of the event.
*/
private long mId;
/**
* Color to be displayed in the agenda view.
*/
private int mColor;
/**
* Text color displayed on the background color
*/
private int mTextColor;
/**
* Title of the event.
*/
private String mTitle;
/**
* Description of the event.
*/
private String mDescription;
/**
* Where the event takes place.
*/
private String mLocation;
/**
* Calendar instance helping sorting the events per section in the agenda view.
*/
private Calendar mInstanceDay;
/**
* Start time of the event.
*/
private Calendar mStartTime;
/**
* End time of the event.
*/
private Calendar mEndTime;
/**
* Indicates if the event lasts all day.
*/
private boolean mAllDay;
/**
* Tells if this BaseCalendarEvent instance is used as a placeholder in the agenda view, if there's
* no event for that day.
*/
private boolean mPlaceHolder;
/**
* Tells if this BaseCalendarEvent instance is used as a forecast information holder in the agenda
* view.
*/
private boolean mWeather;
/**
* Duration of the event.
*/
private String mDuration;
/**
* References to a DayItem instance for that event, used to link interaction between the
* calendar view and the agenda view.
*/
private IDayItem mDayReference;
/**
* References to a WeekItem instance for that event, used to link interaction between the
* calendar view and the agenda view.
*/
private IWeekItem mWeekReference;
/**
* Weather icon string returned by the Dark Sky API.
*/
private String mWeatherIcon;
/**
* Temperature value returned by the Dark Sky API.
*/
private double mTemperature;
private boolean mShowBadge;
// region Constructor
/**
* Initializes the event
*
* @param id The id of the event.
* @param color The color of the event.
* @param textColor The color of the event description text.
* @param title The title of the event.
* @param description The description of the event.
* @param location The location of the event.
* @param dateStart The start date of the event.
* @param dateEnd The end date of the event.
* @param allDay Int that can be equal to 0 or 1.
* @param duration The duration of the event in RFC2445 format.
*/
public BaseCalendarEvent(long id, int color, int textColor, String title, String description, String location, long dateStart, long dateEnd, int allDay, String duration) {
this.mId = id;
this.mColor = color;
this.mTextColor = textColor;
this.mAllDay = (allDay == 1);
this.mDuration = duration;
this.mTitle = title;
this.mDescription = description;
this.mLocation = location;
this.mStartTime = Calendar.getInstance();
this.mStartTime.setTimeInMillis(dateStart);
this.mEndTime = Calendar.getInstance();
this.mEndTime.setTimeInMillis(dateEnd);
}
public BaseCalendarEvent() {
}
/**
* Initializes the event
* @param title The title of the event.
* @param description The description of the event.
* @param location The location of the event.
* @param color The color of the event (for display in the app).
* @param textColor The color of the event description text.
* @param startTime The start time of the event.
* @param endTime The end time of the event.
* @param allDay Indicates if the event lasts the whole day.
*/
public BaseCalendarEvent(String title, String description, String location, int color, int textColor, Calendar startTime, Calendar endTime, boolean allDay) {
this.mTitle = title;
this.mDescription = description;
this.mLocation = location;
this.mColor = color;
this.mTextColor = textColor;
this.mStartTime = startTime;
this.mEndTime = endTime;
this.mAllDay = allDay;
}
public BaseCalendarEvent(String title, String description, String location, int color, int textColor, Calendar startTime, Calendar endTime, boolean allDay, long id, boolean showBadge) {
this.mTitle = title;
this.mDescription = description;
this.mLocation = location;
this.mColor = color;
this.mTextColor = textColor;
this.mStartTime = startTime;
this.mEndTime = endTime;
this.mAllDay = allDay;
this.mId = id;
this.mShowBadge = showBadge;
}
public BaseCalendarEvent(BaseCalendarEvent calendarEvent) {
this.mId = calendarEvent.getId();
this.mColor = calendarEvent.getColor();
this.mTextColor = calendarEvent.getTextColor();
this.mAllDay = calendarEvent.isAllDay();
this.mDuration = calendarEvent.getDuration();
this.mTitle = calendarEvent.getTitle();
this.mDescription = calendarEvent.getDescription();
this.mLocation = calendarEvent.getLocation();
this.mStartTime = calendarEvent.getStartTime();
this.mEndTime = calendarEvent.getEndTime();
this.mShowBadge = calendarEvent.getShowBadge();
}
// endregion
// region Getters/Setters
public int getColor() {
return mColor;
}
public void setColor(int mColor) {
this.mColor = mColor;
}
public int getTextColor() {
return mTextColor;
}
public void setTextColor(int mTextColor) {
this.mTextColor = mTextColor;
}
public String getDescription() {
return mDescription;
}
public boolean isAllDay() {
return mAllDay;
}
public void setAllDay(boolean allDay) {
this.mAllDay = allDay;
}
public void setDescription(String mDescription) {
this.mDescription = mDescription;
}
public Calendar getInstanceDay() {
return mInstanceDay;
}
public void setInstanceDay(Calendar mInstanceDay) {
this.mInstanceDay = mInstanceDay;
this.mInstanceDay.set(Calendar.HOUR, 0);
this.mInstanceDay.set(Calendar.MINUTE, 0);
this.mInstanceDay.set(Calendar.SECOND, 0);
this.mInstanceDay.set(Calendar.MILLISECOND, 0);
this.mInstanceDay.set(Calendar.AM_PM, 0);
}
public Calendar getEndTime() {
return mEndTime;
}
public void setEndTime(Calendar mEndTime) {
this.mEndTime = mEndTime;
}
public void setPlaceholder(boolean placeholder) {
mPlaceHolder = placeholder;
}
public boolean isPlaceholder() {
return mPlaceHolder;
}
public long getId() {
return mId;
}
public void setId(long mId) {
this.mId = mId;
}
public boolean getShowBadge() {
return mShowBadge;
}
public void setShowBadge(boolean mShowBadge) {
this.mShowBadge = mShowBadge;
}
public String getLocation() {
return mLocation;
}
public void setLocation(String mLocation) {
this.mLocation = mLocation;
}
public Calendar getStartTime() {
return mStartTime;
}
public void setStartTime(Calendar mStartTime) {
this.mStartTime = mStartTime;
}
public String getTitle() {
return mTitle;
}
public void setTitle(String mTitle) {
this.mTitle = mTitle;
}
public String getDuration() {
return mDuration;
}
public void setDuration(String duration) {
this.mDuration = duration;
}
public boolean isPlaceHolder() {
return mPlaceHolder;
}
public void setPlaceHolder(boolean mPlaceHolder) {
this.mPlaceHolder = mPlaceHolder;
}
public boolean isWeather() {
return mWeather;
}
public void setWeather(boolean mWeather) {
this.mWeather = mWeather;
}
public IDayItem getDayReference() {
return mDayReference;
}
public void setDayReference(IDayItem mDayReference) {
this.mDayReference = mDayReference;
}
public IWeekItem getWeekReference() {
return mWeekReference;
}
public void setWeekReference(IWeekItem mWeekReference) {
this.mWeekReference = mWeekReference;
}
public String getWeatherIcon() {
return mWeatherIcon;
}
public void setWeatherIcon(String mWeatherIcon) {
this.mWeatherIcon = mWeatherIcon;
}
public double getTemperature() {
return mTemperature;
}
public void setTemperature(double mTemperature) {
this.mTemperature = mTemperature;
}
@Override
public CalendarEvent copy() {
return new BaseCalendarEvent(this);
}
// endregion
@Override
public String toString() {
return "BaseCalendarEvent{"
+ "title='"
+ mTitle
+ ", instanceDay= "
+ mInstanceDay.getTime()
+ "}";
}
}

View File

@ -1,63 +0,0 @@
package com.github.tibolte.agendacalendarview.models;
import java.util.Calendar;
public interface CalendarEvent {
void setPlaceholder(boolean placeholder);
boolean isPlaceholder();
public String getLocation();
public void setLocation(String mLocation);
long getId();
void setId(long mId);
boolean getShowBadge();
void setShowBadge(boolean mShowBadge);
int getTextColor();
void setTextColor(int mTextColor);
String getDescription();
void setDescription(String mDescription);
boolean isAllDay();
void setAllDay(boolean allDay);
Calendar getStartTime();
void setStartTime(Calendar mStartTime);
Calendar getEndTime();
void setEndTime(Calendar mEndTime);
String getTitle();
void setTitle(String mTitle);
Calendar getInstanceDay();
void setInstanceDay(Calendar mInstanceDay);
IDayItem getDayReference();
void setDayReference(IDayItem mDayReference);
IWeekItem getWeekReference();
void setWeekReference(IWeekItem mWeekReference);
CalendarEvent copy();
int getColor();
}

View File

@ -1,145 +0,0 @@
package com.github.tibolte.agendacalendarview.models;
import com.github.tibolte.agendacalendarview.CalendarManager;
import com.github.tibolte.agendacalendarview.utils.DateHelper;
import java.util.Calendar;
import java.util.Date;
/**
* Day model class.
*/
public class DayItem implements IDayItem {
private Date mDate;
private int mValue;
private int mDayOfTheWeek;
private boolean mToday;
private boolean mFirstDayOfTheMonth;
private boolean mSelected;
private String mMonth;
private boolean mShowBadge;
// region Constructor
public DayItem(Date date, int value, boolean today, String month) {
this.mDate = date;
this.mValue = value;
this.mToday = today;
this.mMonth = month;
}
// only for cleanDay
public DayItem() {
}
public DayItem(DayItem original) {
this.mDate = original.getDate();
this.mValue = original.getValue();
this.mToday = original.isToday();
this.mDayOfTheWeek = original.getDayOftheWeek();
this.mFirstDayOfTheMonth = original.isFirstDayOfTheMonth();
this.mSelected = original.isSelected();
this.mMonth = original.getMonth();
this.mShowBadge = original.mShowBadge;
}
// endregion
// region Getters/Setters
public Date getDate() {
return mDate;
}
public void setDate(Date date) {
this.mDate = date;
}
public int getValue() {
return mValue;
}
public void setValue(int value) {
this.mValue = value;
}
public boolean isToday() {
return mToday;
}
public void setToday(boolean today) {
this.mToday = today;
}
public boolean isSelected() {
return mSelected;
}
public void setSelected(boolean selected) {
this.mSelected = selected;
}
public boolean isFirstDayOfTheMonth() {
return mFirstDayOfTheMonth;
}
public void setFirstDayOfTheMonth(boolean firstDayOfTheMonth) {
this.mFirstDayOfTheMonth = firstDayOfTheMonth;
}
public String getMonth() {
return mMonth;
}
public void setMonth(String month) {
this.mMonth = month;
}
public int getDayOftheWeek() {
return mDayOfTheWeek;
}
public void setDayOftheWeek(int mDayOftheWeek) {
this.mDayOfTheWeek = mDayOftheWeek;
}
public void setShowBadge(boolean showBadge) {
this.mShowBadge = showBadge;
}
public boolean getShowBadge() {
return this.mShowBadge;
}
// region Public methods
public void buildDayItemFromCal(Calendar calendar) {
Date date = calendar.getTime();
this.mDate = date;
this.mValue = calendar.get(Calendar.DAY_OF_MONTH);
this.mToday = DateHelper.sameDate(calendar, CalendarManager.getInstance().getToday());
this.mMonth = CalendarManager.getInstance().getMonthHalfNameFormat().format(date);
if (this.mValue == 1) {
this.mFirstDayOfTheMonth = true;
}
}
// endregion
@Override
public String toString() {
return "DayItem{"
+ "Date='"
+ mDate.toString()
+ ", value="
+ mValue
+ '}';
}
@Override
public IDayItem copy() {
return new DayItem(this);
}
// endregion
}

View File

@ -1,49 +0,0 @@
package com.github.tibolte.agendacalendarview.models;
import java.util.Calendar;
import java.util.Date;
public interface IDayItem {
// region Getters/Setters
Date getDate();
void setDate(Date date);
int getValue();
void setValue(int value);
boolean isToday();
void setToday(boolean today);
boolean isSelected();
void setSelected(boolean selected);
boolean isFirstDayOfTheMonth();
void setFirstDayOfTheMonth(boolean firstDayOfTheMonth);
String getMonth();
void setMonth(String month);
int getDayOftheWeek();
void setDayOftheWeek(int mDayOftheWeek);
// endregion
void buildDayItemFromCal(Calendar calendar);
String toString();
IDayItem copy();
void setShowBadge(boolean showBadge);
boolean getShowBadge();
}

View File

@ -1,34 +0,0 @@
package com.github.tibolte.agendacalendarview.models;
import java.util.Date;
import java.util.List;
public interface IWeekItem {
int getWeekInYear();
void setWeekInYear(int weekInYear);
int getYear();
void setYear(int year);
int getMonth();
void setMonth(int month);
Date getDate();
void setDate(Date date);
String getLabel();
void setLabel(String label);
List<IDayItem> getDayItems();
void setDayItems(List<IDayItem> dayItems);
IWeekItem copy();
}

View File

@ -1,110 +0,0 @@
package com.github.tibolte.agendacalendarview.models;
import java.util.Date;
import java.util.List;
/**
* Week model class.
*/
public class WeekItem implements IWeekItem {
private int mWeekInYear;
private int mYear;
private int mMonth;
private Date mDate;
private String mLabel;
private List<IDayItem> mDayItems;
// region Constructor
public WeekItem(int weekInYear, int year, Date date, String label, int month) {
this.mWeekInYear = weekInYear;
this.mYear = year;
this.mDate = date;
this.mLabel = label;
this.mMonth = month;
}
public WeekItem(WeekItem original) {
this.mWeekInYear = original.getWeekInYear();
this.mYear = original.getYear();
this.mMonth = original.getMonth();
this.mDate = original.getDate();
this.mLabel = original.getLabel();
this.mDayItems = original.getDayItems();
}
public WeekItem(){
}
// endregion
// region Getters/Setters
public int getWeekInYear() {
return mWeekInYear;
}
public void setWeekInYear(int weekInYear) {
this.mWeekInYear = weekInYear;
}
public int getYear() {
return mYear;
}
public void setYear(int year) {
this.mYear = year;
}
public int getMonth() {
return mMonth;
}
public void setMonth(int month) {
this.mMonth = month;
}
public Date getDate() {
return mDate;
}
public void setDate(Date date) {
this.mDate = date;
}
public String getLabel() {
return mLabel;
}
public void setLabel(String label) {
this.mLabel = label;
}
public List<IDayItem> getDayItems() {
return mDayItems;
}
public void setDayItems(List<IDayItem> dayItems) {
this.mDayItems = dayItems;
}
@Override
public IWeekItem copy() {
return new WeekItem(this);
}
// endregion
@Override
public String toString() {
return "WeekItem{"
+ "label='"
+ mLabel
+ '\''
+ ", weekInYear="
+ mWeekInYear
+ ", year="
+ mYear
+ '}';
}
}

View File

@ -1,82 +0,0 @@
package com.github.tibolte.agendacalendarview.render;
import android.content.Context;
import android.content.res.Resources;
import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.core.content.ContextCompat;
import android.graphics.Color;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.github.tibolte.agendacalendarview.R;
import com.github.tibolte.agendacalendarview.models.BaseCalendarEvent;
import com.google.android.material.internal.ViewUtils;
/**
* Class helping to inflate our default layout in the AgendaAdapter
*/
public class DefaultEventRenderer extends EventRenderer<BaseCalendarEvent> {
public static int themeAttributeToColor(int themeAttributeId,
Context context,
int fallbackColorId) {
TypedValue outValue = new TypedValue();
Resources.Theme theme = context.getTheme();
boolean wasResolved =
theme.resolveAttribute(
themeAttributeId, outValue, true);
if (wasResolved) {
return ContextCompat.getColor(
context, outValue.resourceId);
} else {
// fallback colour handling
return fallbackColorId;
}
}
// region class - EventRenderer
@Override
public void render(@NonNull View view, @NonNull BaseCalendarEvent event) {
CardView card = view.findViewById(R.id.view_agenda_event_card_view);
TextView txtTitle = view.findViewById(R.id.view_agenda_event_title);
TextView txtLocation = view.findViewById(R.id.view_agenda_event_location);
LinearLayout descriptionContainer = view.findViewById(R.id.view_agenda_event_description_container);
LinearLayout locationContainer = view.findViewById(R.id.view_agenda_event_location_container);
descriptionContainer.setVisibility(View.VISIBLE);
txtTitle.setText(event.getTitle());
txtLocation.setText(event.getLocation());
if (event.getLocation().length() > 0) {
locationContainer.setVisibility(View.VISIBLE);
txtLocation.setText(event.getLocation());
} else {
locationContainer.setVisibility(View.GONE);
}
if (!event.isPlaceholder()/*!event.getTitle().equals(view.getResources().getString(R.string.agenda_event_no_events))*/) {
txtTitle.setTextColor(event.getTextColor());
card.setCardBackgroundColor(event.getColor());
txtLocation.setTextColor(event.getTextColor());
}
else {
card.setCardBackgroundColor(Color.TRANSPARENT);
card.setCardElevation(0);
card.setBackgroundColor(Color.TRANSPARENT);
card.setRadius(0);
card.setBackgroundDrawable(null);
}
}
@Override
public int getEventLayout() {
return R.layout.view_agenda_event;
}
// endregion
}

View File

@ -1,23 +0,0 @@
package com.github.tibolte.agendacalendarview.render;
import androidx.annotation.LayoutRes;
import android.view.View;
import com.github.tibolte.agendacalendarview.models.CalendarEvent;
import java.lang.reflect.ParameterizedType;
/**
* Base class for helping layout rendering
*/
public abstract class EventRenderer<T extends CalendarEvent> {
public abstract void render(final View view, final T event);
@LayoutRes
public abstract int getEventLayout();
public Class<T> getRenderType() {
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
return (Class<T>) type.getActualTypeArguments()[0];
}
}

View File

@ -1,36 +0,0 @@
package com.github.tibolte.agendacalendarview.utils;
import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;
public class BusProvider {
public static BusProvider mInstance;
private final Subject<Object, Object> mBus = new SerializedSubject<>(PublishSubject.create());
// region Constructors
public static BusProvider getInstance() {
if (mInstance == null) {
mInstance = new BusProvider();
}
return mInstance;
}
// endregion
// region Public methods
public void send(Object object) {
mBus.onNext(object);
}
public Observable<Object> toObserverable() {
return mBus;
}
// endregion
}

View File

@ -1,135 +0,0 @@
package com.github.tibolte.agendacalendarview.utils;
import com.github.tibolte.agendacalendarview.CalendarManager;
import com.github.tibolte.agendacalendarview.R;
import com.github.tibolte.agendacalendarview.models.IWeekItem;
import android.content.Context;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
/**
* Class containing helper functions for dates
*/
public class DateHelper {
// region Public methods
/**
* Check if two Calendar instances have the same time (by month, year and day of month)
*
* @param cal The first Calendar instance.
* @param selectedDate The second Calendar instance.
* @return True if both instances have the same time.
*/
public static boolean sameDate(Calendar cal, Calendar selectedDate) {
return cal.get(Calendar.MONTH) == selectedDate.get(Calendar.MONTH)
&& cal.get(Calendar.YEAR) == selectedDate.get(Calendar.YEAR)
&& cal.get(Calendar.DAY_OF_MONTH) == selectedDate.get(Calendar.DAY_OF_MONTH);
}
/**
* Check if a Date instance and a Calendar instance have the same time (by month, year and day
* of month)
*
* @param cal The Calendar instance.
* @param selectedDate The Date instance.
* @return True if both have the same time.
*/
public static boolean sameDate(Calendar cal, Date selectedDate) {
Calendar selectedCal = Calendar.getInstance();
selectedCal.setTime(selectedDate);
return cal.get(Calendar.MONTH) == selectedCal.get(Calendar.MONTH)
&& cal.get(Calendar.YEAR) == selectedCal.get(Calendar.YEAR)
&& cal.get(Calendar.DAY_OF_MONTH) == selectedCal.get(Calendar.DAY_OF_MONTH);
}
/**
* Check if a Date instance is between two Calendar instances' dates (inclusively) in time.
*
* @param selectedDate The date to verify.
* @param startCal The start time.
* @param endCal The end time.
* @return True if the verified date is between the two specified dates.
*/
public static boolean isBetweenInclusive(Date selectedDate, Calendar startCal, Calendar endCal) {
Calendar selectedCal = Calendar.getInstance();
selectedCal.setTime(selectedDate);
// Check if we deal with the same day regarding startCal and endCal
return sameDate(selectedCal, startCal) || selectedCal.after(startCal) && selectedCal.before(endCal);
}
/**
* Check if Calendar instance's date is in the same week, as the WeekItem instance.
*
* @param cal The Calendar instance to verify.
* @param week The WeekItem instance to compare to.
* @return True if both instances are in the same week.
*/
public static boolean sameWeek(Calendar cal, IWeekItem week) {
return (cal.get(Calendar.WEEK_OF_YEAR) == week.getWeekInYear() && cal.get(Calendar.YEAR) == week.getYear());
}
/**
* Convert a millisecond duration to a string format
*
* @param millis A duration to convert to a string form
* @return A string of the form "Xd" or either "XhXm".
*/
public static String getDuration(Context context, long millis) {
if (millis < 0) {
throw new IllegalArgumentException("Duration must be greater than zero!");
}
long days = TimeUnit.MILLISECONDS.toDays(millis);
millis -= TimeUnit.DAYS.toMillis(days);
long hours = TimeUnit.MILLISECONDS.toHours(millis);
millis -= TimeUnit.HOURS.toMillis(hours);
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
StringBuilder sb = new StringBuilder(64);
if (days > 0) {
sb.append(days);
sb.append(context.getResources().getString(R.string.agenda_event_day_duration));
return (sb.toString());
} else {
if (hours > 0) {
sb.append(hours);
sb.append("h");
}
if (minutes > 0) {
sb.append(minutes);
sb.append("m");
}
}
return (sb.toString());
}
/**
* Used for displaying the date in any section of the agenda view.
*
* @param calendar The date of the section.
* @param locale The locale used by the Sunrise calendar.
* @return The formatted date without the year included.
*/
public static String getYearLessLocalizedDate(Calendar calendar, Locale locale) {
SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getDateInstance(DateFormat.FULL, CalendarManager.getInstance().getLocale());
String pattern = sdf.toPattern();
String yearLessPattern = pattern.replaceAll("\\W?[Yy]+\\W?", "");
SimpleDateFormat yearLessSDF = new SimpleDateFormat(yearLessPattern, locale);
String yearLessDate = yearLessSDF.format(calendar.getTime()).toUpperCase();
if (yearLessDate.endsWith(",")) {
yearLessDate = yearLessDate.substring(0, yearLessDate.length() - 1);
}
return yearLessDate;
}
// endregion
}

View File

@ -1,43 +0,0 @@
package com.github.tibolte.agendacalendarview.utils;
import com.github.tibolte.agendacalendarview.models.IDayItem;
import java.util.Calendar;
/**
* Events emitted by the bus provider.
*/
public class Events {
public static class DayClickedEvent {
public Calendar mCalendar;
public IDayItem mDayItem;
public DayClickedEvent(IDayItem dayItem) {
this.mCalendar = Calendar.getInstance();
this.mCalendar.setTime(dayItem.getDate());
this.mDayItem = dayItem;
}
public Calendar getCalendar() {
return mCalendar;
}
public IDayItem getDay() {
return mDayItem;
}
}
public static class CalendarScrolledEvent {
}
public static class AgendaListViewTouchedEvent {
}
public static class EventsFetched {
}
public static class ForecastFetched {
}
}

View File

@ -1,114 +0,0 @@
package com.github.tibolte.agendacalendarview.utils;
import com.github.tibolte.agendacalendarview.agenda.AgendaListView;
import android.util.SparseArray;
import android.view.View;
/**
* Helper class calculating the scrolling distance in the AgendaListView.
*/
public class ListViewScrollTracker {
private AgendaListView mListView;
private SparseArray<Integer> mPositions;
private SparseArray<Integer> mListViewItemHeights = new SparseArray<>();
private int mFirstVisiblePosition;
private int mReferencePosition = -1; // Position of the current date in the Agenda listView
// region Constructor and Accessor(s)
public ListViewScrollTracker(AgendaListView listView) {
mListView = listView;
}
public int getReferencePosition() {
return mReferencePosition;
}
// endregion
// region Public methods
/**
* Call from an AbsListView.OnScrollListener to calculate the incremental offset (change in
* scroll offset
* since the last calculation).
*
* @param firstVisiblePosition First visible item position in the list.
* @param visibleItemCount Number of visible items in the list.
* @return The incremental offset, or 0 if it wasn't possible to calculate the offset.
*/
public int calculateIncrementalOffset(int firstVisiblePosition, int visibleItemCount) {
// Remember previous positions, if any
SparseArray<Integer> previousPositions = mPositions;
// Store new positions
mPositions = new SparseArray<>();
for (int i = 0; i < visibleItemCount; i++) {
mPositions.put(firstVisiblePosition + i, mListView.getListChildAt(i).getTop());
}
if (previousPositions != null) {
// Find position which exists in both mPositions and previousPositions, then return the difference
// of the new and old Y values.
for (int i = 0; i < previousPositions.size(); i++) {
int previousPosition = previousPositions.keyAt(i);
int previousTop = previousPositions.get(previousPosition);
Integer newTop = mPositions.get(previousPosition);
if (newTop != null) {
return newTop - previousTop;
}
}
}
return 0; // No view's position was in both previousPositions and mPositions
}
/**
* Call from an AbsListView.OnScrollListener to calculate the scrollY (Here
* we definite as the distance in pixels compared to the position representing the current
* date).
*
* @param firstVisiblePosition First visible item position in the list.
* @param visibleItemCount Number of visible items in the list.
* @return Distance in pixels compared to current day position (negative if firstVisiblePosition less than mReferencePosition)
*/
public int calculateScrollY(int firstVisiblePosition, int visibleItemCount) {
mFirstVisiblePosition = firstVisiblePosition;
if (mReferencePosition < 0) {
mReferencePosition = mFirstVisiblePosition;
}
if (visibleItemCount > 0) {
View c = mListView.getListChildAt(0); // this is the first visible row
int scrollY = -c.getTop();
mListViewItemHeights.put(firstVisiblePosition, c.getMeasuredHeight());
if (mFirstVisiblePosition >= mReferencePosition) {
for (int i = mReferencePosition; i < firstVisiblePosition; ++i) {
if (mListViewItemHeights.get(i) == null) {
mListViewItemHeights.put(i, c.getMeasuredHeight());
}
scrollY += mListViewItemHeights.get(i); // add all heights of the views that are gone
}
return scrollY;
} else {
for (int i = mReferencePosition - 1; i >= firstVisiblePosition; --i) {
if (mListViewItemHeights.get(i) == null) {
mListViewItemHeights.put(i, c.getMeasuredHeight());
}
scrollY -= mListViewItemHeights.get(i);
}
return scrollY;
}
}
return 0;
}
public void clear() {
mPositions = null;
}
// endregion
}

View File

@ -1,110 +0,0 @@
package com.github.tibolte.agendacalendarview.widgets;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Interpolator;
/**
* Floating action button helping to scroll back to the current date.
*/
public class FloatingActionButton extends com.google.android.material.floatingactionbutton.FloatingActionButton {
private static final int TRANSLATE_DURATION_MILLIS = 200;
private boolean mVisible = true;
private final Interpolator mInterpolator = new AccelerateDecelerateInterpolator();
// region Constructors
public FloatingActionButton(Context context) {
super(context);
}
public FloatingActionButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// endregion
// region Overrides
@Override
public void show() {
show(true);
}
@Override
public void hide() {
hide(true);
}
// endregion
// region Public methods
public void show(boolean animate) {
toggle(true, animate, false);
}
public void hide(boolean animate) {
toggle(false, animate, false);
}
public boolean isVisible() {
return mVisible;
}
// endregion
// region Private methods
private void toggle(final boolean visible, final boolean animate, boolean force) {
if (mVisible != visible || force) {
mVisible = visible;
int height = getHeight();
if (height == 0 && !force) {
ViewTreeObserver vto = getViewTreeObserver();
if (vto.isAlive()) {
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
ViewTreeObserver currentVto = getViewTreeObserver();
if (currentVto.isAlive()) {
currentVto.removeOnPreDrawListener(this);
}
toggle(visible, animate, true);
return true;
}
});
return;
}
}
int translationY = visible ? 0 : height + getMarginBottom();
if (animate) {
animate().setInterpolator(mInterpolator)
.setDuration(TRANSLATE_DURATION_MILLIS)
.translationY(translationY);
} else {
setTranslationY(translationY);
}
}
}
private int getMarginBottom() {
int marginBottom = 0;
final ViewGroup.LayoutParams layoutParams = getLayoutParams();
if (layoutParams instanceof ViewGroup.MarginLayoutParams) {
marginBottom = ((ViewGroup.MarginLayoutParams) layoutParams).bottomMargin;
}
return marginBottom;
}
// endregion
}

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<stroke android:width="2dp" android:color="@color/theme_primary"/>
<solid android:color="@android:color/transparent" />
</shape>

View File

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#ffffff" />
</shape>

View File

@ -1,7 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="#fff" android:pathData="M7,10H12V15H7M19,19H5V8H19M19,3H18V1H16V3H8V1H6V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3Z" />
</vector>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<stroke android:width="1dp" android:color="@color/theme_text_icons"/>
<solid android:color="@android:color/transparent" />
</shape>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="270"
android:startColor="#88444444"
android:endColor="#00000000" />
</shape>

View File

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/week_days_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<include layout="@layout/view_day_cell" />
<include layout="@layout/view_day_cell" />
<include layout="@layout/view_day_cell" />
<include layout="@layout/view_day_cell" />
<include layout="@layout/view_day_cell" />
<include layout="@layout/view_day_cell" />
<include layout="@layout/view_day_cell" />
</LinearLayout>
<FrameLayout
android:id="@+id/month_background"
android:layout_width="match_parent"
android:layout_height="@dimen/day_cell_height"
android:alpha="0"
android:background="@color/calendar_month_transparent_background" />
<TextView
android:id="@+id/month_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:alpha="0"
tools:alpha="1"
android:textColor="@android:color/black"
android:textSize="17sp"
android:textStyle="bold"
tools:text="MAJ" />
</RelativeLayout>

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<View
android:id="@+id/view_shadow"
android:layout_width="match_parent"
android:layout_height="5dp"
android:background="@drawable/shadow"
android:visibility="visible"/>
<com.github.tibolte.agendacalendarview.agenda.AgendaListView
android:id="@+id/agenda_listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animationCache="false"
android:divider="@color/agenda_list_header_divider"
android:dividerHeight="1dp"
android:overScrollMode="never"
android:scrollbars="none"
android:scrollingCache="false" />
</merge>

View File

@ -1,53 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.github.tibolte.agendacalendarview.agenda.AgendaEventView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:gravity="center_vertical"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:id="@+id/view_agenda_event_card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:cardBackgroundColor="@color/blue_selected"
app:cardCornerRadius="5dp">
<LinearLayout
android:id="@+id/view_agenda_event_description_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/view_agenda_event_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="16sp"
tools:text="sprawdzian - Biotechnologia" />
<LinearLayout
android:id="@+id/view_agenda_event_location_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/view_agenda_event_location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/calendar_text_default"
android:textSize="12sp"
tools:text="9:05, biologia, Beata Pudełko, 1B3T" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
</com.github.tibolte.agendacalendarview.agenda.AgendaEventView>

View File

@ -1,64 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.github.tibolte.agendacalendarview.agenda.AgendaHeaderView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/view_agenda_day_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="18sp"
android:visibility="visible" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp">
<View
android:id="@+id/view_day_circle_selected"
android:layout_width="@dimen/circle_day_size"
android:layout_height="@dimen/circle_day_size"
android:background="@drawable/agenda_day_circle"
android:visibility="invisible"
tools:visibility="visible" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:orientation="vertical">
<TextView
android:id="@+id/view_agenda_day_of_month"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textSize="20sp"
tools:text="24" />
<TextView
android:id="@+id/view_agenda_day_of_week"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:textSize="12sp"
android:visibility="visible"
tools:text="śr." />
</LinearLayout>
</FrameLayout>
</FrameLayout>
</com.github.tibolte.agendacalendarview.agenda.AgendaHeaderView>

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<com.github.tibolte.agendacalendarview.calendar.CalendarView
android:id="@+id/calendar_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<com.github.tibolte.agendacalendarview.agenda.AgendaView
android:id="@+id/agenda_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.github.tibolte.agendacalendarview.agenda.AgendaView>
<com.github.tibolte.agendacalendarview.widgets.FloatingActionButton
android:id="@+id/floating_action_button"
style="@style/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="center" />
</merge>

View File

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:parentTag="LinearLayout"
tools:orientation="vertical">
<!-- Day names labels -->
<LinearLayout
android:id="@+id/cal_day_names"
android:layout_width="match_parent"
android:layout_height="@dimen/calendar_header_height"
android:orientation="horizontal">
<include layout="@layout/view_day_calendar_header" />
<include layout="@layout/view_day_calendar_header" />
<include layout="@layout/view_day_calendar_header" />
<include layout="@layout/view_day_calendar_header" />
<include layout="@layout/view_day_calendar_header" />
<include layout="@layout/view_day_calendar_header" />
<include layout="@layout/view_day_calendar_header" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginTop="2dp"
android:background="#ff7f7f7f" />
<com.github.tibolte.agendacalendarview.calendar.weekslist.WeekListView
android:id="@+id/list_week"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:cacheColorHint="@android:color/transparent"
android:divider="@color/calendar_divider_color"
android:dividerHeight="1dp"
android:drawSelectorOnTop="false"
android:listSelector="@android:color/transparent"
android:overScrollMode="never"
android:scrollbars="none" />
</merge>

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:textColor="@android:color/white"
tools:text="pon." />

View File

@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="0dip"
android:layout_height="@dimen/day_cell_height"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/view_day_month_label"
style="@style/CalendarCellText"
android:visibility="gone"
tools:text="maj" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<View
android:id="@+id/view_day_circle_selected"
android:layout_width="@dimen/circle_selected_size"
android:layout_height="@dimen/circle_selected_size"
android:background="@drawable/selected_day_color_circle"
android:visibility="gone" />
<TextView
android:id="@+id/view_day_day_label"
style="@style/CalendarCellText"
android:layout_gravity="center"
tools:text="1" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="10dp"
android:layout_gravity="bottom"
android:gravity="center"
android:orientation="horizontal">
<View
android:id="@+id/view_day_event_indicator3"
android:layout_width="10dp"
android:layout_height="10dp"
android:layout_marginStart="3dp"
android:layout_marginLeft="3dp"
android:background="@drawable/event_color_circle"
android:visibility="invisible" />
<View
android:id="@+id/view_day_event_indicator2"
android:layout_width="10dp"
android:layout_height="10dp"
android:layout_marginStart="3dp"
android:layout_marginLeft="3dp"
android:background="@drawable/event_color_circle"
android:visibility="invisible" />
<View
android:id="@+id/view_day_event_indicator1"
android:layout_width="10dp"
android:layout_height="10dp"
android:layout_marginStart="3dp"
android:layout_marginLeft="3dp"
android:background="@drawable/event_color_circle"
android:visibility="invisible" />
</LinearLayout>
</FrameLayout>
</LinearLayout>

View File

@ -1,12 +0,0 @@
<resources>
<!-- Agenda -->
<string name="today">Today</string>
<string name="tomorrow">Tomorrow</string>
<string name="agenda_event_day_duration">d</string>
<string name="agenda_event_all_day">All day</string>
<string name="agenda_event_no_events">No events</string>
<!-- Weather -->
<string name="month_name_format">LLLL</string>
<string name="month_half_name_format">MMM</string>
</resources>

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ColorOptionsView">
<attr name="agendaCurrentDayTextColor" format="color" />
<attr name="calendarHeaderColor" format="color" />
<attr name="calendarHeaderTextColor" format="color" />
<attr name="calendarColor" format="color" />
<attr name="calendarDayTextColor" format="color" />
<attr name="calendarPastDayTextColor" format="color" />
<attr name="calendarCurrentDayTextColor" format="color" />
<attr name="fabColor" format="color" />
</declare-styleable>
</resources>

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Colors for Calendar view -->
<color name="calendar_text_current_day">#000000</color>
<color name="calendar_text_default">#9C9CA0</color>
<color name="calendar_month_transparent_background">#CCFFFFFF</color>
<color name="calendar_divider_color">#F3F3F3</color>
<!-- Colors for Agenda view -->
<!--<color name="agenda_list_header_divider">#666666</color>-->
<color name="agenda_list_header_divider">#00000000</color>
<!-- General -->
<color name="blue_selected">#2196F3</color>
<color name="theme_primary_dark">#1976D2</color>
<color name="theme_primary">#2196F3</color>
<color name="theme_light_primary">#BBDEFB</color>
<color name="theme_accent">#4caf50</color>
<color name="theme_text_icons">#FFFFFF</color>
</resources>

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Calendar values -->
<dimen name="calendar_header_height">20dp</dimen>
<dimen name="day_cell_height">52dp</dimen>
<dimen name="text_day_size">14dp</dimen>
<dimen name="circle_selected_size">32dp</dimen>
<!-- Agenda values -->
<dimen name="circle_day_size">60dp</dimen>
<!-- Floating action button values -->
<!--<dimen name="fab_size">56dp</dimen>-->
<dimen name="agenda_event_view_padding_left">70dp</dimen>
<dimen name="agenda_event_view_padding_top">5dp</dimen>
<dimen name="agenda_event_view_padding_right">15dp</dimen>
<dimen name="agenda_event_view_padding_bottom">5dp</dimen>
</resources>

View File

@ -1,14 +0,0 @@
<resources>
<!-- Calendar -->
<string name="month_name_format">LLLL</string>
<string name="day_name_format" translatable="false">E</string>
<!-- Agenda -->
<string name="today">Dziś</string>
<string name="tomorrow">Jutro</string>
<string name="agenda_event_day_duration">d</string>
<string name="agenda_event_all_day">Cały dzień</string>
<string name="agenda_event_no_events">Brak wydarzeń</string>
<string name="month_half_name_format">MMM</string>
</resources>

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Calendar styles -->
<style name="CalendarCellText">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:textColor">@color/calendar_text_default</item>
<item name="android:textStyle">normal</item>
<item name="android:textSize">@dimen/text_day_size</item>
</style>
<!-- Agenda styles -->
<!-- FAB -->
<style name="fab">
<item name="android:src">@drawable/fab_arrow</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_gravity">bottom|start</item>
<item name="android:layout_margin">16dp</item>
<item name="elevation">8dp</item>
<item name="fabSize">normal</item>
<item name="pressedTranslationZ">6dp</item>
</style>
</resources>

View File

@ -1 +0,0 @@
/build

View File

@ -1,29 +0,0 @@
/*
* Copyright (c) Kuba Szczodrzyński 2020-3-28.
*/
apply plugin: 'java-library'
apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
sourceCompatibility = "7"
targetCompatibility = "7"
repositories {
mavenCentral()
}
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}

View File

@ -1,14 +0,0 @@
/*
* Copyright (c) Kuba Szczodrzyński 2020-3-28.
*/
package pl.szczodrzynski.edziennik.annotation
import kotlin.reflect.KClass
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class SelectiveDao(
val db: KClass<*>
)

View File

@ -1,13 +0,0 @@
/*
* Copyright (c) Kuba Szczodrzyński 2020-3-28.
*/
package pl.szczodrzynski.edziennik.annotation
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class UpdateSelective(
val primaryKeys: Array<String>,
val skippedColumns: Array<String> = []
)

View File

@ -1,21 +1,21 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'
android {
signingConfigs {
}
compileSdkVersion setup.compileSdk
defaultConfig {
applicationId 'pl.szczodrzynski.edziennik'
minSdkVersion setup.minSdk
targetSdkVersion setup.targetSdk
versionCode release.versionCode
versionName release.versionName
multiDexEnabled true
multiDexEnabled = true
externalNativeBuild {
cmake {
@ -28,41 +28,35 @@ android {
variant.outputs.all {
if (variant.buildType.name == "release") {
outputFileName = "Edziennik_" + defaultConfig.versionName + ".apk"
} else if (variant.buildType.name == "debugMinify") {
outputFileName = "Edziennik_" + defaultConfig.versionName + "_debugMinify.apk"
} else {
outputFileName = "Edziennik_" + defaultConfig.versionName + "_debug.apk"
}
}
}
debug {
minifyEnabled false
minifyEnabled = false
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt')
minifyEnabled = true
shrinkResources = true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
proguardFiles fileTree('proguard').asList().toArray()
}
}
dependencies {
implementation "com.google.firebase:firebase-core:${versions.firebase}"
}
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
lintOptions {
checkReleaseBuilds false
checkReleaseBuilds = false
}
buildFeatures {
dataBinding = true
viewBinding = true
}
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility '1.8'
targetCompatibility '1.8'
}
productFlavors {
coreLibraryDesugaringEnabled = true
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
@ -76,145 +70,93 @@ android {
version "3.10.2"
}
}
ndkVersion '21.3.6528147'
}
/*task finalizeBundleDebug(type: Copy) {
from("debug/debug")
include "app.aab"
destinationDir file("debug/debug")
rename "app.aab", "Edziennik_debug.aab"
}
// it finalizes :bundleRelease
task finalizeBundleRelease(type: Copy) {
from("release/release")
include "app.aab"
destinationDir file("release/release")
rename "app.aab", "Edziennik_${android.defaultConfig.versionCode}.aab"
}*/
/*
// this adds the above two tasks
tasks.whenTaskAdded { task ->
if (task.name == "bundleDebug") {
task.finalizedBy finalizeBundleDebug
} else if (task.name == "bundleRelease") {
task.finalizedBy finalizeBundleRelease
}
}*/
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1'
// Language cores
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5"
kapt "androidx.room:room-compiler:${versions.room}"
debugImplementation "com.amitshekhar.android:debug-db:1.0.5"
// Android Jetpack
implementation "androidx.appcompat:appcompat:1.2.0"
implementation "androidx.cardview:cardview:1.0.0"
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
implementation "androidx.core:core-ktx:1.3.2"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0"
implementation "androidx.navigation:navigation-fragment-ktx:2.3.4"
implementation "androidx.recyclerview:recyclerview:1.1.0"
implementation "androidx.room:room-runtime:2.2.6"
implementation "androidx.work:work-runtime-ktx:2.5.0"
kapt "androidx.room:room-compiler:2.2.6"
implementation "android.arch.navigation:navigation-fragment-ktx:${versions.navigationFragment}"
implementation "androidx.appcompat:appcompat:${versions.appcompat}"
implementation "androidx.cardview:cardview:${versions.cardView}"
implementation "androidx.constraintlayout:constraintlayout:${versions.constraintLayout}"
implementation "androidx.core:core-ktx:${versions.ktx}"
implementation "androidx.gridlayout:gridlayout:${versions.gridLayout}"
implementation "androidx.legacy:legacy-support-v4:${versions.legacy}"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:${versions.lifecycle}"
implementation "androidx.recyclerview:recyclerview:${versions.recyclerView}"
implementation "androidx.room:room-runtime:${versions.room}"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions.kotlin}"
// Google design libs
implementation "com.google.android.material:material:1.3.0"
implementation "com.google.android:flexbox:2.0.1"
implementation "com.google.android.gms:play-services-wearable:${versions.play_services}"
implementation "com.google.android.material:material:${versions.material}"
implementation "com.google.firebase:firebase-messaging:${versions.firebasemessaging}"
// Play Services/Firebase
implementation "com.google.android.gms:play-services-wearable:17.0.0"
implementation "com.google.firebase:firebase-core:18.0.2"
implementation "com.google.firebase:firebase-crashlytics:17.4.0"
implementation("com.google.firebase:firebase-messaging") { version { strictly "20.1.3" } }
//implementation "com.github.kuba2k2.MaterialDrawer:library:e603091449"
implementation "com.mikepenz:crossfader:1.6.0" // do not update
implementation "com.mikepenz:iconics-core:${versions.iconics}"
implementation "com.mikepenz:iconics-views:${versions.iconics}"
implementation "com.mikepenz:community-material-typeface:${versions.font_cmd}@aar"
implementation "com.mikepenz:materialize:1.2.1"
// OkHttp, Retrofit, Gson, Jsoup
implementation("com.squareup.okhttp3:okhttp") { version { strictly "3.12.13" } }
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
implementation "com.squareup.retrofit2:converter-scalars:2.9.0"
implementation 'com.google.code.gson:gson:2.8.6'
implementation "org.jsoup:jsoup:1.13.1"
implementation "pl.droidsonroids:jspoon:1.3.2"
implementation "pl.droidsonroids.retrofit2:converter-jspoon:1.3.2"
implementation "com.github.kuba2k2:NavLib:${versions.navlib}"
// Szkolny.eu libraries/forks
implementation "eu.szkolny:agendacalendarview:1799f8ef47"
implementation "eu.szkolny:cafebar:5bf0c618de"
implementation "eu.szkolny.fslogin:lib:2.0.0"
implementation "eu.szkolny:material-about-library:0534abf316"
implementation "eu.szkolny:mhttp:af4b62e6e9"
implementation "eu.szkolny:nachos:0e5dfcaceb"
implementation "eu.szkolny.selective-dao:annotation:27f8f3f194"
implementation "pl.szczodrzynski:navlib:0.7.2"
implementation "pl.szczodrzynski:numberslidingpicker:2921225f76"
implementation "pl.szczodrzynski:recyclertablayout:700f980584"
implementation "pl.szczodrzynski:tachyon:551943a6b5"
kapt "eu.szkolny.selective-dao:codegen:27f8f3f194"
implementation "com.afollestad.material-dialogs:commons:${versions.materialdialogs}"
implementation "com.afollestad.material-dialogs:core:${versions.materialdialogs}"
// Iconics & related
implementation "com.mikepenz:iconics-core:5.2.8"
implementation "com.mikepenz:iconics-views:5.2.8"
implementation "com.mikepenz:community-material-typeface:5.8.55.0-kotlin@aar"
implementation "eu.szkolny:szkolny-font:1dab7d64ed"
implementation "cat.ereza:customactivityoncrash:2.2.0"
// Other dependencies
implementation "cat.ereza:customactivityoncrash:2.3.0"
implementation "com.afollestad.material-dialogs:commons:0.9.6.0"
implementation "com.afollestad.material-dialogs:core:0.9.6.0"
implementation "com.applandeo:material-calendar-view:1.5.0"
implementation 'com.google.firebase:firebase-crashlytics:17.3.1'
implementation "com.daimajia.swipelayout:library:1.2.0@aar"
implementation "com.evernote:android-job:1.2.6"
implementation "com.github.antonKozyriatskyi:CircularProgressIndicator:1.2.2"
implementation "com.github.bassaer:chatmessageview:2.0.1"
implementation("com.github.ozodrukh:CircularReveal:2.0.1@aar") {transitive = true}
implementation "com.heinrichreimersoftware:material-intro:1.5.8" // do not update
implementation "com.jaredrummler:colorpicker:1.0.2"
implementation("com.squareup.okhttp3:okhttp") {
version {
strictly "3.12.13"
}
}
implementation "com.theartofdev.edmodo:android-image-cropper:2.8.0" // do not update
implementation "com.wdullaer:materialdatetimepicker:4.1.2"
implementation "com.github.ChuckerTeam.Chucker:library:3.0.1"
implementation "com.github.jetradarmobile:android-snowfall:1.2.0"
implementation "com.github.wulkanowy.uonet-request-signer:hebe-jvm:a99ca50a31"
implementation("com.heinrichreimersoftware:material-intro") { version { strictly "1.5.8" } }
implementation "com.hypertrack:hyperlog:0.0.10"
implementation "com.jaredrummler:colorpicker:1.1.0"
implementation "com.qifan.powerpermission:powerpermission-coroutines:1.3.0"
implementation "com.qifan.powerpermission:powerpermission:1.3.0"
implementation "com.theartofdev.edmodo:android-image-cropper:2.8.0"
implementation "com.wdullaer:materialdatetimepicker:4.2.3"
implementation "com.yuyh.json:jsonviewer:1.0.6"
implementation "io.coil-kt:coil:1.1.1"
implementation "me.dm7.barcodescanner:zxing:1.9.8"
implementation "me.grantland:autofittextview:0.2.1"
implementation "me.leolin:ShortcutBadger:1.1.22@aar"
implementation "org.greenrobot:eventbus:3.1.1"
implementation "org.jsoup:jsoup:1.12.1"
implementation "pl.droidsonroids.gif:android-gif-drawable:1.2.15"
//implementation "se.emilsjolander:stickylistheaders:2.7.0"
implementation 'com.github.edisonw:StickyListHeaders:master-SNAPSHOT@aar'
implementation "uk.co.samuelwall:material-tap-target-prompt:2.14.0"
implementation "org.greenrobot:eventbus:3.2.0"
implementation("pl.droidsonroids.gif:android-gif-drawable") { version { strictly "1.2.15" } }
implementation project(":agendacalendarview")
implementation project(":cafebar")
implementation project(":material-about-library")
implementation project(":mhttp")
implementation project(":nachos")
//implementation project(":Navigation")
implementation project(":szkolny-font")
implementation "com.github.ChuckerTeam.Chucker:library:3.0.1"
//releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:3.0.1"
//implementation 'com.github.wulkanowy:uonet-request-signer:master-SNAPSHOT'
//implementation 'com.github.kuba2k2.uonet-request-signer:android:master-63f094b14a-1'
//implementation "org.redundent:kotlin-xml-builder:1.5.3"
implementation 'com.github.wulkanowy.uonet-request-signer:hebe-jvm:a99ca50a31'
implementation "androidx.work:work-runtime-ktx:${versions.work}"
implementation 'com.hypertrack:hyperlog:0.0.10'
implementation 'com.github.kuba2k2:RecyclerTabLayout:700f980584'
implementation 'com.github.kuba2k2:Tachyon:551943a6b5'
implementation "com.squareup.retrofit2:retrofit:${versions.retrofit}"
implementation "com.squareup.retrofit2:converter-gson:${versions.retrofit}"
implementation 'com.github.jetradarmobile:android-snowfall:1.2.0'
implementation "io.coil-kt:coil:0.9.2"
implementation 'com.github.kuba2k2:NumberSlidingPicker:2921225f76'
implementation project(":annotation")
kapt project(":codegen")
implementation 'com.google.android:flexbox:2.0.1'
implementation 'com.qifan.powerpermission:powerpermission:1.3.0'
implementation 'com.qifan.powerpermission:powerpermission-coroutines:1.3.0'
implementation 'com.github.kuba2k2.FSLogin:lib:2.0.0'
implementation 'pl.droidsonroids:jspoon:1.3.2'
implementation "com.squareup.retrofit2:converter-scalars:2.8.1"
implementation "pl.droidsonroids.retrofit2:converter-jspoon:1.3.2"
}
repositories {
mavenCentral()
// Debug-only dependencies
debugImplementation "com.amitshekhar.android:debug-db:1.0.5"
}

View File

@ -1,14 +0,0 @@
-dontwarn com.evernote.android.job.gcm.**
-dontwarn com.evernote.android.job.GcmAvailableHelper
-dontwarn com.evernote.android.job.work.**
-dontwarn com.evernote.android.job.WorkManagerAvailableHelper
-keep public class com.evernote.android.job.v21.PlatformJobService
-keep public class com.evernote.android.job.v14.PlatformAlarmService
-keep public class com.evernote.android.job.v14.PlatformAlarmReceiver
-keep public class com.evernote.android.job.JobBootReceiver
-keep public class com.evernote.android.job.JobRescheduleService
-keep public class com.evernote.android.job.gcm.PlatformGcmService
-keep public class com.evernote.android.job.work.PlatformWorker
-keep class com.evernote.android.job.** { *; }

View File

@ -1 +0,0 @@
-keep class android.support.v8.renderscript.** { *; }

View File

@ -1,25 +0,0 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\AndroidSDK/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-keep class !android.support.v7.internal.view.menu.**,android.support.** {*;}
-keep class android.support.v7.graphics.** { *; }
-dontwarn android.support.v7.graphics.**
-keep class android.support.design.widget.** { *; }
-keep interface android.support.design.widget.** { *; }
-dontwarn android.support.design.**

View File

@ -1,14 +0,0 @@
# Android iconics library - https://github.com/mikepenz/Android-Iconics
# Warning: works ONLY with iconics > 1.0.0
#
# Tested on gradle config:
#
# compile 'com.mikepenz:iconics-core:1.7.1@aar'
#
-keep class com.mikepenz.iconics.** { *; }
-keep class com.mikepenz.community_material_typeface_library.CommunityMaterial
-keep class com.mikepenz.fontawesome_typeface_library.FontAwesome
-keep class com.mikepenz.google_material_typeface_library.GoogleMaterial
-keep class com.mikepenz.meteocons_typeface_library.Meteoconcs
-keep class com.mikepenz.octicons_typeface_library.Octicons

View File

@ -1,48 +0,0 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/wangchao/Work/android-sdk/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-dontwarn im.wangchao.**
-dontwarn okio.**
-dontwarn javax.annotation.Nullable
-dontwarn javax.annotation.ParametersAreNonnullByDefault
-keep class im.wangchao.** { *; }
-keep class **_HttpBinder { *; }
-keepclasseswithmembernames class * {
@im.wangchao.* <fields>;
}
-keepclasseswithmembernames class * {
@im.wangchao.* <methods>;
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# okhttp
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-dontwarn org.conscrypt.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
# If you do not use Rx:
-dontwarn rx.**

View File

@ -1 +0,0 @@
-keep class com.mikepenz.szkolny_font_typeface_library.SzkolnyFont { *; }

View File

@ -1,21 +0,0 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@ -26,7 +26,6 @@ import com.google.firebase.messaging.FirebaseMessaging
import com.google.gson.Gson
import com.hypertrack.hyperlog.HyperLog
import com.mikepenz.iconics.Iconics
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import im.wangchao.mhttp.MHttp
import kotlinx.coroutines.*
import me.leolin.shortcutbadger.ShortcutBadger
@ -159,7 +158,6 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
.errorActivity(CrashActivity::class.java)
.apply()
Iconics.init(applicationContext)
Iconics.registerFont(SzkolnyFont)
App.db = AppDb(this)
Themes.themeInt = config.ui.theme
devMode = config.debugMode

View File

@ -23,16 +23,16 @@ import androidx.lifecycle.Observer
import androidx.navigation.NavOptions
import com.danimahardhika.cafebar.CafeBar
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.mikepenz.iconics.IconicsColor
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.IconicsSize
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import com.mikepenz.iconics.utils.colorInt
import com.mikepenz.iconics.utils.sizeDp
import com.mikepenz.materialdrawer.model.DividerDrawerItem
import com.mikepenz.materialdrawer.model.ProfileDrawerItem
import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem
import com.mikepenz.materialdrawer.model.interfaces.*
import com.mikepenz.materialdrawer.model.utils.withIsHiddenInMiniDrawer
import eu.szkolny.font.SzkolnyFont
import kotlinx.coroutines.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
@ -152,7 +152,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
.withPopToHome(false)
list += NavTarget(DRAWER_ITEM_TIMETABLE, R.string.menu_timetable, TimetableFragment::class)
.withIcon(CommunityMaterial.Icon2.cmd_timetable)
.withIcon(CommunityMaterial.Icon3.cmd_timetable)
.withBadgeTypeId(TYPE_LESSON_CHANGE)
.isInDrawer(true)
@ -162,7 +162,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
.isInDrawer(true)
list += NavTarget(DRAWER_ITEM_GRADES, R.string.menu_grades, GradesListFragment::class)
.withIcon(CommunityMaterial.Icon2.cmd_numeric_5_box_outline)
.withIcon(CommunityMaterial.Icon3.cmd_numeric_5_box_outline)
.withBadgeTypeId(TYPE_GRADE)
.isInDrawer(true)
@ -200,7 +200,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
.isBelowSeparator(true)
list += NavTarget(DRAWER_ITEM_SETTINGS, R.string.menu_settings, SettingsNewFragment::class)
.withIcon(CommunityMaterial.Icon2.cmd_settings_outline)
.withIcon(CommunityMaterial.Icon.cmd_cog_outline)
.isInDrawer(true)
.isStatic(true)
.isBelowSeparator(true)
@ -208,7 +208,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
// profile settings items
list += NavTarget(DRAWER_PROFILE_ADD_NEW, R.string.menu_add_new_profile, null)
.withIcon(CommunityMaterial.Icon2.cmd_plus)
.withIcon(CommunityMaterial.Icon3.cmd_plus)
.withDescription(R.string.drawer_add_new_profile_desc)
.isInProfileList(true)
@ -237,7 +237,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
if (App.devMode) {
list += NavTarget(DRAWER_ITEM_DEBUG, R.string.menu_debug, DebugFragment::class)
list += NavTarget(TARGET_LAB, R.string.menu_lab, LabFragment::class)
.withIcon(CommunityMaterial.Icon.cmd_flask_outline)
.withIcon(CommunityMaterial.Icon2.cmd_flask_outline)
.isInDrawer(true)
.isBelowSeparator(true)
.isStatic(true)
@ -519,7 +519,11 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
navView.coordinator.postDelayed({
CafeBar.builder(this)
.content(R.string.rate_snackbar_text)
.icon(IconicsDrawable(this).icon(CommunityMaterial.Icon2.cmd_star_outline).size(IconicsSize.dp(20)).color(IconicsColor.colorInt(Themes.getPrimaryTextColor(this))))
.icon(IconicsDrawable(this).apply {
icon = CommunityMaterial.Icon3.cmd_star_outline
sizeDp = 20
colorInt = Themes.getPrimaryTextColor(this@MainActivity)
})
.positiveText(R.string.rate_snackbar_positive)
.positiveColor(-0xb350b0)
.negativeText(R.string.rate_snackbar_negative)
@ -532,12 +536,12 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
app.config.appRateSnackbarTime = 0
}
.onNegative { cafeBar ->
Toast.makeText(this, "Szkoda, opinie innych pomagają mi rozwijać aplikację.", Toast.LENGTH_LONG).show()
Toast.makeText(this, R.string.rate_snackbar_negative_message, Toast.LENGTH_LONG).show()
cafeBar.dismiss()
app.config.appRateSnackbarTime = 0
}
.onNeutral { cafeBar ->
Toast.makeText(this, "OK", Toast.LENGTH_LONG).show()
Toast.makeText(this, R.string.ok, Toast.LENGTH_LONG).show()
cafeBar.dismiss()
app.config.appRateSnackbarTime = System.currentTimeMillis() + 7 * 24 * 60 * 60 * 1000
}
@ -561,7 +565,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
BottomSheetSeparatorItem(false),
BottomSheetPrimaryItem(false)
.withTitle(R.string.menu_settings)
.withIcon(CommunityMaterial.Icon2.cmd_settings_outline)
.withIcon(CommunityMaterial.Icon.cmd_cog_outline)
.withOnClickListener(View.OnClickListener { loadTarget(DRAWER_ITEM_SETTINGS) }),
BottomSheetPrimaryItem(false)
.withTitle(R.string.menu_feedback)

View File

@ -8,9 +8,9 @@ import androidx.room.Dao
import androidx.room.Query
import androidx.room.RawQuery
import androidx.sqlite.db.SupportSQLiteQuery
import eu.szkolny.selectivedao.annotation.SelectiveDao
import eu.szkolny.selectivedao.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.annotation.SelectiveDao
import pl.szczodrzynski.edziennik.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.Announcement
import pl.szczodrzynski.edziennik.data.db.entity.Metadata

View File

@ -8,9 +8,9 @@ import androidx.room.Dao
import androidx.room.Query
import androidx.room.RawQuery
import androidx.sqlite.db.SupportSQLiteQuery
import eu.szkolny.selectivedao.annotation.SelectiveDao
import eu.szkolny.selectivedao.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.annotation.SelectiveDao
import pl.szczodrzynski.edziennik.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
import pl.szczodrzynski.edziennik.data.db.entity.Metadata

View File

@ -10,9 +10,9 @@ import androidx.room.RawQuery
import androidx.room.Transaction
import androidx.sqlite.db.SimpleSQLiteQuery
import androidx.sqlite.db.SupportSQLiteQuery
import eu.szkolny.selectivedao.annotation.SelectiveDao
import eu.szkolny.selectivedao.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.annotation.SelectiveDao
import pl.szczodrzynski.edziennik.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.Event
import pl.szczodrzynski.edziennik.data.db.entity.Metadata

View File

@ -9,9 +9,9 @@ import androidx.room.Query
import androidx.room.RawQuery
import androidx.room.Transaction
import androidx.sqlite.db.SupportSQLiteQuery
import eu.szkolny.selectivedao.annotation.SelectiveDao
import eu.szkolny.selectivedao.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.annotation.SelectiveDao
import pl.szczodrzynski.edziennik.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.Grade
import pl.szczodrzynski.edziennik.data.db.entity.Metadata

View File

@ -8,9 +8,9 @@ import androidx.room.Dao
import androidx.room.Query
import androidx.room.RawQuery
import androidx.sqlite.db.SupportSQLiteQuery
import eu.szkolny.selectivedao.annotation.SelectiveDao
import eu.szkolny.selectivedao.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.annotation.SelectiveDao
import pl.szczodrzynski.edziennik.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber
import pl.szczodrzynski.edziennik.data.db.entity.Metadata

View File

@ -8,9 +8,9 @@ import androidx.room.Dao
import androidx.room.Query
import androidx.room.RawQuery
import androidx.sqlite.db.SupportSQLiteQuery
import eu.szkolny.selectivedao.annotation.SelectiveDao
import eu.szkolny.selectivedao.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.annotation.SelectiveDao
import pl.szczodrzynski.edziennik.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.data.db.entity.Metadata

View File

@ -8,9 +8,9 @@ import androidx.room.Dao
import androidx.room.Query
import androidx.room.RawQuery
import androidx.sqlite.db.SupportSQLiteQuery
import eu.szkolny.selectivedao.annotation.SelectiveDao
import eu.szkolny.selectivedao.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.annotation.SelectiveDao
import pl.szczodrzynski.edziennik.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.Notice

View File

@ -8,9 +8,9 @@ import androidx.room.Dao
import androidx.room.Query
import androidx.room.RawQuery
import androidx.sqlite.db.SupportSQLiteQuery
import eu.szkolny.selectivedao.annotation.SelectiveDao
import eu.szkolny.selectivedao.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.annotation.SelectiveDao
import pl.szczodrzynski.edziennik.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.TeacherAbsence

View File

@ -8,9 +8,9 @@ import androidx.room.Dao
import androidx.room.Query
import androidx.room.RawQuery
import androidx.sqlite.db.SupportSQLiteQuery
import eu.szkolny.selectivedao.annotation.SelectiveDao
import eu.szkolny.selectivedao.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.annotation.SelectiveDao
import pl.szczodrzynski.edziennik.annotation.UpdateSelective
import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.Lesson
import pl.szczodrzynski.edziennik.data.db.entity.Metadata

View File

@ -8,7 +8,7 @@ import android.text.method.LinkMovementMethod
import android.view.LayoutInflater
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import coil.api.load
import coil.load
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers

View File

@ -10,8 +10,6 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.android.synthetic.main.row_lesson_change_item.view.*
import kotlinx.android.synthetic.main.row_teacher_absence_item.view.*
import kotlinx.coroutines.*
import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.db.entity.Lesson
@ -111,7 +109,7 @@ class DayDialog(
}
lessonChanges.ifNotEmpty {
b.lessonChangeContainer.visibility = View.VISIBLE
b.lessonChangeContainer.root.visibility = View.VISIBLE
b.lessonChangeContainer.lessonChangeCount.text = it.size.toString()
b.lessonChangeLayout.onClick {
@ -130,7 +128,7 @@ class DayDialog(
}
teacherAbsences.ifNotEmpty {
b.teacherAbsenceContainer.visibility = View.VISIBLE
b.teacherAbsenceContainer.root.visibility = View.VISIBLE
b.teacherAbsenceContainer.teacherAbsenceCount.text = it.size.toString()
b.teacherAbsenceLayout.onClick {

View File

@ -378,7 +378,7 @@ class EventManualDialog(
customColor = color
}
})
colorPickerDialog.show(activity.fragmentManager, "color-picker-dialog")
colorPickerDialog.show(activity.supportFragmentManager, "color-picker-dialog")
}
}}

View File

@ -16,12 +16,11 @@ import com.github.tibolte.agendacalendarview.CalendarPickerController
import com.github.tibolte.agendacalendarview.models.BaseCalendarEvent
import com.github.tibolte.agendacalendarview.models.CalendarEvent
import com.github.tibolte.agendacalendarview.models.IDayItem
import com.mikepenz.iconics.IconicsColor
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.IconicsSize
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.Icon2
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import com.mikepenz.iconics.utils.colorInt
import com.mikepenz.iconics.utils.sizeDp
import eu.szkolny.font.SzkolnyFont
import kotlinx.coroutines.*
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.MainActivity
@ -89,7 +88,7 @@ class AgendaFragment : Fragment(), CoroutineScope {
}),
BottomSheetPrimaryItem(true)
.withTitle(R.string.menu_agenda_change_view)
.withIcon(if (type == Profile.AGENDA_DEFAULT) CommunityMaterial.Icon.cmd_calendar_outline else CommunityMaterial.Icon.cmd_format_list_bulleted_square)
.withIcon(if (type == Profile.AGENDA_DEFAULT) CommunityMaterial.Icon.cmd_calendar_outline else CommunityMaterial.Icon2.cmd_format_list_bulleted_square)
.withOnClickListener(View.OnClickListener {
activity.bottomSheet.close()
type = if (type == Profile.AGENDA_DEFAULT) Profile.AGENDA_CALENDAR else Profile.AGENDA_DEFAULT
@ -111,7 +110,7 @@ class AgendaFragment : Fragment(), CoroutineScope {
activity.navView.bottomBar.fabEnable = true
activity.navView.bottomBar.fabExtendedText = getString(R.string.add)
activity.navView.bottomBar.fabIcon = Icon2.cmd_plus
activity.navView.bottomBar.fabIcon = CommunityMaterial.Icon3.cmd_plus
activity.navView.setFabOnClickListener(View.OnClickListener {
EventManualDialog(activity, app.profileId, defaultDate = actualDate)
})
@ -278,10 +277,11 @@ class AgendaFragment : Fragment(), CoroutineScope {
val unreadEventDates = mutableSetOf<Int>()
events.forEach { event ->
val eventIcon = IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_checkbox_blank_circle)
.size(IconicsSize.dp(10))
.color(IconicsColor.colorInt(event.eventColor))
val eventIcon = IconicsDrawable(activity).apply {
icon = CommunityMaterial.Icon.cmd_checkbox_blank_circle
sizeDp = 10
colorInt = event.eventColor
}
dayList.add(EventDay(event.startTimeCalendar, eventIcon))

View File

@ -60,7 +60,7 @@ class AttendanceFragment : Fragment(), CoroutineScope {
activity.bottomSheet.prependItems(
BottomSheetPrimaryItem(true)
.withTitle(R.string.menu_attendance_config)
.withIcon(CommunityMaterial.Icon2.cmd_settings_outline)
.withIcon(CommunityMaterial.Icon.cmd_cog_outline)
.withOnClickListener(View.OnClickListener {
activity.bottomSheet.close()
AttendanceConfigDialog(activity, true, null, null)

View File

@ -13,9 +13,9 @@ import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import com.mikepenz.iconics.utils.colorRes
import com.mikepenz.iconics.utils.sizeDp
import eu.szkolny.font.SzkolnyFont
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_MOBIDZIENNIK
@ -49,17 +49,26 @@ class NoticesAdapter//getting the context and product list with constructor
holder.noticesItemAddedDate.text = Date.fromMillis(notice.addedDate).formattedString
if (notice.type == Notice.TYPE_POSITIVE) {
holder.noticesItemType.setImageDrawable(IconicsDrawable(context, CommunityMaterial.Icon2.cmd_plus_circle_outline)
.colorRes(R.color.md_green_600)
.sizeDp(36))
holder.noticesItemType.setImageDrawable(
IconicsDrawable(context, CommunityMaterial.Icon3.cmd_plus_circle_outline).apply {
colorRes = R.color.md_green_600
sizeDp = 36
}
)
} else if (notice.type == Notice.TYPE_NEGATIVE) {
holder.noticesItemType.setImageDrawable(IconicsDrawable(context, CommunityMaterial.Icon.cmd_alert_decagram_outline)
.colorRes(R.color.md_red_600)
.sizeDp(36))
holder.noticesItemType.setImageDrawable(
IconicsDrawable(context, CommunityMaterial.Icon.cmd_alert_decagram_outline).apply {
colorRes = R.color.md_red_600
sizeDp = 36
}
)
} else {
holder.noticesItemType.setImageDrawable(IconicsDrawable(context, SzkolnyFont.Icon.szf_message_processing_outline)
.colorRes(R.color.md_blue_500)
.sizeDp(36))
holder.noticesItemType.setImageDrawable(
IconicsDrawable(context, SzkolnyFont.Icon.szf_message_processing_outline).apply {
colorRes = R.color.md_blue_500
sizeDp = 36
}
)
}
if (!notice.seen) {

View File

@ -14,8 +14,8 @@ import android.widget.PopupMenu
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import coil.Coil
import coil.api.load
import coil.imageLoader
import coil.request.ImageRequest
import com.github.bassaer.chatmessageview.model.IChatUser
import com.github.bassaer.chatmessageview.model.Message
import com.github.bassaer.chatmessageview.view.ChatView
@ -34,14 +34,6 @@ import pl.szczodrzynski.edziennik.onClick
import pl.szczodrzynski.edziennik.utils.Utils
import pl.szczodrzynski.edziennik.utils.Utils.openUrl
import java.util.*
import kotlin.collections.List
import kotlin.collections.any
import kotlin.collections.filter
import kotlin.collections.firstOrNull
import kotlin.collections.forEach
import kotlin.collections.forEachIndexed
import kotlin.collections.isNotEmpty
import kotlin.collections.mutableMapOf
import kotlin.collections.set
import kotlin.coroutines.CoroutineContext
@ -221,13 +213,15 @@ class FeedbackFragment : Fragment(), CoroutineScope {
Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888).also { bmp ->
launch {
Log.d(TAG, "Created image for $userName")
Coil.load(activity, image) {
target {
val request = ImageRequest.Builder(activity)
.data(image)
.target {
val canvas = Canvas(bmp)
it.setBounds(0, 0, bmp.width, bmp.height)
it.draw(canvas)
}
}
.build()
activity.imageLoader.enqueue(request)
}
}
}

View File

@ -15,7 +15,6 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.Icon2
import kotlinx.coroutines.*
import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.MainActivity.Companion.TARGET_GRADES_EDITOR
@ -71,7 +70,7 @@ class GradesListFragment : Fragment(), CoroutineScope {
val adapter = GradesAdapter(activity)
var firstRun = true
app.db.gradeDao().getAllOrderBy(App.profileId, app.gradesManager.getOrderByString()).observe(this@GradesListFragment, Observer { grades -> this@GradesListFragment.launch {
app.db.gradeDao().getAllOrderBy(App.profileId, app.gradesManager.getOrderByString()).observe(viewLifecycleOwner, Observer { grades -> this@GradesListFragment.launch {
if (!isAdded) return@launch
val items = when {
@ -135,7 +134,7 @@ class GradesListFragment : Fragment(), CoroutineScope {
activity.bottomSheet.prependItems(
BottomSheetPrimaryItem(true)
.withTitle(R.string.menu_grades_config)
.withIcon(Icon2.cmd_settings_outline)
.withIcon(CommunityMaterial.Icon.cmd_cog_outline)
.withOnClickListener(View.OnClickListener {
activity.bottomSheet.close()
GradesConfigDialog(activity, true, null, null)

View File

@ -7,9 +7,9 @@ package pl.szczodrzynski.edziennik.ui.modules.home
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import com.mikepenz.iconics.utils.colorInt
import com.mikepenz.iconics.utils.sizeDp
import eu.szkolny.font.SzkolnyFont
import kotlinx.coroutines.*
import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.db.entity.Lesson
@ -59,9 +59,12 @@ class CounterActivity : AppCompatActivity(), CoroutineScope {
}
}
b.bellSync.setImageDrawable(IconicsDrawable(this@CounterActivity, SzkolnyFont.Icon.szf_alarm_bell_outline)
.colorInt(0xff404040.toInt())
.sizeDp(36))
b.bellSync.setImageDrawable(
IconicsDrawable(this@CounterActivity, SzkolnyFont.Icon.szf_alarm_bell_outline).apply {
colorInt = 0xff404040.toInt()
sizeDp = 36
}
)
b.bellSync.onClick {
BellSyncTimeChooseDialog(activity = this@CounterActivity)
}

View File

@ -19,14 +19,13 @@ import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.Icon
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import eu.szkolny.font.SzkolnyFont
import kotlinx.coroutines.*
import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
import pl.szczodrzynski.edziennik.databinding.FragmentHomeBinding
import pl.szczodrzynski.edziennik.ui.dialogs.home.StudentNumberDialog
import pl.szczodrzynski.edziennik.ui.modules.home.cards.*
import pl.szczodrzynski.edziennik.utils.Themes
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem
import kotlin.coroutines.CoroutineContext
@ -75,7 +74,7 @@ class HomeFragment : Fragment(), CoroutineScope {
private lateinit var activity: MainActivity
private lateinit var b: FragmentHomeBinding
private lateinit var job: Job
private val job: Job = Job()
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Main
@ -83,10 +82,8 @@ class HomeFragment : Fragment(), CoroutineScope {
activity = (getActivity() as MainActivity?) ?: return null
context ?: return null
app = activity.application as App
context!!.theme.applyStyle(Themes.appTheme, true)
b = FragmentHomeBinding.inflate(inflater)
b.refreshLayout.setParent(activity.swipeRefreshLayout)
job = Job()
return b.root
}

View File

@ -12,7 +12,7 @@ import androidx.core.text.HtmlCompat
import androidx.core.view.isVisible
import androidx.core.view.plusAssign
import androidx.core.view.setMargins
import coil.api.load
import coil.load
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job

View File

@ -15,8 +15,8 @@ import androidx.core.view.setMargins
import androidx.lifecycle.Observer
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import com.mikepenz.iconics.utils.sizeDp
import eu.szkolny.font.SzkolnyFont
import kotlinx.coroutines.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
@ -87,17 +87,26 @@ class HomeTimetableCard(
}
holder.root += b.root
b.settings.setImageDrawable(IconicsDrawable(activity, CommunityMaterial.Icon2.cmd_settings_outline)
.colorAttr(activity, R.attr.colorIcon)
.sizeDp(20))
b.settings.setImageDrawable(
IconicsDrawable(activity, CommunityMaterial.Icon.cmd_cog_outline).apply {
colorAttr(activity, R.attr.colorIcon)
sizeDp = 20
}
)
b.bellSync.setImageDrawable(IconicsDrawable(activity, SzkolnyFont.Icon.szf_alarm_bell_outline)
.colorAttr(activity, R.attr.colorIcon)
.sizeDp(20))
b.bellSync.setImageDrawable(
IconicsDrawable(activity, SzkolnyFont.Icon.szf_alarm_bell_outline).apply {
colorAttr(activity, R.attr.colorIcon)
sizeDp = 20
}
)
b.showCounter.setImageDrawable(IconicsDrawable(activity, CommunityMaterial.Icon.cmd_fullscreen)
.colorAttr(activity, R.attr.colorIcon)
.sizeDp(20))
b.showCounter.setImageDrawable(
IconicsDrawable(activity, CommunityMaterial.Icon2.cmd_fullscreen).apply {
colorAttr(activity, R.attr.colorIcon)
sizeDp = 20
}
)
b.bellSync.setOnClickListener {
BellSyncTimeChooseDialog(

View File

@ -12,7 +12,7 @@ import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import eu.szkolny.font.SzkolnyFont
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@ -100,7 +100,7 @@ class HomeworkFragment : Fragment(), CoroutineScope {
bottomBar.apply {
fabEnable = true
fabExtendedText = getString(R.string.add)
fabIcon = CommunityMaterial.Icon2.cmd_plus
fabIcon = CommunityMaterial.Icon3.cmd_plus
}
setFabOnClickListener(View.OnClickListener {

View File

@ -97,11 +97,12 @@ class LoginFormFragment : Fragment(), CoroutineScope {
b.textEdit.id = credential.name
b.textEdit.setText(arguments?.getString(credential.keyName) ?: "")
b.textLayout.startIconDrawable = IconicsDrawable(activity)
.icon(credential.icon)
.sizeDp(24)
.paddingDp(2)
.colorAttr(activity, R.attr.colorOnBackground)
b.textLayout.startIconDrawable = IconicsDrawable(activity).apply {
icon = credential.icon
sizeDp = 24
paddingDp = 2
colorAttr(activity, R.attr.colorOnBackground)
}
this.b.formContainer.addView(b.root)
credentials[credential] = b

View File

@ -110,7 +110,7 @@ object LoginInfo {
FormField(
keyName = "accountPin",
name = R.string.login_hint_pin,
icon = CommunityMaterial.Icon2.cmd_lock,
icon = CommunityMaterial.Icon2.cmd_lock_outline,
emptyText = R.string.login_error_no_pin,
invalidText = R.string.login_error_incorrect_pin,
errorCodes = mapOf(),
@ -157,7 +157,7 @@ object LoginInfo {
FormField(
keyName = "symbol",
name = R.string.login_hint_symbol,
icon = CommunityMaterial.Icon2.cmd_school,
icon = CommunityMaterial.Icon3.cmd_school_outline,
emptyText = R.string.login_error_no_symbol,
invalidText = R.string.login_error_incorrect_symbol,
errorCodes = mapOf(
@ -170,7 +170,7 @@ object LoginInfo {
FormField(
keyName = "devicePin",
name = R.string.login_hint_pin,
icon = CommunityMaterial.Icon2.cmd_lock,
icon = CommunityMaterial.Icon2.cmd_lock_outline,
emptyText = R.string.login_error_no_pin,
invalidText = R.string.login_error_incorrect_pin,
errorCodes = mapOf(
@ -252,7 +252,7 @@ object LoginInfo {
FormField(
keyName = "serverName",
name = R.string.login_hint_address,
icon = CommunityMaterial.Icon2.cmd_web,
icon = CommunityMaterial.Icon3.cmd_web,
emptyText = R.string.login_error_no_address,
invalidText = R.string.login_error_incorrect_address,
errorCodes = mapOf(

View File

@ -10,7 +10,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import coil.api.load
import coil.load
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers

View File

@ -9,7 +9,7 @@ import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import coil.api.load
import coil.load
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.databinding.LoginPlatformItemBinding
import pl.szczodrzynski.edziennik.ui.modules.grades.viewholder.BindableViewHolder

View File

@ -65,9 +65,10 @@ class MessageFragment : Fragment(), CoroutineScope {
if (!isAdded) return
b.closeButton.setImageDrawable(
IconicsDrawable(activity, CommunityMaterial.Icon2.cmd_window_close)
.colorAttr(activity, android.R.attr.textColorSecondary)
.sizeDp(12)
IconicsDrawable(activity, CommunityMaterial.Icon3.cmd_window_close).apply {
colorAttr(activity, android.R.attr.textColorSecondary)
sizeDp = 12
}
)
b.closeButton.setOnClickListener { activity.navigateUp() }
@ -230,7 +231,7 @@ class MessageFragment : Fragment(), CoroutineScope {
bottomBar.apply {
fabEnable = true
fabExtendedText = getString(R.string.messages_reply)
fabIcon = CommunityMaterial.Icon2.cmd_reply
fabIcon = CommunityMaterial.Icon3.cmd_reply_outline
}
setFabOnClickListener(View.OnClickListener {

View File

@ -97,7 +97,7 @@ class MessagesFragment : Fragment(), CoroutineScope {
bottomBar.apply {
fabEnable = true
fabExtendedText = getString(R.string.compose)
fabIcon = CommunityMaterial.Icon2.cmd_pencil_outline
fabIcon = CommunityMaterial.Icon3.cmd_pencil_outline
}
setFabOnClickListener(View.OnClickListener {

View File

@ -316,7 +316,7 @@ class MessagesComposeFragment : Fragment(), CoroutineScope {
activity.navView.bottomBar.apply {
fabEnable = true
fabExtendedText = getString(R.string.messages_compose_send)
fabIcon = CommunityMaterial.Icon2.cmd_send
fabIcon = CommunityMaterial.Icon3.cmd_send_outline
setFabOnClickListener(View.OnClickListener {
sendMessage()

View File

@ -38,10 +38,11 @@ class SettingsLicenseActivity : MaterialAboutActivity() {
license: OpenSourceLicense,
libraryUrl: String): MaterialAboutCard {
val licenseItem = MaterialAboutActionItem.Builder()
.icon(IconicsDrawable(this)
.icon(CommunityMaterial.Icon.cmd_book_outline)
.colorInt(foregroundColor)
.sizeDp(18))
.icon(IconicsDrawable(this).apply {
icon = CommunityMaterial.Icon.cmd_book_outline
colorInt = foregroundColor
sizeDp = 18
})
.setIconGravity(MaterialAboutActionItem.GRAVITY_TOP)
.text(libraryTitle)
.subText(String.format(getString(license.resourceId), copyrightYear, copyrightName))
@ -78,12 +79,6 @@ class SettingsLicenseActivity : MaterialAboutActivity() {
"Applandeo sp. z o.o.",
OpenSourceLicense.APACHE_2,
"https://github.com/Applandeo/Material-Calendar-View/"),
createLicenseCard(this,
"Android-Job",
"2007-2017",
"Evernote Corporation",
OpenSourceLicense.APACHE_2,
"https://github.com/evernote/android-job/"),
createLicenseCard(this,
"Custom Activity On Crash",
"",
@ -150,12 +145,6 @@ class SettingsLicenseActivity : MaterialAboutActivity() {
"Arthur Teplitzki, 2013 Edmodo, Inc.",
OpenSourceLicense.APACHE_2,
"https://github.com/ArthurHub/Android-Image-Cropper/"),
createLicenseCard(this,
"Material Tap Target Prompt",
"2016-2018",
"Samuel Wall",
OpenSourceLicense.APACHE_2,
"https://github.com/sjwall/MaterialTapTargetPrompt/"),
createLicenseCard(this,
"Android Swipe Layout",
"2014",

View File

@ -21,16 +21,15 @@ import com.danielstone.materialaboutlibrary.items.MaterialAboutActionItem;
import com.danielstone.materialaboutlibrary.items.MaterialAboutActionSwitchItem;
import com.danielstone.materialaboutlibrary.items.MaterialAboutItem;
import com.danielstone.materialaboutlibrary.items.MaterialAboutItemOnClickAction;
import com.danielstone.materialaboutlibrary.items.MaterialAboutProfileItem;
import com.danielstone.materialaboutlibrary.items.MaterialAboutSwitchItem;
import com.danielstone.materialaboutlibrary.items.MaterialAboutTitleItem;
import com.danielstone.materialaboutlibrary.model.MaterialAboutCard;
import com.danielstone.materialaboutlibrary.model.MaterialAboutList;
import com.mikepenz.iconics.IconicsColor;
import com.mikepenz.iconics.IconicsDrawable;
import com.mikepenz.iconics.IconicsSize;
import com.mikepenz.iconics.typeface.IIcon;
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial;
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont;
import com.mikepenz.iconics.utils.IconicsConvertersKt;
import com.mikepenz.iconics.utils.IconicsDrawableExtensionsKt;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;
@ -41,6 +40,8 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import eu.szkolny.font.SzkolnyFont;
import kotlin.Unit;
import pl.szczodrzynski.edziennik.App;
import pl.szczodrzynski.edziennik.BuildConfig;
import pl.szczodrzynski.edziennik.ExtensionsKt;
@ -91,6 +92,15 @@ public class SettingsNewFragment extends MaterialAboutFragment {
private int secondaryTextOnPrimaryBg = -1;
private int iconSizeDp = 20;
private IconicsDrawable icon(IIcon icon, int sizeDp, int color) {
return new IconicsDrawable(activity).apply((drawable) -> {
drawable.setIcon(icon);
IconicsConvertersKt.setSizeDp(drawable, sizeDp);
IconicsDrawableExtensionsKt.setColorInt(drawable, color);
return Unit.INSTANCE;
});
}
private MaterialAboutCard getCardWithItems(CharSequence title, ArrayList<MaterialAboutItem> items, boolean primaryColor) {
MaterialAboutCard card = new MaterialAboutCard.Builder().title(title).cardColor(0xff1976D2).build();
card.getItems().addAll(items);
@ -121,10 +131,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
return new MaterialAboutActionItem(
getString(R.string.settings_more_text),
null,
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_chevron_down)
.size(IconicsSize.dp(14))
.color(IconicsColor.colorInt(iconColor)),
icon(CommunityMaterial.Icon.cmd_chevron_down, 14, iconColor),
onClickAction
);
}
@ -156,12 +163,12 @@ public class SettingsNewFragment extends MaterialAboutFragment {
roundDrawable.setCircular(true);
return roundDrawable;*/
}
private MaterialAboutProfileItem profileCardTitleItem;
private MaterialAboutTitleItem profileCardTitleItem;
private ArrayList<MaterialAboutItem> getProfileCard(boolean expandedOnly) {
ArrayList<MaterialAboutItem> items = new ArrayList<>();
if (!expandedOnly) {
profileCardTitleItem = new MaterialAboutProfileItem(
profileCardTitleItem = new MaterialAboutTitleItem(
app.getProfile().getName(),
app.getProfile().getSubname(),
getProfileDrawable()
@ -210,10 +217,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
getString(R.string.settings_profile_change_password_text),
getString(R.string.settings_profile_change_password_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_key_variant)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon2.cmd_key_variant, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
@ -224,10 +228,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
getString(R.string.settings_add_student_text),
getString(R.string.settings_add_student_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_account_plus_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon.cmd_account_plus_outline, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
startActivity(new Intent(activity, LoginActivity.class));
@ -238,10 +239,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
getString(R.string.settings_profile_notifications_text),
getString(R.string.settings_profile_notifications_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_filter_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon2.cmd_filter_outline, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
new NotificationFilterDialog(activity, null, null);
@ -252,10 +250,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
getString(R.string.settings_profile_remove_text),
getString(R.string.settings_profile_remove_subtext),
new IconicsDrawable(activity)
.icon(SzkolnyFont.Icon.szf_delete_empty_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(SzkolnyFont.Icon.szf_delete_empty_outline, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
new ProfileRemoveDialog(activity, app.getProfile().getId(), app.getProfile().getName(), false);
@ -267,20 +262,17 @@ public class SettingsNewFragment extends MaterialAboutFragment {
else {
items.add(
new MaterialAboutSwitchItem(
getString(R.string.settings_profile_sync_text),
getString(R.string.settings_profile_sync_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_account_convert)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
)
new MaterialAboutSwitchItem.Builder()
.text(R.string.settings_profile_sync_text)
.subText(R.string.settings_profile_sync_subtext)
.icon(icon(CommunityMaterial.Icon.cmd_account_convert, iconSizeDp, iconColor))
.setChecked(app.getProfile().getSyncEnabled())
.setOnChangeAction(((isChecked, tag) -> {
.setOnCheckedChanged(((item, isChecked) -> {
app.getProfile().setSyncEnabled(isChecked);
app.profileSave();
return true;
}))
.build()
);
}
@ -300,20 +292,17 @@ public class SettingsNewFragment extends MaterialAboutFragment {
Date today = Date.getToday();
if (today.month == 12 || today.month == 1) {
items.add(
new MaterialAboutSwitchItem(
getString(R.string.settings_theme_snowfall_text),
getString(R.string.settings_theme_snowfall_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_snowflake)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
)
new MaterialAboutSwitchItem.Builder()
.text(R.string.settings_theme_snowfall_text)
.subText(R.string.settings_theme_snowfall_subtext)
.icon(icon(CommunityMaterial.Icon3.cmd_snowflake, iconSizeDp, iconColor))
.setChecked(app.getConfig().getUi().getSnowfall())
.setOnChangeAction((isChecked, tag) -> {
.setOnCheckedChanged((item, isChecked) -> {
app.getConfig().getUi().setSnowfall(isChecked);
activity.recreate();
return true;
})
.build()
);
}
@ -321,10 +310,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
getString(R.string.settings_theme_theme_text),
Themes.INSTANCE.getThemeName(activity),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_palette_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon3.cmd_palette_outline, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
new MaterialDialog.Builder(activity)
@ -343,24 +329,21 @@ public class SettingsNewFragment extends MaterialAboutFragment {
);
items.add(
new MaterialAboutSwitchItem(
getString(R.string.settings_theme_mini_drawer_text),
getString(R.string.settings_theme_mini_drawer_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_dots_vertical)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
)
.setChecked(app.getConfig().getUi().getMiniMenuVisible())
.setOnChangeAction((isChecked, tag) -> {
// 0,1 1
// 0,0 0
// 1,1 0
// 1,0 1
app.getConfig().getUi().setMiniMenuVisible(isChecked);
activity.getNavView().drawer.setMiniDrawerVisiblePortrait(isChecked);
return true;
})
new MaterialAboutSwitchItem.Builder()
.text(R.string.settings_theme_mini_drawer_text)
.subText(R.string.settings_theme_mini_drawer_subtext)
.icon(icon(CommunityMaterial.Icon.cmd_dots_vertical, iconSizeDp, iconColor))
.setChecked(app.getConfig().getUi().getMiniMenuVisible())
.setOnCheckedChanged((item, isChecked) -> {
// 0,1 1
// 0,0 0
// 1,1 0
// 1,0 1
app.getConfig().getUi().setMiniMenuVisible(isChecked);
activity.getNavView().drawer.setMiniDrawerVisiblePortrait(isChecked);
return true;
})
.build()
);
items.add(getMoreItem(() -> addCardItems(CARD_THEME, getThemeCard(true))));
@ -371,10 +354,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
getString(R.string.settings_theme_mini_drawer_buttons_text),
null,
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_format_list_checks)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon2.cmd_format_list_checks, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
List<Integer> buttonIds = new ArrayList<>();
@ -435,10 +415,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
getString(R.string.settings_theme_drawer_header_text),
null,
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_image_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon2.cmd_image_outline, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
if (app.getConfig().getUi().getHeaderBackground() != null) {
@ -469,10 +446,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
getString(R.string.settings_theme_app_background_text),
getString(R.string.settings_theme_app_background_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_image_filter_hdr)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon2.cmd_image_filter_hdr, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
if (app.getConfig().getUi().getAppBackground() != null) {
@ -496,19 +470,15 @@ public class SettingsNewFragment extends MaterialAboutFragment {
);
items.add(
new MaterialAboutSwitchItem(
getString(R.string.settings_theme_open_drawer_on_back_pressed_text),
null,
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_menu_open)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
)
new MaterialAboutSwitchItem.Builder( )
.text(R.string.settings_theme_open_drawer_on_back_pressed_text)
.icon(icon(CommunityMaterial.Icon3.cmd_menu_open, iconSizeDp, iconColor))
.setChecked(app.getConfig().getUi().getOpenDrawerOnBackPressed())
.setOnChangeAction((isChecked, tag) -> {
.setOnCheckedChanged((item, isChecked) -> {
app.getConfig().getUi().setOpenDrawerOnBackPressed(isChecked);
return true;
})
.build()
);
}
return items;
@ -548,20 +518,17 @@ public class SettingsNewFragment extends MaterialAboutFragment {
);
}
private MaterialAboutItem getSyncCardWifiItem() {
return new MaterialAboutSwitchItem(
getString(R.string.settings_sync_wifi_text),
getString(R.string.settings_sync_wifi_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_wifi_strength_2)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
)
return new MaterialAboutSwitchItem.Builder()
.text(R.string.settings_sync_wifi_text)
.subText(R.string.settings_sync_wifi_subtext)
.icon(icon(CommunityMaterial.Icon3.cmd_wifi_strength_2, iconSizeDp, iconColor))
.setChecked(app.getConfig().getSync().getOnlyWifi())
.setOnChangeAction((isChecked, tag) -> {
.setOnCheckedChanged((item, isChecked) -> {
app.getConfig().getSync().setOnlyWifi(isChecked);
SyncWorker.Companion.rescheduleNext(app);
return true;
});
})
.build();
}
private MaterialAboutActionSwitchItem syncCardIntervalItem;
private MaterialAboutActionSwitchItem syncCardQuietHoursItem;
@ -569,14 +536,11 @@ public class SettingsNewFragment extends MaterialAboutFragment {
ArrayList<MaterialAboutItem> items = new ArrayList<>();
if (!expandedOnly) {
syncCardIntervalItem = new MaterialAboutActionSwitchItem(
getString(R.string.settings_sync_sync_interval_text),
getString(R.string.settings_sync_sync_interval_subtext_disabled),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_download_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
);
syncCardIntervalItem = new MaterialAboutActionSwitchItem.Builder()
.text(R.string.settings_sync_sync_interval_text)
.subText(R.string.settings_sync_sync_interval_subtext_disabled)
.icon(icon(CommunityMaterial.Icon.cmd_download_outline, iconSizeDp, iconColor))
.build();
syncCardIntervalItem.setSubTextChecked(getSyncCardIntervalSubText());
syncCardIntervalItem.setChecked(app.getConfig().getSync().getEnabled());
syncCardIntervalItem.setOnClickAction(() -> {
@ -625,7 +589,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
})
.show();
});
syncCardIntervalItem.setOnChangeAction((isChecked, tag) -> {
syncCardIntervalItem.setOnCheckedChangedAction((item, isChecked) -> {
if (isChecked && !app.getConfig().getSync().getEnabled()) {
addCardItem(CARD_SYNC, 1, getSyncCardWifiItem());
}
@ -646,10 +610,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutSwitchItem(
"Cisza na lekcjach",
"Nie odtwarzaj dźwięku powiadomień podczas lekcji",
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_volume_off)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon2.cmd_volume_off, iconSizeDp, iconColor)
)
.setChecked(app.appConfig.quietDuringLessons)
.setOnChangeAction((isChecked) -> {
@ -660,14 +621,11 @@ public class SettingsNewFragment extends MaterialAboutFragment {
);*/
syncCardQuietHoursItem = new MaterialAboutActionSwitchItem(
getString(R.string.settings_sync_quiet_hours_text),
getString(R.string.settings_sync_quiet_hours_subtext_disabled),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_bell_sleep_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
);
syncCardQuietHoursItem = new MaterialAboutActionSwitchItem.Builder()
.text(R.string.settings_sync_quiet_hours_text)
.subText(R.string.settings_sync_quiet_hours_subtext_disabled)
.icon(icon(CommunityMaterial.Icon.cmd_bell_sleep_outline, iconSizeDp, iconColor))
.build();
syncCardQuietHoursItem.setChecked(app.getConfig().getSync().getQuietHoursEnabled());
syncCardQuietHoursItem.setSubTextChecked(getSyncCardQuietHoursSubText());
syncCardQuietHoursItem.setOnClickAction(() -> {
@ -707,7 +665,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
})
.show();
});
syncCardQuietHoursItem.setOnChangeAction((isChecked, tag) -> {
syncCardQuietHoursItem.setOnCheckedChangedAction((item, isChecked) -> {
app.getConfig().getSync().setQuietHoursEnabled(isChecked);
if (isChecked && app.getConfig().getSync().getQuietHoursStart() == null) {
app.getConfig().getSync().setQuietHoursStart(new Time(22, 30, 0));
@ -723,10 +681,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
getString(R.string.settings_sync_web_push_text),
getString(R.string.settings_sync_web_push_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_laptop)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon2.cmd_laptop, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
activity.loadTarget(MainActivity.TARGET_WEB_PUSH, null);
@ -741,10 +696,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
"Dźwięk powiadomień",
"Szkolny.eu",
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_volume_high)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon2.cmd_volume_high, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
@ -752,20 +704,16 @@ public class SettingsNewFragment extends MaterialAboutFragment {
);*/
items.add(
new MaterialAboutSwitchItem(
getString(R.string.settings_sync_updates_text),
null,
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_cellphone_arrow_down)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
)
new MaterialAboutSwitchItem.Builder()
.text(R.string.settings_sync_updates_text)
.icon(icon(CommunityMaterial.Icon.cmd_cellphone_arrow_down, iconSizeDp, iconColor))
.setChecked(app.getConfig().getSync().getNotifyAboutUpdates())
.setOnChangeAction((isChecked, tag) -> {
.setOnCheckedChanged((item, isChecked) -> {
app.getConfig().getSync().setNotifyAboutUpdates(isChecked);
UpdateWorker.Companion.rescheduleNext(app);
return true;
})
.build()
);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
@ -773,10 +721,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
new MaterialAboutActionItem(
getString(R.string.settings_sync_notifications_settings_text),
getString(R.string.settings_sync_notifications_settings_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_settings_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon.cmd_cog_outline, iconSizeDp, iconColor)
)
.setOnClickAction(() -> {
String channel = app.getNotificationChannelsManager().getData().getKey();
@ -846,16 +791,12 @@ public class SettingsNewFragment extends MaterialAboutFragment {
);
}
private MaterialAboutItem getRegisterCardSharedEventsItem() {
return new MaterialAboutSwitchItem(
getString(R.string.settings_register_shared_events_text),
getString(R.string.settings_register_shared_events_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_share_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
)
return new MaterialAboutSwitchItem.Builder()
.text(R.string.settings_register_shared_events_text)
.subText(R.string.settings_register_shared_events_subtext)
.icon(icon(CommunityMaterial.Icon3.cmd_share_outline, iconSizeDp, iconColor))
.setChecked(app.getProfile().getEnableSharedEvents())
.setOnChangeAction((isChecked, tag) -> {
.setOnCheckedChanged((item, isChecked) -> {
app.getProfile().setEnableSharedEvents(isChecked);
app.profileSave();
if (isChecked) new MaterialDialog.Builder(activity)
@ -869,7 +810,8 @@ public class SettingsNewFragment extends MaterialAboutFragment {
.positiveText(R.string.ok)
.show();
return true;
});
})
.build();
}
private MaterialAboutSwitchItem registerCardAllowRegistrationItem;
@ -880,31 +822,22 @@ public class SettingsNewFragment extends MaterialAboutFragment {
items.add(new MaterialAboutActionItem(
getString(R.string.menu_grades_config),
null,
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_numeric_5_box_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon3.cmd_numeric_5_box_outline, iconSizeDp, iconColor)
).setOnClickAction(() -> new GradesConfigDialog(activity, false, null, null)));
items.add(new MaterialAboutActionItem(
getString(R.string.menu_attendance_config),
null,
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_calendar_remove_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(CommunityMaterial.Icon.cmd_calendar_remove_outline, iconSizeDp, iconColor)
).setOnClickAction(() -> new AttendanceConfigDialog(activity, false, null, null)));
registerCardAllowRegistrationItem = new MaterialAboutSwitchItem(
getString(R.string.settings_register_allow_registration_text),
getString(R.string.settings_register_allow_registration_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_account_circle_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
);
registerCardAllowRegistrationItem = new MaterialAboutSwitchItem.Builder()
.text(R.string.settings_register_allow_registration_text)
.subText(R.string.settings_register_allow_registration_subtext)
.icon(icon(CommunityMaterial.Icon.cmd_account_circle_outline, iconSizeDp, iconColor))
.build();
registerCardAllowRegistrationItem.setChecked(app.getProfile().getRegistration() == REGISTRATION_ENABLED);
registerCardAllowRegistrationItem.setOnChangeAction((isChecked, tag) -> {
registerCardAllowRegistrationItem.setOnCheckedChangedAction((item, isChecked) -> {
if (isChecked) new MaterialDialog.Builder(activity)
.title(getString(R.string.settings_register_allow_registration_dialog_enabled_title))
.content(getString(R.string.settings_register_allow_registration_dialog_enabled_text))
@ -958,10 +891,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
registerCardBellSyncItem = new MaterialAboutActionItem(
getString(R.string.settings_register_bell_sync_text),
getRegisterCardBellSyncSubText(),
new IconicsDrawable(activity)
.icon(SzkolnyFont.Icon.szf_alarm_bell_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
icon(SzkolnyFont.Icon.szf_alarm_bell_outline, iconSizeDp, iconColor)
);
registerCardBellSyncItem.setOnClickAction(() -> {
new MaterialDialog.Builder(activity)
@ -1025,55 +955,44 @@ public class SettingsNewFragment extends MaterialAboutFragment {
items.add(registerCardBellSyncItem);
items.add(
new MaterialAboutSwitchItem(
getString(R.string.settings_register_count_in_seconds_text),
getString(R.string.settings_register_count_in_seconds_subtext),
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_timer)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
)
new MaterialAboutSwitchItem.Builder()
.text(R.string.settings_register_count_in_seconds_text)
.subText(R.string.settings_register_count_in_seconds_subtext)
.icon(icon(CommunityMaterial.Icon3.cmd_timer, iconSizeDp, iconColor))
.setChecked(app.getConfig().getTimetable().getCountInSeconds())
.setOnChangeAction((isChecked, tag) -> {
.setOnCheckedChanged((item, isChecked) -> {
app.getConfig().getTimetable().setCountInSeconds(isChecked);
return true;
})
.build()
);
if (app.getProfile().getLoginStoreType() == LoginStore.LOGIN_TYPE_LIBRUS) {
items.add(
new MaterialAboutSwitchItem(
getString(R.string.settings_register_show_teacher_absences_text),
null,
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_account_arrow_right_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
)
new MaterialAboutSwitchItem.Builder()
.text(R.string.settings_register_show_teacher_absences_text)
.icon(icon(CommunityMaterial.Icon.cmd_account_arrow_right_outline, iconSizeDp, iconColor))
.setChecked(app.getProfile().getStudentData("showTeacherAbsences", true))
.setOnChangeAction((isChecked, tag) -> {
.setOnCheckedChanged((item, isChecked) -> {
app.getProfile().putStudentData("showTeacherAbsences", isChecked);
app.profileSave();
return true;
})
.build()
);
}
if (App.Companion.getDevMode()) {
items.add(
new MaterialAboutSwitchItem(
getString(R.string.settings_register_hide_sticks_from_old),
null,
new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_numeric_1_box_outline)
.size(IconicsSize.dp(iconSizeDp))
.color(IconicsColor.colorInt(iconColor))
)
new MaterialAboutSwitchItem.Builder()
.text(R.string.settings_register_hide_sticks_from_old)
.icon(icon(CommunityMaterial.Icon3.cmd_numeric_1_box_outline, iconSizeDp, iconColor))
.setChecked(app.getConfig().forProfile().getGrades().getHideSticksFromOld())
.setOnChangeAction((isChecked, tag) -> {
.setOnCheckedChanged((item, isChecked) -> {
app.getConfig().forProfile().getGrades().setHideSticksFromOld(isChecked);
return true;
})
.build()
);
}
@ -1097,20 +1016,13 @@ public class SettingsNewFragment extends MaterialAboutFragment {
items.add(new MaterialAboutTitleItem.Builder()
.text(R.string.app_name)
.desc(R.string.settings_about_title_subtext)
.textColor(primaryTextOnPrimaryBg)
.descColor(secondaryTextOnPrimaryBg)
.icon(R.mipmap.ic_splash)
.build());
pref_about_version = new MaterialAboutActionItem.Builder()
.text(R.string.settings_about_version_text)
.textColor(primaryTextOnPrimaryBg)
.subTextColor(secondaryTextOnPrimaryBg)
.subText(BuildConfig.VERSION_NAME + ", " + BuildConfig.BUILD_TYPE)
.icon(new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_information_outline)
.color(IconicsColor.colorInt(primaryTextOnPrimaryBg))
.size(IconicsSize.dp(iconSizeDp)))
.icon(icon(CommunityMaterial.Icon2.cmd_information_outline, iconSizeDp, primaryTextOnPrimaryBg))
.build();
final int[] clickCounter = {0};
pref_about_version.setOnClickAction(() -> {
@ -1129,36 +1041,21 @@ public class SettingsNewFragment extends MaterialAboutFragment {
items.add(new MaterialAboutActionItem.Builder()
.text(R.string.settings_about_privacy_policy_text)
.textColor(primaryTextOnPrimaryBg)
.subTextColor(secondaryTextOnPrimaryBg)
.icon(new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_shield_outline)
.color(IconicsColor.colorInt(primaryTextOnPrimaryBg))
.size(IconicsSize.dp(iconSizeDp)))
.icon(icon(CommunityMaterial.Icon3.cmd_shield_outline, iconSizeDp, primaryTextOnPrimaryBg))
.setOnClickAction(ConvenienceBuilder.createWebsiteOnClickAction(activity, Uri.parse("https://szkolny.eu/privacy-policy")))
.build());
items.add(new MaterialAboutActionItem.Builder()
.text(R.string.settings_about_discord_text)
.textColor(primaryTextOnPrimaryBg)
.subTextColor(secondaryTextOnPrimaryBg)
.subText(R.string.settings_about_discord_subtext)
.icon(new IconicsDrawable(activity)
.icon(SzkolnyFont.Icon.szf_discord_outline)
.color(IconicsColor.colorInt(primaryTextOnPrimaryBg))
.size(IconicsSize.dp(iconSizeDp)))
.icon(icon(SzkolnyFont.Icon.szf_discord_outline, iconSizeDp, primaryTextOnPrimaryBg))
.setOnClickAction(ConvenienceBuilder.createWebsiteOnClickAction(activity, Uri.parse("https://szkolny.eu/discord")))
.build());
items.add(new MaterialAboutActionItem.Builder()
.text(R.string.settings_about_language_text)
.textColor(primaryTextOnPrimaryBg)
.subTextColor(secondaryTextOnPrimaryBg)
.subText(R.string.settings_about_language_subtext)
.icon(new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_translate)
.color(IconicsColor.colorInt(primaryTextOnPrimaryBg))
.size(IconicsSize.dp(iconSizeDp)))
.icon(icon(CommunityMaterial.Icon3.cmd_translate, iconSizeDp, primaryTextOnPrimaryBg))
.setOnClickAction(() -> {
new MaterialDialog.Builder(activity)
.title(getString(R.string.settings_about_language_dialog_title))
@ -1193,12 +1090,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
items.add(new MaterialAboutActionItem.Builder()
.text(R.string.settings_about_update_text)
.subText(R.string.settings_about_update_subtext)
.textColor(primaryTextOnPrimaryBg)
.subTextColor(secondaryTextOnPrimaryBg)
.icon(new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_update)
.color(IconicsColor.colorInt(primaryTextOnPrimaryBg))
.size(IconicsSize.dp(iconSizeDp)))
.icon(icon(CommunityMaterial.Icon3.cmd_update, iconSizeDp, primaryTextOnPrimaryBg))
.setOnClickAction(() -> {
//open browser or intent here
NetworkUtils net = new NetworkUtils(app);
@ -1218,23 +1110,13 @@ public class SettingsNewFragment extends MaterialAboutFragment {
items.add(new MaterialAboutActionItem.Builder()
.text(R.string.settings_about_changelog_text)
.textColor(primaryTextOnPrimaryBg)
.subTextColor(secondaryTextOnPrimaryBg)
.icon(new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_radar)
.color(IconicsColor.colorInt(primaryTextOnPrimaryBg))
.size(IconicsSize.dp(iconSizeDp)))
.icon(icon(CommunityMaterial.Icon3.cmd_radar, iconSizeDp, primaryTextOnPrimaryBg))
.setOnClickAction(() -> new ChangelogDialog(activity, null, null))
.build());
items.add(new MaterialAboutActionItem.Builder()
.text(R.string.settings_about_licenses_text)
.textColor(primaryTextOnPrimaryBg)
.subTextColor(secondaryTextOnPrimaryBg)
.icon(new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_code_braces)
.color(IconicsColor.colorInt(primaryTextOnPrimaryBg))
.size(IconicsSize.dp(iconSizeDp)))
.icon(icon(CommunityMaterial.Icon.cmd_code_braces, iconSizeDp, primaryTextOnPrimaryBg))
.setOnClickAction(() -> {
Intent intent = new Intent(activity, SettingsLicenseActivity.class);
startActivity(intent);
@ -1243,10 +1125,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
/*items.add(new MaterialAboutActionItem.Builder()
.text(R.string.settings_about_intro_text)
.icon(new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon2.cmd_projector_screen)
.color(IconicsColor.colorInt(iconColor))
.size(IconicsSize.dp(iconSizeDp)))
.icon(icon(CommunityMaterial.Icon2.cmd_projector_screen, iconSizeDp, iconColor))
.setOnClickAction(() -> {
if (tryingToDevMode[0]) {
if (getParentFragment() instanceof SettingsGeneralFragment) {
@ -1267,12 +1146,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
items.add(new MaterialAboutActionItem.Builder()
.text(R.string.settings_about_crash_text)
.subText(R.string.settings_about_crash_subtext)
.textColor(primaryTextOnPrimaryBg)
.subTextColor(secondaryTextOnPrimaryBg)
.icon(new IconicsDrawable(activity)
.icon(CommunityMaterial.Icon.cmd_bug_outline)
.color(IconicsColor.colorInt(primaryTextOnPrimaryBg))
.size(IconicsSize.dp(iconSizeDp)))
.icon(icon(CommunityMaterial.Icon.cmd_bug_outline, iconSizeDp, primaryTextOnPrimaryBg))
.setOnClickAction(() -> {
throw new RuntimeException("MANUAL CRASH");
})
@ -1304,11 +1178,6 @@ public class SettingsNewFragment extends MaterialAboutFragment {
return materialAboutList;
}
@Override
protected int getTheme() {
return Themes.INSTANCE.getAppTheme();
}
/* _____ _ ____ _ _
/ ____| | | | _ \ | | | |
| | _ _ ___| |_ ___ _ __ ___ | |_) | __ _ ___| | ____ _ _ __ ___ _ _ _ __ __| |___

View File

@ -17,9 +17,8 @@ import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.Icon2
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog
import eu.szkolny.font.SzkolnyFont
import kotlinx.coroutines.*
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.MainActivity
@ -192,7 +191,7 @@ class TimetableFragment : Fragment(), CoroutineScope {
BottomSheetPrimaryItem(true)
.withTitle(R.string.menu_generate_block_timetable)
.withDescription(R.string.menu_generate_block_timetable_desc)
.withIcon(Icon2.cmd_table_large)
.withIcon(CommunityMaterial.Icon3.cmd_table_large)
.withOnClickListener(View.OnClickListener {
activity.bottomSheet.close()
GenerateBlockTimetableDialog(activity)

View File

@ -11,11 +11,10 @@ import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.chip.Chip
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.IIcon
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import com.mikepenz.iconics.utils.paddingDp
import com.mikepenz.iconics.utils.sizeDp
import eu.szkolny.font.SzkolnyFont
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@ -60,7 +59,7 @@ class AttachmentAdapter(
val fileName = item.name.substringBefore(":http")
// create an icon for the attachment
val icon: IIcon = when (Utils.getExtensionFromFileName(fileName)) {
val attachmentIcon = when (Utils.getExtensionFromFileName(fileName)) {
"doc", "docx", "odt", "rtf" -> SzkolnyFont.Icon.szf_file_word_outline
"xls", "xlsx", "ods" -> SzkolnyFont.Icon.szf_file_excel_outline
"ppt", "pptx", "odp" -> SzkolnyFont.Icon.szf_file_powerpoint_outline
@ -70,7 +69,7 @@ class AttachmentAdapter(
"jpg", "jpeg", "png", "bmp", "gif" -> SzkolnyFont.Icon.szf_file_image_outline
"zip", "rar", "tar", "7z" -> SzkolnyFont.Icon.szf_zip_box_outline
"html", "cpp", "c", "h", "css", "java", "py" -> SzkolnyFont.Icon.szf_file_code_outline
else -> CommunityMaterial.Icon.cmd_file_document_outline
else -> CommunityMaterial.Icon2.cmd_file_document_outline
}
b.chip.text = if (item.isDownloading) {
@ -82,15 +81,17 @@ class AttachmentAdapter(
} ?: fileName
}
b.chip.chipIcon = IconicsDrawable(context)
.icon(icon)
.colorAttr(context, R.attr.colorOnSurface)
.sizeDp(24)
.paddingDp(2)
b.chip.closeIcon = IconicsDrawable(context)
.icon(CommunityMaterial.Icon.cmd_check)
.colorAttr(context, R.attr.colorOnSurface)
.sizeDp(18)
b.chip.chipIcon = IconicsDrawable(context).apply {
icon = attachmentIcon
colorAttr(context, R.attr.colorOnSurface)
sizeDp = 24
paddingDp = 2
}
b.chip.closeIcon = IconicsDrawable(context).apply {
icon = CommunityMaterial.Icon.cmd_check
colorAttr(context, R.attr.colorOnSurface)
sizeDp = 18
}
b.chip.isCloseIconVisible = item.isDownloaded && !item.isDownloading
// prevent progress bar flickering

View File

@ -48,10 +48,10 @@ class WidgetNotificationsProvider : AppWidgetProvider() {
views.setImageViewBitmap(
R.id.widgetNotificationsSync,
IconicsDrawable(context, CommunityMaterial.Icon.cmd_download_outline)
.colorInt(Color.WHITE)
.sizeDp(iconSize)
.toBitmap()
IconicsDrawable(context, CommunityMaterial.Icon.cmd_download_outline).apply {
colorInt = Color.WHITE
sizeDp = iconSize
}.toBitmap()
)
views.setViewVisibility(R.id.widgetNotificationsLoading, View.GONE)

View File

@ -24,13 +24,14 @@ import android.widget.RemoteViewsService;
import androidx.annotation.DrawableRes;
import com.mikepenz.iconics.IconicsColor;
import com.mikepenz.iconics.IconicsDrawable;
import com.mikepenz.iconics.IconicsSize;
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial;
import com.mikepenz.iconics.utils.IconicsConvertersKt;
import com.mikepenz.iconics.utils.IconicsDrawableExtensionsKt;
import java.util.List;
import kotlin.Unit;
import pl.szczodrzynski.edziennik.R;
import pl.szczodrzynski.edziennik.utils.models.Date;
import pl.szczodrzynski.edziennik.utils.models.ItemWidgetTimetableModel;
@ -126,6 +127,15 @@ public class WidgetTimetableFactory implements RemoteViewsService.RemoteViewsFac
return resultBitmap;
}
private Bitmap homeIconBitmap() {
return new IconicsDrawable(context).apply((drawable) -> {
IconicsConvertersKt.setColorRes(drawable, R.color.md_red_500);
IconicsConvertersKt.setSizeDp(drawable, 10);
IconicsDrawableExtensionsKt.icon(drawable, CommunityMaterial.Icon2.cmd_home);
return Unit.INSTANCE;
}).toBitmap();
}
@Override
public RemoteViews getViewAt(int i) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.row_widget_timetable_item);
@ -270,19 +280,19 @@ public class WidgetTimetableFactory implements RemoteViewsService.RemoteViewsFac
if (lesson.eventColors.size() >= 1) {
views.setViewVisibility(R.id.widgetTimetableEvent1, View.VISIBLE);
if (lesson.eventColors.get(0) == -1)
views.setBitmap(R.id.widgetTimetableEvent1, "setImageBitmap", new IconicsDrawable(context).color(IconicsColor.colorRes(R.color.md_red_500)).size(IconicsSize.dp(10)).icon(CommunityMaterial.Icon2.cmd_home).toBitmap());
views.setBitmap(R.id.widgetTimetableEvent1, "setImageBitmap", homeIconBitmap());
else
views.setBitmap(R.id.widgetTimetableEvent1, "setImageBitmap", getColoredBitmap(context, R.drawable.event_color_circle, lesson.eventColors.get(0), eventIndicatorSize, eventIndicatorSize));
if (lesson.eventColors.size() >= 2) {
views.setViewVisibility(R.id.widgetTimetableEvent2, View.VISIBLE);
if (lesson.eventColors.get(1) == -1)
views.setBitmap(R.id.widgetTimetableEvent2, "setImageBitmap", new IconicsDrawable(context).color(IconicsColor.colorRes(R.color.md_red_500)).size(IconicsSize.dp(10)).icon(CommunityMaterial.Icon2.cmd_home).toBitmap());
views.setBitmap(R.id.widgetTimetableEvent2, "setImageBitmap", homeIconBitmap());
else
views.setBitmap(R.id.widgetTimetableEvent2, "setImageBitmap", getColoredBitmap(context, R.drawable.event_color_circle, lesson.eventColors.get(1), eventIndicatorSize, eventIndicatorSize));
if (lesson.eventColors.size() >= 3) {
views.setViewVisibility(R.id.widgetTimetableEvent3, View.VISIBLE);
if (lesson.eventColors.get(2) == -1)
views.setBitmap(R.id.widgetTimetableEvent3, "setImageBitmap", new IconicsDrawable(context).color(IconicsColor.colorRes(R.color.md_red_500)).size(IconicsSize.dp(10)).icon(CommunityMaterial.Icon2.cmd_home).toBitmap());
views.setBitmap(R.id.widgetTimetableEvent3, "setImageBitmap", homeIconBitmap());
else
views.setBitmap(R.id.widgetTimetableEvent3, "setImageBitmap", getColoredBitmap(context, R.drawable.event_color_circle, lesson.eventColors.get(2), eventIndicatorSize, eventIndicatorSize));
}

View File

@ -115,13 +115,21 @@ class WidgetTimetableProvider : AppWidgetProvider() {
views.setOnClickPendingIntent(R.id.widgetTimetableSync, getPendingSelfIntent(context, ACTION_SYNC_DATA))
views.setImageViewBitmap(R.id.widgetTimetableRefresh, IconicsDrawable(context, CommunityMaterial.Icon2.cmd_refresh)
.colorInt(Color.WHITE)
.sizeDp(if (config.bigStyle) 24 else 16).toBitmap())
views.setImageViewBitmap(
R.id.widgetTimetableRefresh,
IconicsDrawable(context, CommunityMaterial.Icon3.cmd_refresh).apply {
colorInt = Color.WHITE
sizeDp = if (config.bigStyle) 24 else 16
}.toBitmap()
)
views.setImageViewBitmap(R.id.widgetTimetableSync, IconicsDrawable(context, CommunityMaterial.Icon.cmd_download_outline)
.colorInt(Color.WHITE)
.sizeDp(if (config.bigStyle) 24 else 16).toBitmap())
views.setImageViewBitmap(
R.id.widgetTimetableSync,
IconicsDrawable(context, CommunityMaterial.Icon.cmd_download_outline).apply {
colorInt = Color.WHITE
sizeDp = if (config.bigStyle) 24 else 16
}.toBitmap()
)
prepareAppWidget(app, appWidgetId, views, config, bellSyncDiffMillis)

View File

@ -0,0 +1,208 @@
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package pl.szczodrzynski.edziennik.utils;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
/**
* The SwipeRefreshLayout should be used whenever the user can refresh the
* contents of a view via a vertical swipe gesture. The activity that
* instantiates this view should add an OnRefreshListener to be notified
* whenever the swipe to refresh gesture is completed. The SwipeRefreshLayout
* will notify the listener each and every time the gesture is completed again;
* the listener is responsible for correctly determining when to actually
* initiate a refresh of its content. If the listener determines there should
* not be a refresh, it must call setRefreshing(false) to cancel any visual
* indication of a refresh. If an activity wishes to show just the progress
* animation, it should call setRefreshing(true). To disable the gesture and
* progress animation, call setEnabled(false) on the view.
* <p>
* This layout should be made the parent of the view that will be refreshed as a
* result of the gesture and can only support one direct child. This view will
* also be made the target of the gesture and will be forced to match both the
* width and the height supplied in this layout. The SwipeRefreshLayout does not
* provide accessibility events; instead, a menu item must be provided to allow
* refresh of the content wherever this gesture is used.
* </p>
*/
public class SwipeRefreshLayoutNoIndicator extends SwipeRefreshLayout {
private SwipeRefreshLayoutNoTouch parent;
@Override
public void setEnabled(boolean enabled) {
if (parent == null)
return;
parent.setEnabled(enabled);
super.setEnabled(enabled);
}
public void setParent(SwipeRefreshLayoutNoTouch parent) {
this.parent = parent;
}
/**
* Simple constructor to use when creating a SwipeRefreshLayout from code.
*
* @param context
*/
public SwipeRefreshLayoutNoIndicator(@NonNull Context context) {
this(context, null);
}
/**
* Constructor that is called when inflating SwipeRefreshLayout from XML.
*
* @param context
* @param attrs
*/
public SwipeRefreshLayoutNoIndicator(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
ev.setSource(0x10000000);
boolean parentConsumed = parent.onInterceptTouchEvent(ev);
boolean superConsumed = super.onInterceptTouchEvent(ev);
return parentConsumed && superConsumed;
/*if (super.onInterceptTouchEvent(ev))
return parent.onInterceptTouchEvent(ev);
return false;*/
}
@Override
public void requestDisallowInterceptTouchEvent(boolean b) {
parent.requestDisallowInterceptTouchEvent(b);
}
// NestedScrollingParent
@Override
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
parent.onStartNestedScroll(child, target, nestedScrollAxes);
return !parent.isRefreshing() && super.onStartNestedScroll(child, target, nestedScrollAxes);
}
@Override
public void onNestedScrollAccepted(View child, View target, int axes) {
parent.onNestedScrollAccepted(child, target, axes);
}
@Override
public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
parent.onNestedPreScroll(target, dx, dy, consumed);
}
@Override
public int getNestedScrollAxes() {
return parent.getNestedScrollAxes();
}
@Override
public void onStopNestedScroll(View target) {
parent.onStopNestedScroll(target);
}
@Override
public void onNestedScroll(final View target, final int dxConsumed, final int dyConsumed,
final int dxUnconsumed, final int dyUnconsumed) {
parent.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
}
// NestedScrollingChild
@Override
public void setNestedScrollingEnabled(boolean enabled) {
if (parent == null)
return;
//parent.setNestedScrollingEnabled(enabled);
super.setNestedScrollingEnabled(enabled);
}
@Override
public boolean isNestedScrollingEnabled() {
return parent.isNestedScrollingEnabled();
}
@Override
public boolean startNestedScroll(int axes) {
return parent.startNestedScroll(axes);
}
@Override
public void stopNestedScroll() {
parent.stopNestedScroll();
}
@Override
public boolean hasNestedScrollingParent() {
return parent.hasNestedScrollingParent();
}
@Override
public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed,
int dyUnconsumed, int[] offsetInWindow) {
return super.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow);
}
@Override
public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
return super.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
}
@Override
public boolean onNestedPreFling(View target, float velocityX,
float velocityY) {
return parent.onNestedPreFling(target, velocityX, velocityY);
}
@Override
public boolean onNestedFling(View target, float velocityX, float velocityY,
boolean consumed) {
return parent.onNestedFling(target, velocityX, velocityY, consumed);
}
@Override
public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
return parent.dispatchNestedFling(velocityX, velocityY, consumed);
}
@Override
public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
return parent.dispatchNestedPreFling(velocityX, velocityY);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
ev.setSource(0x10000000);
/*boolean consumed = super.onTouchEvent(ev);
if (consumed) {
return false;
}*/
return parent.onTouchEvent(ev);
}
}

View File

@ -0,0 +1,51 @@
package pl.szczodrzynski.edziennik.utils;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
public class SwipeRefreshLayoutNoTouch extends SwipeRefreshLayout {
public SwipeRefreshLayoutNoTouch(@NonNull Context context) {
super(context);
}
public SwipeRefreshLayoutNoTouch(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getSource() == 0x10000000) {
// forward the event to super
return super.onInterceptTouchEvent(ev);
}
// discard all the other events
return false;
/*if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL)
return false;
super.onInterceptTouchEvent(ev);
return false;*/
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getSource() == 0x10000000) {
// forward the event to super
return super.onTouchEvent(ev);
}
// discard all the other events
return false;
}
}

View File

@ -206,6 +206,7 @@
app:flexWrap="wrap"
app:justifyContent="flex_end">
<!-- cmd_eye_check_outline -->
<com.google.android.material.button.MaterialButton
android:id="@+id/checkDoneButton"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
@ -213,53 +214,57 @@
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:checkable="true"
android:fontFamily="@font/community_material_font_v3_5_95_1"
android:fontFamily="@font/community_material_font_v5_8_55"
android:minWidth="0dp"
android:text="\uFCE1"
android:text="\uf4df"
android:textSize="20sp" />
<!-- cmd_pencil_outline -->
<com.google.android.material.button.MaterialButton
android:id="@+id/editButton"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="@font/community_material_font_v3_5_95_1"
android:fontFamily="@font/community_material_font_v5_8_55"
android:minWidth="0dp"
android:text="\uFC92"
android:text="\uf2f4"
android:textSize="20sp" />
<!-- cmd_calendar_export -->
<com.google.android.material.button.MaterialButton
android:id="@+id/saveInCalendarButton"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="@font/community_material_font_v3_5_95_1"
android:fontFamily="@font/community_material_font_v5_8_55"
android:minWidth="0dp"
android:text="\uFB09"
android:text="\uf97a"
android:textSize="20sp" />
<!-- cmd_cursor_default_click_outline -->
<com.google.android.material.button.MaterialButton
android:id="@+id/goToTimetableButton"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="@font/community_material_font_v3_5_95_1"
android:fontFamily="@font/community_material_font_v5_8_55"
android:minWidth="0dp"
android:text="\uFCDA"
android:text="\ufc90"
android:textSize="20sp" />
<!-- cmd_download_outline -->
<com.google.android.material.button.MaterialButton
android:id="@+id/downloadButton"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:fontFamily="@font/community_material_font_v3_5_95_1"
android:fontFamily="@font/community_material_font_v5_8_55"
android:minWidth="0dp"
android:text="\uFB6B"
android:text="\uf436"
android:textSize="20sp" />
</com.google.android.flexbox.FlexboxLayout>
</LinearLayout>

Some files were not shown because too many files have changed in this diff Show More