Convert encryption status to preference controller
- Move Crypt/Encryption setting into security package. - Reformat crypt_keeper_settings.xml - Add controller and test for encryption status Bug: 32953042 Test: robotests Change-Id: I1f4b2f97133435c70a49522a59886ac4da6759af
This commit is contained in:
@@ -2384,7 +2384,7 @@
|
|||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
||||||
android:value="com.android.settings.CryptKeeperSettings" />
|
android:value="com.android.settings.security.CryptKeeperSettings" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name="Settings$DataPlanUsageSummaryActivity"
|
<activity android:name="Settings$DataPlanUsageSummaryActivity"
|
||||||
|
@@ -14,33 +14,29 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical"
|
android:paddingStart="@dimen/preference_no_icon_padding_start"
|
||||||
>
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||||
|
android:orientation="vertical">
|
||||||
<ScrollView
|
<ScrollView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dip"
|
android:layout_height="0dip"
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1">
|
||||||
>
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical">
|
||||||
>
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="8dip"
|
android:layout_marginTop="8dip"
|
||||||
android:layout_marginBottom="16dip"
|
android:layout_marginBottom="16dip"
|
||||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
android:text="@string/crypt_keeper_desc"
|
android:text="@string/crypt_keeper_desc" />
|
||||||
/>
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/warning_low_charge"
|
android:id="@+id/warning_low_charge"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -49,8 +45,7 @@
|
|||||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:text="@string/crypt_keeper_low_charge_text"
|
android:text="@string/crypt_keeper_low_charge_text"
|
||||||
android:visibility="gone"
|
android:visibility="gone" />
|
||||||
/>
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/warning_unplugged"
|
android:id="@+id/warning_unplugged"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -59,20 +54,14 @@
|
|||||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:text="@string/crypt_keeper_unplugged_text"
|
android:text="@string/crypt_keeper_unplugged_text"
|
||||||
android:visibility="gone"
|
android:visibility="gone" />
|
||||||
/>
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/initiate_encrypt"
|
android:id="@+id/initiate_encrypt"
|
||||||
android:layout_gravity="center_horizontal"
|
style="@style/ActionPrimaryButton"
|
||||||
android:layout_marginTop="16dip"
|
|
||||||
android:layout_marginBottom="16dip"
|
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/crypt_keeper_button_text"
|
android:layout_gravity="end"
|
||||||
android:gravity="center"
|
android:text="@string/crypt_keeper_button_text" />
|
||||||
/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@@ -14,45 +14,66 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
<PreferenceScreen
|
||||||
android:title="@string/encryption_and_credential_settings_title"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:key="encryption_and_credentials_screen">
|
android:title="@string/encryption_and_credential_settings_title"
|
||||||
|
android:key="encryption_and_credentials_screen">
|
||||||
|
|
||||||
<PreferenceCategory android:key="credentials_management"
|
<PreferenceCategory
|
||||||
android:title="@string/credentials_title"
|
android:key="encryption_and_credentials_status_category"
|
||||||
android:persistent="false"
|
android:title="@string/crypt_keeper_settings_title">
|
||||||
android:order="100">
|
|
||||||
|
|
||||||
<com.android.settingslib.RestrictedPreference android:key="credential_storage_type"
|
<Preference
|
||||||
android:title="@string/credential_storage_type" />
|
android:key="encryption_and_credentials_encryption_status"
|
||||||
|
android:title="@string/crypt_keeper_encrypt_title"
|
||||||
|
android:fragment="com.android.settings.security.CryptKeeperSettings"
|
||||||
|
android:summary="@string/summary_placeholder" />
|
||||||
|
|
||||||
<Preference android:key="trusted_credentials"
|
</PreferenceCategory>
|
||||||
android:title="@string/trusted_credentials"
|
|
||||||
android:summary="@string/trusted_credentials_summary"
|
|
||||||
android:fragment="com.android.settings.TrustedCredentialsSettings"/>
|
|
||||||
|
|
||||||
<com.android.settingslib.RestrictedPreference android:key="user_credentials"
|
<PreferenceCategory
|
||||||
android:title="@string/user_credentials"
|
android:key="credentials_management"
|
||||||
android:summary="@string/user_credentials_summary"
|
android:title="@string/credentials_title"
|
||||||
android:fragment="com.android.settings.UserCredentialsSettings"/>
|
android:persistent="false"
|
||||||
|
android:order="100">
|
||||||
|
|
||||||
<com.android.settingslib.RestrictedPreference android:key="credentials_install"
|
<com.android.settingslib.RestrictedPreference
|
||||||
android:title="@string/credentials_install"
|
android:key="credential_storage_type"
|
||||||
android:summary="@string/credentials_install_summary">
|
android:title="@string/credential_storage_type" />
|
||||||
|
|
||||||
<intent android:action="android.credentials.INSTALL"
|
<Preference
|
||||||
android:targetPackage="com.android.certinstaller"
|
android:key="trusted_credentials"
|
||||||
android:targetClass="com.android.certinstaller.CertInstallerMain"/>
|
android:title="@string/trusted_credentials"
|
||||||
|
android:summary="@string/trusted_credentials_summary"
|
||||||
|
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:fragment="com.android.settings.UserCredentialsSettings" />
|
||||||
|
|
||||||
|
<com.android.settingslib.RestrictedPreference
|
||||||
|
android:key="credentials_install"
|
||||||
|
android:title="@string/credentials_install"
|
||||||
|
android:summary="@string/credentials_install_summary">
|
||||||
|
|
||||||
|
<intent
|
||||||
|
android:action="android.credentials.INSTALL"
|
||||||
|
android:targetPackage="com.android.certinstaller"
|
||||||
|
android:targetClass="com.android.certinstaller.CertInstallerMain" />
|
||||||
|
|
||||||
</com.android.settingslib.RestrictedPreference>
|
</com.android.settingslib.RestrictedPreference>
|
||||||
|
|
||||||
<com.android.settingslib.RestrictedPreference android:key="credentials_reset"
|
<com.android.settingslib.RestrictedPreference
|
||||||
android:title="@string/credentials_reset"
|
android:key="credentials_reset"
|
||||||
android:summary="@string/credentials_reset_summary">
|
android:title="@string/credentials_reset"
|
||||||
|
android:summary="@string/credentials_reset_summary">
|
||||||
|
|
||||||
<intent android:action="com.android.credentials.RESET"
|
<intent
|
||||||
android:targetPackage="com.android.settings"
|
android:action="com.android.credentials.RESET"
|
||||||
android:targetClass="com.android.settings.CredentialStorage"/>
|
android:targetPackage="com.android.settings"
|
||||||
|
android:targetClass="com.android.settings.CredentialStorage" />
|
||||||
|
|
||||||
</com.android.settingslib.RestrictedPreference>
|
</com.android.settingslib.RestrictedPreference>
|
||||||
|
|
||||||
|
@@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (C) 2011 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:key="security_settings_encrypted_screen"
|
|
||||||
android:title="@string/security_settings_title">
|
|
||||||
|
|
||||||
<PreferenceCategory
|
|
||||||
android:key="security_category_for_encrypted_device"
|
|
||||||
android:title="@string/crypt_keeper_settings_title">
|
|
||||||
|
|
||||||
<Preference
|
|
||||||
android:key="crypt_keeper_encrypt_title"
|
|
||||||
android:title="@string/crypt_keeper_encrypt_title"
|
|
||||||
android:summary="@string/crypt_keeper_encrypted_summary"/>
|
|
||||||
|
|
||||||
</PreferenceCategory>
|
|
||||||
|
|
||||||
|
|
||||||
</PreferenceScreen>
|
|
@@ -1,32 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (C) 2010 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:key="security_settings_unencrypted_screen"
|
|
||||||
android:title="@string/crypt_keeper_settings_title">
|
|
||||||
|
|
||||||
<PreferenceCategory
|
|
||||||
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>
|
|
@@ -30,12 +30,12 @@ import com.android.settings.applications.defaultapps.DefaultPaymentSettingsPrefe
|
|||||||
import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
|
import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
|
||||||
import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
|
import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
|
||||||
import com.android.settings.applications.defaultapps.DefaultWorkBrowserPreferenceController;
|
import com.android.settings.applications.defaultapps.DefaultWorkBrowserPreferenceController;
|
||||||
import com.android.settings.widget.WorkOnlyCategoryPreferenceController;
|
|
||||||
import com.android.settings.applications.defaultapps.DefaultWorkPhonePreferenceController;
|
import com.android.settings.applications.defaultapps.DefaultWorkPhonePreferenceController;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
import com.android.settings.dashboard.SummaryLoader;
|
import com.android.settings.dashboard.SummaryLoader;
|
||||||
import com.android.settings.search.BaseSearchIndexProvider;
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
import com.android.settings.search.Indexable;
|
import com.android.settings.search.Indexable;
|
||||||
|
import com.android.settings.widget.PreferenceCategoryController;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -75,7 +75,7 @@ public class DefaultAppSettings extends DashboardFragment {
|
|||||||
workControllers.add(new DefaultWorkPhonePreferenceController(context));
|
workControllers.add(new DefaultWorkPhonePreferenceController(context));
|
||||||
workControllers.add(new DefaultWorkBrowserPreferenceController(context));
|
workControllers.add(new DefaultWorkBrowserPreferenceController(context));
|
||||||
controllers.addAll(workControllers);
|
controllers.addAll(workControllers);
|
||||||
controllers.add(new WorkOnlyCategoryPreferenceController(
|
controllers.add(new PreferenceCategoryController(
|
||||||
context, KEY_DEFAULT_WORK_CATEGORY, workControllers));
|
context, KEY_DEFAULT_WORK_CATEGORY, workControllers));
|
||||||
controllers.add(new DefaultAssistPreferenceController(context, KEY_ASSIST_VOICE_INPUT,
|
controllers.add(new DefaultAssistPreferenceController(context, KEY_ASSIST_VOICE_INPUT,
|
||||||
false /* showSetting */));
|
false /* showSetting */));
|
||||||
|
@@ -18,7 +18,6 @@ package com.android.settings.core.gateway;
|
|||||||
|
|
||||||
import com.android.settings.ApnEditor;
|
import com.android.settings.ApnEditor;
|
||||||
import com.android.settings.ApnSettings;
|
import com.android.settings.ApnSettings;
|
||||||
import com.android.settings.CryptKeeperSettings;
|
|
||||||
import com.android.settings.DateTimeSettings;
|
import com.android.settings.DateTimeSettings;
|
||||||
import com.android.settings.DeviceAdminSettings;
|
import com.android.settings.DeviceAdminSettings;
|
||||||
import com.android.settings.DeviceInfoSettings;
|
import com.android.settings.DeviceInfoSettings;
|
||||||
@@ -45,7 +44,6 @@ import com.android.settings.applications.DefaultAppSettings;
|
|||||||
import com.android.settings.applications.DrawOverlayDetails;
|
import com.android.settings.applications.DrawOverlayDetails;
|
||||||
import com.android.settings.applications.ExternalSourcesDetails;
|
import com.android.settings.applications.ExternalSourcesDetails;
|
||||||
import com.android.settings.applications.InstalledAppDetails;
|
import com.android.settings.applications.InstalledAppDetails;
|
||||||
import com.android.settings.applications.manageapplications.ManageApplications;
|
|
||||||
import com.android.settings.applications.ManageDomainUrls;
|
import com.android.settings.applications.ManageDomainUrls;
|
||||||
import com.android.settings.applications.NotificationApps;
|
import com.android.settings.applications.NotificationApps;
|
||||||
import com.android.settings.applications.PictureInPictureDetails;
|
import com.android.settings.applications.PictureInPictureDetails;
|
||||||
@@ -56,6 +54,7 @@ import com.android.settings.applications.UsageAccessDetails;
|
|||||||
import com.android.settings.applications.VrListenerSettings;
|
import com.android.settings.applications.VrListenerSettings;
|
||||||
import com.android.settings.applications.WriteSettingsDetails;
|
import com.android.settings.applications.WriteSettingsDetails;
|
||||||
import com.android.settings.applications.assist.ManageAssist;
|
import com.android.settings.applications.assist.ManageAssist;
|
||||||
|
import com.android.settings.applications.manageapplications.ManageApplications;
|
||||||
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
|
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
|
||||||
import com.android.settings.bluetooth.BluetoothSettings;
|
import com.android.settings.bluetooth.BluetoothSettings;
|
||||||
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
|
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
|
||||||
@@ -106,8 +105,8 @@ import com.android.settings.notification.NotificationAccessSettings;
|
|||||||
import com.android.settings.notification.NotificationStation;
|
import com.android.settings.notification.NotificationStation;
|
||||||
import com.android.settings.notification.SoundSettings;
|
import com.android.settings.notification.SoundSettings;
|
||||||
import com.android.settings.notification.ZenAccessSettings;
|
import com.android.settings.notification.ZenAccessSettings;
|
||||||
import com.android.settings.notification.ZenModeBehaviorSettings;
|
|
||||||
import com.android.settings.notification.ZenModeAutomationSettings;
|
import com.android.settings.notification.ZenModeAutomationSettings;
|
||||||
|
import com.android.settings.notification.ZenModeBehaviorSettings;
|
||||||
import com.android.settings.notification.ZenModeEventRuleSettings;
|
import com.android.settings.notification.ZenModeEventRuleSettings;
|
||||||
import com.android.settings.notification.ZenModeScheduleRuleSettings;
|
import com.android.settings.notification.ZenModeScheduleRuleSettings;
|
||||||
import com.android.settings.notification.ZenModeSettings;
|
import com.android.settings.notification.ZenModeSettings;
|
||||||
@@ -115,6 +114,7 @@ import com.android.settings.password.ChooseLockPassword;
|
|||||||
import com.android.settings.password.ChooseLockPattern;
|
import com.android.settings.password.ChooseLockPattern;
|
||||||
import com.android.settings.print.PrintJobSettingsFragment;
|
import com.android.settings.print.PrintJobSettingsFragment;
|
||||||
import com.android.settings.print.PrintSettingsFragment;
|
import com.android.settings.print.PrintSettingsFragment;
|
||||||
|
import com.android.settings.security.CryptKeeperSettings;
|
||||||
import com.android.settings.security.LockscreenDashboardFragment;
|
import com.android.settings.security.LockscreenDashboardFragment;
|
||||||
import com.android.settings.sim.SimSettings;
|
import com.android.settings.sim.SimSettings;
|
||||||
import com.android.settings.support.SupportDashboardActivity;
|
import com.android.settings.support.SupportDashboardActivity;
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.settings;
|
package com.android.settings.security;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
@@ -36,6 +36,9 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
|
import com.android.settings.CryptKeeperConfirm;
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
import com.android.settings.password.ChooseLockSettingsHelper;
|
||||||
import com.android.settings.password.ConfirmLockPattern;
|
import com.android.settings.password.ConfirmLockPattern;
|
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package com.android.settings.security;
|
package com.android.settings.security;
|
||||||
|
|
||||||
import android.app.admin.DevicePolicyManager;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
@@ -27,15 +26,16 @@ import android.support.v7.preference.PreferenceGroup;
|
|||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.internal.widget.LockPatternUtils;
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
import com.android.settings.search.BaseSearchIndexProvider;
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
|
import com.android.settings.widget.PreferenceCategoryController;
|
||||||
import com.android.settingslib.RestrictedLockUtils;
|
import com.android.settingslib.RestrictedLockUtils;
|
||||||
import com.android.settingslib.RestrictedPreference;
|
import com.android.settingslib.RestrictedPreference;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -55,13 +55,9 @@ public class EncryptionAndCredential extends DashboardFragment {
|
|||||||
|
|
||||||
private static final int MY_USER_ID = UserHandle.myUserId();
|
private static final int MY_USER_ID = UserHandle.myUserId();
|
||||||
|
|
||||||
private UserManager mUm;
|
|
||||||
|
|
||||||
private KeyStore mKeyStore;
|
private KeyStore mKeyStore;
|
||||||
private RestrictedPreference mResetCredentials;
|
private RestrictedPreference mResetCredentials;
|
||||||
|
|
||||||
private boolean mIsAdmin;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMetricsCategory() {
|
public int getMetricsCategory() {
|
||||||
return MetricsEvent.ENCRYPTION_AND_CREDENTIAL;
|
return MetricsEvent.ENCRYPTION_AND_CREDENTIAL;
|
||||||
@@ -74,13 +70,23 @@ public class EncryptionAndCredential extends DashboardFragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
|
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
|
||||||
mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
return buildPreferenceControllers(context);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getPreferenceScreenResId() {
|
protected int getPreferenceScreenResId() {
|
||||||
return 0;
|
return R.xml.encryption_and_credential;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
|
||||||
|
final List<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||||
|
final EncryptionStatusPreferenceController encryptStatusController =
|
||||||
|
new EncryptionStatusPreferenceController(context);
|
||||||
|
controllers.add(encryptStatusController);
|
||||||
|
controllers.add(new PreferenceCategoryController(context,
|
||||||
|
"encryption_and_credentials_status_category",
|
||||||
|
Arrays.asList(encryptStatusController)));
|
||||||
|
return controllers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -90,26 +96,7 @@ public class EncryptionAndCredential extends DashboardFragment {
|
|||||||
* logic or adding/removing preferences here.
|
* logic or adding/removing preferences here.
|
||||||
*/
|
*/
|
||||||
private PreferenceScreen createPreferenceHierarchy() {
|
private PreferenceScreen createPreferenceHierarchy() {
|
||||||
PreferenceScreen root = getPreferenceScreen();
|
final PreferenceScreen root = getPreferenceScreen();
|
||||||
if (root != null) {
|
|
||||||
root.removeAll();
|
|
||||||
}
|
|
||||||
addPreferencesFromResource(R.xml.encryption_and_credential);
|
|
||||||
root = getPreferenceScreen();
|
|
||||||
|
|
||||||
// Add options for device encryption
|
|
||||||
mIsAdmin = mUm.isAdminUser();
|
|
||||||
|
|
||||||
if (mIsAdmin) {
|
|
||||||
if (LockPatternUtils.isDeviceEncryptionEnabled()) {
|
|
||||||
// The device is currently encrypted.
|
|
||||||
addPreferencesFromResource(R.xml.security_settings_encrypted);
|
|
||||||
} else {
|
|
||||||
// This device supports encryption but isn't encrypted.
|
|
||||||
addPreferencesFromResource(R.xml.security_settings_unencrypted);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Credential storage
|
// Credential storage
|
||||||
mKeyStore = KeyStore.getInstance(); // needs to be initialized for onResume()
|
mKeyStore = KeyStore.getInstance(); // needs to be initialized for onResume()
|
||||||
|
|
||||||
@@ -185,14 +172,14 @@ public class EncryptionAndCredential extends DashboardFragment {
|
|||||||
@Override
|
@Override
|
||||||
public List<SearchIndexableResource> getXmlResourcesToIndex(
|
public List<SearchIndexableResource> getXmlResourcesToIndex(
|
||||||
Context context, boolean enabled) {
|
Context context, boolean enabled) {
|
||||||
final List<SearchIndexableResource> index = new ArrayList<>();
|
final SearchIndexableResource sir = new SearchIndexableResource(context);
|
||||||
|
sir.xmlResId = R.xml.encryption_and_credential;
|
||||||
|
return Arrays.asList(sir);
|
||||||
|
}
|
||||||
|
|
||||||
// Add everything. We will suppress some of them in getNonIndexableKeys()
|
@Override
|
||||||
index.add(getSearchResource(context, R.xml.encryption_and_credential));
|
public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
|
||||||
index.add(getSearchResource(context, R.xml.security_settings_encrypted));
|
return buildPreferenceControllers(context);
|
||||||
index.add(getSearchResource(context, R.xml.security_settings_unencrypted));
|
|
||||||
|
|
||||||
return index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -201,12 +188,6 @@ public class EncryptionAndCredential extends DashboardFragment {
|
|||||||
return um.isAdminUser();
|
return um.isAdminUser();
|
||||||
}
|
}
|
||||||
|
|
||||||
private SearchIndexableResource getSearchResource(Context context, int xmlResId) {
|
|
||||||
final SearchIndexableResource sir = new SearchIndexableResource(context);
|
|
||||||
sir.xmlResId = xmlResId;
|
|
||||||
return sir;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getNonIndexableKeys(Context context) {
|
public List<String> getNonIndexableKeys(Context context) {
|
||||||
final List<String> keys = super.getNonIndexableKeys(context);
|
final List<String> keys = super.getNonIndexableKeys(context);
|
||||||
@@ -223,21 +204,6 @@ public class EncryptionAndCredential extends DashboardFragment {
|
|||||||
keys.add(KEY_USER_CREDENTIALS);
|
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;
|
return keys;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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.settings.security;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.UserManager;
|
||||||
|
import android.support.v7.preference.Preference;
|
||||||
|
|
||||||
|
import com.android.internal.widget.LockPatternUtils;
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.core.PreferenceControllerMixin;
|
||||||
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
|
||||||
|
public class EncryptionStatusPreferenceController extends AbstractPreferenceController
|
||||||
|
implements PreferenceControllerMixin {
|
||||||
|
|
||||||
|
private static final String PREF_KEY = "encryption_and_credentials_encryption_status";
|
||||||
|
|
||||||
|
private final UserManager mUserManager;
|
||||||
|
|
||||||
|
public EncryptionStatusPreferenceController(Context context) {
|
||||||
|
super(context);
|
||||||
|
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAvailable() {
|
||||||
|
return mUserManager.isAdminUser();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPreferenceKey() {
|
||||||
|
return PREF_KEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateState(Preference preference) {
|
||||||
|
final boolean encryptionEnabled = LockPatternUtils.isDeviceEncryptionEnabled();
|
||||||
|
if (encryptionEnabled) {
|
||||||
|
preference.setFragment(null);
|
||||||
|
preference.setSummary(R.string.crypt_keeper_encrypted_summary);
|
||||||
|
} else {
|
||||||
|
preference.setFragment(CryptKeeperSettings.class.getName());
|
||||||
|
preference.setSummary(R.string.summary_placeholder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -23,13 +23,18 @@ import com.android.settingslib.core.AbstractPreferenceController;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class WorkOnlyCategoryPreferenceController extends AbstractPreferenceController
|
/**
|
||||||
|
* A controller for generic Preference categories. If all controllers for its children reports
|
||||||
|
* not-available, this controller will also report not-available, and subsequently will be hidden by
|
||||||
|
* UI.
|
||||||
|
*/
|
||||||
|
public class PreferenceCategoryController extends AbstractPreferenceController
|
||||||
implements PreferenceControllerMixin {
|
implements PreferenceControllerMixin {
|
||||||
|
|
||||||
private final String mKey;
|
private final String mKey;
|
||||||
private final List<AbstractPreferenceController> mChildren;
|
private final List<AbstractPreferenceController> mChildren;
|
||||||
|
|
||||||
public WorkOnlyCategoryPreferenceController(Context context,
|
public PreferenceCategoryController(Context context,
|
||||||
String key, List<AbstractPreferenceController> childrenControllers) {
|
String key, List<AbstractPreferenceController> childrenControllers) {
|
||||||
super(context);
|
super(context);
|
||||||
mKey = key;
|
mKey = key;
|
@@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
package com.android.settings.security;
|
package com.android.settings.security;
|
||||||
|
|
||||||
import static android.app.admin.DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE;
|
|
||||||
import static android.app.admin.DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE;
|
|
||||||
import static com.android.settings.security.EncryptionAndCredential.SEARCH_INDEX_DATA_PROVIDER;
|
import static com.android.settings.security.EncryptionAndCredential.SEARCH_INDEX_DATA_PROVIDER;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
@@ -28,7 +26,6 @@ import android.os.UserManager;
|
|||||||
import android.provider.SearchIndexableResource;
|
import android.provider.SearchIndexableResource;
|
||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.TestConfig;
|
import com.android.settings.TestConfig;
|
||||||
import com.android.settings.search.BaseSearchIndexProvider;
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
@@ -71,16 +68,6 @@ public class EncryptionAndCredentialTest {
|
|||||||
assertThat(fragment.getMetricsCategory()).isEqualTo(MetricsEvent.ENCRYPTION_AND_CREDENTIAL);
|
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
|
@Test
|
||||||
public void getNonIndexableKeys_pageIsDisabled_shouldReturnAllKeysAsNonIndexable() {
|
public void getNonIndexableKeys_pageIsDisabled_shouldReturnAllKeysAsNonIndexable() {
|
||||||
when(mUserManager.isAdminUser()).thenReturn(false);
|
when(mUserManager.isAdminUser()).thenReturn(false);
|
||||||
@@ -96,32 +83,4 @@ public class EncryptionAndCredentialTest {
|
|||||||
|
|
||||||
assertThat(keys).containsExactlyElementsIn(expectedKeys);
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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.settings.security;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.support.v7.preference.Preference;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.TestConfig;
|
||||||
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
|
||||||
|
import com.android.settings.testutils.shadow.ShadowUserManager;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
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,
|
||||||
|
shadows = {
|
||||||
|
ShadowUserManager.class,
|
||||||
|
ShadowLockPatternUtils.class
|
||||||
|
})
|
||||||
|
public class EncryptionStatusPreferenceControllerTest {
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
private EncryptionStatusPreferenceController mController;
|
||||||
|
private Preference mPreference;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
mContext = RuntimeEnvironment.application;
|
||||||
|
mController = new EncryptionStatusPreferenceController(mContext);
|
||||||
|
mPreference = new Preference(mContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isAvailable_admin_true() {
|
||||||
|
ShadowUserManager.getShadow().setIsAdminUser(true);
|
||||||
|
|
||||||
|
assertThat(mController.isAvailable()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isAvailable_notAdmin_false() {
|
||||||
|
ShadowUserManager.getShadow().setIsAdminUser(false);
|
||||||
|
|
||||||
|
assertThat(mController.isAvailable()).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void updateSummary_encrypted_shouldSayEncrypted() {
|
||||||
|
ShadowLockPatternUtils.setDeviceEncryptionEnabled(true);
|
||||||
|
|
||||||
|
mController.updateState(mPreference);
|
||||||
|
|
||||||
|
assertThat(mPreference.getFragment()).isNull();
|
||||||
|
assertThat(mPreference.getSummary())
|
||||||
|
.isEqualTo(mContext.getText(R.string.crypt_keeper_encrypted_summary));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void updateSummary_unencrypted_shouldHasEncryptionFragment() {
|
||||||
|
ShadowLockPatternUtils.setDeviceEncryptionEnabled(false);
|
||||||
|
|
||||||
|
mController.updateState(mPreference);
|
||||||
|
|
||||||
|
assertThat(mPreference.getSummary())
|
||||||
|
.isEqualTo(mContext.getText(R.string.summary_placeholder));
|
||||||
|
assertThat(mPreference.getFragment()).isEqualTo(CryptKeeperSettings.class.getName());
|
||||||
|
}
|
||||||
|
}
|
@@ -27,6 +27,8 @@ import org.robolectric.annotation.Implements;
|
|||||||
public class ShadowLockPatternUtils {
|
public class ShadowLockPatternUtils {
|
||||||
|
|
||||||
private int mPasswordQuality = 1;
|
private int mPasswordQuality = 1;
|
||||||
|
private static boolean sDeviceEncryptionEnabled;
|
||||||
|
|
||||||
@Implementation
|
@Implementation
|
||||||
public boolean isSecure(int id) {
|
public boolean isSecure(int id) {
|
||||||
return true;
|
return true;
|
||||||
@@ -42,6 +44,15 @@ public class ShadowLockPatternUtils {
|
|||||||
return mPasswordQuality;
|
return mPasswordQuality;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Implementation
|
||||||
|
public static boolean isDeviceEncryptionEnabled() {
|
||||||
|
return sDeviceEncryptionEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeviceEncryptionEnabled(boolean deviceEncryptionEnabled) {
|
||||||
|
sDeviceEncryptionEnabled = deviceEncryptionEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
// Non-Android accessor.
|
// Non-Android accessor.
|
||||||
public int getPasswordQuality() {
|
public int getPasswordQuality() {
|
||||||
return mPasswordQuality;
|
return mPasswordQuality;
|
||||||
|
@@ -37,17 +37,17 @@ import java.util.List;
|
|||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
public class WorkOnlyCategoryPreferenceControllerTest {
|
public class PreferenceCategoryControllerTest {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private WorkOnlyCategoryPreferenceController mController;
|
private PreferenceCategoryController mController;
|
||||||
private List<AbstractPreferenceController> mChildren;
|
private List<AbstractPreferenceController> mChildren;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = RuntimeEnvironment.application;
|
||||||
mChildren = new ArrayList<>();
|
mChildren = new ArrayList<>();
|
||||||
mController = new WorkOnlyCategoryPreferenceController(mContext, "pref_key", mChildren);
|
mController = new PreferenceCategoryController(mContext, "pref_key", mChildren);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
Reference in New Issue
Block a user