Merge pull request #2207 from vector-im/feature/bma/open_settings
Feature/bma/open settings
This commit is contained in:
commit
74cae47902
|
@ -11,6 +11,9 @@ Improvements 🙌:
|
||||||
- Small optimisation of scrolling experience in timeline (#2114)
|
- Small optimisation of scrolling experience in timeline (#2114)
|
||||||
- Allow user to reset cross signing if he has no way to recover (#2052)
|
- Allow user to reset cross signing if he has no way to recover (#2052)
|
||||||
- Create home shortcut for any room (#1525)
|
- Create home shortcut for any room (#1525)
|
||||||
|
- Add a menu item to open the setting in room list and in room (#2171)
|
||||||
|
- Add a menu item in the timeline as a shortcut to invite user (#2171)
|
||||||
|
- Drawer: move settings access and add sign out action (#2171)
|
||||||
- Filter room member (and banned users) by name (#2184)
|
- Filter room member (and banned users) by name (#2184)
|
||||||
|
|
||||||
Bugfix 🐛:
|
Bugfix 🐛:
|
||||||
|
|
|
@ -305,6 +305,10 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDet
|
||||||
navigator.openRoomsFiltering(this)
|
navigator.openRoomsFiltering(this)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
R.id.menu_home_setting -> {
|
||||||
|
navigator.openSettings(this)
|
||||||
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.onOptionsItemSelected(item)
|
return super.onOptionsItemSelected(item)
|
||||||
|
|
|
@ -18,18 +18,22 @@ package im.vector.app.features.home
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import androidx.core.view.isVisible
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.core.extensions.observeK
|
import im.vector.app.core.extensions.observeK
|
||||||
import im.vector.app.core.extensions.replaceChildFragment
|
import im.vector.app.core.extensions.replaceChildFragment
|
||||||
import im.vector.app.core.platform.VectorBaseFragment
|
import im.vector.app.core.platform.VectorBaseFragment
|
||||||
import im.vector.app.features.grouplist.GroupListFragment
|
import im.vector.app.features.grouplist.GroupListFragment
|
||||||
|
import im.vector.app.features.settings.VectorPreferences
|
||||||
|
import im.vector.app.features.workers.signout.SignOutUiWorker
|
||||||
|
import kotlinx.android.synthetic.main.fragment_home_drawer.*
|
||||||
import org.matrix.android.sdk.api.session.Session
|
import org.matrix.android.sdk.api.session.Session
|
||||||
import org.matrix.android.sdk.api.util.toMatrixItem
|
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||||
import kotlinx.android.synthetic.main.fragment_home_drawer.*
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class HomeDrawerFragment @Inject constructor(
|
class HomeDrawerFragment @Inject constructor(
|
||||||
private val session: Session,
|
private val session: Session,
|
||||||
|
private val vectorPreferences: VectorPreferences,
|
||||||
private val avatarRenderer: AvatarRenderer
|
private val avatarRenderer: AvatarRenderer
|
||||||
) : VectorBaseFragment() {
|
) : VectorBaseFragment() {
|
||||||
|
|
||||||
|
@ -53,12 +57,19 @@ class HomeDrawerFragment @Inject constructor(
|
||||||
homeDrawerUserIdView.text = user.userId
|
homeDrawerUserIdView.text = user.userId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Settings
|
||||||
homeDrawerHeaderSettingsView.debouncedClicks {
|
homeDrawerHeaderSettingsView.debouncedClicks {
|
||||||
sharedActionViewModel.post(HomeActivitySharedAction.CloseDrawer)
|
sharedActionViewModel.post(HomeActivitySharedAction.CloseDrawer)
|
||||||
navigator.openSettings(requireActivity())
|
navigator.openSettings(requireActivity())
|
||||||
}
|
}
|
||||||
|
// Sign out
|
||||||
|
homeDrawerHeaderSignoutView.debouncedClicks {
|
||||||
|
sharedActionViewModel.post(HomeActivitySharedAction.CloseDrawer)
|
||||||
|
SignOutUiWorker(requireActivity()).perform()
|
||||||
|
}
|
||||||
|
|
||||||
// Debug menu
|
// Debug menu
|
||||||
|
homeDrawerHeaderDebugView.isVisible = vectorPreferences.developerMode()
|
||||||
homeDrawerHeaderDebugView.debouncedClicks {
|
homeDrawerHeaderDebugView.debouncedClicks {
|
||||||
sharedActionViewModel.post(HomeActivitySharedAction.CloseDrawer)
|
sharedActionViewModel.post(HomeActivitySharedAction.CloseDrawer)
|
||||||
navigator.openDebug(requireActivity())
|
navigator.openDebug(requireActivity())
|
||||||
|
|
|
@ -655,6 +655,14 @@ class RoomDetailFragment @Inject constructor(
|
||||||
roomDetailViewModel.handle(RoomDetailAction.ClearSendQueue)
|
roomDetailViewModel.handle(RoomDetailAction.ClearSendQueue)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
R.id.invite -> {
|
||||||
|
navigator.openInviteUsersToRoom(requireActivity(), roomDetailArgs.roomId)
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.timeline_setting -> {
|
||||||
|
navigator.openRoomProfile(requireActivity(), roomDetailArgs.roomId)
|
||||||
|
true
|
||||||
|
}
|
||||||
R.id.resend_all -> {
|
R.id.resend_all -> {
|
||||||
roomDetailViewModel.handle(RoomDetailAction.ResendAll)
|
roomDetailViewModel.handle(RoomDetailAction.ResendAll)
|
||||||
true
|
true
|
||||||
|
|
|
@ -180,11 +180,13 @@ class RoomDetailViewModel @AssistedInject constructor(
|
||||||
PowerLevelsObservableFactory(room).createObservable()
|
PowerLevelsObservableFactory(room).createObservable()
|
||||||
.subscribe {
|
.subscribe {
|
||||||
val canSendMessage = PowerLevelsHelper(it).isUserAllowedToSend(session.myUserId, false, EventType.MESSAGE)
|
val canSendMessage = PowerLevelsHelper(it).isUserAllowedToSend(session.myUserId, false, EventType.MESSAGE)
|
||||||
|
val canInvite = PowerLevelsHelper(it).isUserAbleToInvite(session.myUserId)
|
||||||
val isAllowedToManageWidgets = session.widgetService().hasPermissionsToHandleWidgets(room.roomId)
|
val isAllowedToManageWidgets = session.widgetService().hasPermissionsToHandleWidgets(room.roomId)
|
||||||
val isAllowedToStartWebRTCCall = PowerLevelsHelper(it).isUserAllowedToSend(session.myUserId, false, EventType.CALL_INVITE)
|
val isAllowedToStartWebRTCCall = PowerLevelsHelper(it).isUserAllowedToSend(session.myUserId, false, EventType.CALL_INVITE)
|
||||||
setState {
|
setState {
|
||||||
copy(
|
copy(
|
||||||
canSendMessage = canSendMessage,
|
canSendMessage = canSendMessage,
|
||||||
|
canInvite = canInvite,
|
||||||
isAllowedToManageWidgets = isAllowedToManageWidgets,
|
isAllowedToManageWidgets = isAllowedToManageWidgets,
|
||||||
isAllowedToStartWebRTCCall = isAllowedToStartWebRTCCall
|
isAllowedToStartWebRTCCall = isAllowedToStartWebRTCCall
|
||||||
)
|
)
|
||||||
|
@ -538,6 +540,8 @@ class RoomDetailViewModel @AssistedInject constructor(
|
||||||
// For now always disable when not in developer mode, worker cancellation is not working properly
|
// For now always disable when not in developer mode, worker cancellation is not working properly
|
||||||
timeline.pendingEventCount() > 0 && vectorPreferences.developerMode()
|
timeline.pendingEventCount() > 0 && vectorPreferences.developerMode()
|
||||||
R.id.resend_all -> state.asyncRoomSummary()?.hasFailedSending == true
|
R.id.resend_all -> state.asyncRoomSummary()?.hasFailedSending == true
|
||||||
|
R.id.timeline_setting -> true
|
||||||
|
R.id.invite -> state.canInvite
|
||||||
R.id.clear_all -> state.asyncRoomSummary()?.hasFailedSending == true
|
R.id.clear_all -> state.asyncRoomSummary()?.hasFailedSending == true
|
||||||
R.id.open_matrix_apps -> true
|
R.id.open_matrix_apps -> true
|
||||||
R.id.voice_call,
|
R.id.voice_call,
|
||||||
|
|
|
@ -72,6 +72,7 @@ data class RoomDetailViewState(
|
||||||
val canShowJumpToReadMarker: Boolean = true,
|
val canShowJumpToReadMarker: Boolean = true,
|
||||||
val changeMembershipState: ChangeMembershipState = ChangeMembershipState.Unknown,
|
val changeMembershipState: ChangeMembershipState = ChangeMembershipState.Unknown,
|
||||||
val canSendMessage: Boolean = true,
|
val canSendMessage: Boolean = true,
|
||||||
|
val canInvite: Boolean = true,
|
||||||
val isAllowedToManageWidgets: Boolean = false,
|
val isAllowedToManageWidgets: Boolean = false,
|
||||||
val isAllowedToStartWebRTCCall: Boolean = true
|
val isAllowedToStartWebRTCCall: Boolean = true
|
||||||
) : MvRxState {
|
) : MvRxState {
|
||||||
|
|
|
@ -259,8 +259,7 @@ class VectorSettingsGeneralFragment : VectorSettingsBaseFragment() {
|
||||||
findPreference<VectorPreference>("SETTINGS_SIGN_OUT_KEY")!!
|
findPreference<VectorPreference>("SETTINGS_SIGN_OUT_KEY")!!
|
||||||
.onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
.onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||||
activity?.let {
|
activity?.let {
|
||||||
SignOutUiWorker(requireActivity())
|
SignOutUiWorker(requireActivity()).perform()
|
||||||
.perform(requireContext())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
false
|
false
|
||||||
|
|
|
@ -31,7 +31,7 @@ import im.vector.app.R
|
||||||
import im.vector.app.core.extensions.setTextOrHide
|
import im.vector.app.core.extensions.setTextOrHide
|
||||||
import im.vector.app.features.themes.ThemeUtils
|
import im.vector.app.features.themes.ThemeUtils
|
||||||
|
|
||||||
class SignoutBottomSheetActionButton @JvmOverloads constructor(
|
class SignOutBottomSheetActionButton @JvmOverloads constructor(
|
||||||
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
|
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
|
||||||
) : LinearLayout(context, attrs, defStyleAttr) {
|
) : LinearLayout(context, attrs, defStyleAttr) {
|
||||||
|
|
||||||
|
@ -80,11 +80,11 @@ class SignoutBottomSheetActionButton @JvmOverloads constructor(
|
||||||
inflate(context, R.layout.item_signout_action, this)
|
inflate(context, R.layout.item_signout_action, this)
|
||||||
ButterKnife.bind(this)
|
ButterKnife.bind(this)
|
||||||
|
|
||||||
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.SignoutBottomSheetActionButton, 0, 0)
|
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.SignOutBottomSheetActionButton, 0, 0)
|
||||||
title = typedArray.getString(R.styleable.SignoutBottomSheetActionButton_actionTitle) ?: ""
|
title = typedArray.getString(R.styleable.SignOutBottomSheetActionButton_actionTitle) ?: ""
|
||||||
leftIcon = typedArray.getDrawable(R.styleable.SignoutBottomSheetActionButton_leftIcon)
|
leftIcon = typedArray.getDrawable(R.styleable.SignOutBottomSheetActionButton_leftIcon)
|
||||||
tint = typedArray.getColor(R.styleable.SignoutBottomSheetActionButton_iconTint, ThemeUtils.getColor(context, android.R.attr.textColor))
|
tint = typedArray.getColor(R.styleable.SignOutBottomSheetActionButton_iconTint, ThemeUtils.getColor(context, android.R.attr.textColor))
|
||||||
textColor = typedArray.getColor(R.styleable.SignoutBottomSheetActionButton_textColor, ThemeUtils.getColor(context, android.R.attr.textColor))
|
textColor = typedArray.getColor(R.styleable.SignOutBottomSheetActionButton_textColor, ThemeUtils.getColor(context, android.R.attr.textColor))
|
||||||
|
|
||||||
typedArray.recycle()
|
typedArray.recycle()
|
||||||
|
|
|
@ -35,8 +35,6 @@ import com.airbnb.mvrx.fragmentViewModel
|
||||||
import com.airbnb.mvrx.withState
|
import com.airbnb.mvrx.withState
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import org.matrix.android.sdk.api.MatrixCallback
|
|
||||||
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupState
|
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.core.di.ScreenComponent
|
import im.vector.app.core.di.ScreenComponent
|
||||||
import im.vector.app.core.dialogs.ExportKeysDialog
|
import im.vector.app.core.dialogs.ExportKeysDialog
|
||||||
|
@ -45,6 +43,9 @@ import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
|
||||||
import im.vector.app.features.crypto.keysbackup.setup.KeysBackupSetupActivity
|
import im.vector.app.features.crypto.keysbackup.setup.KeysBackupSetupActivity
|
||||||
import im.vector.app.features.crypto.recover.BootstrapBottomSheet
|
import im.vector.app.features.crypto.recover.BootstrapBottomSheet
|
||||||
import im.vector.app.features.crypto.recover.SetupMode
|
import im.vector.app.features.crypto.recover.SetupMode
|
||||||
|
import kotlinx.android.synthetic.main.bottom_sheet_logout_and_backup.*
|
||||||
|
import org.matrix.android.sdk.api.MatrixCallback
|
||||||
|
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupState
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@ -57,21 +58,6 @@ class SignOutBottomSheetDialogFragment : VectorBaseBottomSheetDialogFragment(),
|
||||||
@BindView(R.id.bottom_sheet_signout_backingup_status_group)
|
@BindView(R.id.bottom_sheet_signout_backingup_status_group)
|
||||||
lateinit var backingUpStatusGroup: ViewGroup
|
lateinit var backingUpStatusGroup: ViewGroup
|
||||||
|
|
||||||
@BindView(R.id.setupRecoveryButton)
|
|
||||||
lateinit var setupRecoveryButton: SignoutBottomSheetActionButton
|
|
||||||
|
|
||||||
@BindView(R.id.setupMegolmBackupButton)
|
|
||||||
lateinit var setupMegolmBackupButton: SignoutBottomSheetActionButton
|
|
||||||
|
|
||||||
@BindView(R.id.exportManuallyButton)
|
|
||||||
lateinit var exportManuallyButton: SignoutBottomSheetActionButton
|
|
||||||
|
|
||||||
@BindView(R.id.exitAnywayButton)
|
|
||||||
lateinit var exitAnywayButton: SignoutBottomSheetActionButton
|
|
||||||
|
|
||||||
@BindView(R.id.signOutButton)
|
|
||||||
lateinit var signOutButton: SignoutBottomSheetActionButton
|
|
||||||
|
|
||||||
@BindView(R.id.bottom_sheet_signout_icon_progress_bar)
|
@BindView(R.id.bottom_sheet_signout_icon_progress_bar)
|
||||||
lateinit var backupProgress: ProgressBar
|
lateinit var backupProgress: ProgressBar
|
||||||
|
|
||||||
|
@ -138,6 +124,10 @@ class SignOutBottomSheetDialogFragment : VectorBaseBottomSheetDialogFragment(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signOutButton.action = {
|
||||||
|
onSignOut?.run()
|
||||||
|
}
|
||||||
|
|
||||||
exportManuallyButton.action = {
|
exportManuallyButton.action = {
|
||||||
withState(viewModel) { state ->
|
withState(viewModel) { state ->
|
||||||
queryExportKeys(state.userId, QUERY_EXPORT_KEYS)
|
queryExportKeys(state.userId, QUERY_EXPORT_KEYS)
|
||||||
|
@ -182,10 +172,10 @@ class SignOutBottomSheetDialogFragment : VectorBaseBottomSheetDialogFragment(),
|
||||||
// we should show option to setup 4S
|
// we should show option to setup 4S
|
||||||
setupRecoveryButton.isVisible = true
|
setupRecoveryButton.isVisible = true
|
||||||
setupMegolmBackupButton.isVisible = false
|
setupMegolmBackupButton.isVisible = false
|
||||||
signOutButton.isVisible = false
|
|
||||||
// We let the option to ignore and quit
|
// We let the option to ignore and quit
|
||||||
exportManuallyButton.isVisible = true
|
exportManuallyButton.isVisible = true
|
||||||
exitAnywayButton.isVisible = true
|
exitAnywayButton.isVisible = true
|
||||||
|
signOutButton.isVisible = false
|
||||||
} else if (state.keysBackupState == KeysBackupState.Unknown || state.keysBackupState == KeysBackupState.Disabled) {
|
} else if (state.keysBackupState == KeysBackupState.Unknown || state.keysBackupState == KeysBackupState.Disabled) {
|
||||||
sheetTitle.text = getString(R.string.sign_out_bottom_sheet_warning_no_backup)
|
sheetTitle.text = getString(R.string.sign_out_bottom_sheet_warning_no_backup)
|
||||||
backingUpStatusGroup.isVisible = false
|
backingUpStatusGroup.isVisible = false
|
||||||
|
@ -194,10 +184,10 @@ class SignOutBottomSheetDialogFragment : VectorBaseBottomSheetDialogFragment(),
|
||||||
// we should show option to setup 4S
|
// we should show option to setup 4S
|
||||||
setupRecoveryButton.isVisible = false
|
setupRecoveryButton.isVisible = false
|
||||||
setupMegolmBackupButton.isVisible = true
|
setupMegolmBackupButton.isVisible = true
|
||||||
signOutButton.isVisible = false
|
|
||||||
// We let the option to ignore and quit
|
// We let the option to ignore and quit
|
||||||
exportManuallyButton.isVisible = true
|
exportManuallyButton.isVisible = true
|
||||||
exitAnywayButton.isVisible = true
|
exitAnywayButton.isVisible = true
|
||||||
|
signOutButton.isVisible = false
|
||||||
} else {
|
} else {
|
||||||
// so keybackup is setup
|
// so keybackup is setup
|
||||||
// You should wait until all are uploaded
|
// You should wait until all are uploaded
|
||||||
|
@ -213,11 +203,12 @@ class SignOutBottomSheetDialogFragment : VectorBaseBottomSheetDialogFragment(),
|
||||||
backupCompleteImage.isVisible = true
|
backupCompleteImage.isVisible = true
|
||||||
backupStatusTex.text = getString(R.string.keys_backup_info_keys_all_backup_up)
|
backupStatusTex.text = getString(R.string.keys_backup_info_keys_all_backup_up)
|
||||||
|
|
||||||
hideViews(setupMegolmBackupButton, exportManuallyButton, exitAnywayButton)
|
setupMegolmBackupButton.isVisible = false
|
||||||
|
exportManuallyButton.isVisible = false
|
||||||
|
exitAnywayButton.isVisible = false
|
||||||
// You can signout
|
// You can signout
|
||||||
signOutButton.isVisible = true
|
signOutButton.isVisible = true
|
||||||
}
|
}
|
||||||
|
|
||||||
KeysBackupState.WillBackUp,
|
KeysBackupState.WillBackUp,
|
||||||
KeysBackupState.BackingUp -> {
|
KeysBackupState.BackingUp -> {
|
||||||
sheetTitle.text = getString(R.string.sign_out_bottom_sheet_warning_backing_up)
|
sheetTitle.text = getString(R.string.sign_out_bottom_sheet_warning_backing_up)
|
||||||
|
@ -228,18 +219,21 @@ class SignOutBottomSheetDialogFragment : VectorBaseBottomSheetDialogFragment(),
|
||||||
backupCompleteImage.isVisible = false
|
backupCompleteImage.isVisible = false
|
||||||
backupStatusTex.text = getString(R.string.sign_out_bottom_sheet_backing_up_keys)
|
backupStatusTex.text = getString(R.string.sign_out_bottom_sheet_backing_up_keys)
|
||||||
|
|
||||||
hideViews(setupMegolmBackupButton, setupMegolmBackupButton, signOutButton, exportManuallyButton)
|
setupMegolmBackupButton.isVisible = false
|
||||||
|
exportManuallyButton.isVisible = false
|
||||||
exitAnywayButton.isVisible = true
|
exitAnywayButton.isVisible = true
|
||||||
|
signOutButton.isVisible = false
|
||||||
}
|
}
|
||||||
KeysBackupState.NotTrusted -> {
|
KeysBackupState.NotTrusted -> {
|
||||||
sheetTitle.text = getString(R.string.sign_out_bottom_sheet_warning_backup_not_active)
|
sheetTitle.text = getString(R.string.sign_out_bottom_sheet_warning_backup_not_active)
|
||||||
// It's not trusted and we know there are unsaved keys..
|
// It's not trusted and we know there are unsaved keys..
|
||||||
backingUpStatusGroup.isVisible = false
|
backingUpStatusGroup.isVisible = false
|
||||||
|
|
||||||
exportManuallyButton.isVisible = true
|
|
||||||
// option to enter pass/key
|
// option to enter pass/key
|
||||||
setupMegolmBackupButton.isVisible = true
|
setupMegolmBackupButton.isVisible = true
|
||||||
|
exportManuallyButton.isVisible = true
|
||||||
exitAnywayButton.isVisible = true
|
exitAnywayButton.isVisible = true
|
||||||
|
signOutButton.isVisible = false
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
// mmm.. strange state
|
// mmm.. strange state
|
||||||
|
@ -253,21 +247,23 @@ class SignOutBottomSheetDialogFragment : VectorBaseBottomSheetDialogFragment(),
|
||||||
when (state.hasBeenExportedToFile) {
|
when (state.hasBeenExportedToFile) {
|
||||||
is Loading -> {
|
is Loading -> {
|
||||||
signoutExportingLoading.isVisible = true
|
signoutExportingLoading.isVisible = true
|
||||||
hideViews(setupRecoveryButton,
|
backingUpStatusGroup.isVisible = false
|
||||||
setupMegolmBackupButton,
|
|
||||||
exportManuallyButton,
|
setupRecoveryButton.isVisible = false
|
||||||
backingUpStatusGroup,
|
setupMegolmBackupButton.isVisible = false
|
||||||
signOutButton)
|
exportManuallyButton.isVisible = false
|
||||||
exitAnywayButton.isVisible = true
|
exitAnywayButton.isVisible = true
|
||||||
|
signOutButton.isVisible = false
|
||||||
}
|
}
|
||||||
is Success -> {
|
is Success -> {
|
||||||
if (state.hasBeenExportedToFile.invoke()) {
|
if (state.hasBeenExportedToFile.invoke()) {
|
||||||
sheetTitle.text = getString(R.string.action_sign_out_confirmation_simple)
|
sheetTitle.text = getString(R.string.action_sign_out_confirmation_simple)
|
||||||
hideViews(setupRecoveryButton,
|
backingUpStatusGroup.isVisible = false
|
||||||
setupMegolmBackupButton,
|
|
||||||
exportManuallyButton,
|
setupRecoveryButton.isVisible = false
|
||||||
backingUpStatusGroup,
|
setupMegolmBackupButton.isVisible = false
|
||||||
exitAnywayButton)
|
exportManuallyButton.isVisible = false
|
||||||
|
exitAnywayButton.isVisible = false
|
||||||
signOutButton.isVisible = true
|
signOutButton.isVisible = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -315,8 +311,4 @@ class SignOutBottomSheetDialogFragment : VectorBaseBottomSheetDialogFragment(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun hideViews(vararg views: View) {
|
|
||||||
views.forEach { it.isVisible = false }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,11 +16,9 @@
|
||||||
|
|
||||||
package im.vector.app.features.workers.signout
|
package im.vector.app.features.workers.signout
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.core.di.ActiveSessionHolder
|
|
||||||
import im.vector.app.core.extensions.cannotLogoutSafely
|
import im.vector.app.core.extensions.cannotLogoutSafely
|
||||||
import im.vector.app.core.extensions.vectorComponent
|
import im.vector.app.core.extensions.vectorComponent
|
||||||
import im.vector.app.features.MainActivity
|
import im.vector.app.features.MainActivity
|
||||||
|
@ -28,11 +26,8 @@ import im.vector.app.features.MainActivityArgs
|
||||||
|
|
||||||
class SignOutUiWorker(private val activity: FragmentActivity) {
|
class SignOutUiWorker(private val activity: FragmentActivity) {
|
||||||
|
|
||||||
lateinit var activeSessionHolder: ActiveSessionHolder
|
fun perform() {
|
||||||
|
val session = activity.vectorComponent().activeSessionHolder().getSafeActiveSession() ?: return
|
||||||
fun perform(context: Context) {
|
|
||||||
activeSessionHolder = context.vectorComponent().activeSessionHolder()
|
|
||||||
val session = activeSessionHolder.getActiveSession()
|
|
||||||
if (session.cannotLogoutSafely()) {
|
if (session.cannotLogoutSafely()) {
|
||||||
// The backup check on logout flow has to be displayed if there are keys in the store, and the keys backup state is not Ready
|
// The backup check on logout flow has to be displayed if there are keys in the store, and the keys backup state is not Ready
|
||||||
val signOutDialog = SignOutBottomSheetDialogFragment.newInstance()
|
val signOutDialog = SignOutBottomSheetDialogFragment.newInstance()
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="18dp"
|
||||||
|
android:height="18dp"
|
||||||
|
android:viewportWidth="18"
|
||||||
|
android:viewportHeight="18">
|
||||||
|
<path
|
||||||
|
android:pathData="M14.89,6.83C15.05,7.25 15.46,7.53 15.91,7.53C16.51,7.53 17,8.02 17,8.62V9.38C17,9.98 16.51,10.47 15.91,10.47C15.46,10.47 15.05,10.75 14.89,11.17C14.8768,11.2031 14.8635,11.2366 14.8502,11.2704C14.8031,11.3901 14.7546,11.5131 14.7,11.63C14.51,12.04 14.6,12.52 14.92,12.84C15.35,13.26 15.35,13.95 14.92,14.38L14.38,14.92C13.96,15.35 13.27,15.35 12.84,14.92C12.53,14.6 12.04,14.51 11.63,14.7C11.48,14.77 11.33,14.83 11.17,14.89C10.75,15.05 10.47,15.46 10.47,15.91C10.47,16.51 9.98,17 9.38,17H8.62C8.02,17 7.53,16.51 7.53,15.91C7.53,15.46 7.25,15.05 6.83,14.89C6.7969,14.8768 6.7634,14.8635 6.7296,14.8502C6.61,14.8031 6.4869,14.7546 6.37,14.7C5.96,14.51 5.48,14.6 5.16,14.92C4.74,15.35 4.05,15.35 3.62,14.92L3.08,14.38C2.65,13.96 2.65,13.27 3.08,12.84C3.4,12.53 3.49,12.04 3.3,11.63C3.23,11.48 3.17,11.33 3.11,11.17C2.95,10.75 2.54,10.47 2.09,10.47C1.49,10.47 1,9.98 1,9.38V8.62C1,8.02 1.49,7.53 2.09,7.53C2.54,7.53 2.95,7.25 3.11,6.83C3.1416,6.729 3.1811,6.632 3.221,6.534C3.2444,6.4767 3.2679,6.419 3.29,6.36C3.48,5.95 3.39,5.47 3.07,5.15C2.64,4.73 2.64,4.04 3.07,3.61L3.62,3.08C4.04,2.65 4.73,2.65 5.16,3.08C5.47,3.4 5.96,3.49 6.37,3.3C6.52,3.23 6.67,3.16 6.83,3.11C7.25,2.95 7.53,2.54 7.53,2.09C7.53,1.49 8.02,1 8.62,1H9.38C9.98,1 10.47,1.49 10.47,2.09C10.47,2.55 10.75,2.95 11.17,3.11C11.2031,3.1232 11.2366,3.1365 11.2704,3.1498C11.3901,3.1969 11.5131,3.2454 11.63,3.3C12.04,3.49 12.52,3.4 12.84,3.08C13.26,2.65 13.95,2.65 14.38,3.08L14.92,3.62C15.35,4.04 15.35,4.73 14.92,5.16C14.6,5.47 14.51,5.96 14.7,6.37C14.77,6.52 14.83,6.67 14.89,6.83ZM9,13C6.79,13 5,11.21 5,9C5,6.79 6.79,5 9,5C11.21,5 13,6.79 13,9C13,11.21 11.21,13 9,13Z"
|
||||||
|
android:fillColor="#000000"
|
||||||
|
android:fillType="evenOdd"/>
|
||||||
|
</vector>
|
|
@ -0,0 +1,18 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="18dp"
|
||||||
|
android:height="18dp"
|
||||||
|
android:viewportWidth="18"
|
||||||
|
android:viewportHeight="18">
|
||||||
|
<path
|
||||||
|
android:pathData="M9,2L14.8586,1.1631C15.461,1.077 16,1.5445 16,2.153V15.847C16,16.4555 15.461,16.923 14.8586,16.8369L9,16V2Z"
|
||||||
|
android:fillColor="#000000"/>
|
||||||
|
<group>
|
||||||
|
<clip-path
|
||||||
|
android:pathData="M3,2L10,2A1,1 0,0 1,11 3L11,15A1,1 0,0 1,10 16L3,16A1,1 0,0 1,2 15L2,3A1,1 0,0 1,3 2z"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M3,2L10,2A1,1 0,0 1,11 3L11,15A1,1 0,0 1,10 16L3,16A1,1 0,0 1,2 15L2,3A1,1 0,0 1,3 2z"
|
||||||
|
android:strokeWidth="3"
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:strokeColor="#000000"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
|
@ -81,7 +81,7 @@
|
||||||
android:layout_height="wrap_content" />
|
android:layout_height="wrap_content" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<im.vector.app.features.workers.signout.SignoutBottomSheetActionButton
|
<im.vector.app.features.workers.signout.SignOutBottomSheetActionButton
|
||||||
android:id="@+id/setupRecoveryButton"
|
android:id="@+id/setupRecoveryButton"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -91,7 +91,7 @@
|
||||||
app:textColor="?riotx_text_secondary" />
|
app:textColor="?riotx_text_secondary" />
|
||||||
|
|
||||||
|
|
||||||
<im.vector.app.features.workers.signout.SignoutBottomSheetActionButton
|
<im.vector.app.features.workers.signout.SignOutBottomSheetActionButton
|
||||||
android:id="@+id/setupMegolmBackupButton"
|
android:id="@+id/setupMegolmBackupButton"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -100,7 +100,7 @@
|
||||||
app:leftIcon="@drawable/backup_keys"
|
app:leftIcon="@drawable/backup_keys"
|
||||||
app:textColor="?riotx_text_secondary" />
|
app:textColor="?riotx_text_secondary" />
|
||||||
|
|
||||||
<im.vector.app.features.workers.signout.SignoutBottomSheetActionButton
|
<im.vector.app.features.workers.signout.SignOutBottomSheetActionButton
|
||||||
android:id="@+id/exportManuallyButton"
|
android:id="@+id/exportManuallyButton"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -109,7 +109,7 @@
|
||||||
app:leftIcon="@drawable/ic_download"
|
app:leftIcon="@drawable/ic_download"
|
||||||
app:textColor="?riotx_text_secondary" />
|
app:textColor="?riotx_text_secondary" />
|
||||||
|
|
||||||
<im.vector.app.features.workers.signout.SignoutBottomSheetActionButton
|
<im.vector.app.features.workers.signout.SignOutBottomSheetActionButton
|
||||||
android:id="@+id/exitAnywayButton"
|
android:id="@+id/exitAnywayButton"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -118,7 +118,7 @@
|
||||||
app:leftIcon="@drawable/ic_material_leave"
|
app:leftIcon="@drawable/ic_material_leave"
|
||||||
app:textColor="@color/riotx_destructive_accent" />
|
app:textColor="@color/riotx_destructive_accent" />
|
||||||
|
|
||||||
<im.vector.app.features.workers.signout.SignoutBottomSheetActionButton
|
<im.vector.app.features.workers.signout.SignOutBottomSheetActionButton
|
||||||
android:id="@+id/signOutButton"
|
android:id="@+id/signOutButton"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:background="?riotx_background"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:focusable="true">
|
android:focusable="true">
|
||||||
|
|
||||||
|
@ -42,11 +43,12 @@
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="24dp"
|
android:layout_marginTop="24dp"
|
||||||
|
android:layout_marginEnd="@dimen/layout_horizontal_margin"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:textColor="?riotx_text_primary"
|
android:textColor="?riotx_text_primary"
|
||||||
android:textSize="15sp"
|
android:textSize="15sp"
|
||||||
app:layout_constraintEnd_toStartOf="@id/homeDrawerHeaderSettingsView"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="@+id/homeDrawerHeaderAvatarView"
|
app:layout_constraintStart_toStartOf="@+id/homeDrawerHeaderAvatarView"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/homeDrawerHeaderAvatarView"
|
app:layout_constraintTop_toBottomOf="@+id/homeDrawerHeaderAvatarView"
|
||||||
tools:text="@sample/matrix.json/data/displayName" />
|
tools:text="@sample/matrix.json/data/displayName" />
|
||||||
|
@ -55,39 +57,71 @@
|
||||||
android:id="@+id/homeDrawerUserIdView"
|
android:id="@+id/homeDrawerUserIdView"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="@dimen/layout_horizontal_margin"
|
||||||
android:layout_marginBottom="17dp"
|
android:layout_marginBottom="17dp"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:textColor="?riotx_text_secondary"
|
android:textColor="?riotx_text_secondary"
|
||||||
android:textSize="15sp"
|
android:textSize="15sp"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toStartOf="@id/homeDrawerHeaderSettingsView"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="@+id/homeDrawerHeaderAvatarView"
|
app:layout_constraintStart_toStartOf="@+id/homeDrawerHeaderAvatarView"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/homeDrawerUsernameView"
|
app:layout_constraintTop_toBottomOf="@+id/homeDrawerUsernameView"
|
||||||
tools:text="@sample/matrix.json/data/mxid" />
|
tools:text="@sample/matrix.json/data/mxid" />
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/homeDrawerHeaderSettingsView"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:background="?attr/selectableItemBackground"
|
|
||||||
android:contentDescription="@string/room_sliding_menu_settings"
|
|
||||||
android:padding="16dp"
|
|
||||||
android:src="@drawable/ic_settings_x"
|
|
||||||
android:tint="?riotx_text_secondary"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
<androidx.fragment.app.FragmentContainerView
|
<androidx.fragment.app.FragmentContainerView
|
||||||
android:id="@+id/homeDrawerGroupListContainer"
|
android:id="@+id/homeDrawerGroupListContainer"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:background="?riotx_background"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/homeDrawerBottomSeparator"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/homeDrawerHeader" />
|
app:layout_constraintTop_toBottomOf="@+id/homeDrawerHeader" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/homeDrawerBottomSeparator"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:background="?attr/vctr_list_divider_color"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/homeDrawerHeaderSettingsView" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/homeDrawerHeaderSettingsView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:drawablePadding="9dp"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:minWidth="120dp"
|
||||||
|
android:minHeight="52dp"
|
||||||
|
android:padding="16dp"
|
||||||
|
android:text="@string/settings"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:tint="?riotx_android_secondary"
|
||||||
|
app:drawableStartCompat="@drawable/ic_settings_18dp"
|
||||||
|
app:drawableTint="?riotx_android_secondary"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/homeDrawerHeaderSignoutView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:drawablePadding="9dp"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:minWidth="120dp"
|
||||||
|
android:minHeight="52dp"
|
||||||
|
android:padding="16dp"
|
||||||
|
android:text="@string/logout"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:tint="?riotx_android_secondary"
|
||||||
|
app:drawableStartCompat="@drawable/ic_signout_18dp"
|
||||||
|
app:drawableTint="?riotx_android_secondary"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -2,6 +2,12 @@
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/menu_home_setting"
|
||||||
|
android:icon="@drawable/ic_settings_x"
|
||||||
|
android:title="@string/settings"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_home_suggestion"
|
android:id="@+id/menu_home_suggestion"
|
||||||
android:icon="@drawable/ic_material_bug_report"
|
android:icon="@drawable/ic_material_bug_report"
|
||||||
|
@ -15,8 +21,8 @@
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_home_filter"
|
android:id="@+id/menu_home_filter"
|
||||||
android:icon="@drawable/ic_search"
|
android:icon="@drawable/ic_search"
|
||||||
app:iconTint="?riotx_text_secondary"
|
|
||||||
android:title="@string/home_filter_placeholder_home"
|
android:title="@string/home_filter_placeholder_home"
|
||||||
|
app:iconTint="?riotx_text_secondary"
|
||||||
app:showAsAction="always" />
|
app:showAsAction="always" />
|
||||||
|
|
||||||
</menu>
|
</menu>
|
|
@ -3,11 +3,22 @@
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/timeline_setting"
|
||||||
|
android:icon="@drawable/ic_settings_x"
|
||||||
|
android:title="@string/settings"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/search"
|
android:id="@+id/search"
|
||||||
android:title="@string/search"
|
android:title="@string/search"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/invite"
|
||||||
|
android:title="@string/invite"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/video_call"
|
android:id="@+id/video_call"
|
||||||
android:icon="@drawable/ic_video"
|
android:icon="@drawable/ic_video"
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
<attr name="forceStartPadding" format="boolean" />
|
<attr name="forceStartPadding" format="boolean" />
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
<declare-styleable name="SignoutBottomSheetActionButton">
|
<declare-styleable name="SignOutBottomSheetActionButton">
|
||||||
<attr name="iconTint" format="color" />
|
<attr name="iconTint" format="color" />
|
||||||
<attr name="actionTitle"/>
|
<attr name="actionTitle"/>
|
||||||
<attr name="leftIcon" />
|
<attr name="leftIcon" />
|
||||||
|
|
Loading…
Reference in New Issue