Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/feature/nfe/edit_layout_config' …
Browse files Browse the repository at this point in the history
…into community-testing-space-switching-16_08
  • Loading branch information
ericdecanini committed Aug 16, 2022
2 parents 86382d0 + 82d9a4a commit 2249a4d
Show file tree
Hide file tree
Showing 12 changed files with 366 additions and 34 deletions.
1 change: 1 addition & 0 deletions changelog.d/6506.wip
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[App Layout] added dialog to configure app layout
10 changes: 10 additions & 0 deletions vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ import im.vector.app.features.analytics.plan.MobileScreen
import im.vector.app.features.analytics.plan.ViewRoom
import im.vector.app.features.crypto.recover.SetupMode
import im.vector.app.features.disclaimer.showDisclaimerDialog
import im.vector.app.features.home.room.list.home.layout.HomeLayoutSettingBottomDialogFragment
import im.vector.app.features.matrixto.MatrixToBottomSheet
import im.vector.app.features.matrixto.OriginOfMatrixTo
import im.vector.app.features.navigation.Navigator
Expand Down Expand Up @@ -283,6 +284,11 @@ class HomeActivity :
.show(supportFragmentManager, "SPACE_SETTINGS")
}

private fun showLayoutSettings() {
HomeLayoutSettingBottomDialogFragment()
.show(supportFragmentManager, "LAYOUT_SETTINGS")
}

private fun openSpaceInvite(spaceId: String) {
SpaceInviteBottomSheet.newInstance(spaceId)
.show(supportFragmentManager, "SPACE_INVITE")
Expand Down Expand Up @@ -596,6 +602,10 @@ class HomeActivity :
navigator.openSettings(this)
true
}
R.id.menu_home_layout_settings -> {
showLayoutSettings()
true
}
R.id.menu_home_invite_friends -> {
launchInviteFriends()
true
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* 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 im.vector.app.features.home.room.list.home

import android.content.SharedPreferences
import androidx.core.content.edit
import im.vector.app.core.di.DefaultPreferences
import javax.inject.Inject

class HomeLayoutPreferences @Inject constructor(
@DefaultPreferences private val preferences: SharedPreferences
) {

companion object {
const val SETTINGS_PREFERENCES_HOME_RECENTS = "SETTINGS_PREFERENCES_HOME_RECENTS"
const val SETTINGS_PREFERENCES_HOME_FILTERS = "SETTINGS_PREFERENCES_HOME_FILTERS"
const val SETTINGS_PREFERENCES_USE_AZ_ORDER = "SETTINGS_PREFERENCES_USE_AZ_ORDER"
}

// We need to keep references, because it's kept as a Weak reference and so will be gathered by GC
private var filtersListener: SharedPreferences.OnSharedPreferenceChangeListener? = null
private var recentsListener: SharedPreferences.OnSharedPreferenceChangeListener? = null
private var orderListener: SharedPreferences.OnSharedPreferenceChangeListener? = null

fun areRecentsEnabled(): Boolean {
return preferences.getBoolean(SETTINGS_PREFERENCES_HOME_RECENTS, false)
}

fun setRecentsEnabled(isEnabled: Boolean) {
preferences.edit {
putBoolean(SETTINGS_PREFERENCES_HOME_RECENTS, isEnabled)
}
}

fun areFiltersEnabled(): Boolean {
return preferences.getBoolean(SETTINGS_PREFERENCES_HOME_FILTERS, false)
}

fun setFiltersEnabled(isEnabled: Boolean) {
preferences.edit {
putBoolean(SETTINGS_PREFERENCES_HOME_FILTERS, isEnabled)
}
}

fun isAZOrderingEnabled(): Boolean {
return preferences.getBoolean(SETTINGS_PREFERENCES_USE_AZ_ORDER, false)
}

fun setAZOrderingEnabled(isEnabled: Boolean) {
preferences.edit {
putBoolean(SETTINGS_PREFERENCES_USE_AZ_ORDER, isEnabled)
}
}

fun registerFiltersListener(callBack: (Boolean) -> Unit) {
filtersListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
when (key) {
SETTINGS_PREFERENCES_HOME_FILTERS -> {
callBack.invoke(areFiltersEnabled())
}
}
}
preferences.registerOnSharedPreferenceChangeListener(filtersListener)
}

fun registerRecentsListener(callBack: (Boolean) -> Unit) {
recentsListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
when (key) {
SETTINGS_PREFERENCES_HOME_RECENTS -> {
callBack.invoke(areRecentsEnabled())
}
}
}
preferences.registerOnSharedPreferenceChangeListener(recentsListener)
}

