1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.app; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 192b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport android.app.Application; 202b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport android.content.Context; 2191055408e94f0a7517971f52290c52f2a75ed52aOwen Linimport android.os.AsyncTask; 222b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Lin 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DownloadCache; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.ImageCacheService; 26d6db8eab6df048b9065834113a6d46a885af01d3Owen Linimport com.android.gallery3d.gadget.WidgetUtils; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 29c64d127c976f8ef647552063ff14ead4388ce699Angus Kongimport com.android.gallery3d.util.LightCycleHelper; 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.ThreadPool; 313847e4e8e26ed6c6f18ee4a6b2984d33051d155eBobby Georgescuimport com.android.gallery3d.util.UsageStatistics; 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.File; 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class GalleryAppImpl extends Application implements GalleryApp { 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String DOWNLOAD_FOLDER = "download"; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final long DOWNLOAD_CAPACITY = 64 * 1024 * 1024; // 64M 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ImageCacheService mImageCacheService; 416b677eb6dfb1cc51ca6dbe6ab43da2f6020fbf2cRay Chen private Object mLock = new Object(); 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private DataManager mDataManager; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ThreadPool mThreadPool; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private DownloadCache mDownloadCache; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate() { 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onCreate(); 4991055408e94f0a7517971f52290c52f2a75ed52aOwen Lin initializeAsyncTask(); 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.initialize(this); 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin WidgetUtils.initialize(this); 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PicasaSource.initialize(this); 533847e4e8e26ed6c6f18ee4a6b2984d33051d155eBobby Georgescu UsageStatistics.initialize(this); 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 567817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Context getAndroidContext() { 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return this; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 617817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public synchronized DataManager getDataManager() { 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mDataManager == null) { 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataManager = new DataManager(this); 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataManager.initializeSourceMap(); 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mDataManager; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 70c64d127c976f8ef647552063ff14ead4388ce699Angus Kong 71c64d127c976f8ef647552063ff14ead4388ce699Angus Kong @Override 726b677eb6dfb1cc51ca6dbe6ab43da2f6020fbf2cRay Chen public ImageCacheService getImageCacheService() { 736b677eb6dfb1cc51ca6dbe6ab43da2f6020fbf2cRay Chen // This method may block on file I/O so a dedicated lock is needed here. 746b677eb6dfb1cc51ca6dbe6ab43da2f6020fbf2cRay Chen synchronized (mLock) { 756b677eb6dfb1cc51ca6dbe6ab43da2f6020fbf2cRay Chen if (mImageCacheService == null) { 766b677eb6dfb1cc51ca6dbe6ab43da2f6020fbf2cRay Chen mImageCacheService = new ImageCacheService(getAndroidContext()); 776b677eb6dfb1cc51ca6dbe6ab43da2f6020fbf2cRay Chen } 786b677eb6dfb1cc51ca6dbe6ab43da2f6020fbf2cRay Chen return mImageCacheService; 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 827817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public synchronized ThreadPool getThreadPool() { 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mThreadPool == null) { 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mThreadPool = new ThreadPool(); 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mThreadPool; 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 907817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public synchronized DownloadCache getDownloadCache() { 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mDownloadCache == null) { 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin File cacheDir = new File(getExternalCacheDir(), DOWNLOAD_FOLDER); 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!cacheDir.isDirectory()) cacheDir.mkdirs(); 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!cacheDir.isDirectory()) { 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin throw new RuntimeException( 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin "fail to create: " + cacheDir.getAbsolutePath()); 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDownloadCache = new DownloadCache(this, cacheDir, DOWNLOAD_CAPACITY); 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mDownloadCache; 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 10591055408e94f0a7517971f52290c52f2a75ed52aOwen Lin 10691055408e94f0a7517971f52290c52f2a75ed52aOwen Lin private void initializeAsyncTask() { 10791055408e94f0a7517971f52290c52f2a75ed52aOwen Lin // AsyncTask class needs to be loaded in UI thread. 10891055408e94f0a7517971f52290c52f2a75ed52aOwen Lin // So we load it here to comply the rule. 10991055408e94f0a7517971f52290c52f2a75ed52aOwen Lin try { 11091055408e94f0a7517971f52290c52f2a75ed52aOwen Lin Class.forName(AsyncTask.class.getName()); 11191055408e94f0a7517971f52290c52f2a75ed52aOwen Lin } catch (ClassNotFoundException e) { 11291055408e94f0a7517971f52290c52f2a75ed52aOwen Lin } 11391055408e94f0a7517971f52290c52f2a75ed52aOwen Lin } 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 115