Merge "Add default value to inline payloads" into oc-dr1-dev
diff --git a/res/xml/encryption_and_credential.xml b/res/xml/encryption_and_credential.xml
index be643b1..715ea14 100644
--- a/res/xml/encryption_and_credential.xml
+++ b/res/xml/encryption_and_credential.xml
@@ -24,25 +24,21 @@
             android:order="100">
 
         <com.android.settingslib.RestrictedPreference android:key="credential_storage_type"
-                android:title="@string/credential_storage_type"
-                android:persistent="false" />
+                android:title="@string/credential_storage_type" />
 
         <Preference android:key="trusted_credentials"
                 android:title="@string/trusted_credentials"
                 android:summary="@string/trusted_credentials_summary"
-                android:persistent="false"
                 android:fragment="com.android.settings.TrustedCredentialsSettings"/>
 
         <com.android.settingslib.RestrictedPreference android:key="user_credentials"
                 android:title="@string/user_credentials"
                 android:summary="@string/user_credentials_summary"
-                android:persistent="false"
                 android:fragment="com.android.settings.UserCredentialsSettings"/>
 
         <com.android.settingslib.RestrictedPreference android:key="credentials_install"
                 android:title="@string/credentials_install"
-                android:summary="@string/credentials_install_summary"
-                android:persistent="false">
+                android:summary="@string/credentials_install_summary">
 
             <intent android:action="android.credentials.INSTALL"
                     android:targetPackage="com.android.certinstaller"
@@ -52,8 +48,7 @@
 
         <com.android.settingslib.RestrictedPreference android:key="credentials_reset"
                 android:title="@string/credentials_reset"
-                android:summary="@string/credentials_reset_summary"
-                android:persistent="false">
+                android:summary="@string/credentials_reset_summary">
 
             <intent android:action="com.android.credentials.RESET"
                     android:targetPackage="com.android.settings"
diff --git a/res/xml/security_settings_encrypted.xml b/res/xml/security_settings_encrypted.xml
index 391f0fe..0d3fe76 100644
--- a/res/xml/security_settings_encrypted.xml
+++ b/res/xml/security_settings_encrypted.xml
@@ -18,12 +18,10 @@
                   android:title="@string/security_settings_title">
 
     <PreferenceCategory
-        android:key="security_category"
+        android:key="security_category_for_encrypted_device"
         android:title="@string/crypt_keeper_settings_title">
 
         <Preference
-            android:enabled="false"
-            android:shouldDisableView="false"
             android:key="crypt_keeper_encrypt_title"
             android:title="@string/crypt_keeper_encrypt_title"
             android:summary="@string/crypt_keeper_encrypted_summary"/>
diff --git a/res/xml/security_settings_unencrypted.xml b/res/xml/security_settings_unencrypted.xml
index 7c51d25..27dbe96 100644
--- a/res/xml/security_settings_unencrypted.xml
+++ b/res/xml/security_settings_unencrypted.xml
@@ -18,14 +18,14 @@
                   android:title="@string/crypt_keeper_settings_title">
 
     <PreferenceCategory
-        android:key="security_category"
+        android:key="security_category_for_unencrypted_device"
         android:title="@string/crypt_keeper_settings_title">
 
         <Preference
             android:key="encryption"
             android:title="@string/crypt_keeper_encrypt_title"
             android:fragment="com.android.settings.CryptKeeperSettings" />
-    
+
     </PreferenceCategory>
 
 </PreferenceScreen>
diff --git a/src/com/android/settings/EncryptionAndCredential.java b/src/com/android/settings/EncryptionAndCredential.java
index 3cb2740..4892f7e 100644
--- a/src/com/android/settings/EncryptionAndCredential.java
+++ b/src/com/android/settings/EncryptionAndCredential.java
@@ -20,7 +20,6 @@
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.Intent;
-import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -34,7 +33,6 @@
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
-import com.android.settings.search.SearchIndexableRaw;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedPreference;
 
@@ -106,7 +104,6 @@
             }
         }
 
-
         // Credential storage
         mKeyStore = KeyStore.getInstance(); // needs to be initialized for onResume()
 
@@ -182,28 +179,22 @@
         @Override
         public List<SearchIndexableResource> getXmlResourcesToIndex(
                 Context context, boolean enabled) {
-            final List<SearchIndexableResource> index = new ArrayList<SearchIndexableResource>();
+            final List<SearchIndexableResource> index = new ArrayList<>();
 
-            final DevicePolicyManager dpm = (DevicePolicyManager)
-                    context.getSystemService(Context.DEVICE_POLICY_SERVICE);
-            final UserManager um = UserManager.get(context);
-
-            if (um.isAdminUser()) {
-                switch (dpm.getStorageEncryptionStatus()) {
-                    case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
-                        // The device is currently encrypted.
-                        index.add(getSearchResource(context, R.xml.security_settings_encrypted));
-                        break;
-                    case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
-                        // This device supports encryption but isn't encrypted.
-                        index.add(getSearchResource(context, R.xml.security_settings_unencrypted));
-                        break;
-                }
-            }
+            // Add everything. We will suppress some of them in getNonIndexableKeys()
+            index.add(getSearchResource(context, R.xml.encryption_and_credential));
+            index.add(getSearchResource(context, R.xml.security_settings_encrypted));
+            index.add(getSearchResource(context, R.xml.security_settings_unencrypted));
 
             return index;
         }
 
