Merge changes I7ef5921c,I3bbd09c5

* changes:
  Create test for CategoryManager.
  Backward-compat for DashboardCategory with app use old keys
This commit is contained in:
TreeHugger Robot
2016-11-02 19:50:42 +00:00
committed by Android (Google) Code Review
17 changed files with 352 additions and 18 deletions

View File

@@ -15,6 +15,9 @@
*/
package com.android.settingslib.drawer;
import java.util.HashMap;
import java.util.Map;
public final class CategoryKey {
// Activities in this category shows up in Settings homepage.
@@ -33,4 +36,14 @@ public final class CategoryKey {
public static final String CATEGORY_SECURITY = "com.android.settings.category.ia.security";
public static final String CATEGORY_ACCOUNT = "com.android.settings.category.ia.accounts";
public static final String CATEGORY_SYSTEM = "com.android.settings.category.ia.system";
public static final Map<String, String> KEY_COMPAT_MAP;
static {
KEY_COMPAT_MAP = new HashMap<>();
KEY_COMPAT_MAP.put("com.android.settings.category.wireless", CATEGORY_NETWORK);
KEY_COMPAT_MAP.put("com.android.settings.category.device", CATEGORY_SYSTEM);
KEY_COMPAT_MAP.put("com.android.settings.category.personal", CATEGORY_SYSTEM);
KEY_COMPAT_MAP.put("com.android.settings.category.system", CATEGORY_SYSTEM);
}
}

View File

@@ -17,14 +17,18 @@ package com.android.settingslib.drawer;
import android.content.ComponentName;
import android.content.Context;
import android.support.annotation.VisibleForTesting;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
import com.android.settingslib.applications.InterestingConfigChanges;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class CategoryManager {
@@ -106,7 +110,57 @@ public class CategoryManager {
for (DashboardCategory category : mCategories) {
mCategoryByKeyMap.put(category.key, category);
}
backwardCompatCleanupForCategory(mTileByComponentCache, mCategoryByKeyMap);
}
}
@VisibleForTesting
synchronized void backwardCompatCleanupForCategory(
Map<Pair<String, String>, Tile> tileByComponentCache,
Map<String, DashboardCategory> categoryByKeyMap) {
// A package can use a) CategoryKey, b) old category keys, c) both.
// Check if a package uses old category key only.
// If yes, map them to new category key.
// Build a package name -> tile map first.
final Map<String, List<Tile>> packageToTileMap = new HashMap<>();
for (Entry<Pair<String, String>, Tile> tileEntry : tileByComponentCache.entrySet()) {
final String packageName = tileEntry.getKey().first;
List<Tile> tiles = packageToTileMap.get(packageName);
if (tiles == null) {
tiles = new ArrayList<>();
packageToTileMap.put(packageName, tiles);
}
tiles.add(tileEntry.getValue());
}
for (Entry<String, List<Tile>> entry : packageToTileMap.entrySet()) {
final List<Tile> tiles = entry.getValue();
// Loop map, find if all tiles from same package uses old key only.
boolean useNewKey = false;
boolean useOldKey = false;
for (Tile tile : tiles) {
if (CategoryKey.KEY_COMPAT_MAP.containsKey(tile.category)) {
useOldKey = true;
} else {
useNewKey = true;
break;
}
}
// Uses only old key, map them to new keys one by one.
if (useOldKey && !useNewKey) {
for (Tile tile : tiles) {
final String newCategoryKey = CategoryKey.KEY_COMPAT_MAP.get(tile.category);
tile.category = newCategoryKey;
// move tile to new category.
DashboardCategory newCategory = categoryByKeyMap.get(newCategoryKey);
if (newCategory == null) {
newCategory = new DashboardCategory();
categoryByKeyMap.put(newCategoryKey, newCategory);
}
newCategory.tiles.add(tile);
}
}
}
}
}

View File

@@ -1,4 +1,4 @@
# Copyright (C) 2015 The Android Open Source Project
# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -15,20 +15,5 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common
LOCAL_PACKAGE_NAME := SettingsLibTests
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test \
espresso-core \
mockito-target-minus-junit4
include frameworks/base/packages/SettingsLib/common.mk
include $(BUILD_PACKAGE)
# Include all makefiles in subdirectories
include $(call all-makefiles-under,$(LOCAL_PATH))

View File

@@ -0,0 +1,34 @@
# Copyright (C) 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common
LOCAL_PACKAGE_NAME := SettingsLibTests
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test \
espresso-core \
mockito-target-minus-junit4
include frameworks/base/packages/SettingsLib/common.mk
include $(BUILD_PACKAGE)

View File

