i’m trying to add Select All menu in SelectionContainer, i found this approach:
<code>CompositionLocalProvider(
LocalTextToolbar provides CustomTextToolbar(LocalView.current)
) {
SelectionContainer {
BasicText(
text = text
)
}
}
}
</code>
<code>CompositionLocalProvider(
LocalTextToolbar provides CustomTextToolbar(LocalView.current)
) {
SelectionContainer {
BasicText(
text = text
)
}
}
}
</code>
CompositionLocalProvider(
LocalTextToolbar provides CustomTextToolbar(LocalView.current)
) {
SelectionContainer {
BasicText(
text = text
)
}
}
}
inside CustomTextToolbar i have TextActionModeCallback field:
<code>
class TextActionModeCallback(
var rect: Rect = Rect.Zero,
var onCopyRequested: (() -> Unit)? = null,
var onSelectAllRequested: (() -> Unit)? = null
): ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
requireNotNull(menu)
requireNotNull(mode)
onCopyRequested?.let {
menu.add(0, MENU_ITEM_COPY, 0, android.R.string.copy)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
}
onSelectAllRequested?.let {
menu.add(0, MENU_ITEM_SELECT_ALL, 3, android.R.string.selectAll)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
}
return true
}
override fun onPrepareActionMode(p0: ActionMode?, p1: Menu?): Boolean {
return true
}
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
when (item!!.itemId) {
MENU_ITEM_COPY -> onCopyRequested?.invoke()
MENU_ITEM_SELECT_ALL -> onSelectAllRequested?.invoke()
else -> return false
}
mode?.finish()
return true
}
override fun onDestroyActionMode(p0: ActionMode?) {
}
}
</code>
<code>
class TextActionModeCallback(
var rect: Rect = Rect.Zero,
var onCopyRequested: (() -> Unit)? = null,
var onSelectAllRequested: (() -> Unit)? = null
): ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
requireNotNull(menu)
requireNotNull(mode)
onCopyRequested?.let {
menu.add(0, MENU_ITEM_COPY, 0, android.R.string.copy)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
}
onSelectAllRequested?.let {
menu.add(0, MENU_ITEM_SELECT_ALL, 3, android.R.string.selectAll)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
}
return true
}
override fun onPrepareActionMode(p0: ActionMode?, p1: Menu?): Boolean {
return true
}
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
when (item!!.itemId) {
MENU_ITEM_COPY -> onCopyRequested?.invoke()
MENU_ITEM_SELECT_ALL -> onSelectAllRequested?.invoke()
else -> return false
}
mode?.finish()
return true
}
override fun onDestroyActionMode(p0: ActionMode?) {
}
}
</code>
class TextActionModeCallback(
var rect: Rect = Rect.Zero,
var onCopyRequested: (() -> Unit)? = null,
var onSelectAllRequested: (() -> Unit)? = null
): ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
requireNotNull(menu)
requireNotNull(mode)
onCopyRequested?.let {
menu.add(0, MENU_ITEM_COPY, 0, android.R.string.copy)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
}
onSelectAllRequested?.let {
menu.add(0, MENU_ITEM_SELECT_ALL, 3, android.R.string.selectAll)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
}
return true
}
override fun onPrepareActionMode(p0: ActionMode?, p1: Menu?): Boolean {
return true
}
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
when (item!!.itemId) {
MENU_ITEM_COPY -> onCopyRequested?.invoke()
MENU_ITEM_SELECT_ALL -> onSelectAllRequested?.invoke()
else -> return false
}
mode?.finish()
return true
}
override fun onDestroyActionMode(p0: ActionMode?) {
}
}
and i set callbacks inside CustomTextToolbar’s showMenu, but the thing i faced is that SelectionContainer invokes showMenu without onSelectAllRequested, so it’s null and there is no “Select All” menu
I tried to pass onSelectAllRequested to TextActionModeCallback manually so it’s allways not null, then “Select All” is visible but i don’t know how to implement text selection in this way, so clicking it doesn’t do nothing