Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ androidx-lifecycle = "2.10.0" # Used by the Wear OS app only
androidx-wear-compose = "1.6.0"
apollo = "4.4.2"
apollo-adapters = "0.7.0"
apollo-cache = "1.0.0"
apollo-cache = "1.0.1"
coil = "3.4.0"
compose = "1.10.6" # Used by the Wear OS app only
compose-material-icons-extended = "1.7.8"
Expand All @@ -28,7 +28,7 @@ jetbrains-compose = "1.11.0-alpha04"
jetbrains-lifecycle = "2.10.0"
jetbrains-material3-adaptive-nav3 = "1.3.0-alpha06"
jetbrains-compose-material-icons-extended = "1.7.3"
nav3-ui = "1.1.0-alpha04"
nav3-ui = "1.1.0-beta01"
junit = "4.13.2"
koin = "4.1.1"
kotlin = "2.3.20"
Expand Down
10 changes: 9 additions & 1 deletion iosApp/Android Makers.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
61C8A7672D8B199B0046C2CC /* FirebaseCore in Frameworks */ = {isa = PBXBuildFile; productRef = 61C8A7662D8B199B0046C2CC /* FirebaseCore */; };
61C8A7692D8B199B0046C2CC /* FirebaseFirestore in Frameworks */ = {isa = PBXBuildFile; productRef = 61C8A7682D8B199B0046C2CC /* FirebaseFirestore */; };
61C8A76B2D8B1C490046C2CC /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 61C8A76A2D8B1C490046C2CC /* FirebaseAuth */; };
61C8A76D2D8B1C490046C2CC /* FirebaseMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = 61C8A76C2D8B1C490046C2CC /* FirebaseMessaging */; };
B2CD272F234D06530016AA02 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2CD272E234D06530016AA02 /* AppDelegate.swift */; };
B2CD2731234D06530016AA02 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2CD2730234D06530016AA02 /* SceneDelegate.swift */; };
B2CD2733234D06530016AA02 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2CD2732234D06530016AA02 /* ContentView.swift */; };
Expand Down Expand Up @@ -40,6 +41,7 @@
61C8A7672D8B199B0046C2CC /* FirebaseCore in Frameworks */,
61C8A76B2D8B1C490046C2CC /* FirebaseAuth in Frameworks */,
61C8A7692D8B199B0046C2CC /* FirebaseFirestore in Frameworks */,
61C8A76D2D8B1C490046C2CC /* FirebaseMessaging in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -131,6 +133,7 @@
61C8A7662D8B199B0046C2CC /* FirebaseCore */,
61C8A7682D8B199B0046C2CC /* FirebaseFirestore */,
61C8A76A2D8B1C490046C2CC /* FirebaseAuth */,
61C8A76C2D8B1C490046C2CC /* FirebaseMessaging */,
);
productName = RobotConf;
productReference = B2CD272B234D06530016AA02 /* Android Makers.app */;
Expand Down Expand Up @@ -205,7 +208,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "cd \"$SRCROOT/..\"\n./gradlew :shared:embedAndSignAppleFrameworkForXcode\n";
shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\ncd \"$SRCROOT/..\"\n./gradlew :shared:embedAndSignAppleFrameworkForXcode";
};
/* End PBXShellScriptBuildPhase section */

Expand Down Expand Up @@ -480,6 +483,11 @@
package = 61C8A7632D8B199B0046C2CC /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
productName = FirebaseAuth;
};
61C8A76C2D8B1C490046C2CC /* FirebaseMessaging */ = {
isa = XCSwiftPackageProductDependency;
package = 61C8A7632D8B199B0046C2CC /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
productName = FirebaseMessaging;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = B2CD2723234D06530016AA02 /* Project object */;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
<string name="expert">Expert</string>

<!--About-->
<string name="about_android_makers">Android Makers by droidcon is a two days event held in Paris on April 9th and 10th 2025. Join us in tackling the present and future of Android with the hottest experts of the domain. There will be technical sessions, workshops and opportunities to meet your favorites speakers. All the Talks will be recorded, and uploaded on the Youtube channel.</string>
<string name="about_android_makers">Android Makers by droidcon is a two days event held in Paris on April 9th and 10th 2026. Join us in tackling the present and future of Android with the hottest experts of the domain. There will be technical sessions, workshops and opportunities to meet your favorites speakers. All the Talks will be recorded, and uploaded on the Youtube channel.</string>

<string name="open_slides">Open the slides</string>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ fun MainLayout(
)
}

} // AndroidMakersTheme
}
}

@Composable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package com.androidmakers.ui.common.navigation

