LauncherAppState.java revision 924b993c750e6de8537afb750c2d2b9932efbdac
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; 20cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.content.ContentResolver; 21cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.content.Context; 22cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.content.Intent; 23cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.content.IntentFilter; 24cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.content.res.Configuration; 25cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.database.ContentObserver; 26cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport android.os.Handler; 27cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 28cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerimport java.lang.ref.WeakReference; 29cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 30cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandlerpublic class LauncherAppState { 31cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private Context mContext; 32cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private LauncherModel mModel; 33cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private IconCache mIconCache; 34cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb; 35cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private static boolean sIsScreenLarge; 36cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private static float sScreenDensity; 37cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private static int sLongPressTimeout = 300; 38cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private static final String sSharedPreferencesKey = "com.android.launcher3.prefs"; 39924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler private long mUptime; 40cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 41924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler WeakReference<LauncherProvider> mLauncherProvider; 42cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 43cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private static final LauncherAppState INSTANCE = new LauncherAppState(); 44cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 45cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static LauncherAppState getInstance() { 46cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return INSTANCE; 47cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 48cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 49cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static void init(Context context) { 50cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler INSTANCE.initialize(context); 51cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 52cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 53cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public Context getContext() { 54cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mContext; 55cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 56cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 57cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private LauncherAppState() { } 58cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 59cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private void initialize(Context context) { 60cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mContext = context; 61cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 62924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler mUptime = System.currentTimeMillis(); 63924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler 64cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // set sIsScreenXLarge and sScreenDensity *before* creating icon cache 65cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler sIsScreenLarge = context.getResources().getBoolean(R.bool.is_large_screen); 66cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler sScreenDensity = context.getResources().getDisplayMetrics().density; 67cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 68cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(context); 69cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mIconCache = new IconCache(context); 70cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mModel = new LauncherModel(context, mIconCache); 71cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 72cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // Register intent receivers 73cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 74cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 75cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_PACKAGE_CHANGED); 76cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addDataScheme("package"); 77cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler context.registerReceiver(mModel, filter); 78cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter = new IntentFilter(); 79cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); 80cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); 81cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_LOCALE_CHANGED); 82cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); 83cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler context.registerReceiver(mModel, filter); 84cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter = new IntentFilter(); 85cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED); 86cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler context.registerReceiver(mModel, filter); 87cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter = new IntentFilter(); 88cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED); 89cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler context.registerReceiver(mModel, filter); 90cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 91cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // Register for changes to the favorites 92cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler ContentResolver resolver = context.getContentResolver(); 93cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true, 94cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mFavoritesObserver); 95cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 96cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 97cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler /** 98cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * Call from Application.onTerminate(), which is not guaranteed to ever be called. 99cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler */ 100cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public void onTerminate() { 101cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mContext.unregisterReceiver(mModel); 102cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 103cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler ContentResolver resolver = mContext.getContentResolver(); 104cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler resolver.unregisterContentObserver(mFavoritesObserver); 105cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 106cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 107cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler /** 108cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler * Receives notifications whenever the user favorites have changed. 109cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler */ 110cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) { 111cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler @Override 112cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public void onChange(boolean selfChange) { 113cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // If the database has ever changed, then we really need to force a reload of the 114cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler // workspace on the next load 115cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mModel.resetLoadedState(false, true); 116cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mModel.startLoaderFromBackground(); 117cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 118cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler }; 119cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 120cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherModel setLauncher(Launcher launcher) { 121cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mModel.initialize(launcher); 122cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mModel; 123cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 124cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 125cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler IconCache getIconCache() { 126cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mIconCache; 127cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 128cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 129cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherModel getModel() { 130cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mModel; 131cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 132cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 133cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler WidgetPreviewLoader.CacheDb getWidgetPreviewCacheDb() { 134cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mWidgetPreviewCacheDb; 135cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 136cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 137924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler void setLauncherProvider(LauncherProvider provider) { 138cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mLauncherProvider = new WeakReference<LauncherProvider>(provider); 139cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 140cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 141cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherProvider getLauncherProvider() { 142cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return mLauncherProvider.get(); 143cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 144cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 145924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler /** 146924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler * @return Milliseconds since the application state was created. 147924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler */ 148924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler public long getUptime() { 149924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler return System.currentTimeMillis() - mUptime; 150924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler } 151924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler 152cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static String getSharedPreferencesKey() { 153cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return sSharedPreferencesKey; 154cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 155cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 156cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static boolean isScreenLarge() { 157cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return sIsScreenLarge; 158cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 159cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 160cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static boolean isScreenLandscape(Context context) { 161cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return context.getResources().getConfiguration().orientation == 162cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler Configuration.ORIENTATION_LANDSCAPE; 163cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 164cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 165cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static float getScreenDensity() { 166cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return sScreenDensity; 167cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 168cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler 169cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler public static int getLongPressTimeout() { 170cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler return sLongPressTimeout; 171cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler } 172cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler} 173