Snap for 8112519 from 17979a4d32 to tm-release

Change-Id: I3f7ff2892b0db1c52be2b925746a6da82cf6af8d
This commit is contained in:
Android Build Coastguard Worker
2022-01-25 02:09:21 +00:00
39 changed files with 519 additions and 470 deletions

View File

@@ -114,6 +114,7 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.READ_APP_SPECIFIC_LOCALES" />
<uses-permission android:name="android.permission.QUERY_ADMIN_POLICY" />
<uses-permission android:name="android.permission.READ_SAFETY_CENTER_STATUS" />
<application
android:name=".SettingsApplication"

View File

@@ -22,15 +22,6 @@
android:height="@dimen/accessibility_icon_size"
android:color="@color/accessibility_feature_background"/>
</item>
<item android:gravity="center">
<vector
android:width="@dimen/accessibility_icon_foreground_size"
android:height="@dimen/accessibility_icon_foreground_size"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M6.4,18h2.1l1.1,-3.05h4.8L15.5,18h2.1L13.05,6h-2.1zM10.2,13.2l1.75,-4.95h0.1l1.75,4.95zM4,22q-0.825,0 -1.413,-0.587Q2,20.825 2,20L2,4q0,-0.825 0.587,-1.413Q3.175,2 4,2h16q0.825,0 1.413,0.587Q22,3.175 22,4v16q0,0.825 -0.587,1.413Q20.825,22 20,22zM4,20h16L20,4L4,4v16zM4,4v16L4,4z"/>
</vector>
</item>
<item android:gravity="center"
android:drawable="@drawable/ic_font_download"/>
</layer-list>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2022 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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="@dimen/accessibility_icon_foreground_size"
android:height="@dimen/accessibility_icon_foreground_size"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M6.4,18h2.1l1.1,-3.05h4.8L15.5,18h2.1L13.05,6h-2.1zM10.2,13.2l1.75,-4.95h0.1l1.75,4.95zM4,22q-0.825,0 -1.413,-0.587Q2,20.825 2,20L2,4q0,-0.825 0.587,-1.413Q3.175,2 4,2h16q0.825,0 1.413,0.587Q22,3.175 22,4v16q0,0.825 -0.587,1.413Q20.825,22 20,22zM4,20h16L20,4L4,4v16zM4,4v16L4,4z"/>
</vector>

View File

@@ -583,4 +583,7 @@
-->
</string-array>
<!-- The ratio to use when using the two-pane settings layout -->
<item name="config_activity_embed_split_ratio" format="float" type="dimen">0.5</item>
</resources>

View File