import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExitTransition
import androidx.compose.animation.SharedTransitionLayout
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.togetherWith
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.ExperimentalMaterial3Api
Expand All @@ -16,6 +23,7 @@ import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.NavigationBarItemDefaults
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
Expand Down Expand Up @@ -297,40 +305,70 @@ private fun AVANavDisplay(
val entryProvider = entryProvider {
// Tab entries
entry<FeedKey> {
FeedScreen()
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
) {
FeedScreen()
}
}

entry<AgendaKey>(
metadata = ListDetailSceneStrategy.listPane(
detailPlaceholder = {}
)
) {
AgendaLayout(
showFilterBottomSheet = showAgendaFilterBottomSheet,
onFilterBottomSheetDismiss = onDismissAgendaFilter,
onSessionClick = { sessionId -> navigator.navigateToSessionDetail(sessionId) }
)
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
) {
AgendaLayout(
showFilterBottomSheet = showAgendaFilterBottomSheet,
onFilterBottomSheetDismiss = onDismissAgendaFilter,
onSessionClick = { sessionId -> navigator.navigateToSessionDetail(sessionId) }
)
}
}

entry<SpeakersKey> {
SpeakerScreen(
viewModel = koinViewModel(),
navigateToSpeakerDetails = { speakerId -> navigator.navigate(SpeakerDetailKey(speakerId)) },
sharedTransitionScope = sharedTransitionScope,
animatedVisibilityScope = LocalNavAnimatedContentScope.current,
)
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
) {
SpeakerScreen(
viewModel = koinViewModel(),
navigateToSpeakerDetails = { speakerId -> navigator.navigate(SpeakerDetailKey(speakerId)) },
sharedTransitionScope = sharedTransitionScope,
animatedVisibilityScope = LocalNavAnimatedContentScope.current,
)
}
}

entry<SponsorsKey> {
SponsorsScreen()
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
) {
SponsorsScreen()
}
}

entry<InfoKey> {
InfoScreen(
versionCode = versionCode,
versionName = versionName,
featureFlags = featureFlags,
)
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
) {
InfoScreen(
versionCode = versionCode,
versionName = versionName,
featureFlags = featureFlags,
)
}
}

// Detail entries
Expand All @@ -341,41 +379,61 @@ private fun AVANavDisplay(
BottomSheetSceneStrategy.bottomSheet()
}
) { key ->
SessionDetailScreen(
viewModel = koinViewModel(key = key.sessionId) { parametersOf(key.sessionId) },
onBackClick = { navigator.goBack() },
onSpeakerClick = { speakerId -> navigator.navigate(SpeakerDetailKey(speakerId)) },
showBackButton = isWideScreen,
showTopBar = isWideScreen,
sharedTransitionScope = sharedTransitionScope,
// LocalNavAnimatedContentScope is unavailable in OverlayScene (bottom sheet)
animatedVisibilityScope = if (isWideScreen) {
LocalNavAnimatedContentScope.current
} else {
null
},
)
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
) {
SessionDetailScreen(
viewModel = koinViewModel(key = key.sessionId) { parametersOf(key.sessionId) },
onBackClick = { navigator.goBack() },
onSpeakerClick = { speakerId -> navigator.navigate(SpeakerDetailKey(speakerId)) },
showBackButton = isWideScreen,
showTopBar = isWideScreen,
sharedTransitionScope = sharedTransitionScope,
// LocalNavAnimatedContentScope is unavailable in OverlayScene (bottom sheet)
animatedVisibilityScope = if (isWideScreen) {
LocalNavAnimatedContentScope.current
} else {
null
},
)
}
}

entry<SpeakerDetailKey> { key ->
SpeakerDetailsRoute(
speakerDetailsViewModel = koinViewModel(key = key.speakerId) { parametersOf(key.speakerId) },
onBackClick = { navigator.goBack() },
sharedTransitionScope = sharedTransitionScope,
animatedVisibilityScope = LocalNavAnimatedContentScope.current,
)
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
) {
SpeakerDetailsRoute(
speakerDetailsViewModel = koinViewModel(key = key.speakerId) { parametersOf(key.speakerId) },
onBackClick = { navigator.goBack() },
sharedTransitionScope = sharedTransitionScope,
animatedVisibilityScope = LocalNavAnimatedContentScope.current,
)
}
}
}

val bottomSheetStrategy = remember { BottomSheetSceneStrategy<NavKey>() }
val listDetailStrategy = rememberListDetailSceneStrategy<NavKey>()


NavDisplay(
entries = navigationState.toDecoratedEntries(entryProvider),
sceneStrategies = listOf(bottomSheetStrategy, listDetailStrategy),
onBack = { navigator.goBack() }
onBack = navigator::goBack,
transitionSpec = {
fadeIn(tween(200)) togetherWith ExitTransition.None
},
popTransitionSpec = {
EnterTransition.None togetherWith fadeOut(tween(200))
},
)
}

}

@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ fun FeedScreen() {
val lce by viewModel.values.collectAsStateWithLifecycle()
val dismissedAlertIds by viewModel.dismissedAlertIds.collectAsStateWithLifecycle()

LceLayout(lce = lce, onRetry = { viewModel.refresh() }) { feedItems ->
LceLayout(
lce = lce,
onRetry = { viewModel.refresh() }
) { feedItems ->
val visibleItems = feedItems.filter { item ->
item !is FeedItem.Alert || item.id !in dismissedAlertIds
}
Expand Down
Loading
Loading