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