131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/*
231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License.
631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at
731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and
1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License.
1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
17a5902524d4403885eb4c50360bf3465c6be796efJoe Onoratopackage com.android.launcher2;
1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.app.Application;
20cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamathimport android.app.SearchManager;
219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.content.ContentResolver;
224afe9b31f51022538b30646fe83780e83bf22490Winson Chungimport android.content.Context;
239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.content.Intent;
249c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.content.IntentFilter;
25374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasaniimport android.content.pm.LauncherApps;
26aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungimport android.content.res.Configuration;
279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.database.ContentObserver;
289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.os.Handler;
29374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasaniimport android.util.Log;
3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
310dca1ec41479a74f8da080224fa0c7eacab674d6Andrew Flynnimport com.android.launcher.R;
320dca1ec41479a74f8da080224fa0c7eacab674d6Andrew Flynn
33a8c760d395e1d2a78522427738302fbca3a72453Michael Jurkaimport java.lang.ref.WeakReference;
34a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka
3531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectpublic class LauncherApplication extends Application {
36374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    static final String TAG = "LauncherApplication";
37d9cb4a124ac5c83080ace5ac92980df9c6f49e8eMichael Jurka    private LauncherModel mModel;
38d9cb4a124ac5c83080ace5ac92980df9c6f49e8eMichael Jurka    private IconCache mIconCache;
39d9cb4a124ac5c83080ace5ac92980df9c6f49e8eMichael Jurka    private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb;
40a2eb17095dcffa75c1e9681fdc318fe6e0564321Michael Jurka    private static boolean sIsScreenLarge;
418e58e916061cbe2623697efac0924f2aa3753a92Patrick Dubroy    private static float sScreenDensity;
4288f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung    private static int sLongPressTimeout = 300;
43f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung    private static final String sSharedPreferencesKey = "com.android.launcher2.prefs";
44a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka    WeakReference<LauncherProvider> mLauncherProvider;
459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
4731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void onCreate() {
4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        super.onCreate();
499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
50c9a961952d1a057029874f8426b90181f6876034Michael Jurka        // set sIsScreenXLarge and sScreenDensity *before* creating icon cache
510dca1ec41479a74f8da080224fa0c7eacab674d6Andrew Flynn        sIsScreenLarge = getResources().getBoolean(R.bool.is_large_screen);
528e58e916061cbe2623697efac0924f2aa3753a92Patrick Dubroy        sScreenDensity = getResources().getDisplayMetrics().density;
530589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
545dbff49a302f92b0f4d6a21d00047adddc46e4bdMichael Jurka        recreateWidgetPreviewDb();
55c9a961952d1a057029874f8426b90181f6876034Michael Jurka        mIconCache = new IconCache(this);
56c9a961952d1a057029874f8426b90181f6876034Michael Jurka        mModel = new LauncherModel(this, mIconCache);
57374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        LauncherApps launcherApps = (LauncherApps)
58374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                getSystemService(Context.LAUNCHER_APPS_SERVICE);
5924f6d40d06a962e1ccf133aab4172c3511311a81Kenny Guy        launcherApps.registerCallback(mModel.getLauncherAppsCallback());
60c9a961952d1a057029874f8426b90181f6876034Michael Jurka
619c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        // Register intent receivers
62374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        IntentFilter filter = new IntentFilter();
63e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato        filter.addAction(Intent.ACTION_LOCALE_CHANGED);
6493f824ac2f2f3ec92a775cad58dcf59e4302fe64Reena Lee        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
6564e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato        registerReceiver(mModel, filter);
66cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath        filter = new IntentFilter();
67cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath        filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
68cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath        registerReceiver(mModel, filter);
69cbf7c4d50ce2609518640c3f590f6df435edabaeWinson Chung        filter = new IntentFilter();
70cbf7c4d50ce2609518640c3f590f6df435edabaeWinson Chung        filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED);
71cbf7c4d50ce2609518640c3f590f6df435edabaeWinson Chung        registerReceiver(mModel, filter);
729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        // Register for changes to the favorites
749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        ContentResolver resolver = getContentResolver();
759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,
769c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                mFavoritesObserver);
779c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
789c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
795dbff49a302f92b0f4d6a21d00047adddc46e4bdMichael Jurka    public void recreateWidgetPreviewDb() {
805dbff49a302f92b0f4d6a21d00047adddc46e4bdMichael Jurka        mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(this);
815dbff49a302f92b0f4d6a21d00047adddc46e4bdMichael Jurka    }
825dbff49a302f92b0f4d6a21d00047adddc46e4bdMichael Jurka
839c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * There's no guarantee that this function is ever called.
859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    @Override
879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    public void onTerminate() {
889c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        super.onTerminate();
899c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
90f99f8c1ad265cf7bea7e30476911d730b7d0eaaeJoe Onorato        unregisterReceiver(mModel);
919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
929c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        ContentResolver resolver = getContentResolver();
939c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        resolver.unregisterContentObserver(mFavoritesObserver);
949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
959c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
969c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
979c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Receives notifications whenever the user favorites have changed.
989c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
999c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) {
1009c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        @Override
1019c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        public void onChange(boolean selfChange) {
102f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung            // If the database has ever changed, then we really need to force a reload of the
103f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung            // workspace on the next load
104f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung            mModel.resetLoadedState(false, true);
105f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung            mModel.startLoaderFromBackground();
1069c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
1079c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    };
1089c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
1099c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    LauncherModel setLauncher(Launcher launcher) {
110f99f8c1ad265cf7bea7e30476911d730b7d0eaaeJoe Onorato        mModel.initialize(launcher);
111f99f8c1ad265cf7bea7e30476911d730b7d0eaaeJoe Onorato        return mModel;
11231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
1130589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
1140589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    IconCache getIconCache() {
1150589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        return mIconCache;
1160589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    }
1170589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
1180589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    LauncherModel getModel() {
1190589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        return mModel;
1200589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    }
121aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung
122d9cb4a124ac5c83080ace5ac92980df9c6f49e8eMichael Jurka    WidgetPreviewLoader.CacheDb getWidgetPreviewCacheDb() {
123d9cb4a124ac5c83080ace5ac92980df9c6f49e8eMichael Jurka        return mWidgetPreviewCacheDb;
124d9cb4a124ac5c83080ace5ac92980df9c6f49e8eMichael Jurka    }
125d9cb4a124ac5c83080ace5ac92980df9c6f49e8eMichael Jurka
126374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    void setLauncherProvider(LauncherProvider provider) {
127a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka        mLauncherProvider = new WeakReference<LauncherProvider>(provider);
128a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka    }
129a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka
130a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka    LauncherProvider getLauncherProvider() {
131a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka        return mLauncherProvider.get();
132a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka    }
133a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka
134f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung    public static String getSharedPreferencesKey() {
135f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung        return sSharedPreferencesKey;
136f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung    }
137f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung
138a2eb17095dcffa75c1e9681fdc318fe6e0564321Michael Jurka    public static boolean isScreenLarge() {
139a2eb17095dcffa75c1e9681fdc318fe6e0564321Michael Jurka        return sIsScreenLarge;
140aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung    }
1418e58e916061cbe2623697efac0924f2aa3753a92Patrick Dubroy
1424afe9b31f51022538b30646fe83780e83bf22490Winson Chung    public static boolean isScreenLandscape(Context context) {
1434afe9b31f51022538b30646fe83780e83bf22490Winson Chung        return context.getResources().getConfiguration().orientation ==
1444afe9b31f51022538b30646fe83780e83bf22490Winson Chung            Configuration.ORIENTATION_LANDSCAPE;
1454afe9b31f51022538b30646fe83780e83bf22490Winson Chung    }
1464afe9b31f51022538b30646fe83780e83bf22490Winson Chung
1478e58e916061cbe2623697efac0924f2aa3753a92Patrick Dubroy    public static float getScreenDensity() {
1488e58e916061cbe2623697efac0924f2aa3753a92Patrick Dubroy        return sScreenDensity;
1498e58e916061cbe2623697efac0924f2aa3753a92Patrick Dubroy    }
15088f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung
15188f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung    public static int getLongPressTimeout() {
15288f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung        return sLongPressTimeout;
15388f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung    }
15431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
155