Android webview override startActionMode yet keep default dismiss of text selection

1.1k Views Asked by At

After searching for a similar question I gave up and decided to ask myself , if there is an existing answer please notify me.

I have a WebView in which I needed to override the default actionMode , I followed suggestions from many Q & A here and everything was working well until I have noticed that something very specific was missing in the behavior of the actionMode. The dismiss event for the text selection only happens when the user presses "Back button" or "Done" on the action mode. In the Default actionMode when the user presses outside the selected text the actionMode also closes , and this I cannot achieve and not sure how can I acheive it without complicating stuff and writing extra lines of code instead of using the "super" behavior for dissmissing text selection when the user presses outside the selected text.

Hope you can help , thanks ahead.

My WebView with the overriden startActionMode:

@Override
public ActionMode startActionMode(ActionMode.Callback callback) {

    /*
     * When running Ice Cream Sandwich (4.0) or Jelly Bean (4.1 - 4.3),
     * there is a hidden class called 'WebViewClassic' that draws the
     * selection. In order to clear the selection, save the callback from
     * Classic so it can be destroyed later.
     */
    // Check the class name because WebViewClassic.SelectActionModeCallback
    // is not public API.
    String name = callback.getClass().toString();
    if (name.contains("SelectActionModeCallback")) {
        webViewDefaultActionModeCallBack = callback;
    }

    if (mActionMode == null) {
        mActionMode = super.startActionMode(mActionModeCallback);
    }
    return mActionMode;
}

My ActionModeCallback :

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {

    // Called when the action mode is created; startActionMode() was called
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {

        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.my_menu, menu);
        return true;
    }

    // Called each time the action mode is shown. Always called after
    // onCreateActionMode, but
    // may be called multiple times if the mode is invalidated.
    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {

        return false; // Return false if nothing is done
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {

            case R.id.item1:
                // do something 
                break;

            case R.id.item2:
                // do something 
                break;
        }

        mode.finish();
        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

        mActionMode = null;

        // Semi-hack in order to clear the selection
        // when running Android earlier than KitKat.
        if (webViewDefaultActionModeCallBack != null) {
            webViewDefaultActionModeCallBack.onDestroyActionMode(mode);
        }
    }
};
0

There are 0 best solutions below