package com.wm.remusic; import android.app.Application; import android.content.Context; import android.os.Build; import android.os.Environment; import android.support.annotation.ColorInt; import android.support.annotation.ColorRes; import com.bilibili.magicasakura.utils.ThemeUtils; import com.facebook.cache.disk.DiskCacheConfig; import com.facebook.common.internal.Supplier; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.imagepipeline.cache.MemoryCacheParams; import com.facebook.imagepipeline.core.ImagePipeline; import com.facebook.imagepipeline.core.ImagePipelineConfig; import com.google.gson.Gson; import com.wm.remusic.handler.UnceHandler; import com.wm.remusic.permissions.Nammu; import com.wm.remusic.provider.PlaylistInfo; import com.wm.remusic.uitl.IConstants; import com.wm.remusic.uitl.PreferencesUtility; import com.wm.remusic.uitl.ThemeHelper; /** * Created by wm on 2016/2/23. */ public class MainApplication extends Application implements ThemeUtils.switchColor { public static Context context; // private RefWatcher refWatcher; private static int MAX_MEM = (int) Runtime.getRuntime().maxMemory() / 4; //private static int MAX_MEM = 60 * ByteConstants.MB; private long favPlaylist = IConstants.FAV_PLAYLIST; private static Gson gson; public static Gson gsonInstance() { if (gson == null) { gson = new Gson(); } return gson; } private ImagePipelineConfig getConfigureCaches(Context context) { final MemoryCacheParams bitmapCacheParams = new MemoryCacheParams( MAX_MEM,// 内存缓存中总图片的最大大小,以字节为单位。 Integer.MAX_VALUE,// 内存缓存中图片的最大数量。 MAX_MEM,// 内存缓存中准备清除但尚未被删除的总图片的最大大小,以字节为单位。 Integer.MAX_VALUE,// 内存缓存中准备清除的总图片的最大数量。 Integer.MAX_VALUE / 10);// 内存缓存中单个图片的最大大小。 Supplier<MemoryCacheParams> mSupplierMemoryCacheParams = new Supplier<MemoryCacheParams>() { @Override public MemoryCacheParams get() { return bitmapCacheParams; } }; ImagePipelineConfig.Builder builder = ImagePipelineConfig.newBuilder(context) .setDownsampleEnabled(true); builder.setBitmapMemoryCacheParamsSupplier(mSupplierMemoryCacheParams); //小图片的磁盘配置 DiskCacheConfig diskSmallCacheConfig = DiskCacheConfig.newBuilder(context) .setBaseDirectoryPath(context.getApplicationContext().getCacheDir())//缓存图片基路径 // .setBaseDirectoryName(IMAGE_PIPELINE_SMALL_CACHE_DIR)//文件夹名 // .setCacheErrorLogger(cacheErrorLogger)//日志记录器用于日志错误的缓存。 // .setCacheEventListener(cacheEventListener)//缓存事件侦听器。 // .setDiskTrimmableRegistry(diskTrimmableRegistry)//类将包含一个注册表的缓存减少磁盘空间的环境。 // .setMaxCacheSize(ConfigConstants.MAX_DISK_CACHE_SIZE)//默认缓存的最大大小。 // .setMaxCacheSizeOnLowDiskSpace(MAX_SMALL_DISK_LOW_CACHE_SIZE)//缓存的最大大小,使用设备时低磁盘空间。 // .setMaxCacheSizeOnVeryLowDiskSpace(MAX_SMALL_DISK_VERYLOW_CACHE_SIZE)//缓存的最大大小,当设备极低磁盘空间 // .setVersion(version) .build(); //默认图片的磁盘配置 DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(context) .setBaseDirectoryPath(Environment.getExternalStorageDirectory().getAbsoluteFile())//缓存图片基路径 // .setBaseDirectoryName(IMAGE_PIPELINE_CACHE_DIR)//文件夹名 // .setCacheErrorLogger(cacheErrorLogger)//日志记录器用于日志错误的缓存。 // .setCacheEventListener(cacheEventListener)//缓存事件侦听器。 // .setDiskTrimmableRegistry(diskTrimmableRegistry)//类将包含一个注册表的缓存减少磁盘空间的环境。 // .setMaxCacheSize(ConfigConstants.MAX_DISK_CACHE_SIZE)//默认缓存的最大大小。 // .setMaxCacheSizeOnLowDiskSpace(MAX_DISK_CACHE_LOW_SIZE)//缓存的最大大小,使用设备时低磁盘空间。 // .setMaxCacheSizeOnVeryLowDiskSpace(MAX_DISK_CACHE_VERYLOW_SIZE)//缓存的最大大小,当设备极低磁盘空间 // .setVersion(version) .build(); //缓存图片配置 ImagePipelineConfig.Builder configBuilder = ImagePipelineConfig.newBuilder(context) // .setAnimatedImageFactory(AnimatedImageFactory animatedImageFactory)//图片加载动画 .setBitmapMemoryCacheParamsSupplier(mSupplierMemoryCacheParams)//内存缓存配置(一级缓存,已解码的图片) // .setCacheKeyFactory(cacheKeyFactory)//缓存Key工厂 // .setEncodedMemoryCacheParamsSupplier(encodedCacheParamsSupplier)//内存缓存和未解码的内存缓存的配置(二级缓存) // .setExecutorSupplier(executorSupplier)//线程池配置 // .setImageCacheStatsTracker(imageCacheStatsTracker)//统计缓存的命中率 // .setImageDecoder(ImageDecoder imageDecoder) //图片解码器配置 // .setIsPrefetchEnabledSupplier(Supplier<Boolean> isPrefetchEnabledSupplier)//图片预览(缩略图,预加载图等)预加载到文件缓存 .setMainDiskCacheConfig(diskCacheConfig)//磁盘缓存配置(总,三级缓存) // .setMemoryTrimmableRegistry(memoryTrimmableRegistry) //内存用量的缩减,有时我们可能会想缩小内存用量。比如应用中有其他数据需要占用内存,不得不把图片缓存清除或者减小 或者我们想检查看看手机是否已经内存不够了。 // .setNetworkFetchProducer(networkFetchProducer)//自定的网络层配置:如OkHttp,Volley // .setPoolFactory(poolFactory)//线程池工厂配置 // .setProgressiveJpegConfig(progressiveJpegConfig)//渐进式JPEG图 // .setRequestListeners(requestListeners)//图片请求监听 // .setResizeAndRotateEnabledForNetwork(boolean resizeAndRotateEnabledForNetwork)//调整和旋转是否支持网络图片 ; return builder.build(); } @Override public void onLowMemory() { super.onLowMemory(); ImagePipeline imagePipeline = Fresco.getImagePipeline(); //清空内存缓存(包括Bitmap缓存和未解码图片的缓存) imagePipeline.clearMemoryCaches(); //清空硬盘缓存,一般在设置界面供用户手动清理 //imagePipeline.clearDiskCaches(); //同时清理内存缓存和硬盘缓存 //imagePipeline.clearCaches(); } private void frescoInit() { Fresco.initialize(this, getConfigureCaches(this)); } // public static RefWatcher getRefWatcher(Context context) { // MainApplication application = (MainApplication) context.getApplicationContext(); // return application.refWatcher; // } //捕获全局Exception 重启界面 public void initCatchException() { //设置该CrashHandler为程序的默认处理器 UnceHandler catchExcep = new UnceHandler(this); Thread.setDefaultUncaughtExceptionHandler(catchExcep); } @Override public void onCreate() { frescoInit(); super.onCreate(); // if (LeakCanary.isInAnalyzerProcess(this)) { // // This process is dedicated to LeakCanary for heap analysis. // // You should not init your app in this process. // return; // } context = this; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Nammu.init(this); } ThemeUtils.setSwitchColor(this); // refWatcher = LeakCanary.install(this); // LeakCanary.install(this); initCatchException(); if (!PreferencesUtility.getInstance(this).getFavriateMusicPlaylist()) { PlaylistInfo.getInstance(this).addPlaylist(favPlaylist, getResources().getString(R.string.my_fav_playlist), 0, "res:/" + R.mipmap.lay_protype_default, "local"); PreferencesUtility.getInstance(this).setFavriateMusicPlaylist(true); } } @Override public int replaceColorById(Context context, @ColorRes int colorId) { if (ThemeHelper.isDefaultTheme(context)) { return context.getResources().getColor(colorId); } String theme = getTheme(context); if (theme != null) { colorId = getThemeColorId(context, colorId, theme); } return context.getResources().getColor(colorId); } @Override public int replaceColor(Context context, @ColorInt int originColor) { if (ThemeHelper.isDefaultTheme(context)) { return originColor; } String theme = getTheme(context); int colorId = -1; if (theme != null) { colorId = getThemeColor(context, originColor, theme); } return colorId != -1 ? getResources().getColor(colorId) : originColor; } private String getTheme(Context context) { if (ThemeHelper.getTheme(context) == ThemeHelper.CARD_STORM) { return "blue"; } else if (ThemeHelper.getTheme(context) == ThemeHelper.CARD_HOPE) { return "purple"; } else if (ThemeHelper.getTheme(context) == ThemeHelper.CARD_WOOD) { return "green"; } else if (ThemeHelper.getTheme(context) == ThemeHelper.CARD_LIGHT) { return "green_light"; } else if (ThemeHelper.getTheme(context) == ThemeHelper.CARD_THUNDER) { return "yellow"; } else if (ThemeHelper.getTheme(context) == ThemeHelper.CARD_SAND) { return "orange"; } else if (ThemeHelper.getTheme(context) == ThemeHelper.CARD_FIREY) { return "red"; } return null; } private @ColorRes int getThemeColorId(Context context, int colorId, String theme) { switch (colorId) { case R.color.theme_color_primary: return context.getResources().getIdentifier(theme, "color", getPackageName()); case R.color.theme_color_primary_dark: return context.getResources().getIdentifier(theme + "_dark", "color", getPackageName()); case R.color.playbarProgressColor: return context.getResources().getIdentifier(theme + "_trans", "color", getPackageName()); } return colorId; } private @ColorRes int getThemeColor(Context context, int color, String theme) { switch (color) { case 0xd20000: return context.getResources().getIdentifier(theme, "color", getPackageName()); } return -1; } }