-
-
Notifications
You must be signed in to change notification settings - Fork 2k
Expand file tree
/
Copy pathComposeActivity.kt
More file actions
131 lines (114 loc) · 4.85 KB
/
Copy pathComposeActivity.kt
File metadata and controls
131 lines (114 loc) · 4.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2024 Alper Ozturk <alper.ozturk@nextcloud.com>
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH
* SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
*/
package com.nextcloud.ui.composeActivity
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import com.nextcloud.client.assistant.AssistantScreen
import com.nextcloud.client.assistant.AssistantViewModel
import com.nextcloud.client.assistant.conversation.ConversationViewModel
import com.nextcloud.client.assistant.conversation.repository.ConversationRemoteRepositoryImpl
import com.nextcloud.client.assistant.repository.local.AssistantLocalRepositoryImpl
import com.nextcloud.client.assistant.repository.remote.AssistantRemoteRepositoryImpl
import com.nextcloud.client.database.NextcloudDatabase
import com.nextcloud.common.NextcloudClient
import com.nextcloud.ui.ClientIntegrationScreen
import com.nextcloud.utils.extensions.getParcelableArgument
import com.owncloud.android.R
import com.owncloud.android.databinding.ActivityComposeBinding
import com.owncloud.android.ui.activity.DrawerActivity
class ComposeActivity : DrawerActivity() {
lateinit var binding: ActivityComposeBinding
companion object {
const val DESTINATION = "DESTINATION"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityComposeBinding.inflate(layoutInflater)
setContentView(binding.root)
val destination =
intent.getParcelableArgument(DESTINATION, ComposeDestination::class.java) ?: throw IllegalArgumentException(
"destination is not exists"
)
setupActivityUIFor(destination)
binding.composeView.setContent {
MaterialTheme(
colorScheme = viewThemeUtils.getColorScheme(this),
content = {
Content(destination)
}
)
}
}
private fun setupActivityUIFor(destination: ComposeDestination) {
if (destination is ComposeDestination.AssistantScreen) {
setupDrawer()
setupToolbarShowOnlyMenuButtonAndTitle(destination.title) {
openDrawer()
}
} else {
setSupportActionBar(null)
findViewById<View?>(R.id.appbar)?.let {
it.visibility = View.GONE
}
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
android.R.id.home -> {
toggleDrawer()
true
}
else -> super.onOptionsItemSelected(item)
}
@Composable
private fun Content(destination: ComposeDestination) {
val currentScreen by ComposeNavigation.currentScreen.collectAsState()
var nextcloudClient by remember { mutableStateOf<NextcloudClient?>(null) }
LaunchedEffect(Unit) {
ComposeNavigation.navigate(destination)
nextcloudClient = clientRepository.getNextcloudClient()
}
binding.bottomNavigation.menu.findItem(R.id.nav_assistant).run {
isChecked = true
}
when (currentScreen) {
is ComposeDestination.AssistantScreen -> {
val dao = NextcloudDatabase.instance().assistantDao()
val sessionId = (currentScreen as? ComposeDestination.AssistantScreen)?.sessionId
val client = nextcloudClient ?: return
AssistantScreen(
viewModel = AssistantViewModel(
accountName = userAccountManager.user.accountName,
remoteRepository = AssistantRemoteRepositoryImpl(client, capabilities),
localRepository = AssistantLocalRepositoryImpl(dao),
sessionIdArg = sessionId
),
conversationViewModel = ConversationViewModel(
remoteRepository = ConversationRemoteRepositoryImpl(client)
),
activity = this,
capability = capabilities
)
}
is ComposeDestination.ClientIntegrationScreen -> {
binding.bottomNavigation.visibility = View.GONE
val integrationScreen = (currentScreen as ComposeDestination.ClientIntegrationScreen)
ClientIntegrationScreen(integrationScreen.data, nextcloudClient?.baseUri.toString())
}
else -> Unit
}
}
}