package de.thedevstack.conversationsplus; import android.Manifest; import android.app.Application; import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; import android.os.PowerManager; import android.preference.PreferenceManager; import java.io.File; import java.security.SecureRandom; import de.duenndns.ssl.MemorizingTrustManager; import de.thedevstack.conversationsplus.http.HttpClient; import de.thedevstack.conversationsplus.persistance.FileBackend; import de.thedevstack.conversationsplus.services.filetransfer.FileTransferManager; import de.thedevstack.conversationsplus.services.filetransfer.http.download.HttpDownloadFileTransferService; import de.thedevstack.conversationsplus.services.filetransfer.http.upload.HttpUploadFileTransferService; import de.thedevstack.conversationsplus.services.filetransfer.jingle.JingleFileTransferService; import de.thedevstack.conversationsplus.utils.ImageUtil; import de.thedevstack.conversationsplus.utils.PRNGFixes; import de.thedevstack.conversationsplus.utils.SerialSingleThreadExecutor; /** * This class is used to provide static access to the applicationcontext. */ public class ConversationsPlusApplication extends Application { /** * Application instance for static access */ private static ConversationsPlusApplication instance; private final SerialSingleThreadExecutor mFileAddingExecutor = new SerialSingleThreadExecutor(); private final SerialSingleThreadExecutor mDatabaseExecutor = new SerialSingleThreadExecutor(); private MemorizingTrustManager memorizingTrustManager; private SecureRandom secureRandom; /** * Initializes the application and saves its instance. */ public void onCreate(){ super.onCreate(); ConversationsPlusApplication.instance = this; ConversationsPlusPreferences.init(PreferenceManager.getDefaultSharedPreferences(getAppContext())); this.initializeSecurity(); ImageUtil.initBitmapCache(); FileBackend.init(); FileTransferManager.init(new HttpUploadFileTransferService(), new JingleFileTransferService(), new HttpDownloadFileTransferService()); HttpClient.init(); } /** * Initializes security features. */ private void initializeSecurity() { PRNGFixes.apply(); this.secureRandom = new SecureRandom(); ConversationsPlusApplication.updateMemorizingTrustmanager(); } /** * Returns the instance of the application * @return this application instance */ public static ConversationsPlusApplication getInstance() { return ConversationsPlusApplication.instance; } public static void executeFileAdding(Runnable r) { getInstance().mFileAddingExecutor.execute(r); } public static void executeDatabaseOperation(Runnable r) { getInstance().mDatabaseExecutor.execute(r); } /** * Returns the application's context. * @return Context the application's context */ public static Context getAppContext() { return ConversationsPlusApplication.instance.getApplicationContext(); } /** * Returns the application's private data directory. * @return File the application's private data dir */ public static File getPrivateFilesDir() { return ConversationsPlusApplication.instance.getFilesDir(); } /** * Returns the version of the application. * @see android.content.pm.PackageInfo#versionName * @return a string representation of the version stored in packageInfo */ public static String getVersion() { final String packageName = ConversationsPlusApplication.getAppContext().getPackageName(); if (packageName != null) { try { return ConversationsPlusApplication.getAppContext().getPackageManager().getPackageInfo(packageName, 0).versionName; } catch (final PackageManager.NameNotFoundException e) { return "unknown"; } } else { return "unknown"; } } /** * Returns the application's name. * @return the name as it is defined in R.string.app_name */ public static String getName() { return ConversationsPlusApplication.getAppContext().getString(R.string.app_name); } /** * Returns the name and the version of this application. * @see #getName() and #getVersion * @return a concatination of name and version with a whitespace in between */ public static String getNameAndVersion() { return getName() + " " + getVersion(); } public static PowerManager.WakeLock createPartialWakeLock(String name) { PowerManager powerManager = (PowerManager) getAppContext().getSystemService(Context.POWER_SERVICE); return powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, name); } public static boolean hasStoragePermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return ConversationsPlusApplication.getAppContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; } else { return true; } } public static MemorizingTrustManager getMemorizingTrustManager() { return getInstance().memorizingTrustManager; } public void setMemorizingTrustManager(MemorizingTrustManager trustManager) { this.memorizingTrustManager = trustManager; } public static void updateMemorizingTrustmanager() { final MemorizingTrustManager tm; if (ConversationsPlusPreferences.dontTrustSystemCAs()) { tm = new MemorizingTrustManager(getAppContext(), null); } else { tm = new MemorizingTrustManager(getAppContext()); } getInstance().setMemorizingTrustManager(tm); } public static SecureRandom getSecureRandom() { return getInstance().secureRandom; } }