Loading app/k9mail/proguard-rules.pro +4 −0 Original line number Diff line number Diff line Loading @@ -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); } app/ui/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -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}" Loading app/ui/src/main/java/com/fsck/k9/ui/ThemeExtensions.kt 0 → 100644 +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 } app/ui/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsActivity.kt +92 −1 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) } } Loading @@ -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() Loading @@ -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 { Loading @@ -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) Loading app/ui/src/main/res/menu/general_settings_option.xml 0 → 100644 +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
app/k9mail/proguard-rules.pro +4 −0 Original line number Diff line number Diff line Loading @@ -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); }
app/ui/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -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}" Loading
app/ui/src/main/java/com/fsck/k9/ui/ThemeExtensions.kt 0 → 100644 +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 }
app/ui/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsActivity.kt +92 −1 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) } } Loading @@ -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() Loading @@ -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 { Loading @@ -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) Loading
app/ui/src/main/res/menu/general_settings_option.xml 0 → 100644 +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>