WebView form - POST をインターセプト

Android WebView でリンクを押した時、javascript なら location.href がセットされた時、
インターセプトするなら、WebViewClient
  shouldOverrideUrlLoading(WebView view,String url)
を使うが、FORM送信、POST 用のインターセプト目的のメソッドWebViewClient には存在しない。

WebViewClient onPageStarted と、javascript インターフェースを組み合わせるしかないみたい。
onPageStarted で、HTMLの form タグと input タグの情況を WebView # loadUrl("javascript:
の実行で javascript インターフェースでセットすることで読み込む。

WebView webview = (WebView)findViewById(R.id.webView);

webview.getSettings().setJavaScriptEnabled(true);
// jsRelay = form と input タグの情況を納めるインターフェース
final JsRelay jsRelay = new JsRelay();
webview.addJavascriptInterface(jsRelay,"android");

webview.setWebViewClient(new WebViewClient(){
   @Override
   public void onPageStarted(WebView view,String url,Bitmap favicon){

      // form , input 取得リスト初期化、フラグ初期化
      jsRelay.init();
      StringBuilder sb = new StringBuilder();
      sb.append("javascript:var f=document.getElementsByTagName('form');");
      sb.append("for(i=0;i < f.length;i++){");
      sb.append("   android.steelForm(f[i].getAttribute('method'),f[i].getAttribute('action'));");
      sb.append("}");
      sb.append("var p=document.getElementsByTagName('input');");
      sb.append("for(i=0;i < p.length;i++){");
      sb.append("   android.steelInput(p[i].getAttribute('name'),p[i].value);");
      sb.append("}");
      sb.append("android.steelEnd();");

      webview.loadUrl(sb.toString());

      while(!jsRelay.isSteelEnd()){
         try{Thread.sleep(100);}catch(InterruptedException e){}
      }
      // jsRelay から情況GETして処理を。。
      // onPageStarted の url が、form の action とマッチする点で処理を記述

   }
}
-------
public class JsRelay{
   private boolean steelend;

   public void init(){
      steelend = false:
      // form,input情況の蓄積リストを初期化
   }
   public void steelForm(String method,String action){
      // リストなどに蓄積する
   }
   public void steelInput(String name,String value){
      // リストなどに蓄積する
   }
   public boolean isSteelEnd(){
      return this.steelend;
   }
   public void steelEnd(){
      this.steelend = true;
   }
}