PhoneGap の Plugin で呼び出した結果に応じて、呼び出し元の WebView で実行されている Sench Touch Application を操作する


PhoneGap plugin を使うと、Sencha Touch アプリケーションからネイティブコードを実行できる。新しいActivityを呼び出さない形のPlugin であれば、`return new PluginResult(戻り値);` の結果として Sencha Touch 側に実行結果が帰ってくるが、新しいActivity を呼び出してしまうと、元のWebViewへのアクセスが難しい。

新しく起動したActivityの結果から元のSencha Touch Applicationを操作したい場合、Sencha Touch Application が実行されている Activity （DroidGapクラスを拡張したもの）のインスタンスを取得し、super.loadUrl() を使って routes 呼び出しをしてあげると良い

android.app.Application クラスを拡張したクラスを作る

```java:Application.java
package jp.myapp;

public class Application extends android.app.Application {

	private MainActivity mainActivity;

	public void setMainActivity(MainActivity mainActivity) {
		this.mainActivity = mainActivity;
	}

	public MainActivity getMainActivity() {
		return mainActivity;
	}
	
}
```

カスタム Application クラスを利用できるようにする( android:name=".Application" に注目)

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="jp.myapp"
      android:versionCode="1"
      android:versionName="1.0">
-snip-
    <application android:name=".Application" android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait"
                  android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
-snip-
    </application>
</manifest>
```

メインActivity（Sencha Touch Application が起動）。
起動時に、Application クラスに自分のインスタンスを格納する

```java:MainActivity.java
package jp.myapp;

import org.apache.cordova.DroidGap;

import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends DroidGap {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // set my activithy to Application context
        Application app = (Application)getApplication();
        app.setMainActivity(this);
        // show webview
        Intent i = getIntent();
        super.loadUrl("file:///android_asset/www/index.html");
    }

	public void goTop() {
		super.loadUrl("file:///android_asset/www/index.html#home/index");
	}

	public void goList() {
		super.loadUrl("file:///android_asset/www/index.html#picture/list");
	}
}
```

Sencha Touch から呼び出される PhoneGap Plugin

```java:AwesomePlugin
package jp.myapp.plugin;

import jp.myapp.AwesomeActivity

import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;

import android.content.Intent;
import android.util.Log;

public class AwesomePlugin extends Plugin {
    private static final String TAG = AwesomePlugin.class.getSimpleName();

	@Override
	public PluginResult execute(String action, JSONArray data, String callbackId) {
		Log.d(TAG, "AwesomePlugin invoked");
		Intent intent = new Intent(this.ctx.getContext(),AwesomeActivity.class);
		// 新しいActivityを呼び出す
		this.ctx.startActivityForResult(intent);

		return new PluginResult(org.apache.cordova.api.PluginResult.Status.OK);
	}

	// AwesomeActivity:setResult(int resultCode);を実行した場合に呼ばれる
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent intent) {
		Log.d(TAG, "onActivityResult:" + resultCode);
		super.onActivityResult(requestCode, resultCode, intent);
		// Application クラスからMainActivityを呼び出し、resultCode に応じた処理を実行する
		Application app = (Application)this.ctx.getApplicationContext();
		if (resultCode == 0){
			// back
			// do nothing
		}else if(resultCode == 1){
			// topへ戻るボタンが押された
			app.getMainActivity().goTop();
		}else if(resultCode == 2){
			// listへ戻るボタンが押された
			app.getMainActivity().goList();
		}
	}
}
```

最後に、Sencha Touch 側の controller。#home/index や #picture/list の routes を用意しておく。

```coffeescript:controller/Main.coffee
Ext.define 'MyApp.controller.Main',
    extend: 'Ext.app.Controller'
    config:
      routes:
        'home/index' : 'goTop'
        'picture/list' : 'pictureList'
    ###
      goto Top
    ###
    goTop: () ->
      console.log 'goTop'
      # go to toppage

    ###
      show picture list
    ###
    pictureList: () ->
      console.log 'goList'
      # do your cool things

```