@@ -10,17 +10,21 @@ package com.nextcloud.talk.ui.dialog
1010import android.app.Activity
1111import android.content.Context
1212import android.content.Intent
13+ import android.content.res.Configuration
1314import android.util.Log
1415import android.widget.ImageView
1516import androidx.compose.foundation.background
17+ import androidx.compose.foundation.border
1618import androidx.compose.foundation.clickable
19+ import androidx.compose.foundation.layout.Arrangement
1720import androidx.compose.foundation.layout.Box
1821import androidx.compose.foundation.layout.Column
1922import androidx.compose.foundation.layout.Row
2023import androidx.compose.foundation.layout.Spacer
2124import androidx.compose.foundation.layout.fillMaxWidth
2225import androidx.compose.foundation.layout.padding
2326import androidx.compose.foundation.layout.size
27+ import androidx.compose.foundation.layout.widthIn
2428import androidx.compose.foundation.lazy.LazyColumn
2529import androidx.compose.foundation.lazy.items
2630import androidx.compose.foundation.shape.CircleShape
@@ -45,6 +49,7 @@ import androidx.compose.ui.Modifier
4549import androidx.compose.ui.draw.clip
4650import androidx.compose.ui.graphics.Color
4751import androidx.compose.ui.layout.ContentScale
52+ import androidx.compose.ui.platform.LocalConfiguration
4853import androidx.compose.ui.platform.LocalContext
4954import androidx.compose.ui.res.colorResource
5055import androidx.compose.ui.res.painterResource
@@ -59,6 +64,8 @@ import androidx.core.net.toUri
5964import androidx.fragment.app.FragmentActivity
6065import autodagger.AutoInjector
6166import coil.compose.AsyncImage
67+ import com.nextcloud.android.common.core.utils.ecosystem.EcosystemApp
68+ import com.nextcloud.android.common.core.utils.ecosystem.EcosystemManager
6269import com.nextcloud.talk.R
6370import com.nextcloud.talk.account.ServerSelectionActivity
6471import com.nextcloud.talk.account.data.model.AccountItem
@@ -110,11 +117,13 @@ class ChooseAccountDialogCompose {
110117 @Inject
111118 lateinit var networkMonitor: NetworkMonitor
112119
120+ lateinit var ecosystemManager: EcosystemManager
121+
113122 private val userItems = mutableStateListOf<AccountItem >()
114123
115124 @Composable
116125 @Suppress(" LongMethod" )
117- fun GetChooseAccountDialog (shouldDismiss : MutableState <Boolean >, activity : Activity ) {
126+ fun GetChooseAccountDialog (shouldDismiss : MutableState <Boolean >, activity : Activity , showEcosystem : Boolean ) {
118127 if (shouldDismiss.value) return
119128 val colorScheme = viewThemeUtils.getColorScheme(activity)
120129 val status = remember { mutableStateOf<Status ?>(null ) }
@@ -124,6 +133,7 @@ class ChooseAccountDialogCompose {
124133 val isOnline by networkMonitor.isOnline.collectAsState()
125134 val currentUser = currentUserProvider.currentUser.blockingGet()!!
126135 val isStatusAvailable = CapabilitiesUtil .isUserStatusAvailable(currentUser)
136+ ecosystemManager = EcosystemManager (activity)
127137
128138 LaunchedEffect (currentUser) {
129139 val users = userManager.users.blockingGet()
@@ -167,12 +177,25 @@ class ChooseAccountDialogCompose {
167177 shouldDismiss.value = true
168178 openSettings(activity)
169179 },
180+ onEcosystemFilesClick = {
181+ shouldDismiss.value = true
182+ openEcosystemFiles(currentUser)
183+ },
184+ onEcosystemNotesClick = {
185+ shouldDismiss.value = true
186+ openEcosystemNotes(currentUser)
187+ },
188+ onEcosystemMoreClick = {
189+ shouldDismiss.value = true
190+ openEcosystemMore(activity)
191+ },
170192 accountRowContent = { user ->
171193 AccountRow (user, activity) { shouldDismiss.value = true }
172194 },
173195 statusIndicator = { modifier ->
174196 StatusIndicator (modifier = modifier, status = status.value, context = context)
175197 },
198+ showEcosystem = showEcosystem,
176199 context = context
177200 )
178201 }
@@ -229,6 +252,20 @@ class ChooseAccountDialogCompose {
229252 activity.startActivity(intent)
230253 }
231254
255+ private fun openEcosystemFiles (currentUser : User ) {
256+ ecosystemManager.openApp(EcosystemApp .FILES , getAccountHandle(currentUser))
257+ }
258+
259+ private fun openEcosystemNotes (currentUser : User ) {
260+ ecosystemManager.openApp(EcosystemApp .NOTES , getAccountHandle(currentUser))
261+ }
262+
263+ private fun getAccountHandle (user : User ): String = user.username + " @" + user.baseUrl?.toUri()?.host
264+
265+ private fun openEcosystemMore (activity : Activity ) {
266+ LinkHelper .openAppStore(" Nextcloud" , true , activity)
267+ }
268+
232269 @Composable
233270 private fun AccountRow (userItem : AccountItem , activity : Activity , onSelected : () -> Unit ) {
234271 Row (
@@ -258,7 +295,11 @@ class ChooseAccountDialogCompose {
258295 .size(40 .dp)
259296 .clip(CircleShape )
260297 )
261- Column (modifier = Modifier .padding(start = 12 .dp).weight(1f )) {
298+ Column (
299+ modifier = Modifier
300+ .padding(start = 12 .dp)
301+ .weight(1f )
302+ ) {
262303 Text (
263304 text = userItem.user.displayName ? : userItem.user.username ? : " "
264305 )
@@ -306,6 +347,7 @@ class ChooseAccountDialogCompose {
306347 }
307348 }
308349 }
350+
309351 companion object {
310352 private const val STATUS_SIZE_DP = 9f
311353 private val TAG = ChooseAccountDialogCompose ::class .simpleName
@@ -331,8 +373,12 @@ private fun ChooseAccountDialogContent(
331373 onSetStatusMessageClick : () -> Unit ,
332374 onAddAccountClick : () -> Unit ,
333375 onOpenSettingsClick : () -> Unit ,
376+ onEcosystemFilesClick : () -> Unit ,
377+ onEcosystemNotesClick : () -> Unit ,
378+ onEcosystemMoreClick : () -> Unit ,
334379 accountRowContent : @Composable (AccountItem ) -> Unit ,
335380 statusIndicator : @Composable (Modifier ) -> Unit ,
381+ showEcosystem : Boolean = true,
336382 context : Context
337383) {
338384 Dialog (onDismissRequest = { shouldDismiss.value = true }) {
@@ -358,7 +404,21 @@ private fun ChooseAccountDialogContent(
358404 HorizontalDivider (
359405 modifier = Modifier .padding(vertical = 8 .dp)
360406 )
361- LazyColumn (modifier = Modifier .padding(start = 8 .dp).weight(1f , fill = false )) {
407+ if (LocalConfiguration .current.orientation == Configuration .ORIENTATION_PORTRAIT && showEcosystem) {
408+ EcosystemAppsSection (
409+ onFilesClick = onEcosystemFilesClick,
410+ onNotesClick = onEcosystemNotesClick,
411+ onMoreClick = onEcosystemMoreClick
412+ )
413+ HorizontalDivider (
414+ modifier = Modifier .padding(vertical = 8 .dp)
415+ )
416+ }
417+ LazyColumn (
418+ modifier = Modifier
419+ .padding(start = 8 .dp)
420+ .weight(1f , fill = false )
421+ ) {
362422 items(accountItems) { account ->
363423 if (account.user.userId + account.user.baseUrl != currentUser.userId + currentUser.baseUrl) {
364424 accountRowContent(account)
@@ -407,7 +467,8 @@ private fun CurrentUserSection(
407467 statusIndicator(Modifier .align(Alignment .BottomEnd ))
408468 }
409469 Column (
410- modifier = Modifier .padding(start = 12 .dp)
470+ modifier = Modifier
471+ .padding(start = 12 .dp)
411472 .weight(1f )
412473 ) {
413474 Text (text = currentUser.displayName ? : currentUser.username ? : " " )
@@ -444,6 +505,69 @@ private fun CurrentUserSection(
444505 }
445506}
446507
508+ @Composable
509+ private fun EcosystemAppsSection (onFilesClick : () -> Unit , onNotesClick : () -> Unit , onMoreClick : () -> Unit ) {
510+ Row (
511+ modifier = Modifier
512+ .fillMaxWidth()
513+ .padding(horizontal = 16 .dp),
514+ horizontalArrangement = Arrangement .SpaceEvenly
515+ ) {
516+ EcosystemAppItem (
517+ iconRes = R .drawable.ic_mimetype_folder,
518+ label = stringResource(R .string.ecosystem_apps_files),
519+ contentDescription = stringResource(R .string.ecosystem_apps_files),
520+ onClick = onFilesClick
521+ )
522+ EcosystemAppItem (
523+ iconRes = R .drawable.ic_notes,
524+ label = stringResource(R .string.ecosystem_apps_notes),
525+ contentDescription = stringResource(R .string.ecosystem_apps_notes),
526+ onClick = onNotesClick
527+ )
528+ EcosystemAppItem (
529+ iconRes = R .drawable.ic_more_apps,
530+ label = stringResource(R .string.ecosystem_apps_more),
531+ contentDescription = stringResource(R .string.ecosystem_apps_more),
532+ onClick = onMoreClick
533+ )
534+ }
535+ }
536+
537+ @Composable
538+ private fun EcosystemAppItem (iconRes : Int , label : String , contentDescription : String , onClick : () -> Unit ) {
539+ Column (
540+ modifier = Modifier
541+ .widthIn(max = 80 .dp)
542+ .clickable(onClick = onClick)
543+ .padding(8 .dp),
544+ horizontalAlignment = Alignment .CenterHorizontally
545+ ) {
546+ Icon (
547+ painter = painterResource(id = iconRes),
548+ contentDescription = contentDescription,
549+ modifier = Modifier
550+ .size(40 .dp)
551+ .border(
552+ width = 1 .dp,
553+ color = MaterialTheme .colorScheme.outline,
554+ shape = CircleShape
555+ )
556+ .padding(8 .dp),
557+ tint = MaterialTheme .colorScheme.onSurface
558+ )
559+ Text (
560+ text = label,
561+ color = MaterialTheme .colorScheme.onSurface,
562+ style = MaterialTheme .typography.labelSmall,
563+ modifier = Modifier .padding(top = 4 .dp),
564+ fontWeight = FontWeight .Bold ,
565+ maxLines = 1 ,
566+ overflow = TextOverflow .Ellipsis
567+ )
568+ }
569+ }
570+
447571@Composable
448572private fun StatusActionButtons (onSetOnlineStatusClick : () -> Unit , onSetStatusMessageClick : () -> Unit ) {
449573 Row {
@@ -482,7 +606,9 @@ private fun OnlineActions(onAddAccountClick: () -> Unit, onOpenSettingsClick: ()
482606 if (isOnline) {
483607 TextButton (onClick = onAddAccountClick, modifier = Modifier .fillMaxWidth()) {
484608 Row (
485- modifier = Modifier .padding(start = 16 .dp, top = 8 .dp).fillMaxWidth(),
609+ modifier = Modifier
610+ .padding(start = 16 .dp, top = 8 .dp)
611+ .fillMaxWidth(),
486612 verticalAlignment = Alignment .CenterVertically
487613 ) {
488614 Icon (
@@ -502,7 +628,9 @@ private fun OnlineActions(onAddAccountClick: () -> Unit, onOpenSettingsClick: ()
502628
503629 TextButton (onClick = onOpenSettingsClick, modifier = Modifier .fillMaxWidth()) {
504630 Row (
505- modifier = Modifier .padding(start = 16 .dp, top = 8 .dp, bottom = 16 .dp).fillMaxWidth(),
631+ modifier = Modifier
632+ .padding(start = 16 .dp, top = 8 .dp, bottom = 16 .dp)
633+ .fillMaxWidth(),
506634 verticalAlignment = Alignment .CenterVertically
507635 ) {
508636 Icon (
@@ -520,7 +648,12 @@ private fun OnlineActions(onAddAccountClick: () -> Unit, onOpenSettingsClick: ()
520648 }
521649}
522650
523- @Preview(showBackground = true )
651+ @Preview(name = " Light Mode" , showBackground = true )
652+ @Preview(
653+ name = " R-t-L" ,
654+ showBackground = true ,
655+ locale = " ar"
656+ )
524657@Composable
525658private fun ChooseAccountDialogContentPreview () {
526659 val shouldDismiss = remember { mutableStateOf(false ) }
@@ -555,6 +688,9 @@ private fun ChooseAccountDialogContentPreview() {
555688 onSetStatusMessageClick = {},
556689 onAddAccountClick = {},
557690 onOpenSettingsClick = {},
691+ onEcosystemFilesClick = {},
692+ onEcosystemNotesClick = {},
693+ onEcosystemMoreClick = {},
558694 accountRowContent = {},
559695 statusIndicator = { modifier -> SampleStatusIndicator (modifier) },
560696 context = context
0 commit comments