Adding overflow menu capability in sessions list header view
This commit is contained in:
		
							parent
							
								
									f45cc715d1
								
							
						
					
					
						commit
						1ed92e5215
					
				@ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user