package com.fancl.iloyalty; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.Application; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Handler; import com.fancl.iloyalty.activity.AndroidProjectFrameworkActivity; import com.fancl.iloyalty.activity.MainTabActivity; import com.fancl.iloyalty.activity.MainTabFragmentActivity; import com.fancl.iloyalty.activity.SplashScreenActivity; import com.fancl.iloyalty.activity.advertisement.AdvertisementActivity; import com.fancl.iloyalty.activity.beauty.BeautyHomeActivity; import com.fancl.iloyalty.activity.login.LoginForgetPasswordActivity; import com.fancl.iloyalty.activity.login.LoginFormActivity; import com.fancl.iloyalty.activity.login.LoginNonMemberActivity; import com.fancl.iloyalty.activity.login.LoginTOSActivity; import com.fancl.iloyalty.activity.login.SignUpEnterMemberIDActivity; import com.fancl.iloyalty.activity.login.SignUpFormActivity; import com.fancl.iloyalty.activity.login.SignUpResultActivity; import com.fancl.iloyalty.activity.login.SignUpScanningBarCodeActivity; import com.fancl.iloyalty.activity.login.WelcomeActivity; import com.fancl.iloyalty.activity.menu.MenuActivity; import com.fancl.iloyalty.activity.promotion.PromotionHomeActivity; import com.fancl.iloyalty.activity.whatshot.WhatsHotHomeActivity; import com.fancl.iloyalty.activity.whatshot.WhatsHotListActivity; import com.fancl.iloyalty.asynctask.DatabaseDownloadAsyncTask; import com.fancl.iloyalty.asynctask.TillIdDatabaseDownloadAsyncTask; import com.fancl.iloyalty.asynctask.callback.DatabaseDownloadAsyncTaskCallback; import com.fancl.iloyalty.asynctask.callback.TillIdDatabaseDownloadAsyncTaskCallback; import com.fancl.iloyalty.exception.FanclException; import com.fancl.iloyalty.factory.CustomServiceFactory; import com.fancl.iloyalty.factory.GeneralServiceFactory; import com.fancl.iloyalty.item.LoadingDialog; import com.fancl.iloyalty.pojo.Version; import com.fancl.iloyalty.service.SettingService; import com.fancl.iloyalty.util.LogController; public class AndroidProjectApplication extends Application implements DatabaseDownloadAsyncTaskCallback, TillIdDatabaseDownloadAsyncTaskCallback { public static AndroidProjectApplication application; private boolean applicationStarted = false; private List<Activity> activityList = new ArrayList<Activity>(); private LoadingDialog loadingDialog; public boolean firstCallDbChecking = true; public int whatsHotUnread = 0; public int promotionUnread = 0; public int ichannelUnread = 0; public AndroidProjectApplication() { AndroidProjectApplication.application = this; } /** * Call when application start up */ @Override public void onCreate() { super.onCreate(); LogController.log("AndroidProjectApplication onCreate"); } public void applicationStartup() { if(!applicationStarted) { applicationStarted = true; //gcm register CustomServiceFactory.getGCMService().register(this); SharedPreferences sharedPreferences = application.getSharedPreferences( Constants.SHARED_PREFERENCE_APPLICATION_KEY, Context.MODE_PRIVATE); String restoredText = sharedPreferences.getString(Constants.SHARED_PREFERENCE_FIRST_INITIALIZATION_KEY, null); if (restoredText == null) { try { this.copyDatabase(); } catch (IOException e) { // TODO Auto-generated catch block LogController.log("IOException error"); e.printStackTrace(); } LogController.log("NO VALUE"); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(Constants.SHARED_PREFERENCE_FIRST_INITIALIZATION_KEY, "NO"); editor.commit(); } else { LogController.log("HAS VALUE"); } String registrationId = sharedPreferences.getString(Constants.SHARED_PREFERENCE_NOTIFICATION_REGISTRATION_ID_KEY, null); LogController.log("registrationId " + registrationId); //process of application startup GeneralServiceFactory.getImageService().prepareFileStructure(); //start thread pool for image GeneralServiceFactory.getThreadService().startImageExecutor(); } } public void applicationClosing() { if(applicationStarted) { //process of application closing //close thread pool of image receive GeneralServiceFactory.getThreadService().stopImageExecutor(); applicationStarted = false; } } public void databaseVersionChecking() { LogController.log("call databaseVersionChecking"); if (firstCallDbChecking) { return; } DatabaseDownloadAsyncTask dbVersionCheckingAsyncTask = new DatabaseDownloadAsyncTask(ApiConstant.getAPI(ApiConstant.DATABASE_API), (Constants.DATABASE_FOLDER + Constants.DATABASE_FILE_NAME), this); dbVersionCheckingAsyncTask.execute((Void)null); } private void tillIdDatabaseVersionChecking() { LogController.log("call tillIdDatabaseVersionChecking"); TillIdDatabaseDownloadAsyncTask tillIdDbVersionCheckingAsyncTask = new TillIdDatabaseDownloadAsyncTask(ApiConstant.getAPI(ApiConstant.TILL_ID_DATABASE_API), (Constants.DATABASE_FOLDER + Constants.TILL_ID_DATABASE_FILE_NAME), this); tillIdDbVersionCheckingAsyncTask.execute((Void)null); } @Override public void noNeedToDownloadNewDatabase() { // TODO Auto-generated method stub tillIdDatabaseVersionChecking(); } @Override public void databaseStartDownloading() { // TODO Auto-generated method stub getFrontActivity().runOnUiThread(new Runnable() { public void run() { loadingDialog = null; loadingDialog = new LoadingDialog(getFrontActivity()); loadingDialog.loading(); } }); } @Override public void databaseDownloadFinished() { // TODO Auto-generated method stub LogController.log("databaseDownloadFinished"); GeneralServiceFactory.getSQLiteDatabaseService().closeSQLiteDatabase(); GeneralServiceFactory.getSQLiteDatabaseService().getSQLiteDatabase(); try { Version version = CustomServiceFactory.getSettingService().currentDatabaseVersion(); if (version == null) { LogController.log("version == nil, redownload"); databaseVersionChecking(); return; } else { LogController.log("Download success, open new activity"); //Replace all read content SettingService settingService = CustomServiceFactory.getSettingService(); SharedPreferences sharedPreferences = application.getSharedPreferences( Constants.SHARED_PREFERENCE_APPLICATION_KEY, Context.MODE_PRIVATE); String hotItemArrayString = sharedPreferences.getString(Constants.HOT_ITEM_READ_ARRAY_KEY, null); if (hotItemArrayString != null) { LogController.log("hotItemArrayString: " + hotItemArrayString); String[] itemIdList = hotItemArrayString.split(","); for (int i = 0; i < itemIdList.length; i++) { settingService.updateDatabaseContentAfterUpdating("hot_item", itemIdList[i]); } } String promotionArrayString = sharedPreferences.getString(Constants.PROMOTION_READ_ARRAY_KEY, null); if (promotionArrayString != null) { LogController.log("promotionArrayString: " + promotionArrayString); String[] itemIdList = promotionArrayString.split(","); for (int i = 0; i < itemIdList.length; i++) { settingService.updateDatabaseContentAfterUpdating("promotion", itemIdList[i]); } } String ichannelArrayString = sharedPreferences.getString(Constants.ICHANNEL_READ_ARRAY_KEY, null); if (ichannelArrayString != null) { LogController.log("ichannelArrayString: " + ichannelArrayString); String[] itemIdList = ichannelArrayString.split(","); for (int i = 0; i < itemIdList.length; i++) { settingService.updateDatabaseContentAfterUpdating("ichannel_magazine", itemIdList[i]); } } Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { reloadAllActivityTabBar(); } }, 500); tillIdDatabaseVersionChecking(); } } catch (FanclException e) { // TODO Auto-generated catch block e.printStackTrace(); LogController.log("FanclException, redownload"); databaseVersionChecking(); return; } } @Override public void databaseDownloadFailed() { // TODO Auto-generated method stub tillIdDatabaseVersionChecking(); } @Override public void databaseDownloadingProgress(int progress) { LogController.log("databaseDownloadingProgress progress >>> " + progress); } private void copyDatabase() throws IOException { // Open your local db as the input stream LogController.log("Going to get the db file"); InputStream myInput = application.getResources().openRawResource( R.raw.iloyalty); LogController.log("Get the db file"); // Path to the just created empty db File path = new File(Constants.DATABASE_FOLDER); path.mkdirs(); LogController.log("created the new path"); // Open the empty db as the output stream OutputStream myOutput; try { myOutput = new FileOutputStream(Constants.DATABASE_FOLDER + Constants.DATABASE_FILE_NAME); // transfer bytes from the inputfile to the outputfile LogController.log("write the file"); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } // Close the streams myOutput.flush(); myOutput.close(); myInput.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } LogController.log("Going to get the log db file"); InputStream logDbInput = application.getResources().openRawResource( R.raw.userlog); LogController.log("Get the log db file"); // Path to the just created empty db File logDbPath = new File(Constants.DATABASE_FOLDER); logDbPath.mkdirs(); LogController.log("created the new path"); // Open the empty db as the output stream OutputStream logDbOutput; try { logDbOutput = new FileOutputStream(Constants.DATABASE_FOLDER + Constants.LOG_DATABASE_FILE_NAME); // transfer bytes from the inputfile to the outputfile LogController.log("write the log db file"); byte[] buffer = new byte[1024]; int length; while ((length = logDbInput.read(buffer)) > 0) { logDbOutput.write(buffer, 0, length); } // Close the streams logDbOutput.flush(); logDbOutput.close(); logDbInput.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } LogController.log("Going to get the till id db file"); InputStream tillIdDbInput = application.getResources().openRawResource( R.raw.userlog); LogController.log("Get the till id db file"); // Path to the just created empty db File tillIdDbPath = new File(Constants.DATABASE_FOLDER); tillIdDbPath.mkdirs(); LogController.log("created the new path"); // Open the empty db as the output stream OutputStream tillIdDbOutput; try { tillIdDbOutput = new FileOutputStream(Constants.DATABASE_FOLDER + Constants.TILL_ID_DATABASE_FILE_NAME); // transfer bytes from the inputfile to the outputfile LogController.log("write the till id db file"); byte[] buffer = new byte[1024]; int length; while ((length = tillIdDbInput.read(buffer)) > 0) { tillIdDbOutput.write(buffer, 0, length); } // Close the streams tillIdDbOutput.flush(); tillIdDbOutput.close(); tillIdDbInput.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void addActiveActivity(Activity activity) { if (activity != null) { activityList.add(activity); } } public void removeActiveActivity(Activity activity) { if (activity != null) { activityList.remove(activity); } } public Activity getFrontActivity() { if(activityList != null) { if(activityList.size() > 0) { try { return activityList.get(activityList.size()-1); } catch (Exception e) { return null; } } } return null; } public void removeAllActivity() { try { if(activityList != null) { for(Activity activity : activityList) { if(activity != null) { if(!activity.isFinishing()) { activity.finish(); } } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void removeExistingActivity() { try { if(activityList != null) { for(Activity activity : activityList) { if(activity != null) { if (activity instanceof AndroidProjectFrameworkActivity) { if(!activity.isFinishing()) { activity.finish(); } } } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void noNeedToDownloadNewTillIdDatabase() { // TODO Auto-generated method stub if (loadingDialog != null) { loadingDialog.stop(); } Runnable mLaunchTask = new Runnable() { public void run() { Activity activity = getFrontActivity(); LogController.log("getFrontActivity:"+activity); if(activity instanceof AdvertisementActivity){ LogController.log("not open banner"); return; } if (activity instanceof AndroidProjectFrameworkActivity) { ((AndroidProjectFrameworkActivity) activity).callToOpenAd(); } } }; Handler mHandler = new Handler(); mHandler.postDelayed(mLaunchTask,5000); } @Override public void tillIdDatabaseStartDownloading() { // TODO Auto-generated method stub if (loadingDialog == null) { getFrontActivity().runOnUiThread(new Runnable() { public void run() { loadingDialog = null; loadingDialog = new LoadingDialog(getFrontActivity()); loadingDialog.loading(); } }); } } @Override public void tillIdDatabaseDownloadFinished() { // TODO Auto-generated method stub GeneralServiceFactory.getSQLiteDatabaseService().closeTillIdDatabase(); GeneralServiceFactory.getSQLiteDatabaseService().getTillIdDatabase(); try { Version version = CustomServiceFactory.getSettingService().currentTillIdDatabaseVersion(); if (version == null) { LogController.log("version == nil, redownload"); tillIdDatabaseVersionChecking(); return; } else { LogController.log("Download success, open new activity"); if (loadingDialog != null) { loadingDialog.stop(); } Activity activity = getFrontActivity(); if (activity instanceof LoginForgetPasswordActivity || activity instanceof LoginFormActivity || activity instanceof LoginTOSActivity || activity instanceof SignUpEnterMemberIDActivity || activity instanceof SignUpFormActivity || activity instanceof SignUpResultActivity || activity instanceof WelcomeActivity || activity instanceof SignUpScanningBarCodeActivity || activity instanceof LoginNonMemberActivity || activity instanceof SplashScreenActivity) { return; } Intent intent = new Intent(application, WhatsHotHomeActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); activity.finish(); } } catch (FanclException e) { // TODO Auto-generated catch block e.printStackTrace(); LogController.log("FanclException, redownload"); tillIdDatabaseVersionChecking(); return; } Runnable mLaunchTask = new Runnable() { public void run() { Activity activity = getFrontActivity(); LogController.log("getFrontActivity:"+activity); if(activity instanceof AdvertisementActivity){ LogController.log("not open banner"); return; } if (activity instanceof AndroidProjectFrameworkActivity) { ((AndroidProjectFrameworkActivity) activity).callToOpenAd(); } } }; Handler mHandler = new Handler(); mHandler.postDelayed(mLaunchTask,5000); } @Override public void tillIdDatabaseDownloadFailed() { // TODO Auto-generated method stub if (loadingDialog != null) { loadingDialog.stop(); } } @Override public void tillIdDatabaseDownloadingProgress(int progress) { LogController.log("tillIdDatabaseDownloadingProgress progress >>> " + progress); } public void reloadAllActivityTabBar() { if(activityList != null) { for (int i = 0; i < activityList.size(); i++) { Activity activity = activityList.get(i); if (activity instanceof MainTabActivity) { ((MainTabActivity) activity).setBadgesNumber(); } if (activity instanceof MainTabFragmentActivity) { ((MainTabFragmentActivity) activity).setBadgesNumber(); } if (activity instanceof WhatsHotHomeActivity) { ((WhatsHotHomeActivity) activity).relaodUnreadContent(); } if (activity instanceof WhatsHotListActivity) { ((WhatsHotListActivity) activity).relaodUnreadContent(); } if (activity instanceof BeautyHomeActivity) { ((BeautyHomeActivity) activity).relaodUnreadContent(); } if (activity instanceof PromotionHomeActivity) { ((PromotionHomeActivity) activity).relaodUnreadContent(); } } } } public void resetMenu() { if (activityList != null) { for (int i = 0; i < activityList.size(); i++) { Activity activity = activityList.get(i); if (activity instanceof MenuActivity) { ((MenuActivity) activity).resetView(); } } } } public int getActiveListCount() { return activityList.size(); } public void resetLoadingDialog() { loadingDialog = null; } }