+        @Override
+        protected boolean isPageSearchEnabled(Context context) {
+            final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+            return um.isAdminUser();
+        }
+
         private SearchIndexableResource getSearchResource(Context context, int xmlResId) {
             final SearchIndexableResource sir = new SearchIndexableResource(context);
             sir.xmlResId = xmlResId;
@@ -211,54 +202,34 @@
         }
 
         @Override
-        public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
-            final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>();
-            final Resources res = context.getResources();
-
-            final String screenTitle = res.getString(
-                R.string.encryption_and_credential_settings_title);
-
-            SearchIndexableRaw data = new SearchIndexableRaw(context);
-            data.title = screenTitle;
-            data.screenTitle = screenTitle;
-            result.add(data);
-
-            final UserManager um = UserManager.get(context);
-            if (!um.isAdminUser()) {
-                int resId = um.isLinkedUser() ?
-                        R.string.profile_info_settings_title : R.string.user_info_settings_title;
-
-                data = new SearchIndexableRaw(context);
-                data.title = res.getString(resId);
-                data.screenTitle = screenTitle;
-                result.add(data);
-            }
-
-            // Credential storage
-            if (!um.hasUserRestriction(UserManager.DISALLOW_CONFIG_CREDENTIALS)) {
-                KeyStore keyStore = KeyStore.getInstance();
-
-                final int storageSummaryRes = keyStore.isHardwareBacked() ?
-                        R.string.credential_storage_type_hardware :
-                        R.string.credential_storage_type_software;
-
-                data = new SearchIndexableRaw(context);
-                data.title = res.getString(storageSummaryRes);
-                data.screenTitle = screenTitle;
-                result.add(data);
-            }
-
-            return result;
-        }
-
-        @Override
         public List<String> getNonIndexableKeys(Context context) {
             final List<String> keys = super.getNonIndexableKeys(context);
-
-            final UserManager um = UserManager.get(context);
+            if (!isPageSearchEnabled(context)) {
+                return keys;
+            }
+            final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
 
             if (um.hasUserRestriction(UserManager.DISALLOW_CONFIG_CREDENTIALS)) {
                 keys.add(KEY_CREDENTIALS_MANAGER);
+                keys.add(KEY_RESET_CREDENTIALS);
+                keys.add(KEY_CREDENTIALS_INSTALL);
+                keys.add(KEY_CREDENTIAL_STORAGE_TYPE);
+                keys.add(KEY_USER_CREDENTIALS);
+            }
+
+            final DevicePolicyManager dpm = (DevicePolicyManager)
+                    context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+            switch (dpm.getStorageEncryptionStatus()) {
+                case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
+                    // The device is currently encrypted. Disable security_settings_unencrypted
+                    keys.addAll(getNonIndexableKeysFromXml(
+                            context, R.xml.security_settings_unencrypted));
+                    break;
+                default:
+                    // This device supports encryption but isn't encrypted.
+                    keys.addAll(getNonIndexableKeysFromXml(
+                            context, R.xml.security_settings_encrypted));
+                    break;
             }
 
             return keys;
diff --git a/src/com/android/settings/network/AirplaneModePreferenceController.java b/src/com/android/settings/network/AirplaneModePreferenceController.java
index 8422ab4..05c428a 100644
--- a/src/com/android/settings/network/AirplaneModePreferenceController.java
+++ b/src/com/android/settings/network/AirplaneModePreferenceController.java
@@ -45,7 +45,6 @@
 
     private final Fragment mFragment;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
-    private final PackageManager mPackageManager;
     private AirplaneModeEnabler mAirplaneModeEnabler;
     private SwitchPreference mAirplaneModePreference;
 
@@ -53,7 +52,6 @@
     public AirplaneModePreferenceController(Context context, Fragment hostFragment) {
         super(context);
         mFragment = hostFragment;
-        mPackageManager = context.getPackageManager();
         mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
     }
 
@@ -88,7 +86,11 @@
 
     @Override
     public boolean isAvailable() {
-        return !mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEVISION);
+        return isAvailable(mContext);
+    }
+
+    public static boolean isAvailable(Context context) {
+        return !context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEVISION);
     }
 
     @Override
