EditTextへのプレーンテキストのペースト

AndroidのEditTextではペーストをすると以下のようにHTMLのタグが有効な状態で表示が行われます
今回はペースト時にプレーンテキストで貼り付けをする方法がないか調べてみました
(以下のコードはAPI24のソースコードを参照しています)

Screen Shot 2016-12-01 at 1.44.59 AM.png

ペーストの実装を調査

まずはEditTextでペーストを押した時にどのようなコードが実行されているか調べてみたところ、
onTextContextMenuItemの中の以下のコードのid=ID_PASTEの場合のコードが実行されているようです

switch (id) {
    …
    case ID_PASTE:
        paste(min, max, true /* withFormatting */);
        return true;
    case ID_PASTE_AS_PLAIN_TEXT:
        paste(min, max, false /* withFormatting */);
        return true;
    …
}

id=ID_PASTEの場合はhtmlが有効な状態の表示になります
プレーンテキストで貼り付けを行うにはid=ID_PASTE_AS_PLAIN_TEXTになるようにコードを実行させると良さそうです

EditText内でID_PASTE_AS_PLAIN_TEXTが使われているのは
public boolean onKeyShortcut(int keyCode, KeyEvent event)でCtrl+Shift+Vが押された時の場合のみのようです

@Override
public boolean onKeyShortcut(int keyCode, KeyEvent event) {
    …
    } else if (event.hasModifiers(KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON)) {
        …
        case KeyEvent.KEYCODE_V:
            if (canPaste()) {
                return onTextContextMenuItem(ID_PASTE_AS_PLAIN_TEXT);
        }
        …
}

ただ、これは外付けキーボードなどがないと実行することはできそうにないです・・・

ちなみに ID_PASTE_AS_PLAIN_TEXTの実態はandroid.R.id.pasteAsPlainTextとなっています
これはAPI23(Android M)から追加された値です。そのためAPI23とそれ以前ではonTextContextMenuItemの実装が変わっていました

まとめ

今回調べたところEditTextでプレーンテキストを貼り付けさせる方法は提供はされているがスマホでは簡単には実行できそうにありませんでした
onTextContextMenuItemの実装を変更すると強制的にプレーンテキストのペーストにできそうではありましたが、バージョンごとに処理を変更したり、動作確認が大変なためあまり実用的ではなさそうですね