package com.duckduckgo.mobile.android;
import android.app.Application;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.graphics.Typeface;
import android.preference.PreferenceManager;
import android.util.Log;
import android.webkit.CookieSyncManager;
import com.duckduckgo.mobile.android.db.DdgDB;
import com.duckduckgo.mobile.android.download.FileCache;
import com.duckduckgo.mobile.android.download.ImageCache;
import com.duckduckgo.mobile.android.network.DDGNetworkConstants;
import com.duckduckgo.mobile.android.util.DDGConstants;
import com.duckduckgo.mobile.android.util.DDGControlVar;
import com.duckduckgo.mobile.android.util.DDGUtils;
import com.duckduckgo.mobile.android.util.PreferencesManager;
import com.duckduckgo.mobile.android.util.SCREEN;
import org.acra.ACRA;
import org.acra.ACRAConfigurationException;
import org.acra.ReportField;
import org.acra.ReportingInteractionMode;
import org.acra.annotation.ReportsCrashes;
import java.io.File;
@ReportsCrashes(formKey="",
formUri = "https://duckduckgo.com/crash.js",
mode = ReportingInteractionMode.DIALOG,
customReportContent = {
ReportField.APP_VERSION_CODE, ReportField.APP_VERSION_NAME, ReportField.ANDROID_VERSION, ReportField.STACK_TRACE,
ReportField.AVAILABLE_MEM_SIZE, ReportField.USER_COMMENT, ReportField.LOGCAT,
ReportField.PRODUCT, ReportField.PHONE_MODEL
},
resToastText = R.string.crash_toast_text, // optional, displayed as soon as the crash occurs, before collecting data which can take a few seconds
resNotifTickerText = R.string.crash_notif_ticker_text,
resNotifTitle = R.string.crash_notif_title,
resNotifText = R.string.crash_notif_text,
resDialogText = R.string.crash_dialog_text,
resDialogCommentPrompt = R.string.crash_dialog_comment_prompt, // optional. when defined, adds a user text field input with this text resource as a label
resDialogOkToast = R.string.crash_dialog_ok_toast // optional. displays a Toast message when the user accepts to send a report.
)
public class DDGApplication extends Application {
private static final ImageCache imageCache = new ImageCache(null);
private static FileCache fileCache = null;
private static SharedPreferences sharedPreferences = null;
private static DdgDB db = null;
private static String DB_FOLDER_NAME = "database";
private static boolean isReleaseBuild = false;
/**
* Changes after application upgrade
* Also records current app version code to "appVersionCode" sharedPreferences
*
* @param appVersionCode
*/
private void onUpgrade(int appVersionCode) {
// clear old sharedPreferences values, types can conflict (int -> float)
PreferencesManager.clearValues();
PreferencesManager.migrateAllowedSources();
PreferencesManager.saveAppVersionCode(appVersionCode);
fileCache.removeThrashOnMigration();
}
@Override
public void onCreate() {
super.onCreate();
ACRA.init(this);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
db = new DdgDB(this);
fileCache = new FileCache(this.getApplicationContext());
imageCache.setFileCache(fileCache);
CookieSyncManager.createInstance(this);
/*
try {
ApplicationInfo aInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
if (aInfo.metaData != null) {
CharSequence val = aInfo.metaData.getString("DDGReleaseStatus");
if(val!=null) {
isReleaseBuild = val.equals("release");
}
}
} catch (Exception e) {
e.printStackTrace();
}
*/
try {
PackageInfo pInfo;
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
String appVersion = pInfo.versionName;
int appVersionCode = pInfo.versionCode;
int oldVersionCode = PreferencesManager.getAppVersionCode();
Log.v("APP", "oldversion: " + oldVersionCode + " new: " + appVersionCode);
if(oldVersionCode == 0 || oldVersionCode != appVersionCode) {
// upgrade
onUpgrade(appVersionCode);
}
DDGConstants.USER_AGENT = DDGConstants.USER_AGENT.replace("%version", appVersion);
} catch (NameNotFoundException e) {
// at least specify new Android version
DDGConstants.USER_AGENT = DDGConstants.USER_AGENT.replace("%version", "2+");
}
DDGNetworkConstants.initialize(this);
// set Helvetica Neue Medium
// DDGConstants.TTF_HELVETICA_NEUE_MEDIUM = Typeface.createFromAsset(getAssets(), "fonts/HelveticaNeue_Medium.ttf");
//DDGConstants.TTF_ROBOTO_BOLD = Typeface.createFromAsset(getAssets(), "fonts/Roboto_Bold.ttf");
//DDGConstants.TTF_ROBOTO_MEDIUM = Typeface.createFromAsset(getAssets(), "fonts/Roboto_Medium.ttf");
DDGControlVar.START_SCREEN = PreferencesManager.getActiveStartScreen();
DDGControlVar.regionString = PreferencesManager.getRegion();
DDGControlVar.useExternalBrowser = PreferencesManager.getUseExternalBrowser();
DDGControlVar.defaultSources = PreferencesManager.getDefaultSources();
DDGControlVar.userAllowedSources = PreferencesManager.getUserAllowedSources();
DDGControlVar.userDisallowedSources = PreferencesManager.getUserDisallowedSources();
DDGControlVar.automaticFeedUpdate = PreferencesManager.getAutomaticFeedUpdate();
String strReadArticles = PreferencesManager.getReadArticles();
if(strReadArticles != null){
for(String strId : strReadArticles.split("-")){
if(strId != null && strId.length() != 0){
DDGControlVar.readArticles.add(strId);
}
}
}
}
public static ImageCache getImageCache() {
return imageCache;
}
public static SharedPreferences getSharedPreferences() {
return sharedPreferences;
}
public static FileCache getFileCache() {
return fileCache;
}
public static DdgDB getDB() {
return db;
}
public static boolean isIsReleaseBuild() {
return isReleaseBuild;
}
// method overridden to put DB in database folder cleanable upon uninstall
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode,
CursorFactory factory) {
File externalFilesDir = getDir(DB_FOLDER_NAME, MODE_PRIVATE);
File dbFile = new File(externalFilesDir, name);
return SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.CREATE_IF_NECESSARY);
}
@Override
public void onLowMemory() {
DDGApplication.getImageCache().purge();
super.onLowMemory();
}
}