CategoryManager.java revision 5adc26695fb4282125d4b6b641e04820a028d87b
122a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang/** 222a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * Copyright (C) 2016 The Android Open Source Project 322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * 422a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 522a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * you may not use this file except in compliance with the License. 622a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * You may obtain a copy of the License at 722a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * 8c8a5b790fa13826b21aee97ed5d1960d785333daFan Zhang * http://www.apache.org/licenses/LICENSE-2.0 922a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * 1022a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * Unless required by applicable law or agreed to in writing, software 1122a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * distributed under the License is distributed on an "AS IS" BASIS, 1222a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * See the License for the specific language governing permissions and 1422a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang * limitations under the License. 1522a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang */ 1622a56d775d047a1926f2a6d9c855c802d561d487Fan Zhangpackage com.android.settingslib.drawer; 1722a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 1822a56d775d047a1926f2a6d9c855c802d561d487Fan Zhangimport android.content.ComponentName; 1922a56d775d047a1926f2a6d9c855c802d561d487Fan Zhangimport android.content.Context; 2022a56d775d047a1926f2a6d9c855c802d561d487Fan Zhangimport android.util.ArrayMap; 2122a56d775d047a1926f2a6d9c855c802d561d487Fan Zhangimport android.util.Log; 2222a56d775d047a1926f2a6d9c855c802d561d487Fan Zhangimport android.util.Pair; 2322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 245adc26695fb4282125d4b6b641e04820a028d87bFan Zhangimport com.android.settingslib.applications.InterestingConfigChanges; 255adc26695fb4282125d4b6b641e04820a028d87bFan Zhang 2622a56d775d047a1926f2a6d9c855c802d561d487Fan Zhangimport java.util.List; 2722a56d775d047a1926f2a6d9c855c802d561d487Fan Zhangimport java.util.Map; 2822a56d775d047a1926f2a6d9c855c802d561d487Fan Zhangimport java.util.Set; 2922a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 3022a56d775d047a1926f2a6d9c855c802d561d487Fan Zhangpublic class CategoryManager { 3122a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 3222a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang private static final String TAG = "CategoryManager"; 3322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 3422a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang private static CategoryManager sInstance; 355adc26695fb4282125d4b6b641e04820a028d87bFan Zhang private final InterestingConfigChanges mInterestingConfigChanges; 3622a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 3722a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang // Tile cache (key: <packageName, activityName>, value: tile) 3822a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang private final Map<Pair<String, String>, Tile> mTileByComponentCache; 3922a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 4022a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang // Tile cache (key: category key, value: category) 4122a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang private final Map<String, DashboardCategory> mCategoryByKeyMap; 4222a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 4322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang private List<DashboardCategory> mCategories; 4422a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 455adc26695fb4282125d4b6b641e04820a028d87bFan Zhang public static CategoryManager get(Context context) { 4622a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang if (sInstance == null) { 475adc26695fb4282125d4b6b641e04820a028d87bFan Zhang sInstance = new CategoryManager(context); 4822a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 4922a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang return sInstance; 5022a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 5122a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 525adc26695fb4282125d4b6b641e04820a028d87bFan Zhang CategoryManager(Context context) { 5322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang mTileByComponentCache = new ArrayMap<>(); 5422a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang mCategoryByKeyMap = new ArrayMap<>(); 555adc26695fb4282125d4b6b641e04820a028d87bFan Zhang mInterestingConfigChanges = new InterestingConfigChanges(); 565adc26695fb4282125d4b6b641e04820a028d87bFan Zhang mInterestingConfigChanges.applyNewConfig(context.getResources()); 5722a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 5822a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 59c8a5b790fa13826b21aee97ed5d1960d785333daFan Zhang public synchronized DashboardCategory getTilesByCategory(Context context, String categoryKey) { 6022a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang tryInitCategories(context); 6122a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 6222a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang final DashboardCategory category = mCategoryByKeyMap.get(categoryKey); 6322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang if (category == null) { 6422a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang throw new IllegalStateException("Can't find category with key " + categoryKey); 6522a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 6622a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang return category; 6722a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 6822a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 69c8a5b790fa13826b21aee97ed5d1960d785333daFan Zhang public synchronized List<DashboardCategory> getCategories(Context context) { 7022a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang tryInitCategories(context); 7122a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang return mCategories; 7222a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 7322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 74c8a5b790fa13826b21aee97ed5d1960d785333daFan Zhang public synchronized void reloadAllCategories(Context context) { 755adc26695fb4282125d4b6b641e04820a028d87bFan Zhang final boolean forceClearCache = mInterestingConfigChanges.applyNewConfig( 765adc26695fb4282125d4b6b641e04820a028d87bFan Zhang context.getResources()); 77c8a5b790fa13826b21aee97ed5d1960d785333daFan Zhang mCategories = null; 785adc26695fb4282125d4b6b641e04820a028d87bFan Zhang tryInitCategories(context, forceClearCache); 7922a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 8022a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 81c8a5b790fa13826b21aee97ed5d1960d785333daFan Zhang public synchronized void updateCategoryFromBlacklist(Set<ComponentName> tileBlacklist) { 8222a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang if (mCategories == null) { 8322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang Log.w(TAG, "Category is null, skipping blacklist update"); 8422a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 8522a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang for (int i = 0; i < mCategories.size(); i++) { 8622a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang DashboardCategory category = mCategories.get(i); 8722a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang for (int j = 0; j < category.tiles.size(); j++) { 8822a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang Tile tile = category.tiles.get(j); 8922a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang if (tileBlacklist.contains(tile.intent.getComponent())) { 9022a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang category.tiles.remove(j--); 9122a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 9222a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 9322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 9422a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 9522a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 96c8a5b790fa13826b21aee97ed5d1960d785333daFan Zhang private synchronized void tryInitCategories(Context context) { 975adc26695fb4282125d4b6b641e04820a028d87bFan Zhang // Keep cached tiles by default. The cache is only invalidated when InterestingConfigChange 985adc26695fb4282125d4b6b641e04820a028d87bFan Zhang // happens. 995adc26695fb4282125d4b6b641e04820a028d87bFan Zhang tryInitCategories(context, false /* forceClearCache */); 1005adc26695fb4282125d4b6b641e04820a028d87bFan Zhang } 1015adc26695fb4282125d4b6b641e04820a028d87bFan Zhang 1025adc26695fb4282125d4b6b641e04820a028d87bFan Zhang private synchronized void tryInitCategories(Context context, boolean forceClearCache) { 10322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang if (mCategories == null) { 1045adc26695fb4282125d4b6b641e04820a028d87bFan Zhang if (forceClearCache) { 1055adc26695fb4282125d4b6b641e04820a028d87bFan Zhang mTileByComponentCache.clear(); 1065adc26695fb4282125d4b6b641e04820a028d87bFan Zhang } 10722a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang mCategoryByKeyMap.clear(); 10822a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang mCategories = TileUtils.getCategories(context, mTileByComponentCache, 10922a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang false /* categoryDefinedInManifest */); 11022a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang for (DashboardCategory category : mCategories) { 11122a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang mCategoryByKeyMap.put(category.key, category); 11222a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 11322a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 11422a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang } 11522a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang 11622a56d775d047a1926f2a6d9c855c802d561d487Fan Zhang} 117