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