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