@@ -33,7 +33,7 @@ import com.android.settings.enterprise.EnterprisePrivacySettings;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.network.telephony.MobileNetworkUtils;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
import com.android.settings.security.SecuritySettingsFeatureProvider;
import com.google.android.setupdesign.util.ThemeHelper;
@@ -152,7 +152,7 @@ public class Settings extends SettingsActivity {
/** Redirects to SafetyCenter if enabled. */
@VisibleForTesting
public void handleSafetyCenterRedirection() {
if (SafetyCenterStatus.isEnabled()) {
if (SafetyCenterStatusHolder.get().isEnabled(this)) {
try {
startActivity(new Intent(Intent.ACTION_SAFETY_CENTER));
finish();
@@ -213,7 +213,7 @@ public class Settings extends SettingsActivity {
/** Redirects to SafetyCenter if enabled. */
@VisibleForTesting
public void handleSafetyCenterRedirection() {
if (SafetyCenterStatus.isEnabled()) {
if (SafetyCenterStatusHolder.get().isEnabled(this)) {
try {
startActivity(new Intent(Intent.ACTION_SAFETY_CENTER));
finish();

View File

@@ -0,0 +1,101 @@
/*
* Copyright (C) 2022 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.accessibility;
import android.content.ComponentName;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import java.util.StringJoiner;
/** Provides utility methods to accessibility quick settings only. */
final class AccessibilityQuickSettingUtils {
private static final String ACCESSIBILITY_PERF = "accessibility_prefs";
private static final String KEY_TILE_SERVICE_SHOWN = "tile_service_shown";
private static final char COMPONENT_NAME_SEPARATOR = ':';
private static final TextUtils.SimpleStringSplitter sStringColonSplitter =
new TextUtils.SimpleStringSplitter(COMPONENT_NAME_SEPARATOR);
/**
* Opts in component name into {@link AccessibilityQuickSettingUtils#KEY_TILE_SERVICE_SHOWN}
* colon-separated string in {@link SharedPreferences}.
*
* @param context The current context.
* @param componentName The component name that need to be opted in SharedPreferences.
*/
public static void optInValueToSharedPreferences(Context context,
@NonNull ComponentName componentName) {
final String targetString = getFromSharedPreferences(context);
if (hasValueInSharedPreferences(targetString, componentName)) {
return;
}
final StringJoiner joiner = new StringJoiner(String.valueOf(COMPONENT_NAME_SEPARATOR));
if (!TextUtils.isEmpty(targetString)) {
joiner.add(targetString);
}
joiner.add(componentName.flattenToString());
SharedPreferences.Editor editor = getSharedPreferences(context).edit();
editor.putString(KEY_TILE_SERVICE_SHOWN, joiner.toString()).apply();
}
/**
* Returns if component name existed in {@link
* AccessibilityQuickSettingUtils#KEY_TILE_SERVICE_SHOWN} string in {@link SharedPreferences}.
*
* @param context The current context.
* @param componentName The component name that need to be checked existed in SharedPreferences.
* @return {@code true} if componentName existed in SharedPreferences.
*/
public static boolean hasValueInSharedPreferences(Context context,
@NonNull ComponentName componentName) {
final String targetString = getFromSharedPreferences(context);
return hasValueInSharedPreferences(targetString, componentName);
}
private static boolean hasValueInSharedPreferences(String targetString,
@NonNull ComponentName componentName) {
if (TextUtils.isEmpty(targetString)) {
return false;
}
sStringColonSplitter.setString(targetString);
while (sStringColonSplitter.hasNext()) {
final String name = sStringColonSplitter.next();
if (TextUtils.equals(componentName.flattenToString(), name)) {
return true;
}
}
return false;
}
private static String getFromSharedPreferences(Context context) {
return getSharedPreferences(context).getString(KEY_TILE_SERVICE_SHOWN, "");
}
private static SharedPreferences getSharedPreferences(Context context) {
return context.getSharedPreferences(ACCESSIBILITY_PERF, Context.MODE_PRIVATE);
}
private AccessibilityQuickSettingUtils(){}
}

View File

@@ -17,9 +17,11 @@
package com.android.settings.activityembedding;
import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.FeatureFlagUtils;
import android.util.LayoutDirection;
import android.util.Log;
@@ -35,9 +37,11 @@ import com.android.settings.Settings;
import com.android.settings.SubSettings;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
import com.android.settings.core.FeatureFlags;
import com.android.settings.homepage.DeepLinkHomepageActivity;
import com.android.settings.homepage.SettingsHomepageActivity;
import com.android.settings.homepage.SliceDeepLinkHomepageActivity;
import com.android.settings.overlay.FeatureFactory;
import java.util.HashSet;
import java.util.Set;
@@ -92,7 +96,7 @@ public class ActivityEmbeddingRulesController {
clearTop,
ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context),
ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context),
ActivityEmbeddingUtils.SPLIT_RATIO,
ActivityEmbeddingUtils.getSplitRatio(context),
LayoutDirection.LOCALE));
}
@@ -198,7 +202,7 @@ public class ActivityEmbeddingRulesController {
SplitRule.FINISH_ADJACENT,
ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext),
ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext),
ActivityEmbeddingUtils.SPLIT_RATIO,
ActivityEmbeddingUtils.getSplitRatio(mContext),
LayoutDirection.LOCALE);
mSplitController.registerRule(placeholderRule);
@@ -206,11 +210,22 @@ public class ActivityEmbeddingRulesController {
private void registerAlwaysExpandRule() {
final Set<ActivityFilter> activityFilters = new HashSet<>();
if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SETTINGS_SEARCH_ALWAYS_EXPAND)) {
final Intent searchIntent = FeatureFactory.getFactory(mContext)
.getSearchFeatureProvider()
.buildSearchIntent(mContext, SettingsEnums.SETTINGS_HOMEPAGE);
addActivityFilter(activityFilters, searchIntent);
}
addActivityFilter(activityFilters, FingerprintEnrollIntroduction.class);
addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class);
mSplitController.registerRule(new ActivityRule(activityFilters, true /* alwaysExpand */));
}
private static void addActivityFilter(Set<ActivityFilter> activityFilters, Intent intent) {
activityFilters.add(new ActivityFilter(new ComponentName("*" /* pkg */, "*" /* cls */),
intent.getAction()));
}
private void addActivityFilter(Set<ActivityFilter> activityFilters,
Class<? extends Activity> activityClass) {
activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass),

View File

@@ -24,9 +24,10 @@ import android.util.TypedValue;
import androidx.window.embedding.SplitController;
import com.android.settings.R;
/** An util class collecting all common methods for the embedding activity features. */
public class ActivityEmbeddingUtils {
public static final float SPLIT_RATIO = 0.5f;
// The smallest value of current width of the window when the split should be used.
private static final float MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720f;
// The smallest value of the smallest-width (sw) of the window in any rotation when
@@ -51,6 +52,14 @@ public class ActivityEmbeddingUtils {
TypedValue.COMPLEX_UNIT_DIP, MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP, dm);
}
/**
* Get the ratio to use when splitting windows. This should be a float which describes
* the percentage of the screen which the first window should occupy.
*/
public static float getSplitRatio(Context context) {
return context.getResources().getFloat(R.dimen.config_activity_embed_split_ratio);
}
/** Whether to support embedding activity feature. */
public static boolean isEmbeddingActivityEnabled(Context context) {
final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context,

View File

@@ -28,4 +28,6 @@ public class FeatureFlags {
public static final String CONDITIONAL_CARDS = "settings_conditionals";
public static final String TETHER_ALL_IN_ONE = "settings_tether_all_in_one";
public static final String CONTEXTUAL_HOME = "settings_contextual_home";
public static final String SETTINGS_SEARCH_ALWAYS_EXPAND =
"settings_search_always_expand";
}

View File

@@ -55,8 +55,8 @@ public class UserAdapter implements SpinnerAdapter, ListAdapter {
Drawable icon;
if (userInfo.isManagedProfile()) {
mName = context.getString(R.string.managed_user_title);
icon = context.getDrawable(
com.android.internal.R.drawable.ic_corp_badge);
icon = context.getPackageManager().getUserBadgeForDensityNoBackground(
userHandle, /* density= */ 0);
} else {
mName = userInfo.name;
final int userId = userInfo.id;

View File

@@ -67,6 +67,9 @@ public final class BatteryBackupHelper implements BackupHelper {
static final String KEY_FULL_POWER_LIST = "full_power_list";
static final String KEY_OPTIMIZATION_LIST = "optimization_mode_list";
@VisibleForTesting
List<ApplicationInfo> mTestApplicationInfoList = null;
@VisibleForTesting
PowerAllowlistBackend mPowerAllowlistBackend;
@VisibleForTesting
@@ -267,6 +270,9 @@ public final class BatteryBackupHelper implements BackupHelper {
}
private List<ApplicationInfo> getInstalledApplications() {
if (mTestApplicationInfoList != null) {
return mTestApplicationInfoList;
}
final List<ApplicationInfo> applications = new ArrayList<>();
final UserManager um = mContext.getSystemService(UserManager.class);
for (UserInfo userInfo : um.getProfiles(UserHandle.myUserId())) {

View File

@@ -22,7 +22,7 @@ import android.content.Context;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.notification.LockScreenNotificationPreferenceController;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -93,7 +93,7 @@ public class PrivacyDashboardFragment extends DashboardFragment {
@Override
protected boolean isPageSearchEnabled(Context context) {
return !SafetyCenterStatus.isEnabled();
return !SafetyCenterStatusHolder.get().isEnabled(context);
}
};
}

View File

@@ -20,7 +20,7 @@ import android.annotation.NonNull;
import android.content.Context;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
/** The preference controller for the top level privacy tile. */
public class TopLevelPrivacyEntryPreferenceController extends BasePreferenceController {
@@ -31,7 +31,7 @@ public class TopLevelPrivacyEntryPreferenceController extends BasePreferenceCon
@Override
public int getAvailabilityStatus() {
if (!SafetyCenterStatus.isEnabled()) {
if (!SafetyCenterStatusHolder.get().isEnabled(mContext)) {
return AVAILABLE;
}
return CONDITIONALLY_UNAVAILABLE;

View File

@@ -1,36 +0,0 @@
/*
* 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.safetycenter;
import android.provider.DeviceConfig;
import com.android.internal.annotations.VisibleForTesting;
/** Knows whether safety center is enabled or disabled. */
public class SafetyCenterStatus {
/** Whether SafetyCenter page is enabled. */
@VisibleForTesting
public static final String SAFETY_CENTER_IS_ENABLED = "safety_center_is_enabled";
/** Returns true is SafetyCenter page is enabled, false otherwise. */
public static boolean isEnabled() {
// TODO(b/208625216): use SafetyManager API instead
return DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_PRIVACY, SAFETY_CENTER_IS_ENABLED, false);
}
}

View File

@@ -0,0 +1,62 @@
/*
* Copyright (C) 2022 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.safetycenter;
import android.content.Context;
import android.safetycenter.SafetyCenterManager;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
/** Knows whether safety center is enabled or disabled. */
public class SafetyCenterStatusHolder {
private static final String TAG = "SafetyCenterStatusHolder";
@VisibleForTesting
public static SafetyCenterStatusHolder sInstance;
private SafetyCenterStatusHolder() {}
/** Returns an instance of {@link SafetyCenterStatusHolder}. */
public static SafetyCenterStatusHolder get() {
if (sInstance == null) {
sInstance = new SafetyCenterStatusHolder();
}
return sInstance;
}
/** Returns true is SafetyCenter page is enabled, false otherwise. */
public boolean isEnabled(Context context) {
if (context == null) {
Log.e(TAG, "Context is null at SafetyCenterStatusHolder#isEnabled");
return false;
}
SafetyCenterManager safetyCenterManager =
context.getSystemService(SafetyCenterManager.class);
if (safetyCenterManager == null) {
Log.w(TAG, "System service SAFETY_CENTER_SERVICE (SafetyCenterManager) is null");
return false;
}
try {
return safetyCenterManager.isSafetyCenterEnabled();
} catch (RuntimeException e) {
Log.e(TAG, "Calling isSafetyCenterEnabled failed.", e);
return false;
}
}
}

View File

@@ -37,7 +37,7 @@ public class TopLevelSafetyCenterEntryPreferenceController extends BasePreferenc
@Override
public int getAvailabilityStatus() {
if (SafetyCenterStatus.isEnabled()) {
if (SafetyCenterStatusHolder.get().isEnabled(mContext)) {
return AVAILABLE;
}
return CONDITIONALLY_UNAVAILABLE;

View File

@@ -25,6 +25,7 @@ import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import android.util.Log;
import com.android.settings.SettingsActivity;
@@ -32,6 +33,7 @@ import com.android.settings.SettingsApplication;
import com.android.settings.SubSettings;
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.core.FeatureFlags;
import com.android.settings.homepage.SettingsHomepageActivity;
import com.android.settings.overlay.FeatureFactory;
@@ -97,20 +99,26 @@ public class SearchResultTrampoline extends Activity {
if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this)) {
startActivity(intent);
} else if (isSettingsIntelligence(callingActivity)) {
// Register SplitPairRule for SubSettings, set clearTop false to prevent unexpected back
// navigation behavior.
ActivityEmbeddingRulesController.registerSubSettingsPairRule(this,
false /* clearTop */);
if (FeatureFlagUtils.isEnabled(this, FeatureFlags.SETTINGS_SEARCH_ALWAYS_EXPAND)) {
startActivity(SettingsActivity.getTrampolineIntent(intent, highlightMenuKey)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS));
} else {
// Register SplitPairRule for SubSettings, set clearTop false to prevent unexpected
// back navigation behavior.
ActivityEmbeddingRulesController.registerSubSettingsPairRule(this,
false /* clearTop */);
intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
// Pass menu key to homepage
final SettingsHomepageActivity homeActivity =
((SettingsApplication) getApplicationContext()).getHomeActivity();
if (homeActivity != null) {
homeActivity.getMainFragment().setHighlightMenuKey(highlightMenuKey,
/* scrollNeeded= */ true);
// Pass menu key to homepage
final SettingsHomepageActivity homeActivity =
((SettingsApplication) getApplicationContext()).getHomeActivity();
if (homeActivity != null) {
homeActivity.getMainFragment().setHighlightMenuKey(highlightMenuKey,
/* scrollNeeded= */ true);
}
}
} else {
// Two-pane case

View File

@@ -20,9 +20,11 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import android.util.Log;
import com.android.settings.SettingsApplication;
import com.android.settings.core.FeatureFlags;
import com.android.settings.homepage.SettingsHomepageActivity;
/**
@@ -36,6 +38,11 @@ public class SearchStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (FeatureFlagUtils.isEnabled(context, FeatureFlags.SETTINGS_SEARCH_ALWAYS_EXPAND)) {
// Not needed to show/hide the highlight when search is full screen
return;
}
if (intent == null) {
Log.w(TAG, "Null intent");
return;

View File

@@ -26,7 +26,7 @@ import com.android.settings.biometrics.face.FaceProfileStatusPreferenceControlle
import com.android.settings.biometrics.fingerprint.FingerprintProfileStatusPreferenceController;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.security.trustagent.TrustAgentListPreferenceController;
import com.android.settings.widget.PreferenceCategoryController;
@@ -60,11 +60,14 @@ public class SecurityAdvancedSettings extends DashboardFragment {
@Override
public String getCategoryKey() {
if (SafetyCenterStatus.isEnabled()) {
final Context context = getContext();
if (context == null) {
return CATEGORY_SECURITY_LEGACY_ADVANCED_SETTINGS;
} else if (SafetyCenterStatusHolder.get().isEnabled(context)) {
return CategoryKey.CATEGORY_SECURITY_ADVANCED_SETTINGS;
} else {
final SecuritySettingsFeatureProvider securitySettingsFeatureProvider =
FeatureFactory.getFactory(getContext())
FeatureFactory.getFactory(context)
.getSecuritySettingsFeatureProvider();
if (securitySettingsFeatureProvider.hasAlternativeSecuritySettingsFragment()) {

View File

@@ -25,7 +25,7 @@ import com.android.settings.biometrics.face.FaceStatusPreferenceController;
import com.android.settings.biometrics.fingerprint.FingerprintStatusPreferenceController;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.security.trustagent.TrustAgentListPreferenceController;
import com.android.settings.widget.PreferenceCategoryController;
@@ -129,7 +129,7 @@ public class SecuritySettings extends DashboardFragment {
protected boolean isPageSearchEnabled(Context context) {
return !FeatureFactory.getFactory(context).getSecuritySettingsFeatureProvider()
.hasAlternativeSecuritySettingsFragment()
&& !SafetyCenterStatus.isEnabled();
&& !SafetyCenterStatusHolder.get().isEnabled(context);
}
};
}

View File

@@ -24,7 +24,7 @@ import androidx.preference.Preference;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
public class TopLevelSecurityEntryPreferenceController extends BasePreferenceController {
@@ -38,7 +38,7 @@ public class TopLevelSecurityEntryPreferenceController extends BasePreferenceCon
@Override
public int getAvailabilityStatus() {
if (!SafetyCenterStatus.isEnabled()) {
if (!SafetyCenterStatusHolder.get().isEnabled(mContext)) {
return AVAILABLE;
}
return CONDITIONALLY_UNAVAILABLE;

View File

@@ -414,6 +414,9 @@ public class AddAppNetworksFragment extends InstrumentedFragment implements
}
private void updateSingleNetworkSignalIcon(int level) {
if (level == WifiEntry.WIFI_LEVEL_UNREACHABLE) {
return;
}
// TODO: Check level of the network to show signal icon.
final Drawable wifiIcon = mActivity.getDrawable(
Utils.getWifiIconResource(level)).mutate();

View File

@@ -0,0 +1,63 @@
/*
* Copyright (C) 2022 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.accessibility;
import static com.google.common.truth.Truth.assertThat;
import android.content.ComponentName;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link AccessibilityQuickSettingUtils}. */
@RunWith(RobolectricTestRunner.class)
public final class AccessibilityQuickSettingUtilsTest {
private static final String DUMMY_PACKAGE_NAME = "com.mock.example";
private static final String DUMMY_CLASS_NAME = DUMMY_PACKAGE_NAME + ".mock_a11y_service";
private static final String DUMMY_CLASS_NAME2 = DUMMY_PACKAGE_NAME + ".mock_a11y_service2";
private static final ComponentName DUMMY_COMPONENT_NAME = new ComponentName(DUMMY_PACKAGE_NAME,
DUMMY_CLASS_NAME);
private static final ComponentName DUMMY_COMPONENT_NAME2 = new ComponentName(DUMMY_PACKAGE_NAME,
DUMMY_CLASS_NAME2);
private final Context mContext = ApplicationProvider.getApplicationContext();
@Test
public void optInValueToSharedPreferences_optInValue_haveMatchString() {
AccessibilityQuickSettingUtils.optInValueToSharedPreferences(mContext,
DUMMY_COMPONENT_NAME);
assertThat(AccessibilityQuickSettingUtils.hasValueInSharedPreferences(mContext,
DUMMY_COMPONENT_NAME)).isTrue();
}
@Test
public void optInValueToSharedPreferences_optInTwoValues_haveMatchString() {
AccessibilityQuickSettingUtils.optInValueToSharedPreferences(mContext,
DUMMY_COMPONENT_NAME);
AccessibilityQuickSettingUtils.optInValueToSharedPreferences(mContext,
DUMMY_COMPONENT_NAME2);
assertThat(AccessibilityQuickSettingUtils.hasValueInSharedPreferences(mContext,
DUMMY_COMPONENT_NAME)).isTrue();
assertThat(AccessibilityQuickSettingUtils.hasValueInSharedPreferences(mContext,
DUMMY_COMPONENT_NAME2)).isTrue();
}
}

View File

@@ -29,6 +29,7 @@ import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.dream.DreamBackend;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -38,6 +39,7 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
@Ignore
public class WhenToDreamPickerTest {
private WhenToDreamPicker mPicker;

View File

@@ -28,6 +28,7 @@ import com.android.settingslib.dream.DreamBackend;
import com.android.settingslib.dream.DreamBackend.WhenToDream;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -37,6 +38,7 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
@Ignore
public class WhenToDreamPreferenceControllerTest {
private WhenToDreamPreferenceController mController;

View File

@@ -53,7 +53,6 @@ import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -202,7 +201,6 @@ public final class BatteryBackupHelperTest {
}
@Test
@Ignore
public void backupOptimizationMode_backupOptimizationMode() throws Exception {
final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3);
@@ -215,7 +213,6 @@ public final class BatteryBackupHelperTest {
}
@Test
@Ignore
public void backupOptimizationMode_backupOptimizationModeAndIgnoreSystemApp()
throws Exception {
final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
@@ -232,7 +229,6 @@ public final class BatteryBackupHelperTest {
}
@Test
@Ignore
public void backupOptimizationMode_backupOptimizationModeAndIgnoreDefaultApp()
throws Exception {
final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
@@ -387,6 +383,8 @@ public final class BatteryBackupHelperTest {
AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
applicationInfo2.uid,
applicationInfo2.packageName);
mBatteryBackupHelper.mTestApplicationInfoList =
Arrays.asList(applicationInfo1, applicationInfo2, applicationInfo3);
}
@Implements(UserHandle.class)

View File

@@ -1,179 +0,0 @@
/*
* Copyright (C) 2018 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.fuelgauge;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import android.content.Context;
import android.text.format.DateUtils;
import android.util.SparseLongArray;
import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
import com.android.settings.testutils.DatabaseTestUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
@Ignore
public class BatteryDatabaseManagerTest {
private static String PACKAGE_NAME_NEW = "com.android.app1";
private static int UID_NEW = 345;
private static int TYPE_NEW = 1;
private static String PACKAGE_NAME_OLD = "com.android.app2";
private static int UID_OLD = 543;
private static int TYPE_OLD = 2;
private static long NOW = System.currentTimeMillis();
private static long ONE_DAY_BEFORE = NOW - DateUtils.DAY_IN_MILLIS;
private static long TWO_DAYS_BEFORE = NOW - 2 * DateUtils.DAY_IN_MILLIS;
private Context mContext;
private BatteryDatabaseManager mBatteryDatabaseManager;
private AppInfo mNewAppInfo;
private AppInfo mOldAppInfo;
private AppInfo mCombinedAppInfo;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mBatteryDatabaseManager = spy(BatteryDatabaseManager.getInstance(mContext));
mNewAppInfo = new AppInfo.Builder()
.setUid(UID_NEW)
.setPackageName(PACKAGE_NAME_NEW)
.addAnomalyType(TYPE_NEW)
.build();
mOldAppInfo = new AppInfo.Builder()
.setUid(UID_OLD)
.setPackageName(PACKAGE_NAME_OLD)
.addAnomalyType(TYPE_OLD)
.build();
mCombinedAppInfo = new AppInfo.Builder()
.setUid(UID_NEW)
.setPackageName(PACKAGE_NAME_NEW)
.addAnomalyType(TYPE_NEW)
.addAnomalyType(TYPE_OLD)
.build();
}
@After
public void cleanUp() {
DatabaseTestUtils.clearDb(mContext);
}
@Test
public void allAnomalyFunctions() {
mBatteryDatabaseManager.insertAnomaly(UID_NEW, PACKAGE_NAME_NEW, TYPE_NEW,
AnomalyDatabaseHelper.State.NEW, NOW);
mBatteryDatabaseManager.insertAnomaly(UID_OLD, PACKAGE_NAME_OLD, TYPE_OLD,
AnomalyDatabaseHelper.State.NEW, TWO_DAYS_BEFORE);
// In database, it contains two record
List<AppInfo> totalAppInfos = mBatteryDatabaseManager.queryAllAnomalies(0 /* timeMsAfter */,
AnomalyDatabaseHelper.State.NEW);
assertThat(totalAppInfos).containsExactly(mNewAppInfo, mOldAppInfo);
// Only one record shows up if we query by timestamp
List<AppInfo> appInfos = mBatteryDatabaseManager.queryAllAnomalies(ONE_DAY_BEFORE,
AnomalyDatabaseHelper.State.NEW);
assertThat(appInfos).containsExactly(mNewAppInfo);
mBatteryDatabaseManager.deleteAllAnomaliesBeforeTimeStamp(ONE_DAY_BEFORE);
// The obsolete record is removed from database
List<AppInfo> appInfos1 = mBatteryDatabaseManager.queryAllAnomalies(0 /* timeMsAfter */,
AnomalyDatabaseHelper.State.NEW);
assertThat(appInfos1).containsExactly(mNewAppInfo);
}
@Test
public void updateAnomalies_updateSuccessfully() {
mBatteryDatabaseManager.insertAnomaly(UID_NEW, PACKAGE_NAME_NEW, TYPE_NEW,
AnomalyDatabaseHelper.State.NEW, NOW);
mBatteryDatabaseManager.insertAnomaly(UID_OLD, PACKAGE_NAME_OLD, TYPE_OLD,
AnomalyDatabaseHelper.State.NEW, NOW);
final AppInfo appInfo = new AppInfo.Builder().setPackageName(PACKAGE_NAME_OLD).build();
final List<AppInfo> updateAppInfos = new ArrayList<>();
updateAppInfos.add(appInfo);
// Change state of PACKAGE_NAME_OLD to handled
mBatteryDatabaseManager.updateAnomalies(updateAppInfos,
AnomalyDatabaseHelper.State.HANDLED);
// The state of PACKAGE_NAME_NEW is still new
List<AppInfo> newAppInfos = mBatteryDatabaseManager.queryAllAnomalies(ONE_DAY_BEFORE,
AnomalyDatabaseHelper.State.NEW);
assertThat(newAppInfos).containsExactly(mNewAppInfo);
// The state of PACKAGE_NAME_OLD is changed to handled
List<AppInfo> handledAppInfos = mBatteryDatabaseManager.queryAllAnomalies(ONE_DAY_BEFORE,
AnomalyDatabaseHelper.State.HANDLED);
assertThat(handledAppInfos).containsExactly(mOldAppInfo);
}
@Test
public void queryAnomalies_removeDuplicateByUid() {
mBatteryDatabaseManager.insertAnomaly(UID_NEW, PACKAGE_NAME_NEW, TYPE_NEW,
AnomalyDatabaseHelper.State.NEW, NOW);
mBatteryDatabaseManager.insertAnomaly(UID_NEW, PACKAGE_NAME_NEW, TYPE_OLD,
AnomalyDatabaseHelper.State.NEW, NOW);
// Only contain one AppInfo with multiple types
List<AppInfo> newAppInfos = mBatteryDatabaseManager.queryAllAnomalies(ONE_DAY_BEFORE,
AnomalyDatabaseHelper.State.NEW);
assertThat(newAppInfos).containsExactly(mCombinedAppInfo);
}
@Test
public void allActionFunctions() {
final long timestamp = System.currentTimeMillis();
mBatteryDatabaseManager.insertAction(AnomalyDatabaseHelper.ActionType.RESTRICTION, UID_OLD,
PACKAGE_NAME_OLD, 0);
mBatteryDatabaseManager.insertAction(AnomalyDatabaseHelper.ActionType.RESTRICTION, UID_OLD,
PACKAGE_NAME_OLD, 1);
mBatteryDatabaseManager.insertAction(AnomalyDatabaseHelper.ActionType.RESTRICTION, UID_NEW,
PACKAGE_NAME_NEW, timestamp);
final SparseLongArray timeArray = mBatteryDatabaseManager.queryActionTime(
AnomalyDatabaseHelper.ActionType.RESTRICTION);
assertThat(timeArray.size()).isEqualTo(2);
assertThat(timeArray.get(UID_OLD)).isEqualTo(1);
assertThat(timeArray.get(UID_NEW)).isEqualTo(timestamp);
mBatteryDatabaseManager.deleteAction(AnomalyDatabaseHelper.ActionType.RESTRICTION, UID_NEW,
PACKAGE_NAME_NEW);
final SparseLongArray recentTimeArray = mBatteryDatabaseManager.queryActionTime(
AnomalyDatabaseHelper.ActionType.RESTRICTION);
assertThat(recentTimeArray.size()).isEqualTo(1);
assertThat(timeArray.get(UID_OLD)).isEqualTo(1);
}
}

View File

@@ -41,7 +41,6 @@ import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowFragment;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -75,12 +74,11 @@ public class ContextualCardsFragmentTest {
}
@Test
@Ignore
public void onStart_shouldRegisterBothReceivers() {
mFragment.onStart();
verify(mActivity).registerReceiver(eq(mFragment.mKeyEventReceiver),
any(IntentFilter.class));
any(IntentFilter.class), eq(Context.RECEIVER_EXPORTED));
verify(mActivity).registerReceiver(eq(mFragment.mScreenOffReceiver),
any(IntentFilter.class));
}

View File

@@ -26,19 +26,25 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import androidx.core.graphics.drawable.IconCompat;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.SliceAction;
import androidx.slice.Slice;
import androidx.slice.SliceProvider;
import androidx.slice.widget.SliceLiveData;
import com.android.settings.R;
import com.android.settings.homepage.contextualcards.ContextualCard;
import com.android.settings.homepage.contextualcards.ContextualCardsFragment;
@@ -46,7 +52,6 @@ import com.android.settings.homepage.contextualcards.ControllerRendererPool;
import com.android.settings.wifi.slice.ContextualWifiSlice;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -56,7 +61,6 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.android.controller.ActivityController;
@RunWith(RobolectricTestRunner.class)
@Ignore
public class SliceContextualCardRendererTest {
private static final Uri TEST_SLICE_URI = Uri.parse("content://test/test");
@@ -287,7 +291,7 @@ public class SliceContextualCardRendererTest {
}
private ContextualCard buildContextualCard(Uri sliceUri) {
final Slice slice = new ContextualWifiSlice(mActivity).getSlice();
final Slice slice = buildSlice();
return new ContextualCard.Builder()
.setName("test_name")
.setCardType(ContextualCard.CardType.SLICE)
@@ -296,4 +300,23 @@ public class SliceContextualCardRendererTest {
.setSlice(slice)
.build();
}
private Slice buildSlice() {
final String title = "test_title";
final IconCompat icon = IconCompat.createWithResource(mActivity, R.drawable.empty_icon);
final PendingIntent pendingIntent = PendingIntent.getActivity(
mActivity,
title.hashCode() /* requestCode */,
new Intent("test action"),
PendingIntent.FLAG_IMMUTABLE);
final SliceAction action
= SliceAction.createDeeplink(pendingIntent, icon, ListBuilder.SMALL_IMAGE, title);
return new ListBuilder(mActivity, TEST_SLICE_URI, ListBuilder.INFINITY)
.addRow(new ListBuilder.RowBuilder()
.addEndItem(icon, ListBuilder.ICON_IMAGE)
.setTitle(title)
.setPrimaryAction(action))
.addAction(SliceAction.createToggle(pendingIntent, null /* actionTitle */, true))
.build();
}
}

View File

@@ -19,7 +19,11 @@ package com.android.settings.wifi;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -34,7 +38,6 @@ import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
import com.android.settingslib.wifi.WifiStatusTracker;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -54,15 +57,18 @@ public class WifiSummaryUpdaterTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application.getApplicationContext());
doReturn(mock(Intent.class)).when(mContext).registerReceiver(any(), any(), anyInt());
doNothing().when(mContext).unregisterReceiver(any(BroadcastReceiver.class));
mSummaryUpdater = new WifiSummaryUpdater(mContext, mListener, mWifiTracker);
}
@Test
@Ignore
public void register_true_shouldRegisterListenerAndTracker() {
mSummaryUpdater.register(true);
verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class),
anyInt());
verify(mWifiTracker).setListening(true);
}
@@ -75,7 +81,6 @@ public class WifiSummaryUpdaterTest {
}
@Test
@Ignore
public void register_false_shouldUnregisterListenerAndTracker() {
mSummaryUpdater.register(true);
mSummaryUpdater.register(false);

View File

@@ -49,7 +49,6 @@ import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
import com.android.settingslib.core.AbstractPreferenceController;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -68,7 +67,7 @@ public class WifiP2pSettingsTest {
private Context mContext;
private FragmentActivity mActivity;
private WifiP2pSettings mFragment;
private TestWifiP2pSettings mFragment;
@Mock
public WifiP2pManager mWifiP2pManager;
@@ -86,8 +85,10 @@ public class WifiP2pSettingsTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
TestWifiP2pSettings.sMockWifiP2pManager = mWifiP2pManager;
mActivity = Robolectric.setupActivity(FragmentActivity.class);
mFragment = new WifiP2pSettings();
mFragment = new TestWifiP2pSettings();
mFragment.mWifiP2pManager = mWifiP2pManager;
doReturn(mChannel).when(mWifiP2pManager).initialize(any(), any(), any());
FragmentManager fragmentManager = mActivity.getSupportFragmentManager();
@@ -504,7 +505,6 @@ public class WifiP2pSettingsTest {
}
@Test
@Ignore
public void onActivityCreate_withNullP2pManager_shouldGetP2pManagerAgain() {
mFragment.mChannel = null; // Reset channel to re-test onActivityCreated flow
mFragment.mWifiP2pManager = null;
@@ -542,4 +542,13 @@ public class WifiP2pSettingsTest {
wifiP2pDevice.deviceName = "testName";
mWifiP2pPeer.device = wifiP2pDevice;
}
public static class TestWifiP2pSettings extends WifiP2pSettings {
static WifiP2pManager sMockWifiP2pManager;
@Override
protected Object getSystemService(final String name) {
if (Context.WIFI_P2P_SERVICE.equals(name)) return sMockWifiP2pManager;
return getActivity().getSystemService(name);
}
}
}

View File

@@ -23,34 +23,39 @@ import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent;
import android.provider.DeviceConfig;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.settings.Settings;
import com.android.settings.SettingsActivity;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
public class PrivacyDashboardActivityTest {
private static final String DEFAULT_FRAGMENT_CLASSNAME = "DefaultFragmentClassname";
@Mock
private SafetyCenterStatusHolder mSafetyCenterStatusHolder;
private Settings.PrivacyDashboardActivity mActivity;
@Before
public void setUp() {
DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
SafetyCenterStatusHolder.sInstance = mSafetyCenterStatusHolder;
final Intent intent = new Intent();
intent.setAction(android.provider.Settings.ACTION_PRIVACY_SETTINGS);
intent.setClass(InstrumentationRegistry.getInstrumentation().getTargetContext(),
@@ -71,19 +76,9 @@ public class PrivacyDashboardActivityTest {
doNothing().when(mActivity).startActivity(any(Intent.class));
}
@After
public void tearDown() {
DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
}
@Test
public void onCreate_whenSafetyCenterEnabled_redirectsToSafetyCenter() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(true),
/* makeDefault = */ false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(true);
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
mActivity.handleSafetyCenterRedirection();
@@ -94,12 +89,7 @@ public class PrivacyDashboardActivityTest {
@Test
public void onCreate_whenSafetyCenterDisabled_doesntRedirectToSafetyCenter() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(false),
/* makeDefault = */ false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(false);
mActivity.handleSafetyCenterRedirection();
verify(mActivity, times(0)).startActivity(any());

View File

@@ -18,20 +18,22 @@ package com.android.settings.privacy;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.provider.DeviceConfig;
import android.provider.Settings;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
import com.android.settings.security.TopLevelSecurityEntryPreferenceController;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
public class TopLevelPrivacyEntryPreferenceControllerTest {
@@ -41,30 +43,21 @@ public class TopLevelPrivacyEntryPreferenceControllerTest {
private TopLevelPrivacyEntryPreferenceController mTopLevelPrivacyEntryPreferenceController;
@Mock
private Context mContext;
private SafetyCenterStatusHolder mSafetyCenterStatusHolder;
@Before
public void setUp() {
DeviceConfig.resetToDefaults(Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
MockitoAnnotations.initMocks(this);
SafetyCenterStatusHolder.sInstance = mSafetyCenterStatusHolder;
mTopLevelPrivacyEntryPreferenceController =
new TopLevelPrivacyEntryPreferenceController(mContext, PREFERENCE_KEY);
}
@After
public void tearDown() {
DeviceConfig.resetToDefaults(Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
new TopLevelPrivacyEntryPreferenceController(
ApplicationProvider.getApplicationContext(), PREFERENCE_KEY);
}
@Test
public void getAvailabilityStatus_whenSafetyCenterEnabled_returnsUnavailable() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(true),
/* makeDefault = */ false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(true);
assertThat(mTopLevelPrivacyEntryPreferenceController.getAvailabilityStatus())
.isEqualTo(TopLevelSecurityEntryPreferenceController.CONDITIONALLY_UNAVAILABLE);
@@ -72,11 +65,7 @@ public class TopLevelPrivacyEntryPreferenceControllerTest {
@Test
public void getAvailabilityStatus_whenSafetyCenterDisabled_returnsAvailable() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(false),
/* makeDefault = */ false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(false);
assertThat(mTopLevelPrivacyEntryPreferenceController.getAvailabilityStatus())
.isEqualTo(TopLevelSecurityEntryPreferenceController.AVAILABLE);

View File

@@ -0,0 +1,56 @@
/*
* Copyright (C) 2022 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.safetycenter;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.safetycenter.SafetyCenterManager;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
public class SafetyCenterStatusHolderTest {
@Mock
private Context mContext;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void isEnabled_whenContextNull_returnsFalse() {
assertThat(SafetyCenterStatusHolder.get().isEnabled(null)).isFalse();
}
@Test
public void isEnabled_whenSystemServiceNull_returnsFalse() {
when(mContext.getSystemService(SafetyCenterManager.class)).thenReturn(null);
assertThat(SafetyCenterStatusHolder.get().isEnabled(mContext)).isFalse();
}
}

View File

@@ -1,67 +0,0 @@
/*
* 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.safetycenter;
import static com.google.common.truth.Truth.assertThat;
import android.provider.DeviceConfig;
import android.provider.Settings;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class SafetyCenterStatusTest {
@Before
public void setUp() {
DeviceConfig.resetToDefaults(Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
}
@After
public void tearDown() {
DeviceConfig.resetToDefaults(Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
}
@Test
public void isEnabled_whenFlagTrue_returnsTrue() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(true),
/* makeDefault = */ false);
assertThat(SafetyCenterStatus.isEnabled()).isTrue();
}
@Test
public void isEnabled_whenFlagFalse_returnsFalse() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(false),
/* makeDefault = */ false);
assertThat(SafetyCenterStatus.isEnabled()).isFalse();
}
}

View File

@@ -22,18 +22,16 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.provider.DeviceConfig;
import android.provider.Settings;
import androidx.preference.Preference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -50,12 +48,16 @@ public class TopLevelSafetyCenterEntryPreferenceControllerTest {
mTopLevelSafetyCenterEntryPreferenceController;
private Preference mPreference;
@Mock
private SafetyCenterStatusHolder mSafetyCenterStatusHolder;
@Mock
private Context mContext;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
SafetyCenterStatusHolder.sInstance = mSafetyCenterStatusHolder;
mPreference = new Preference(ApplicationProvider.getApplicationContext());
mPreference.setKey(PREFERENCE_KEY);
@@ -63,14 +65,6 @@ public class TopLevelSafetyCenterEntryPreferenceControllerTest {
doNothing().when(mContext).startActivity(any(Intent.class));
mTopLevelSafetyCenterEntryPreferenceController =
new TopLevelSafetyCenterEntryPreferenceController(mContext, PREFERENCE_KEY);
DeviceConfig.resetToDefaults(Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
}
@After
public void tearDown() {
DeviceConfig.resetToDefaults(Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
}
@Test
@@ -110,11 +104,7 @@ public class TopLevelSafetyCenterEntryPreferenceControllerTest {
@Test
public void getAvailabilityStatus_whenSafetyCenterDisabled_returnsUnavailable() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(false),
/* makeDefault = */ false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(false);
assertThat(mTopLevelSafetyCenterEntryPreferenceController.getAvailabilityStatus())
.isEqualTo(TopLevelSafetyCenterEntryPreferenceController.CONDITIONALLY_UNAVAILABLE);
@@ -122,11 +112,7 @@ public class TopLevelSafetyCenterEntryPreferenceControllerTest {
@Test
public void getAvailabilityStatus_whenSafetyCenterEnabled_returnsAvailable() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(true),
/* makeDefault = */ false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(true);
assertThat(mTopLevelSafetyCenterEntryPreferenceController.getAvailabilityStatus())
.isEqualTo(TopLevelSafetyCenterEntryPreferenceController.AVAILABLE);

View File

@@ -18,17 +18,18 @@ package com.android.settings.security;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.Looper;
import android.provider.DeviceConfig;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.ResourcesUtils;
import com.android.settingslib.drawer.CategoryKey;
@@ -36,6 +37,8 @@ import com.android.settingslib.drawer.CategoryKey;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
public class SecurityAdvancedSettingsTest {
@@ -47,16 +50,22 @@ public class SecurityAdvancedSettingsTest {
private Context mContext;
private SecurityAdvancedSettings mSecurityAdvancedSettings;
@Mock
private SafetyCenterStatusHolder mSafetyCenterStatusHolder;
@Before
@UiThreadTest
public void setUp() {
MockitoAnnotations.initMocks(this);
if (Looper.myLooper() == null) {
Looper.prepare();
}
SafetyCenterStatusHolder.sInstance = mSafetyCenterStatusHolder;
mContext = ApplicationProvider.getApplicationContext();
mSecurityAdvancedSettings = new SecurityAdvancedSettings();
mSecurityAdvancedSettings = spy(new SecurityAdvancedSettings());
when(mSecurityAdvancedSettings.getContext()).thenReturn(mContext);
}
@Test
@@ -67,7 +76,7 @@ public class SecurityAdvancedSettingsTest {
@Test
public void getCategoryKey_whenSafetyCenterIsEnabled_returnsSecurity() {
setSafetyCenterEnabled(true);
when(mSafetyCenterStatusHolder.isEnabled(any())).thenReturn(true);
assertThat(mSecurityAdvancedSettings.getCategoryKey())
.isEqualTo(CategoryKey.CATEGORY_SECURITY_ADVANCED_SETTINGS);
@@ -75,7 +84,7 @@ public class SecurityAdvancedSettingsTest {
@Test
public void getCategoryKey_whenAlternativeFragmentPresented_returnsAlternative() {
setSafetyCenterEnabled(false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(false);
setupAlternativeFragment(true, ALTERNATIVE_CATEGORY_KEY);
assertThat(mSecurityAdvancedSettings.getCategoryKey())
@@ -84,7 +93,7 @@ public class SecurityAdvancedSettingsTest {
@Test
public void getCategoryKey_whenNoAlternativeFragmentPresented_returnsLegacy() {
setSafetyCenterEnabled(false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(false);
setupAlternativeFragment(false, null);
assertThat(mSecurityAdvancedSettings.getCategoryKey())
@@ -95,14 +104,6 @@ public class SecurityAdvancedSettingsTest {
return ResourcesUtils.getResourcesId(mContext, "xml", resName);
}
private void setSafetyCenterEnabled(boolean isEnabled) {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(isEnabled),
/* makeDefault = */ false);
}
private void setupAlternativeFragment(boolean hasAlternativeFragment,
String alternativeCategoryKey) {
final FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest();

View File

@@ -25,22 +25,22 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent;
import android.provider.DeviceConfig;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.settings.Settings;
import com.android.settings.SettingsActivity;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
@@ -52,13 +52,16 @@ public class SecurityDashboardActivityTest {
private Settings.SecurityDashboardActivity mActivity;
private Intent mDefaultIntent;
@Mock
private SafetyCenterStatusHolder mSafetyCenterStatusHolder;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
FakeFeatureFactory mFeatureFactory = FakeFeatureFactory.setupForTest();
mSecuritySettingsFeatureProvider = mFeatureFactory.getSecuritySettingsFeatureProvider();
DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
SafetyCenterStatusHolder.sInstance = mSafetyCenterStatusHolder;
mDefaultIntent = new Intent();
mDefaultIntent.setAction(android.provider.Settings.ACTION_SECURITY_SETTINGS);
mDefaultIntent.setClass(InstrumentationRegistry.getInstrumentation().getTargetContext(),
@@ -79,12 +82,6 @@ public class SecurityDashboardActivityTest {
doNothing().when(mActivity).startActivity(any(Intent.class));
}
@After
public void tearDown() {
DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
}
@Test
public void noAvailableAlternativeFragmentAvailable_defaultFragmentSet() {
when(mSecuritySettingsFeatureProvider.hasAlternativeSecuritySettingsFragment())
@@ -125,11 +122,7 @@ public class SecurityDashboardActivityTest {
@Test
public void onCreate_whenSafetyCenterEnabled_redirectsToSafetyCenter() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(true),
/* makeDefault = */ false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(true);
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
mActivity.handleSafetyCenterRedirection();
@@ -140,11 +133,7 @@ public class SecurityDashboardActivityTest {
@Test
public void onCreate_whenSafetyCenterDisabled_doesntRedirectToSafetyCenter() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(false),
/* makeDefault = */ false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(false);
mActivity.handleSafetyCenterRedirection();

View File

@@ -25,18 +25,15 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent;
import android.provider.DeviceConfig;
import android.provider.Settings;
import androidx.preference.Preference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.SettingsActivity;
import com.android.settings.safetycenter.SafetyCenterStatus;
import com.android.settings.safetycenter.SafetyCenterStatusHolder;
import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -57,15 +54,15 @@ public class TopLevelSecurityEntryPreferenceControllerTest {
@Mock
private Context mContext;
@Mock
private SafetyCenterStatusHolder mSafetyCenterStatusHolder;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mFeatureFactory = FakeFeatureFactory.setupForTest();
mSecuritySettingsFeatureProvider = mFeatureFactory.getSecuritySettingsFeatureProvider();
DeviceConfig.resetToDefaults(Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
SafetyCenterStatusHolder.sInstance = mSafetyCenterStatusHolder;
mPreference = new Preference(ApplicationProvider.getApplicationContext());
mPreference.setKey(PREFERENCE_KEY);
@@ -75,12 +72,6 @@ public class TopLevelSecurityEntryPreferenceControllerTest {
new TopLevelSecurityEntryPreferenceController(mContext, PREFERENCE_KEY);
}
@After
public void tearDown() {
DeviceConfig.resetToDefaults(Settings.RESET_MODE_PACKAGE_DEFAULTS,
DeviceConfig.NAMESPACE_PRIVACY);
}
@Test
public void handlePreferenceTreeClick_forDifferentPreferenceKey_isNotHandled() {
Preference preference = new Preference(ApplicationProvider.getApplicationContext());
@@ -137,11 +128,7 @@ public class TopLevelSecurityEntryPreferenceControllerTest {
@Test
public void getAvailabilityStatus_whenSafetyCenterEnabled_returnsUnavailable() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(true),
/* makeDefault = */ false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(true);
assertThat(mTopLevelSecurityEntryPreferenceController.getAvailabilityStatus())
.isEqualTo(TopLevelSecurityEntryPreferenceController.CONDITIONALLY_UNAVAILABLE);
@@ -149,11 +136,7 @@ public class TopLevelSecurityEntryPreferenceControllerTest {
@Test
public void getAvailabilityStatus_whenSafetyCenterDisabled_returnsAvailable() {
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_PRIVACY,
SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
/* value = */ Boolean.toString(false),
/* makeDefault = */ false);
when(mSafetyCenterStatusHolder.isEnabled(any(Context.class))).thenReturn(false);
assertThat(mTopLevelSecurityEntryPreferenceController.getAvailabilityStatus())
.isEqualTo(TopLevelSecurityEntryPreferenceController.AVAILABLE);