package com.android_mvc.framework.controller.routing; import com.android_mvc.framework.common.FWUtil; import com.android_mvc.framework.controller.action.ActionResult; import com.android_mvc.framework.controller.validation.ValidationResult; import android.app.Activity; import android.content.Intent; /** * 画面遷移と,それに伴うデータ運搬を実行するクラス。 * @author id:language_and_engineering * */ public class Router { // Intentに自動的にオブジェクトを詰め込むためのキー public static final String EXTRA_KEY_VALIDATION_RESULT = "_ValidationResult"; public static final String EXTRA_KEY_ACTION_RESULT = "_ActionResult"; // NOTE: その他の各種情報をIntent内に自動的に詰め込んでおく /** * 単純に,別の画面に遷移する。 * Intent経由で情報を渡さない。 */ public static void go(Activity fromActivity, Class<? extends Activity> toActivity) { // ありがちなコーディングミスを予防しておく if( toActivity == null ) { FWUtil.e("遷移先がnullです。"); return; } // 遷移 Intent intent = new Intent( fromActivity.getApplicationContext(), toActivity ); fromActivity.startActivity(intent); } /** * ルーティングテーブルに従い,別の画面に遷移する。 * Intent経由で情報を渡さない。 */ public static void goByRoutingTable(Activity fromActivity, String routeId, RoutingTable table) { Class<? extends Activity> destActivityClass = table.getActivityByRouteId(routeId); Router.go(fromActivity, destActivityClass); // TODO: Intent付きも可能にする? } /** * Intentに情報を込めつつ,別の画面に遷移する。 */ public static void goWithData(Activity fromActivity, Class<? extends Activity> toActivity, Intent src) { if( toActivity == null ) { FWUtil.e("遷移先がnullです。"); return; } Intent intent = new Intent( fromActivity.getApplicationContext(), toActivity ); // Extraを全コピー intent.putExtras(src); // NOTE: ここでsrcのIntentは,メソッド間でのextrasの運搬媒体としてのみ利用している。 // 遷移先に関する情報はC層で持ちまわって制御したいから。 // 遷移 fromActivity.startActivity(intent); } /** * Intentに情報を込めつつ,別の画面に遷移する。 * 遷移先についてコメントを記述できる。 */ public static void goWithData(Activity fromActivity, Class<? extends Activity> toActivity, String comment, Intent src) { goWithData(fromActivity, toActivity, src); } // 下記はFW内で利用 /** * バリデ失敗時の画面遷移 */ public static void goWhenValidationFailed( Activity from_activity, Class<? extends Activity> toActivity, ValidationResult vres ) { if( toActivity == null ) { FWUtil.e("遷移先がnullです。"); return; } Intent intent = new Intent( from_activity.getApplicationContext(), toActivity ); // バリデーション結果を格納 intent.putExtra(EXTRA_KEY_VALIDATION_RESULT, vres); from_activity.startActivity(intent); } /** * BL実行時の画面遷移。 * アクション実行結果ごとのルーティング識別子によって分岐。 */ public static void switchByActionResult( Activity from_activity, ActionResult ares, RoutingTable routingTable ) { // ルーティング識別子を取得 String route_id = ares.getRouteId(); // 遷移先のActivityのクラスを取得 Class<? extends Activity> to_activity = routingTable.getActivityByRouteId(route_id); if( to_activity != null ) { // 遷移を実行 Intent intent = new Intent( from_activity.getApplicationContext(), to_activity ); // アクション実行結果を格納 intent.putExtra(EXTRA_KEY_ACTION_RESULT, ares); from_activity.startActivity(intent); // BL実行完了を新画面上で通知 ares.onNextActivityStarted(from_activity); } else { // NOTE: 遷移先がnullの場合は,遷移しないでとどまる。 // 特定のケースで移動を阻止するため,意図的にnull指定する場合もあるかもしれないから。 FWUtil.d("遷移先がnullです。"); } } }