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