package com.aptoide.amethyst.receivers;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.text.TextUtils;
import com.amazon.insights.AmazonInsights;
import com.amazon.insights.Event;
import com.amazon.insights.EventClient;
import com.amazon.insights.InsightsCredentials;
import com.aptoide.amethyst.Aptoide;
import com.aptoide.amethyst.BuildConfig;
import com.aptoide.amethyst.analytics.Analytics;
import com.aptoide.amethyst.data_provider.getAds.GetAdsRequestListener;
import com.aptoide.amethyst.database.AptoideDatabase;
import com.aptoide.amethyst.events.BusProvider;
import com.aptoide.amethyst.events.OttoEvents;
import com.aptoide.amethyst.utils.AptoideUtils;
import com.aptoide.amethyst.utils.Logger;
import com.aptoide.amethyst.webservices.v2.GetAdsRequest;
import com.aptoide.dataprovider.AptoideSpiceHttpService;
import com.aptoide.dataprovider.AptoideSpiceHttpServicePermanent;
import com.aptoide.dataprovider.webservices.models.UpdatesApi;
import com.aptoide.models.RollBackItem;
import com.octo.android.robospice.SpiceManager;
import java.util.Locale;
import com.aptoide.amethyst.AppViewMiddleSuggested;
import com.aptoide.amethyst.utils.ReferrerUtils;
import com.aptoide.amethyst.utils.SimpleFuture;
/**
* Created by rmateus on 13-12-2013.
*/
public class InstalledBroadcastReceiver extends BroadcastReceiver {
protected SpiceManager spiceManager = new SpiceManager(AptoideSpiceHttpServicePermanent.class);
@Override
public void onReceive(final Context context, final Intent intent) {
Logger.d("InstalledBroadcastReceiver", "intent=" + intent.getAction() + ", extra replaced=" + intent.getBooleanExtra(Intent.EXTRA_REPLACING, false));
spiceManager.start(context);
boolean referrerInjected;
final AptoideDatabase db = new AptoideDatabase(Aptoide.getDb());
if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
replaceAppEvent(context, db, intent.getData().getEncodedSchemeSpecificPart());
} else if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
referrerInjected = installAppEvent(context, db, intent.getBooleanExtra(Intent.EXTRA_REPLACING, false), intent.getData()
.getEncodedSchemeSpecificPart());
if (!referrerInjected) {
tryToReferrer(context, intent.getData().getEncodedSchemeSpecificPart(), "secondinstall");
}
} else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
uninstallAppEvent(intent.getData().getEncodedSchemeSpecificPart(), db, intent.getBooleanExtra(Intent.EXTRA_REPLACING, false), intent.getData().getEncodedSchemeSpecificPart());
}
}
private void tryToReferrer(final Context context, final String packageName, String location) {
Logger.d("InstalledBroadcastReceiver", "try to referrer " + packageName + " from " + location);
// TODO: Este simplefuture não faz falta aqui, para futura refactorização.
spiceManager.execute(GetAdsRequest.newDefaultRequest(location, packageName), GetAdsRequestListener.withBroadcast(context, packageName, spiceManager,
new SimpleFuture<String>(), 2));
};
;
private boolean assertNotNull(Object... objects) {
for (Object o : objects) {
if (o == null) {
return false;
}
}
return true;
}
/**
* this method update DB when an App is replaced
*
* @param context
* @param db Db to be updated
* @param replaceEvent
*/
private void replaceAppEvent(Context context, AptoideDatabase db, String replaceEvent) {
db.confirmRollBackAction(replaceEvent, RollBackItem.Action.UPDATING.toString(), RollBackItem.Action.UPDATED.toString());
Logger.d("InstalledBroadcastReceiver", "Updated rollback action");
try {
PackageManager mPm = context.getPackageManager();
PackageInfo pkg = mPm.getPackageInfo(replaceEvent, PackageManager.GET_SIGNATURES);
UpdatesApi.Package aPackage = new UpdatesApi.Package();
aPackage.signature = AptoideUtils.Algorithms.computeSHA1sumFromBytes(pkg.signatures[0].toByteArray()).toUpperCase(Locale.ENGLISH);
aPackage.vercode = pkg.versionCode;
aPackage.packageName = pkg.packageName;
db.insertInstalled(aPackage);
Logger.d("AptoideUpdates", "Inserting " + aPackage.packageName);
Analytics.ApplicationInstall.replaced(pkg.packageName);
} catch (Exception e) {
Logger.printException(e);
}
}
/**
* this method update DB when an App is installed
* @param context
* @param db database to update
* @param replacing true if was followed by ACTION_PACKAGE_REMOVED broadcast for the same package
* @param installEvent
*/
private boolean installAppEvent(Context context, AptoideDatabase db, boolean replacing, String installEvent) {
boolean control = false;
try {
PackageManager mPm = context.getPackageManager();
PackageInfo pkg = mPm.getPackageInfo(installEvent, PackageManager.GET_SIGNATURES);
UpdatesApi.Package aPackage = new UpdatesApi.Package();
aPackage.signature = AptoideUtils.Algorithms.computeSHA1sumFromBytes(pkg.signatures[0].toByteArray()).toUpperCase(Locale.ENGLISH);
aPackage.vercode = pkg.versionCode;
aPackage.packageName = pkg.packageName;
db.insertInstalled(aPackage);
Logger.d("AptoideUpdates", "Inserting " + aPackage.packageName);
db.deleteScheduledDownloadByPackageName(installEvent);
BusProvider.getInstance().post(new OttoEvents.InstalledApkEvent());
if (!replacing) {
String action = db.getNotConfirmedRollbackAction(pkg.packageName);
if (action != null) {
final String referrer;
if (action.contains("|")) {
referrer = action.split("\\|")[1];
} else {
referrer = "";
}
if (action.split("\\|")[0].equals(RollBackItem.Action.INSTALLING.toString())) {
Logger.d("InstalledBroadcastReceiver", "Installed rollback action");
db.confirmRollBackAction(pkg.packageName, action, RollBackItem.Action.INSTALLED.toString());
if (!TextUtils.isEmpty(referrer)) {
ReferrerUtils.broadcastReferrer(context, installEvent, referrer);
Analytics.ApplicationInstall.installed(pkg.packageName, true);
control = true;
} else {
Analytics.ApplicationInstall.installed(pkg.packageName, false);
}
processAbTesting(context, mPm, installEvent, db);
} else if (action.split("\\|")[0].equals(RollBackItem.Action.DOWNGRADING.toString())) {
db.confirmRollBackAction(pkg.packageName, action, RollBackItem.Action.DOWNGRADED.toString());
Logger.d("InstalledBroadcastReceiver", "Downgraded rollback action");
Analytics.ApplicationInstall.downgraded(pkg.packageName);
Analytics.Rollback.downgraded();
}
}
}
BusProvider.getInstance().post(new OttoEvents.InstalledApkEvent());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && context.getPackageManager().getInstallerPackageName(installEvent) == null) {
context.getPackageManager().setInstallerPackageName(installEvent, context.getPackageName());
}
} catch (Exception e) {
Logger.printException(e);
}
return control;
}
private void processAbTesting(Context context, PackageManager mPm, String installEvent, AptoideDatabase db) {
try {
// System.out.println("Debug: AB Testing: " + intent.getData().getEncodedSchemeSpecificPart());
final PackageInfo pkg = mPm.getPackageInfo(installEvent, PackageManager.GET_SIGNATURES);
// System.out.println("Debug: AB Testing: " + pkg.packageName);
// System.out.println("Debug: AB Testing: " + db.isAmazonABTesting(pkg.packageName));
if (db.isAmazonABTesting(pkg.packageName)) {
InsightsCredentials credentials = AmazonInsights.newCredentials(BuildConfig.AMAZON_PUBLIC_KEY, BuildConfig.AMAZON_PRIVATE_KEY);
AmazonInsights insightsInstance = AmazonInsights.newInstance(credentials, context.getApplicationContext());
EventClient eventClient = insightsInstance.getEventClient();
eventClient = AppViewMiddleSuggested.eventClient;
// Create an event Event
Event installedApplication = eventClient.createEvent("Application Installed");
// Record an event
eventClient.recordEvent(installedApplication);
eventClient.submitEvents();
final EventClient finalEventClient = eventClient;
new Thread(new Runnable() {
@Override
public void run() {
try {
// Intervalo minimo entre pedidos amazon :/
Thread.sleep(61000);
finalEventClient.submitEvents();
} catch (Exception e) {
}
}
}).start();
db.deleteAmazomABTesting(pkg.packageName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* this method update DB when an app is uninstalled
*
* @param packageName of uninstalled app
* @param db database to update
* @param replacing true if was followed by ACTION_PACKAGE_REMOVED broadcast for the same package
* @param uninstallEvent
*/
private void uninstallAppEvent(String packageName, AptoideDatabase db, boolean replacing, String uninstallEvent) {
db.deleteInstalledApk(packageName);
Logger.d("AptoideUpdates", "Deleting " + packageName);
BusProvider.getInstance().post(new OttoEvents.UnInstalledApkEvent(packageName));
if (!replacing) {
String action = db.getNotConfirmedRollbackAction(packageName);
if (action != null && action.equals(RollBackItem.Action.UNINSTALLING.toString())) {
db.confirmRollBackAction(packageName, action, RollBackItem.Action.UNINSTALLED.toString());
Logger.d("InstalledBroadcastReceiver", "uninstalled rollback action");
}
BusProvider.getInstance().post(new OttoEvents.UnInstalledApkEvent(uninstallEvent));
}
}
}