package org.ebookdroid; import org.ebookdroid.common.bitmaps.BitmapManager; import org.ebookdroid.common.bitmaps.ByteBufferManager; import org.ebookdroid.common.cache.CacheManager; import org.ebookdroid.common.settings.AppSettings; import org.ebookdroid.common.settings.BackupSettings; import org.ebookdroid.common.settings.LibSettings; import org.ebookdroid.common.settings.LibSettings.Diff; import org.ebookdroid.common.settings.SettingsManager; import org.ebookdroid.common.settings.listeners.IAppSettingsChangeListener; import org.ebookdroid.common.settings.listeners.IBackupSettingsChangeListener; import org.ebookdroid.common.settings.listeners.ILibSettingsChangeListener; import org.ebookdroid.ui.library.RecentActivityController; import android.content.Context; import android.util.Log; import android.webkit.WebView; import org.emdev.BaseDroidApp; import org.emdev.common.backup.BackupManager; import org.emdev.common.filesystem.MediaManager; import org.emdev.common.fonts.FontManager; import org.emdev.ui.actions.ActionController; import org.emdev.ui.actions.ActionDialogBuilder; import org.emdev.ui.gl.GLConfiguration; import org.emdev.utils.concurrent.Flag; import org.sufficientlysecure.viewer.R; public class EBookDroidApp extends BaseDroidApp implements IAppSettingsChangeListener, IBackupSettingsChangeListener, ILibSettingsChangeListener { public static final Flag initialized = new Flag(); public static EBookDroidVersion version; private static EBookDroidApp instance; /** * {@inheritDoc} * * @see android.app.Application#onCreate() */ @Override public void onCreate() { super.onCreate(); instance = this; version = EBookDroidVersion.get(APP_VERSION_CODE); SettingsManager.init(this); CacheManager.init(this); MediaManager.init(this); initFonts(); preallocateHeap(AppSettings.current().heapPreallocate); SettingsManager.addListener(this); onAppSettingsChanged(null, AppSettings.current(), null); onBackupSettingsChanged(null, BackupSettings.current(), null); initialized.set(); } public static void initFonts() { FontManager.init(APP_STORAGE); } @Override public void onTerminate() { SettingsManager.onTerminate(); MediaManager.onTerminate(this); } /** * {@inheritDoc} * * @see android.app.Application#onLowMemory() */ @Override public void onLowMemory() { super.onLowMemory(); BitmapManager.clear("on Low Memory: "); ByteBufferManager.clear("on Low Memory: "); } @Override public void onAppSettingsChanged(final AppSettings oldSettings, final AppSettings newSettings, final AppSettings.Diff diff) { ByteBufferManager.setPartSize(1 << newSettings.bitmapSize); setAppLocale(newSettings.lang); } @Override public void onBackupSettingsChanged(final BackupSettings oldSettings, final BackupSettings newSettings, final BackupSettings.Diff diff) { BackupManager.setMaxNumberOfAutoBackups(newSettings.maxNumberOfAutoBackups); } @Override public void onLibSettingsChanged(final LibSettings oldSettings, final LibSettings newSettings, final Diff diff) { if (diff.isCacheLocationChanged()) { CacheManager.setCacheLocation(newSettings.cacheLocation, !diff.isFirstTime()); } } public static void checkInstalledFonts(final Context context) { // if (!FontManager.external.hasInstalled()) { // if (!SettingsManager.isInitialFlagsSet(SettingsManager.INITIAL_FONTS)) { // SettingsManager.setInitialFlags(SettingsManager.INITIAL_FONTS); // // final ActionDialogBuilder b = new ActionDialogBuilder(context, new ActionController<Context>(context)); // final WebView view = new WebView(context); // // final String text = context.getResources().getString(R.string.font_reminder); // final String content = "<html><body>" + text + "</body></html>"; // // view.loadDataWithBaseURL("file:///fake/not_used", content, "text/html", "UTF-8", ""); // // b.setTitle(R.string.font_reminder_title); // b.setView(view); // b.setPositiveButton(android.R.string.ok, R.id.actions_no_action); // b.show(); // } // } } /** * Preallocate heap. * * @param size * the size in megabytes * @return the object */ private static Object preallocateHeap(final int size) { if (size <= 0) { Log.i(APP_NAME, "No heap preallocation"); return null; } int i = size; Log.i(APP_NAME, "Trying to preallocate " + size + "Mb"); while (i > 0) { try { byte[] tmp = new byte[i * 1024 * 1024]; tmp[size - 1] = (byte) size; Log.i(APP_NAME, "Preallocated " + i + "Mb"); tmp = null; return tmp; } catch (final OutOfMemoryError e) { i--; } catch (final IllegalArgumentException e) { i--; } } Log.i(APP_NAME, "Heap preallocation failed"); return null; } }