Skip to content

Conversation

@joragua
Copy link
Collaborator

@joragua joragua commented Nov 26, 2025

Related Issues

App: #4612

  • Add changelog files for the fixed issues in folder changelog/unreleased. More info here
  • Add feature to Release Notes in ReleaseNotesViewModel.kt creating a new ReleaseNote() with String resources (if required)

QA

Test plan: https://github.com/owncloud/QA/blob/master/Mobile/Android/Executions/Release_4.8/Spaces%20-%20Show%20Members.md

Reports:

@joragua joragua self-assigned this Nov 26, 2025
@joragua joragua linked an issue Nov 26, 2025 that may be closed by this pull request
12 tasks
@joragua joragua force-pushed the feature/show_members_of_a_space branch from 010bc3a to 18307f0 Compare November 28, 2025 11:35
@joragua joragua force-pushed the feature/show_members_of_a_space branch from f591564 to 2e2a9fc Compare December 10, 2025 12:45
@joragua joragua requested a review from jesmrec December 11, 2025 13:54
@joragua joragua marked this pull request as ready for review December 11, 2025 13:54
@joragua joragua force-pushed the feature/show_members_of_a_space branch from de967f3 to 9554c63 Compare December 12, 2025 13:15
@joragua joragua requested a review from jesmrec December 12, 2025 13:22
Copy link
Collaborator

@jesmrec jesmrec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, moving to QA 👍

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 15, 2025

(1) [FIXED]

  1. in web, User1 creates a new space, so it's a manager
  2. User1 adds User2 and User3 as viewers
  3. In the app, User2 (or User3) logs in
  4. Open the space view and click on Members

Current:

List of members is not sorted by role. Manager does not show the role:

Screenshot 2025-12-15 at 09 12 01

On the other hand, if you log in with user1 the list is correct

Expected:

List of members sorted by role. Every member with a role

I guess that the lack of role causes the bad sorting, anyway it's not expected

Xiaomi Redmi Note 13
Android 13
be644cdba

@joragua joragua force-pushed the feature/show_members_of_a_space branch 3 times, most recently from 8d5675b to 02bfb53 Compare December 17, 2025 10:44
@joragua joragua force-pushed the feature/show_members_of_a_space branch from 86208c8 to 39e2a06 Compare December 17, 2025 11:02
@joragua joragua requested a review from jesmrec December 17, 2025 11:11
Copy link
Collaborator

@jesmrec jesmrec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Second approval

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 17, 2025

(2) [FIXED]

  1. Open members of any space
  2. Rotate device to change orientation

Current:

app crashes. this is the stacktrace:

FATAL EXCEPTION: main (Ask Gemini)
                 Process: com.owncloud.android.debug, PID: 22456
                 kotlin.UninitializedPropertyAccessException: lateinit property roles has not been initialized
                 	at com.owncloud.android.presentation.spaces.members.SpaceMembersFragment$onViewCreated$2.invokeSuspend(SpaceMembersFragment.kt:73)
                 	at com.owncloud.android.presentation.spaces.members.SpaceMembersFragment$onViewCreated$2.invoke(Unknown Source:8)
                 	at com.owncloud.android.presentation.spaces.members.SpaceMembersFragment$onViewCreated$2.invoke(Unknown Source:4)
                 	at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invokeSuspend(Merge.kt:213)
                 	at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invoke(Unknown Source:13)
                 	at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invoke(Unknown Source:4)
                 	at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invokeSuspend(Merge.kt:30)
                 	at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invoke(Unknown Source:8)
                 	at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invoke(Unknown Source:4)
                 	at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:20)
                 	at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:360)
                 	at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:124)
                 	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:52)
                 	at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1)
                 	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:43)
                 	at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1)
                 	at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1.emit(Merge.kt:29)
                 	at kotlinx.coroutines.flow.StateFlowImpl.collect(StateFlow.kt:401)
                 	at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3.invokeSuspend(Merge.kt:23)
                 	at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3.invoke(Unknown Source:8)
                 	at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3.invoke(Unknown Source:4)
                 	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:42)
                 	at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:261)
                 	at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest.flowCollect(Merge.kt:21)
                 	at kotlinx.coroutines.flow.internal.ChannelFlowOperator.collectTo$suspendImpl(ChannelFlow.kt:153)
                 	at kotlinx.coroutines.flow.internal.ChannelFlowOperator.collectTo(Unknown Source:0)
                 	at kotlinx.coroutines.flow.internal.ChannelFlow$collectToFun$1.invokeSuspend(ChannelFlow.kt:56)
                 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:101)
                 	at kotlinx.coroutines.EventLoop.processUnconfinedEvent(EventLoop.common.kt:65)
                 	at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:367)
                 	at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:26)
                 	at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:358)
                 	at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:124)
                 	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:52)
                 	at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1)
                 	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:43)
                 	at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1)
                 	at androidx.lifecycle.RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1.onStateChanged(RepeatOnLifecycle.kt:106)
                 	at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:360)
                 	at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:271)
                 	at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:313)
                 	at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:151)
14:06:22.479  E  	at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134) (Ask Gemini)
                 	at androidx.fragment.app.Fragment.performStart(Fragment.java:3176)
                 	at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:588)
                 	at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:279)
                 	at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
                 	at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1435)
                 	at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2979)
                 	at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:2904)
                 	at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:274)
                 	at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:359)
                 	at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251)
                 	at com.owncloud.android.ui.activity.BaseActivity.onStart(BaseActivity.java:200)
                 	at com.owncloud.android.ui.activity.FileActivity.onStart(FileActivity.java:152)
                 	at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1713)
                 	at android.app.Activity.performStart(Activity.java:9267)
                 	at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4443)
                 	at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:282)
                 	at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:262)
                 	at android.app.servertransaction.TransactionExecutor.executeLifecycleItem(TransactionExecutor.java:234)
                 	at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:110)
                 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:84)
                 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2881)
                 	at android.os.Handler.dispatchMessage(Handler.java:107)
                 	at android.os.Looper.loopOnce(Looper.java:249)
                 	at android.os.Looper.loop(Looper.java:337)
                 	at android.app.ActivityThread.main(ActivityThread.java:9593)
                 	at java.lang.reflect.Method.invoke(Native Method)
                 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
                 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
                 	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@289b7d6, Dispatchers.Main.immediate]