fun registerOrderingListener(callBack: (Boolean) -> Unit) {
orderListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
when (key) {
SETTINGS_PREFERENCES_USE_AZ_ORDER -> {
callBack.invoke(isAZOrderingEnabled())
}
}
}
preferences.registerOnSharedPreferenceChangeListener(orderListener)
}

fun unregisterListeners() {
preferences.unregisterOnSharedPreferenceChangeListener(filtersListener)
preferences.unregisterOnSharedPreferenceChangeListener(recentsListener)
preferences.unregisterOnSharedPreferenceChangeListener(orderListener)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,15 @@ class HomeRoomListFragment @Inject constructor(
}.launchIn(lifecycleScope)

views.roomListView.adapter = concatAdapter

// we need to force scroll when recents/filter tabs are added to make them visible
concatAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
if (positionStart == 0) {
layoutManager.scrollToPosition(0)
}
}
})
}

private fun setupFabs() {
Expand Down Expand Up @@ -205,6 +214,9 @@ class HomeRoomListFragment @Inject constructor(
}

private fun setUpAdapters(sections: Set<HomeRoomSection>) {
concatAdapter.adapters.forEach {
concatAdapter.removeAdapter(it)
}
sections.forEach {
concatAdapter.addAdapter(getAdapterForData(it))
}
Expand Down Expand Up @@ -234,12 +246,11 @@ class HomeRoomListFragment @Inject constructor(
is HomeRoomSection.RoomSummaryData -> {
HomeFilteredRoomsController(
roomSummaryItemFactory,
showFilters = section.showFilters,
).also { controller ->
controller.listener = this
controller.onFilterChanged = ::onRoomFilterChanged
section.filtersData.onEach {
controller.submitFiltersData(it)
controller.submitFiltersData(it.getOrNull())
}.launchIn(lifecycleScope)
section.list.observe(viewLifecycleOwner) { list ->
controller.submitList(list)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,14 @@ import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.model.tag.RoomTag
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
import org.matrix.android.sdk.api.session.room.state.isPublic
import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.flow.flow

class HomeRoomListViewModel @AssistedInject constructor(
@Assisted initialState: HomeRoomListViewState,
private val session: Session,
private val spaceStateHandler: SpaceStateHandler,
private val preferences: HomeLayoutPreferences,
) : VectorViewModel<HomeRoomListViewState, HomeRoomListAction, HomeRoomListViewEvents>(initialState) {

@AssistedFactory
Expand All @@ -78,16 +80,45 @@ class HomeRoomListViewModel @AssistedInject constructor(
private val _sections = MutableSharedFlow<Set<HomeRoomSection>>(replay = 1)
val sections = _sections.asSharedFlow()

private val filtersPreferencesFlow = MutableSharedFlow<Boolean>(replay = 1)

private var filteredPagedRoomSummariesLive: UpdatableLivePageResult? = null

init {
configureSections()
observePreferences()
}

private fun observePreferences() {
preferences.registerFiltersListener { areFiltersEnabled ->
viewModelScope.launch {
filtersPreferencesFlow.emit(areFiltersEnabled)
}
}
viewModelScope.launch {
filtersPreferencesFlow.emit(preferences.areFiltersEnabled())
}

preferences.registerRecentsListener { _ ->
configureSections()
}

preferences.registerOrderingListener { _ ->
configureSections()
}
}

override fun onCleared() {
preferences.unregisterListeners()
super.onCleared()
}

private fun configureSections() {
val newSections = mutableSetOf<HomeRoomSection>()

newSections.add(getRecentRoomsSection())
if (preferences.areRecentsEnabled()) {
newSections.add(getRecentRoomsSection())
}
newSections.add(getFilteredRoomsSection())

viewModelScope.launch {
Expand Down Expand Up @@ -117,7 +148,11 @@ class HomeRoomListViewModel @AssistedInject constructor(
}

val params = getFilteredQueryParams(HomeRoomFilter.ALL, builder.build())
val sortOrder = RoomSortOrder.ACTIVITY // #6506
val sortOrder = if (preferences.isAZOrderingEnabled()) {
RoomSortOrder.NAME
} else {
RoomSortOrder.ACTIVITY
}

val liveResults = session.roomService().getFilteredPagedRoomSummariesLive(
params,
Expand All @@ -141,13 +176,12 @@ class HomeRoomListViewModel @AssistedInject constructor(

return HomeRoomSection.RoomSummaryData(
list = liveResults.livePagedList,
showFilters = true, // #6506
filtersData = getFiltersDataFlow()
)
}

private fun getFiltersDataFlow(): SharedFlow<List<HomeRoomFilter>> {
val flow = MutableSharedFlow<List<HomeRoomFilter>>(replay = 1)
private fun getFiltersDataFlow(): SharedFlow<Optional<List<HomeRoomFilter>>> {
val flow = MutableSharedFlow<Optional<List<HomeRoomFilter>>>(replay = 1)

val favouritesFlow = session.flow()
.liveRoomSummaries(
Expand All @@ -168,26 +202,32 @@ class HomeRoomListViewModel @AssistedInject constructor(
.map { it.isNotEmpty() }
.distinctUntilChanged()

favouritesFlow.combine(dmsFLow) { hasFavourite, hasDm ->
hasFavourite to hasDm
}.onEach { (hasFavourite, hasDm) ->
val filtersData = mutableListOf(
HomeRoomFilter.ALL,
HomeRoomFilter.UNREADS
)
if (hasFavourite) {
filtersData.add(
HomeRoomFilter.FAVOURITES
)
}
if (hasDm) {
filtersData.add(
HomeRoomFilter.PEOPlE
)
}

flow.emit(filtersData)
}.launchIn(viewModelScope)
favouritesFlow
.combine(dmsFLow) { hasFavourite, hasDm ->
hasFavourite to hasDm
}.combine(filtersPreferencesFlow) { (hasFavourite, hasDm), areFiltersEnabled ->
Triple(hasFavourite, hasDm, areFiltersEnabled)
}.onEach { (hasFavourite, hasDm, areFiltersEnabled) ->
if (areFiltersEnabled) {
val filtersData = mutableListOf(
HomeRoomFilter.ALL,
HomeRoomFilter.UNREADS
)
if (hasFavourite) {
filtersData.add(
HomeRoomFilter.FAVOURITES
)
}
if (hasDm) {
filtersData.add(
HomeRoomFilter.PEOPlE
)
}
flow.emit(Optional.from(filtersData))
} else {
flow.emit(Optional.empty())
}
}.launchIn(viewModelScope)

return flow
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ import androidx.paging.PagedList
import im.vector.app.features.home.room.list.home.filter.HomeRoomFilter
import kotlinx.coroutines.flow.SharedFlow
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.util.Optional

sealed class HomeRoomSection {
data class RoomSummaryData(
val list: LiveData<PagedList<RoomSummary>>,
val showFilters: Boolean,
val filtersData: SharedFlow<List<HomeRoomFilter>>
val filtersData: SharedFlow<Optional<List<HomeRoomFilter>>>
) : HomeRoomSection()

data class RecentRoomsData(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
import org.matrix.android.sdk.api.session.room.model.RoomSummary

class HomeFilteredRoomsController(
private val roomSummaryItemFactory: RoomSummaryItemFactory,
private val showFilters: Boolean,
private val roomSummaryItemFactory: RoomSummaryItemFactory
) : PagedListEpoxyController<RoomSummary>(
// Important it must match the PageList builder notify Looper
modelBuildingHandler = createUIHandler()
Expand All @@ -48,7 +47,7 @@ class HomeFilteredRoomsController(

override fun addModels(models: List<EpoxyModel<*>>) {
val host = this
if (showFilters) {
if (host.filtersData != null) {
roomFilterHeaderItem {
id("filter_header")
filtersData(host.filtersData)
Expand All @@ -58,7 +57,7 @@ class HomeFilteredRoomsController(
super.addModels(models)
}

fun submitFiltersData(data: List<HomeRoomFilter>) {
fun submitFiltersData(data: List<HomeRoomFilter>?) {
this.filtersData = data
requestForcedModelBuild()
}
Expand Down
Loading

0 comments on commit 2249a4d

Please sign in to comment.