@@ -0,0 +1,82 @@
# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
############################################################
# SettingsLib Shell app just for Robolectric test target. #
############################################################
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := SettingsLibShell
LOCAL_MODULE_TAGS := optional
LOCAL_PRIVILEGED_MODULE := true
LOCAL_JAVA_LIBRARIES := \
junit4-target \
platform-robolectric-prebuilt
LOCAL_STATIC_JAVA_LIBRARIES := \
platform-system-robolectric \
truth-prebuilt
LOCAL_AAPT_FLAGS := --auto-add-overlay \
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
include frameworks/base/packages/SettingsLib/common.mk
include $(BUILD_PACKAGE)
#############################################
# SettingsLib Robolectric test target. #
#############################################
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
# Include the testing libraries (JUnit4 + Robolectric libs).
LOCAL_STATIC_JAVA_LIBRARIES := \
platform-system-robolectric \
truth-prebuilt
LOCAL_JAVA_LIBRARIES := \
junit4-target \
platform-robolectric-prebuilt
LOCAL_INSTRUMENTATION_FOR := SettingsLibShell
LOCAL_MODULE := SettingsLibRoboTests
LOCAL_MODULE_TAGS := optional
include $(BUILD_STATIC_JAVA_LIBRARY)
#############################################################
# SettingsLib runner target to run the previous target. #
#############################################################
include $(CLEAR_VARS)
LOCAL_MODULE := RunSettingsLibRoboTests
LOCAL_SDK_VERSION := current
LOCAL_STATIC_JAVA_LIBRARIES := \
SettingsLibRoboTests
LOCAL_TEST_PACKAGE := SettingsLibShell
include prebuilts/misc/common/robolectric/run_robotests.mk

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2016 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
coreApp="true"
package="com.android.settingslib.robotests">
<application/>
</manifest>

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settingslib;
public class TestConfig {
public static final int SDK_VERSION = 23;
public static final String MANIFEST_PATH =
"frameworks/base/packages/SettingsLib/robotests/AndroidManifest.xml";
}

View File

@@ -0,0 +1,119 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settingslib.drawer;
import android.content.Context;
import android.util.Pair;
import com.android.settingslib.TestConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import java.util.HashMap;
import java.util.Map;
import static com.google.common.truth.Truth.assertThat;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class CategoryManagerTest {
private Context mContext;
private CategoryManager mCategoryManager;
private Map<Pair<String, String>, Tile> mTileByComponentCache;
private Map<String, DashboardCategory> mCategoryByKeyMap;
@Before
public void setUp() {
mContext = ShadowApplication.getInstance().getApplicationContext();
mTileByComponentCache = new HashMap<>();
mCategoryByKeyMap = new HashMap<>();
mCategoryManager = CategoryManager.get(mContext);
}
@Test
public void getInstance_shouldBeSingleton() {
assertThat(mCategoryManager).isSameAs(CategoryManager.get(mContext));
}
@Test
public void backwardCompatCleanupForCategory_shouldNotChangeCategoryForNewKeys() {
final Tile tile1 = new Tile();
final Tile tile2 = new Tile();
tile1.category = CategoryKey.CATEGORY_ACCOUNT;
tile2.category = CategoryKey.CATEGORY_ACCOUNT;
final DashboardCategory category = new DashboardCategory();
category.addTile(tile1);
category.addTile(tile2);
mCategoryByKeyMap.put(CategoryKey.CATEGORY_ACCOUNT, category);
mTileByComponentCache.put(new Pair<>("PACKAGE", "1"), tile1);
mTileByComponentCache.put(new Pair<>("PACKAGE", "2"), tile2);
mCategoryManager.backwardCompatCleanupForCategory(mTileByComponentCache, mCategoryByKeyMap);
assertThat(mCategoryByKeyMap.size()).isEqualTo(1);
assertThat(mCategoryByKeyMap.get(CategoryKey.CATEGORY_ACCOUNT)).isNotNull();
}
@Test
public void backwardCompatCleanupForCategory_shouldNotChangeCategoryForMixedKeys() {
final Tile tile1 = new Tile();
final Tile tile2 = new Tile();
final String oldCategory = "com.android.settings.category.wireless";
tile1.category = CategoryKey.CATEGORY_ACCOUNT;
tile2.category = oldCategory;
final DashboardCategory category1 = new DashboardCategory();
category1.addTile(tile1);
final DashboardCategory category2 = new DashboardCategory();
category2.addTile(tile2);
mCategoryByKeyMap.put(CategoryKey.CATEGORY_ACCOUNT, category1);
mCategoryByKeyMap.put(oldCategory, category2);
mTileByComponentCache.put(new Pair<>("PACKAGE", "CLASS1"), tile1);
mTileByComponentCache.put(new Pair<>("PACKAGE", "CLASS2"), tile2);
mCategoryManager.backwardCompatCleanupForCategory(mTileByComponentCache, mCategoryByKeyMap);
assertThat(mCategoryByKeyMap.size()).isEqualTo(2);
assertThat(mCategoryByKeyMap.get(CategoryKey.CATEGORY_ACCOUNT).tiles.size()).isEqualTo(1);
assertThat(mCategoryByKeyMap.get(oldCategory).tiles.size()).isEqualTo(1);
}
@Test
public void backwardCompatCleanupForCategory_shouldChangeCategoryForOldKeys() {
final Tile tile1 = new Tile();
final String oldCategory = "com.android.settings.category.wireless";
tile1.category = oldCategory;
final DashboardCategory category1 = new DashboardCategory();
category1.addTile(tile1);
mCategoryByKeyMap.put(oldCategory, category1);
mTileByComponentCache.put(new Pair<>("PACKAGE", "CLASS1"), tile1);
mCategoryManager.backwardCompatCleanupForCategory(mTileByComponentCache, mCategoryByKeyMap);
// Added 1 more category to category map.
assertThat(mCategoryByKeyMap.size()).isEqualTo(2);
// The new category map has CATEGORY_NETWORK type now, which contains 1 tile.
assertThat(mCategoryByKeyMap.get(CategoryKey.CATEGORY_NETWORK).tiles.size()).isEqualTo(1);
// Old category still exists.
assertThat(mCategoryByKeyMap.get(oldCategory).tiles.size()).isEqualTo(1);
}
}