/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.gallery3d.app; import android.app.Application; import android.content.Context; import android.os.AsyncTask; import com.android.gallery3d.data.DataManager; import com.android.gallery3d.data.DownloadCache; import com.android.gallery3d.data.ImageCacheService; import com.android.gallery3d.gadget.WidgetUtils; import com.android.gallery3d.picasasource.PicasaSource; import com.android.gallery3d.util.GalleryUtils; import com.android.gallery3d.util.LightCycleHelper; import com.android.gallery3d.util.ThreadPool; import com.android.gallery3d.util.UsageStatistics; import java.io.File; public class GalleryAppImpl extends Application implements GalleryApp { private static final String DOWNLOAD_FOLDER = "download"; private static final long DOWNLOAD_CAPACITY = 64 * 1024 * 1024; // 64M private static GalleryAppImpl sGalleryAppImpl; private ImageCacheService mImageCacheService; private Object mLock = new Object(); private DataManager mDataManager; private ThreadPool mThreadPool; private DownloadCache mDownloadCache; @Override public void onCreate() { super.onCreate(); initializeAsyncTask(); GalleryUtils.initialize(this); WidgetUtils.initialize(this); PicasaSource.initialize(this); UsageStatistics.initialize(this); sGalleryAppImpl = this; } @Override public Context getAndroidContext() { return this; } public static Context getContext() { return sGalleryAppImpl; } @Override public synchronized DataManager getDataManager() { if (mDataManager == null) { mDataManager = new DataManager(this); mDataManager.initializeSourceMap(); } return mDataManager; } @Override public ImageCacheService getImageCacheService() { // This method may block on file I/O so a dedicated lock is needed here. synchronized (mLock) { if (mImageCacheService == null) { mImageCacheService = new ImageCacheService(getAndroidContext()); } return mImageCacheService; } } @Override public synchronized ThreadPool getThreadPool() { if (mThreadPool == null) { mThreadPool = new ThreadPool(); } return mThreadPool; } @Override public synchronized DownloadCache getDownloadCache() { if (mDownloadCache == null) { File cacheDir = new File(getExternalCacheDir(), DOWNLOAD_FOLDER); if (!cacheDir.isDirectory()) cacheDir.mkdirs(); if (!cacheDir.isDirectory()) { throw new RuntimeException( "fail to create: " + cacheDir.getAbsolutePath()); } mDownloadCache = new DownloadCache(this, cacheDir, DOWNLOAD_CAPACITY); } return mDownloadCache; } private void initializeAsyncTask() { // AsyncTask class needs to be loaded in UI thread. // So we load it here to comply the rule. try { Class.forName(AsyncTask.class.getName()); } catch (ClassNotFoundException e) { } } }