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

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

Merge pull request #3667 from k9mail/preference-search

Search function for general settings
parents 7b105d7c a8d14c1d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -23,3 +23,7 @@
-dontnote com.fsck.k9.view.**

-keep public class org.openintents.openpgp.**

-keepclassmembers class * extends android.support.v7.widget.SearchView {
   public <init>(android.content.Context);
}
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ dependencies {
    implementation "com.xwray:groupie:2.1.0"
    implementation "com.xwray:groupie-kotlin-android-extensions:2.1.0"
    implementation 'com.mikepenz:materialdrawer:6.0.7'
    implementation 'com.github.ByteHamster:SearchPreference:v1.1.4'

    implementation "commons-io:commons-io:${versions.commonsIo}"
    implementation "androidx.core:core-ktx:${versions.coreKtx}"
+15 −0
Original line number Diff line number Diff line
package com.fsck.k9.ui

import android.content.res.Resources.Theme
import android.util.TypedValue

fun Theme.resolveAttribute(resId: Int): Int {
    val typedValue = TypedValue()

    val found = resolveAttribute(resId, typedValue, true)
    if (!found) {
        throw IllegalStateException("Couldn't resolve attribute ($resId)")
    }

    return typedValue.data
}
+92 −1
Original line number Diff line number Diff line
@@ -3,16 +3,27 @@ package com.fsck.k9.ui.settings.general
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.support.v7.preference.PreferenceFragmentCompat
import android.support.v7.preference.PreferenceFragmentCompat.OnPreferenceStartScreenCallback
import android.support.v7.preference.PreferenceScreen
import android.view.Menu
import android.view.MenuItem
import com.bytehamster.lib.preferencesearch.SearchPreferenceActionView
import com.bytehamster.lib.preferencesearch.SearchPreferenceResult
import com.bytehamster.lib.preferencesearch.SearchPreferenceResultListener
import com.fsck.k9.activity.K9Activity
import com.fsck.k9.activity.setup.FontSizeSettings
import com.fsck.k9.ui.R
import com.fsck.k9.ui.fragmentTransaction
import com.fsck.k9.ui.fragmentTransactionWithBackStack
import com.fsck.k9.ui.resolveAttribute

class GeneralSettingsActivity : K9Activity(), OnPreferenceStartScreenCallback {
class GeneralSettingsActivity : K9Activity(), OnPreferenceStartScreenCallback, SearchPreferenceResultListener {
    private lateinit var searchPreferenceActionView: SearchPreferenceActionView
    private lateinit var searchPreferenceMenuItem: MenuItem
    private lateinit var searchQuery: String
    private var searchEnabled = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
@@ -24,6 +35,9 @@ class GeneralSettingsActivity : K9Activity(), OnPreferenceStartScreenCallback {
            fragmentTransaction {
                add(R.id.generalSettingsContainer, GeneralSettingsFragment.create())
            }
        } else {
            searchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY)
            searchEnabled = savedInstanceState.getBoolean(KEY_SEARCH_ENABLED)
        }
    }

@@ -32,6 +46,75 @@ class GeneralSettingsActivity : K9Activity(), OnPreferenceStartScreenCallback {
        actionBar.setDisplayHomeAsUpEnabled(true)
    }

    override fun onSaveInstanceState(outState: Bundle) {
        outState.putString(KEY_SEARCH_QUERY, searchPreferenceActionView.query.toString())
        outState.putBoolean(KEY_SEARCH_ENABLED, !searchPreferenceActionView.isIconified)
        searchPreferenceActionView.onBackPressed()
        super.onSaveInstanceState(outState)
    }

    override fun onSearchResultClicked(result: SearchPreferenceResult) {
        searchPreferenceActionView.close()
        searchPreferenceMenuItem.collapseActionView()

        if (result.resourceFile == R.xml.font_preferences) {
            startActivity(Intent(this, FontSizeSettings::class.java))
        } else {
            val fragment = GeneralSettingsFragment.create(result.screen)
            fragmentTransaction {
                addToBackStack("Search result")
                replace(R.id.generalSettingsContainer, fragment)
            }

            val accentColor = theme.resolveAttribute(R.attr.colorAccent)
            result.highlight(fragment as PreferenceFragmentCompat, accentColor)
        }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.general_settings_option, menu)

        searchPreferenceMenuItem = menu.findItem(R.id.search)
        searchPreferenceActionView = searchPreferenceMenuItem.actionView as SearchPreferenceActionView
        searchPreferenceActionView.setActivity(this)

        with(searchPreferenceActionView.searchConfiguration) {
            setFragmentContainerViewId(R.id.generalSettingsContainer)
            setBreadcrumbsEnabled(true)
            setFuzzySearchEnabled(true)

            with(index()) {
                addFile(R.xml.general_settings)
                addBreadcrumb(R.string.general_settings_title)
                addBreadcrumb(R.string.display_preferences)
                addBreadcrumb(R.string.global_preferences)
                addBreadcrumb(R.string.font_size_settings_title)
                addFile(R.xml.font_preferences)
            }
        }

        searchPreferenceMenuItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
            override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
                searchPreferenceActionView.onBackPressed()
                return true
            }

            override fun onMenuItemActionExpand(item: MenuItem): Boolean {
                return true
            }
        })

        if (searchEnabled) {
            Handler().post {
                // If we do not use a handler here, it will not be possible
                // to use the menuItem after dismissing the searchView
                searchPreferenceMenuItem.expandActionView()
                searchPreferenceActionView.setQuery(searchQuery, false)
            }
        }
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        if (item.itemId == android.R.id.home) {
            onBackPressed()
@@ -41,6 +124,12 @@ class GeneralSettingsActivity : K9Activity(), OnPreferenceStartScreenCallback {
        return super.onOptionsItemSelected(item)
    }

    override fun onBackPressed() {
        if (!searchPreferenceActionView.onBackPressed()) {
            super.onBackPressed()
        }
    }

    override fun onPreferenceStartScreen(
            caller: PreferenceFragmentCompat, preferenceScreen: PreferenceScreen
    ): Boolean {
@@ -53,6 +142,8 @@ class GeneralSettingsActivity : K9Activity(), OnPreferenceStartScreenCallback {


    companion object {
        private const val KEY_SEARCH_QUERY = "search_query"
        private const val KEY_SEARCH_ENABLED = "search_enabled"
        fun start(context: Context) {
            val intent = Intent(context, GeneralSettingsActivity::class.java)
            context.startActivity(intent)
+14 −0
Original line number Diff line number Diff line
<?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">

    <item
        android:id="@+id/search"
        android:title="@string/search_action"
        android:icon="?attr/iconActionSearch"
        app:showAsAction="collapseActionView|ifRoom"
        app:actionViewClass="com.bytehamster.lib.preferencesearch.SearchPreferenceActionView"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="com.bytehamster.lib.preferencesearch.SearchPreferenceActionView" />

</menu>
Loading