From 13564389231aa74fd0ed8217b2f84bcd0fb0d7af Mon Sep 17 00:00:00 2001 From: raystatic Date: Wed, 14 Oct 2026 05:24:15 +0530 Subject: [PATCH 1/9] Adds Navigation 3 & kotlinx-serialization dependencies --- Jetchat/app/build.gradle.kts | 4 ++++ Jetchat/gradle/libs.versions.toml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/Jetchat/app/build.gradle.kts b/Jetchat/app/build.gradle.kts index 55c6ffb042..2bcc1b1138 100644 --- a/Jetchat/app/build.gradle.kts +++ b/Jetchat/app/build.gradle.kts @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.application) alias(libs.plugins.compose) + alias(libs.plugins.kotlin.serialization) } android { @@ -105,8 +106,11 @@ dependencies { implementation(libs.androidx.compose.runtime.livedata) implementation(libs.androidx.lifecycle.viewModelCompose) implementation(libs.androidx.lifecycle.runtime.compose) + implementation(libs.androidx.lifecycle.viewmodel.navigation3) implementation(libs.androidx.navigation.fragment) implementation(libs.androidx.navigation.ui.ktx) + implementation(libs.androidx.navigation3.runtime) + implementation(libs.androidx.navigation3.ui) implementation(libs.androidx.compose.foundation.layout) implementation(libs.androidx.compose.material3) diff --git a/Jetchat/gradle/libs.versions.toml b/Jetchat/gradle/libs.versions.toml index 5cd7681fac..aa0c67be69 100644 --- a/Jetchat/gradle/libs.versions.toml +++ b/Jetchat/gradle/libs.versions.toml @@ -48,6 +48,7 @@ maps-compose = "8.6.0" media3Exoplayer = "1.11.1" media3UiCompose = "1.11.1" minSdk = "24" +nav3Core = "1.2.0" okhttp = "5.5.0" play-services-wearable = "20.0.1" robolectric = "4.17" @@ -103,6 +104,7 @@ androidx-lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime-kt androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidx-lifecycle-runtime-compose" } androidx-lifecycle-viewModelCompose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle-compose" } androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle-compose" } +androidx-lifecycle-viewmodel-navigation3 = { module = "androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "androidx-lifecycle-compose" } androidx-lifecycle-viewmodel-savedstate = { module = "androidx.lifecycle:lifecycle-viewmodel-savedstate", version.ref = "androidx-lifecycle-compose" } androidx-material-icons-core = { module = "androidx.compose.material:material-icons-core" } androidx-media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3Exoplayer" } @@ -110,6 +112,8 @@ androidx-media3-ui-compose = { module = "androidx.media3:media3-ui-compose", ver androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "androidx-navigation" } androidx-navigation-fragment = { module = "androidx.navigation:navigation-fragment-ktx", version.ref = "androidx-navigation" } androidx-navigation-ui-ktx = { module = "androidx.navigation:navigation-ui-ktx", version.ref = "androidx-navigation" } +androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "nav3Core" } +androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "nav3Core" } androidx-palette = { module = "androidx.palette:palette", version.ref = "androidx-palette" } androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" } From 0ca206396bd3386b951c270f2fb7f98f95928624 Mon Sep 17 00:00:00 2001 From: raystatic Date: Wed, 14 Oct 2026 05:25:03 +0530 Subject: [PATCH 2/9] NavigationTest assert on the UI instead of the NavController --- .../example/compose/jetchat/NavigationTest.kt | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/NavigationTest.kt b/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/NavigationTest.kt index ef057174d9..301e92471f 100644 --- a/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/NavigationTest.kt +++ b/Jetchat/app/src/androidTest/java/com/example/compose/jetchat/NavigationTest.kt @@ -31,10 +31,8 @@ import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo import androidx.compose.ui.test.performTouchInput import androidx.compose.ui.test.swipeRight -import androidx.navigation.NavController -import androidx.navigation.findNavController import androidx.test.espresso.Espresso -import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test @@ -49,17 +47,14 @@ class NavigationTest { @Test fun app_launches() { // Check app launches at the correct destination - assertEquals(getNavController().currentDestination?.id, R.id.nav_home) + assertConversationIsDisplayed() } @Test fun profileScreen_back_conversationScreen() { - val navController = getNavController() // Navigate to profile navigateToProfile("Taylor Brooks") - // Check profile is displayed - assertEquals(navController.currentDestination?.id, R.id.nav_profile) - // Extra UI check (scroll to Display name as the new profile header is taller) + // Check profile is displayed (scroll to Display name as the new profile header is taller) composeTestRule .onNodeWithText(composeTestRule.activity.getString(R.string.display_name)) .performScrollTo() @@ -69,7 +64,7 @@ class NavigationTest { Espresso.pressBack() // Check that we're home - assertEquals(navController.currentDestination?.id, R.id.nav_home) + assertConversationIsDisplayed() } /** @@ -83,7 +78,19 @@ class NavigationTest { navigateToHomeFromProfile() // Chewie, we're home - assertEquals(getNavController().currentDestination?.id, R.id.nav_home) + assertConversationIsDisplayed() + + // The profiles were popped off the back stack, so pressing back leaves the app + val activity = composeTestRule.activity + Espresso.pressBackUnconditionally() + composeTestRule.runOnIdle { + assertTrue(activity.isFinishing) + } + } + + private fun assertConversationIsDisplayed() { + // The channel name is shown in the conversation's app bar (and in the drawer, which is excluded) + composeTestRule.onNode(hasText("composers") and !isInDrawer()).assertIsDisplayed() } private fun navigateToProfile(name: String) { @@ -115,8 +122,4 @@ class NavigationTest { } composeTestRule.onNode(hasText("composers") and isInDrawer()).performClick() } - - private fun getNavController(): NavController { - return composeTestRule.activity.findNavController(R.id.nav_host_fragment) - } } From fc2ca0b6d4a04fdc8d640d38090be68aaae93fb2 Mon Sep 17 00:00:00 2001 From: raystatic Date: Wed, 14 Oct 2026 05:38:27 +0530 Subject: [PATCH 3/9] Replace Fragments with Nav3 --- Jetchat/app/build.gradle.kts | 4 - .../example/compose/jetchat/MainViewModel.kt | 38 ----- .../example/compose/jetchat/NavActivity.kt | 158 ++++++++++-------- .../jetchat/components/JetchatDrawer.kt | 3 +- .../conversation/ConversationFragment.kt | 64 ------- .../jetchat/navigation/JetchatNavKeys.kt | 33 ++++ .../jetchat/profile/ProfileFragment.kt | 68 -------- .../src/main/res/drawable/jetchat_logo.xml | 6 +- .../app/src/main/res/layout/content_main.xml | 34 ---- .../main/res/navigation/mobile_navigation.xml | 37 ---- Jetchat/app/src/main/res/values/ids.xml | 21 --- Jetchat/app/src/main/res/values/themes.xml | 4 - Jetchat/gradle/libs.versions.toml | 3 - 13 files changed, 125 insertions(+), 348 deletions(-) delete mode 100644 Jetchat/app/src/main/java/com/example/compose/jetchat/MainViewModel.kt delete mode 100644 Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/ConversationFragment.kt create mode 100644 Jetchat/app/src/main/java/com/example/compose/jetchat/navigation/JetchatNavKeys.kt delete mode 100644 Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileFragment.kt delete mode 100644 Jetchat/app/src/main/res/layout/content_main.xml delete mode 100644 Jetchat/app/src/main/res/navigation/mobile_navigation.xml delete mode 100644 Jetchat/app/src/main/res/values/ids.xml diff --git a/Jetchat/app/build.gradle.kts b/Jetchat/app/build.gradle.kts index 2bcc1b1138..305dab0f32 100644 --- a/Jetchat/app/build.gradle.kts +++ b/Jetchat/app/build.gradle.kts @@ -78,7 +78,6 @@ android { buildFeatures { compose = true - viewBinding = true } packaging.resources { @@ -107,8 +106,6 @@ dependencies { implementation(libs.androidx.lifecycle.viewModelCompose) implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.lifecycle.viewmodel.navigation3) - implementation(libs.androidx.navigation.fragment) - implementation(libs.androidx.navigation.ui.ktx) implementation(libs.androidx.navigation3.runtime) implementation(libs.androidx.navigation3.ui) @@ -117,7 +114,6 @@ dependencies { implementation(libs.androidx.compose.ui.tooling.preview) debugImplementation(libs.androidx.compose.ui.tooling) implementation(libs.androidx.compose.ui.util) - implementation(libs.androidx.compose.ui.viewbinding) implementation(libs.androidx.compose.ui.googlefonts) implementation(libs.androidx.media3.exoplayer) diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/MainViewModel.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/MainViewModel.kt deleted file mode 100644 index 51bb6d040a..0000000000 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/MainViewModel.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2020 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 - * - * https://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 com.example.compose.jetchat - -import androidx.lifecycle.ViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow - -/** - * Used to communicate between screens. - */ -class MainViewModel : ViewModel() { - - private val _drawerShouldBeOpened = MutableStateFlow(false) - val drawerShouldBeOpened = _drawerShouldBeOpened.asStateFlow() - - fun openDrawer() { - _drawerShouldBeOpened.value = true - } - - fun resetOpenDrawerAction() { - _drawerShouldBeOpened.value = false - } -} diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt index dff10570d9..08ed9a73b5 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt @@ -17,101 +17,117 @@ package com.example.compose.jetchat import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.activity.viewModels -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.material3.DrawerValue.Closed -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.rememberDrawerState -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue -import androidx.compose.ui.platform.ComposeView -import androidx.compose.ui.viewinterop.AndroidViewBinding -import androidx.core.os.bundleOf import androidx.core.view.ViewCompat -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavController -import androidx.navigation.fragment.NavHostFragment +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator +import androidx.navigation3.runtime.entryProvider +import androidx.navigation3.runtime.rememberNavBackStack +import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator +import androidx.navigation3.ui.NavDisplay import com.example.compose.jetchat.components.JetchatDrawer -import com.example.compose.jetchat.databinding.ContentMainBinding +import com.example.compose.jetchat.conversation.ConversationContent +import com.example.compose.jetchat.conversation.ConversationViewModel +import com.example.compose.jetchat.navigation.Conversation +import com.example.compose.jetchat.navigation.Profile +import com.example.compose.jetchat.profile.ProfileError +import com.example.compose.jetchat.profile.ProfileScreen +import com.example.compose.jetchat.profile.ProfileViewModel import kotlinx.coroutines.launch /** * Main activity for the app. */ -class NavActivity : AppCompatActivity() { - private val viewModel: MainViewModel by viewModels() +class NavActivity : ComponentActivity() { - @OptIn(ExperimentalMaterial3Api::class) override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { _, insets -> insets } - setContentView( - ComposeView(this).apply { - consumeWindowInsets = false - setContent { - val drawerState = rememberDrawerState(initialValue = Closed) - val drawerOpen by viewModel.drawerShouldBeOpened - .collectAsStateWithLifecycle() + setContent { + val drawerState = rememberDrawerState(initialValue = Closed) + val scope = rememberCoroutineScope() + // The back stack survives configuration changes and process death + val backStack = rememberNavBackStack(Conversation) - var selectedMenu by remember { mutableStateOf("composers") } - if (drawerOpen) { - // Open drawer and reset state in VM. - LaunchedEffect(Unit) { - // wrap in try-finally to handle interruption whiles opening drawer - try { - drawerState.open() - } finally { - viewModel.resetOpenDrawerAction() - } - } - } - - val scope = rememberCoroutineScope() + var selectedMenu by remember { mutableStateOf("composers") } - JetchatDrawer( - drawerState = drawerState, - selectedMenu = selectedMenu, - onChatClicked = { - findNavController().popBackStack(R.id.nav_home, false) - scope.launch { - drawerState.close() - } - selectedMenu = it - }, - onProfileClicked = { - val bundle = bundleOf("userId" to it) - findNavController().navigate(R.id.nav_profile, bundle) - scope.launch { - drawerState.close() - } - selectedMenu = it - }, - ) { - AndroidViewBinding(ContentMainBinding::inflate) + JetchatDrawer( + drawerState = drawerState, + selectedMenu = selectedMenu, + onChatClicked = { + // Pop everything above the conversation, which is always at the bottom of + // the back stack + backStack.removeAll { key -> key != Conversation } + scope.launch { + drawerState.close() } - } - }, - ) - } - - override fun onSupportNavigateUp(): Boolean { - return findNavController().navigateUp() || super.onSupportNavigateUp() - } + selectedMenu = it + }, + onProfileClicked = { + backStack.add(Profile(userId = it)) + scope.launch { + drawerState.close() + } + selectedMenu = it + }, + ) { + NavDisplay( + backStack = backStack, + onBack = { backStack.removeLastOrNull() }, + // Scope the ViewModels to their entry. The ViewModelStoreNavEntryDecorator + // requires the default SaveableStateHolderNavEntryDecorator, which saves the + // state of each entry. + entryDecorators = listOf( + rememberSaveableStateHolderNavEntryDecorator(), + rememberViewModelStoreNavEntryDecorator(), + ), + entryProvider = entryProvider { + entry { + val viewModel = viewModel() + ConversationContent( + uiState = viewModel.uiState, + navigateToProfile = { userId -> + backStack.add(Profile(userId = userId)) + }, + onNavIconPressed = { + scope.launch { + drawerState.open() + } + }, + onMessageLikeToggled = viewModel::toggleLike, + ) + } + entry { key -> + // The user id comes from the key, so set it when the ViewModel of this + // entry is created + val viewModel = viewModel { + ProfileViewModel().apply { setUserId(key.userId) } + } + val userData by viewModel.userData.observeAsState() - /** - * See https://issuetracker.google.com/142847973 - */ - private fun findNavController(): NavController { - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment - return navHostFragment.navController + if (userData == null) { + ProfileError() + } else { + ProfileScreen( + userData = userData!!, + ) + } + } + }, + ) + } + } } } diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt index e17cb33d90..d610b31d80 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt @@ -105,9 +105,10 @@ private fun DrawerHeader() { contentDescription = null, modifier = Modifier.size(24.dp), ) - Image( + Icon( painter = painterResource(id = R.drawable.jetchat_logo), contentDescription = null, + tint = MaterialTheme.colorScheme.onSurface, modifier = Modifier.padding(start = 8.dp), ) } diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/ConversationFragment.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/ConversationFragment.kt deleted file mode 100644 index a99dce1776..0000000000 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/ConversationFragment.kt +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2020 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 - * - * https://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 com.example.compose.jetchat.conversation - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.ViewGroup.LayoutParams -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import androidx.compose.ui.platform.ComposeView -import androidx.core.os.bundleOf -import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.fragment.app.viewModels -import androidx.navigation.findNavController -import com.example.compose.jetchat.MainViewModel -import com.example.compose.jetchat.R -import com.example.compose.jetchat.theme.JetchatTheme - -class ConversationFragment : Fragment() { - - private val activityViewModel: MainViewModel by activityViewModels() - private val viewModel: ConversationViewModel by viewModels() - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = - ComposeView(inflater.context).apply { - layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT) - - setContent { - JetchatTheme { - ConversationContent( - uiState = viewModel.uiState, - navigateToProfile = { user -> - // Click callback - val bundle = bundleOf("userId" to user) - findNavController().navigate( - R.id.nav_profile, - bundle, - ) - }, - onNavIconPressed = { - activityViewModel.openDrawer() - }, - onMessageLikeToggled = viewModel::toggleLike, - ) - } - } - } -} diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/navigation/JetchatNavKeys.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/navigation/JetchatNavKeys.kt new file mode 100644 index 0000000000..df1fee5c49 --- /dev/null +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/navigation/JetchatNavKeys.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2026 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 + * + * https://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 com.example.compose.jetchat.navigation + +import androidx.navigation3.runtime.NavKey +import kotlinx.serialization.Serializable + +/** + * The conversation screen, which is the start destination. + * + * The keys are [Serializable] and implement [NavKey] so that the back stack created with + * `rememberNavBackStack` survives configuration changes and process death. + */ +@Serializable +data object Conversation : NavKey + +/** The profile screen of the user identified by [userId]. */ +@Serializable +data class Profile(val userId: String) : NavKey diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileFragment.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileFragment.kt deleted file mode 100644 index 8af0b5f957..0000000000 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileFragment.kt +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2020 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 - * - * https://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 com.example.compose.jetchat.profile - -import android.content.Context -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.platform.ComposeView -import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.fragment.app.viewModels -import com.example.compose.jetchat.MainViewModel -import com.example.compose.jetchat.theme.JetchatTheme - -class ProfileFragment : Fragment() { - - private val viewModel: ProfileViewModel by viewModels() - private val activityViewModel: MainViewModel by activityViewModels() - - override fun onAttach(context: Context) { - super.onAttach(context) - // Consider using safe args plugin - val userId = arguments?.getString("userId") - viewModel.setUserId(userId) - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = - ComposeView(inflater.context).apply { - layoutParams = ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT, - ) - - setContent { - val userData by viewModel.userData.observeAsState() - - JetchatTheme { - if (userData == null) { - ProfileError() - } else { - ProfileScreen( - userData = userData!!, - ) - } - } - } - } -} diff --git a/Jetchat/app/src/main/res/drawable/jetchat_logo.xml b/Jetchat/app/src/main/res/drawable/jetchat_logo.xml index 6a89c0b954..36d29550ed 100644 --- a/Jetchat/app/src/main/res/drawable/jetchat_logo.xml +++ b/Jetchat/app/src/main/res/drawable/jetchat_logo.xml @@ -21,12 +21,12 @@ android:viewportHeight="24"> + android:fillColor="@android:color/white"/> + android:fillColor="@android:color/white"/> diff --git a/Jetchat/app/src/main/res/layout/content_main.xml b/Jetchat/app/src/main/res/layout/content_main.xml deleted file mode 100644 index 31302894b9..0000000000 --- a/Jetchat/app/src/main/res/layout/content_main.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - diff --git a/Jetchat/app/src/main/res/navigation/mobile_navigation.xml b/Jetchat/app/src/main/res/navigation/mobile_navigation.xml deleted file mode 100644 index 3db49d9468..0000000000 --- a/Jetchat/app/src/main/res/navigation/mobile_navigation.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - diff --git a/Jetchat/app/src/main/res/values/ids.xml b/Jetchat/app/src/main/res/values/ids.xml deleted file mode 100644 index a749058c41..0000000000 --- a/Jetchat/app/src/main/res/values/ids.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - diff --git a/Jetchat/app/src/main/res/values/themes.xml b/Jetchat/app/src/main/res/values/themes.xml index 0e815ceaa4..03fb7885f7 100644 --- a/Jetchat/app/src/main/res/values/themes.xml +++ b/Jetchat/app/src/main/res/values/themes.xml @@ -35,8 +35,4 @@ true -