diff --git a/AndroidManifest.xml b/AndroidManifest.xml index eeb969464b5..6a4b8d56aa5 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -19,6 +19,8 @@ + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 7c2cc675a30..4dcc1e449d0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -11526,6 +11526,25 @@ Learn more + + + + Financed device info + + Types of information your device administrator can see + + Data associated with your account, such as email and calendar info + + Changes made by your device administrator + + Device administrator can lock this device and reset password + + Device administrator can delete all device data + + Failed password attempts before deleting device data + + Your credit provider can change settings and install software on this device.\n\nTo learn more, contact your creditor provider. + @@ -12788,10 +12807,6 @@ Connect to public networks network connection, internet, wireless, data, wifi, wi-fi, wi fi, cellular, mobile, cell carrier, 4g, 3g, 2g, lte - - View airplane mode networks - - Viewing airplane mode networks Turn on Wi\u2011Fi @@ -12804,6 +12819,8 @@ Resetting your internet\u2026 Fix connectivity + + Networks available To switch networks, disconnect ethernet @@ -12935,8 +12952,8 @@ - Copy & paste notifications + Show clipboard access - Show a message when apps access text or data you have copied + Show a message when apps access text, images, or other content you\u2019ve copied diff --git a/res/xml/financed_privacy_settings.xml b/res/xml/financed_privacy_settings.xml new file mode 100644 index 00000000000..742d7e1e9eb --- /dev/null +++ b/res/xml/financed_privacy_settings.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 0c1ace905c2..a276ad75458 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -445,6 +445,13 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF return getActivity().getSystemService(name); } + /** + * Returns the specified system service from the owning Activity. + */ + protected T getSystemService(final Class serviceClass) { + return getActivity().getSystemService(serviceClass); + } + /** * Returns the PackageManager from the owning Activity. */ diff --git a/src/com/android/settings/UserCredentialsSettings.java b/src/com/android/settings/UserCredentialsSettings.java index 5f72ca58423..80b97e4272a 100644 --- a/src/com/android/settings/UserCredentialsSettings.java +++ b/src/com/android/settings/UserCredentialsSettings.java @@ -34,7 +34,6 @@ import android.security.Credentials; import android.security.IKeyChainService; import android.security.KeyChain; import android.security.KeyChain.KeyChainConnection; -import android.security.keystore.AndroidKeyStoreProvider; import android.security.keystore.KeyProperties; import android.security.keystore2.AndroidKeyStoreLoadStoreParameter; import android.util.Log; @@ -74,6 +73,8 @@ public class UserCredentialsSettings extends SettingsPreferenceFragment implements View.OnClickListener { private static final String TAG = "UserCredentialsSettings"; + private static final String KEYSTORE_PROVIDER = "AndroidKeyStore"; + @Override public int getMetricsCategory() { return SettingsEnums.USER_CREDENTIALS; @@ -210,15 +211,10 @@ public class UserCredentialsSettings extends SettingsPreferenceFragment private void deleteWifiCredential(final Credential credential) { try { - KeyStore keyStore = null; - if (AndroidKeyStoreProvider.isKeystore2Enabled()) { - keyStore = KeyStore.getInstance("AndroidKeyStore"); - keyStore.load( - new AndroidKeyStoreLoadStoreParameter( - KeyProperties.NAMESPACE_WIFI)); - } else { - keyStore = AndroidKeyStoreProvider.getKeyStoreForUid(Process.WIFI_UID); - } + final KeyStore keyStore = KeyStore.getInstance(KEYSTORE_PROVIDER); + keyStore.load( + new AndroidKeyStoreLoadStoreParameter( + KeyProperties.NAMESPACE_WIFI)); keyStore.deleteEntry(credential.getAlias()); } catch (Exception e) { throw new RuntimeException("Failed to delete keys from keystore."); @@ -278,18 +274,13 @@ public class UserCredentialsSettings extends SettingsPreferenceFragment final int wifiUid = UserHandle.getUid(myUserId, Process.WIFI_UID); try { - KeyStore processKeystore = KeyStore.getInstance("AndroidKeyStore"); + KeyStore processKeystore = KeyStore.getInstance(KEYSTORE_PROVIDER); processKeystore.load(null); KeyStore wifiKeystore = null; if (myUserId == 0) { - // Only the primary user may see wifi configurations. - if (AndroidKeyStoreProvider.isKeystore2Enabled()) { - wifiKeystore = KeyStore.getInstance("AndroidKeyStore"); - wifiKeystore.load(new AndroidKeyStoreLoadStoreParameter( - KeyProperties.NAMESPACE_WIFI)); - } else { - wifiKeystore = AndroidKeyStoreProvider.getKeyStoreForUid(Process.WIFI_UID); - } + wifiKeystore = KeyStore.getInstance(KEYSTORE_PROVIDER); + wifiKeystore.load(new AndroidKeyStoreLoadStoreParameter( + KeyProperties.NAMESPACE_WIFI)); } List credentials = new ArrayList<>(); diff --git a/src/com/android/settings/datausage/ChartDataUsagePreference.java b/src/com/android/settings/datausage/ChartDataUsagePreference.java index 6c845a951fa..0577e9c01f3 100644 --- a/src/com/android/settings/datausage/ChartDataUsagePreference.java +++ b/src/com/android/settings/datausage/ChartDataUsagePreference.java @@ -174,8 +174,8 @@ public class ChartDataUsagePreference extends Preference { @VisibleForTesting List getDensedStatsData(List usageSummary) { final List dataUsageSummaryNodes = new ArrayList<>(); - final long overallDataUsage = usageSummary.stream() - .mapToLong(NetworkCycleData::getTotalUsage).sum(); + final long overallDataUsage = Math.max(1L, usageSummary.stream() + .mapToLong(NetworkCycleData::getTotalUsage).sum()); long cumulatedDataUsage = 0L; int cumulatedDataUsagePercentage = 0; diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyPreferenceController.java b/src/com/android/settings/enterprise/EnterprisePrivacyPreferenceController.java index b07eb911143..8353d208534 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacyPreferenceController.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacyPreferenceController.java @@ -13,6 +13,9 @@ */ package com.android.settings.enterprise; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; + +import android.app.admin.DevicePolicyManager; import android.content.Context; import androidx.preference.Preference; @@ -39,6 +42,10 @@ public class EnterprisePrivacyPreferenceController extends AbstractPreferenceCon if (preference == null) { return; } + if (isFinancedDevice()) { + preference.setTitle(R.string.financed_privacy_settings); + } + final String organizationName = mFeatureProvider.getDeviceOwnerOrganizationName(); if (organizationName == null) { preference.setSummary(R.string.enterprise_privacy_settings_summary_generic); @@ -57,4 +64,10 @@ public class EnterprisePrivacyPreferenceController extends AbstractPreferenceCon public String getPreferenceKey() { return KEY_ENTERPRISE_PRIVACY; } + + private boolean isFinancedDevice() { + final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class); + return dpm.isDeviceManaged() && dpm.getDeviceOwnerType( + dpm.getDeviceOwnerComponentOnAnyUser()) == DEVICE_OWNER_TYPE_FINANCED; + } } diff --git a/src/com/android/settings/enterprise/EnterprisePrivacySettings.java b/src/com/android/settings/enterprise/EnterprisePrivacySettings.java index dd0a9ce8793..1aad54448f6 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacySettings.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacySettings.java @@ -20,16 +20,13 @@ import android.app.settings.SettingsEnums; import android.content.Context; import android.provider.SearchIndexableResource; -import com.android.settings.R; +import com.android.internal.annotations.VisibleForTesting; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.widget.PreferenceCategoryController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; @SearchIndexable @@ -37,6 +34,23 @@ public class EnterprisePrivacySettings extends DashboardFragment { static final String TAG = "EnterprisePrivacySettings"; + @VisibleForTesting + PrivacySettingsPreference mPrivacySettingsPreference; + + @Override + public void onAttach(Context context) { + mPrivacySettingsPreference = + PrivacySettingsPreferenceFactory.createPrivacySettingsPreference(context); + + super.onAttach(context); + } + + @Override + public void onDetach() { + mPrivacySettingsPreference = null; + super.onDetach(); + } + @Override public int getMetricsCategory() { return SettingsEnums.ENTERPRISE_PRIVACY_SETTINGS; @@ -49,47 +63,12 @@ public class EnterprisePrivacySettings extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.enterprise_privacy_settings; + return mPrivacySettingsPreference.getPreferenceScreenResId(); } @Override protected List createPreferenceControllers(Context context) { - return buildPreferenceControllers(context, true /* async */); - } - - private static List buildPreferenceControllers(Context context, - boolean async) { - final List controllers = new ArrayList<>(); - controllers.add(new NetworkLogsPreferenceController(context)); - controllers.add(new BugReportsPreferenceController(context)); - controllers.add(new SecurityLogsPreferenceController(context)); - final List exposureChangesCategoryControllers = - new ArrayList<>(); - exposureChangesCategoryControllers.add(new EnterpriseInstalledPackagesPreferenceController( - context, async)); - exposureChangesCategoryControllers.add( - new AdminGrantedLocationPermissionsPreferenceController(context, async)); - exposureChangesCategoryControllers.add( - new AdminGrantedMicrophonePermissionPreferenceController(context, async)); - exposureChangesCategoryControllers.add(new AdminGrantedCameraPermissionPreferenceController( - context, async)); - exposureChangesCategoryControllers.add(new EnterpriseSetDefaultAppsPreferenceController( - context)); - exposureChangesCategoryControllers.add(new AlwaysOnVpnCurrentUserPreferenceController( - context)); - exposureChangesCategoryControllers.add(new AlwaysOnVpnManagedProfilePreferenceController( - context)); - exposureChangesCategoryControllers.add(new ImePreferenceController(context)); - exposureChangesCategoryControllers.add(new GlobalHttpProxyPreferenceController(context)); - exposureChangesCategoryControllers.add(new CaCertsCurrentUserPreferenceController(context)); - exposureChangesCategoryControllers.add(new CaCertsManagedProfilePreferenceController( - context)); - controllers.addAll(exposureChangesCategoryControllers); - controllers.add(new PreferenceCategoryController(context, "exposure_changes_category") - .setChildren(exposureChangesCategoryControllers)); - controllers.add(new FailedPasswordWipeCurrentUserPreferenceController(context)); - controllers.add(new FailedPasswordWipeManagedProfilePreferenceController(context)); - return controllers; + return mPrivacySettingsPreference.createPreferenceControllers(true /* async */); } public static boolean isPageEnabled(Context context) { @@ -99,17 +78,32 @@ public class EnterprisePrivacySettings extends DashboardFragment { } public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider(R.xml.enterprise_privacy_settings) { + new BaseSearchIndexProvider() { + + private PrivacySettingsPreference mPrivacySettingsPreference; + @Override protected boolean isPageSearchEnabled(Context context) { return isPageEnabled(context); } + @Override + public List getXmlResourcesToIndex(Context context, + boolean enabled) { + mPrivacySettingsPreference = + PrivacySettingsPreferenceFactory.createPrivacySettingsPreference( + context); + return mPrivacySettingsPreference.getXmlResourcesToIndex(); + } @Override public List createPreferenceControllers( Context context) { - return buildPreferenceControllers(context, false /* async */); + mPrivacySettingsPreference = + PrivacySettingsPreferenceFactory.createPrivacySettingsPreference( + context); + return mPrivacySettingsPreference.createPreferenceControllers( + false /* async */); } }; } diff --git a/src/com/android/settings/enterprise/PrivacySettingsEnterprisePreference.java b/src/com/android/settings/enterprise/PrivacySettingsEnterprisePreference.java new file mode 100644 index 00000000000..19556a13e5c --- /dev/null +++ b/src/com/android/settings/enterprise/PrivacySettingsEnterprisePreference.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2021 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.enterprise; + +import android.content.Context; +import android.provider.SearchIndexableResource; + +import com.android.settings.R; +import com.android.settings.widget.PreferenceCategoryController; +import com.android.settingslib.core.AbstractPreferenceController; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** Privacy Settings preferences for an Enterprise device. */ +public class PrivacySettingsEnterprisePreference implements PrivacySettingsPreference { + private static final String KEY_EXPOSURE_CHANGES_CATEGORY = "exposure_changes_category"; + + private final Context mContext; + + public PrivacySettingsEnterprisePreference(Context context) { + mContext = context.getApplicationContext(); + } + + /** + * Returns the XML Res Id that is used for an Enterprise device in the Privacy Settings screen. + */ + @Override + public int getPreferenceScreenResId() { + return R.xml.enterprise_privacy_settings; + } + + /** + * Returns the Enterprise XML resources to index for an Enterprise device. + */ + @Override + public List getXmlResourcesToIndex() { + final SearchIndexableResource sir = new SearchIndexableResource(mContext); + sir.xmlResId = getPreferenceScreenResId(); + return Collections.singletonList(sir); + } + + /** + * Returns the preference controllers used to populate the privacy preferences in the Privacy + * Settings screen for Enterprise devices. + */ + @Override + public List createPreferenceControllers(boolean async) { + final List controllers = new ArrayList<>(); + controllers.add(new NetworkLogsPreferenceController(mContext)); + controllers.add(new BugReportsPreferenceController(mContext)); + controllers.add(new SecurityLogsPreferenceController(mContext)); + final List exposureChangesCategoryControllers = + new ArrayList<>(); + exposureChangesCategoryControllers.add(new EnterpriseInstalledPackagesPreferenceController( + mContext, async)); + exposureChangesCategoryControllers.add( + new AdminGrantedLocationPermissionsPreferenceController(mContext, async)); + exposureChangesCategoryControllers.add( + new AdminGrantedMicrophonePermissionPreferenceController(mContext, async)); + exposureChangesCategoryControllers.add(new AdminGrantedCameraPermissionPreferenceController( + mContext, async)); + exposureChangesCategoryControllers.add(new EnterpriseSetDefaultAppsPreferenceController( + mContext)); + exposureChangesCategoryControllers.add(new AlwaysOnVpnCurrentUserPreferenceController( + mContext)); + exposureChangesCategoryControllers.add(new AlwaysOnVpnManagedProfilePreferenceController( + mContext)); + exposureChangesCategoryControllers.add(new ImePreferenceController(mContext)); + exposureChangesCategoryControllers.add(new GlobalHttpProxyPreferenceController(mContext)); + exposureChangesCategoryControllers.add(new CaCertsCurrentUserPreferenceController( + mContext)); + exposureChangesCategoryControllers.add(new CaCertsManagedProfilePreferenceController( + mContext)); + controllers.addAll(exposureChangesCategoryControllers); + controllers.add(new PreferenceCategoryController(mContext, KEY_EXPOSURE_CHANGES_CATEGORY) + .setChildren(exposureChangesCategoryControllers)); + controllers.add(new FailedPasswordWipeCurrentUserPreferenceController(mContext)); + controllers.add(new FailedPasswordWipeManagedProfilePreferenceController(mContext)); + return controllers; + } +} diff --git a/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java b/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java new file mode 100644 index 00000000000..12901a63c15 --- /dev/null +++ b/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2021 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.enterprise; + +import android.content.Context; +import android.provider.SearchIndexableResource; + +import com.android.settings.R; +import com.android.settings.widget.PreferenceCategoryController; +import com.android.settingslib.core.AbstractPreferenceController; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** Privacy Settings preferences for a financed device. */ +public class PrivacySettingsFinancedPreference implements PrivacySettingsPreference { + private static final String KEY_EXPOSURE_CHANGES_CATEGORY = "exposure_changes_category"; + + private final Context mContext; + + public PrivacySettingsFinancedPreference(Context context) { + mContext = context.getApplicationContext(); + } + + /** + * Returns the XML Res Id that is used for financed devices in the Privacy Settings screen. + */ + @Override + public int getPreferenceScreenResId() { + return R.xml.financed_privacy_settings; + } + + /** + * Returns the XML resources to index for a financed device. + */ + @Override + public List getXmlResourcesToIndex() { + final SearchIndexableResource sir = new SearchIndexableResource(mContext); + sir.xmlResId = getPreferenceScreenResId(); + return Collections.singletonList(sir); + } + + /** + * Returns the preference controllers used to populate the privacy preferences in the Privacy + * Settings screen for a financed device. + */ + @Override + public List createPreferenceControllers(boolean async) { + final List controllers = new ArrayList<>(); + controllers.add(new NetworkLogsPreferenceController(mContext)); + controllers.add(new BugReportsPreferenceController(mContext)); + controllers.add(new SecurityLogsPreferenceController(mContext)); + final List exposureChangesCategoryControllers = + new ArrayList<>(); + exposureChangesCategoryControllers.add(new EnterpriseInstalledPackagesPreferenceController( + mContext, async)); + controllers.addAll(exposureChangesCategoryControllers); + controllers.add(new PreferenceCategoryController(mContext, KEY_EXPOSURE_CHANGES_CATEGORY) + .setChildren(exposureChangesCategoryControllers)); + controllers.add(new FailedPasswordWipeCurrentUserPreferenceController(mContext)); + return controllers; + } +} diff --git a/src/com/android/settings/enterprise/PrivacySettingsPreference.java b/src/com/android/settings/enterprise/PrivacySettingsPreference.java new file mode 100644 index 00000000000..4310f5e58cc --- /dev/null +++ b/src/com/android/settings/enterprise/PrivacySettingsPreference.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2021 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.enterprise; + +import android.provider.SearchIndexableResource; + +import com.android.settingslib.core.AbstractPreferenceController; + +import java.util.List; + +/** Interface for configuring what is displayed on the Privacy Settings. */ +public interface PrivacySettingsPreference { + + /** + * Returns the XML Res Id that is used in the Privacy Settings screen. + */ + int getPreferenceScreenResId(); + + /** + * Returns the XML resources to index. + */ + List getXmlResourcesToIndex(); + + /** + * Returns the preference controllers used to populate the privacy preferences. + */ + List createPreferenceControllers(boolean async); +} diff --git a/src/com/android/settings/enterprise/PrivacySettingsPreferenceFactory.java b/src/com/android/settings/enterprise/PrivacySettingsPreferenceFactory.java new file mode 100644 index 00000000000..0ec2498177e --- /dev/null +++ b/src/com/android/settings/enterprise/PrivacySettingsPreferenceFactory.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2021 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.enterprise; + +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; + +import android.app.admin.DevicePolicyManager; +import android.content.Context; + +/** Factory for creating the privacy settings preference for a managed device. */ +public class PrivacySettingsPreferenceFactory { + + /** + * Determines which preference to use in the Privacy Settings based off of the type of managed + * device. + */ + public static PrivacySettingsPreference createPrivacySettingsPreference(Context context) { + if (isFinancedDevice(context)) { + return createPrivacySettingsFinancedPreference(context); + } else { + return createPrivacySettingsEnterprisePreference(context); + } + } + + private static PrivacySettingsEnterprisePreference createPrivacySettingsEnterprisePreference( + Context context) { + return new PrivacySettingsEnterprisePreference(context); + } + + private static PrivacySettingsFinancedPreference createPrivacySettingsFinancedPreference( + Context context) { + return new PrivacySettingsFinancedPreference(context); + } + + private static boolean isFinancedDevice(Context context) { + final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class); + return dpm.isDeviceManaged() && dpm.getDeviceOwnerType( + dpm.getDeviceOwnerComponentOnAnyUser()) == DEVICE_OWNER_TYPE_FINANCED; + } +} diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index 16455905ce7..68a0b033f1a 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -298,7 +298,7 @@ public class BatteryUtils { */ public long calculateLastFullChargeTime(BatteryUsageStats batteryUsageStats, long currentTimeMs) { - return currentTimeMs - batteryUsageStats.getStatsStartRealtime(); + return currentTimeMs - batteryUsageStats.getStatsStartTimestamp(); } public static void logRuntime(String tag, String message, long startTime) { diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java index 433c06d0220..1052afe8981 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java @@ -28,7 +28,6 @@ import com.android.settings.fuelgauge.batterytip.detectors.EarlyWarningDetector; import com.android.settings.fuelgauge.batterytip.detectors.HighUsageDetector; import com.android.settings.fuelgauge.batterytip.detectors.LowBatteryDetector; import com.android.settings.fuelgauge.batterytip.detectors.SmartBatteryDetector; -import com.android.settings.fuelgauge.batterytip.detectors.SummaryDetector; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip; import com.android.settings.fuelgauge.batterytip.tips.SummaryTip; @@ -73,7 +72,6 @@ public class BatteryTipLoader extends AsyncLoaderCompat> { tips.add(new SmartBatteryDetector(policy, context.getContentResolver()).detect()); tips.add(new EarlyWarningDetector(policy, context).detect()); tips.add(new BatteryDefenderDetector(batteryInfo).detect()); - tips.add(new SummaryDetector(policy, batteryInfo.averageTimeToDischarge).detect()); // Disable this feature now since it introduces false positive cases. We will try to improve // it in the future. // tips.add(new RestrictAppDetector(context, policy).detect()); diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java index 487adf859d4..3fbbf5b5f81 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java @@ -230,7 +230,7 @@ public class BatteryTipPolicy { } batteryTipEnabled = mParser.getBoolean(KEY_BATTERY_TIP_ENABLED, true); - summaryEnabled = mParser.getBoolean(KEY_SUMMARY_ENABLED, true); + summaryEnabled = mParser.getBoolean(KEY_SUMMARY_ENABLED, false); batterySaverTipEnabled = mParser.getBoolean(KEY_BATTERY_SAVER_TIP_ENABLED, true); highUsageEnabled = mParser.getBoolean(KEY_HIGH_USAGE_ENABLED, true); highUsageAppCount = mParser.getInt(KEY_HIGH_USAGE_APP_COUNT, 3); diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java index 4317bffaf7d..00b1e874d33 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java @@ -28,11 +28,9 @@ import com.android.settings.core.BasePreferenceController; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; -import com.android.settings.fuelgauge.batterytip.tips.SummaryTip; import com.android.settings.overlay.FeatureFactory; import com.android.settings.widget.CardPreference; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; -import com.android.settingslib.fuelgauge.EstimateKt; import java.util.HashMap; import java.util.List; @@ -91,10 +89,8 @@ public class BatteryTipPreferenceController extends BasePreferenceController { mPrefContext = screen.getContext(); mCardPreference = screen.findPreference(getPreferenceKey()); - // Add summary tip in advance to avoid UI flakiness - final SummaryTip summaryTip = new SummaryTip(BatteryTip.StateType.NEW, - EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); - summaryTip.updatePreference(mCardPreference); + // Set preference as invisible since there is no default tips. + mCardPreference.setVisible(false); } public void updateBatteryTips(List batteryTips) { @@ -110,10 +106,12 @@ public class BatteryTipPreferenceController extends BasePreferenceController { } } + mCardPreference.setVisible(false); for (int i = 0, size = batteryTips.size(); i < size; i++) { final BatteryTip batteryTip = mBatteryTips.get(i); batteryTip.validateCheck(mContext); if (batteryTip.getState() != BatteryTip.StateType.INVISIBLE) { + mCardPreference.setVisible(true); batteryTip.updatePreference(mCardPreference); mBatteryTipMap.put(mCardPreference.getKey(), batteryTip); batteryTip.log(mContext, mMetricsFeatureProvider); diff --git a/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceController.java b/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceController.java index 04a32de6bd8..5eba5394388 100644 --- a/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceController.java +++ b/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceController.java @@ -76,7 +76,7 @@ public class SwipeBottomToNotificationPreferenceController extends TogglePrefere @Override public boolean isChecked() { return Settings.Secure.getInt(mContext.getContentResolver(), - SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, ON) == ON; + SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, OFF) == ON; } @Override diff --git a/src/com/android/settings/network/InternetPreferenceController.java b/src/com/android/settings/network/InternetPreferenceController.java index a6c857467c1..639bab5322c 100644 --- a/src/com/android/settings/network/InternetPreferenceController.java +++ b/src/com/android/settings/network/InternetPreferenceController.java @@ -75,7 +75,7 @@ public class InternetPreferenceController extends AbstractPreferenceController i private static Map sSummaryMap = new HashMap<>(); static { sSummaryMap.put(INTERNET_OFF, R.string.condition_airplane_title); - sSummaryMap.put(INTERNET_NETWORKS_AVAILABLE, R.string.disconnected); + sSummaryMap.put(INTERNET_NETWORKS_AVAILABLE, R.string.networks_available); sSummaryMap.put(INTERNET_WIFI, 0); sSummaryMap.put(INTERNET_CELLULAR, 0); sSummaryMap.put(INTERNET_ETHERNET, R.string.to_switch_networks_disconnect_ethernet); diff --git a/src/com/android/settings/utils/AndroidKeystoreAliasLoader.java b/src/com/android/settings/utils/AndroidKeystoreAliasLoader.java index e8eab68ee6a..dee58178d88 100644 --- a/src/com/android/settings/utils/AndroidKeystoreAliasLoader.java +++ b/src/com/android/settings/utils/AndroidKeystoreAliasLoader.java @@ -16,8 +16,6 @@ package com.android.settings.utils; -import android.os.Process; -import android.security.keystore.AndroidKeyStoreProvider; import android.security.keystore.KeyProperties; import android.security.keystore2.AndroidKeyStoreLoadStoreParameter; import android.util.Log; @@ -41,6 +39,8 @@ import java.util.Enumeration; public class AndroidKeystoreAliasLoader { private static final String TAG = "SettingsKeystoreUtils"; + private static final String KEYSTORE_PROVIDER = "AndroidKeyStore"; + private final Collection mKeyCertAliases; private final Collection mCaCertAliases; /** @@ -58,21 +58,13 @@ public class AndroidKeystoreAliasLoader { public AndroidKeystoreAliasLoader(Integer namespace) { mKeyCertAliases = new ArrayList<>(); mCaCertAliases = new ArrayList<>(); - KeyStore keyStore = null; + final KeyStore keyStore; final Enumeration aliases; try { + keyStore = KeyStore.getInstance(KEYSTORE_PROVIDER); if (namespace != null && namespace != KeyProperties.NAMESPACE_APPLICATION) { - if (AndroidKeyStoreProvider.isKeystore2Enabled()) { - keyStore = KeyStore.getInstance("AndroidKeyStore"); - keyStore.load(new AndroidKeyStoreLoadStoreParameter(namespace)); - } else { - // In the legacy case we pass in the WIFI UID because that is the only - // possible special namespace that existed as of this writing, - // and new namespaces must only be added using the new mechanism. - keyStore = AndroidKeyStoreProvider.getKeyStoreForUid(Process.WIFI_UID); - } + keyStore.load(new AndroidKeyStoreLoadStoreParameter(namespace)); } else { - keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); } aliases = keyStore.aliases(); diff --git a/src/com/android/settings/wifi/WifiWakeupPreferenceController.java b/src/com/android/settings/wifi/WifiWakeupPreferenceController.java index 58697050375..e9fd35004da 100644 --- a/src/com/android/settings/wifi/WifiWakeupPreferenceController.java +++ b/src/com/android/settings/wifi/WifiWakeupPreferenceController.java @@ -26,7 +26,6 @@ import android.content.IntentFilter; import android.location.LocationManager; import android.net.wifi.WifiManager; import android.provider.Settings; -import android.util.FeatureFlagUtils; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; @@ -45,7 +44,6 @@ import com.android.settingslib.core.lifecycle.events.OnResume; * {@link TogglePreferenceController} that controls whether the Wi-Fi Wakeup feature should be * enabled. */ -// TODO(b/167474581): Should clean up this controller when Provider Model finished. public class WifiWakeupPreferenceController extends TogglePreferenceController implements LifecycleObserver, OnPause, OnResume { @@ -91,9 +89,6 @@ public class WifiWakeupPreferenceController extends TogglePreferenceController i @Override public int getAvailabilityStatus() { - if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL)) { - return CONDITIONALLY_UNAVAILABLE; - } return AVAILABLE; } diff --git a/tests/anomaly-tester/AndroidManifest.xml b/tests/anomaly-tester/AndroidManifest.xml index d6f68a892c1..3c5fb1fc1c6 100644 --- a/tests/anomaly-tester/AndroidManifest.xml +++ b/tests/anomaly-tester/AndroidManifest.xml @@ -19,6 +19,8 @@ + + @@ -49,4 +51,4 @@ android:label="Settings Test Cases"> - \ No newline at end of file + diff --git a/tests/componenttests/AndroidManifest.xml b/tests/componenttests/AndroidManifest.xml index 54ea3746d97..fb6c26f09a8 100644 --- a/tests/componenttests/AndroidManifest.xml +++ b/tests/componenttests/AndroidManifest.xml @@ -20,6 +20,8 @@ + + @@ -37,4 +39,4 @@ android:label="Settings Test Cases"> - \ No newline at end of file + diff --git a/tests/robotests/src/com/android/settings/enterprise/BasePrivacySettingsPreferenceTest.java b/tests/robotests/src/com/android/settings/enterprise/BasePrivacySettingsPreferenceTest.java new file mode 100644 index 00000000000..fdf005dd602 --- /dev/null +++ b/tests/robotests/src/com/android/settings/enterprise/BasePrivacySettingsPreferenceTest.java @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2021 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.enterprise; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.provider.SearchIndexableResource; + +import androidx.test.core.app.ApplicationProvider; + +import com.android.settings.R; +import com.android.settings.widget.PreferenceCategoryController; +import com.android.settingslib.core.AbstractPreferenceController; + +import org.junit.Before; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.util.List; + +@RunWith(RobolectricTestRunner.class) +public abstract class BasePrivacySettingsPreferenceTest { + + protected Context mContext; + + @Before + public void setUp() { + mContext = ApplicationProvider.getApplicationContext(); + } + + protected static void verifyEnterpriseSearchIndexableResources( + List searchIndexableResources) { + assertThat(searchIndexableResources).isNotEmpty(); + assertThat(searchIndexableResources.size()).isEqualTo(1); + assertThat(searchIndexableResources.get(0).xmlResId) + .isEqualTo(R.xml.enterprise_privacy_settings); + } + + protected static void verifyEnterprisePreferenceControllers( + List controllers) { + assertThat(controllers).isNotNull(); + assertThat(controllers.size()).isEqualTo(17); + int position = 0; + assertThat(controllers.get(position++)).isInstanceOf(NetworkLogsPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf(BugReportsPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + SecurityLogsPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + EnterpriseInstalledPackagesPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + AdminGrantedLocationPermissionsPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + AdminGrantedMicrophonePermissionPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + AdminGrantedCameraPermissionPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + EnterpriseSetDefaultAppsPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + AlwaysOnVpnCurrentUserPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + AlwaysOnVpnManagedProfilePreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf(ImePreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + GlobalHttpProxyPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + CaCertsCurrentUserPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + CaCertsManagedProfilePreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + PreferenceCategoryController.class); + assertThat(controllers.get(position++)).isInstanceOf( + FailedPasswordWipeCurrentUserPreferenceController.class); + assertThat(controllers.get(position)).isInstanceOf( + FailedPasswordWipeManagedProfilePreferenceController.class); + } + + protected static void verifyFinancedSearchIndexableResources( + List searchIndexableResources) { + assertThat(searchIndexableResources).isNotEmpty(); + assertThat(searchIndexableResources.size()).isEqualTo(1); + assertThat(searchIndexableResources.get(0).xmlResId) + .isEqualTo(R.xml.financed_privacy_settings); + } + + protected static void verifyFinancedPreferenceControllers( + List controllers) { + assertThat(controllers).isNotNull(); + assertThat(controllers.size()).isEqualTo(6); + int position = 0; + assertThat(controllers.get(position++)).isInstanceOf(NetworkLogsPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf(BugReportsPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + SecurityLogsPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + EnterpriseInstalledPackagesPreferenceController.class); + assertThat(controllers.get(position++)).isInstanceOf( + PreferenceCategoryController.class); + assertThat(controllers.get(position)).isInstanceOf( + FailedPasswordWipeCurrentUserPreferenceController.class); + } +} diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyPreferenceControllerTest.java index 6858dd3391b..80523573011 100644 --- a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyPreferenceControllerTest.java @@ -16,10 +16,15 @@ package com.android.settings.enterprise; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_DEFAULT; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; +import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; import android.content.Context; import androidx.preference.Preference; @@ -42,9 +47,14 @@ public class EnterprisePrivacyPreferenceControllerTest { private static final String MANAGED_WITH_NAME = "managed by Foo, Inc."; private static final String MANAGING_ORGANIZATION = "Foo, Inc."; private static final String KEY_ENTERPRISE_PRIVACY = "enterprise_privacy"; + private static final String FINANCED_PREFERENCE_TITLE = "Financed device info"; + private static final ComponentName DEVICE_OWNER_COMPONENT = + new ComponentName("com.android.foo", "bar"); @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext; + @Mock + private DevicePolicyManager mDevicePolicyManager; private FakeFeatureFactory mFeatureFactory; private EnterprisePrivacyPreferenceController mController; @@ -54,6 +64,14 @@ public class EnterprisePrivacyPreferenceControllerTest { MockitoAnnotations.initMocks(this); mFeatureFactory = FakeFeatureFactory.setupForTest(); mController = new EnterprisePrivacyPreferenceController(mContext); + + when((Object) mContext.getSystemService(DevicePolicyManager.class)) + .thenReturn(mDevicePolicyManager); + when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); + when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()) + .thenReturn(DEVICE_OWNER_COMPONENT); + when(mDevicePolicyManager.getDeviceOwnerType(DEVICE_OWNER_COMPONENT)) + .thenReturn(DEVICE_OWNER_TYPE_DEFAULT); } @Test @@ -76,6 +94,25 @@ public class EnterprisePrivacyPreferenceControllerTest { assertThat(preference.getSummary()).isEqualTo(MANAGED_WITH_NAME); } + @Test + public void testUpdateState_verifyPreferenceTitleIsUpdatedForFinancedDevice() { + final Preference preference = new Preference(mContext, null, 0, 0); + when(mContext.getResources().getString( + R.string.enterprise_privacy_settings_summary_with_name, MANAGING_ORGANIZATION)) + .thenReturn(MANAGED_WITH_NAME); + when(mContext.getString(R.string.financed_privacy_settings)) + .thenReturn(FINANCED_PREFERENCE_TITLE); + when(mFeatureFactory.enterprisePrivacyFeatureProvider.getDeviceOwnerOrganizationName()) + .thenReturn(MANAGING_ORGANIZATION); + when(mDevicePolicyManager.getDeviceOwnerType(DEVICE_OWNER_COMPONENT)) + .thenReturn(DEVICE_OWNER_TYPE_FINANCED); + + mController.updateState(preference); + + assertThat(preference.getTitle()).isEqualTo(FINANCED_PREFERENCE_TITLE); + assertThat(preference.getSummary()).isEqualTo(MANAGED_WITH_NAME); + } + @Test public void testIsAvailable() { when(mFeatureFactory.enterprisePrivacyFeatureProvider.hasDeviceOwner()).thenReturn(false); diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java index 2d4ba6295e5..eb7074911bb 100644 --- a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java @@ -16,47 +16,70 @@ package com.android.settings.enterprise; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_DEFAULT; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; -import android.content.Context; +import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; +import android.provider.SearchIndexableResource; + +import androidx.test.core.app.ApplicationProvider; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; -import com.android.settings.widget.PreferenceCategoryController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.drawer.CategoryKey; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; +import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) -public class EnterprisePrivacySettingsTest { +public class EnterprisePrivacySettingsTest extends BasePrivacySettingsPreferenceTest { + private static final ComponentName DEVICE_OWNER_COMPONENT = + new ComponentName("com.android.foo", "bar"); - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private Context mContext; + @Mock + private DevicePolicyManager mDevicePolicyManager; + @Mock + private PrivacySettingsPreference mPrivacySettingsPreference; private FakeFeatureFactory mFeatureFactory; private EnterprisePrivacySettings mSettings; + @Override @Before public void setUp() { MockitoAnnotations.initMocks(this); + mContext = spy(ApplicationProvider.getApplicationContext()); mFeatureFactory = FakeFeatureFactory.setupForTest(); mSettings = new EnterprisePrivacySettings(); + mSettings.mPrivacySettingsPreference = mPrivacySettingsPreference; + + when(mContext.getSystemService(DevicePolicyManager.class)).thenReturn(mDevicePolicyManager); + when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); + when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()) + .thenReturn(DEVICE_OWNER_COMPONENT); + when(mDevicePolicyManager.getDeviceOwnerType(DEVICE_OWNER_COMPONENT)) + .thenReturn(DEVICE_OWNER_TYPE_DEFAULT); } @Test public void verifyConstants() { + when(mPrivacySettingsPreference.getPreferenceScreenResId()) + .thenReturn(R.xml.enterprise_privacy_settings); + assertThat(mSettings.getMetricsCategory()) .isEqualTo(MetricsEvent.ENTERPRISE_PRIVACY_SETTINGS); assertThat(mSettings.getLogTag()).isEqualTo("EnterprisePrivacySettings"); @@ -76,6 +99,7 @@ public class EnterprisePrivacySettingsTest { @Test public void isPageEnabled_noDeviceOwner_shouldReturnFalse() { + when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false); when(mFeatureFactory.enterprisePrivacyFeatureProvider.hasDeviceOwner()) .thenReturn(false); @@ -85,53 +109,35 @@ public class EnterprisePrivacySettingsTest { @Test public void getPreferenceControllers() { - final List controllers = - mSettings.createPreferenceControllers(RuntimeEnvironment.application); - verifyPreferenceControllers(controllers); + final List controllers = new ArrayList<>(); + controllers.add(new NetworkLogsPreferenceController(mContext)); + when(mPrivacySettingsPreference.createPreferenceControllers(anyBoolean())) + .thenReturn(controllers); + + final List privacyControllers = + mSettings.createPreferenceControllers(mContext); + + assertThat(privacyControllers).isNotNull(); + assertThat(privacyControllers.size()).isEqualTo(1); + assertThat(controllers.get(0)).isInstanceOf(NetworkLogsPreferenceController.class); } @Test - public void getSearchIndexProviderPreferenceControllers() { + public void + getSearchIndexProviderPreferenceControllers_returnsEnterpriseSearchIndexPreferenceControllers() { final List controllers = EnterprisePrivacySettings.SEARCH_INDEX_DATA_PROVIDER - .getPreferenceControllers(RuntimeEnvironment.application); - verifyPreferenceControllers(controllers); + .getPreferenceControllers(mContext); + + verifyEnterprisePreferenceControllers(controllers); } - private void verifyPreferenceControllers(List controllers) { - assertThat(controllers).isNotNull(); - assertThat(controllers.size()).isEqualTo(17); - int position = 0; - assertThat(controllers.get(position++)).isInstanceOf(NetworkLogsPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf(BugReportsPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - SecurityLogsPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - EnterpriseInstalledPackagesPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - AdminGrantedLocationPermissionsPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - AdminGrantedMicrophonePermissionPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - AdminGrantedCameraPermissionPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - EnterpriseSetDefaultAppsPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - AlwaysOnVpnCurrentUserPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - AlwaysOnVpnManagedProfilePreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf(ImePreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - GlobalHttpProxyPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - CaCertsCurrentUserPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - CaCertsManagedProfilePreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - PreferenceCategoryController.class); - assertThat(controllers.get(position++)).isInstanceOf( - FailedPasswordWipeCurrentUserPreferenceController.class); - assertThat(controllers.get(position)).isInstanceOf( - FailedPasswordWipeManagedProfilePreferenceController.class); + @Test + public void getXmlResourcesToIndex_returnsEnterpriseXmlResources() { + final List searchIndexableResources = + EnterprisePrivacySettings.SEARCH_INDEX_DATA_PROVIDER + .getXmlResourcesToIndex(mContext, true); + + verifyEnterpriseSearchIndexableResources(searchIndexableResources); } } diff --git a/tests/robotests/src/com/android/settings/enterprise/PrivacySettingsEnterprisePreferenceTest.java b/tests/robotests/src/com/android/settings/enterprise/PrivacySettingsEnterprisePreferenceTest.java new file mode 100644 index 00000000000..68e37fc7792 --- /dev/null +++ b/tests/robotests/src/com/android/settings/enterprise/PrivacySettingsEnterprisePreferenceTest.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2021 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.enterprise; + +import static com.google.common.truth.Truth.assertThat; + +import android.provider.SearchIndexableResource; + +import com.android.settings.R; +import com.android.settingslib.core.AbstractPreferenceController; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.util.List; + +@RunWith(RobolectricTestRunner.class) +public class PrivacySettingsEnterprisePreferenceTest extends BasePrivacySettingsPreferenceTest { + + private PrivacySettingsEnterprisePreference mPrivacySettingsEnterprisePreference; + + @Override + @Before + public void setUp() { + super.setUp(); + mPrivacySettingsEnterprisePreference = new PrivacySettingsEnterprisePreference(mContext); + } + + @Test + public void getPreferenceScreenResId() { + assertThat(mPrivacySettingsEnterprisePreference.getPreferenceScreenResId()) + .isEqualTo(R.xml.enterprise_privacy_settings); + } + + @Test + public void getXmlResourcesToIndex() { + final List searchIndexableResources = + mPrivacySettingsEnterprisePreference.getXmlResourcesToIndex(); + + verifyEnterpriseSearchIndexableResources(searchIndexableResources); + } + + @Test + public void getPreferenceControllers() { + final List controllers = + mPrivacySettingsEnterprisePreference.createPreferenceControllers(true); + + verifyEnterprisePreferenceControllers(controllers); + } +} diff --git a/tests/robotests/src/com/android/settings/enterprise/PrivacySettingsFinancedPreferenceTest.java b/tests/robotests/src/com/android/settings/enterprise/PrivacySettingsFinancedPreferenceTest.java new file mode 100644 index 00000000000..fe7b214c851 --- /dev/null +++ b/tests/robotests/src/com/android/settings/enterprise/PrivacySettingsFinancedPreferenceTest.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2021 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.enterprise; + +import static com.google.common.truth.Truth.assertThat; + +import android.provider.SearchIndexableResource; + +import com.android.settings.R; +import com.android.settingslib.core.AbstractPreferenceController; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.util.List; + +@RunWith(RobolectricTestRunner.class) +public class PrivacySettingsFinancedPreferenceTest extends BasePrivacySettingsPreferenceTest { + + private PrivacySettingsFinancedPreference mPrivacySettingsFinancedPreference; + + @Override + @Before + public void setUp() { + super.setUp(); + mPrivacySettingsFinancedPreference = new PrivacySettingsFinancedPreference(mContext); + } + + @Test + public void getPreferenceScreenResId() { + assertThat(mPrivacySettingsFinancedPreference.getPreferenceScreenResId()) + .isEqualTo(R.xml.financed_privacy_settings); + } + + @Test + public void getXmlResourcesToIndex() { + final List searchIndexableResources = + mPrivacySettingsFinancedPreference.getXmlResourcesToIndex(); + + verifyFinancedSearchIndexableResources(searchIndexableResources); + } + + @Test + public void getPreferenceControllers() { + final List controllers = + mPrivacySettingsFinancedPreference.createPreferenceControllers(true); + + verifyFinancedPreferenceControllers(controllers); + } +} diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java index 775ca4015a1..744db8c4e97 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java @@ -277,7 +277,7 @@ public class BatteryUtilsTest { @Test public void testCalculateLastFullChargeTime() { final long currentTimeMs = System.currentTimeMillis(); - when(mBatteryUsageStats.getStatsStartRealtime()).thenReturn( + when(mBatteryUsageStats.getStatsStartTimestamp()).thenReturn( currentTimeMs - TIME_SINCE_LAST_FULL_CHARGE_MS); assertThat(mBatteryUtils.calculateLastFullChargeTime(mBatteryUsageStats, currentTimeMs)) diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java index 82448d138d9..5d7b082bd4a 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java @@ -54,7 +54,6 @@ public class BatteryTipLoaderTest { BatteryTip.TipType.BATTERY_SAVER, BatteryTip.TipType.HIGH_DEVICE_USAGE, BatteryTip.TipType.LOW_BATTERY, - BatteryTip.TipType.SUMMARY, BatteryTip.TipType.SMART_BATTERY_MANAGER}; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private BatteryUsageStats mBatteryUsageStats; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java index b68a8f57dd7..e9192889cd9 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java @@ -20,7 +20,6 @@ import static com.android.settings.fuelgauge.batterytip.tips.BatteryTip.TipType import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -30,10 +29,6 @@ import android.content.Context; import android.os.Bundle; import android.text.format.DateUtils; -import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; -import androidx.preference.PreferenceGroup; -import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import com.android.internal.logging.nano.MetricsProto; @@ -49,7 +44,6 @@ import com.android.settings.widget.CardPreference; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; @@ -104,10 +98,24 @@ public class BatteryTipPreferenceControllerTest { } @Test - public void testDisplayPreference_addSummaryTip() { + public void testDisplayPreference_isInvisible() { mBatteryTipPreferenceController.displayPreference(mPreferenceScreen); - assertOnlyContainsSummaryTip(mCardPreference); + assertThat(mCardPreference.isVisible()).isFalse(); + } + + @Test + public void testUpdateBatteryTips_tipsStateNew_isVisible() { + mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips); + + assertThat(mCardPreference.isVisible()).isTrue(); + } + + @Test + public void testUpdateBatteryTips_tipsStateInvisible_isInvisible() { + mBatteryTipPreferenceController.updateBatteryTips(mNewBatteryTips); + + assertThat(mCardPreference.isVisible()).isFalse(); } @Test diff --git a/tests/robotests/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceControllerTest.java index a1c0c8f5396..c6d823371a4 100644 --- a/tests/robotests/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/gestures/SwipeBottomToNotificationPreferenceControllerTest.java @@ -58,7 +58,7 @@ public class SwipeBottomToNotificationPreferenceControllerTest { mController.setChecked(true); assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 1)).isEqualTo(1); + SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 0)).isEqualTo(1); } @Test @@ -66,7 +66,7 @@ public class SwipeBottomToNotificationPreferenceControllerTest { mController.setChecked(false); assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 1)).isEqualTo(0); + SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 0)).isEqualTo(0); } @Test @@ -109,4 +109,13 @@ public class SwipeBottomToNotificationPreferenceControllerTest { assertThat(mController.getSummary()).isEqualTo( mContext.getText(R.string.gesture_setting_off)); } + + @Test + public void getDefaultConfig_returnsOffState() { + SystemProperties.set(OneHandedEnablePreferenceController.SUPPORT_ONE_HANDED_MODE, "false"); + Settings.Secure.resetToDefaults(mContext.getContentResolver(), + Settings.Secure.ONE_HANDED_MODE_ENABLED); + + assertThat(mController.isChecked()).isFalse(); + } } diff --git a/tests/uitests/AndroidManifest.xml b/tests/uitests/AndroidManifest.xml index dc6fc15d1cd..1072754be2b 100644 --- a/tests/uitests/AndroidManifest.xml +++ b/tests/uitests/AndroidManifest.xml @@ -26,6 +26,8 @@ + + diff --git a/tests/unit/AndroidManifest.xml b/tests/unit/AndroidManifest.xml index 616e6a9076a..7ef7ae1d2ba 100644 --- a/tests/unit/AndroidManifest.xml +++ b/tests/unit/AndroidManifest.xml @@ -19,6 +19,8 @@ + + diff --git a/tests/unit/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java b/tests/unit/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java index 4be2ae6c339..9b42951bcd5 100644 --- a/tests/unit/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java +++ b/tests/unit/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java @@ -94,7 +94,7 @@ public class BatteryTipPolicyTest { final BatteryTipPolicy batteryTipPolicy = new BatteryTipPolicy(mContext); assertThat(batteryTipPolicy.batteryTipEnabled).isTrue(); - assertThat(batteryTipPolicy.summaryEnabled).isTrue(); + assertThat(batteryTipPolicy.summaryEnabled).isFalse(); assertThat(batteryTipPolicy.batterySaverTipEnabled).isTrue(); assertThat(batteryTipPolicy.highUsageEnabled).isTrue(); assertThat(batteryTipPolicy.highUsageAppCount).isEqualTo(3);