Skip to content

Commit

Permalink
Removed details page in old Android style and moved to bottom sheet w…
Browse files Browse the repository at this point in the history
…ith jetpack compose.
  • Loading branch information
HeyPouya committed Sep 25, 2024
1 parent 385efe2 commit 0831666
Show file tree
Hide file tree
Showing 32 changed files with 350 additions and 440 deletions.
14 changes: 1 addition & 13 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ plugins {
alias(libs.plugins.compose.compiler)
alias(libs.plugins.googleServices)
alias(libs.plugins.crashlytics)
id("kotlin-parcelize")
}

android {
Expand Down Expand Up @@ -36,7 +35,6 @@ android {
jvmTarget = JavaVersion.VERSION_17.toString()
}
buildFeatures {
viewBinding = true
buildConfig = true
compose = true
}
Expand All @@ -46,26 +44,15 @@ android {
dependencies {
implementation(projects.features.widget)
implementation(projects.core)
implementation(projects.features.calendarDetails)
implementation(libs.androidx.core)

// Datetime
coreLibraryDesugaring(libs.desugar.jdk.libs)
implementation(libs.kotlinx.datetime)

// Support
implementation(libs.appcompat)
implementation(libs.constraintLayout)
implementation(libs.material)

// ViewModel + LiveData
implementation(libs.lifecycle.liveData)
implementation(libs.lifecycle.viewModel)

// Navigation Components
implementation(libs.navigation.ui)
implementation(libs.navigation)

// Hilt Library
implementation(libs.hilt.android)
ksp(libs.hilt.android.compiler)
Expand All @@ -79,6 +66,7 @@ dependencies {
implementation(libs.androidx.compose.material)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.lifecycle)
implementation(libs.androidx.compose.activity)

val firebaseBom = platform(libs.firebase.bom)
implementation(firebaseBom)
Expand Down
17 changes: 0 additions & 17 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -1,20 +1,3 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\SDK/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.kts.
#
# 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 *;
#}
-keepattributes EnclosingMethod
-keepattributes SourceFile,LineNumberTable
-keepattributes *Annotation*,Signature
14 changes: 11 additions & 3 deletions app/src/main/java/com/pouyaheydari/calendar/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
package com.pouyaheydari.calendar

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import com.pouyaheydari.calendar.ui.CalendarScreen
import com.pouyaheydari.calendar.ui.theme.PersianCalendarTheme
import dagger.hilt.android.AndroidEntryPoint

/**
* The single activity of the application
*/
@AndroidEntryPoint
open class MainActivity : AppCompatActivity() {
open class MainActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setContent {
PersianCalendarTheme {
CalendarScreen()
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ object DateModule {
shamsiDate.day,
shamsiDate.month,
shamsiDate.year,
WeekDay.entries.first { it.weekDayNumber == localDate.dayOfWeek.isoDayNumber },
WeekDay.entries.first { it.weekDayNumber == localDate.dayOfWeek.isoDayNumber - 1 },
gregorianDate.day,
gregorianDate.month,
gregorianDate.year,
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/com/pouyaheydari/calendar/domain/Event.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.pouyaheydari.calendar.domain

data class Event(val day: Int, val description: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.pouyaheydari.calendar.domain

import com.pouyaheydari.calendar.core.pojo.Day
import com.pouyaheydari.calendar.core.utils.ResourceUtils
import javax.inject.Inject

class GetEventsByDayUseCase @Inject constructor(private val resourceUtils: ResourceUtils) {
operator fun invoke(day: Day): List<Event> {
val persianTemp = day.shamsiMonth.monthNumber * 100 + day.shamsiDay
val gregorianTemp = day.gregorianMonth.monthNumber * 100 + day.gregorianDay
val persianEvents = resourceUtils.eventP[persianTemp].orEmpty()
val gregorianEvents = resourceUtils.eventG[gregorianTemp].orEmpty()

return buildList {
persianEvents.forEach {
add(Event(day = day.shamsiDay, description = it))
}
gregorianEvents.forEach {
add(Event(day = day.gregorianDay, description = it))
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,38 +6,21 @@ import android.view.View
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.pouyaheydari.calendar.R
import com.pouyaheydari.calendar.core.pojo.Day
import com.pouyaheydari.calendar.core.utils.SELECTED_DAY_DETAILS
import com.pouyaheydari.calendar.ui.theme.PersianCalendarTheme
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class CalendarFragment : Fragment() {

@Inject
lateinit var today: Day
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return ComposeView(requireContext()).apply {
setContent {
PersianCalendarTheme {
CalendarScreen(today = today) {
val data = Bundle().apply {
putParcelable(SELECTED_DAY_DETAILS, it)
}
if (findNavController().currentDestination?.id != R.id.onClickDialogActivity) {
findNavController().navigate(
R.id.action_calendarFragment_to_onClickDialogActivity,
data
)
}
}
}

}
}
}
Expand Down
90 changes: 78 additions & 12 deletions app/src/main/java/com/pouyaheydari/calendar/ui/CalendarScreen.kt
Original file line number Diff line number Diff line change
@@ -1,42 +1,110 @@
package com.pouyaheydari.calendar.ui

import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.provider.CalendarContract
import android.view.View
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.CardDefaults
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat.getString
import androidx.core.content.ContextCompat.startActivity
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
import com.google.android.material.snackbar.Snackbar
import com.pouyaheydari.calendar.R
import com.pouyaheydari.calendar.core.pojo.Day
import com.pouyaheydari.calendar.core.utils.toPersianNumber
import com.pouyaheydari.calendar.ui.components.DayDetailsBottomSheet
import com.pouyaheydari.calendar.ui.components.HeaderComponent
import com.pouyaheydari.calendar.ui.components.MonthComponent
import com.pouyaheydari.calendar.ui.components.MonthYearTitleComponent
import com.pouyaheydari.calendar.ui.components.WeekDaysComponent
import com.pouyaheydari.calendar.ui.theme.CalendarScreenState
import java.util.GregorianCalendar

// We have to add this to prevent misplacement of dates when combining persian text with numbers
private const val RLM = '\u200F'
private const val CALENDAR_INTENT_TYPE = "vnd.android.cursor.item/event"

@Composable
fun CalendarScreen(
modifier: Modifier = Modifier,
today: Day,
viewModel: CalendarViewModel = viewModel(),
onDaySelected: (Day) -> Unit
) {
val days = viewModel.screenState.collectAsStateWithLifecycle().value
val state = viewModel.screenState.collectAsStateWithLifecycle().value
val context = LocalContext.current
val view = LocalView.current

CalendarComponent(
modifier,
today,
days,
state.today,
state.displayDays,
context,
onDaySelected = onDaySelected,
onDaySelected = { viewModel.onIntent(CalendarUserIntents.OnDayClicked(it)) },
onNextMonthClicked = { viewModel.onIntent(CalendarUserIntents.OnNextMonthClicked) },
onPreviousMonthClicked = { viewModel.onIntent(CalendarUserIntents.OnPreviousMonthClicked) })

DayDetailsBottomSheet(
shouldShowBottomSheet = state.shouldShowBottomSheet,
onBottomSheetDismissed = { viewModel.onIntent(CalendarUserIntents.OnBottomSheetDismissed) },
setReminderText = stringResource(R.string.set_a_work_to_do),
events = state.selectedDayEvents,
dayOfWeek = state.selectedDay.weekDay.getName(context),
iranianDate = RLM + stringResource(
id = R.string.persian_day_month,
state.selectedDay.shamsiDay.toPersianNumber(),
state.selectedDay.shamsiMonth.getName(context),
state.selectedDay.shamsiYear.toPersianNumber()
),
gregorianDate = RLM + stringResource(
id = R.string.gregorian_full_date,
state.selectedDay.gregorianDay.toPersianNumber(),
state.selectedDay.gregorianMonth.getName(context),
state.selectedDay.gregorianYear.toPersianNumber()
),
onSetReminderClicked = {
handleIntentToDefaultCalendarApp(state, context, view)
}
)
}

private fun handleIntentToDefaultCalendarApp(
state: CalendarScreenState,
context: Context,
view: View
) {
val intent = Intent(Intent.ACTION_EDIT).apply {
type = CALENDAR_INTENT_TYPE
putExtra(
CalendarContract.EXTRA_EVENT_BEGIN_TIME,
GregorianCalendar(
state.selectedDay.gregorianYear,
state.selectedDay.gregorianMonth.monthNumber - 1,
state.selectedDay.gregorianDay
).timeInMillis
)
}
try {
startActivity(context, intent, null)
} catch (e: ActivityNotFoundException) {
e.printStackTrace()
Snackbar.make(
view,
getString(context, R.string.google_calendar_is_not_installed),
Snackbar.LENGTH_LONG
).show()
}
}

@Composable
Expand All @@ -50,22 +118,20 @@ fun CalendarComponent(
onPreviousMonthClicked: () -> Unit = {}
) {
Column(modifier = modifier.fillMaxSize()) {

// We have to add this to prevent misplacement of dates when combining persian text with numbers
val rlm = '\u200F'

HeaderComponent(
modifier = Modifier.fillMaxHeight(0.3f),
elevation = CardDefaults.cardElevation(defaultElevation = 16.dp),
dayOfWeek = stringResource(
id = R.string.today_is_day_of_week,
today.weekDay.getName(context)
),
iranianDate = rlm + stringResource(
iranianDate = RLM + stringResource(
id = R.string.persian_day_month,
today.shamsiDay.toPersianNumber(),
today.shamsiMonth.getName(context),
today.shamsiYear.toPersianNumber()
),
gregorianDate = rlm + stringResource(
gregorianDate = RLM + stringResource(
id = R.string.gregorian_full_date,
today.gregorianDay.toPersianNumber(),
today.gregorianMonth.getName(context),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.pouyaheydari.calendar.ui

import com.pouyaheydari.calendar.core.pojo.Day

sealed interface CalendarUserIntents {
data object OnNextMonthClicked : CalendarUserIntents
data object OnPreviousMonthClicked : CalendarUserIntents
data object OnDayClicked : CalendarUserIntents
data class OnDayClicked(val day: Day) : CalendarUserIntents
data object OnBottomSheetDismissed : CalendarUserIntents
}
Loading

0 comments on commit 0831666

Please sign in to comment.