From b411441ba90a328af9c2fd19f6ab2777487a7897 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sun, 2 Mar 2025 18:18:48 -0600 Subject: [PATCH] Move search button to bottom bar --- app/src/main/AndroidManifest.xml | 1 + .../todoroo/astrid/activity/MainActivity.kt | 19 ++++++++++++--- .../astrid/activity/TaskListFragment.kt | 24 ++++++++++--------- .../main/java/org/tasks/themes/ThemeBase.java | 6 ----- .../menu/menu_task_list_fragment_bottom.xml | 15 ++++++------ 5 files changed, 37 insertions(+), 28 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ba94900a7..6e5e260de 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -626,6 +626,7 @@ diff --git a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt index 5b1a9da10..a5367acd6 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt @@ -20,12 +20,14 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.systemBars @@ -381,13 +383,16 @@ class MainActivity : AppCompatActivity() { listPane = { key (state.filter) { val fragment = remember { mutableStateOf(null) } + val keyboardOpen = rememberImeState() AndroidFragment( fragmentState = rememberFragmentState(), arguments = remember(state.filter) { Bundle() .apply { putParcelable(EXTRA_FILTER, state.filter) } }, - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxSize() + .imePadding(), ) { tlf -> fragment.value = tlf tlf.applyInsets(windowInsets.value) @@ -395,8 +400,16 @@ class MainActivity : AppCompatActivity() { scope.launch { drawerState.open() } } } - LaunchedEffect(fragment, windowInsets) { - fragment.value?.applyInsets(windowInsets.value) + LaunchedEffect(fragment, windowInsets, keyboardOpen.value) { + fragment.value?.applyInsets( + if (keyboardOpen.value) { + PaddingValues( + top = windowInsets.value.calculateTopPadding(), + ) + } else { + windowInsets.value + } + ) } } }, diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt index d4987372a..a9bbcbebc 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt @@ -55,7 +55,6 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberPermissionState import com.google.accompanist.permissions.shouldShowRationale -import com.google.android.material.bottomappbar.BottomAppBar import com.google.android.material.snackbar.Snackbar import com.todoroo.andlib.utility.AndroidUtilities import com.todoroo.astrid.adapter.TaskAdapter @@ -280,12 +279,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL val density = resources.displayMetrics.density val topInset = (windowInsets.calculateTopPadding().value * density).toInt() val bottomInset = (windowInsets.calculateBottomPadding().value * density).toInt() - if (topInset == 0 && bottomInset == 0) { - Timber.d("$this: Ignoring insets") - return - } else { - Timber.d("$this: applying insets") - } with(binding.toolbar) { val actionBarHeight = TypedValue.complexToDimensionPixelSize( getData(requireContext(), android.R.attr.actionBarSize), @@ -515,9 +508,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL }?.let { appBar.inflateMenu(it) } - if (appBar is BottomAppBar) { - menu.removeItem(R.id.menu_search) - } val hidden = menu.findItem(R.id.menu_show_unstarted) val completed = menu.findItem(R.id.menu_show_completed) if (!taskAdapter.supportsHiddenTasks() || !filter.supportsHiddenTasks()) { @@ -539,12 +529,23 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL menu.findItem(R.id.menu_expand_subtasks).isVisible = false } menu.findItem(R.id.menu_voice_add).isVisible = device.voiceInputAvailable() && filter.isWritable - search = binding.toolbar.menu.findItem(R.id.menu_search).setOnActionExpandListener(this) + search = binding.toolbar.menu.findItem(R.id.menu_search).apply { + setOnActionExpandListener(this@TaskListFragment) + isVisible = false + } menu.findItem(R.id.menu_clear_completed).isVisible = filter.isWritable } override fun onMenuItemClick(item: MenuItem): Boolean { + Timber.d("onMenuItemClick($item)") return when (item.itemId) { + R.id.menu_search -> { + if (!search.isActionViewExpanded) { + search.isVisible = true + search.expandActionView() + } + true + } R.id.menu_voice_add -> { safeStartActivityForResult( Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply { @@ -785,6 +786,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL } override fun onMenuItemActionCollapse(item: MenuItem): Boolean { + search.isVisible = false search.setOnQueryTextListener(null) listViewModel.setFilter(filter) listViewModel.setSearchQuery(null) diff --git a/app/src/main/java/org/tasks/themes/ThemeBase.java b/app/src/main/java/org/tasks/themes/ThemeBase.java index 5b0235c43..efdd6b140 100644 --- a/app/src/main/java/org/tasks/themes/ThemeBase.java +++ b/app/src/main/java/org/tasks/themes/ThemeBase.java @@ -3,11 +3,9 @@ package org.tasks.themes; import static org.tasks.extensions.Context.INSTANCE; import android.app.Activity; -import android.content.Context; import android.content.Intent; import android.os.Parcel; import android.os.Parcelable; -import android.view.ContextThemeWrapper; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatDelegate; @@ -83,10 +81,6 @@ public class ThemeBase implements Parcelable { return index == 4 || index == 5 ? INSTANCE.isNightMode(activity) : index > 0; } - public ContextThemeWrapper wrap(Context context) { - return new ContextThemeWrapper(context, THEMES[index]); - } - public void set(Activity activity) { activity.setTheme(THEMES[index]); } diff --git a/app/src/main/res/menu/menu_task_list_fragment_bottom.xml b/app/src/main/res/menu/menu_task_list_fragment_bottom.xml index 38d3a8dc7..330422b95 100644 --- a/app/src/main/res/menu/menu_task_list_fragment_bottom.xml +++ b/app/src/main/res/menu/menu_task_list_fragment_bottom.xml @@ -28,20 +28,19 @@ android:id="@+id/menu_share" android:icon="@drawable/ic_outline_send_24px" android:title="@string/share" /> - + app:showAsAction="always"/> + app:showAsAction="always" /> + \ No newline at end of file