mirror of
https://github.com/vector-im/riotX-android
synced 2025-10-06 00:02:48 +02:00
Merge remote-tracking branch 'origin/feature/nfe/edit_layout_config' into community-testing-space-switching-16_08
This commit is contained in:
1
changelog.d/6506.wip
Normal file
1
changelog.d/6506.wip
Normal file
@@ -0,0 +1 @@
|
||||
[App Layout] added dialog to configure app layout
|
@@ -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
|
||||
@@ -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")
|
||||
@@ -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
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
@@ -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() {
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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)
|
||||
|
@@ -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
|
||||
@@ -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 {
|
||||
@@ -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,
|
||||
@@ -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(
|
||||
@@ -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
|
||||
}
|
||||
|
@@ -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(
|
||||
|
@@ -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()
|
||||
@@ -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)
|
||||
@@ -58,7 +57,7 @@ class HomeFilteredRoomsController(
|
||||
super.addModels(models)
|
||||
}
|
||||
|
||||
fun submitFiltersData(data: List<HomeRoomFilter>) {
|
||||
fun submitFiltersData(data: List<HomeRoomFilter>?) {
|
||||
this.filtersData = data
|
||||
requestForcedModelBuild()
|
||||
}
|
||||
|
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* 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.layout
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
|
||||
import im.vector.app.databinding.BottomSheetHomeLayoutSettingsBinding
|
||||
import im.vector.app.features.home.room.list.home.HomeLayoutPreferences
|
||||
import javax.inject.Inject
|
||||
|
||||
@AndroidEntryPoint
|
||||
class HomeLayoutSettingBottomDialogFragment : VectorBaseBottomSheetDialogFragment<BottomSheetHomeLayoutSettingsBinding>() {
|
||||
|
||||
@Inject lateinit var preferences: HomeLayoutPreferences
|
||||
|
||||
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetHomeLayoutSettingsBinding {
|
||||
return BottomSheetHomeLayoutSettingsBinding.inflate(inflater, container, false)
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
views.homeLayoutSettingsRecents.isChecked = preferences.areRecentsEnabled()
|
||||
views.homeLayoutSettingsFilters.isChecked = preferences.areFiltersEnabled()
|
||||
|
||||
if (preferences.isAZOrderingEnabled()) {
|
||||
views.homeLayoutSettingsSortName.isChecked = true
|
||||
} else {
|
||||
views.homeLayoutSettingsSortActivity.isChecked = true
|
||||
}
|
||||
|
||||
views.homeLayoutSettingsRecents.setOnCheckedChangeListener { _, isChecked ->
|
||||
preferences.setRecentsEnabled(isChecked)
|
||||
}
|
||||
|
||||
views.homeLayoutSettingsFilters.setOnCheckedChangeListener { _, isChecked ->
|
||||
preferences.setFiltersEnabled(isChecked)
|
||||
}
|
||||
|
||||
views.homeLayoutSettingsSortGroup.setOnCheckedChangeListener { _, checkedId ->
|
||||
preferences.setAZOrderingEnabled(checkedId == R.id.home_layout_settings_sort_name)
|
||||
}
|
||||
|
||||
views.homeLayoutSettingsDone.setOnClickListener {
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
@@ -59,7 +59,13 @@ class RecentRoomCarouselController @Inject constructor(
|
||||
data?.let { data ->
|
||||
carousel {
|
||||
id("recents_carousel")
|
||||
padding(Carousel.Padding(host.hPadding, host.itemSpacing))
|
||||
padding(Carousel.Padding(
|
||||
host.hPadding,
|
||||
0,
|
||||
host.hPadding,
|
||||
0,
|
||||
host.itemSpacing)
|
||||
)
|
||||
withModelsFrom(data) { roomSummary ->
|
||||
val onClick = host.listener?.let { it::onRoomClicked }
|
||||
val onLongClick = host.listener?.let { it::onRoomLongClicked }
|
||||
|
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/rootLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?colorSurface"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
style="@style/Widget.Vector.TextView.Subtitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@string/home_layout_preferences"
|
||||
android:textAllCaps="true" />
|
||||
|
||||
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||
android:id="@+id/home_layout_settings_recents"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="64dp"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:checked="true"
|
||||
android:text="@string/home_layout_preferences_recents" />
|
||||
|
||||
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||
android:id="@+id/home_layout_settings_filters"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="64dp"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:checked="true"
|
||||
android:text="@string/home_layout_preferences_filters" />
|
||||
|
||||
<TextView
|
||||
style="@style/Widget.Vector.TextView.Subtitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:layout_marginVertical="8dp"
|
||||
android:text="@string/home_layout_preferences_sort_by"
|
||||
android:textAllCaps="true" />
|
||||
|
||||
<RadioGroup
|
||||
android:id="@+id/home_layout_settings_sort_group"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/home_layout_settings_sort_activity"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="@string/home_layout_preferences_sort_activity"
|
||||
android:textColor="?vctr_content_primary" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/home_layout_settings_sort_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/home_layout_preferences_sort_name"
|
||||
android:textColor="?vctr_content_primary" />
|
||||
</RadioGroup>
|
||||
|
||||
<Button
|
||||
android:id="@+id/home_layout_settings_done"
|
||||
style="@style/Widget.Vector.Button.Login"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginHorizontal="18dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:text="@string/done" />
|
||||
|
||||
|
||||
</LinearLayout>
|
@@ -3,6 +3,10 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_home_layout_settings"
|
||||
android:title="@string/home_layout_preferences"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_home_invite_friends"
|
||||
android:title="@string/invite_friends"
|
||||
|
@@ -426,6 +426,15 @@
|
||||
|
||||
<!-- Home screen -->
|
||||
<string name="home_filter_placeholder_home">Filter room names</string>
|
||||
<string name="home_layout_preferences">Layout preferences</string>
|
||||
|
||||
|
||||
<!-- Home screen layout settings -->
|
||||
<string name="home_layout_preferences_filters">Show filters</string>
|
||||
<string name="home_layout_preferences_recents">Show recents</string>
|
||||
<string name="home_layout_preferences_sort_by">Sort by</string>
|
||||
<string name="home_layout_preferences_sort_activity">Activity</string>
|
||||
<string name="home_layout_preferences_sort_name">A - Z</string>
|
||||
|
||||
<!-- Home fragment -->
|
||||
<string name="invitations_header">Invites</string>
|
||||
|
Reference in New Issue
Block a user