Skip to content

Commit 98a8ff1

Browse files
committed
androidApp: SessionScreen: Add menu buttons for calendar and share
Signed-off-by: Aayush Gupta <[email protected]>
1 parent 2f0e871 commit 98a8ff1

File tree

4 files changed

+112
-5
lines changed

4 files changed

+112
-5
lines changed

androidApp/src/main/java/app/opass/ccip/android/ui/screens/session/SessionScreen.kt

+81-5
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,18 @@
55

66
package app.opass.ccip.android.ui.screens.session
77

8+
import android.content.Intent
9+
import android.provider.CalendarContract
810
import android.text.format.DateUtils
11+
import android.util.Log
912
import androidx.compose.foundation.layout.Column
1013
import androidx.compose.foundation.layout.fillMaxSize
1114
import androidx.compose.foundation.layout.fillMaxWidth
1215
import androidx.compose.foundation.layout.padding
1316
import androidx.compose.foundation.rememberScrollState
1417
import androidx.compose.foundation.verticalScroll
18+
import androidx.compose.material3.Icon
19+
import androidx.compose.material3.IconButton
1520
import androidx.compose.material3.Scaffold
1621
import androidx.compose.runtime.Composable
1722
import androidx.compose.runtime.CompositionLocalProvider
@@ -21,13 +26,20 @@ import androidx.compose.ui.Modifier
2126
import androidx.compose.ui.platform.LocalContext
2227
import androidx.compose.ui.platform.LocalUriHandler
2328
import androidx.compose.ui.platform.UriHandler
29+
import androidx.compose.ui.res.painterResource
30+
import androidx.compose.ui.res.stringResource
2431
import androidx.compose.ui.tooling.preview.Preview
2532
import androidx.compose.ui.tooling.preview.datasource.LoremIpsum
2633
import androidx.hilt.navigation.compose.hiltViewModel
2734
import androidx.lifecycle.compose.collectAsStateWithLifecycle
35+
import app.opass.ccip.android.R
2836
import app.opass.ccip.android.ui.composable.SessionInfoComposable
2937
import app.opass.ccip.android.ui.composable.TopAppBarComposable
3038
import app.opass.ccip.android.ui.extensions.browse
39+
import app.opass.ccip.android.ui.extensions.toast
40+
import app.opass.ccip.network.models.schedule.Session
41+
42+
private const val TAG = "SessionScreen"
3143

