Android 12でWebKit上のコンテキストメニュー(Action Mode)の変更が反映されない

環境

  • Pixel 3a
  • Android 12 beta 5 (ビルド番号 SPB5.210812.002)

症状

AndroidWebKit上のコンテキストメニューをカスタマイズする場合、WebKitクラスを継承したサブクラスを作成し、そこで以下のようにonActionModeStarted()をオーバーライドする。

@Override
public void onActionModeStarted(ActionMode mode) {
    Menu menu = mode.getMenu();
    
    //  "コピー"と"全て共有"を削除
    removeMenuItemByTitle(menu, getResources().getString(android.R.string.copy));
    removeMenuItemByTitle(menu, getResources().getString(android.R.string.selectAll));

    //  メニューを追加
    MenuItem textMarkerMenu = menu.add("Test1");
    MenuItem textMarkerMenu2 = menu.add("Test2");

    super.onActionModeStarted(mode);
}

しかし、Android 12では以下のように変更が反映されない。

解決方法

onActionModeStarted()の最後にinvalidateContentRect()を実行する。

@Override
public void onActionModeStarted(ActionMode mode) {
    Menu menu = mode.getMenu();
    
    //  "コピー"と"全て選択"を削除
    removeMenuItemByTitle(menu, getResources().getString(android.R.string.copy));
    removeMenuItemByTitle(menu, getResources().getString(android.R.string.selectAll));

    //  メニューを追加
    MenuItem textMarkerMenu = menu.add("Test1");
    MenuItem textMarkerMenu2 = menu.add("Test2");

    //  以下を追加
    mode.invalidateContentRect();

    super.onActionModeStarted(mode);
}

これで以下のように変更が反映される。*以下では"共有"メニューも削除している。

おまけ

invalidateContentRect() の代わりに invalidate() を実行するとメニューの追加は反映されるが、削除が反映されない。