LauncherAppState.java revision aeff7ea43409d817490fbb8c22b8d4b9725bb54f
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
33aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren    private static final boolean DEBUG = true; // TODO STOPSHIP: set this to false
34aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren
3516f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal    private final AppFilter mAppFilter;
3616f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal    private final BuildInfo mBuildInfo;
37cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    private LauncherModel mModel;
38cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    private IconCache mIconCache;
39cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb;
40e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    private boolean mIsScreenLarge;
41e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    private float mScreenDensity;
42e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    private int mLongPressTimeout = 300;
43a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka    private boolean mWallpaperChangedSinceLastCheck;
44cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
45e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    private static WeakReference<LauncherProvider> sLauncherProvider;
46e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    private static Context sContext;
47cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
48e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    private static LauncherAppState INSTANCE;
49cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
505f8afe6280eae34620067696173e71943e1a30a3Winson Chung    private DynamicGrid mDynamicGrid;
515f8afe6280eae34620067696173e71943e1a30a3Winson Chung
52cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    public static LauncherAppState getInstance() {
53e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        if (INSTANCE == null) {
54e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler            INSTANCE = new LauncherAppState();
55e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        }
56cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        return INSTANCE;
57cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
58cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
59d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren    public static LauncherAppState getInstanceNoCreate() {
60d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren        return INSTANCE;
61d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren    }
62d8fe6de10d5ffc293f771b070bd1361a027757bbChris Wren
63cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    public Context getContext() {
64e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        return sContext;
65cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
66cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
67e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    public static void setApplicationContext(Context context) {
68e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        if (sContext != null) {
69e060b0b3c72b93b47031f0f33bf18b121fb99333Daniel Sandler            Log.w(Launcher.TAG, "setApplicationContext called twice! old=" + sContext + " new=" + context);
70e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        }
71e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        sContext = context.getApplicationContext();
72e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    }
73b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler
74e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    private LauncherAppState() {
75e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        if (sContext == null) {
76e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler            throw new IllegalStateException("LauncherAppState inited before app context set");
77e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        }
78cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
79e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        Log.v(Launcher.TAG, "LauncherAppState inited");
80924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler
81e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        if (sContext.getResources().getBoolean(R.bool.debug_memory_enabled)) {
82e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler            MemoryTracker.startTrackingMe(sContext, "L");
83b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler        }
84b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler
85e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        // set sIsScreenXLarge and mScreenDensity *before* creating icon cache
86104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        mIsScreenLarge = isScreenLarge(sContext.getResources());
87e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        mScreenDensity = sContext.getResources().getDisplayMetrics().density;
88b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler
896e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka        recreateWidgetPreviewDb();
90e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        mIconCache = new IconCache(sContext);
911307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert
921307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert        mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class));
9316f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal        mBuildInfo = BuildInfo.loadByName(sContext.getString(R.string.build_info_class));
941307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert        mModel = new LauncherModel(this, mIconCache, mAppFilter);
95cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
96cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        // Register intent receivers
97cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
98cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
99cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
100cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter.addDataScheme("package");
101e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        sContext.registerReceiver(mModel, filter);
102cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter = new IntentFilter();
103cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
104cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
105cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter.addAction(Intent.ACTION_LOCALE_CHANGED);
106cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
107e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        sContext.registerReceiver(mModel, filter);
108cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter = new IntentFilter();
109cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
110e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        sContext.registerReceiver(mModel, filter);
111cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter = new IntentFilter();
112cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED);
113e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        sContext.registerReceiver(mModel, filter);
114cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
115cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        // Register for changes to the favorites
116e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        ContentResolver resolver = sContext.getContentResolver();
117cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,
118cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler                mFavoritesObserver);
119cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
1206e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka
1216e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka    public void recreateWidgetPreviewDb() {
1226e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka        if (mWidgetPreviewCacheDb != null) {
1236e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka            mWidgetPreviewCacheDb.close();
1246e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka        }
1256e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka        mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext);
1266e27f642ae66dd1920b25b527fced7268943d11aMichael Jurka    }
127cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
128cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    /**
129cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler     * Call from Application.onTerminate(), which is not guaranteed to ever be called.
130cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler     */
131cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    public void onTerminate() {
132e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        sContext.unregisterReceiver(mModel);
133cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
134e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        ContentResolver resolver = sContext.getContentResolver();
135cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        resolver.unregisterContentObserver(mFavoritesObserver);
136cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
137cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
138cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    /**
139cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler     * Receives notifications whenever the user favorites have changed.
140cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler     */
141cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) {
142cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        @Override
143cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        public void onChange(boolean selfChange) {
144cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler            // If the database has ever changed, then we really need to force a reload of the
145cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler            // workspace on the next load
146cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler            mModel.resetLoadedState(false, true);
147cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler            mModel.startLoaderFromBackground();
148cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        }
149cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    };
150cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
151cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    LauncherModel setLauncher(Launcher launcher) {
152e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        if (mModel == null) {
153e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler            throw new IllegalStateException("setLauncher() called before init()");
154e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        }
155cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        mModel.initialize(launcher);
156cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        return mModel;
157cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
158cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
159cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    IconCache getIconCache() {
160cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        return mIconCache;
161cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
162cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
163cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    LauncherModel getModel() {
164cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        return mModel;
165cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
166cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
1671307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert    boolean shouldShowAppOrWidgetProvider(ComponentName componentName) {
1681307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert        return mAppFilter == null || mAppFilter.shouldShowApp(componentName);
1691307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert    }
1701307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert
171cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    WidgetPreviewLoader.CacheDb getWidgetPreviewCacheDb() {
172cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        return mWidgetPreviewCacheDb;
173cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
174cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
175e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    static void setLauncherProvider(LauncherProvider provider) {
176e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        sLauncherProvider = new WeakReference<LauncherProvider>(provider);
177cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
178cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
179e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    static LauncherProvider getLauncherProvider() {
180e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        return sLauncherProvider.get();
181924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler    }
182924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler
183cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    public static String getSharedPreferencesKey() {
184e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        return SHARED_PREFERENCES_KEY;
185cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
186cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
187892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung    DeviceProfile initDynamicGrid(Context context, int minWidth, int minHeight,
188892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung                                  int width, int height,
189892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung                                  int availableWidth, int availableHeight) {
1905f8afe6280eae34620067696173e71943e1a30a3Winson Chung        if (mDynamicGrid == null) {
191f7d458543e64307b01de803d2ddfee2f21b0bd28Winson Chung            mDynamicGrid = new DynamicGrid(context,
192f7d458543e64307b01de803d2ddfee2f21b0bd28Winson Chung                    context.getResources(),
193892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung                    minWidth, minHeight, width, height,
194892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung                    availableWidth, availableHeight);
1956e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung            mDynamicGrid.getDeviceProfile().addCallback(this);
1965f8afe6280eae34620067696173e71943e1a30a3Winson Chung        }
1975f8afe6280eae34620067696173e71943e1a30a3Winson Chung
1985f8afe6280eae34620067696173e71943e1a30a3Winson Chung        // Update the icon size
199892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung        DeviceProfile grid = mDynamicGrid.getDeviceProfile();
2006e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung        grid.updateFromConfiguration(context, context.getResources(), width, height,
201892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung                availableWidth, availableHeight);
2025f8afe6280eae34620067696173e71943e1a30a3Winson Chung        return grid;
2035f8afe6280eae34620067696173e71943e1a30a3Winson Chung    }
204b38002419dcb456b51f5d320b224737f16a07088Winson Chung    public DynamicGrid getDynamicGrid() {
2055f8afe6280eae34620067696173e71943e1a30a3Winson Chung        return mDynamicGrid;
2065f8afe6280eae34620067696173e71943e1a30a3Winson Chung    }
2075f8afe6280eae34620067696173e71943e1a30a3Winson Chung
208e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    public boolean isScreenLarge() {
209e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        return mIsScreenLarge;
210cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
211cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
212104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    // Need a version that doesn't require an instance of LauncherAppState for the wallpaper picker
213104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    public static boolean isScreenLarge(Resources res) {
214104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        return res.getBoolean(R.bool.is_large_tablet);
215104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
216104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
217cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    public static boolean isScreenLandscape(Context context) {
218cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler        return context.getResources().getConfiguration().orientation ==
219cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler            Configuration.ORIENTATION_LANDSCAPE;
220cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
221cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
222e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    public float getScreenDensity() {
223e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        return mScreenDensity;
224cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
225cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler
226e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler    public int getLongPressTimeout() {
227e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler        return mLongPressTimeout;
228cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler    }
2296e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung
230a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka    public void onWallpaperChanged() {
231a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka        mWallpaperChangedSinceLastCheck = true;
232a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka    }
233a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka
234a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka    public boolean hasWallpaperChangedSinceLastCheck() {
235a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka        boolean result = mWallpaperChangedSinceLastCheck;
236a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka        mWallpaperChangedSinceLastCheck = false;
237a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka        return result;
238a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka    }
239a6a0547fa6df0769fcd107a2e5f7c7d527fa0700Michael Jurka
2406e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung    @Override
2416e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung    public void onAvailableSizeChanged(DeviceProfile grid) {
2426e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung        Utilities.setIconSize(grid.iconSizePx);
2436e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung    }
24416f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal
24516f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal    public static boolean isDisableAllApps() {
24616f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal        // Returns false on non-dogfood builds.
24716f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal        return getInstance().mBuildInfo.isDogfoodBuild() &&
24816f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal                Launcher.isPropertyEnabled(Launcher.DISABLE_ALL_APPS_PROPERTY);
24916f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal    }
250eedb00a674358bb88dce1e0d3a90bd6cb9e97cfcJorim Jaggi
251eedb00a674358bb88dce1e0d3a90bd6cb9e97cfcJorim Jaggi    public static boolean isDogfoodBuild() {
252eedb00a674358bb88dce1e0d3a90bd6cb9e97cfcJorim Jaggi        return getInstance().mBuildInfo.isDogfoodBuild();
253eedb00a674358bb88dce1e0d3a90bd6cb9e97cfcJorim Jaggi    }
254aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren
255aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren    public void setPackageState(String pkgName, int state) {
256aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren        if (DEBUG) Log.d(TAG, "setPackageState(" + pkgName + ", " +  state  + ")");
257aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren        mModel.setPackageState(pkgName, state);
258aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren    }
259cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler}
260