package com.mobapphome.mahads; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import com.google.gson.Gson; import com.mobapphome.mahads.tools.Constants; import com.mobapphome.mahads.tools.Updater; import com.mobapphome.mahads.tools.Utils; import com.mobapphome.mahads.types.MAHRequestResult; import com.mobapphome.mahads.types.Urls; public class MAHAdsController { private static MAHAdsController instance = null; private static MAHRequestResult mahRequestResult; //This variable saves in savedInstanceState private Urls urls; private boolean internalCalled = false; private String fontName = null;//This variable saves in savedInstanceState protected MAHAdsController() { } /** * Creates and returns MAHAdsController object if there is not * @return new insatnce of MAHAdsController */ public static MAHAdsController getInstance() { if(instance == null) { instance = new MAHAdsController(); } return instance; } /** * Initializes MAHAds library * @param activity Activity which init calls * @param urlRootOnServer Root of services which programs have listed. Inside of this method: * urlForProgramVersion = urlRootOnServer + "program_version.php" * urlForProgramList = urlRootOnServer + "program_list.php" */ @Deprecated public void init(@NonNull final FragmentActivity activity, Bundle savedInstanceState, @NonNull String urlRootOnServer) { init(activity, savedInstanceState, urlRootOnServer, "program_version.php", "program_list.php"); } /** * Initializes MAHAds library * @param activity Activity which init calls * @param urlRootOnServer Root of services which programs have listed. * @param programVersionUrlEnd Url end for program version * @param urlForProgramListUrlEnd Url end for program list */ public void init(@NonNull final FragmentActivity activity, Bundle savedInstanceState, @NonNull String urlRootOnServer, @NonNull String programVersionUrlEnd, @NonNull String urlForProgramListUrlEnd) { init(activity, savedInstanceState, urlRootOnServer + programVersionUrlEnd, urlRootOnServer + urlForProgramListUrlEnd); } /** * Initializes MAHAds library * @param activity Activity which init calls * @param urlForProgramVersion Url for program version * @param urlForProgramList Url for program list. In this case: urlRootOnServer will be set to the root of urlForProgramList */ public void init(@NonNull final FragmentActivity activity, Bundle savedInstanceState, @NonNull String urlForProgramVersion, @NonNull String urlForProgramList) { urls = new Urls(urlForProgramVersion, urlForProgramList, Utils.getRootFromUrl(urlForProgramList)); setInternalCalled(activity.getIntent().getBooleanExtra(Constants.MAH_ADS_INTERNAL_CALLED, false)); if (savedInstanceState != null) { Gson gson = new Gson(); mahRequestResult = gson.fromJson(savedInstanceState.getString("mahRequestResult"), MAHRequestResult.class); fontName = savedInstanceState.getString("fontName"); if(mahRequestResult != null){ //If mahRequestResult is exists in savedInstanceState then don't need do request service again. return; return; } } Updater.updateProgramList(activity, urls); } public void onSaveInstanceState(Bundle savedInstanceState){ Gson gson = new Gson(); savedInstanceState.putString("mahRequestResult", gson.toJson(mahRequestResult)); savedInstanceState.putString("fontName", fontName); } /** * Calls ExitDialog to open. If current dialog has opened through MAHAds dialogs * then application will quit not opening ExitDialog * @param activity Activity which method has called */ public void callExitDialog(FragmentActivity activity) { callExitDialog(activity, true, true); } /** * Calls ExitDialog to open. If current dialog has opened through MAHAds dialogs * then application will quit not opening ExitDialog * @param activity Activity which method has called * @param btnInfoVisibility If true shows info button * @param btnInfoWithMenu If true adds popup menu to info button */ public void callExitDialog(FragmentActivity activity, boolean btnInfoVisibility, boolean btnInfoWithMenu) { callExitDialog(activity, btnInfoVisibility, btnInfoWithMenu, activity.getString(R.string.mah_ads_info_popup_text), Constants.MAH_ADS_GITHUB_LINK); } /** * Calls ExitDialog to open. If current dialog has opened through MAHAds dialogs * then application will quit not opening ExitDialog * @param activity Activity which method has called * @param btnInfoVisibility If true shows info button * @param btnInfoWithMenu If true adds popup menu to info button * @param btnInfoMenuItemTitle Title of menu item for info button * @param btnInfoActionURL Url to open when clicking to info button or info menu item */ public void callExitDialog(FragmentActivity activity, boolean btnInfoVisibility, boolean btnInfoWithMenu, String btnInfoMenuItemTitle, @NonNull String btnInfoActionURL) { //When is internal call is true then exit dialog will not open. //It will be true only program opens through MAHAds components if(isInternalCalled()){ // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { MAHAdsDlgExit.MAHAdsDlgExitListener exitCallback = (MAHAdsDlgExit.MAHAdsDlgExitListener) activity; exitCallback.onExitWithoutExitDlg(); } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement MAHAdsDlgExitListener"); } }else{ showDlg(activity, MAHAdsDlgExit.newInstance(mahRequestResult, urls, fontName, btnInfoVisibility, btnInfoWithMenu, btnInfoMenuItemTitle, btnInfoActionURL), Constants.TAG_MAH_ADS_DLG_EXIT); } } /** * Calls ProgramsDialog to open * @param activity Activity which method has called */ public void callProgramsDialog(FragmentActivity activity) { callProgramsDialog(activity, true, true); } /** * Calls ProgramsDialog to open * @param activity Activity which method has called * @param btnInfoVisibility If true shows info button * @param btnInfoWithMenu If true adds popup menu to info button */ public void callProgramsDialog(FragmentActivity activity, boolean btnInfoVisibility, boolean btnInfoWithMenu) { callProgramsDialog(activity, btnInfoVisibility, btnInfoWithMenu, activity.getString(R.string.mah_ads_info_popup_text), Constants.MAH_ADS_GITHUB_LINK); } /** * Calls ProgramsDialog to open * @param activity Activity which method has called * @param btnInfoVisibility If true shows info button * @param btnInfoWithMenu If true adds popup menu to info button * @param btnInfoMenuItemTitle Title of menu item for info button * @param btnInfoActionURL Url to open when clicking to info button or info menu item */ public void callProgramsDialog(FragmentActivity activity, boolean btnInfoVisibility, boolean btnInfoWithMenu, String btnInfoMenuItemTitle, @NonNull String btnInfoActionURL) { showDlg(activity, MAHAdsDlgPrograms.newInstance(mahRequestResult, urls, fontName, btnInfoVisibility, btnInfoWithMenu, btnInfoMenuItemTitle, btnInfoActionURL), Constants.TAG_MAH_ADS_DLG_PROGRAMS); } static void showDlg(FragmentActivity activity, Fragment frag, String fragTag) { if (!activity.isFinishing()) { FragmentManager fragmentManager = activity.getSupportFragmentManager(); Fragment fr = fragmentManager.findFragmentByTag(fragTag); if (fr != null && !fr.isHidden()) { Log.i(Constants.LOG_TAG_MAH_ADS, "showDlg dismissed"); ((DialogFragment) fr).dismissAllowingStateLoss(); } FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.add(frag, fragTag); transaction.commitAllowingStateLoss(); } } public String getFontName() { return fontName; } public void setFontName(String fontName) { this.fontName = fontName; } private boolean isInternalCalled() { return internalCalled; } private void setInternalCalled(boolean internalCalled) { this.internalCalled = internalCalled; } public static void setMahRequestResult(MAHRequestResult mahRequestResult) { MAHAdsController.mahRequestResult = mahRequestResult; } }