LauncherAppState.java revision 71b5c0b988a64b3a0613ded5403749bc537ee8a5
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 194bbf419bf98c00decc74b429320258c2a16faeecSunny Goyalimport android.annotation.TargetApi; 20cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.app.SearchManager; 21e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyalimport android.content.ComponentName; 22e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyalimport android.content.ContentResolver; 23e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyalimport android.content.Context; 24e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyalimport android.content.Intent; 25e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyalimport android.content.IntentFilter; 26cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.content.res.Configuration; 27104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.content.res.Resources; 28cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.database.ContentObserver; 2933d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyalimport android.graphics.Point; 304bbf419bf98c00decc74b429320258c2a16faeecSunny Goyalimport android.os.Build; 31cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.os.Handler; 3233d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyalimport android.util.DisplayMetrics; 33b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandlerimport android.util.Log; 3433d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyalimport android.view.Display; 3571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyalimport android.view.View.AccessibilityDelegate; 3633d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyalimport android.view.WindowManager; 3771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal 38ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.LauncherAppsCompat; 394390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyalimport com.android.launcher3.compat.PackageInstallerCompat; 40e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyalimport com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo; 4171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal 42cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport java.lang.ref.WeakReference; 43e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyalimport java.util.ArrayList; 44cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 456e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chungpublic class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks { 465f8afe6280eae34620067696173e71943e1a30a3Winson Chung private static final String TAG = "LauncherAppState"; 47e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler 48ee52336a9ed0c98f78831a0e44b21f5a8d8c17d1Chris Wren private static final boolean DEBUG = false; 49aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren 5016f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal private final AppFilter mAppFilter; 5116f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal private final BuildInfo mBuildInfo; 52e0f58d73646871497596fb8f7321d407e7565c28Sunny Goyal private final LauncherModel mModel; 53e0f58d73646871497596fb8f7321d407e7565c28Sunny Goyal private final IconCache mIconCache; 54e0f58d73646871497596fb8f7321d407e7565c28Sunny Goyal 55e0f58d73646871497596fb8f7321d407e7565c28Sunny Goyal private final boolean mIsScreenLarge; 56e0f58d73646871497596fb8f7321d407e7565c28Sunny Goyal private final float mScreenDensity; 57e0f58d73646871497596fb8f7321d407e7565c28Sunny Goyal private final int mLongPressTimeout = 300; 58e0f58d73646871497596fb8f7321d407e7565c28Sunny Goyal 59cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb; 60a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka private boolean mWallpaperChangedSinceLastCheck; 61cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 62e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private static WeakReference<LauncherProvider> sLauncherProvider; 63e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private static Context sContext; 64cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 65e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private static LauncherAppState INSTANCE; 66cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 675f8afe6280eae34620067696173e71943e1a30a3Winson Chung private DynamicGrid mDynamicGrid; 6871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal private AccessibilityDelegate mAccessibilityDelegate; 695f8afe6280eae34620067696173e71943e1a30a3Winson Chung 70cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static LauncherAppState getInstance() { 71e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (INSTANCE == null) { 72e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler INSTANCE = new LauncherAppState(); 73e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler } 74cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return INSTANCE; 75cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 76cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 77d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren public static LauncherAppState getInstanceNoCreate() { 78d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren return INSTANCE; 79d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren } 80d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren 81cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public Context getContext() { 82e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return sContext; 83cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 84cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 85e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler public static void setApplicationContext(Context context) { 86e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (sContext != null) { 87e060b0b3c72b93b47031f0f33bf18b121fb99333Daniel Sandler Log.w(Launcher.TAG, "setApplicationContext called twice! old=" + sContext + " new=" + context); 88e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler } 89e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext = context.getApplicationContext(); 90e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler } 91b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler 92e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler private LauncherAppState() { 93e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (sContext == null) { 94e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler throw new IllegalStateException("LauncherAppState inited before app context set"); 95e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler } 96cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 97e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler Log.v(Launcher.TAG, "LauncherAppState inited"); 98924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler 99e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (sContext.getResources().getBoolean(R.bool.debug_memory_enabled)) { 100e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler MemoryTracker.startTrackingMe(sContext, "L"); 101b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler } 102b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler 103e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler // set sIsScreenXLarge and mScreenDensity *before* creating icon cache 104104c45677660586026a7e74ef8c47d396403d50eMichael Jurka mIsScreenLarge = isScreenLarge(sContext.getResources()); 105e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler mScreenDensity = sContext.getResources().getDisplayMetrics().density; 106b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler 1076e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka recreateWidgetPreviewDb(); 108e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler mIconCache = new IconCache(sContext); 1091307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert 1101307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class)); 11116f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal mBuildInfo = BuildInfo.loadByName(sContext.getString(R.string.build_info_class)); 1121307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert mModel = new LauncherModel(this, mIconCache, mAppFilter); 113ed13187a745866483139e2878037e1f8427ce567Kenny Guy final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(sContext); 114c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy launcherApps.addOnAppsChangedCallback(mModel); 115cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 116cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // Register intent receivers 117ed13187a745866483139e2878037e1f8427ce567Kenny Guy IntentFilter filter = new IntentFilter(); 118cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_LOCALE_CHANGED); 119cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); 120e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext.registerReceiver(mModel, filter); 121cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter = new IntentFilter(); 122cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED); 123e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext.registerReceiver(mModel, filter); 124cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter = new IntentFilter(); 125cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED); 126e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext.registerReceiver(mModel, filter); 127cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 128cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // Register for changes to the favorites 129e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler ContentResolver resolver = sContext.getContentResolver(); 130cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true, 131cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mFavoritesObserver); 132cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 1331317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy 1346e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka public void recreateWidgetPreviewDb() { 1356e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka if (mWidgetPreviewCacheDb != null) { 1366e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka mWidgetPreviewCacheDb.close(); 1376e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka } 1386e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext); 1396e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka } 140cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 141cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler /** 142cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * Call from Application.onTerminate(), which is not guaranteed to ever be called. 143cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler */ 144cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public void onTerminate() { 145e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sContext.unregisterReceiver(mModel); 1461317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(sContext); 147c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy launcherApps.removeOnAppsChangedCallback(mModel); 1484390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal PackageInstallerCompat.getInstance(sContext).onStop(); 149cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 150e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler ContentResolver resolver = sContext.getContentResolver(); 151cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler resolver.unregisterContentObserver(mFavoritesObserver); 152cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 153cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 154cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler /** 155cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * Receives notifications whenever the user favorites have changed. 156cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler */ 157cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) { 158cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler @Override 159cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public void onChange(boolean selfChange) { 160cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // If the database has ever changed, then we really need to force a reload of the 161cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // workspace on the next load 162cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mModel.resetLoadedState(false, true); 163cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mModel.startLoaderFromBackground(); 164cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 165cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler }; 166cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 167cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherModel setLauncher(Launcher launcher) { 168cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mModel.initialize(launcher); 16971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal mAccessibilityDelegate = ((launcher != null) && Utilities.isLmpOrAbove()) ? 17071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal new LauncherAccessibilityDelegate(launcher) : null; 171cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mModel; 172cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 173cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 17471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal AccessibilityDelegate getAccessibilityDelegate() { 17571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal return mAccessibilityDelegate; 17671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal } 17771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal 178349426234e8c5a0e5bcf2c8d94dbb9844b5f724aSunny Goyal public IconCache getIconCache() { 179cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mIconCache; 180cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 181cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 182cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherModel getModel() { 183cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mModel; 184cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 185cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 1861307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert boolean shouldShowAppOrWidgetProvider(ComponentName componentName) { 1871307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert return mAppFilter == null || mAppFilter.shouldShowApp(componentName); 1881307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert } 1891307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert 190cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler WidgetPreviewLoader.CacheDb getWidgetPreviewCacheDb() { 191cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mWidgetPreviewCacheDb; 192cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 193cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 194e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler static void setLauncherProvider(LauncherProvider provider) { 195e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler sLauncherProvider = new WeakReference<LauncherProvider>(provider); 196cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 197cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 198e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler static LauncherProvider getLauncherProvider() { 199e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return sLauncherProvider.get(); 200924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler } 201924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler 202cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static String getSharedPreferencesKey() { 20328db280b7af14614f2b168ea8c5d496cda650321Helena Josol return LauncherFiles.SHARED_PREFERENCES_KEY; 204cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 205cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 2064bbf419bf98c00decc74b429320258c2a16faeecSunny Goyal @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 20733d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal DeviceProfile initDynamicGrid(Context context) { 208b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren mDynamicGrid = createDynamicGrid(context, mDynamicGrid); 209b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren mDynamicGrid.getDeviceProfile().addCallback(this); 210b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren return mDynamicGrid.getDeviceProfile(); 211b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren } 212b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren 213b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 214b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren static DynamicGrid createDynamicGrid(Context context, DynamicGrid dynamicGrid) { 21533d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal // Determine the dynamic grid properties 21633d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 21733d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal Display display = wm.getDefaultDisplay(); 21833d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal 21933d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal Point realSize = new Point(); 22033d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal display.getRealSize(realSize); 22133d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal DisplayMetrics dm = new DisplayMetrics(); 22233d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal display.getMetrics(dm); 22333d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal 224b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren if (dynamicGrid == null) { 22533d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal Point smallestSize = new Point(); 22633d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal Point largestSize = new Point(); 22733d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal display.getCurrentSizeRange(smallestSize, largestSize); 22833d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal 229b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren dynamicGrid = new DynamicGrid(context, 230f7d458543e64307b01de803d2ddfee2f21b0bd28Winson Chung context.getResources(), 23133d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal Math.min(smallestSize.x, smallestSize.y), 23233d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal Math.min(largestSize.x, largestSize.y), 23333d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal realSize.x, realSize.y, 23433d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal dm.widthPixels, dm.heightPixels); 2355f8afe6280eae34620067696173e71943e1a30a3Winson Chung } 2365f8afe6280eae34620067696173e71943e1a30a3Winson Chung 2375f8afe6280eae34620067696173e71943e1a30a3Winson Chung // Update the icon size 238b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren DeviceProfile grid = dynamicGrid.getDeviceProfile(); 23933d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal grid.updateFromConfiguration(context, context.getResources(), 24033d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal realSize.x, realSize.y, 24133d443897658e6ad8b76bd2e58e3598161fd3eadSunny Goyal dm.widthPixels, dm.heightPixels); 242b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren return dynamicGrid; 2435f8afe6280eae34620067696173e71943e1a30a3Winson Chung } 244b02e611d15bd6fbb05814adaa804dd68181c556cChris Wren 245b38002419dcb456b51f5d320b224737f16a07088Winson Chung public DynamicGrid getDynamicGrid() { 2465f8afe6280eae34620067696173e71943e1a30a3Winson Chung return mDynamicGrid; 2475f8afe6280eae34620067696173e71943e1a30a3Winson Chung } 2485f8afe6280eae34620067696173e71943e1a30a3Winson Chung 249e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler public boolean isScreenLarge() { 250e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return mIsScreenLarge; 251cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 252cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 253104c45677660586026a7e74ef8c47d396403d50eMichael Jurka // Need a version that doesn't require an instance of LauncherAppState for the wallpaper picker 254104c45677660586026a7e74ef8c47d396403d50eMichael Jurka public static boolean isScreenLarge(Resources res) { 255104c45677660586026a7e74ef8c47d396403d50eMichael Jurka return res.getBoolean(R.bool.is_large_tablet); 256104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 257104c45677660586026a7e74ef8c47d396403d50eMichael Jurka 258cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static boolean isScreenLandscape(Context context) { 259cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return context.getResources().getConfiguration().orientation == 260cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler Configuration.ORIENTATION_LANDSCAPE; 261cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 262cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 263e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler public float getScreenDensity() { 264e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return mScreenDensity; 265cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 266cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 267e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler public int getLongPressTimeout() { 268e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler return mLongPressTimeout; 269cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 2706e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung 271a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka public void onWallpaperChanged() { 272a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka mWallpaperChangedSinceLastCheck = true; 273a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka } 274a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka 275a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka public boolean hasWallpaperChangedSinceLastCheck() { 276a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka boolean result = mWallpaperChangedSinceLastCheck; 277a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka mWallpaperChangedSinceLastCheck = false; 278a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka return result; 279a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka } 280a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka 2816e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung @Override 2826e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung public void onAvailableSizeChanged(DeviceProfile grid) { 2836e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung Utilities.setIconSize(grid.iconSizePx); 2846e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung } 28516f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal 28616f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal public static boolean isDisableAllApps() { 28716f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal // Returns false on non-dogfood builds. 28816f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal return getInstance().mBuildInfo.isDogfoodBuild() && 2894bbf419bf98c00decc74b429320258c2a16faeecSunny Goyal Utilities.isPropertyEnabled(Launcher.DISABLE_ALL_APPS_PROPERTY); 29016f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal } 291eedb00a674358bb88dce1e0d3a90bd6cb9e97cfcJorim Jaggi 292eedb00a674358bb88dce1e0d3a90bd6cb9e97cfcJorim Jaggi public static boolean isDogfoodBuild() { 293eedb00a674358bb88dce1e0d3a90bd6cb9e97cfcJorim Jaggi return getInstance().mBuildInfo.isDogfoodBuild(); 294eedb00a674358bb88dce1e0d3a90bd6cb9e97cfcJorim Jaggi } 295aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren 296e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyal public void setPackageState(ArrayList<PackageInstallInfo> installInfo) { 297e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyal mModel.setPackageState(installInfo); 298aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren } 299a22666f68151269853e7ab6ab696ee6361bac793Sunny Goyal 300a22666f68151269853e7ab6ab696ee6361bac793Sunny Goyal /** 301a22666f68151269853e7ab6ab696ee6361bac793Sunny Goyal * Updates the icons and label of all icons for the provided package name. 302a22666f68151269853e7ab6ab696ee6361bac793Sunny Goyal */ 303a22666f68151269853e7ab6ab696ee6361bac793Sunny Goyal public void updatePackageBadge(String packageName) { 304a22666f68151269853e7ab6ab696ee6361bac793Sunny Goyal mModel.updatePackageBadge(packageName); 305a22666f68151269853e7ab6ab696ee6361bac793Sunny Goyal } 306cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler} 307