3244
@Composable
3345
fun SessionScreen(
@@ -42,20 +54,41 @@ fun SessionScreen(
4254
LaunchedEffect(key1 = Unit) { viewModel.getSession(eventId, sessionId) }
4355

4456
if (session != null) {
57+
val startTime = viewModel.sdf.parse(session!!.start)!!.time
58+
val endTime = viewModel.sdf.parse(session!!.end)!!.time
59+
4560
ScreenContent(
4661
title = session!!.title,
4762
description = session!!.description,
4863
dateTime = DateUtils.formatDateRange(
4964
context,
50-
viewModel.sdf.parse(session!!.start)!!.time,
51-
viewModel.sdf.parse(session!!.end)!!.time,
65+
startTime,
66+
endTime,
5267
DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_SHOW_TIME or DateUtils.FORMAT_ABBREV_ALL
5368
),
5469
sessionType = session!!.type,
5570
room = session!!.room,
5671
tags = session!!.tags,
5772
speakers = session!!.speakers,
58-
onNavigateUp = onNavigateUp
73+
url = session!!.url,
74+
onNavigateUp = onNavigateUp,
75+
onAddToCalendar = {
76+
try {
77+
context.startActivity(getCalendarIntent(session!!, startTime, endTime))
78+
} catch (exception: Exception) {
79+
Log.e(TAG, "Failed to add event to the calendar app", exception)
80+
context.toast(R.string.add_to_calendar_failed)
81+
}
82+
},
83+
onShareSession = {
84+
try {
85+
context.startActivity(
86+
Intent.createChooser(getShareIntent(session!!.url!!), "")
87+
)
88+
} catch (exception: Exception) {
89+
Log.e(TAG, "Failed to share session", exception)
90+
}
91+
}
5992
)
6093
}
6194
}
@@ -67,9 +100,12 @@ private fun ScreenContent(
67100
dateTime: String,
68101
sessionType: String? = null,
69102
room: String? = null,
103+
url: String? = null,
70104
tags: List<String>? = emptyList(),
71105
speakers: List<String> = emptyList(),
72-
onNavigateUp: () -> Unit = {}
106+
onNavigateUp: () -> Unit = {},
107+
onAddToCalendar: () -> Unit = {},
108+
onShareSession: () -> Unit = {}
73109
) {
74110
val context = LocalContext.current
75111
val uriHandler = object : UriHandler {
@@ -80,7 +116,25 @@ private fun ScreenContent(
80116

81117
Scaffold(
82118
modifier = Modifier.fillMaxSize(),
83-
topBar = { TopAppBarComposable(onNavigate = onNavigateUp) }
119+
topBar = {
120+
TopAppBarComposable(
121+
onNavigate = onNavigateUp,
122+
actions = {
123+
IconButton(onClick = onAddToCalendar) {
124+
Icon(
125+
painter = painterResource(R.drawable.ic_calendar_add),
126+
contentDescription = stringResource(R.string.add_to_calendar)
127+
)
128+
}
129+
IconButton(onClick = onShareSession, enabled = !url.isNullOrBlank()) {
130+
Icon(
131+
painter = painterResource(R.drawable.ic_share),
132+
contentDescription = stringResource(R.string.share)
133+
)
134+
}
135+
}
136+
)
137+
}
84138
) { paddingValues ->
85139
Column(
86140
modifier = Modifier
@@ -103,6 +157,28 @@ private fun ScreenContent(
103157
}
104158
}
105159

160+
private fun getShareIntent(url: String): Intent {
161+
return Intent(Intent.ACTION_SEND).apply {
162+
type = "text/plain"
163+
putExtra(Intent.EXTRA_TEXT, url)
164+
}
165+
}
166+
167+
private fun getCalendarIntent(session: Session, startTime: Long, endTime: Long): Intent {
168+
return Intent(Intent.ACTION_INSERT).apply {
169+
setData(CalendarContract.Events.CONTENT_URI)
170+
putExtra(CalendarContract.Events.TITLE, session.title)
171+
putExtra(CalendarContract.Events.DESCRIPTION, session.description)
172+
putExtra(CalendarContract.Events.EVENT_LOCATION, session.room)
173+
putExtra(CalendarContract.Events.AVAILABILITY, CalendarContract.Events.AVAILABILITY_BUSY)
174+
putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startTime)
175+
putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime)
176+
177+
// Extras for which Android doesn't have variables
178+
putExtra("url", session.url)
179+
}
180+
}
181+
106182
@Preview
107183
@Composable
108184
private fun SessionScreenPreview() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!--
3+
~ SPDX-FileCopyrightText: Material Design Authors / Google LLC
4+
~ SPDX-License-Identifier: Apache-2.0
5+
-->
6+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
7+
android:width="24dp"
8+
android:height="24dp"
9+
android:viewportWidth="960"
10+
android:viewportHeight="960">
11+
<path
12+
android:fillColor="@android:color/white"
13+
android:pathData="M680,880L680,760L560,760L560,680L680,680L680,560L760,560L760,680L880,680L880,760L760,760L760,880L680,880ZM200,800Q167,800 143.5,776.5Q120,753 120,720L120,240Q120,207 143.5,183.5Q167,160 200,160L240,160L240,80L320,80L320,160L560,160L560,80L640,80L640,160L680,160Q713,160 736.5,183.5Q760,207 760,240L760,484Q740,481 720,481Q700,481 680,484L680,400L200,400L200,720Q200,720 200,720Q200,720 200,720L480,720Q480,740 483,760Q486,780 494,800L200,800ZM200,320L680,320L680,240Q680,240 680,240Q680,240 680,240L200,240Q200,240 200,240Q200,240 200,240L200,320ZM200,320L200,240Q200,240 200,240Q200,240 200,240L200,240Q200,240 200,240Q200,240 200,240L200,320Z"/>
14+
</vector>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!--
3+
~ SPDX-FileCopyrightText: Material Design Authors / Google LLC
4+
~ SPDX-License-Identifier: Apache-2.0
5+
-->
6+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
7+
android:width="24dp"
8+
android:height="24dp"
9+
android:viewportWidth="960"
10+
android:viewportHeight="960">
11+
<path
12+
android:fillColor="@android:color/white"
13+
android:pathData="M680,880Q630,880 595,845Q560,810 560,760Q560,754 563,732L282,568Q266,583 245,591.5Q224,600 200,600Q150,600 115,565Q80,530 80,480Q80,430 115,395Q150,360 200,360Q224,360 245,368.5Q266,377 282,392L563,228Q561,221 560.5,214.5Q560,208 560,200Q560,150 595,115Q630,80 680,80Q730,80 765,115Q800,150 800,200Q800,250 765,285Q730,320 680,320Q656,320 635,311.5Q614,303 598,288L317,452Q319,459 319.5,465.5Q320,472 320,480Q320,488 319.5,494.5Q319,501 317,508L598,672Q614,657 635,648.5Q656,640 680,640Q730,640 765,675Q800,710 800,760Q800,810 765,845Q730,880 680,880ZM680,800Q697,800 708.5,788.5Q720,777 720,760Q720,743 708.5,731.5Q697,720 680,720Q663,720 651.5,731.5Q640,743 640,760Q640,777 651.5,788.5Q663,800 680,800ZM200,520Q217,520 228.5,508.5Q240,497 240,480Q240,463 228.5,451.5Q217,440 200,440Q183,440 171.5,451.5Q160,463 160,480Q160,497 171.5,508.5Q183,520 200,520ZM680,240Q697,240 708.5,228.5Q720,217 720,200Q720,183 708.5,171.5Q697,160 680,160Q663,160 651.5,171.5Q640,183 640,200Q640,217 651.5,228.5Q663,240 680,240ZM680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760ZM200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480ZM680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Z"/>
14+
</vector>

androidApp/src/main/res/values/strings.xml

+3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@
4444
<string name="schedule">Schedule</string>
4545
<string name="na" translatable="false">N/A</string>
4646
<string name="search_session">Search for sessions</string>
47+
<string name="add_to_calendar">Add to calendar</string>
48+
<string name="add_to_calendar_failed">Failed to add session to calendar!</string>
49+
<string name="share">Share</string>
4750

4851
<!-- SessionScreen -->
4952
<string name="session">Session</string>

0 commit comments

Comments
 (0)