From 3c2ac1fe51d690be24eedda32999b6e1e57f4b33 Mon Sep 17 00:00:00 2001 From: abbas Date: Wed, 3 Apr 2019 14:17:58 +0430 Subject: [PATCH] add some abstraction layer --- app/src/main/AndroidManifest.xml | 2 +- .../components/views/CalendarBottomSheet.kt | 47 +++-- .../features/{home => }/MainActivity.kt | 3 +- .../features/calendarPage/CalendarFragment.kt | 9 +- .../features/home/HomeFragment.kt | 86 ++++----- .../notification/NotificationHelper.kt | 7 +- .../notification/NotificationService.kt | 8 +- .../notification/NotificationUpdateService.kt | 9 +- .../persiancalendar/pojos/CalendarDay.kt | 5 +- .../pojos/{UserEvent.kt => GoogleEvent.kt} | 3 +- .../refactoring/CalendarManagerFactory.kt | 14 ++ .../refactoring/PersianCalendarManager.kt | 97 ++++++++++ .../refactoring/bases/CalendarManager.kt | 9 + .../refactoring/bases/CalendarTypes.kt | 5 + .../refactoring/bases/Event.kt | 14 ++ .../refactoring/bases/EventDataSource.kt | 9 + .../bases/MutableEventDataSource.kt | 13 ++ .../eventdatasource/GoogleEventDataSource.kt | 78 +++++++++ .../SolarHijriEventsDataSource.kt | 73 ++++++++ .../refactoring/events/CalendarEvent.kt | 11 ++ .../refactoring/events/UserEvent.kt | 14 ++ ...aStore.kt => GoogleCalendarEventHelper.kt} | 23 ++- .../persiancalendar/repository/Repository.kt | 165 ------------------ app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/menu/menu_main.xml | 2 +- 25 files changed, 448 insertions(+), 260 deletions(-) rename app/src/main/java/com/esbati/keivan/persiancalendar/features/{home => }/MainActivity.kt (97%) rename app/src/main/java/com/esbati/keivan/persiancalendar/pojos/{UserEvent.kt => GoogleEvent.kt} (96%) create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/CalendarManagerFactory.kt create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/PersianCalendarManager.kt create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/CalendarManager.kt create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/CalendarTypes.kt create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/Event.kt create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/EventDataSource.kt create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/MutableEventDataSource.kt create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/eventdatasource/GoogleEventDataSource.kt create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/eventdatasource/SolarHijriEventsDataSource.kt create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/events/CalendarEvent.kt create mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/events/UserEvent.kt rename app/src/main/java/com/esbati/keivan/persiancalendar/repository/{CalendarDataStore.kt => GoogleCalendarEventHelper.kt} (90%) delete mode 100644 app/src/main/java/com/esbati/keivan/persiancalendar/repository/Repository.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d80fc5..400f94b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ android:name=".components.ApplicationController" android:theme="@style/AppTheme"> - diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/components/views/CalendarBottomSheet.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/components/views/CalendarBottomSheet.kt index 7f4f30d..1f52387 100644 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/components/views/CalendarBottomSheet.kt +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/components/views/CalendarBottomSheet.kt @@ -16,12 +16,9 @@ import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import com.esbati.keivan.persiancalendar.pojos.CalendarDay -import com.esbati.keivan.persiancalendar.pojos.UserEvent +import com.esbati.keivan.persiancalendar.pojos.GoogleEvent import com.esbati.keivan.persiancalendar.R -import com.esbati.keivan.persiancalendar.repository.Repository import com.esbati.keivan.persiancalendar.utils.AndroidUtilities -import com.esbati.keivan.persiancalendar.utils.Constants -import java.util.* /** * Created by asus on 11/25/2016. @@ -37,7 +34,7 @@ class CalendarBottomSheet @JvmOverloads constructor(context: Context, attrs: Att private var mShouldUpdateBottomSheet: Boolean = false private var mShouldExpandBottomSheet: Boolean = false private lateinit var mSelectedDay: CalendarDay - private var mSelectedEvent: UserEvent? = null + private var mSelectedEvent: GoogleEvent? = null //Views private var mBottomSheet: NestedScrollView @@ -95,14 +92,14 @@ class CalendarBottomSheet @JvmOverloads constructor(context: Context, attrs: Att proceedToSetupBottomSheet(Mode.SHEET_MODE_DATE) } - fun showEvent(event: UserEvent) { + fun showEvent(event: GoogleEvent) { mShouldExpandBottomSheet = true mSelectedEvent = event proceedToSetupBottomSheet(Mode.SHEET_MODE_VIEW_EVENT) } - fun editEvent(event: UserEvent?, isEditable: Boolean) { + fun editEvent(event: GoogleEvent?, isEditable: Boolean) { mShouldExpandBottomSheet = true mSelectedEvent = event @@ -110,7 +107,7 @@ class CalendarBottomSheet @JvmOverloads constructor(context: Context, attrs: Att } @SuppressLint("SetTextI18n") - private fun setDateSheet(day: CalendarDay, onEventClick: (UserEvent) -> Unit) { + private fun setDateSheet(day: CalendarDay, onEventClick: (GoogleEvent) -> Unit) { //Set Date mPersianDate.text = day.formattedDate mGregorianDate.text = day.formattedDateSecondary @@ -127,7 +124,7 @@ class CalendarBottomSheet @JvmOverloads constructor(context: Context, attrs: Att else eventTitle.setText(R.string.event_no_title) - eventView.setOnClickListener { onEventClick(event)} +// eventView.setOnClickListener { onEventClick(event)} mBottomSheetContainer.addView(eventView) } @@ -143,14 +140,14 @@ class CalendarBottomSheet @JvmOverloads constructor(context: Context, attrs: Att val eventView = LayoutInflater.from(context).inflate(R.layout.cell_bottom_sheet_day, mBottomSheetContainer, false) val eventTitle = eventView.findViewById(R.id.event_title) as TextView - eventTitle.text = calendarEvent.mTitle + eventTitle.text = calendarEvent.title eventView.setBackgroundResource(if (calendarEvent.isHoliday) R.drawable.bg_calendar_holiday else R.drawable.bg_calendar_today) mBottomSheetContainer.addView(eventView) } } } - private fun setShowEventSheet(event: UserEvent, onDeleteEvent: () -> Unit) { + private fun setShowEventSheet(event: GoogleEvent, onDeleteEvent: () -> Unit) { //Set Bottom Sheet mBottomSheetContainer.removeAllViews() @@ -192,7 +189,7 @@ class CalendarBottomSheet @JvmOverloads constructor(context: Context, attrs: Att mBottomSheetContainer.addView(eventDescription) } - private fun setEditEventSheet(event: UserEvent) { + private fun setEditEventSheet(event: GoogleEvent) { mBottomSheetContainer.removeAllViews() val eventSheet = LayoutInflater.from(context).inflate(R.layout.cell_event_sheet, mBottomSheetContainer, false) @@ -264,17 +261,17 @@ class CalendarBottomSheet @JvmOverloads constructor(context: Context, attrs: Att } CalendarBottomSheet.Mode.SHEET_MODE_EDIT_EVENT -> { - val tempEvent = mSelectedEvent?.copy() ?: Repository.createEventFor(mSelectedDay) - setEditEventSheet(tempEvent) - - eventActionBtn.setImageResource(R.drawable.ic_check_white_24dp) - eventActionBtn.setOnClickListener { view -> - AndroidUtilities.hideSoftKeyboard(view) - onEventListener?.onEventEdited(tempEvent.copy( - title = mEventTitle.text.toString(), - description = mEventDesc.text.toString() - )) - } +// val tempEvent = mSelectedEvent?.copy() ?: Repository.createEventFor(mSelectedDay) +// setEditEventSheet(tempEvent) +// +// eventActionBtn.setImageResource(R.drawable.ic_check_white_24dp) +// eventActionBtn.setOnClickListener { view -> +// AndroidUtilities.hideSoftKeyboard(view) +// onEventListener?.onEventEdited(tempEvent.copy( +// title = mEventTitle.text.toString(), +// description = mEventDesc.text.toString() +// )) +// } } } @@ -295,7 +292,7 @@ class CalendarBottomSheet @JvmOverloads constructor(context: Context, attrs: Att } interface OnEventListener{ - fun onEventDeleted(deletedEvent: UserEvent) - fun onEventEdited(editedEvent: UserEvent) + fun onEventDeleted(deletedEvent: GoogleEvent) + fun onEventEdited(editedEvent: GoogleEvent) } } diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/features/home/MainActivity.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/features/MainActivity.kt similarity index 97% rename from app/src/main/java/com/esbati/keivan/persiancalendar/features/home/MainActivity.kt rename to app/src/main/java/com/esbati/keivan/persiancalendar/features/MainActivity.kt index c99c67c..13f9b96 100644 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/features/home/MainActivity.kt +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/features/MainActivity.kt @@ -1,4 +1,4 @@ -package com.esbati.keivan.persiancalendar.features.home +package com.esbati.keivan.persiancalendar.features import android.Manifest import android.app.AlertDialog @@ -12,6 +12,7 @@ import android.support.v4.content.ContextCompat import android.support.v7.app.AppCompatActivity import android.view.View import com.esbati.keivan.persiancalendar.R +import com.esbati.keivan.persiancalendar.features.home.HomeFragment import com.esbati.keivan.persiancalendar.utils.AndroidUtilities import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/features/calendarPage/CalendarFragment.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/features/calendarPage/CalendarFragment.kt index f77ec18..3eff790 100644 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/features/calendarPage/CalendarFragment.kt +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/features/calendarPage/CalendarFragment.kt @@ -12,16 +12,19 @@ import com.esbati.keivan.persiancalendar.components.SoundManager import com.esbati.keivan.persiancalendar.features.home.HomeFragment import com.esbati.keivan.persiancalendar.pojos.CalendarDay import com.esbati.keivan.persiancalendar.R -import com.esbati.keivan.persiancalendar.repository.Repository +import com.esbati.keivan.persiancalendar.refactoring.CalendarManagerFactory +import com.esbati.keivan.persiancalendar.refactoring.bases.CalendarManager class CalendarFragment: Fragment() { private val mYear by lazy { arguments!!.get(EXTRA_YEAR) as Int } private val mMonth by lazy { arguments!!.get(EXTRA_MONTH) as Int } + private val calendarManager: CalendarManager = CalendarManagerFactory.create() + private lateinit var mRecyclerView: RecyclerView private val mAdapter by lazy { - CalendarAdapter(mYear, mMonth, Repository.prepareDays(mYear, mMonth)).apply { + CalendarAdapter(mYear, mMonth, calendarManager.provideMonth(mYear, mMonth)).apply { onCalendarClickListener = object: CalendarAdapter.OnCalendarClickListener { override fun onCalendarClick(day: CalendarDay) { SoundManager.playSound(day.mDay) @@ -53,6 +56,6 @@ class CalendarFragment: Fragment() { } fun refreshCalendar() { - mAdapter.refresh(Repository.prepareDays(mYear, mMonth)) + mAdapter.refresh(calendarManager.provideMonth(mYear, mMonth)) } } \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/features/home/HomeFragment.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/features/home/HomeFragment.kt index 829e79d..0f1e63d 100644 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/features/home/HomeFragment.kt +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/features/home/HomeFragment.kt @@ -13,7 +13,6 @@ import android.support.v4.app.FragmentPagerAdapter import android.support.v4.content.ContextCompat import android.support.v7.widget.Toolbar import android.text.TextUtils -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -24,15 +23,14 @@ import com.esbati.keivan.persiancalendar.components.ApplicationController import com.esbati.keivan.persiancalendar.components.views.CalendarBottomSheet import com.esbati.keivan.persiancalendar.components.views.CalendarPager import com.esbati.keivan.persiancalendar.features.calendarPage.CalendarFragment -import com.esbati.keivan.persiancalendar.features.notification.NotificationUpdateService import com.esbati.keivan.persiancalendar.features.settings.SettingFragment import com.esbati.keivan.persiancalendar.pojos.CalendarDay -import com.esbati.keivan.persiancalendar.pojos.UserEvent +import com.esbati.keivan.persiancalendar.pojos.GoogleEvent import com.esbati.keivan.persiancalendar.R -import com.esbati.keivan.persiancalendar.repository.Repository +import com.esbati.keivan.persiancalendar.refactoring.CalendarManagerFactory +import com.esbati.keivan.persiancalendar.refactoring.bases.CalendarManager import com.esbati.keivan.persiancalendar.utils.AndroidUtilities import com.esbati.keivan.persiancalendar.utils.Constants -import ir.smartlab.persindatepicker.util.PersianCalendar class HomeFragment : Fragment() { @@ -40,6 +38,10 @@ class HomeFragment : Fragment() { private var mDisplayedYear: Int = 0 private lateinit var mSelectedDay: CalendarDay + + private val calendarManager: CalendarManager = CalendarManagerFactory.create() + + //Toolbar private var mToolbarMargin: Int = 0 private lateinit var mCoordinatorLayout: CoordinatorLayout @@ -68,7 +70,7 @@ class HomeFragment : Fragment() { setupBottomSheet(this) //Setup Initial Day - mSelectedDay = Repository.getToday().also { + mSelectedDay = calendarManager.provideToday().also { mDisplayedYear = it.mYear mDisplayedMonth = it.mMonth } @@ -201,24 +203,24 @@ class HomeFragment : Fragment() { mBottomSheet = view.findViewById(R.id.bottom_sheet) as CalendarBottomSheet mBottomSheet.eventActionBtn = mEventActionBtn mBottomSheet.onEventListener = object: CalendarBottomSheet.OnEventListener { - override fun onEventDeleted(deletedEvent: UserEvent) { - Repository.deleteEvent(deletedEvent).also { - //Refresh UI and show Date if Event Successfully added - if (it == 1) { - refreshFragment(deletedEvent.year, deletedEvent.month) - - mSelectedDay.mEvents.remove(deletedEvent) - showDate(mSelectedDay, true) - - //Update Notification - NotificationUpdateService.enqueueUpdate(context!!) - } else { - Toast.makeText(context, "Problem in deleting event!", Toast.LENGTH_SHORT).show() - } - } + override fun onEventDeleted(deletedEvent: GoogleEvent) { +// GoogleEventDataSource.deleteEvent(deletedEvent.id).also { +// //Refresh UI and show Date if Event Successfully added +// if (it == 1) { +// refreshFragment(deletedEvent.year, deletedEvent.month) +// +// mSelectedDay.mEvents.remove(deletedEvent) +// showDate(mSelectedDay, true) +// +// //Update Notification +// NotificationUpdateService.enqueueUpdate(context!!) +// } else { +// Toast.makeText(context, "Problem in deleting event!", Toast.LENGTH_SHORT).show() +// } +// } } - override fun onEventEdited(editedEvent: UserEvent) { + override fun onEventEdited(editedEvent: GoogleEvent) { if(TextUtils.isEmpty(editedEvent.title) && TextUtils.isEmpty(editedEvent.description)){ Toast.makeText(context, R.string.event_error_no_content, Toast.LENGTH_SHORT).show() return @@ -226,26 +228,26 @@ class HomeFragment : Fragment() { if(ContextCompat.checkSelfPermission(ApplicationController.getContext(), Manifest.permission.WRITE_CALENDAR) == PackageManager.PERMISSION_GRANTED) - Repository.saveEvent(editedEvent).also { - //Refresh UI and show Date if Event Successfully added - if (it == 1) { - refreshFragment(editedEvent.year, editedEvent.month) - - mSelectedDay.mEvents.clear() - mSelectedDay.mEvents.addAll(Repository.getEvents( - mSelectedDay.mYear - , mSelectedDay.mMonth - , mSelectedDay.mDay - )) - showDate(mSelectedDay, true) - - //Update Notification - NotificationUpdateService.enqueueUpdate(context!!) - } else { - Toast.makeText(context, "Problem in saving event!", Toast.LENGTH_SHORT).show() - Log.d("Calendar", getString(R.string.event_error_no_calendar)) - } - } +// GoogleEventDataSource.saveEvent(editedEvent).also { +// //Refresh UI and show Date if Event Successfully added +// if (it == 1) { +// refreshFragment(editedEvent.year, editedEvent.month) +// +// mSelectedDay.mEvents.clear() +// mSelectedDay.mEvents.addAll(Repository.getEvents( +// mSelectedDay.mYear +// , mSelectedDay.mMonth +// , mSelectedDay.mDay +// )) +// showDate(mSelectedDay, true) +// +// //Update Notification +// NotificationUpdateService.enqueueUpdate(context!!) +// } else { +// Toast.makeText(context, "Problem in saving event!", Toast.LENGTH_SHORT).show() +// Log.d("Calendar", getString(R.string.event_error_no_calendar)) +// } +// } else Toast.makeText(context, R.string.event_error_write_permission, Toast.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationHelper.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationHelper.kt index fad16dc..3bd4dc1 100644 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationHelper.kt +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationHelper.kt @@ -10,9 +10,10 @@ import android.support.v4.app.NotificationCompat import android.text.TextUtils import com.esbati.keivan.persiancalendar.BuildConfig -import com.esbati.keivan.persiancalendar.features.home.MainActivity +import com.esbati.keivan.persiancalendar.features.MainActivity import com.esbati.keivan.persiancalendar.pojos.CalendarDay import com.esbati.keivan.persiancalendar.R +import com.esbati.keivan.persiancalendar.refactoring.events.UserEvent import com.esbati.keivan.persiancalendar.repository.PreferencesHelper import com.esbati.keivan.persiancalendar.utils.ColorHelper import com.esbati.keivan.persiancalendar.utils.LanguageHelper @@ -116,8 +117,10 @@ object NotificationHelper { inboxStyle.addLine( if (!TextUtils.isEmpty(event.title)) event.title - else + else if(event is UserEvent) event.description + else + "" ) mBuilder.setStyle(inboxStyle) diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationService.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationService.kt index 150d436..c55eecb 100644 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationService.kt +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationService.kt @@ -6,7 +6,8 @@ import android.content.Intent import android.content.IntentFilter import android.support.v4.content.ContextCompat import android.util.Log -import com.esbati.keivan.persiancalendar.repository.Repository +import com.esbati.keivan.persiancalendar.refactoring.CalendarManagerFactory +import com.esbati.keivan.persiancalendar.refactoring.bases.CalendarManager import com.esbati.keivan.persiancalendar.utils.AndroidUtilities /** @@ -22,6 +23,9 @@ class NotificationService : Service() { addAction(Intent.ACTION_TIMEZONE_CHANGED) } + private val calendarManager: CalendarManager = CalendarManagerFactory.create() + + override fun onBind(paramIntent: Intent) = null override fun onCreate() { @@ -29,7 +33,7 @@ class NotificationService : Service() { Log.d(javaClass.simpleName, "Created") //Promote service to foreground using sticky notification - val today = Repository.getToday() + val today = calendarManager.provideToday() val notification = NotificationHelper.createStickyNotification(this, today) startForeground(NotificationHelper.STICKY_NOTIFICATION_ID, notification) } diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationUpdateService.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationUpdateService.kt index 35a83df..2f6f74e 100644 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationUpdateService.kt +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/features/notification/NotificationUpdateService.kt @@ -4,8 +4,9 @@ import android.content.Context import android.content.Intent import android.support.v4.app.JobIntentService import android.util.Log +import com.esbati.keivan.persiancalendar.refactoring.CalendarManagerFactory +import com.esbati.keivan.persiancalendar.refactoring.bases.CalendarManager import com.esbati.keivan.persiancalendar.repository.PreferencesHelper -import com.esbati.keivan.persiancalendar.repository.Repository /** * Created by Keivan Esbati on 4/10/2017. @@ -13,13 +14,17 @@ import com.esbati.keivan.persiancalendar.repository.Repository class NotificationUpdateService : JobIntentService() { + private val calendarManager: CalendarManager = CalendarManagerFactory.create() + + + override fun onHandleWork(intent: Intent) { Log.d(javaClass.simpleName, "Updating notification") //If notification is active update it, else cancel ongoing notification if (PreferencesHelper.isOptionActive(PreferencesHelper.KEY_NOTIFICATION_SHOW, true)) { //Show Sticky Notification - val today = Repository.getToday() + val today = calendarManager.provideToday() NotificationHelper.showStickyNotification(this, today) } else { NotificationHelper.cancelNotification(this) diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/pojos/CalendarDay.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/pojos/CalendarDay.kt index 95e214b..4db1b07 100644 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/pojos/CalendarDay.kt +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/pojos/CalendarDay.kt @@ -1,5 +1,6 @@ package com.esbati.keivan.persiancalendar.pojos +import com.esbati.keivan.persiancalendar.refactoring.bases.Event import java.util.* /** @@ -15,5 +16,5 @@ class CalendarDay( val isCurrentMonth: Boolean = false, val formattedDate: String = "", val formattedDateSecondary: String = "", - val mRemarks: ArrayList = ArrayList(), - val mEvents: ArrayList = ArrayList()) \ No newline at end of file + val mRemarks: ArrayList = ArrayList(), + val mEvents: ArrayList = ArrayList()) \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/pojos/UserEvent.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/pojos/GoogleEvent.kt similarity index 96% rename from app/src/main/java/com/esbati/keivan/persiancalendar/pojos/UserEvent.kt rename to app/src/main/java/com/esbati/keivan/persiancalendar/pojos/GoogleEvent.kt index 6254995..3a44648 100644 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/pojos/UserEvent.kt +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/pojos/GoogleEvent.kt @@ -6,7 +6,7 @@ import ir.smartlab.persindatepicker.util.PersianCalendar * Created by asus on 11/23/2016. */ -data class UserEvent( +data class GoogleEvent( val id: Long = 0, val title: String? = null, val description: String? = null, @@ -21,4 +21,5 @@ data class UserEvent( fun inTheSameDate(year: Int, month: Int, day: Int): Boolean { return this.year == year && this.month == month && this.day == day } + } diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/CalendarManagerFactory.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/CalendarManagerFactory.kt new file mode 100644 index 0000000..be78198 --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/CalendarManagerFactory.kt @@ -0,0 +1,14 @@ +package com.esbati.keivan.persiancalendar.refactoring + +import com.esbati.keivan.persiancalendar.refactoring.bases.CalendarManager +import com.esbati.keivan.persiancalendar.refactoring.eventdatasource.GoogleEventDataSource +import com.esbati.keivan.persiancalendar.refactoring.eventdatasource.SolarHijriEventsDataSource + +class CalendarManagerFactory { + + companion object { + fun create():CalendarManager { + return PersianCalendarManager(SolarHijriEventsDataSource, GoogleEventDataSource) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/PersianCalendarManager.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/PersianCalendarManager.kt new file mode 100644 index 0000000..cdd25bf --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/PersianCalendarManager.kt @@ -0,0 +1,97 @@ +package com.esbati.keivan.persiancalendar.refactoring + +import com.esbati.keivan.persiancalendar.pojos.CalendarDay +import com.esbati.keivan.persiancalendar.refactoring.bases.CalendarManager +import com.esbati.keivan.persiancalendar.refactoring.bases.Event +import com.esbati.keivan.persiancalendar.refactoring.bases.EventDataSource +import com.esbati.keivan.persiancalendar.refactoring.bases.MutableEventDataSource +import com.esbati.keivan.persiancalendar.utils.Constants +import ir.smartlab.persindatepicker.util.PersianCalendar +import java.util.* + +class PersianCalendarManager(val calendarEvent: EventDataSource, + val userEvent: MutableEventDataSource):CalendarManager { + + private val mCalendar: PersianCalendar = PersianCalendar().apply { + // Set time at the middle of the day to prevent shift in days + // for dates like yyyy/1/1 caused by DST + set(Calendar.HOUR_OF_DAY, 12) + } + + + override fun provideMonth(year: Int, month: Int): List { + val todayCalendar = (mCalendar.clone() as PersianCalendar).apply { + timeInMillis = System.currentTimeMillis() + } + val mToday = todayCalendar.persianDay + val containToday = todayCalendar.persianYear == year && todayCalendar.persianMonth == month + + val currentYearCalendar = (mCalendar.clone() as PersianCalendar).setPersianDate(year, month, 1) + val isLeapYear = currentYearCalendar.isPersianLeapYear + val dayOfWeek = currentYearCalendar.persianWeekDay % 7 + var currentMonthDays = Constants.daysOfMonth_fa[month - 1] + var previousMonthDays = Constants.daysOfMonth_fa[(month - 2 + 12) % 12] + + //Add Extra Day to current month in Case of Leap Year + if (isLeapYear && month == 12) + currentMonthDays++ + + //Add Extra Day to Previous Month in Case of Leap Year + val lastYearCalendar = (mCalendar.clone() as PersianCalendar).setPersianDate(year - 1, month, 1) + if (month == 1 && lastYearCalendar.isPersianLeapYear) + previousMonthDays++ + + val days = ArrayList() + //Add Trailing Days from Last Month if Needed + if (dayOfWeek > 0) + for (i in dayOfWeek - 1 downTo 0) + days.add(CalendarDay(year, month - 1, previousMonthDays - i)) + + //Add Month Days + for (i in 1..currentMonthDays) { + val currentDayCalendar = (mCalendar.clone() as PersianCalendar).setPersianDate(year, month, i) + val georgianDate = GregorianCalendar().run { + time = currentDayCalendar.time + "${Constants.weekdays_en[get(Calendar.DAY_OF_WEEK) - 1]}, ${Constants.months_en[get(Calendar.MONTH)]} ${get(Calendar.DAY_OF_MONTH)} ${get(Calendar.YEAR)}" + } + + val dayRemarks = calendarEvent.getDayEvents(year, month, i) + val dayEvents = userEvent.getDayEvents(year, month, i) + val isToday = i == mToday && containToday + val isHoliday = currentDayCalendar.persianWeekDay == 6 || dayRemarks.any { it.isHoliday } + + days.add( + CalendarDay(year, month, i + , isToday, isHoliday, true + , currentDayCalendar.persianLongDate, georgianDate + , dayRemarks as ArrayList, dayEvents as ArrayList) + ) + } + + //Add Leading Month Days + for (i in 1..(7 - days.size % 7)) + days.add(CalendarDay(year, month + 1, i)) + + return days + } + + override fun provideToday(): CalendarDay { + val date = (mCalendar.clone() as PersianCalendar).apply { + timeInMillis = System.currentTimeMillis() + } + + val georgianDate = GregorianCalendar().run { + time = date.time + "${Constants.weekdays_en[get(Calendar.DAY_OF_WEEK) - 1]}, ${Constants.months_en[get(Calendar.MONTH)]} ${get(Calendar.DAY_OF_MONTH)} ${get(Calendar.YEAR)}" + } + + return CalendarDay(date.persianYear, date.persianMonth, date.persianDay + , true, true, true + , date.persianLongDate, georgianDate + , calendarEvent.getDayEvents(date.persianYear, date.persianMonth, date.persianDay) as ArrayList + , userEvent.getDayEvents(date.persianYear, date.persianMonth, date.persianDay) as ArrayList + ) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/CalendarManager.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/CalendarManager.kt new file mode 100644 index 0000000..f31c44d --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/CalendarManager.kt @@ -0,0 +1,9 @@ +package com.esbati.keivan.persiancalendar.refactoring.bases + +import com.esbati.keivan.persiancalendar.pojos.CalendarDay + +interface CalendarManager { + fun provideMonth(year: Int, month: Int): List + + fun provideToday(): CalendarDay +} \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/CalendarTypes.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/CalendarTypes.kt new file mode 100644 index 0000000..28cf7d7 --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/CalendarTypes.kt @@ -0,0 +1,5 @@ +package com.esbati.keivan.persiancalendar.refactoring.bases + +enum class CalendarTypes { + SOLAR_HIJRI,GREGORIAN +} \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/Event.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/Event.kt new file mode 100644 index 0000000..5883d21 --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/Event.kt @@ -0,0 +1,14 @@ +package com.esbati.keivan.persiancalendar.refactoring.bases + +interface Event { + val title: String + val isHoliday: Boolean + val year: Int + val month: Int + val day: Int + val calendarType: CalendarTypes + + fun inTheSameDate(year: Int, month: Int, day: Int, calendarType: CalendarTypes): Boolean { + return (this.year == -1 || this.year == year) && this.month == month && this.day == day + } +} \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/EventDataSource.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/EventDataSource.kt new file mode 100644 index 0000000..7d60fd6 --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/EventDataSource.kt @@ -0,0 +1,9 @@ +package com.esbati.keivan.persiancalendar.refactoring.bases + + +interface EventDataSource { + + fun getMonthEvents(year: Int, month: Int): List + + fun getDayEvents(year: Int, month: Int, day: Int): List +} \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/MutableEventDataSource.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/MutableEventDataSource.kt new file mode 100644 index 0000000..36de3f9 --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/bases/MutableEventDataSource.kt @@ -0,0 +1,13 @@ +package com.esbati.keivan.persiancalendar.refactoring.bases + +import com.esbati.keivan.persiancalendar.pojos.CalendarDay + +interface MutableEventDataSource : EventDataSource { + + fun createEventFor(day: CalendarDay): Event + + fun saveEvent(event: Event): Int + + fun deleteEvent(id: Long): Int + +} \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/eventdatasource/GoogleEventDataSource.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/eventdatasource/GoogleEventDataSource.kt new file mode 100644 index 0000000..a9de918 --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/eventdatasource/GoogleEventDataSource.kt @@ -0,0 +1,78 @@ +package com.esbati.keivan.persiancalendar.refactoring.eventdatasource + +import android.annotation.SuppressLint +import com.esbati.keivan.persiancalendar.pojos.CalendarDay +import com.esbati.keivan.persiancalendar.pojos.GoogleEvent +import com.esbati.keivan.persiancalendar.refactoring.bases.CalendarTypes +import com.esbati.keivan.persiancalendar.refactoring.bases.Event +import com.esbati.keivan.persiancalendar.refactoring.bases.MutableEventDataSource +import com.esbati.keivan.persiancalendar.refactoring.events.UserEvent +import com.esbati.keivan.persiancalendar.repository.GoogleCalendarEventHelper +import ir.smartlab.persindatepicker.util.PersianCalendar +import java.util.* + +@SuppressLint("MissingPermission") +object GoogleEventDataSource : MutableEventDataSource { + + private val mCalendar: PersianCalendar = PersianCalendar().apply { + // Set time at the middle of the day to prevent shift in days + // for dates like yyyy/1/1 caused by DST + set(Calendar.HOUR_OF_DAY, 12) + } + + //not implemented + override fun getMonthEvents(year: Int, month: Int): List { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getDayEvents(year: Int, month: Int, day: Int): List { + return GoogleCalendarEventHelper.getEvents(year, month, day) + .map { + UserEvent(it.id, + it.title ?: "", + it.description ?: "", + it.year, + it.month, + it.day, + false, + CalendarTypes.SOLAR_HIJRI) + } + .map { + it as Event + } + } + + override fun createEventFor(day: CalendarDay): Event { + return UserEvent(0, + "", + "", + day.mDay, + day.mMonth, + day.mYear, + false, + CalendarTypes.SOLAR_HIJRI) + } + + override fun saveEvent(event: Event): Int { + if (event is UserEvent) { + val date = (mCalendar.clone() as PersianCalendar).apply { + setPersianDate(event.year, event.month, event.day) + } + + val googleEvent = GoogleEvent(event.id, + event.title, + event.description, + date.timeInMillis) + return GoogleCalendarEventHelper.saveEvent(googleEvent) + } + return -1; + + } + + override fun deleteEvent(id: Long): Int { + return GoogleCalendarEventHelper.deleteEvent(id) + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/eventdatasource/SolarHijriEventsDataSource.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/eventdatasource/SolarHijriEventsDataSource.kt new file mode 100644 index 0000000..d22b384 --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/eventdatasource/SolarHijriEventsDataSource.kt @@ -0,0 +1,73 @@ +package com.esbati.keivan.persiancalendar.refactoring.eventdatasource + +import android.support.annotation.RawRes +import android.util.Log +import com.esbati.keivan.persiancalendar.R +import com.esbati.keivan.persiancalendar.components.ApplicationController +import com.esbati.keivan.persiancalendar.refactoring.bases.CalendarTypes +import com.esbati.keivan.persiancalendar.refactoring.bases.Event +import com.esbati.keivan.persiancalendar.refactoring.bases.EventDataSource +import com.esbati.keivan.persiancalendar.refactoring.events.CalendarEvent +import org.json.JSONException +import org.json.JSONObject +import java.util.* + + +object SolarHijriEventsDataSource : EventDataSource { + + private const val DAY_IN_MILLIS = 1000L * 24 * 60 * 60 + private val calendarEvents: List + + init { + calendarEvents = readEventsFromJSON() + } + + private fun readRawResource(@RawRes res: Int): String { + val s = Scanner(ApplicationController.getContext().resources.openRawResource(res)).useDelimiter("\\A") + return if (s.hasNext()) s.next() else "" + } + + private fun readEventsFromJSON(): ArrayList { + val calendarEvents = ArrayList() + try { + val eventsJSON = JSONObject(readRawResource(R.raw.events)).getJSONArray("events") + + for (i in 0 until eventsJSON.length()) { + val eventJSON = eventsJSON.getJSONObject(i) + val event = convertJsonToCalendarEvent(eventJSON) + calendarEvents.add(event) + } + + } catch (e: JSONException) { + Log.e("JSON Parser", e.message) + } + + return calendarEvents + } + + @Throws(JSONException::class) + fun convertJsonToCalendarEvent(eventJSON: JSONObject): CalendarEvent { + val title = eventJSON.getString("title") + val year = eventJSON.optInt("year", -1) + val month = eventJSON.getInt("month") + val day = eventJSON.getInt("day") + val isHoliday = eventJSON.getBoolean("holiday") + return CalendarEvent(title, year, month, day, isHoliday, CalendarTypes.SOLAR_HIJRI) + } + + override fun getMonthEvents(year: Int, month: Int): List { + return calendarEvents.filter { + it.month == month + }.map { + it as Event + } + } + + override fun getDayEvents(year: Int, month: Int, day: Int): List { + return calendarEvents.filter { + it.inTheSameDate(year,month,day,CalendarTypes.SOLAR_HIJRI) + }.map { + it as Event + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/events/CalendarEvent.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/events/CalendarEvent.kt new file mode 100644 index 0000000..f4f2000 --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/events/CalendarEvent.kt @@ -0,0 +1,11 @@ +package com.esbati.keivan.persiancalendar.refactoring.events + +import com.esbati.keivan.persiancalendar.refactoring.bases.CalendarTypes +import com.esbati.keivan.persiancalendar.refactoring.bases.Event + +data class CalendarEvent(override val title: String, + override val year: Int, + override val month: Int, + override val day: Int, + override val isHoliday: Boolean, + override val calendarType: CalendarTypes) : Event \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/events/UserEvent.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/events/UserEvent.kt new file mode 100644 index 0000000..165dca7 --- /dev/null +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/refactoring/events/UserEvent.kt @@ -0,0 +1,14 @@ +package com.esbati.keivan.persiancalendar.refactoring.events + +import com.esbati.keivan.persiancalendar.refactoring.bases.CalendarTypes +import com.esbati.keivan.persiancalendar.refactoring.bases.Event + +data class UserEvent( + val id: Long, + override val title: String, + val description: String, + override val year: Int, + override val month: Int, + override val day: Int, + override val isHoliday: Boolean, + override val calendarType: CalendarTypes) : Event \ No newline at end of file diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/repository/CalendarDataStore.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/repository/GoogleCalendarEventHelper.kt similarity index 90% rename from app/src/main/java/com/esbati/keivan/persiancalendar/repository/CalendarDataStore.kt rename to app/src/main/java/com/esbati/keivan/persiancalendar/repository/GoogleCalendarEventHelper.kt index a989812..10d0c7e 100644 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/repository/CalendarDataStore.kt +++ b/app/src/main/java/com/esbati/keivan/persiancalendar/repository/GoogleCalendarEventHelper.kt @@ -7,14 +7,13 @@ import android.provider.CalendarContract import android.support.annotation.RequiresPermission import com.esbati.keivan.persiancalendar.components.ApplicationController import com.esbati.keivan.persiancalendar.pojos.DeviceCalendar -import com.esbati.keivan.persiancalendar.pojos.UserEvent -import ir.smartlab.persindatepicker.util.PersianCalendar +import com.esbati.keivan.persiancalendar.pojos.GoogleEvent import java.util.* -object CalendarDataStore { +object GoogleCalendarEventHelper { private val mCalendars: ArrayList - private val mEvents: ArrayList + private val mEvents: ArrayList // The indices for the projection array above. private const val PROJECTION_ID_INDEX = 0 @@ -74,8 +73,8 @@ object CalendarDataStore { } @RequiresPermission(Manifest.permission.READ_CALENDAR) - private fun getEvents(calendar: DeviceCalendar): ArrayList { - val events = ArrayList() + private fun getEvents(calendar: DeviceCalendar): ArrayList { + val events = ArrayList() // Submit the query and get a Cursor object back. val selection = "((" + CalendarContract.Events.CALENDAR_ID + " = ?))" @@ -93,7 +92,7 @@ object CalendarDataStore { val dtEnd = getLong(6) val eventTimezone = getString(7) - events.add(UserEvent(id, title, description, dtStart, dtEnd, eventTimezone)) + events.add(GoogleEvent(id, title, description, dtStart, dtEnd, eventTimezone)) } }.close() @@ -101,8 +100,8 @@ object CalendarDataStore { } @RequiresPermission(Manifest.permission.READ_CALENDAR) - fun getEvents(year: Int, month: Int, day: Int): ArrayList { - val selectedEvents = ArrayList() + fun getEvents(year: Int, month: Int, day: Int): ArrayList { + val selectedEvents = ArrayList() for (event in mEvents) if (event.inTheSameDate(year, month, day)) @@ -112,7 +111,7 @@ object CalendarDataStore { } @RequiresPermission(Manifest.permission.WRITE_CALENDAR) - fun saveEvent(event: UserEvent): Int { + fun saveEvent(event: GoogleEvent): Int { //Return if No Calendar is Available if (mCalendars.size <= 0) return -1 @@ -124,7 +123,7 @@ object CalendarDataStore { } @RequiresPermission(Manifest.permission.WRITE_CALENDAR) - private fun saveSimpleEvent(newEvent: UserEvent): Int { + private fun saveSimpleEvent(newEvent: GoogleEvent): Int { val defaultCalendar = mCalendars[0] val values = ContentValues().apply { @@ -147,7 +146,7 @@ object CalendarDataStore { return 1 } - private fun updateEvent(event: UserEvent): Int { + private fun updateEvent(event: GoogleEvent): Int { //Update Event Row val values = ContentValues().apply { put(CalendarContract.Events.TITLE, event.title) diff --git a/app/src/main/java/com/esbati/keivan/persiancalendar/repository/Repository.kt b/app/src/main/java/com/esbati/keivan/persiancalendar/repository/Repository.kt deleted file mode 100644 index 4b59e20..0000000 --- a/app/src/main/java/com/esbati/keivan/persiancalendar/repository/Repository.kt +++ /dev/null @@ -1,165 +0,0 @@ -package com.esbati.keivan.persiancalendar.repository - -import android.Manifest -import android.content.pm.PackageManager -import android.support.annotation.RawRes -import android.support.annotation.RequiresPermission -import android.support.v4.content.ContextCompat -import android.util.Log -import com.esbati.keivan.persiancalendar.components.ApplicationController -import com.esbati.keivan.persiancalendar.pojos.CalendarDay -import com.esbati.keivan.persiancalendar.pojos.CalendarRemark -import com.esbati.keivan.persiancalendar.pojos.UserEvent -import com.esbati.keivan.persiancalendar.R -import com.esbati.keivan.persiancalendar.utils.Constants -import ir.smartlab.persindatepicker.util.PersianCalendar -import org.json.JSONException -import org.json.JSONObject -import java.util.* -import kotlin.collections.ArrayList - - -object Repository{ - - private const val DAY_IN_MILLIS = 1000L * 24 * 60 * 60 - - private val remarks: List - private val mCalendar: PersianCalendar - - init { - remarks = readEventsFromJSON() - mCalendar = PersianCalendar().apply { - // Set time at the middle of the day to prevent shift in days - // for dates like yyyy/1/1 caused by DST - set(Calendar.HOUR_OF_DAY, 12) - } - } - - private fun readRawResource(@RawRes res: Int): String { - val s = Scanner(ApplicationController.getContext().resources.openRawResource(res)).useDelimiter("\\A") - return if (s.hasNext()) s.next() else "" - } - - private fun readEventsFromJSON(): ArrayList { - val calendarEvents = ArrayList() - try { - val eventsJSON = JSONObject(readRawResource(R.raw.events)).getJSONArray("events") - - for (i in 0 until eventsJSON.length()) { - val eventJSON = eventsJSON.getJSONObject(i) - val event = CalendarRemark.fromJSON(eventJSON) - calendarEvents.add(event) - } - - } catch (e: JSONException) { - Log.e("JSON Parser", e.message) - } - - return calendarEvents - } - - fun prepareDays(year: Int, month: Int): List { - val todayCalendar = (mCalendar.clone() as PersianCalendar).apply { - timeInMillis = System.currentTimeMillis() - } - val mToday = todayCalendar.persianDay - val containToday = todayCalendar.persianYear == year && todayCalendar.persianMonth == month - - val currentYearCalendar = (mCalendar.clone() as PersianCalendar).setPersianDate(year, month, 1) - val isLeapYear = currentYearCalendar.isPersianLeapYear - val dayOfWeek = currentYearCalendar.persianWeekDay % 7 - var currentMonthDays = Constants.daysOfMonth_fa[month - 1] - var previousMonthDays = Constants.daysOfMonth_fa[(month - 2 + 12) % 12] - - //Add Extra Day to current month in Case of Leap Year - if (isLeapYear && month == 12) - currentMonthDays++ - - //Add Extra Day to Previous Month in Case of Leap Year - val lastYearCalendar = (mCalendar.clone() as PersianCalendar).setPersianDate(year - 1, month, 1) - if (month == 1 && lastYearCalendar.isPersianLeapYear) - previousMonthDays++ - - val days = ArrayList() - //Add Trailing Days from Last Month if Needed - if (dayOfWeek > 0) - for (i in dayOfWeek - 1 downTo 0) - days.add(CalendarDay(year, month - 1, previousMonthDays - i)) - - //Add Month Days - for (i in 1..currentMonthDays) { - val currentDayCalendar = (mCalendar.clone() as PersianCalendar).setPersianDate(year, month, i) - val georgianDate = GregorianCalendar().run { - time = currentDayCalendar.time - "${Constants.weekdays_en[get(Calendar.DAY_OF_WEEK) - 1]}, ${Constants.months_en[get(Calendar.MONTH)]} ${get(Calendar.DAY_OF_MONTH)} ${get(Calendar.YEAR)}" - } - - val dayRemarks = getRemarks(year, month, i) - val dayEvents = getEventsIfPermissionIsAvailable(year, month, i) - val isToday = i == mToday && containToday - val isHoliday = currentDayCalendar.persianWeekDay == 6 || dayRemarks.any { it.isHoliday } - - days.add( - CalendarDay(year, month, i - , isToday, isHoliday, true - , currentDayCalendar.persianLongDate, georgianDate - , dayRemarks, dayEvents) - ) - } - - //Add Leading Month Days - for (i in 1..(7 - days.size % 7)) - days.add(CalendarDay(year, month + 1, i)) - - return days - } - - fun getToday(): CalendarDay { - val date = (mCalendar.clone() as PersianCalendar).apply { - timeInMillis = System.currentTimeMillis() - } - - val georgianDate = GregorianCalendar().run { - time = date.time - "${Constants.weekdays_en[get(Calendar.DAY_OF_WEEK) - 1]}, ${Constants.months_en[get(Calendar.MONTH)]} ${get(Calendar.DAY_OF_MONTH)} ${get(Calendar.YEAR)}" - } - - return CalendarDay(date.persianYear, date.persianMonth, date.persianDay - , true, true, true - , date.persianLongDate, georgianDate - , getRemarks(date.persianYear, date.persianMonth, date.persianDay) - , getEventsIfPermissionIsAvailable(date.persianYear, date.persianMonth, date.persianDay) - ) - } - - private fun getRemarks(year: Int, month: Int, day: Int): ArrayList - = remarks.filter { it.inTheSameDate(year, month, day) } as ArrayList - - @RequiresPermission(Manifest.permission.READ_CALENDAR) - fun getEvents(year: Int, month: Int, day: Int): ArrayList = - CalendarDataStore.getEvents(year, month, day) - - private fun getEventsIfPermissionIsAvailable(year: Int, month: Int, day: Int): ArrayList { - return if (ContextCompat.checkSelfPermission(ApplicationController.getContext(), Manifest.permission.READ_CALENDAR) - == PackageManager.PERMISSION_GRANTED) - Repository.getEvents(year, month, day) - else - ArrayList() - } - - fun createEventFor(day: CalendarDay): UserEvent { - val date = (mCalendar.clone() as PersianCalendar).apply { - setPersianDate(day.mYear, day.mMonth, day.mDay) - } - - return UserEvent(dtStart = date.timeInMillis) - } - - @RequiresPermission(Manifest.permission.WRITE_CALENDAR) - fun saveEvent(event: UserEvent): Int = CalendarDataStore.saveEvent(event) - - fun deleteEvent(event: UserEvent): Int = CalendarDataStore.deleteEvent(event.id) -} - - - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index cbaf7c5..60b9cc3 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.esbati.keivan.persiancalendar.features.home.MainActivity"> + tools:context="com.esbati.keivan.persiancalendar.features.MainActivity"> + tools:context="com.esbati.keivan.persiancalendar.features.MainActivity">