Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 97b53fb6 authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #5498 from ByteHamster/drawer-buttons

Button bar in navigation drawer
parents 766cf838 96b7ca26
Loading
Loading
Loading
Loading
+59 −47
Original line number Diff line number Diff line
package com.fsck.k9.ui

import android.annotation.SuppressLint
import android.content.Context
import android.content.res.ColorStateList
import android.content.res.Resources
@@ -7,8 +8,10 @@ import android.graphics.PorterDuff
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Bundle
import android.util.TypedValue
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.Toast
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
@@ -44,12 +47,10 @@ import com.mikepenz.materialdrawer.model.interfaces.selectedColorInt
import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader
import com.mikepenz.materialdrawer.util.DrawerImageLoader
import com.mikepenz.materialdrawer.util.addItems
import com.mikepenz.materialdrawer.util.addStickyFooterItem
import com.mikepenz.materialdrawer.util.getDrawerItem
import com.mikepenz.materialdrawer.util.removeAllItems
import com.mikepenz.materialdrawer.widget.AccountHeaderView
import com.mikepenz.materialdrawer.widget.MaterialDrawerSliderView
import java.util.ArrayList
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
@@ -69,6 +70,12 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K
    private val messagingController: MessagingController by inject()
    private val accountImageLoader: AccountImageLoader by inject()

    private val buttonRow: LinearLayout = parent.findViewById(R.id.material_drawer_button_row)
    private val buttonSettings: ImageView = parent.findViewById(R.id.drawer_button_settings)
    private val buttonManageFolders: ImageView = parent.findViewById(R.id.drawer_button_manage_folders)
    private val buttonRefreshAll: ImageView = parent.findViewById(R.id.drawer_button_refresh_all)
    private val buttonRefreshAccount: ImageView = parent.findViewById(R.id.drawer_button_refresh_account)

    private val drawer: DrawerLayout = parent.findViewById(R.id.drawerLayout)
    private val sliderView: MaterialDrawerSliderView = parent.findViewById(R.id.material_drawer_slider)
    private val headerView: AccountHeaderView = AccountHeaderView(parent).apply {
@@ -99,6 +106,7 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K

        initializeImageLoader()
        configureAccountHeader()
        configureButtonBar()

        drawer.addDrawerListener(parent.createDrawerListener())
        sliderView.tintStatusBar = true
@@ -125,8 +133,6 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K
            }
        }

        addFooterItems()

        accountsViewModel.displayAccountsLiveData.observeNotNull(parent) { accounts ->
            setAccounts(accounts)
        }
@@ -162,6 +168,7 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K
            openedAccountUuid = account.uuid
            val eventHandled = !parent.openRealAccount(account)
            updateUserAccountsAndFolders(account)
            updateButtonBarVisibility(false)

            eventHandled
        }
