Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1d2f022 authored by Fabrice Di Meglio's avatar Fabrice Di Meglio
Browse files

Search - add indexing of SecuritySettings

- implement a SearchIndexProvider for providing the data to index
- some code refactoring to extract some helper methods

Change-Id: Ia8818c17d1bead7306b528d242cdc24c863c17eb
parent 2719da25
Loading
Loading
Loading
Loading
+186 −19
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.nfc.NfcUnlock;
import android.os.Bundle;
import android.os.UserHandle;
@@ -39,21 +40,27 @@ import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.provider.SearchIndexableResource;
import android.provider.Settings;
import android.security.KeyStore;
import android.telephony.TelephonyManager;
import android.util.Log;

import com.android.internal.widget.LockPatternUtils;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;

import java.util.ArrayList;
import java.util.List;

import static com.android.settings.search.SearchIndexableResources.RANK_SECURITY;

/**
 * Gesture lock pattern settings.
 */
public class SecuritySettings extends RestrictedSettingsFragment
        implements OnPreferenceChangeListener, DialogInterface.OnClickListener {
        implements OnPreferenceChangeListener, DialogInterface.OnClickListener, Indexable {
    static final String TAG = "SecuritySettings";

    // Lock Settings
@@ -86,7 +93,6 @@ public class SecuritySettings extends RestrictedSettingsFragment
    private static final String KEY_CREDENTIALS_MANAGER = "credentials_management";
    private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";

    private PackageManager mPM;
    private DevicePolicyManager mDPM;

    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
@@ -119,38 +125,30 @@ public class SecuritySettings extends RestrictedSettingsFragment

        mLockPatternUtils = new LockPatternUtils(getActivity());

        mPM = getActivity().getPackageManager();
        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);

        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
    }

    private PreferenceScreen createPreferenceHierarchy() {
        PreferenceScreen root = getPreferenceScreen();
        if (root != null) {
            root.removeAll();
        }
        addPreferencesFromResource(R.xml.security_settings);
        root = getPreferenceScreen();

        // Add options for lock/unlock screen
    private static int getResIdForLockUnlockScreen(Context context,
            LockPatternUtils lockPatternUtils) {
        int resid = 0;
        if (!mLockPatternUtils.isSecure()) {
        if (!lockPatternUtils.isSecure()) {
            // if there are multiple users, disable "None" setting
            UserManager mUm = (UserManager) getSystemService(Context.USER_SERVICE);
            UserManager mUm = (UserManager) context. getSystemService(Context.USER_SERVICE);
            List<UserInfo> users = mUm.getUsers(true);
            final boolean singleUser = users.size() == 1;

            if (singleUser && mLockPatternUtils.isLockScreenDisabled()) {
            if (singleUser && lockPatternUtils.isLockScreenDisabled()) {
                resid = R.xml.security_settings_lockscreen;
            } else {
                resid = R.xml.security_settings_chooser;
            }
        } else if (mLockPatternUtils.usingBiometricWeak() &&
                mLockPatternUtils.isBiometricWeakInstalled()) {
        } else if (lockPatternUtils.usingBiometricWeak() &&
                lockPatternUtils.isBiometricWeakInstalled()) {
            resid = R.xml.security_settings_biometric_weak;
        } else {
            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
            switch (lockPatternUtils.getKeyguardStoredPasswordQuality()) {
                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
                    resid = R.xml.security_settings_pattern;
                    break;
@@ -164,8 +162,26 @@ public class SecuritySettings extends RestrictedSettingsFragment
                    break;
            }
        }
        addPreferencesFromResource(resid);
        return resid;
    }

    /**
     * Important!
     *
     * Dont forget to update the SecuritySearchIndexProvider if you are doing any change in the
     * logic or adding/removing preferences here.
     */
    private PreferenceScreen createPreferenceHierarchy() {
        PreferenceScreen root = getPreferenceScreen();
        if (root != null) {
            root.removeAll();
        }
        addPreferencesFromResource(R.xml.security_settings);
        root = getPreferenceScreen();

        // Add options for lock/unlock screen
        final int resid = getResIdForLockUnlockScreen(getActivity(), mLockPatternUtils);
        addPreferencesFromResource(resid);

        // Add options for device encryption
        mIsPrimary = UserHandle.myUserId() == UserHandle.USER_OWNER;
@@ -619,4 +635,155 @@ public class SecuritySettings extends RestrictedSettingsFragment
        intent.setClassName("com.android.facelock", "com.android.facelock.AddToSetup");
        startActivity(intent);
    }

    /**
     * For Search. Please keep it in sync when updating "createPreferenceHierarchy()"
     */
    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
            new SecuritySearchIndexProvider();

    static private class SecuritySearchIndexProvider extends BaseSearchIndexProvider {

        boolean mIsPrimary;

        public SecuritySearchIndexProvider() {
            super();

            mIsPrimary = UserHandle.myUserId() == UserHandle.USER_OWNER;
        }

        @Override
        public List<SearchIndexableResource> getXmlResourcesToIndex(
                Context context, boolean enabled) {

            List<SearchIndexableResource> result = new ArrayList<SearchIndexableResource>();

            LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
            // Add options for lock/unlock screen
            int resId = getResIdForLockUnlockScreen(context, lockPatternUtils);

            SearchIndexableResource sir = new SearchIndexableResource(context);
            sir.xmlResId = resId;
            result.add(sir);

            if (mIsPrimary) {
                DevicePolicyManager dpm = (DevicePolicyManager)
                        context.getSystemService(Context.DEVICE_POLICY_SERVICE);

                switch (dpm.getStorageEncryptionStatus()) {
                    case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
                        // The device is currently encrypted.
                        resId = R.xml.security_settings_encrypted;
                        break;
                    case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
                        // This device supports encryption but isn't encrypted.
                        resId = R.xml.security_settings_unencrypted;
                        break;
                }

                sir = new SearchIndexableResource(context);
                sir.xmlResId = resId;
                result.add(sir);
            }

            // Append the rest of the settings
            sir = new SearchIndexableResource(context);
            sir.xmlResId = R.xml.security_settings_misc;
            result.add(sir);

            return result;
        }

        @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.security_settings_title);

            SearchIndexableRaw data;

            if (!mIsPrimary) {
                int resId = (UserManager.get(context).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);
            }

            LockPatternUtils lockPatternUtils = new LockPatternUtils(context);

            if (!ActivityManager.isLowRamDeviceStatic()
                    && !lockPatternUtils.isLockScreenDisabled()) {
                DevicePolicyManager dpm = (DevicePolicyManager)
                        context.getSystemService(Context.DEVICE_POLICY_SERVICE);

                final boolean disabled = (0 != (dpm.getKeyguardDisabledFeatures(null)
                        & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL));

                if (disabled) {
                    data = new SearchIndexableRaw(context);
                    data.title = res.getString(R.string.security_enable_widgets_disabled_summary);
                    data.screenTitle = screenTitle;
                    result.add(data);
                }
            }

            // Credential storage
            final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);

            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 = new ArrayList<String>();

            LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
            // Add options for lock/unlock screen
            int resId = getResIdForLockUnlockScreen(context, lockPatternUtils);

            // don't display visible pattern if biometric and backup is not pattern
            if (resId == R.xml.security_settings_biometric_weak &&
                    lockPatternUtils.getKeyguardStoredPasswordQuality() !=
                            DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
                keys.add(KEY_VISIBLE_PATTERN);
            }

            // Do not display SIM lock for devices without an Icc card
            TelephonyManager tm = TelephonyManager.getDefault();
            if (!mIsPrimary || !tm.hasIccCard()) {
                keys.add(KEY_SIM_LOCK);
            }

            if (ActivityManager.isLowRamDeviceStatic()
                    || lockPatternUtils.isLockScreenDisabled()) {
                // Widgets take a lot of RAM, so disable them on low-memory devices
                keys.add(KEY_ENABLE_WIDGETS);
            }

            final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
            if (um.hasUserRestriction(UserManager.DISALLOW_CONFIG_CREDENTIALS)) {
                keys.add(KEY_CREDENTIALS_MANAGER);
            }

            return keys;
        }
    }

}
+22 −22
Original line number Diff line number Diff line
@@ -49,27 +49,27 @@ public final class SearchIndexableResources {

    public static int NO_DATA_RES_ID = 0;

    private static final int RANK_WIFI = 1;
    private static final int RANK_BT = 2;
    private static final int RANK_DATA_USAGE = 3;
    private static final int RANK_WIRELESS = 4;
    private static final int RANK_HOME = 5;
    private static final int RANK_SOUND = 6;
    private static final int RANK_DISPLAY = 7;
    private static final int RANK_WALLPAPER = 7;
    private static final int RANK_NOTIFICATIONS = 8;
    private static final int RANK_MEMORY = 9;
    private static final int RANK_POWER_USAGE = 10;
    private static final int RANK_USERS = 11;
    private static final int RANK_LOCATION = 12;
    private static final int RANK_SECURITY = 13;
    private static final int RANK_IME = 14;
    private static final int RANK_PRIVACY = 15;
    private static final int RANK_DATE_TIME = 16;
    private static final int RANK_ACCESSIBILITY = 17;
    private static final int RANK_PRINTING = 18;
    private static final int RANK_DEVELOPEMENT = 19;
    private static final int RANK_DEVICE_INFO = 20;
    public static final int RANK_WIFI = 1;
    public static final int RANK_BT = 2;
    public static final int RANK_DATA_USAGE = 3;
    public static final int RANK_WIRELESS = 4;
    public static final int RANK_HOME = 5;
    public static final int RANK_SOUND = 6;
    public static final int RANK_DISPLAY = 7;
    public static final int RANK_WALLPAPER = 7;
    public static final int RANK_NOTIFICATIONS = 8;
    public static final int RANK_MEMORY = 9;
    public static final int RANK_POWER_USAGE = 10;
    public static final int RANK_USERS = 11;
    public static final int RANK_LOCATION = 12;
    public static final int RANK_SECURITY = 13;
    public static final int RANK_IME = 14;
    public static final int RANK_PRIVACY = 15;
    public static final int RANK_DATE_TIME = 16;
    public static final int RANK_ACCESSIBILITY = 17;
    public static final int RANK_PRINTING = 18;
    public static final int RANK_DEVELOPEMENT = 19;
    public static final int RANK_DEVICE_INFO = 20;

    private static HashMap<String, SearchIndexableResource> sResMap =
            new HashMap<String, SearchIndexableResource>();
@@ -162,7 +162,7 @@ public final class SearchIndexableResources {

        sResMap.put(SecuritySettings.class.getName(),
                new SearchIndexableResource(RANK_SECURITY,
                        R.xml.security_settings,
                        NO_DATA_RES_ID,
                        SecuritySettings.class.getName(),
                        R.drawable.ic_settings_security));