Merge "Always check roles for non-blockability"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8e3378a..9c6b97a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1423,7 +1423,8 @@
<activity
android:name=".datausage.AppDataUsageActivity"
android:exported="true"
- android:noHistory="true">
+ android:noHistory="true"
+ android:permission="android.permission.QUERY_ALL_PACKAGES">
<intent-filter android:priority="1">
<action android:name="android.settings.IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1493,6 +1494,7 @@
<activity-alias android:name=".applications.InstalledAppDetails"
android:label="@string/application_info_label"
android:exported="true"
+ android:permission="android.permission.QUERY_ALL_PACKAGES"
android:targetActivity=".applications.InstalledAppDetailsTop">
<intent-filter android:priority="1">
<action android:name="android.settings.APPLICATION_DETAILS_SETTINGS" />
@@ -1504,7 +1506,8 @@
<activity android:name=".applications.InstalledAppOpenByDefaultActivity"
android:label="@string/application_info_label"
- android:exported="true">
+ android:exported="true"
+ android:permission="android.permission.QUERY_ALL_PACKAGES">
<intent-filter android:priority="1">
<action android:name="android.settings.APP_OPEN_BY_DEFAULT_SETTINGS" />
<!-- Also catch legacy "com." prefixed action. -->
@@ -1861,7 +1864,8 @@
<activity
android:name="Settings$AppUsageAccessSettingsActivity"
android:exported="true"
- android:label="@string/usage_access_title">
+ android:label="@string/usage_access_title"
+ android:permission="android.permission.QUERY_ALL_PACKAGES">
<intent-filter>
<action android:name="android.settings.USAGE_ACCESS_SETTINGS"/>
<category android:name="android.intent.category.DEFAULT"/>
diff --git a/res/layout/screen_zoom_preview_2.xml b/res/layout/screen_zoom_preview_2.xml
index 2cfd9b7..d8ce346 100644
--- a/res/layout/screen_zoom_preview_2.xml
+++ b/res/layout/screen_zoom_preview_2.xml
@@ -20,4 +20,5 @@
android:padding="32dp"
android:numColumns="3"
android:gravity="center"
+ android:nestedScrollingEnabled="true"
android:importantForAccessibility="noHideDescendants" />
diff --git a/res/layout/storage_internal_format.xml b/res/layout/storage_internal_format.xml
index 08434b0..0b49d7e 100644
--- a/res/layout/storage_internal_format.xml
+++ b/res/layout/storage_internal_format.xml
@@ -20,7 +20,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
- <ScrollView
+ <androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
@@ -35,7 +35,7 @@
android:lineSpacingExtra="@dimen/sud_description_line_spacing_extra"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
android:textColor="?android:attr/textColorPrimary" />
- </ScrollView>
+ </androidx.core.widget.NestedScrollView>
<FrameLayout
android:layout_width="match_parent"
diff --git a/res/xml/accessibility_text_reading_options.xml b/res/xml/accessibility_text_reading_options.xml
index ced5e79..4bc9317 100644
--- a/res/xml/accessibility_text_reading_options.xml
+++ b/res/xml/accessibility_text_reading_options.xml
@@ -17,6 +17,20 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
android:persistent="false"
android:title="@string/accessibility_text_reading_options_title">
+
+ <SwitchPreference
+ android:key="toggle_force_bold_text"
+ android:persistent="false"
+ android:title="@string/force_bold_text"
+ settings:keywords="@string/keywords_bold_text"
+ settings:controller="com.android.settings.accessibility.FontWeightAdjustmentPreferenceController"/>
+
+ <SwitchPreference
+ android:key="toggle_high_text_contrast_preference"
+ android:persistent="false"
+ android:title="@string/accessibility_toggle_high_text_contrast_preference_title"
+ settings:controller="com.android.settings.accessibility.HighTextContrastPreferenceController"/>
</PreferenceScreen>
diff --git a/src/com/android/settings/SettingsDumpService.java b/src/com/android/settings/SettingsDumpService.java
index 7e37e32..38987f5 100644
--- a/src/com/android/settings/SettingsDumpService.java
+++ b/src/com/android/settings/SettingsDumpService.java
@@ -35,6 +35,7 @@
import androidx.annotation.VisibleForTesting;
import com.android.settings.applications.ProcStatsData;
+import com.android.settings.datausage.lib.DataUsageLib;
import com.android.settings.fuelgauge.batterytip.AnomalyConfigJobService;
import com.android.settingslib.net.DataUsageController;
@@ -109,14 +110,8 @@
if (telephonyManager.isDataCapable()) {
JSONArray array = new JSONArray();
for (SubscriptionInfo info : manager.getAvailableSubscriptionInfoList()) {
- telephonyManager = telephonyManager
- .createForSubscriptionId(info.getSubscriptionId());
- String subscriberId = telephonyManager.getSubscriberId();
- // The null subscriberId means that no any mobile/carrier network will be matched.
- // Using old API: buildTemplateMobileAll for the null subscriberId to avoid NPE.
- NetworkTemplate template = subscriberId != null
- ? NetworkTemplate.buildTemplateCarrierMetered(subscriberId)
- : NetworkTemplate.buildTemplateMobileAll(subscriberId);
+ NetworkTemplate template = DataUsageLib.getMobileTemplateForSubId(
+ telephonyManager, info.getSubscriptionId());
final JSONObject usage = dumpDataUsage(template, controller);
usage.put("subId", info.getSubscriptionId());
array.put(usage);
@@ -125,12 +120,12 @@
}
if (packageManager.hasSystemFeature(FEATURE_WIFI)) {
obj.put("wifi", dumpDataUsage(
- NetworkTemplate.buildTemplateWifi(
- NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */), controller));
+ new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build(), controller));
}
if (packageManager.hasSystemFeature(FEATURE_ETHERNET)) {
- obj.put("ethernet", dumpDataUsage(NetworkTemplate.buildTemplateEthernet(), controller));
+ obj.put("ethernet", dumpDataUsage(new NetworkTemplate.Builder(
+ NetworkTemplate.MATCH_ETHERNET).build(), controller));
}
return obj;
}
diff --git a/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java b/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java
index a2142a2..f3e9b83 100644
--- a/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java
+++ b/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java
@@ -17,6 +17,7 @@
package com.android.settings.accessibility;
import android.content.Context;
+import android.os.VibrationAttributes;
import android.provider.Settings;
import androidx.annotation.VisibleForTesting;
@@ -39,7 +40,7 @@
@Override
protected int getDefaultIntensity() {
- return mVibrator.getDefaultHapticFeedbackIntensity();
+ return mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_TOUCH);
}
}
diff --git a/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java b/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java
index 4ace4c6..eb396ac 100644
--- a/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java
+++ b/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java
@@ -17,6 +17,7 @@
package com.android.settings.accessibility;
import android.content.Context;
+import android.os.VibrationAttributes;
import android.provider.Settings;
import androidx.annotation.VisibleForTesting;
@@ -38,6 +39,6 @@
@Override
protected int getDefaultIntensity() {
- return mVibrator.getDefaultNotificationVibrationIntensity();
+ return mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_NOTIFICATION);
}
}
diff --git a/src/com/android/settings/accessibility/NotificationVibrationPreferenceFragment.java b/src/com/android/settings/accessibility/NotificationVibrationPreferenceFragment.java
index 3ca197f..e1d9d47 100644
--- a/src/com/android/settings/accessibility/NotificationVibrationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/NotificationVibrationPreferenceFragment.java
@@ -17,6 +17,7 @@
import android.app.settings.SettingsEnums;
import android.media.AudioAttributes;
+import android.os.VibrationAttributes;
import android.os.Vibrator;
import android.provider.Settings;
@@ -57,6 +58,6 @@
@Override
protected int getDefaultVibrationIntensity() {
Vibrator vibrator = getContext().getSystemService(Vibrator.class);
- return vibrator.getDefaultNotificationVibrationIntensity();
+ return vibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_NOTIFICATION);
}
}
diff --git a/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceController.java b/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceController.java
index 4dee348..75cbefb 100644
--- a/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceController.java
+++ b/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceController.java
@@ -17,6 +17,7 @@
package com.android.settings.accessibility;
import android.content.Context;
+import android.os.VibrationAttributes;
import android.provider.Settings;
import androidx.annotation.VisibleForTesting;
@@ -39,6 +40,6 @@
@Override
protected int getDefaultIntensity() {
- return mVibrator.getDefaultRingVibrationIntensity();
+ return mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_RINGTONE);
}
}
diff --git a/src/com/android/settings/accessibility/RingVibrationPreferenceFragment.java b/src/com/android/settings/accessibility/RingVibrationPreferenceFragment.java
index 5d19a9b..aa3e313 100644
--- a/src/com/android/settings/accessibility/RingVibrationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/RingVibrationPreferenceFragment.java
@@ -17,6 +17,7 @@
import android.app.settings.SettingsEnums;
import android.media.AudioAttributes;
+import android.os.VibrationAttributes;
import android.os.Vibrator;
import android.provider.Settings;
@@ -61,6 +62,6 @@
@Override
protected int getDefaultVibrationIntensity() {
Vibrator vibrator = getContext().getSystemService(Vibrator.class);
- return vibrator.getDefaultRingVibrationIntensity();
+ return vibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_RINGTONE);
}
}
diff --git a/src/com/android/settings/accessibility/TouchVibrationPreferenceFragment.java b/src/com/android/settings/accessibility/TouchVibrationPreferenceFragment.java
index f6bbbf3..b1bd847 100644
--- a/src/com/android/settings/accessibility/TouchVibrationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/TouchVibrationPreferenceFragment.java
@@ -17,6 +17,7 @@
import android.app.settings.SettingsEnums;
import android.media.AudioAttributes;
+import android.os.VibrationAttributes;
import android.os.Vibrator;
import android.provider.Settings;
@@ -52,7 +53,7 @@
@Override
protected int getDefaultVibrationIntensity() {
Vibrator vibrator = getContext().getSystemService(Vibrator.class);
- return vibrator.getDefaultHapticFeedbackIntensity();
+ return vibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_TOUCH);
}
@Override
diff --git a/src/com/android/settings/accessibility/VibrationPreferenceController.java b/src/com/android/settings/accessibility/VibrationPreferenceController.java
index 8bfea34..b36106d 100644
--- a/src/com/android/settings/accessibility/VibrationPreferenceController.java
+++ b/src/com/android/settings/accessibility/VibrationPreferenceController.java
@@ -17,6 +17,7 @@
package com.android.settings.accessibility;
import android.content.Context;
+import android.os.VibrationAttributes;
import android.os.Vibrator;
import android.provider.Settings;
@@ -41,7 +42,7 @@
public CharSequence getSummary() {
int ringIntensity = Settings.System.getInt(mContext.getContentResolver(),
Settings.System.RING_VIBRATION_INTENSITY,
- mVibrator.getDefaultRingVibrationIntensity());
+ mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_RINGTONE));
if (Settings.System.getInt(mContext.getContentResolver(),
Settings.System.VIBRATE_WHEN_RINGING, 0) == 0
&& !AccessibilitySettings.isRampingRingerEnabled(mContext)) {
@@ -52,14 +53,14 @@
final int notificationIntensity = Settings.System.getInt(mContext.getContentResolver(),
Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- mVibrator.getDefaultNotificationVibrationIntensity());
+ mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_NOTIFICATION));
final CharSequence notificationIntensityString =
VibrationIntensityPreferenceController.getIntensityString(mContext,
notificationIntensity);
int touchIntensity = Settings.System.getInt(mContext.getContentResolver(),
Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- mVibrator.getDefaultHapticFeedbackIntensity());
+ mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_TOUCH));
if (Settings.System.getInt(mContext.getContentResolver(),
Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 0) {
touchIntensity = Vibrator.VIBRATION_INTENSITY_OFF;
diff --git a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java
index f321d72..6a254cb 100644
--- a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java
@@ -17,6 +17,7 @@
package com.android.settings.applications.appinfo;
import android.content.Context;
+import android.net.NetworkStats;
import android.net.NetworkTemplate;
import android.os.Bundle;
import android.text.format.DateUtils;
@@ -136,13 +137,13 @@
private static NetworkTemplate getTemplate(Context context) {
if (DataUsageUtils.hasReadyMobileRadio(context)) {
- return NetworkTemplate.buildTemplateMobileWildcard();
+ return new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE).setMeteredness(
+ NetworkStats.METERED_YES).build();
}
if (DataUsageUtils.hasWifiRadio(context)) {
- return NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */);
+ return new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
}
- return NetworkTemplate.buildTemplateEthernet();
+ return new NetworkTemplate.Builder(NetworkTemplate.MATCH_ETHERNET).build();
}
@VisibleForTesting
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index a4396a2..abcc45f 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -183,15 +183,15 @@
void addWifiSection() {
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
inflatePreferences(R.xml.data_usage_wifi);
- category.setTemplate(
- NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */), 0, services);
+ category.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build(),
+ 0, services);
}
private void addEthernetSection() {
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
inflatePreferences(R.xml.data_usage_ethernet);
- category.setTemplate(NetworkTemplate.buildTemplateEthernet(), 0, services);
+ category.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_ETHERNET).build(),
+ 0, services);
}
private Preference inflatePreferences(int resId) {
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
index 260a6da..b6e533b 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
@@ -225,8 +225,7 @@
static void launchWifiDataUsage(Context context) {
final Bundle args = new Bundle(1);
args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE,
- NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */));
+ new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
args.putInt(DataUsageList.EXTRA_NETWORK_TYPE, ConnectivityManager.TYPE_WIFI);
final SubSettingLauncher launcher = new SubSettingLauncher(context)
.setArguments(args)
@@ -369,8 +368,7 @@
protected long getHistoricalUsageLevel() {
final DataUsageController controller = new DataUsageController(getContext());
return controller.getHistoricalUsageLevel(
- NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */));
+ new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
}
@VisibleForTesting
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
index ac1e1ad..1b3b47a 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
@@ -138,8 +138,7 @@
mDefaultTemplate = DataUsageLib.getMobileTemplate(context, subscriptionId);
} else if (DataUsageUtils.hasWifiRadio(context)) {
mDataUsageTemplate = R.string.wifi_data_template;
- mDefaultTemplate = NetworkTemplate.buildTemplateWifi(
- NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */);
+ mDefaultTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
} else {
mDataUsageTemplate = R.string.ethernet_data_template;
mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, subscriptionId);
diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java
index fae53ec..5227284 100644
--- a/src/com/android/settings/datausage/DataUsageUtils.java
+++ b/src/com/android/settings/datausage/DataUsageUtils.java
@@ -184,10 +184,9 @@
if (SubscriptionManager.isValidSubscriptionId(defaultSubId) && hasMobileData(context)) {
return DataUsageLib.getMobileTemplate(context, defaultSubId);
} else if (hasWifiRadio(context)) {
- return NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */);
+ return new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
} else {
- return NetworkTemplate.buildTemplateEthernet();
+ return new NetworkTemplate.Builder(NetworkTemplate.MATCH_ETHERNET).build();
}
}
diff --git a/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
index 0551fc2..9d3054e 100644
--- a/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
+++ b/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
@@ -26,6 +26,8 @@
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.net.DataUsageController;
+import java.util.Set;
+
/**
* The controller displays a data usage chart for the specified Wi-Fi network.
*/
@@ -52,7 +54,8 @@
final DataUsageSummaryPreference mPreference = (DataUsageSummaryPreference) preference;
// TODO(b/126299427): Currently gets data usage of whole Wi-Fi networks, but should get
// specified one.
- final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(mNetworkId);
+ final NetworkTemplate template = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI)
+ .setWifiNetworkKeys(Set.of(mNetworkId)).build();
final DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
template);
mDataInfoController.updateDataLimit(info, mPolicyEditor.getPolicy(template));
diff --git a/src/com/android/settings/datausage/lib/DataUsageLib.java b/src/com/android/settings/datausage/lib/DataUsageLib.java
index 830f1ca..9f4c78f 100644
--- a/src/com/android/settings/datausage/lib/DataUsageLib.java
+++ b/src/com/android/settings/datausage/lib/DataUsageLib.java
@@ -17,6 +17,7 @@
package com.android.settings.datausage.lib;
import android.content.Context;
+import android.net.NetworkStats;
import android.net.NetworkTemplate;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -26,6 +27,7 @@
import com.android.internal.util.ArrayUtils;
import java.util.List;
+import java.util.Set;
/**
* Lib class for data usage
@@ -71,12 +73,17 @@
return NetworkTemplate.normalize(mobileTemplate, mergedSubscriberIds);
}
- private static NetworkTemplate getMobileTemplateForSubId(
+ public static NetworkTemplate getMobileTemplateForSubId(
TelephonyManager telephonyManager, int subId) {
- // The null subscriberId means that no any mobile/carrier network will be matched.
- // Using old API: buildTemplateMobileAll for the null subscriberId to avoid NPE.
+ // Create template that matches any mobile network when the subscriberId is null.
String subscriberId = telephonyManager.getSubscriberId(subId);
- return subscriberId != null ? NetworkTemplate.buildTemplateCarrierMetered(subscriberId)
- : NetworkTemplate.buildTemplateMobileAll(subscriberId);
+ return subscriberId != null
+ ? new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setSubscriberIds(Set.of(subscriberId))
+ .setMeteredness(NetworkStats.METERED_YES)
+ .build()
+ : new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
+ .setMeteredness(NetworkStats.METERED_YES)
+ .build();
}
}
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index e0f8181..ea864ea 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -309,9 +309,8 @@
mAddWifiNetworkPreference = new AddWifiNetworkPreference(getPrefContext());
mDataUsagePreference = findPreference(PREF_KEY_DATA_USAGE);
mDataUsagePreference.setVisible(DataUsageUtils.hasWifiRadio(getContext()));
- mDataUsagePreference.setTemplate(
- NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */), 0 /*subId*/, null /*service*/);
+ mDataUsagePreference.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI)
+ .build(), 0 /*subId*/, null /*service*/);
mResetInternetPreference = findPreference(PREF_KEY_RESET_INTERNET);
if (mResetInternetPreference != null) {
mResetInternetPreference.setVisible(false);
diff --git a/src/com/android/settings/network/VpnPreferenceController.java b/src/com/android/settings/network/VpnPreferenceController.java
index 96931e6..d3934f6 100644
--- a/src/com/android/settings/network/VpnPreferenceController.java
+++ b/src/com/android/settings/network/VpnPreferenceController.java
@@ -50,7 +50,9 @@
import com.android.settingslib.core.lifecycle.events.OnResume;
import com.android.settingslib.utils.ThreadUtils;
+import java.util.Arrays;
import java.util.List;
+import java.util.function.Function;
public class VpnPreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause {
@@ -63,32 +65,36 @@
.build();
private static final String TAG = "VpnPreferenceController";
- private final String mToggleable;
private final UserManager mUserManager;
- private final ConnectivityManager mConnectivityManager;
+ private ConnectivityManager mConnectivityManager;
private final VpnManager mVpnManager;
private Preference mPreference;
public VpnPreferenceController(Context context) {
super(context);
- mToggleable = Settings.Global.getString(context.getContentResolver(),
- Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
- mConnectivityManager =
- (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
mVpnManager = context.getSystemService(VpnManager.class);
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- mPreference = screen.findPreference(KEY_VPN_SETTINGS);
- // Manually set dependencies for Wifi when not toggleable.
- if (mToggleable == null || !mToggleable.contains(Settings.Global.RADIO_WIFI)) {
- if (mPreference != null) {
- mPreference.setDependency(SettingsSlicesContract.KEY_AIRPLANE_MODE);
- }
+ mPreference = getEffectivePreference(screen);
+ }
+
+ @VisibleForTesting
+ protected Preference getEffectivePreference(PreferenceScreen screen) {
+ Preference preference = screen.findPreference(KEY_VPN_SETTINGS);
+ if (preference == null) {
+ return null;
}
+ String toggleable = Settings.Global.getString(mContext.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+ // Manually set dependencies for Wifi when not toggleable.
+ if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_WIFI)) {
+ preference.setDependency(SettingsSlicesContract.KEY_AIRPLANE_MODE);
+ }
+ return preference;
}
@Override
@@ -104,15 +110,19 @@
@Override
public void onPause() {
- if (isAvailable()) {
+ if (mConnectivityManager != null) {
mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
+ mConnectivityManager = null;
}
}
@Override
public void onResume() {
if (isAvailable()) {
+ mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
mConnectivityManager.registerNetworkCallback(REQUEST, mNetworkCallback);
+ } else {
+ mConnectivityManager = null;
}
}
@@ -203,17 +213,13 @@
@VisibleForTesting
protected int getInsecureVpnCount() {
- int count = 0;
- for (String key : LegacyVpnProfileStore.list(Credentials.VPN)) {
- final VpnProfile profile = VpnProfile.decode(key,
- LegacyVpnProfileStore.get(Credentials.VPN + key));
- // Return whether any profile is an insecure type.
- if (VpnProfile.isLegacyType(profile.type)) {
- count++;
- }
- }
- // We did not find any insecure VPNs.
- return count;
+ final Function<String, VpnProfile> keyToProfile = key ->
+ VpnProfile.decode(key, LegacyVpnProfileStore.get(Credentials.VPN + key));
+ return (int) Arrays.stream(LegacyVpnProfileStore.list(Credentials.VPN))
+ .map(keyToProfile)
+ // Return whether any profile is an insecure type.
+ .filter(profile -> VpnProfile.isLegacyType(profile.type))
+ .count();
}
// Copied from SystemUI::SecurityControllerImpl
diff --git a/src/com/android/settings/security/SecurityAdvancedSettings.java b/src/com/android/settings/security/SecurityAdvancedSettings.java
index 7d8c9ff..4a73eb7 100644
--- a/src/com/android/settings/security/SecurityAdvancedSettings.java
+++ b/src/com/android/settings/security/SecurityAdvancedSettings.java
@@ -25,6 +25,8 @@
import com.android.settings.biometrics.face.FaceProfileStatusPreferenceController;
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.search.BaseSearchIndexProvider;
import com.android.settings.security.trustagent.TrustAgentListPreferenceController;
import com.android.settings.widget.PreferenceCategoryController;
@@ -47,6 +49,10 @@
private static final String TAG = "SecurityAdvancedSettings";
private static final String WORK_PROFILE_SECURITY_CATEGORY = "security_category_profile";
+ /** Used in case of old Security settings when SafetyCenter is disabled */
+ private static final String CATEGORY_SECURITY_LEGACY_ADVANCED_SETTINGS =
+ "com.android.settings.category.ia.legacy_advanced_security";
+
@Override
public int getMetricsCategory() {
return SettingsEnums.SECURITY_ADVANCED;
@@ -54,7 +60,19 @@
@Override
public String getCategoryKey() {
- return CategoryKey.CATEGORY_SECURITY_ADVANCED_SETTINGS;
+ if (SafetyCenterStatus.isEnabled()) {
+ return CategoryKey.CATEGORY_SECURITY_ADVANCED_SETTINGS;
+ } else {
+ final SecuritySettingsFeatureProvider securitySettingsFeatureProvider =
+ FeatureFactory.getFactory(getContext())
+ .getSecuritySettingsFeatureProvider();
+
+ if (securitySettingsFeatureProvider.hasAlternativeSecuritySettingsFragment()) {
+ return securitySettingsFeatureProvider.getAlternativeAdvancedSettingsCategoryKey();
+ } else {
+ return CATEGORY_SECURITY_LEGACY_ADVANCED_SETTINGS;
+ }
+ }
}
@Override
diff --git a/src/com/android/settings/security/SecuritySettingsFeatureProvider.java b/src/com/android/settings/security/SecuritySettingsFeatureProvider.java
index 78e4bc7..128ec01 100644
--- a/src/com/android/settings/security/SecuritySettingsFeatureProvider.java
+++ b/src/com/android/settings/security/SecuritySettingsFeatureProvider.java
@@ -24,4 +24,10 @@
/** Returns the alternative SecuritySettings fragment name if available. */
String getAlternativeSecuritySettingsFragmentClassname();
+
+ /**
+ * Returns the category of SecurityAdvancedSettings fragment for the alternative
+ * SecuritySettings if available.
+ */
+ String getAlternativeAdvancedSettingsCategoryKey();
}
diff --git a/src/com/android/settings/security/SecuritySettingsFeatureProviderImpl.java b/src/com/android/settings/security/SecuritySettingsFeatureProviderImpl.java
index 8aba523..e4f540c 100644
--- a/src/com/android/settings/security/SecuritySettingsFeatureProviderImpl.java
+++ b/src/com/android/settings/security/SecuritySettingsFeatureProviderImpl.java
@@ -28,4 +28,9 @@
public String getAlternativeSecuritySettingsFragmentClassname() {
return null;
}
+
+ @Override
+ public String getAlternativeAdvancedSettingsCategoryKey() {
+ return null;
+ }
}
diff --git a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
index 9e82e78..4d65ae7 100644
--- a/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
+++ b/src/com/android/settings/security/VisiblePatternProfilePreferenceController.java
@@ -126,6 +126,8 @@
@Override
public void onResume() {
- mPreference.setVisible(isAvailable());
+ if (mPreference != null) {
+ mPreference.setVisible(isAvailable());
+ }
}
}
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index b779a72..bbddd98 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -270,9 +270,8 @@
mStatusMessagePreference = findPreference(PREF_KEY_STATUS_MESSAGE);
mDataUsagePreference = findPreference(PREF_KEY_DATA_USAGE);
mDataUsagePreference.setVisible(DataUsageUtils.hasWifiRadio(getContext()));
- mDataUsagePreference.setTemplate(
- NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */), 0 /*subId*/, null /*service*/);
+ mDataUsagePreference.setTemplate(new NetworkTemplate.Builder(
+ NetworkTemplate.MATCH_WIFI).build(), 0 /*subId*/, null /*service*/);
}
@Override
diff --git a/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
index 0eaf008..bd2206f 100644
--- a/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/RingVibrationIntensityPreferenceControllerTest.java
@@ -20,10 +20,12 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import android.content.Context;
+import android.os.VibrationAttributes;
import android.os.Vibrator;
import androidx.test.core.app.ApplicationProvider;
@@ -59,7 +61,8 @@
@Test
public void getDefaultIntensity_success() {
- doReturn(/* toBeReturned= */ 5).when(mVibrator).getDefaultRingVibrationIntensity();
+ doReturn(/* toBeReturned= */ 5).when(mVibrator).getDefaultVibrationIntensity(
+ eq(VibrationAttributes.USAGE_RINGTONE));
assertThat(mController.getDefaultIntensity()).isEqualTo(/* expected= */ 5);
}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java
index 0f7bf20..3fa306f 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java
@@ -109,7 +109,8 @@
/* deviceProfile */ "",
/* selfManaged */ false,
/* notifyOnDeviceNearby */ true,
- /* timeApprovedMs */ System.currentTimeMillis());
+ /* timeApprovedMs */ System.currentTimeMillis(),
+ /* lastTimeConnected */ Long.MAX_VALUE);
mAssociations.add(association);
showScreen(mController);
diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
index f75b7f0..c0cdb01 100644
--- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
@@ -310,8 +310,7 @@
ReflectionHelpers.setField(mFragment, "mContext", context);
ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
ReflectionHelpers.setField(mFragment, "mTemplate",
- NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */));
+ new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
final long end = System.currentTimeMillis();
final long start = end - (DateUtils.WEEK_IN_MILLIS * 4);
@@ -336,8 +335,7 @@
ReflectionHelpers.setField(mFragment, "mContext", context);
ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
ReflectionHelpers.setField(mFragment, "mTemplate",
- NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */));
+ new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
final long end = System.currentTimeMillis();
final long start = end - (DateUtils.WEEK_IN_MILLIS * 4);
@@ -368,8 +366,7 @@
ReflectionHelpers.setField(mFragment, "mCycles", testCycles);
ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
ReflectionHelpers.setField(mFragment, "mTemplate",
- NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */));
+ new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
final NetworkCycleDataForUidLoader loader = (NetworkCycleDataForUidLoader)
mFragment.mUidDataCallbacks.onCreateLoader(0 /* id */, Bundle.EMPTY /* args */);
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java
index ff8ef93..02f683a 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java
@@ -24,6 +24,7 @@
import android.content.Context;
import android.content.Intent;
+import android.net.NetworkStats;
import android.net.NetworkTemplate;
import com.android.settingslib.net.DataUsageController;
@@ -58,8 +59,9 @@
public void setTemplate_noDataUsage_shouldDisablePreference() {
doReturn(0L).when(mController).getHistoricalUsageLevel(any(NetworkTemplate.class));
- mPreference.setTemplate(
- NetworkTemplate.buildTemplateMobileWildcard(), 5 /* subId */, null /* services */);
+ mPreference.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
+ .setMeteredness(NetworkStats.METERED_YES).build(),
+ 5 /* subId */, null /* services */);
verify(mPreference).setEnabled(false);
verify(mPreference).setIntent(null);
@@ -69,8 +71,9 @@
public void setTemplate_hasDataUsage_shouldNotDisablePreference() {
doReturn(200L).when(mController).getHistoricalUsageLevel(any(NetworkTemplate.class));
- mPreference.setTemplate(
- NetworkTemplate.buildTemplateMobileWildcard(), 5 /* subId */, null /* services */);
+ mPreference.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
+ .setMeteredness(NetworkStats.METERED_YES).build(),
+ 5 /* subId */, null /* services */);
verify(mPreference, never()).setEnabled(false);
verify(mPreference).setIntent(any(Intent.class));
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
index ff0d7b2..5d568fe 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
@@ -19,8 +19,7 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -36,7 +35,6 @@
import android.net.wifi.WifiEnterpriseConfig.Eap;
import android.net.wifi.WifiEnterpriseConfig.Phase2;
import android.net.wifi.WifiManager;
-import android.os.UserHandle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -86,6 +84,8 @@
private WifiEntry mWifiEntry;
@Mock
private AndroidKeystoreAliasLoader mAndroidKeystoreAliasLoader;
+ @Mock
+ private WifiManager mWifiManager;
private View mView;
private Spinner mHiddenSettingsSpinner;
private Spinner mEapCaCertSpinner;
@@ -127,6 +127,7 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getSystemService(eq(WifiManager.class))).thenReturn(mWifiManager);
when(mConfigUiBase.getContext()).thenReturn(mContext);
when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_PSK);
mView = LayoutInflater.from(mContext).inflate(R.layout.wifi_dialog, null);
@@ -420,7 +421,7 @@
private TestWifiConfigController2(
WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry, int mode) {
- super(parent, view, wifiEntry, mode);
+ super(parent, view, wifiEntry, mode, mWifiManager);
}
private TestWifiConfigController2(
diff --git a/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java b/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
index d770aba..b80e9d2 100644
--- a/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
+++ b/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java
@@ -101,8 +101,7 @@
}
private NetworkPolicy getDefaultNetworkPolicy() {
- NetworkTemplate template = NetworkTemplate.buildTemplateWifi(
- NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */);
+ NetworkTemplate template = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
int cycleDay = -1;
String cycleTimezone = "UTC";
long warningBytes = -1;
diff --git a/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
index 7d814b5..b27591e 100644
--- a/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
+++ b/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -531,13 +531,11 @@
final Bundle expect = new Bundle(1);
expect.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE,
- NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
- null /* subscriberId */));
+ new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
final Bundle actual = startedIntent
.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
assertThat((NetworkTemplate) actual.getParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE))
- .isEqualTo(NetworkTemplate.buildTemplateWifi(
- NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */));
+ .isEqualTo(new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
assertThat(startedIntent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
.isEqualTo(ResourcesUtils.getResourcesId(mContext, "string", "wifi_data_usage"));
diff --git a/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java b/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java
index 6e30bbb..e18b258 100644
--- a/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java
+++ b/tests/unit/src/com/android/settings/security/SecurityAdvancedSettingsTest.java
@@ -18,13 +18,18 @@
import static com.google.common.truth.Truth.assertThat;
+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.testutils.FakeFeatureFactory;
import com.android.settings.testutils.ResourcesUtils;
import com.android.settingslib.drawer.CategoryKey;
@@ -35,6 +40,9 @@
@RunWith(AndroidJUnit4.class)
public class SecurityAdvancedSettingsTest {
private static final String SCREEN_XML_RESOURCE_NAME = "security_advanced_settings";
+ private static final String ALTERNATIVE_CATEGORY_KEY = "alternative_category_key";
+ private static final String LEGACY_CATEGORY_KEY =
+ "com.android.settings.category.ia.legacy_advanced_security";
private Context mContext;
private SecurityAdvancedSettings mSecurityAdvancedSettings;
@@ -58,12 +66,51 @@
}
@Test
- public void getCategoryKey_whenCalled_returnsSecurity() {
+ public void getCategoryKey_whenSafetyCenterIsEnabled_returnsSecurity() {
+ setSafetyCenterEnabled(true);
+
assertThat(mSecurityAdvancedSettings.getCategoryKey())
.isEqualTo(CategoryKey.CATEGORY_SECURITY_ADVANCED_SETTINGS);
}
+ @Test
+ public void getCategoryKey_whenAlternativeFragmentPresented_returnsAlternative() {
+ setSafetyCenterEnabled(false);
+ setupAlternativeFragment(true, ALTERNATIVE_CATEGORY_KEY);
+
+ assertThat(mSecurityAdvancedSettings.getCategoryKey())
+ .isEqualTo(ALTERNATIVE_CATEGORY_KEY);
+ }
+
+ @Test
+ public void getCategoryKey_whenNoAlternativeFragmentPresented_returnsLegacy() {
+ setSafetyCenterEnabled(false);
+ setupAlternativeFragment(false, null);
+
+ assertThat(mSecurityAdvancedSettings.getCategoryKey())
+ .isEqualTo(LEGACY_CATEGORY_KEY);
+ }
+
private int getXmlResId(String resName) {
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();
+ when(fakeFeatureFactory.securitySettingsFeatureProvider
+ .hasAlternativeSecuritySettingsFragment())
+ .thenReturn(hasAlternativeFragment);
+ when(fakeFeatureFactory.securitySettingsFeatureProvider
+ .getAlternativeAdvancedSettingsCategoryKey())
+ .thenReturn(alternativeCategoryKey);
+ }
}