LauncherAppState.java revision 6e27f642ae66dd1920b25b527fced7268943d11a
1cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler/* 2cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * Copyright (C) 2013 The Android Open Source Project 3cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * 4cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License"); 5cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * you may not use this file except in compliance with the License. 6cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * You may obtain a copy of the License at 7cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * 8cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * http://www.apache.org/licenses/LICENSE-2.0 9cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * 10cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * Unless required by applicable law or agreed to in writing, software 11cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS, 12cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * See the License for the specific language governing permissions and 14cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * limitations under the License. 15cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler */ 16cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 17cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerpackage com.android.launcher3; 18cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 19cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.app.SearchManager; 20b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandlerimport android.content.*; 21cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.content.res.Configuration; 22104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.content.res.Resources; 23cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.database.ContentObserver; 24cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.os.Handler; 25b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandlerimport android.util.Log; 26cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 27cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport java.lang.ref.WeakReference; 28cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 296e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chungpublic class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks { 305f8afe6280eae34620067696173e71943e1a30a3Winson Chung private static final String TAG = "LauncherAppState"; 31e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private static final String SHARED_PREFERENCES_KEY = "com.android.launcher3.prefs"; 32e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler 33cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private LauncherModel mModel; 34cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private IconCache mIconCache; 351307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert private AppFilter mAppFilter; 36cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb; 37e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private boolean mIsScreenLarge; 38e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private float mScreenDensity; 39e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private int mLongPressTimeout = 300; 40a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka private boolean mWallpaperChangedSinceLastCheck; 41cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 42e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private static WeakReference<LauncherProvider> sLauncherProvider; 43e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private static Context sContext; 44cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 45e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private static LauncherAppState INSTANCE; 46cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 475f8afe6280eae34620067696173e71943e1a30a3Winson Chung private DynamicGrid mDynamicGrid; 485f8afe6280eae34620067696173e71943e1a30a3Winson Chung 49cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static LauncherAppState getInstance() { 50e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (INSTANCE == null) { 51e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler INSTANCE = new LauncherAppState(); 52e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler } 53cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return INSTANCE; 54cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 55cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 56d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren public static LauncherAppState getInstanceNoCreate() { 57d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren return INSTANCE; 58d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren } 59d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren 60cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public Context getContext() { 61e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return sContext; 62cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 63cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 64e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler public static void setApplicationContext(Context context) { 65e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (sContext != null) { 66e060b0b3c72b93b47031f0f33bf18b121fb99333Daniel Sandler Log.w(Launcher.TAG, "setApplicationContext called twice! old=" + sContext + " new=" + context); 67e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler } 68e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext = context.getApplicationContext(); 69e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler } 70b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler 71e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private LauncherAppState() { 72e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (sContext == null) { 73e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler throw new IllegalStateException("LauncherAppState inited before app context set"); 74e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler } 75cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 76e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler Log.v(Launcher.TAG, "LauncherAppState inited"); 77924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler 78e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (sContext.getResources().getBoolean(R.bool.debug_memory_enabled)) { 79e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler MemoryTracker.startTrackingMe(sContext, "L"); 80b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler } 81b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler 82e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler // set sIsScreenXLarge and mScreenDensity *before* creating icon cache 83104c45677660586026a7e74ef8c47d396403d50eMichael Jurka mIsScreenLarge = isScreenLarge(sContext.getResources()); 84e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler mScreenDensity = sContext.getResources().getDisplayMetrics().density; 85b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler 866e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka recreateWidgetPreviewDb(); 87e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler mIconCache = new IconCache(sContext); 881307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert 891307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class)); 901307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert mModel = new LauncherModel(this, mIconCache, mAppFilter); 91cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 92cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // Register intent receivers 93cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 94cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 95cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_PACKAGE_CHANGED); 96cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addDataScheme("package"); 97e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext.registerReceiver(mModel, filter); 98cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter = new IntentFilter(); 99cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); 100cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); 101cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_LOCALE_CHANGED); 102cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); 103e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext.registerReceiver(mModel, filter); 104cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter = new IntentFilter(); 105cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED); 106e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext.registerReceiver(mModel, filter); 107cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter = new IntentFilter(); 108cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED); 109e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext.registerReceiver(mModel, filter); 110cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 111cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // Register for changes to the favorites 112e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler ContentResolver resolver = sContext.getContentResolver(); 113cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true, 114cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mFavoritesObserver); 115cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 1166e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka 1176e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka public void recreateWidgetPreviewDb() { 1186e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka if (mWidgetPreviewCacheDb != null) { 1196e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka mWidgetPreviewCacheDb.close(); 1206e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka } 1216e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext); 1226e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka } 123cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 124cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler /** 125cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * Call from Application.onTerminate(), which is not guaranteed to ever be called. 126cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler */ 127cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public void onTerminate() { 128e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext.unregisterReceiver(mModel); 129cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 130e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler ContentResolver resolver = sContext.getContentResolver(); 131cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler resolver.unregisterContentObserver(mFavoritesObserver); 132cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 133cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 134cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler /** 135cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * Receives notifications whenever the user favorites have changed. 136cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler */ 137cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) { 138cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler @Override 139cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public void onChange(boolean selfChange) { 140cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // If the database has ever changed, then we really need to force a reload of the 141cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // workspace on the next load 142cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mModel.resetLoadedState(false, true); 143cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mModel.startLoaderFromBackground(); 144cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 145cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler }; 146cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 147cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherModel setLauncher(Launcher launcher) { 148e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (mModel == null) { 149e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler throw new IllegalStateException("setLauncher() called before init()"); 150e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler } 151cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mModel.initialize(launcher); 152cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mModel; 153cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 154cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 155cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler IconCache getIconCache() { 156cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mIconCache; 157cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 158cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 159cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherModel getModel() { 160cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mModel; 161cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 162cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 1631307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert boolean shouldShowAppOrWidgetProvider(ComponentName componentName) { 1641307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert return mAppFilter == null || mAppFilter.shouldShowApp(componentName); 1651307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert } 1661307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert 167cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler WidgetPreviewLoader.CacheDb getWidgetPreviewCacheDb() { 168cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mWidgetPreviewCacheDb; 169cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 170cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 171e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler static void setLauncherProvider(LauncherProvider provider) { 172e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sLauncherProvider = new WeakReference<LauncherProvider>(provider); 173cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 174cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 175e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler static LauncherProvider getLauncherProvider() { 176e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return sLauncherProvider.get(); 177924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler } 178924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler 179cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static String getSharedPreferencesKey() { 180e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return SHARED_PREFERENCES_KEY; 181cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 182cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 183892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung DeviceProfile initDynamicGrid(Context context, int minWidth, int minHeight, 184892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung int width, int height, 185892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung int availableWidth, int availableHeight) { 1865f8afe6280eae34620067696173e71943e1a30a3Winson Chung if (mDynamicGrid == null) { 187f7d458543e64307b01de803d2ddfee2f21b0bd28Winson Chung mDynamicGrid = new DynamicGrid(context, 188f7d458543e64307b01de803d2ddfee2f21b0bd28Winson Chung context.getResources(), 189892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung minWidth, minHeight, width, height, 190892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung availableWidth, availableHeight); 1916e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung mDynamicGrid.getDeviceProfile().addCallback(this); 1925f8afe6280eae34620067696173e71943e1a30a3Winson Chung } 1935f8afe6280eae34620067696173e71943e1a30a3Winson Chung 1945f8afe6280eae34620067696173e71943e1a30a3Winson Chung // Update the icon size 195892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung DeviceProfile grid = mDynamicGrid.getDeviceProfile(); 1966e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung grid.updateFromConfiguration(context, context.getResources(), width, height, 197892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung availableWidth, availableHeight); 1985f8afe6280eae34620067696173e71943e1a30a3Winson Chung return grid; 1995f8afe6280eae34620067696173e71943e1a30a3Winson Chung } 200b38002419dcb456b51f5d320b224737f16a07088Winson Chung public DynamicGrid getDynamicGrid() { 2015f8afe6280eae34620067696173e71943e1a30a3Winson Chung return mDynamicGrid; 2025f8afe6280eae34620067696173e71943e1a30a3Winson Chung } 2035f8afe6280eae34620067696173e71943e1a30a3Winson Chung 204e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler public boolean isScreenLarge() { 205e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return mIsScreenLarge; 206cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 207cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 208104c45677660586026a7e74ef8c47d396403d50eMichael Jurka // Need a version that doesn't require an instance of LauncherAppState for the wallpaper picker 209104c45677660586026a7e74ef8c47d396403d50eMichael Jurka public static boolean isScreenLarge(Resources res) { 210104c45677660586026a7e74ef8c47d396403d50eMichael Jurka return res.getBoolean(R.bool.is_large_tablet); 211104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 212104c45677660586026a7e74ef8c47d396403d50eMichael Jurka 213cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static boolean isScreenLandscape(Context context) { 214cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return context.getResources().getConfiguration().orientation == 215cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler Configuration.ORIENTATION_LANDSCAPE; 216cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 217cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 218e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler public float getScreenDensity() { 219e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return mScreenDensity; 220cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 221cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 222e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler public int getLongPressTimeout() { 223e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return mLongPressTimeout; 224cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 2256e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung 226a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka public void onWallpaperChanged() { 227a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka mWallpaperChangedSinceLastCheck = true; 228a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka } 229a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka 230a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka public boolean hasWallpaperChangedSinceLastCheck() { 231a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka boolean result = mWallpaperChangedSinceLastCheck; 232a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka mWallpaperChangedSinceLastCheck = false; 233a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka return result; 234a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka } 235a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka 2366e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung @Override 2376e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung public void onAvailableSizeChanged(DeviceProfile grid) { 2386e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung Utilities.setIconSize(grid.iconSizePx); 2396e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung } 240cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler} 241