package com.aptoide.amethyst; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.RatingBar; import android.widget.TextView; import android.widget.Toast; import com.amazon.insights.ABTestClient; import com.amazon.insights.AmazonInsights; import com.amazon.insights.Event; import com.amazon.insights.EventClient; import com.amazon.insights.InsightsCallback; import com.amazon.insights.InsightsCredentials; import com.amazon.insights.Variation; import com.amazon.insights.VariationSet; import com.amazon.insights.error.InsightsError; import com.aptoide.amethyst.database.AptoideDatabase; import com.aptoide.amethyst.downloadmanager.model.Download; import com.aptoide.amethyst.utils.AptoideUtils; import com.aptoide.amethyst.utils.Logger; import com.aptoide.amethyst.utils.ReferrerUtils; import com.aptoide.amethyst.utils.SimpleFuture; import com.aptoide.amethyst.webservices.json.GetApkInfoJson; import com.aptoide.amethyst.webservices.v2.GetAdsRequest; import com.aptoide.models.ApkSuggestionJson; import com.bumptech.glide.Glide; import com.octo.android.robospice.SpiceManager; import com.octo.android.robospice.persistence.exception.SpiceException; import com.octo.android.robospice.request.listener.RequestListener; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import com.aptoide.amethyst.webservices.GetApkInfoRequestFromId; import static com.aptoide.dataprovider.webservices.models.Constants.AD_ID_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.APPNAME_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.APP_ID_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.CPC_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.CPI_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.DOWNLOAD_FROM_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.FROM_SPONSORED_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.KEYWORD_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.LOCATION_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.PACKAGENAME_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.PARTNER_CLICK_URL_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.PARTNER_EXTRA; import static com.aptoide.dataprovider.webservices.models.Constants.PARTNER_TYPE_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.STOREID_KEY; import static com.aptoide.dataprovider.webservices.models.Constants.WHERE_FROM_KEY; /** * Created by neuro on 01-10-2015. */ public class AppViewMiddleSuggested { List<View.OnClickListener> buttonListeners = new ArrayList<>(3); List<String> installButtonLabel = new ArrayList<>(3); String[] referrer = new String[1]; final SpiceManager spiceManager; // Variável de controlo para coordenação entre webservice e amazon responses. Quando a true, é suposto desenhar a view. boolean control = false; AppViewActivity context; // Temp // public static EventClient eventClient; int middleAppViewVariant = 1; // Add helpers private String click_url; private long id; private long adId; private void onLoadMiddleAppViewEvent(AmazonInsights insightsInstance) { ABTestClient abClient = insightsInstance.getABTestClient(); eventClient = insightsInstance.getEventClient(); // Allocate/obtain variations for cm.aptoide.pt abClient.getVariations("cm.aptoide.pt") .setCallback(new InsightsCallback<VariationSet>() { @Override public void onComplete(VariationSet variations) { final Variation variation = variations.getVariation("cm.aptoide.pt"); middleAppViewVariant = variation.getVariableAsInt("Middle App View Behavior", 3); Logger.d("amazonABVariant", Integer.toString(middleAppViewVariant)); informInfoReady(); } @Override public void onError(final InsightsError error) { // base class will record the error to log cat super.onError(error); // do any additional handling (if needed) if insights could not allocate any variations } }); // Create a visit event when the user starts Middle App View Event. Event middleAppViewVariantStart = eventClient.createEvent("Middle App View Event"); // Record the visit event. eventClient.recordEvent(middleAppViewVariantStart); eventClient.submitEvents(); } private void informInfoReady() { if (control) { context.runOnUiThread(new Runnable() { @Override public void run() { // TODO find memory leak if (view == null) { return; } View button = view.findViewById(R.id.btinstall); // TODO find memory leak if (button == null) { return; } button.setOnClickListener(buttonListeners.get(middleAppViewVariant - 1)); ((Button) button).setText(installButtonLabel.get(middleAppViewVariant - 1)); button.setVisibility(View.VISIBLE); view.setVisibility(View.VISIBLE); } }); } else { control = true; } } View view; public AppViewMiddleSuggested(final AppViewActivity context, final View view, final SpiceManager spiceManager, long appId, final String packageName, List<String> keywords) { this.context = context; this.view = view; this.spiceManager = spiceManager; // Apagar, amazon InsightsCredentials credentials = AmazonInsights.newCredentials( BuildConfig.AMAZON_PUBLIC_KEY, BuildConfig.AMAZON_PRIVATE_KEY); // Initialize a new instance of AmazonInsights specifically for your application. // The AmazonInsights library requires the Android context in order to access // Android services (i.e. SharedPrefs, etc) AmazonInsights insightsInstance = AmazonInsights.newInstance(credentials, context.getApplicationContext()); onLoadMiddleAppViewEvent(insightsInstance); GetAdsRequest getAdsRequest = new GetAdsRequest(packageName, true); getAdsRequest.setLocation("middleappview"); getAdsRequest.setKeyword(AptoideUtils.StringUtils.join(keywords, ",") + "," + "__null__"); getAdsRequest.setLimit(1); spiceManager.execute(getAdsRequest, Long.toString(appId), 10 * 60 * 1000, new RequestListener<ApkSuggestionJson>() { @Override public void onRequestFailure(SpiceException spiceException) { } @Override public void onRequestSuccess(final ApkSuggestionJson apkSuggestionJson) { try { if (apkSuggestionJson.getAds().size() == 0) { return; } if (apkSuggestionJson.getAds().get(0).getData().getPackageName().equals(packageName)) { return; } if (apkSuggestionJson.getAds().get(0).getPartner() == null) { return; } if (apkSuggestionJson.getAds().get(0).getPartner().getPartnerData() == null) { return; } click_url = apkSuggestionJson.getAds().get(0).getPartner().getPartnerData().getClick_url(); String name = apkSuggestionJson.getAds().get(0).getData().getName(); String developer = apkSuggestionJson.getAds().get(0).getData().developer; float size1 = apkSuggestionJson.getAds().get(0).getData().getSize().floatValue() / 1024 / 1024; String description1 = apkSuggestionJson.getAds().get(0).getData().description; final String repo = apkSuggestionJson.getAds().get(0).getData().getRepo(); final String adPackageName = apkSuggestionJson.getAds().get(0).getData().getPackageName(); id = apkSuggestionJson.getAds().get(0).getData().getId().longValue(); adId = apkSuggestionJson.getAds().get(0).getInfo().getAd_id(); float rating = apkSuggestionJson.getAds().get(0).getData().getStars().floatValue(); String cpc = apkSuggestionJson.getAds().get(0).getInfo().getCpc_url(); String cpi = apkSuggestionJson.getAds().get(0).getInfo().getCpi_url(); prepareABTestingVariables(context, name, apkSuggestionJson); DecimalFormat df = new DecimalFormat("0.00"); ((TextView) view.findViewById(R.id.app_name)).setText(name); ((TextView) view.findViewById(R.id.size_value)).setText(df.format(size1) + " MB"); ((TextView) view.findViewById(R.id.description)).setText(description1); ((RatingBar) view.findViewById(R.id.rating_label)).setRating(rating); ImageView imageView = (ImageView) view.findViewById(R.id.app_icon); String imagePath = apkSuggestionJson.getAds().get(0).getData().getIcon(); imageView.setImageDrawable(null); Glide.with(context).load(imagePath).into(imageView); String md5 = apkSuggestionJson.getAds().get(0).getData().getMd5sum(); setListener(apkSuggestionJson); informInfoReady(); } catch (Exception e) { e.printStackTrace(); } } private void setListener(final ApkSuggestionJson apkSuggestionJson) { View relativeLayout = view.findViewById(R.id.apkinfoheader); relativeLayout.setClickable(true); relativeLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(context, AppViewActivity.class); fillAppViewActivityIntent(i, apkSuggestionJson); context.startActivity(i); } }); } }); } private void fillAppViewActivityIntent(Intent i, ApkSuggestionJson apkSuggestionJson) { i.putExtra(APP_ID_KEY, apkSuggestionJson.getAds().get(0).getData().getId().longValue()); i.putExtra(APPNAME_KEY, apkSuggestionJson.getAds().get(0).getData().getName()); i.putExtra(AD_ID_KEY, apkSuggestionJson.getAds().get(0).getInfo().getAd_id()); i.putExtra(PACKAGENAME_KEY, apkSuggestionJson.getAds().get(0).getData().getPackageName()); i.putExtra(STOREID_KEY, apkSuggestionJson.getAds().get(0).getData().getRepo()); i.putExtra(FROM_SPONSORED_KEY, true); i.putExtra(LOCATION_KEY, "middleappview"); i.putExtra(KEYWORD_KEY, "__NULL__"); i.putExtra(CPC_KEY, apkSuggestionJson.getAds().get(0).getInfo().getCpc_url()); i.putExtra(CPI_KEY, apkSuggestionJson.getAds().get(0).getInfo().getCpi_url()); i.putExtra(WHERE_FROM_KEY, "sponsored"); i.putExtra(DOWNLOAD_FROM_KEY, "middle_app_view"); if (apkSuggestionJson.getAds().get(0).getPartner() != null) { Bundle bundle = new Bundle(); bundle.putString(PARTNER_TYPE_KEY, apkSuggestionJson.getAds().get(0).getPartner().getPartnerInfo().getName()); bundle.putString(PARTNER_CLICK_URL_KEY, apkSuggestionJson.getAds().get(0).getPartner().getPartnerData().getClick_url()); i.putExtra(PARTNER_EXTRA, bundle); } } private void prepareABTestingVariables(final AppViewActivity context, final String label, final ApkSuggestionJson apkSuggestionJson) { // Use Cases: // // 1 - Muda para AppViewActivity apenas. // 2 - Muda para AppViewActivity e inicia o download automáticamente. // 3 - Inicia o download em background sem sair da AppViewActivity. View.OnClickListener onClickListener1 = new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(context, AppViewActivity.class); AppViewMiddleSuggested.this.fillAppViewActivityIntent(i, apkSuggestionJson); new AptoideDatabase(Aptoide.getDb()).addToAmazonABTesting(apkSuggestionJson.getAds().get(0).getData().packageName); context.startActivity(i); } }; View.OnClickListener onClickListener2 = new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(context, AppViewActivity.class); AppViewMiddleSuggested.this.fillAppViewActivityIntent(i, apkSuggestionJson); i.putExtra("forceAutoDownload", true); new AptoideDatabase(Aptoide.getDb()).addToAmazonABTesting(apkSuggestionJson.getAds().get(0).getData().packageName); context.startActivity(i); } }; View.OnClickListener onClickListener3 = new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { int md5sumHash = apkSuggestionJson.getAds().get(0).getData().getMd5sum().hashCode(); String packageName = apkSuggestionJson.getAds().get(0).getData().getPackageName(); AptoideUtils.AdNetworks.knock(apkSuggestionJson.getAds().get(0).getInfo().getCpc_url()); AptoideUtils.AdNetworks.knock(apkSuggestionJson.getAds().get(0).getInfo().getCpd_url()); ReferrerUtils.extractReferrer(apkSuggestionJson.getAds().get(0), spiceManager); context.runOnUiThread(new Runnable() { @Override public void run() { view.findViewById(R.id.btinstall).setEnabled(false); } }); GetApkInfoRequestFromId getApkInfoRequestFromId = new GetApkInfoRequestFromId(context); getApkInfoRequestFromId.setAppId(Long.toString(id)); spiceManager.execute(getApkInfoRequestFromId, new RequestListener<GetApkInfoJson>() { @Override public void onRequestFailure(SpiceException spiceException) { try { // on a try/catch block because the Activity may not be already visible Toast.makeText(context, "Error retrieving apk info.", Toast.LENGTH_SHORT).show(); } catch (Exception ignored) {} } @Override public void onRequestSuccess(GetApkInfoJson getApkInfoJson) { if (!getApkInfoJson.getStatus().equals("OK")) { return; } Download download = new Download(); GetApkInfoJson.Apk apk = getApkInfoJson.getApk(); download.setId(apk.getId().longValue()); download.setName(label); download.setVersion(apk.getVername()); download.setIcon(apk.getIcon()); download.setPackageName(apk.packageName); download.setMd5(apk.getMd5sum()); download.setCpiUrl(apkSuggestionJson.getAds().get(0).getInfo().getCpi_url()); download.setReferrer(referrer[0]); context.getService().startDownloadFromJson(getApkInfoJson, id, download); } }); new AptoideDatabase(Aptoide.getDb()).addToAmazonABTesting(apkSuggestionJson.getAds().get(0).getData().packageName); } }).start(); } }; buttonListeners.add(onClickListener1); buttonListeners.add(onClickListener2); buttonListeners.add(onClickListener3); // Button Label installButtonLabel.add(context.getString(R.string.abTest1_label_1)); installButtonLabel.add(context.getString(R.string.abTest1_label_2)); installButtonLabel.add(context.getString(R.string.abTest1_label_3)); } }