Move search button to bottom bar

pull/3385/head
Alex Baker 9 months ago
parent 317aae1e3e
commit b411441ba9

@ -626,6 +626,7 @@
<activity <activity
android:launchMode="singleTask" android:launchMode="singleTask"
android:exported="true" android:exported="true"
android:windowSoftInputMode="adjustResize"
android:name="com.todoroo.astrid.activity.MainActivity"> android:name="com.todoroo.astrid.activity.MainActivity">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>

@ -20,12 +20,14 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateEndPadding
import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.calculateStartPadding
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.ime import androidx.compose.foundation.layout.ime
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.systemBars
@ -381,13 +383,16 @@ class MainActivity : AppCompatActivity() {
listPane = { listPane = {
key (state.filter) { key (state.filter) {
val fragment = remember { mutableStateOf<TaskListFragment?>(null) } val fragment = remember { mutableStateOf<TaskListFragment?>(null) }
val keyboardOpen = rememberImeState()
AndroidFragment<TaskListFragment>( AndroidFragment<TaskListFragment>(
fragmentState = rememberFragmentState(), fragmentState = rememberFragmentState(),
arguments = remember(state.filter) { arguments = remember(state.filter) {
Bundle() Bundle()
.apply { putParcelable(EXTRA_FILTER, state.filter) } .apply { putParcelable(EXTRA_FILTER, state.filter) }
}, },
modifier = Modifier.fillMaxSize(), modifier = Modifier
.fillMaxSize()
.imePadding(),
) { tlf -> ) { tlf ->
fragment.value = tlf fragment.value = tlf
tlf.applyInsets(windowInsets.value) tlf.applyInsets(windowInsets.value)
@ -395,8 +400,16 @@ class MainActivity : AppCompatActivity() {
scope.launch { drawerState.open() } scope.launch { drawerState.open() }
} }
} }
LaunchedEffect(fragment, windowInsets) { LaunchedEffect(fragment, windowInsets, keyboardOpen.value) {
fragment.value?.applyInsets(windowInsets.value) fragment.value?.applyInsets(
if (keyboardOpen.value) {
PaddingValues(
top = windowInsets.value.calculateTopPadding(),
)
} else {
windowInsets.value
}
)
} }
} }
}, },

@ -55,7 +55,6 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberPermissionState import com.google.accompanist.permissions.rememberPermissionState
import com.google.accompanist.permissions.shouldShowRationale import com.google.accompanist.permissions.shouldShowRationale
import com.google.android.material.bottomappbar.BottomAppBar
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.todoroo.andlib.utility.AndroidUtilities import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.adapter.TaskAdapter import com.todoroo.astrid.adapter.TaskAdapter
@ -280,12 +279,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
val density = resources.displayMetrics.density val density = resources.displayMetrics.density
val topInset = (windowInsets.calculateTopPadding().value * density).toInt() val topInset = (windowInsets.calculateTopPadding().value * density).toInt()
val bottomInset = (windowInsets.calculateBottomPadding().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) { with(binding.toolbar) {
val actionBarHeight = TypedValue.complexToDimensionPixelSize( val actionBarHeight = TypedValue.complexToDimensionPixelSize(
getData(requireContext(), android.R.attr.actionBarSize), getData(requireContext(), android.R.attr.actionBarSize),
@ -515,9 +508,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
}?.let { }?.let {
appBar.inflateMenu(it) appBar.inflateMenu(it)
} }
if (appBar is BottomAppBar) {
menu.removeItem(R.id.menu_search)
}
val hidden = menu.findItem(R.id.menu_show_unstarted) val hidden = menu.findItem(R.id.menu_show_unstarted)
val completed = menu.findItem(R.id.menu_show_completed) val completed = menu.findItem(R.id.menu_show_completed)
if (!taskAdapter.supportsHiddenTasks() || !filter.supportsHiddenTasks()) { 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_expand_subtasks).isVisible = false
} }
menu.findItem(R.id.menu_voice_add).isVisible = device.voiceInputAvailable() && filter.isWritable 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 menu.findItem(R.id.menu_clear_completed).isVisible = filter.isWritable
} }
override fun onMenuItemClick(item: MenuItem): Boolean { override fun onMenuItemClick(item: MenuItem): Boolean {
Timber.d("onMenuItemClick($item)")
return when (item.itemId) { return when (item.itemId) {
R.id.menu_search -> {
if (!search.isActionViewExpanded) {
search.isVisible = true
search.expandActionView()
}
true
}
R.id.menu_voice_add -> { R.id.menu_voice_add -> {
safeStartActivityForResult( safeStartActivityForResult(
Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply { Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
@ -785,6 +786,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
} }
override fun onMenuItemActionCollapse(item: MenuItem): Boolean { override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
search.isVisible = false
search.setOnQueryTextListener(null) search.setOnQueryTextListener(null)
listViewModel.setFilter(filter) listViewModel.setFilter(filter)
listViewModel.setSearchQuery(null) listViewModel.setSearchQuery(null)

@ -3,11 +3,9 @@ package org.tasks.themes;
import static org.tasks.extensions.Context.INSTANCE; import static org.tasks.extensions.Context.INSTANCE;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.view.ContextThemeWrapper;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.app.AppCompatDelegate;
@ -83,10 +81,6 @@ public class ThemeBase implements Parcelable {
return index == 4 || index == 5 ? INSTANCE.isNightMode(activity) : index > 0; 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) { public void set(Activity activity) {
activity.setTheme(THEMES[index]); activity.setTheme(THEMES[index]);
} }

@ -28,20 +28,19 @@
android:id="@+id/menu_share" android:id="@+id/menu_share"
android:icon="@drawable/ic_outline_send_24px" android:icon="@drawable/ic_outline_send_24px"
android:title="@string/share" /> android:title="@string/share" />
<item
android:id="@+id/menu_voice_add"
android:icon="@drawable/ic_outline_mic_none_24px"
android:title="@string/EPr_voiceInputEnabled_title"
app:showAsAction="ifRoom" />
<item <item
android:id="@+id/menu_search" android:id="@+id/menu_search"
android:icon="@drawable/ic_outline_search_24px" android:icon="@drawable/ic_outline_search_24px"
android:title="@string/TLA_menu_search" android:title="@string/TLA_menu_search"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="always"/>
app:showAsAction="ifRoom|collapseActionView"/>
<item <item
android:id="@+id/menu_sort" android:id="@+id/menu_sort"
android:icon="@drawable/ic_outline_sort_24px" android:icon="@drawable/ic_outline_sort_24px"
android:title="@string/TLA_menu_sort" android:title="@string/TLA_menu_sort"
app:showAsAction="ifRoom" /> app:showAsAction="always" />
<item
android:id="@+id/menu_voice_add"
android:icon="@drawable/ic_outline_mic_none_24px"
android:title="@string/EPr_voiceInputEnabled_title"
app:showAsAction="always" />
</menu> </menu>
Loading…
Cancel
Save