package com.aptoide.amethyst; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.database.sqlite.SQLiteDatabase; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; import com.aptoide.amethyst.analytics.Analytics; import com.aptoide.amethyst.configuration.AptoideConfiguration; import com.aptoide.amethyst.database.SQLiteDatabaseHelper; import com.aptoide.amethyst.preferences.ManagerPreferences; import com.aptoide.amethyst.utils.AptoideUtils; import com.aptoide.amethyst.utils.Logger; import com.crashlytics.android.Crashlytics; import com.crashlytics.android.core.CrashlyticsCore; import com.google.android.gms.ads.identifier.AdvertisingIdClient; import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.common.GooglePlayServicesRepairableException; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.download.BaseImageDownloader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.security.SecureRandom; import java.util.UUID; import io.fabric.sdk.android.Fabric; import roboguice.util.temp.Ln; /** * Created by rmateus on 28/05/15. */ public class Aptoide extends Application { public static boolean IS_SYSTEM; public static boolean DEBUG_MODE = Log.isLoggable("APTOIDE", Log.DEBUG); private static Context context; private static SQLiteDatabase db; private static AptoideConfiguration configuration = null; private static boolean webInstallServiceRunning; private static AptoideThemePicker themePicker; public static Context getContext() { return context; } @Nullable public static String filters; public static AptoideThemePicker getThemePicker() { return themePicker; } public static void setThemePicker(AptoideThemePicker themePicker) { Aptoide.themePicker = themePicker; } // See SharedPreferences#registerOnSharedPreferenceChangeListener private SharedPreferences.OnSharedPreferenceChangeListener listener; private void setAdvertisingIdClient() { new Thread(new Runnable() { @Override public void run() { String aaid = ""; if (AptoideUtils.GoogleServices.checkGooglePlayServices(context)) { try { aaid = AdvertisingIdClient.getAdvertisingIdInfo(Aptoide.this).getId(); } catch (Exception e) { e.printStackTrace(); } } else { byte[] data = new byte[16]; String deviceId = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); SecureRandom secureRandom = new SecureRandom(); secureRandom.setSeed(deviceId.hashCode()); secureRandom.nextBytes(data); aaid = UUID.nameUUIDFromBytes(data).toString(); } AptoideUtils.getSharedPreferences().edit().putString("advertisingIdClient", aaid).apply(); } }).start(); } @Override public void onCreate() { super.onCreate(); Analytics.Lifecycle.Application.onCreate(this); setAdvertisingIdClient(); context = this; db = SQLiteDatabaseHelper.getInstance(this).getReadableDatabase(); filters = AptoideUtils.HWSpecifications.filters(this); ManagerPreferences.getInstance(this) //inits the ManagerPreferences .preferences .registerOnSharedPreferenceChangeListener( listener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged( final SharedPreferences sharedPreferences, final String key) { if (TextUtils.equals(key, "hwspecsChkBox")) { filters = AptoideUtils.HWSpecifications.filters(Aptoide.this); } } }); Crashlytics crashlyticsKit = new Crashlytics.Builder() .core(new CrashlyticsCore.Builder().disabled(!BuildConfig.FABRIC_CONFIGURED).build()) .build(); Fabric.with(this, crashlyticsKit); setConfiguration(getAptoideConfiguration()); initImageLoader(); setDebugMode(); checkIsSystem(); setThemePicker(getNewThemePicker()); Crashlytics.setString("Language", getResources().getConfiguration().locale.getLanguage()); AptoideUtils.CrashlyticsUtils.subsctibeActivityLiveCycleEvent(); } /** * Set the default debugging mode. There are several ways to set this outside the Application: * 1) set by the Android, also by multiple ways (check documentations of Log.isLoggable): <br /> * <i>setprop log.tag.APTOIDE DEBUG</i> * 2) set by us: via a flag in SharedPreferences * */ private void setDebugMode() { boolean debugMode = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("debugmode", false); boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)); DEBUG_MODE = DEBUG_MODE | debugMode | isDebuggable; if(DEBUG_MODE){ // Set RoboSpice log level Ln.getConfig().setLoggingLevel(Log.VERBOSE); Toast.makeText(this, "Debug mode is: " + Aptoide.DEBUG_MODE, Toast.LENGTH_LONG).show(); } } public AptoideThemePicker getNewThemePicker() { return new AptoideThemePicker(); } private void checkIsSystem() { try { ApplicationInfo info = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.PERMISSION_GRANTED); IS_SYSTEM = (info.flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo.FLAG_SYSTEM; } catch (PackageManager.NameNotFoundException e) { Logger.printException(e); } } /** * Inits nostra13's ImageLoader */ private void initImageLoader() { DisplayImageOptions options = new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisc(true) .resetViewBeforeLoading(true) .showStubImage(R.drawable.icon_non_available) .build(); FileNameGenerator generator = new FileNameGenerator() { @Override public String generate(String s) { if(s!=null){ return s.substring(s.lastIndexOf('/') + 1); } else { return null; } } }; ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) .discCache(new UnlimitedDiscCache(new File(getConfiguration().getPathCacheIcons()), null, generator)) .imageDownloader(new ImageDownloaderWithPermissions(getContext())) .defaultDisplayImageOptions(options) .build(); ImageLoader.getInstance().init(config); } public AptoideConfiguration getAptoideConfiguration() { return new AptoideConfiguration(); } public static AptoideConfiguration getConfiguration() { return configuration; } public void setConfiguration(AptoideConfiguration configuration) { Aptoide.configuration = configuration; } public static SQLiteDatabase getDb() { return db; } public static class ImageDownloaderWithPermissions extends BaseImageDownloader { /** {@value} */ public static final int DEFAULT_HTTP_CONNECT_TIMEOUT = 5 * 1000; // milliseconds /** {@value} */ public static final int DEFAULT_HTTP_READ_TIMEOUT = 10 * 1000; // milliseconds public ImageDownloaderWithPermissions(Context context) { this(context, DEFAULT_HTTP_CONNECT_TIMEOUT, DEFAULT_HTTP_READ_TIMEOUT); } public ImageDownloaderWithPermissions(Context context, int connectTimeout, int readTimeout) { super(context, connectTimeout, readTimeout); } @Override public InputStream getStream(String imageUri, Object extra) throws IOException { boolean download = AptoideUtils.NetworkUtils.isIconDownloadPermitted(context); switch (Scheme.ofUri(imageUri)) { case HTTP: case HTTPS: if(download){ return getStreamFromNetwork(imageUri, extra); } return null; case FILE: return getStreamFromFile(imageUri, extra); case CONTENT: return getStreamFromContent(imageUri, extra); case ASSETS: return getStreamFromAssets(imageUri, extra); case DRAWABLE: return getStreamFromDrawable(imageUri, extra); case UNKNOWN: default: return getStreamFromOtherSource(imageUri, extra); } } } public static boolean isUpdate() throws PackageManager.NameNotFoundException { return PreferenceManager.getDefaultSharedPreferences(getContext()).getInt("version", 0) < getContext().getPackageManager().getPackageInfo(getContext().getPackageName(), 0).versionCode; } public static void setWebInstallServiceRunning(boolean webInstallServiceRunning) { Aptoide.webInstallServiceRunning = webInstallServiceRunning; } }