Eliminate duplicate keys in pref xmls.

- Remove additional_system_update pref device_info page, we don't need
  it.
- Update keys in xml and Preference controller, and search index
  provider.
- Clean up in ScreenZoomPreference, it's anti-pattern to set fragment in
  constructor.
- Whitelist 2 that are super hard to remove.

Change-Id: Ibab6e2cb074513042a2ae007d9085aa64046eec8
Fixes: 67852637
Test: uniquePreferenceTest
This commit is contained in:
Fan Zhang
2017-10-27 13:33:48 -07:00
parent 34f7b5af59
commit 57ef92a810
20 changed files with 108 additions and 223 deletions

View File

@@ -15,16 +15,24 @@
*/
package com.android.settings.accounts;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserManager;
import android.provider.Settings.Global;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settingslib.RestrictedSwitchPreference;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.RestrictedSwitchPreference;
import org.junit.Before;
import org.junit.Test;
@@ -34,14 +42,6 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class AddUserWhenLockedPreferenceControllerTest {
@@ -62,7 +62,7 @@ public class AddUserWhenLockedPreferenceControllerTest {
ShadowApplication shadowContext = ShadowApplication.getInstance();
shadowContext.setSystemService(Context.USER_SERVICE, mUserManager);
mContext = shadowContext.getApplicationContext();
mController = new AddUserWhenLockedPreferenceController(mContext);
mController = new AddUserWhenLockedPreferenceController(mContext, "fake_key");
}
@Test

View File

@@ -1,120 +0,0 @@
package com.android.settings.search;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.provider.SearchIndexableResource;
import android.util.ArraySet;
import com.android.settings.DateTimeSettings;
import com.android.settings.R;
import com.android.settings.SecuritySettings;
import com.android.settings.TestConfig;
import com.android.settings.core.codeinspection.CodeInspector;
import com.android.settings.datausage.DataPlanUsageSummary;
import com.android.settings.datausage.DataUsageSummary;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.XmlTestUtils;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
assetDir = "/tests/robotests/assets")
public class DataIntegrityTest {
@Test
@Config(shadows = {
SettingsShadowResources.class,
SettingsShadowResources.SettingsShadowTheme.class,
})
public void testIndexableResources_uniqueKeys() {
final Context context = RuntimeEnvironment.application;
// Aggregation of all keys
final Set<String> masterKeys = new ArraySet<>();
// Aggregation of the incorrectly duplicate keys
final Set<String> duplicateKeys = new ArraySet<>();
// Keys for a specific page
final Set<String> pageKeys = new ArraySet<>();
// List of all Xml preferences
final Set<Integer> xmlList = new ArraySet<>();
// Duplicates we know about.
List<String> grandfatheredKeys = new ArrayList<>();
CodeInspector.initializeGrandfatherList(grandfatheredKeys,
"whitelist_duplicate_index_key");
// Get a list of all Xml.
for (SearchIndexableResource val : SearchIndexableResources.values()) {
final int xmlResId = val.xmlResId;
if (xmlResId != 0) {
xmlList.add(xmlResId);
} else {
// Take class and get all keys
final Class clazz = DatabaseIndexingUtils.getIndexableClass(val.className);
// Skip classes that are invalid or cannot be mocked. Add them as special Xml below.
if (clazz == null
|| clazz == DateTimeSettings.class
|| clazz == DataPlanUsageSummary.class
|| clazz == DataUsageSummary.class
|| clazz == SecuritySettings.class) {
continue;
}
Indexable.SearchIndexProvider provider = DatabaseIndexingUtils
.getSearchIndexProvider(clazz);
if (provider == null) {
continue;
}
List<SearchIndexableResource> subXml =
provider.getXmlResourcesToIndex(context, true);
if (subXml == null) {
continue;
}
for (SearchIndexableResource resource : subXml) {
final int subXmlResId = resource.xmlResId;
if (subXmlResId != 0) {
xmlList.add(subXmlResId);
}
}
}
}
addSpecialXml(xmlList);
// Get keys from all Xml and check for duplicates.
for (Integer xmlResId : xmlList) {
// Get all keys to be indexed
final List<String> prefKeys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlResId);
pageKeys.addAll(prefKeys);
// Find all already-existing keys.
pageKeys.retainAll(masterKeys);
// Keep list of offending duplicate keys.
duplicateKeys.addAll(pageKeys);
// Add all keys to master key list.
masterKeys.addAll(prefKeys);
pageKeys.clear();
}
assertThat(duplicateKeys).containsExactlyElementsIn(grandfatheredKeys);
}
/**
* Add XML preferences from Fragments which have issues being instantiated in robolectric.
*/
private void addSpecialXml(Set<Integer> xmlList) {
xmlList.add(R.xml.date_time_prefs);
xmlList.add(R.xml.data_usage);
xmlList.add(R.xml.data_usage_cellular);
xmlList.add(R.xml.data_usage_wifi);
xmlList.add(R.xml.security_settings_misc);
}
}

View File

@@ -16,8 +16,10 @@
package com.android.settings.security;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import static com.google.common.truth.Truth.assertThat;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.XmlTestUtils;
import org.junit.Test;
@@ -27,8 +29,6 @@ import org.robolectric.annotation.Config;
import java.util.List;
import static com.google.common.truth.Truth.assertThat;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class LockscreenDashboardFragmentTest {