mirror of
https://github.com/element-hq/element-android
synced 2024-11-23 18:05:36 +03:00
Adding overflow menu capability in sessions list header view
This commit is contained in:
parent
f45cc715d1
commit
1ed92e5215
8 changed files with 79 additions and 9 deletions
|
@ -5,6 +5,7 @@
|
|||
<attr name="sessionsListHeaderTitle" format="string" />
|
||||
<attr name="sessionsListHeaderDescription" format="string" />
|
||||
<attr name="sessionsListHeaderHasLearnMoreLink" format="boolean" />
|
||||
<attr name="sessionsListHeaderMenu" format="reference" />
|
||||
</declare-styleable>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* 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.core.extensions
|
||||
|
||||
import android.view.MenuItem
|
||||
import androidx.annotation.ColorInt
|
||||
import androidx.core.text.toSpannable
|
||||
import im.vector.app.core.utils.colorizeMatchingText
|
||||
|
||||
fun MenuItem.setTextColor(@ColorInt color: Int) {
|
||||
val currentTitle = title.orEmpty().toString()
|
||||
title = currentTitle
|
||||
.toSpannable()
|
||||
.colorizeMatchingText(currentTitle, color)
|
||||
}
|
|
@ -30,6 +30,7 @@ import dagger.hilt.android.AndroidEntryPoint
|
|||
import im.vector.app.R
|
||||
import im.vector.app.core.date.VectorDateFormatter
|
||||
import im.vector.app.core.dialogs.ManuallyVerifyDialog
|
||||
import im.vector.app.core.extensions.setTextColor
|
||||
import im.vector.app.core.platform.VectorBaseFragment
|
||||
import im.vector.app.core.resources.ColorProvider
|
||||
import im.vector.app.core.resources.DrawableProvider
|
||||
|
@ -91,6 +92,7 @@ class VectorSettingsDevicesFragment :
|
|||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
initWaitingView()
|
||||
initOtherSessionsHeaderView()
|
||||
initOtherSessionsView()
|
||||
initSecurityRecommendationsView()
|
||||
initQrLoginView()
|
||||
|
@ -131,6 +133,11 @@ class VectorSettingsDevicesFragment :
|
|||
views.waitingView.waitingStatusText.isVisible = true
|
||||
}
|
||||
|
||||
private fun initOtherSessionsHeaderView() {
|
||||
val color = colorProvider.getColorFromAttribute(R.attr.colorError)
|
||||
views.deviceListHeaderOtherSessions.menu.findItem(R.id.otherSessionsHeaderMultiSignout).setTextColor(color)
|
||||
}
|
||||
|
||||
private fun initOtherSessionsView() {
|
||||
views.deviceListOtherSessions.callback = this
|
||||
}
|
||||
|
|
|
@ -20,6 +20,9 @@ import android.content.Context
|
|||
import android.content.res.TypedArray
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.view.Menu
|
||||
import android.view.MenuInflater
|
||||
import androidx.appcompat.view.menu.MenuBuilder
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.core.content.res.use
|
||||
import androidx.core.view.isVisible
|
||||
|
@ -39,6 +42,7 @@ class SessionsListHeaderView @JvmOverloads constructor(
|
|||
this
|
||||
)
|
||||
|
||||
val menu: Menu = binding.sessionsListHeaderMenu.menu
|
||||
var onLearnMoreClickListener: (() -> Unit)? = null
|
||||
|
||||
init {
|
||||
|
@ -50,6 +54,7 @@ class SessionsListHeaderView @JvmOverloads constructor(
|
|||
).use {
|
||||
setTitle(it)
|
||||
setDescription(it)
|
||||
setMenu(it)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -90,4 +95,15 @@ class SessionsListHeaderView @JvmOverloads constructor(
|
|||
onLearnMoreClickListener?.invoke()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setMenu(typedArray: TypedArray) {
|
||||
val menuResId = typedArray.getResourceId(R.styleable.SessionsListHeaderView_sessionsListHeaderMenu, -1)
|
||||
if (menuResId == -1) {
|
||||
binding.sessionsListHeaderMenu.isVisible = false
|
||||
} else {
|
||||
binding.sessionsListHeaderMenu.showOverflowMenu()
|
||||
val menuBuilder = binding.sessionsListHeaderMenu.menu as? MenuBuilder
|
||||
menuBuilder?.let { MenuInflater(context).inflate(menuResId, it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@ import android.view.ViewGroup
|
|||
import androidx.activity.OnBackPressedCallback
|
||||
import androidx.activity.addCallback
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.core.text.toSpannable
|
||||
import androidx.core.view.isVisible
|
||||
import com.airbnb.mvrx.Success
|
||||
import com.airbnb.mvrx.args
|
||||
|
@ -33,14 +32,13 @@ import com.airbnb.mvrx.fragmentViewModel
|
|||
import com.airbnb.mvrx.withState
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.extensions.orEmpty
|
||||
import im.vector.app.core.extensions.setTextColor
|
||||
import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
|
||||
import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment.ResultListener.Companion.RESULT_OK
|
||||
import im.vector.app.core.platform.VectorBaseFragment
|
||||
import im.vector.app.core.platform.VectorMenuProvider
|
||||
import im.vector.app.core.resources.ColorProvider
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.core.utils.colorizeMatchingText
|
||||
import im.vector.app.databinding.FragmentOtherSessionsBinding
|
||||
import im.vector.app.features.settings.devices.v2.DeviceFullInfo
|
||||
import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterBottomSheet
|
||||
|
@ -94,10 +92,7 @@ class OtherSessionsFragment :
|
|||
|
||||
private fun changeTextColorOfDestructiveAction(menuItem: MenuItem) {
|
||||
val titleColor = colorProvider.getColorFromAttribute(R.attr.colorError)
|
||||
val currentTitle = menuItem.title.orEmpty().toString()
|
||||
menuItem.title = currentTitle
|
||||
.toSpannable()
|
||||
.colorizeMatchingText(currentTitle, titleColor)
|
||||
menuItem.setTextColor(titleColor)
|
||||
}
|
||||
|
||||
override fun handleMenuItemSelected(item: MenuItem): Boolean {
|
||||
|
|
|
@ -98,6 +98,7 @@
|
|||
app:layout_constraintTop_toBottomOf="@id/deviceListDividerCurrentSession"
|
||||
app:sessionsListHeaderDescription="@string/device_manager_sessions_other_description"
|
||||
app:sessionsListHeaderHasLearnMoreLink="false"
|
||||
app:sessionsListHeaderMenu="@menu/menu_other_sessions_header"
|
||||
app:sessionsListHeaderTitle="@string/device_manager_sessions_other_title" />
|
||||
|
||||
<im.vector.app.features.settings.devices.v2.list.OtherSessionsView
|
||||
|
@ -117,8 +118,8 @@
|
|||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/deviceListOtherSessions"
|
||||
app:sessionsListHeaderHasLearnMoreLink="false"
|
||||
app:sessionsListHeaderDescription="@string/device_manager_sessions_sign_in_with_qr_code_description"
|
||||
app:sessionsListHeaderHasLearnMoreLink="false"
|
||||
app:sessionsListHeaderTitle="@string/device_manager_sessions_sign_in_with_qr_code_title"
|
||||
tools:visibility="visible" />
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/layout_horizontal_margin"
|
||||
android:layout_marginTop="20dp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/sessionsListHeaderMenu"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="Other sessions" />
|
||||
|
@ -29,4 +29,13 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/sessions_list_header_title"
|
||||
tools:text="For best security, verify your sessions and sign out from any session that you don’t recognize or use anymore. Learn More." />
|
||||
|
||||
<androidx.appcompat.widget.ActionMenuView
|
||||
android:id="@+id/sessionsListHeaderMenu"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="8dp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/sessions_list_header_title"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/sessions_list_header_title" />
|
||||
</merge>
|
||||
|
|
12
vector/src/main/res/menu/menu_other_sessions_header.xml
Normal file
12
vector/src/main/res/menu/menu_other_sessions_header.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:ignore="AlwaysShowAction">
|
||||
|
||||
<item
|
||||
android:id="@+id/otherSessionsHeaderMultiSignout"
|
||||
android:title="@string/device_manager_other_sessions_multi_signout_all"
|
||||
app:showAsAction="withText|never" />
|
||||
|
||||
</menu>
|
Loading…
Reference in a new issue