package com.android_mvc.framework.activities.installation; import com.android_mvc.framework.activities.base.BaseNormalActivity; import com.android_mvc.framework.common.FWUtil; import com.android_mvc.framework.common.AbstractAppSettings; import com.android_mvc.framework.db.dao.FWPrefDAO; import com.android_mvc.framework.db.dao.IFWDAO; import com.android_mvc.framework.db.DBHelper; import com.android_mvc.framework.task.AsyncTasksRunner; import com.android_mvc.framework.task.SequentialAsyncTask; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; /** * アプリ初期化アクティビティの基底クラス * @author id:language_and_engineering * */ public abstract class InstallAppFWBaseActivity extends BaseNormalActivity { /** * 端末内に格納したFWのメタ情報にアクセスするオブジェクト */ private IFWDAO fwDAO = new FWPrefDAO(); /** * アプリを動かすためのクラス関係などをFW側で初期化。 * 簡易DIみたいなもの。アプリ側からFW側に情報を注入する。 */ protected abstract void injectAppInfoIntoFW(); /** * プリファレンスを初期構築 */ protected abstract void init_db_preferences(); /** * DB構造を初期構築 */ protected abstract void init_db_schema(); /** * DB内のデータを初期構築 */ protected abstract void init_db_data(SQLiteDatabase db); /** * その他の初期化処理 */ protected abstract void init_etc(); /** * アプリ初期化成功時のコールバック */ protected abstract void onInstallCompleted(); /** * アプリ初期化スキップ時のコールバック */ protected abstract void onInstallSkipped(); @Override public void onCreate(Bundle savedInstanceState) { // NOTE:基底クラスのonCreate処理が呼ばれるよりも前に, // ロガーのタグ等を初期化しておく必要がある。 injectAppInfoIntoFW(); // NOTE: FWの初期化判定に入る前に,必要なら // デバッグ用にプリファレンスをクリアしておく必要がある。 // FWのメタ情報はプリファレンスに入ってるから。 clear_prefs_if_required(); // 必要ならデバッグ用にDB削除 clear_rdb_if_required(); super.onCreate(savedInstanceState); // TODO: アップグレード処理 // 初期化 if( requires_installation( this ) ) { // デフォルトの初期化プロセスを実行 executeDefaultInstallationProcessAsync(); } else { onInstallSkipped(); } } /** * 必要ならデバッグ用にプリファレンスをクリアする。 * アプリインストール時のプリファレンス初期化処理を強制的に行わせるため。 */ private void clear_prefs_if_required() { if( FWUtil.mustClearPrefsForDebug() ) { FWUtil.d("プリファレンスのクリアの必要があると判断"); fwDAO.deleteAll(this); } else { FWUtil.d("プリファレンスのクリアの必要なし"); } } /** * 必要ならデバッグ用にRDBをクリアする。 * テーブルもデータも削除される。 */ private void clear_rdb_if_required() { if( FWUtil.mustClearPrefsForDebug() ) { FWUtil.d("RDBのクリアの必要があると判断"); new DBHelper(this).deleteDB(); } else { FWUtil.d("RDBのクリアの必要なし"); } } /** * 初期化処理が必要かどうかを判定 */ private boolean requires_installation(Context context) { // DIARY: ここの!の付け忘れで悩んだ。requireとcompletedではフラグの意味が正反対。 return ! fwDAO.getFWInstallCompletedFlag(context); } /** * デフォルトのアプリ初期化プロセス。 */ private void executeDefaultInstallationProcessAsync() { FWUtil.d("アプリ初期化プロセスを開始"); final Context context = this; new AsyncTasksRunner( new SequentialAsyncTask[]{ new SequentialAsyncTask(){ @Override protected boolean main() { // プリファレンスを初期化 init_db_preferences(); // DBを初期化 init_db_schema(); SQLiteDatabase db = new DBHelper(context).getWritableDatabase(); init_db_data( db ); db.close(); // その他の初期化 init_etc(); // 完了した旨を記録 fwDAO.updateFWInstallCompletedFlag( context, true ); FWUtil.d("アプリ初期化プロセスを終了"); // ランナーの親に制御を戻す onInstallCompleted(); return CONTINUE_TASKS; } } }).withSimpleDialog("アプリを初期化中・・・", this).begin(); } /** * アプリ起動時に,AP側の設定情報を受け取り,FW側に注入・初期化する。 */ protected void receiveAppInfoAsFW( AbstractAppSettings settings ) { FWUtil.receiveAppInfoAsFW( settings ); } }