package com.applicasa.ApplicasaManager; import java.io.IOException; import java.io.InputStream; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.ProgressBar; import android.widget.RelativeLayout; import applicasa.LiCore.Applicasa; import applicasa.LiCore.LiConfigInner; import applicasa.LiCore.LiErrorHandler; import applicasa.LiCore.LiErrorHandler.ApplicasaResponse; import applicasa.LiCore.LiFileCacher; import applicasa.LiCore.LiLogger; import applicasa.LiCore.communication.LiCallback.LiCallbackGetCachedFile; import applicasa.LiCore.promotion.sessions.LiEventManager.Actionkind; import applicasa.LiCore.promotion.sessions.LiPromotionCallback.LiPromotionAction; import applicasa.LiCore.promotion.sessions.LiPromotionCallback.LiPromotionResult; import applicasa.LiCore.promotion.sessions.LiPromotionCallback.LiPromotionResultCallback; import applicasa.LiJson.LiJSONException; import applicasa.kit.IAP.IAP.LiCurrency; import applicasa.kit.IAP.IAP.LiIapAction; import applicasa.kit.IAP.Callbacks.LiCallbackIAPPurchase; import applicasa.kit.IAP.Callbacks.LiCallbackVirtualCurrencyRequest; import applicasa.kit.IAP.Callbacks.LiCallbackVirtualGoodRequest; import applicasa.kit.IAP.Data.VirtualItem; import com.applicasa.Appia.LiAppiaManager; import com.applicasa.ThirdParty.ThirdPartyManager; import com.applicasa.Aarki.LiAarkiManager; import com.applicasa.Appnext.LiAppnextManager; import com.applicasa.Chartboost.LiChartboostManager; import com.applicasa.MMedia.LiMMediaManager; import com.applicasa.Promotion.Promotion; import com.applicasa.SponsorPay.LiSponsorPayManager; import com.applicasa.SupersonicAds.LiSupersonicAdsManager; import com.applicasa.TrialPay.TrialPayManager; import com.applicasa.User.User; import com.applicasa.VirtualCurrency.VirtualCurrency; import com.applicasa.VirtualGood.VirtualGood; public class LiSinglePromoDialog extends Dialog { private static final String TAG = "LiSinglePromoDialog"; Activity mActivity; Context mContext; private ImageView mExitButton; private LiSinglePromoDialog mPromoDialog; private Promotion mSinglePromo; FrameLayout mFrameLayout; RelativeLayout mRelativeLayout; ProgressBar mProgressBar; ImageButton mImageButton; RelativeLayout.LayoutParams rl; LiPromotionResultCallback mLiPromotionResultCallback; static boolean isMainDialog = true; static WebView offerWallWebView; String offerwallUrl; int height = 0; int width = 0; protected boolean isBackgroundAvailable = false; protected boolean isButtonAvailable = false; protected LiPromotionResult liPromotionResult; public LiSinglePromoDialog(final Activity activity, Promotion singlePromo, LiPromotionResultCallback liPromotionResultCallback) { super(activity, android.R.style.Theme_Translucent_NoTitleBar); mActivity = activity; mSinglePromo = singlePromo; mLiPromotionResultCallback = liPromotionResultCallback; mPromoDialog = this; isMainDialog = true; // Set's the padding of the Promo DisplayMetrics displaymetrics = new DisplayMetrics(); mActivity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); height = displaymetrics.heightPixels; width = displaymetrics.widthPixels; } /** * Loads all Promotion Data */ public void loadPromotion() { switch (mSinglePromo.PromotionActionKind) { case SUPERSONICADS: LiSupersonicAdsManager.getInstance().show(mActivity, mSinglePromo, mLiPromotionResultCallback); break; case APPNEXT: LiAppnextManager.getInstance().show(mActivity, mSinglePromo, mLiPromotionResultCallback); break; case SPONSORPAY: LiSponsorPayManager.getInstance().show(mActivity, mSinglePromo, mLiPromotionResultCallback); break; case MMEDIA: LiMMediaManager.getInstance().show(mActivity,mSinglePromo,mLiPromotionResultCallback); break; case CHARTBOOST: LiChartboostManager.getInstance().show(mActivity,mSinglePromo,mLiPromotionResultCallback); break; case AARKI: LiAarkiManager.getInstance().show(mActivity, mSinglePromo, mLiPromotionResultCallback); break; case APPIA: LiAppiaManager.getInstance().show(mActivity, mSinglePromo, mLiPromotionResultCallback); break; case TRIAL_PAY: if (!Applicasa.isOnline()) LiLogger.logError(TAG, "Cant display Trialpay Without Internet Connection"); else buildTrialPayPromotion(); break; default: buildRegularPromotion(); break; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } /** * Generate the Promotion layouts */ private void createPromoLayout() { /** * The base Layout */ mFrameLayout = new FrameLayout(getContext()); FrameLayout.LayoutParams fp = new FrameLayout.LayoutParams( /*FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT*/width,height); if (mSinglePromo.PromotionActionKind != Actionkind.TRIAL_PAY) mFrameLayout.setPadding(width/18, height/18, width/18, height/18); addContentView(mFrameLayout, fp); /** * Sets the layout of the promo - this layout's bg is the promo image */ mRelativeLayout = new RelativeLayout(getContext()); rl = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); mRelativeLayout.setBackgroundColor(000000); } /** * Generate the Action Button and adds to View */ private void createActionButton() { mImageButton = new ImageButton(getContext()); mImageButton.setAdjustViewBounds(true); RelativeLayout.LayoutParams btn_rl = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); btn_rl.addRule(RelativeLayout.CENTER_HORIZONTAL); btn_rl.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); mImageButton.setScaleType(ScaleType.FIT_CENTER); mImageButton.setAdjustViewBounds(true); mImageButton.setPadding(0, 0, 0, pxFromDp(40)); mImageButton.setBackgroundColor(00000000); mImageButton.setOnClickListener(clickHandler); mRelativeLayout.addView(mImageButton,btn_rl); } /** * Generate the Exit Button and adds to View */ private void createExitImage() { mExitButton = new ImageView(getContext()); RelativeLayout.LayoutParams btn_rl = new RelativeLayout.LayoutParams(pxFromDp(40),pxFromDp(40));//,width-20,height-20); btn_rl.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); try { AssetManager mngr = mActivity.getAssets(); // Create an input stream to read from the asset folder InputStream ins = mngr.open("x_btn.png"); // Convert the input stream into a bitmap Bitmap bitmap= BitmapFactory.decodeStream(ins); mExitButton.setScaleType(ScaleType.CENTER_CROP); mExitButton.setImageBitmap(bitmap); mExitButton.setClickable(true); } catch ( IOException e) { LiLogger.logError(LiSinglePromoDialog.class.getSimpleName(), "Failed Creating x_btn.png " +e.getMessage()); } mRelativeLayout.addView(mExitButton,btn_rl); mExitButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // updates analytics that the Promo was only viewed handleExit(); } }); } /** * Loads material asynchronously */ private void LoadRegularPromo() { LiLogger.logInfo("**** PromoAvailable ****", "Promo Type "+mSinglePromo.PromotionAppEvent.toString()+" "+mSinglePromo.PromotionAppEvent.getId()); // Load Materials LiFileCacher.getBitmapFromCache(mSinglePromo.PromotionImage, new LiCallbackGetCachedFile() { public void onSuccessfull(InputStream is) { } public void onFailure(LiErrorHandler error) { LiLogger.logError("Promo Adapter", "Source not found"); mPromoDialog.dismiss(); } public void onSuccessfullBitmap(Bitmap bitmap) { // = new BitmapDrawable(bitmap); Drawable dr = new BitmapDrawable(mActivity.getResources(),bitmap); mRelativeLayout.setBackgroundDrawable(dr); // indicates bg is ready isBackgroundAvailable = true; showPromo(); } }); LiFileCacher.getBitmapFromCache(mSinglePromo.PromotionButton, new LiCallbackGetCachedFile() { public void onSuccessfull(InputStream is) { } public void onFailure(LiErrorHandler error) { LiLogger.logError("Promo Adapter", "Source not found"); mPromoDialog.dismiss(); } public void onSuccessfullBitmap(Bitmap bitmap) { LiLogger.logInfo("Promo Adapter", "Source found"); mImageButton.setImageBitmap(bitmap); mImageButton.setVisibility(View.VISIBLE); mImageButton.setClickable(true); // indicate Button is ready isButtonAvailable = true; showPromo(); } }); } /** * Loads material asynchronously */ private void LoadTrialPayPromo() { if (!ThirdPartyManager.validatePermissions(mSinglePromo , mActivity)) { mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Failed, LiPromotionResult.PromotionResultTrialPay, "Missing Activity/permission declartion in manifest file"); return; } LiLogger.logDebug("**** PromoAvailable ****", "Promo Type "+mSinglePromo.PromotionAppEvent.toString()+" "+mSinglePromo.PromotionAppEvent.getId()); offerWallWebView = new WebView(mActivity); StringBuilder link = new StringBuilder(); try { if (mSinglePromo.PromotionActionData.has("link")) { // promotion structure link.append(mSinglePromo.PromotionActionData.getString("link")); } } catch (LiJSONException e) { // TODO Auto-generated catch block LiLogger.logError(TAG, "TrialPay: No link available", e); } if (link != null && link.length() != 0) { String userId = User.getCurrentUser().UserID; String deviceInfo = TrialPayManager.getTrialPayDeviceInfo(); link.append("sid="+userId+"&Promotion="+mSinglePromo.PromotionID+"&IsSandbox="+(LiConfigInner.isSandbox()?"true":"false")+"&"+deviceInfo); final RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); mRelativeLayout.setLayoutParams(params); mRelativeLayout.addView(offerWallWebView,params); offerWallWebView.getSettings().setJavaScriptEnabled(true); offerWallWebView.getSettings().setUseWideViewPort(true); offerWallWebView.getSettings().setLoadWithOverviewMode(true); offerWallWebView.getSettings().setBuiltInZoomControls(true); offerWallWebView.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY); offerWallWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("http")) { view.loadUrl(url); } else { if (url.startsWith("tpbow")) { url = url.substring(5); } Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); mActivity.startActivity( intent ); } return true; } public void onPageFinished(WebView view, String url) { if (offerwallUrl == null && url.contains("tp_base_page=1")) { offerwallUrl = url; } if (!isMainDialog) { return; } /** * Create the Exit Image */ isMainDialog = false; createExitImage(); showPromo(); } }); LiLogger.logDebug(LiSinglePromoDialog.class.getSimpleName(), "Opening url: "+link.toString()); offerWallWebView.loadUrl(link.toString()); } } /** * When material are available * removes the spinner and add the promotion View */ protected void showPromo() { if ((isBackgroundAvailable && isButtonAvailable) || mSinglePromo.PromotionActionKind == Actionkind.TRIAL_PAY) { mFrameLayout.removeView(mRelativeLayout); mFrameLayout.addView(mRelativeLayout, rl); show(); } } /** * * Display Promotion Builders * * */ private void buildRegularPromotion() { /** * Call to create the layouts */ createPromoLayout(); /** * Sets the Promos Button */ createActionButton(); /** * Create the Exit Image */ createExitImage(); /** * Loads the promotion materials */ LoadRegularPromo(); } private void buildTrialPayPromotion() { if (offerWallWebView != null) return; /** * Call to create the layouts */ createPromoLayout(); /** * add Spinner */ // addSpinner(); /** * Loads the promotion Url and open the webView */ LoadTrialPayPromo(); } View.OnClickListener clickHandler = new View.OnClickListener() { public void onClick(View v) { try { boolean result = true; mSinglePromo.updateViewUseCount( 1, 1); switch (mSinglePromo.PromotionActionKind) { case NULL: break; case NOTHING: if (mLiPromotionResultCallback != null) mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Succeded, LiPromotionResult.PromotionResultNothing, null); mPromoDialog.dismiss(); break; case LINK: String link = null; if (mSinglePromo.PromotionActionData.has("link_Android")) { // Open android link link = mSinglePromo.PromotionActionData.getString("link_Android"); } else if (mSinglePromo.PromotionActionData.has("link_iOS")) { // case no Android link return iOS link link = mSinglePromo.PromotionActionData.getString("link_iOS"); } else if (mSinglePromo.PromotionActionData.has("link")) { // old promotion structure link = mSinglePromo.PromotionActionData.getString("link"); } if (link != null) { if (!link.startsWith("http://") && !link.startsWith("https://") ) link = "http://"+link; Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); mActivity.startActivity(webIntent); } if (mLiPromotionResultCallback != null) mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Succeded, LiPromotionResult.PromotionResultLinkOpened, link); mPromoDialog.dismiss(); break; case STRING: // The promotion text is retrieved String text = null; if (mSinglePromo.PromotionActionData.has("string_Android")) { // return Android String text = mSinglePromo.PromotionActionData.getString("string_Android"); } else if (mSinglePromo.PromotionActionData.has("string_iOS")) { // case no Android String return iOS String as default text = mSinglePromo.PromotionActionData.getString("string_iOS"); } else if (mSinglePromo.PromotionActionData.has("string")) { // Old structure text = mSinglePromo.PromotionActionData.getString("string"); } if (mLiPromotionResultCallback != null) mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Succeded, LiPromotionResult.PromotionResultStringInfo, text); mPromoDialog.dismiss(); break; case GIVE_VC: int amount = mSinglePromo.PromotionActionData.getInt("amount"); int vcKind = mSinglePromo.PromotionActionData.getInt("virtualCurrencyKind"); liPromotionResult = (LiCurrency.values()[vcKind] == LiCurrency.MainCurrency)? LiPromotionResult.PromotionResultGiveMainCurrencyVirtualCurrency:LiPromotionResult.PromotionResultGiveSeconedaryCurrencyVirtualCurrency; LiStore.giveVirtualCurrency(amount, LiCurrency.values()[vcKind], virualCurrencyCallback); break; case GIVE_VG: String id= mSinglePromo.PromotionActionData.getString("_id"); VirtualGood item = LiStore.getVirtualGoodById(id); liPromotionResult = LiPromotionResult.PromotionResultGiveVirtualGood; LiStore.giveVirtualGoods(item, 1 ,virtualGoodCallback ); break; case DEAL_VC: id= mSinglePromo.PromotionActionData.getString("_id"); VirtualCurrency itemVC = LiStore.getVirtualCurrencyDealById(id); liPromotionResult = (itemVC.VirtualCurrencyKind==LiCurrency.MainCurrency)?LiPromotionResult.PromotionResultDealMainVirtualCurrency: LiPromotionResult.PromotionResultDealSeconedaryVirtualCurrency; result = LiStore.buyVirtualCurrency(mActivity, itemVC, virtualCurrencyPurchaseCallback ); break; case DEAL_VG: id= mSinglePromo.PromotionActionData.getString("_id"); item = LiStore.getVirtualGoodDealById(id); liPromotionResult = LiPromotionResult.PromotionResultDealVirtualGood; if (item.VirtualGoodIsStoreItem) result = LiStore.buyVirtualGoods(mActivity, item, virtualCurrencyPurchaseCallback); else result = LiStore.buyVirtualGoods(item, 1, (item.VirtualGoodMainCurrency!=0) ? LiCurrency.MainCurrency:LiCurrency.SencondaryCurrency, virtualGoodCallback ); break; } } catch (LiJSONException e) { LiLogger.logError(LiSinglePromoDialog.class.getSimpleName(), "Failed generating Promotion action "+e.getMessage()); } } }; /** * Handles Back key event * Closes the dialog and update View analytics */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.d(this.getClass().getName(), "back button pressed"); if (keyCode == KeyEvent.KEYCODE_BACK && (offerWallWebView!= null && offerWallWebView.getVisibility() == WebView.VISIBLE)) { this.goBack(keyCode, event); return true; } else if ((keyCode == KeyEvent.KEYCODE_BACK)) { Log.d(this.getClass().getName(), "back button pressed Existing"); handleExit(); } return super.onKeyDown(keyCode, event); } private void goBack(int keyCode, KeyEvent event) { if (offerWallWebView.canGoBack()) { offerWallWebView.goBack(); } else { offerWallWebView = null; onKeyDown(keyCode, event); } } /** * Handles Exist * whether when pressing back button or the exit button */ protected void handleExit() { mSinglePromo.updateViewUseCount(1, 0); if (mLiPromotionResultCallback != null) { if (mSinglePromo.PromotionActionKind == Actionkind.TRIAL_PAY) mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Succeded, LiPromotionResult.PromotionResultTrialPay, null); else mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Cancelled, LiPromotionResult.PromotionResultNothing, null); } offerWallWebView = null; LiSinglePromoDialog.this.mPromoDialog.dismiss(); } /** * Convert from dp to pixel * @param dp * @return */ private int pxFromDp(float dp) { return (int) (dp * this.getContext().getResources().getDisplayMetrics().density); } LiCallbackVirtualGoodRequest virtualGoodCallback = new LiCallbackVirtualGoodRequest() { @Override public void onActionFinisedSuccessfully(LiIapAction liIapAction, VirtualGood item) { // TODO Auto-generated method stub if (mLiPromotionResultCallback != null) mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Succeded, liPromotionResult, item); mPromoDialog.mPromoDialog.dismiss(); } @Override public void onActionFailed(LiIapAction liIapAction, VirtualGood item, LiErrorHandler errors) { // TODO Auto-generated method stub if (mLiPromotionResultCallback != null) mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Failed, liPromotionResult, item); mPromoDialog.mPromoDialog.dismiss(); } }; LiCallbackVirtualCurrencyRequest virualCurrencyCallback = new LiCallbackVirtualCurrencyRequest() { @Override public void onActionFinisedSuccessfully(LiIapAction liIapAction, int coins, LiCurrency licurrency) { // TODO Auto-generated method stub if (mLiPromotionResultCallback != null) mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Succeded,liPromotionResult, coins); mPromoDialog.dismiss(); } @Override public void onActionFailed(LiIapAction liIapAction, int coins, LiCurrency licurrency, LiErrorHandler errors) { // TODO Auto-generated method stub if (mLiPromotionResultCallback != null) mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Failed,liPromotionResult, coins); mPromoDialog.mPromoDialog.dismiss(); } }; LiCallbackIAPPurchase virtualCurrencyPurchaseCallback = new LiCallbackIAPPurchase() { @Override public void onActionFinisedSuccessfully(LiIapAction liIapAction, VirtualItem item) { // TODO Auto-generated method stub if (mLiPromotionResultCallback != null) mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Succeded,liPromotionResult, (item.vcItem != null)?item.vcItem:item.vgItem); mPromoDialog.dismiss(); } @Override public void onActionFailed(LiIapAction liIapAction, VirtualItem item, LiErrorHandler errors) { // TODO Auto-generated method stub if (mLiPromotionResultCallback != null) { if (errors.errorType == ApplicasaResponse.PURCHASED_CANCELED) mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Cancelled,liPromotionResult, (item.vcItem != null)?item.vcItem:item.vgItem); else mLiPromotionResultCallback.onPromotionResultCallback(LiPromotionAction.Failed,liPromotionResult, (item.vcItem != null)?item.vcItem:item.vgItem); } mPromoDialog.dismiss(); } }; }