Expected:

No crash

Xiaomi Redmi Note 13, Android 15
65e343b40

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 17, 2025

(3) [FIXED]

This one may not be worthy to fix, thinking in the following issues to develop. It's about long names (top is 255 characters):

Screenshot 2025-12-17 at 14 15 07
  • No margin on the right. Edit and delete options add new options there to fix. We could wait.

  • Is it better to show the complete name in several lines, or ellipsize in only one line? (we take the second approach in Manage accounts and in Share). I'd go for the second option, in order to keep consistency. What do you mean?

Xiaomi Redmi Note 13, Android 15
65e343b40

@joragua
Copy link
Collaborator Author

joragua commented Dec 17, 2025

(2) should be fixed with this commit: eb243ad

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 17, 2025

(4) [WONT FIX]

  1. In a space, set a long list of members that forces the user to scroll down
  2. Scroll down to the bottom of the list

Current:

The top bar with the Space info is not pinned and is scrolled as well:

Screen_recording_20251217_142853.mp4

Expected:

Top side of the screen is pinned.

Xiaomi Redmi Note 13, Android 15
65e343b40

@joragua
Copy link
Collaborator Author

joragua commented Dec 17, 2025

Regarding (3), I would add the margin while implementing Edit and Delete options, once we have the exact dimensions for icons, margins, paddings... 🤔

Is it better to show the complete name in several lines, or ellipsize in only one line? (we take the second approach in Manage accounts and in Share). I'd go for the second option, in order to keep consistency. What do you mean?

I would go for the second approach, as you suggested, in order to align UI with Manage accounts and Share screens. 😄

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 17, 2025

(2) fixed
(4) -> let's keep the behaviour since this is nothing critical and and also present in other views. Marking as [WONT FIX]

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 17, 2025

(5) [FIXED]

About accessibility, two suggestions. Not sure if they are feasible. Regarding Talkback:

  1. The user/group placeholder in the list of spaces is not dictated.
  2. Expiration date is correctly dictated, but it may help to say "Expires" or "Expiration date" as well.

Xiaomi Redmi Note 13, Android 15
3245c2f0

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 17, 2025

About (1). I still reproduce, by performing orientation changes. Unfortunately, i did not find a clear reason because i reproduce it with space manager's spaces (no higher roles to display as in (1) ).

If it helps... :

Screen_recording_20251217_174906.mp4

[FIXED]

3245c2f0fe

@joragua
Copy link
Collaborator Author

joragua commented Dec 17, 2025

Regarding (5), I've improved the content descriptions by adding Group or User depending on the member type and Expires when the user has expiration date 🙌🏻

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 17, 2025

(5) fixed

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 17, 2025

Not a report but a clarification about accessibility: keyboard navigation is not implemented in Space members view because no items in that view are clickable (at least, i guess that) but the back button on the top bar. For that reason, physical keyboard tests will be postponed to other issues/developments in which the view will become more interactive.

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 18, 2025

(6) [WONT FIX]

  1. Add a significant number of members onto an space (at least 6), with different roles
  2. Open Members
  3. Change device orientation

Current:

List of members in different order, the roles sorting keeps

Expected:

Same list in bot orientations

Xiaomi Redmi Note 13, Android 15
f38799e5e

@joragua
Copy link
Collaborator Author

joragua commented Dec 18, 2025

Regarding (6), the endpoint /v1beta1/drives/<drive-id>/root/permissions returns the list of users in a different order each time. Anyway, we sort the list by role so we can assume it is handled in our side.

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 18, 2025

Regarding (6), the endpoint /v1beta1/drives//root/permissions returns the list of users in a different order each time. Anyway, we sort the list by role so we can assume it is handled in our side.

setting (6) as wont fix

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 18, 2025

(7) [FIXED]

  1. In web, add a link to any space
  2. In app, open Spaces and click on three-dot-button of that space with a link

Current:

No Members option

Expected:

Members should be listed since it is always available.

Xiaomi Redmi Note 13, Android 15
f38799e5e

@joragua joragua force-pushed the feature/show_members_of_a_space branch from f38799e to 02353fc Compare December 18, 2025 11:17
@joragua joragua force-pushed the feature/show_members_of_a_space branch from 4a53951 to 83785f2 Compare December 18, 2025 11:26
@joragua
Copy link
Collaborator Author

joragua commented Dec 18, 2025

(1) and (7) should be fixed with the new commits @jesmrec

It would be nice to perform a sanity test here (#4698) to ensure nothing is broken

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 18, 2025

(1) and (7) fixed

Sanity over #4698, with the following checks, also passed:

#4698 (comment)

@jesmrec
Copy link
Collaborator

jesmrec commented Dec 19, 2025

Approved on my side. 👍

Just to remark, the following issue was detected during the QA-phase: #4742
Also, it's pending to check the keyboard navigation, will be done in following developments when cells in the view are clickable and navegable.

@joragua joragua merged commit eaef4a2 into master Dec 19, 2025
10 checks passed
@joragua joragua deleted the feature/show_members_of_a_space branch December 19, 2025 08:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE REQUEST] Show members of a space

4 participants