diff --git a/src/com/android/settings/network/MobileNetworkPreferenceController.java b/src/com/android/settings/network/MobileNetworkPreferenceController.java
index b91552e..bfe013b 100644
--- a/src/com/android/settings/network/MobileNetworkPreferenceController.java
+++ b/src/com/android/settings/network/MobileNetworkPreferenceController.java
@@ -39,18 +39,17 @@
 
     private static final String KEY_MOBILE_NETWORK_SETTINGS = "mobile_network_settings";
 
-    private final UserManager mUserManager;
     private final boolean mIsSecondaryUser;
     private final TelephonyManager mTelephonyManager;
     private Preference mPreference;
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     PhoneStateListener mPhoneStateListener;
 
     public MobileNetworkPreferenceController(Context context) {
         super(context);
-        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
-        mIsSecondaryUser = !mUserManager.isAdminUser();
+        mIsSecondaryUser = !userManager.isAdminUser();
     }
 
     @Override
diff --git a/src/com/android/settings/search/BaseSearchIndexProvider.java b/src/com/android/settings/search/BaseSearchIndexProvider.java
index 11b4db1..239de15 100644
--- a/src/com/android/settings/search/BaseSearchIndexProvider.java
+++ b/src/com/android/settings/search/BaseSearchIndexProvider.java
@@ -16,10 +16,12 @@
 
 package com.android.settings.search;
 
+import android.annotation.XmlRes;
 import android.content.Context;
 import android.content.res.XmlResourceParser;
 import android.provider.SearchIndexableResource;
 import android.support.annotation.CallSuper;
