Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
c5fa0a4
Space first commit
BillCarsonFr Dec 29, 2020
df341d8
Basic peeking preview and join and filter
BillCarsonFr Jan 7, 2021
ab4f242
Use unstable prefixes
BillCarsonFr Jan 8, 2021
e2578a2
Basic space join / use tmp msc id / db model update
BillCarsonFr Jan 12, 2021
7521a0d
Fix / post rebase issues
BillCarsonFr Jan 12, 2021
b7a89f4
Fix / Syncs breaking on dendrite
BillCarsonFr Jan 12, 2021
57f1762
Fix Dendrite sync response support
BillCarsonFr Jan 13, 2021
186024b
MSC 2946 WIP
BillCarsonFr Jan 15, 2021
a8d7c25
rebase fix
BillCarsonFr Feb 10, 2021
c8916ee
Udpate since msc 1772
BillCarsonFr Feb 11, 2021
2cc5c76
hide dev commands from completion
BillCarsonFr Feb 16, 2021
5aa6987
Support update of order/autojoin of child
BillCarsonFr Feb 16, 2021
883f703
Rebase Fixes
BillCarsonFr Feb 23, 2021
d8a3229
a11y fixes
BillCarsonFr Feb 23, 2021
4b27ad8
Creation wizard WIP
BillCarsonFr Feb 22, 2021
6c69a60
Support retry after M_LIMIT_EXCEEDED
BillCarsonFr Feb 24, 2021
7d2d7b4
Space Create Wizard Flow
BillCarsonFr Feb 24, 2021
a901e1d
Post Creation Share flow
BillCarsonFr Feb 25, 2021
2952dca
Default Rooms Handling
BillCarsonFr Feb 25, 2021
a433f2f
a11y
BillCarsonFr Feb 26, 2021
03ef480
Fix missing param in string
BillCarsonFr Feb 27, 2021
ef42591
Open Space Link initial commit
BillCarsonFr Feb 27, 2021
bb0b1ed
Some fixes + join actions
BillCarsonFr Mar 3, 2021
80f1c6c
post rebase fix
BillCarsonFr Mar 11, 2021
0c5ca9f
Space hierachy SDK updates
BillCarsonFr Mar 11, 2021
48fef45
Code quality
BillCarsonFr Mar 16, 2021
e364a36
cleaning
BillCarsonFr Mar 16, 2021
01c5682
small a11Y fix
BillCarsonFr Mar 16, 2021
0da9be3
Removed unneeded id.home menu handling
BillCarsonFr Mar 16, 2021
802853d
Suggested Space support
BillCarsonFr Mar 18, 2021
06a84d9
Basic support to browse space directory
BillCarsonFr Mar 19, 2021
681b5b3
Simple space context menu
BillCarsonFr Mar 19, 2021
872b383
cleaning
BillCarsonFr Mar 19, 2021
ea5e48b
1 depth hierarchy support in space panel
BillCarsonFr Mar 22, 2021
55083a5
Design review changes
BillCarsonFr Mar 24, 2021
5574565
cleaning
BillCarsonFr Mar 24, 2021
8754f77
Invite Space/Room chooser
BillCarsonFr Mar 25, 2021
a5af1a6
Fix invite icons
BillCarsonFr Mar 25, 2021
4c4f68f
Fix home icon dark mode
BillCarsonFr Mar 25, 2021
201b914
Fix invite power level for public space
BillCarsonFr Mar 25, 2021
dda45f1
Fix public space guest access & history visibility
BillCarsonFr Mar 25, 2021
6b8b03e
Show people you may no in space bottomsheet
BillCarsonFr Mar 26, 2021
815cae4
remove enum from rest model
BillCarsonFr Mar 26, 2021
b380fa0
fix copy
BillCarsonFr Mar 26, 2021
46290f1
Benoit Review: cleanup
bmarty Mar 29, 2021
2cccbb3
Benoit Review: avoid duplicate (again) class PowerLevelsContent
bmarty Mar 29, 2021
66ac298
Benoit Review: cleanup 2
bmarty Mar 26, 2021
eac8938
Cleanup
bmarty Mar 29, 2021
7aa4066
Avoid code duplication. Move ItemStyle to its own file.
bmarty Mar 29, 2021
7c34895
Cleanup and fix bugs
bmarty Mar 29, 2021
3c64f78
Fix issue in layout
bmarty Mar 29, 2021
fa489c4
Move SharedPreferenceLiveData to another package
bmarty Mar 29, 2021
a211cc1
Explode into several files
bmarty Mar 29, 2021
4fb248c
rename parameter
bmarty Mar 29, 2021
dfae42c
Cleanup layout
bmarty Mar 29, 2021
386e06d
XML standart
bmarty Mar 29, 2021
0dbd856
UI polishing
bmarty Mar 30, 2021
715bd29
Cleanup and add URL
bmarty Mar 31, 2021
8a35a78
Post rebase fixes
BillCarsonFr Apr 2, 2021
0d3c2b4
Fix space filtering
BillCarsonFr Apr 11, 2021
b635663
Fix suggested rooms
BillCarsonFr Apr 12, 2021
a3b9d18
Fix dm filtering
BillCarsonFr Apr 12, 2021
886cc7f
Sort summaries by default
BillCarsonFr Apr 12, 2021
02c2fea
cleaning
BillCarsonFr Apr 12, 2021
bfbd370
Better tab notification count -incomplete-
BillCarsonFr Apr 12, 2021
79bde6e
Private (me and teamates) space support
BillCarsonFr Apr 6, 2021
643e7ad
Fix initial navigation
BillCarsonFr Apr 12, 2021
49381db
cleaning
BillCarsonFr Apr 13, 2021
6aaf6bd
Fix rebase
BillCarsonFr Apr 13, 2021
e735aee
Fix / group switch + refactoring
BillCarsonFr Apr 14, 2021
57e9e44
fix warning
BillCarsonFr Apr 14, 2021
7910e84
Fix test compilation
BillCarsonFr Apr 14, 2021
1deb44f
Better DM filtering + fix space member loading
BillCarsonFr Apr 14, 2021
14103b1
Radio settings bottomsheet
BillCarsonFr Apr 13, 2021
5a84456
Set guest access in developer mode
BillCarsonFr Apr 15, 2021
8146d8a
Add Rooms to space
BillCarsonFr Apr 16, 2021
4d7aeff
Code review
BillCarsonFr Apr 17, 2021
7921a81
better management of collapsing for room controllers
BillCarsonFr Apr 19, 2021
5e75a3a
Add placehoders for paged room list
BillCarsonFr Apr 19, 2021
d30ba9c
Spaces quick fixes and updates
BillCarsonFr Apr 20, 2021
19bb4c6
Update lab flag label
BillCarsonFr Apr 20, 2021
aa74646
Fix invited spaced filters rooms out of home + invite not working
BillCarsonFr Apr 20, 2021
b45585f
Fix / Suggested room section won't collapse
BillCarsonFr Apr 21, 2021
d42761f
Fix / Room list empty state flickering
BillCarsonFr Apr 21, 2021
733d418
Fix / Add unread count in hamburger menu
BillCarsonFr Apr 21, 2021
1ce7085
Merge Space and Communities initial commit
BillCarsonFr Apr 23, 2021
d186b73
Fix / last selected space-group not restored after restart
BillCarsonFr Apr 26, 2021
dba6784
Remove space lab flags
BillCarsonFr Apr 26, 2021
4520057
Cleaning
BillCarsonFr Apr 26, 2021
46834d2
Fix / dm filtering not working when going back to home
BillCarsonFr Apr 26, 2021
3378e23
Add lab flag to use restricted access rule
BillCarsonFr Apr 26, 2021
872c45d
Fix / kebab menu not always visible in space item
BillCarsonFr Apr 26, 2021
7d3d080
Code review
BillCarsonFr Apr 27, 2021
70476b9
Fix / placeholder in dark time
BillCarsonFr Apr 28, 2021
32605be
Fix / migration recover room type
BillCarsonFr Apr 28, 2021
8c1afba
Fix / empty space pannel on new accounts
BillCarsonFr Apr 28, 2021
b2e6b3f
Latest cleanup before merging to develop
bmarty Apr 28, 2021
b86fd37
Merge branch 'develop' into feature/bca/spaces_sdk
bmarty Apr 28, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Changes in Element 1.1.7 (2021-XX-XX)
===================================================

