package com.appboy.sample;
import android.annotation.TargetApi;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.StrictMode;
import android.util.Log;
import com.appboy.Appboy;
import com.appboy.Constants;
import com.appboy.configuration.AppboyConfig;
import com.appboy.sample.util.EmulatorDetectionUtils;
import com.appboy.support.AppboyLogger;
import com.appboy.support.StringUtils;
import com.appboy.ui.support.FrescoLibraryUtils;
import com.facebook.drawee.backends.pipeline.Fresco;
import java.util.Arrays;
public class DroidboyApplication extends Application {
private static final String TAG = String.format("%s.%s", Constants.APPBOY_LOG_TAG_PREFIX, DroidboyApplication.class.getName());
protected static final String OVERRIDE_API_KEY_PREF_KEY = "override_api_key";
protected static final String OVERRIDE_ENDPOINT_PREF_KEY = "override_endpoint_url";
private static String sOverrideApiKeyInUse;
@Override
public void onCreate() {
super.onCreate();
if (BuildConfig.DEBUG) {
activateStrictMode();
}
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(getString(R.string.shared_prefs_location), MODE_PRIVATE);
disableNetworkRequestsIfConfigured(sharedPreferences);
// Clear the configuration cache with null
Appboy.configure(this, null);
AppboyConfig.Builder appboyConfigBuilder = new AppboyConfig.Builder();
setOverrideApiKeyIfConfigured(sharedPreferences, appboyConfigBuilder);
Appboy.configure(this, appboyConfigBuilder.build());
String overrideEndpointUrl = sharedPreferences.getString(OVERRIDE_ENDPOINT_PREF_KEY, null);
Appboy.setAppboyEndpointProvider(new DroidboyEndpointProvider(overrideEndpointUrl));
Appboy.setCustomAppboyNotificationFactory(new DroidboyNotificationFactory());
int logLevel = getApplicationContext().getSharedPreferences(getString(R.string.log_level_dialog_title), Context.MODE_PRIVATE)
.getInt(getString(R.string.current_log_level), Log.VERBOSE);
AppboyLogger.setLogLevel(logLevel);
if (FrescoLibraryUtils.canUseFresco(getApplicationContext())) {
Fresco.initialize(getApplicationContext());
}
}
private void activateStrictMode() {
StrictMode.ThreadPolicy.Builder threadPolicyBuilder = new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog();
StrictMode.VmPolicy.Builder vmPolicyBuilder = new StrictMode.VmPolicy.Builder()
.detectAll()
.penaltyLog();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
addDetectLeakedClosableObjects(vmPolicyBuilder);
}
StrictMode.setThreadPolicy(threadPolicyBuilder.build());
StrictMode.setVmPolicy(vmPolicyBuilder.build());
}
// Disable Appboy network requests if the preference has been set and the current device model matches a list of emulators
// we don't want to run Appboy on in certain scenarios.
private void disableNetworkRequestsIfConfigured(SharedPreferences sharedPreferences) {
boolean disableAppboyNetworkRequestsBooleanString = sharedPreferences.getBoolean(getString(R.string.mock_appboy_network_requests), false);
if (disableAppboyNetworkRequestsBooleanString && Arrays.asList(EmulatorDetectionUtils.getEmulatorModelsForAppboyDeactivation()).contains(Build.MODEL)) {
Appboy.enableMockAppboyNetworkRequestsAndDropEventsMode();
Log.i(TAG, String.format("Mocking Appboy network requests because preference was set and model was %s", Build.MODEL));
}
}
private void setOverrideApiKeyIfConfigured(SharedPreferences sharedPreferences, AppboyConfig.Builder appboyConfigBuilder) {
String overrideApiKey = sharedPreferences.getString(OVERRIDE_API_KEY_PREF_KEY, null);
if (!StringUtils.isNullOrBlank(overrideApiKey)) {
Log.i(TAG, String.format("Override API key found, configuring Appboy with override key %s.", overrideApiKey));
appboyConfigBuilder.setApiKey(overrideApiKey);
sOverrideApiKeyInUse = overrideApiKey;
}
}
protected static String getApiKeyInUse(Context context) {
if (!StringUtils.isNullOrBlank(sOverrideApiKeyInUse)) {
return sOverrideApiKeyInUse;
} else {
return context.getResources().getString(R.string.com_appboy_api_key);
}
}
@TargetApi(11)
private void addDetectLeakedClosableObjects(StrictMode.VmPolicy.Builder vmPolicyBuilder) {
vmPolicyBuilder.detectLeakedClosableObjects();
}
}