@@ -209,6 +216,36 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K
        return if (unreadCount > 0) unreadCount.toString() else null
    }

    private fun updateButtonBarVisibility(showsAccounts: Boolean) {
        buttonManageFolders.visibility = if (showsAccounts) View.GONE else View.VISIBLE
        buttonRefreshAccount.visibility = if (showsAccounts) View.GONE else View.VISIBLE
        buttonRefreshAll.visibility = if (showsAccounts) View.VISIBLE else View.GONE
    }

    @SuppressLint("ClickableViewAccessibility")
    private fun configureButtonBar() {
        headerView.onAccountHeaderSelectionViewClickListener = { view, profile ->
            updateButtonBarVisibility(!headerView.selectionListShown)
            false
        }
        updateButtonBarVisibility(headerView.selectionListShown)

        buttonRow.setOnTouchListener { _, _ -> true } // To avoid touch going through
        buttonSettings.setOnClickListener { SettingsActivity.launch(parent) }
        buttonManageFolders.setOnClickListener { parent.launchManageFoldersScreen() }
        buttonRefreshAccount.setOnClickListener { refreshAndShowProgress(headerView.activeProfile?.tag as Account) }
        buttonRefreshAll.setOnClickListener { refreshAndShowProgress(null) }

        val showContentDescription = View.OnLongClickListener { v ->
            Toast.makeText(parent, v.contentDescription, Toast.LENGTH_SHORT).show()
            true
        }
        buttonSettings.setOnLongClickListener(showContentDescription)
        buttonManageFolders.setOnLongClickListener(showContentDescription)
        buttonRefreshAccount.setOnLongClickListener(showContentDescription)
        buttonRefreshAll.setOnLongClickListener(showContentDescription)
    }

    private fun setAccounts(displayAccounts: List<DisplayAccount>) {
        val oldSelectedBackgroundColor = selectedBackgroundColor

@@ -259,35 +296,6 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K
        }
    }

    private fun addFooterItems() {
        sliderView.addStickyFooterItem(
            PrimaryDrawerItem().apply {
                nameRes = R.string.folders_action
                iconRes = folderIconProvider.iconFolderResId
                identifier = DRAWER_ID_FOLDERS
                isSelectable = false
            }
        )

        sliderView.addStickyFooterItem(
            PrimaryDrawerItem().apply {
                nameRes = R.string.preferences_action
                iconRes = getResId(R.attr.iconActionSettings)
                identifier = DRAWER_ID_PREFERENCES
                isSelectable = false
            }
        )
    }

    private fun getResId(resAttribute: Int): Int {
        val typedValue = TypedValue()
        val found = parent.theme.resolveAttribute(resAttribute, typedValue, true)
        if (!found) {
            throw AssertionError("Couldn't find resource with attribute $resAttribute")
        }
        return typedValue.resourceId
    }

    private fun getFolderDisplayName(folder: Folder): String {
        return folderNameFormatter.displayName(folder)
    }