Features ✨:
-
- Spaces beta

Improvements 🙌:
-
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
import org.matrix.android.sdk.api.session.space.SpaceSummaryQueryParams
import org.matrix.android.sdk.api.session.sync.SyncState
import org.matrix.android.sdk.api.session.user.model.User
import org.matrix.android.sdk.api.session.widgets.model.Widget
Expand Down Expand Up @@ -66,6 +67,13 @@ class RxSession(private val session: Session) {
}
}

fun liveSpaceSummaries(queryParams: SpaceSummaryQueryParams): Observable<List<RoomSummary>> {
return session.spaceService().getSpaceSummariesLive(queryParams).asObservable()
.startWithCallable {
session.spaceService().getSpaceSummaries(queryParams)
}
}

fun liveBreadcrumbs(queryParams: RoomSummaryQueryParams): Observable<List<RoomSummary>> {
return session.getBreadcrumbsLive(queryParams).asObservable()
.startWithCallable {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
/*
* Copyright 2021 The Matrix.org Foundation C.I.C.
*
* 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
*
* http://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 org.matrix.android.sdk.session.space

import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.junit.runners.MethodSorters
import org.matrix.android.sdk.InstrumentedTest
import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toModel
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
import org.matrix.android.sdk.api.session.room.model.GuestAccess
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent
import org.matrix.android.sdk.api.session.room.model.RoomGuestAccessContent
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibilityContent
import org.matrix.android.sdk.api.session.room.model.RoomType
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomPreset
import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
import org.matrix.android.sdk.api.session.space.JoinSpaceResult
import org.matrix.android.sdk.common.CommonTestHelper
import org.matrix.android.sdk.common.SessionTestParams
import kotlin.test.assertEquals
import kotlin.test.assertNotNull

@RunWith(JUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class SpaceCreationTest : InstrumentedTest {

private val commonTestHelper = CommonTestHelper(context())

@Test
fun createSimplePublicSpace() {
val session = commonTestHelper.createAccount("Hubble", SessionTestParams(true))
val roomName = "My Space"
val topic = "A public space for test"
val spaceId: String
runBlocking {
spaceId = session.spaceService().createSpace(roomName, topic, null, true)
// wait a bit to let the summary update it self :/
delay(400)
}

val syncedSpace = session.spaceService().getSpace(spaceId)
assertEquals(roomName, syncedSpace?.asRoom()?.roomSummary()?.name, "Room name should be set")
assertEquals(topic, syncedSpace?.asRoom()?.roomSummary()?.topic, "Room topic should be set")
// assertEquals(topic, syncedSpace.asRoom().roomSummary()?., "Room topic should be set")

assertNotNull(syncedSpace, "Space should be found by Id")
val creationEvent = syncedSpace.asRoom().getStateEvent(EventType.STATE_ROOM_CREATE)
val createContent = creationEvent?.content.toModel<RoomCreateContent>()
assertEquals(RoomType.SPACE, createContent?.type, "Room type should be space")

var powerLevelsContent: PowerLevelsContent? = null
commonTestHelper.waitWithLatch { latch ->
commonTestHelper.retryPeriodicallyWithLatch(latch) {
val toModel = syncedSpace.asRoom().getStateEvent(EventType.STATE_ROOM_POWER_LEVELS)?.content.toModel<PowerLevelsContent>()
powerLevelsContent = toModel
toModel != null
}
}
assertEquals(100, powerLevelsContent?.eventsDefault, "Space-rooms should be created with a power level for events_default of 100")

val guestAccess = syncedSpace.asRoom().getStateEvent(EventType.STATE_ROOM_GUEST_ACCESS)?.content
?.toModel<RoomGuestAccessContent>()?.guestAccess

assertEquals(GuestAccess.CanJoin, guestAccess, "Public space room should be peekable by guest")

val historyVisibility = syncedSpace.asRoom().getStateEvent(EventType.STATE_ROOM_HISTORY_VISIBILITY)?.content
?.toModel<RoomHistoryVisibilityContent>()?.historyVisibility

assertEquals(RoomHistoryVisibility.WORLD_READABLE, historyVisibility, "Public space room should be world readable")

commonTestHelper.signOutAndClose(session)
}

@Test
fun testJoinSimplePublicSpace() {
val aliceSession = commonTestHelper.createAccount("alice", SessionTestParams(true))
val bobSession = commonTestHelper.createAccount("bob", SessionTestParams(true))

val roomName = "My Space"
val topic = "A public space for test"
val spaceId: String
runBlocking {
spaceId = aliceSession.spaceService().createSpace(roomName, topic, null, true)
// wait a bit to let the summary update it self :/
delay(400)
}

// Try to join from bob, it's a public space no need to invite

val joinResult: JoinSpaceResult
runBlocking {
joinResult = bobSession.spaceService().joinSpace(spaceId)
}

assertEquals(JoinSpaceResult.Success, joinResult)

val spaceBobPov = bobSession.spaceService().getSpace(spaceId)
assertEquals(roomName, spaceBobPov?.asRoom()?.roomSummary()?.name, "Room name should be set")
assertEquals(topic, spaceBobPov?.asRoom()?.roomSummary()?.topic, "Room topic should be set")

commonTestHelper.signOutAndClose(aliceSession)
commonTestHelper.signOutAndClose(bobSession)
}

@Test
fun testSimplePublicSpaceWithChildren() {
val aliceSession = commonTestHelper.createAccount("alice", SessionTestParams(true))
val bobSession = commonTestHelper.createAccount("bob", SessionTestParams(true))

val roomName = "My Space"
val topic = "A public space for test"

val spaceId: String = runBlocking { aliceSession.spaceService().createSpace(roomName, topic, null, true) }
val syncedSpace = aliceSession.spaceService().getSpace(spaceId)

// create a room
val firstChild: String = runBlocking {
aliceSession.createRoom(CreateRoomParams().apply {
this.name = "FirstRoom"
this.topic = "Description of first room"
this.preset = CreateRoomPreset.PRESET_PUBLIC_CHAT
})
}

runBlocking {
syncedSpace?.addChildren(firstChild, listOf(aliceSession.sessionParams.homeServerHost ?: ""), "a", true)
}

val secondChild: String = runBlocking {
aliceSession.createRoom(CreateRoomParams().apply {
this.name = "SecondRoom"
this.topic = "Description of second room"
this.preset = CreateRoomPreset.PRESET_PUBLIC_CHAT
})
}

runBlocking {
syncedSpace?.addChildren(secondChild, listOf(aliceSession.sessionParams.homeServerHost ?: ""), "b", false)
}

// Try to join from bob, it's a public space no need to invite

val joinResult = runBlocking {
bobSession.spaceService().joinSpace(spaceId)
}

assertEquals(JoinSpaceResult.Success, joinResult)

val spaceBobPov = bobSession.spaceService().getSpace(spaceId)
assertEquals(roomName, spaceBobPov?.asRoom()?.roomSummary()?.name, "Room name should be set")
assertEquals(topic, spaceBobPov?.asRoom()?.roomSummary()?.topic, "Room topic should be set")

// check if bob has joined automatically the first room

val bobMembershipFirstRoom = bobSession.getRoom(firstChild)?.roomSummary()?.membership
assertEquals(Membership.JOIN, bobMembershipFirstRoom, "Bob should have joined this room")
RoomSummaryQueryParams.Builder()

val spaceSummaryBobPov = bobSession.spaceService().getSpaceSummaries(roomSummaryQueryParams {
this.roomId = QueryStringValue.Equals(spaceId)
this.memberships = listOf(Membership.JOIN)
}).firstOrNull()

assertEquals(2, spaceSummaryBobPov?.spaceChildren?.size ?: -1, "Unexpected number of children")

commonTestHelper.signOutAndClose(aliceSession)
commonTestHelper.signOutAndClose(bobSession)
}
}
Loading