+import android.support.annotation.VisibleForTesting;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -94,18 +96,25 @@
         }
         final List<String> nonIndexableKeys = new ArrayList<>();
         for (SearchIndexableResource res : resources) {
-            final XmlResourceParser parser = context.getResources().getXml(res.xmlResId);
-            final AttributeSet attrs = Xml.asAttributeSet(parser);
-            try {
-                while (parser.next() != XmlPullParser.END_DOCUMENT) {
-                    final String key = XmlParserUtils.getDataKey(context, attrs);
-                    if (!TextUtils.isEmpty(key)) {
-                        nonIndexableKeys.add(key);
-                    }
+            nonIndexableKeys.addAll(getNonIndexableKeysFromXml(context, res.xmlResId));
+        }
+        return nonIndexableKeys;
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
+    public List<String> getNonIndexableKeysFromXml(Context context, @XmlRes int xmlResId) {
+        final List<String> nonIndexableKeys = new ArrayList<>();
+        final XmlResourceParser parser = context.getResources().getXml(xmlResId);
+        final AttributeSet attrs = Xml.asAttributeSet(parser);
+        try {
+            while (parser.next() != XmlPullParser.END_DOCUMENT) {
+                final String key = XmlParserUtils.getDataKey(context, attrs);
+                if (!TextUtils.isEmpty(key)) {
+                    nonIndexableKeys.add(key);
                 }
-            } catch (IOException | XmlPullParserException e) {
-                Log.w(TAG, "Error parsing non-indexable from xml " + res.xmlResId);
             }
+        } catch (IOException | XmlPullParserException e) {
+            Log.w(TAG, "Error parsing non-indexable from xml " + xmlResId);
         }
         return nonIndexableKeys;
     }
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index 9b84bf1..31d39b5 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -171,8 +171,7 @@
         addIndex(LocationSettings.class, R.xml.location_settings, R.drawable.ic_settings_location);
         addIndex(ScanningSettings.class, R.xml.location_scanning, R.drawable.ic_settings_location);
         addIndex(SecuritySettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_security);
-        addIndex(EncryptionAndCredential.class, R.xml.encryption_and_credential,
-                R.drawable.ic_settings_security);
+        addIndex(EncryptionAndCredential.class, NO_DATA_RES_ID, R.drawable.ic_settings_security);
         addIndex(ScreenPinningSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_security);
         addIndex(UserAndAccountDashboardFragment.class, NO_DATA_RES_ID,
                 R.drawable.ic_settings_accounts);
diff --git a/tests/robotests/src/com/android/settings/EncryptionAndCredentialTest.java b/tests/robotests/src/com/android/settings/EncryptionAndCredentialTest.java
index bc88b1a..7a3875e 100644
--- a/tests/robotests/src/com/android/settings/EncryptionAndCredentialTest.java
+++ b/tests/robotests/src/com/android/settings/EncryptionAndCredentialTest.java
@@ -16,23 +16,110 @@
 
 package com.android.settings;
 
+import static android.app.admin.DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE;
+import static android.app.admin.DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE;
+import static com.android.settings.EncryptionAndCredential.SEARCH_INDEX_DATA_PROVIDER;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.os.UserManager;
+import android.provider.SearchIndexableResource;
+
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
-import static com.google.common.truth.Truth.assertThat;
-
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.ArrayList;
+import java.util.List;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class EncryptionAndCredentialTest {
 
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private DevicePolicyManager mDevicePolicyManager;
+
+    private ShadowApplication mApplication;
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mApplication = ShadowApplication.getInstance();
+        mApplication.setSystemService(Context.DEVICE_POLICY_SERVICE, mDevicePolicyManager);
+        mApplication.setSystemService(Context.USER_SERVICE, mUserManager);
+        mContext = mApplication.getApplicationContext();
+    }
+
     @Test
     public void getMetricsCategory_shouldReturnEncryptionAndCredential() {
         EncryptionAndCredential fragment = new EncryptionAndCredential();
         assertThat(fragment.getMetricsCategory()).isEqualTo(MetricsEvent.ENCRYPTION_AND_CREDENTIAL);
     }
 
+    // Search provider tests
+    @Test
+    public void getXmlResourcesToIndex_shouldReturnAllXmls() {
+        final List<SearchIndexableResource> index =
+                SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
+                        mContext, true /* enabled */);
+
+        assertThat(index).hasSize(3);
+    }
+
+    @Test
+    public void getNonIndexableKeys_pageIsDisabled_shouldReturnAllKeysAsNonIndexable() {
+        when(mUserManager.isAdminUser()).thenReturn(false);
+
+        final List<SearchIndexableResource> index =
+                SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(mContext, true /* enabled */);
+        final List<String> expectedKeys = new ArrayList<>();
+        for (SearchIndexableResource res : index) {
+            expectedKeys.addAll(((BaseSearchIndexProvider) SEARCH_INDEX_DATA_PROVIDER)
+                    .getNonIndexableKeysFromXml(mContext, res.xmlResId));
+        }
+        final List<String> keys = SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+        assertThat(keys).containsExactlyElementsIn(expectedKeys);
+    }
+
+    @Test
+    public void getNonIndexableKeys_deviceEncrypted_shouldReturnUnencryptedKeys() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        when(mDevicePolicyManager.getStorageEncryptionStatus()).thenReturn(
+                ENCRYPTION_STATUS_ACTIVE);
+
+        final List<String> expectedKeys = new ArrayList<>();
+        expectedKeys.addAll(((BaseSearchIndexProvider) SEARCH_INDEX_DATA_PROVIDER)
+                .getNonIndexableKeysFromXml(mContext, R.xml.security_settings_unencrypted));
+        final List<String> keys = SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+        assertThat(keys).containsExactlyElementsIn(expectedKeys);
+    }
+
+    @Test
+    public void getNonIndexableKeys_deviceNotEncrypted_shouldReturnEncryptedKeys() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        when(mDevicePolicyManager.getStorageEncryptionStatus())
+                .thenReturn(ENCRYPTION_STATUS_INACTIVE);
+
+        final List<String> expectedKeys = new ArrayList<>();
+        expectedKeys.addAll(((BaseSearchIndexProvider) SEARCH_INDEX_DATA_PROVIDER)
+                .getNonIndexableKeysFromXml(mContext, R.xml.security_settings_encrypted));
+        final List<String> keys = SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+
+        assertThat(keys).containsExactlyElementsIn(expectedKeys);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
index d3c6a25..bd40240 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
@@ -42,6 +42,7 @@
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settingslib.deviceinfo.StorageVolumeProvider;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -70,6 +71,8 @@
 
     @Before
     public void setUp() throws Exception {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.string.config_headlineFontFamily, "");
         mContext = spy(RuntimeEnvironment.application.getApplicationContext());
         FakeFeatureFactory.setupForTest(mContext);
         mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
@@ -84,6 +87,11 @@
         mHolder = PreferenceViewHolder.createInstanceForTests(view);
     }
 
+    @After
+    public void tearDown() {
+        SettingsShadowResources.reset();
+    }
+
     @Test
     public void testEmpty() throws Exception {
         mController.updateBytes(0, 32 * GIGABYTE);
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
index 3e9c39c..39a0fb6 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
@@ -38,6 +38,8 @@
 import com.android.settings.testutils.shadow.ShadowEventLogWriter;
 import com.android.settings.testutils.shadow.ShadowUtils;
 
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
@@ -66,6 +68,17 @@
         })
 public class SetupChooseLockPasswordTest {
 
+    @Before
+    public void setUp() throws Exception {
+        SettingsShadowResources.overrideResource(
+                com.android.internal.R.string.config_headlineFontFamily, "");
+    }
+
+    @After
+    public void tearDown() {
+        SettingsShadowResources.reset();
+    }
+
     @Test
     public void createActivity_shouldNotCrash() {
         // Basic sanity test for activity created without crashing