@@ -299,11 +307,18 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K
            foldersViewModel.loadFolders(account)
        }

        // Account can be null to refresh all (unified inbox or account list).
        swipeRefreshLayout.setOnRefreshListener {
            val accountToRefresh = if (headerView.selectionListShown) null else account
            refreshAndShowProgress(if (headerView.selectionListShown) null else account)
        }
    }

    private fun refreshAndShowProgress(account: Account?) {
        // Account can be null to refresh all (unified inbox or account list).
        if (!swipeRefreshLayout.isRefreshing) {
            swipeRefreshLayout.isRefreshing = true
        }
        messagingController.checkMail(
                accountToRefresh, true, true,
            account, true, true,
            object : SimpleMessagingListener() {
                override fun checkMailFinished(context: Context?, account: Account?) {
                    swipeRefreshLayout.post {
@@ -313,7 +328,6 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K
            }
        )
    }
    }

    private fun initializeWithAccountColor(account: Account) {
        getDrawerColorsForAccount(account).let { drawerColors ->
@@ -329,8 +343,6 @@ class K9Drawer(private val parent: MessageList, savedInstanceState: Bundle?) : K

    private fun handleItemClickListener(drawerItem: IDrawerItem<*>) {
        when (drawerItem.identifier) {
            DRAWER_ID_PREFERENCES -> SettingsActivity.launch(parent)
            DRAWER_ID_FOLDERS -> parent.launchManageFoldersScreen()
            DRAWER_ID_UNIFIED_INBOX -> parent.openUnifiedInbox()
            else -> {
                val folder = drawerItem.tag as Folder
+10 −0
Original line number Diff line number Diff line
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:tint="?attr/colorControlNormal"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M4 4C2.89 4 2 4.89 2 6V18C2 19.11 2.9 20 4 20H12.08A7 7 0 0 1 12 19A7 7 0 0 1 19 12A7 7 0 0 1 22 12.69V8C22 6.89 21.1 6 20 6H12L10 4H4M18 14C17.87 14 17.76 14.09 17.74 14.21L17.55 15.53C17.25 15.66 16.96 15.82 16.7 16L15.46 15.5C15.35 15.5 15.22 15.5 15.15 15.63L14.15 17.36C14.09 17.47 14.11 17.6 14.21 17.68L15.27 18.5C15.25 18.67 15.24 18.83 15.24 19C15.24 19.17 15.25 19.33 15.27 19.5L14.21 20.32C14.12 20.4 14.09 20.53 14.15 20.64L15.15 22.37C15.21 22.5 15.34 22.5 15.46 22.5L16.7 22C16.96 22.18 17.24 22.35 17.55 22.47L17.74 23.79C17.76 23.91 17.86 24 18 24H20C20.11 24 20.22 23.91 20.24 23.79L20.43 22.47C20.73 22.34 21 22.18 21.27 22L22.5 22.5C22.63 22.5 22.76 22.5 22.83 22.37L23.83 20.64C23.89 20.53 23.86 20.4 23.77 20.32L22.7 19.5C22.72 19.33 22.74 19.17 22.74 19C22.74 18.83 22.73 18.67 22.7 18.5L23.76 17.68C23.85 17.6 23.88 17.47 23.82 17.36L22.82 15.63C22.76 15.5 22.63 15.5 22.5 15.5L21.27 16C21 15.82 20.73 15.65 20.42 15.53L20.23 14.21C20.22 14.09 20.11 14 20 14H18M19 17.5C19.83 17.5 20.5 18.17 20.5 19C20.5 19.83 19.83 20.5 19 20.5C18.16 20.5 17.5 19.83 17.5 19C17.5 18.17 18.17 17.5 19 17.5Z" />
</vector>
+10 −0
Original line number Diff line number Diff line
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:tint="?attr/colorControlNormal"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M 15.857724,5.2112257 C 14.378581,4.5245963 13.792531,3.9942489 12,4 7.5800227,4.014181 4.01,7.58 4.01,12 c 0,4.42 3.57,8 7.99,8 3.73,0 7.524253,-2.99534 8.059024,-6.794874 L 17.65,14 C 16.83,16.33 14.61,18 12,18 8.69,18 6,15.31 6,12 6,8.69 8.6900019,6.0035629 12,6 c 1.452738,-0.00156 2.062645,0.5403058 3.076787,1.0329571 l -1.787121,3.6480969 6.559477,-2.4440265 -2.444026,-6.559477 z m 4.452463,0.308222 1.367566,3.6691007 -3.693934,1.4494656 -0.757545,1.913288 6.559477,-2.444026 -2.444026,-6.559477 z" />
</vector>
+68 −6
Original line number Diff line number Diff line
@@ -47,16 +47,78 @@

    </RelativeLayout>

    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/material_drawer_swipe_refresh"
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_gravity="start">

        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
            android:id="@+id/material_drawer_swipe_refresh"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1">

            <com.mikepenz.materialdrawer.widget.MaterialDrawerSliderView
                android:id="@+id/material_drawer_slider"
                android:layout_width="wrap_content"
                android:layout_height="match_parent" />

        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="?attr/messageListDividerColor" />

        <LinearLayout
            android:id="@+id/material_drawer_button_row"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="4dp"
            android:background="?android:attr/windowBackground">
            <ImageView
                android:id="@+id/drawer_button_refresh_account"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="?attr/iconActionRefresh"
                android:contentDescription="@string/check_mail_action"
                android:padding="12dp"
                android:background="?android:attr/selectableItemBackgroundBorderless" />

            <ImageView
                android:id="@+id/drawer_button_refresh_all"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_refresh_all"
                android:contentDescription="@string/check_all_mail_action"
                android:padding="12dp"
                android:background="?android:attr/selectableItemBackgroundBorderless" />

            <View
                android:layout_width="0dp"
                android:layout_height="1dp"
                android:layout_weight="1" />

            <ImageView
                android:id="@+id/drawer_button_manage_folders"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_folder_manage"
                android:contentDescription="@string/folders_action"
                android:padding="12dp"
                android:background="?android:attr/selectableItemBackgroundBorderless" />

            <ImageView
                android:id="@+id/drawer_button_settings"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="?attr/iconActionSettings"
                android:contentDescription="@string/preferences_action"
                android:padding="12dp"
                android:background="?android:attr/selectableItemBackgroundBorderless" />
        </LinearLayout>

    </LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout>
+1 −0
Original line number Diff line number Diff line
@@ -133,6 +133,7 @@ Please submit bug reports, contribute new features and ask questions at
    <string name="discard_action">Discard</string>
    <string name="save_draft_action">Save as draft</string>
    <string name="check_mail_action">Check mail</string>
    <string name="check_all_mail_action">Check mail in all accounts</string>
    <string name="send_messages_action">Send messages</string>
    <string name="refresh_folders_action">Refresh folder list</string>
    <string name="filter_folders_action">Find folder</string>