Merge "Fix NetworkProviderSettingsTest#onWifiEntriesChanged" into main
diff --git a/res/layout/search_bar_unified_version.xml b/res/layout/search_bar_unified_version.xml
index 14f46ec..e9b3c10 100644
--- a/res/layout/search_bar_unified_version.xml
+++ b/res/layout/search_bar_unified_version.xml
@@ -44,7 +44,7 @@
style="@style/TextAppearance.SearchBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingStart="8dp"
+ android:layout_marginStart="8dp"
android:paddingEnd="8dp"
android:text="@string/homepage_search"/>
</LinearLayout>
diff --git a/res/layout/settings_homepage_container_v2.xml b/res/layout/settings_homepage_container_v2.xml
index b244579..a67b743 100644
--- a/res/layout/settings_homepage_container_v2.xml
+++ b/res/layout/settings_homepage_container_v2.xml
@@ -69,7 +69,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
- android:paddingVertical="8dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="16dp"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 939befe..0fcb0d6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1864,6 +1864,10 @@
<string name="device_details_title">Device details</string>
<!-- Title for keyboard settings preferences. [CHAR LIMIT=50] -->
<string name="bluetooth_device_keyboard_settings_preference_title">Keyboard settings</string>
+ <!-- Title for more settings preferences. [CHAR LIMIT=50] -->
+ <string name="bluetooth_device_more_settings_preference_title">More settings</string>
+ <!-- Title for more settings summary. [CHAR LIMIT=50] -->
+ <string name="bluetooth_device_more_settings_preference_summary">Firmware updates, about, and more</string>
<!-- Title of the item to show device MAC address -->
<string name="bluetooth_device_mac_address">Device\'s Bluetooth address: <xliff:g id="address">%1$s</xliff:g></string>
<!-- Title of the items to show multuple devices MAC address [CHAR LIMIT=NONE]-->
@@ -1884,6 +1888,9 @@
<!-- Bluetooth device details companion apps. In the confirmation dialog for removing an associated app, this is the label on the button that will complete the disassociate action. [CHAR LIMIT=80] -->
<string name = "bluetooth_companion_app_remove_association_confirm_button">Disconnect app</string>
+ <!-- Title of device details screen [CHAR LIMIT=28]-->
+ <string name="device_details_more_settings">More settings</string>
+
<!-- Bluetooth developer settings: Maximum number of connected audio devices -->
<string name="bluetooth_max_connected_audio_devices_string">Maximum connected Bluetooth audio devices</string>
<!-- Bluetooth developer settings: Maximum number of connected audio devices -->
@@ -4493,10 +4500,10 @@
<string name="trackpad_reverse_scrolling_title">Reverse scrolling</string>
<!-- Summary text for 'Reverse scrolling' [CHAR LIMIT=60] -->
<string name="trackpad_reverse_scrolling_summary">Content moves up when you scroll down</string>
- <!-- Title text for 'Bottom-right tap' [CHAR LIMIT=35] -->
- <string name="trackpad_bottom_right_tap_title">Bottom-right tap</string>
- <!-- Summary text for 'Bottom-right tap' [CHAR LIMIT=60] -->
- <string name="trackpad_bottom_right_tap_summary">Tap the bottom right corner of the touchpad for more options</string>
+ <!-- Title text for 'Bottom-right click', a setting that allows the user to right-click by pressing in the bottom-right corner of a touchpad. [CHAR LIMIT=35] -->
+ <string name="trackpad_bottom_right_tap_title">Bottom-right click</string>
+ <!-- Summary text for 'Bottom-right click', a setting that allows the user to right-click by pressing in the bottom-right corner of a touchpad [CHAR LIMIT=60] -->
+ <string name="trackpad_bottom_right_tap_summary">Click in the bottom right corner of the touchpad for more options</string>
<!-- Title text for 'Pointer speed'. [CHAR LIMIT=35] -->
<string name="trackpad_pointer_speed">Pointer speed</string>
<!-- Title text for mouse pointer fill style. [CHAR LIMIT=35] -->
@@ -8184,10 +8191,10 @@
other {{effect_1}, {effect_2}, and # more}
}
</string>
- <!-- Modes: setting for whether the mode should filter (silence/hide) notifications/volume streams -->
- <string name="mode_notification_filter_title">Limit what can notify you</string>
- <!-- Modes: subtext when a mode is not filtering (silence/hide) notifications/volume streams -->
- <string name="mode_no_notification_filter">No interruptions are filtered</string>
+ <!-- Modes: setting for a mode to allow all notifications and sounds through -->
+ <string name="zen_mode_allow_all_notifications">Allow all notifications</string>
+ <!-- Modes: subtext when a mode is allowing all notifications and sounds (i.e. no filtering) -->
+ <string name="zen_mode_all_notifications_allowed">People, apps, and sounds can interrupt</string>
<!-- Do not disturb: restrict notifications settings title [CHAR LIMIT=80] -->
<string name="zen_mode_restrict_notifications_title">Display options for filtered
@@ -8851,9 +8858,13 @@
<string name="nls_feature_reply_summary">It can reply to messages and take action on buttons in notifications, including snoozing or dismissing notifications and answering calls.</string>
<string name="nls_feature_settings_title">Change settings</string>
<string name="nls_feature_settings_summary">It can turn Do Not Disturb on or off and change related settings.</string>
+ <string name="nls_feature_modes_settings_summary">It can manage and activate Priority Modes, and change related settings.</string>
<string name="notification_listener_disable_warning_summary">
If you turn off notification access for <xliff:g id="notification_listener_name">%1$s</xliff:g>, Do Not Disturb access may also be turned off.
</string>
+ <string name="notification_listener_disable_modes_warning_summary">
+ If you turn off notification access for <xliff:g id="notification_listener_name">%1$s</xliff:g>, Priority Modes access may also be turned off.
+ </string>
<string name="notification_listener_disable_warning_confirm">Turn off</string>
<string name="notification_listener_disable_warning_cancel">Cancel</string>
<string name="notif_type_ongoing">Real-time</string>
@@ -9030,6 +9041,15 @@
<!-- Sound & notification > Do Not Disturb access > Text to display when the list is empty. [CHAR LIMIT=NONE] -->
<string name="zen_access_empty_text">No installed apps have requested Do Not Disturb access</string>
+ <!-- Special App Access: Title for managing Priority Modes access option. [CHAR LIMIT=40] -->
+ <string name="manage_zen_modes_access_title">Priority Modes access</string>
+
+ <!-- Button title that grants 'Priority Modes' permission to an app [CHAR_LIMIT=60]-->
+ <string name="zen_modes_access_detail_switch">Allow Priority Modes access</string>
+
+ <!-- Special App Access > Do Not Disturb access > Text to display when the list is empty. [CHAR LIMIT=NONE] -->
+ <string name="zen_modes_access_empty_text">No installed apps have requested Priority Modes access</string>
+
<!-- [CHAR LIMIT=NONE] Text appearing when app notifications are off -->
<string name="app_notifications_off_desc">You haven\'t allowed notifications from this app</string>
@@ -10151,6 +10171,18 @@
<!-- Zen mode access settings - summary for warning dialog when revoking access [CHAR LIMIT=NONE] -->
<string name="zen_access_revoke_warning_dialog_summary">All Do Not Disturb rules created by this app will be removed.</string>
+ <!-- Priority modes access settings - title for warning dialog when enabling access [CHAR LIMIT=NONE] -->
+ <string name="zen_modes_access_warning_dialog_title">Allow access to Priority Modes for <xliff:g id="app" example="Tasker">%1$s</xliff:g>?</string>
+
+ <!-- Priority modes access settings - summary for warning dialog when enabling access [CHAR LIMIT=NONE] -->
+ <string name="zen_modes_access_warning_dialog_summary">The app will be able to turn on/off Do Not Disturb, manage and activate Priority Modes, and make changes to related settings.</string>
+
+ <!-- Priority modes access settings - title for warning dialog when revoking access [CHAR LIMIT=NONE] -->
+ <string name="zen_modes_access_revoke_warning_dialog_title">Revoke access Priority Modes for <xliff:g id="app" example="Tasker">%1$s</xliff:g>?</string>
+
+ <!-- Priority modes access settings - summary for warning dialog when revoking access [CHAR LIMIT=NONE] -->
+ <string name="zen_modes_access_revoke_warning_dialog_summary">All modes created by this app will be removed.</string>
+
<!-- Ignore battery optimizations on label [CHAR LIMIT=30] -->
<string name="ignore_optimizations_on">Don\u2019t optimize</string>
diff --git a/res/xml/bluetooth_device_more_settings_fragment.xml b/res/xml/bluetooth_device_more_settings_fragment.xml
new file mode 100644
index 0000000..4fb4aca
--- /dev/null
+++ b/res/xml/bluetooth_device_more_settings_fragment.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:key="bluetooth_device_more_settings_screen"
+ android:title="@string/device_details_more_settings">
+
+ <PreferenceCategory
+ android:key="bluetooth_profiles"/>
+</PreferenceScreen>
diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml
index 825d72c..4f16e12 100644
--- a/res/xml/mobile_network_settings.xml
+++ b/res/xml/mobile_network_settings.xml
@@ -176,12 +176,11 @@
settings:searchable="false"
settings:controller="com.android.settings.network.telephony.EnabledNetworkModePreferenceController"/>
+ <!-- Settings search is handled by CarrierSettingsVersionSearchItem. -->
<Preference
android:key="carrier_settings_version_key"
android:title="@string/carrier_settings_version"
- android:enabled="false"
- android:shouldDisableView="false"
- android:selectable="false"
+ settings:searchable="false"
settings:controller="com.android.settings.network.telephony.CarrierSettingsVersionPreferenceController"
settings:enableCopying="true"/>
diff --git a/res/xml/modes_rule_settings.xml b/res/xml/modes_rule_settings.xml
index d2f573c..4f9b685 100644
--- a/res/xml/modes_rule_settings.xml
+++ b/res/xml/modes_rule_settings.xml
@@ -59,8 +59,8 @@
android:key="modes_filters">
<SwitchPreferenceCompat
- android:key="allow_filtering"
- android:title="@string/mode_notification_filter_title"/>
+ android:key="allow_all"
+ android:title="@string/zen_mode_allow_all_notifications"/>
<com.android.settings.notification.modes.CircularIconsPreference
android:key="zen_mode_people"
diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/FriendlyWarningDialogFragment.java b/src/com/android/settings/applications/specialaccess/notificationaccess/FriendlyWarningDialogFragment.java
index 3577946..c92f734 100644
--- a/src/com/android/settings/applications/specialaccess/notificationaccess/FriendlyWarningDialogFragment.java
+++ b/src/com/android/settings/applications/specialaccess/notificationaccess/FriendlyWarningDialogFragment.java
@@ -16,6 +16,7 @@
package com.android.settings.applications.specialaccess.notificationaccess;
import android.app.Dialog;
+import android.app.Flags;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.DialogInterface;
@@ -55,7 +56,10 @@
NotificationAccessDetails parent = (NotificationAccessDetails) getTargetFragment();
final String summary = getResources().getString(
- R.string.notification_listener_disable_warning_summary, label);
+ Flags.modesApi() && Flags.modesUi()
+ ? R.string.notification_listener_disable_modes_warning_summary
+ : R.string.notification_listener_disable_warning_summary,
+ label);
return new AlertDialog.Builder(getContext())
.setMessage(summary)
.setCancelable(true)
diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/ScaryWarningDialogFragment.java b/src/com/android/settings/applications/specialaccess/notificationaccess/ScaryWarningDialogFragment.java
index 747a125..53181fd 100644
--- a/src/com/android/settings/applications/specialaccess/notificationaccess/ScaryWarningDialogFragment.java
+++ b/src/com/android/settings/applications/specialaccess/notificationaccess/ScaryWarningDialogFragment.java
@@ -16,6 +16,7 @@
package com.android.settings.applications.specialaccess.notificationaccess;
import android.app.Dialog;
+import android.app.Flags;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
@@ -96,6 +97,11 @@
R.string.nls_warning_prompt, label);
((TextView) content.findViewById(R.id.prompt)).setText(prompt);
+ ((TextView) content.findViewById(R.id.settings_description)).setText(
+ Flags.modesApi() && Flags.modesUi()
+ ? R.string.nls_feature_modes_settings_summary
+ : R.string.nls_feature_settings_summary);
+
Button allowButton = content.findViewById(R.id.allow_button);
allowButton.setOnClickListener((view) -> {
parent.enable(cn);
diff --git a/src/com/android/settings/applications/specialaccess/zenaccess/FriendlyWarningDialogFragment.java b/src/com/android/settings/applications/specialaccess/zenaccess/FriendlyWarningDialogFragment.java
index 5da2990..38317ed 100644
--- a/src/com/android/settings/applications/specialaccess/zenaccess/FriendlyWarningDialogFragment.java
+++ b/src/com/android/settings/applications/specialaccess/zenaccess/FriendlyWarningDialogFragment.java
@@ -17,6 +17,7 @@
package com.android.settings.applications.specialaccess.zenaccess;
import android.app.Dialog;
+import android.app.Flags;
import android.app.settings.SettingsEnums;
import android.os.Bundle;
import android.text.TextUtils;
@@ -58,9 +59,14 @@
final String label = args.getString(KEY_LABEL);
final String title = getResources().getString(
- R.string.zen_access_revoke_warning_dialog_title, label);
+ Flags.modesApi() && Flags.modesUi()
+ ? R.string.zen_modes_access_revoke_warning_dialog_title
+ : R.string.zen_access_revoke_warning_dialog_title,
+ label);
final String summary = getResources()
- .getString(R.string.zen_access_revoke_warning_dialog_summary);
+ .getString(Flags.modesApi() && Flags.modesUi()
+ ? R.string.zen_modes_access_revoke_warning_dialog_summary
+ : R.string.zen_access_revoke_warning_dialog_summary);
ZenAccessDetails parent = (ZenAccessDetails) getTargetFragment();
return new AlertDialog.Builder(getContext())
diff --git a/src/com/android/settings/applications/specialaccess/zenaccess/ScaryWarningDialogFragment.java b/src/com/android/settings/applications/specialaccess/zenaccess/ScaryWarningDialogFragment.java
index e4ef48b..b489602 100644
--- a/src/com/android/settings/applications/specialaccess/zenaccess/ScaryWarningDialogFragment.java
+++ b/src/com/android/settings/applications/specialaccess/zenaccess/ScaryWarningDialogFragment.java
@@ -17,6 +17,7 @@
package com.android.settings.applications.specialaccess.zenaccess;
import android.app.Dialog;
+import android.app.Flags;
import android.app.settings.SettingsEnums;
import android.os.Bundle;
import android.text.TextUtils;
@@ -55,10 +56,15 @@
final String pkg = args.getString(KEY_PKG);
final String label = args.getString(KEY_LABEL);
- final String title = getResources().getString(R.string.zen_access_warning_dialog_title,
+ final String title = getResources().getString(
+ Flags.modesApi() && Flags.modesUi()
+ ? R.string.zen_modes_access_warning_dialog_title
+ : R.string.zen_access_warning_dialog_title,
label);
final String summary = getResources()
- .getString(R.string.zen_access_warning_dialog_summary);
+ .getString(Flags.modesApi() && Flags.modesUi()
+ ? R.string.zen_modes_access_warning_dialog_summary
+ : R.string.zen_access_warning_dialog_summary);
ZenAccessDetails parent = (ZenAccessDetails) getTargetFragment();
diff --git a/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessController.java b/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessController.java
index 6f4137c..cfeeb0d 100644
--- a/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessController.java
+++ b/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessController.java
@@ -18,6 +18,7 @@
import android.app.ActivityManager;
import android.app.AppGlobals;
+import android.app.Flags;
import android.app.NotificationManager;
import android.app.settings.SettingsEnums;
import android.content.Context;
@@ -28,7 +29,10 @@
import android.util.Log;
import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
@@ -48,6 +52,16 @@
return AVAILABLE;
}
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ Preference preference = screen.findPreference(getPreferenceKey());
+ if (preference != null) {
+ preference.setTitle(Flags.modesApi() && Flags.modesUi()
+ ? R.string.manage_zen_modes_access_title
+ : R.string.manage_zen_access_title);
+ }
+ }
+
public static Set<String> getPackagesRequestingNotificationPolicyAccess() {
final String[] PERM = {
android.Manifest.permission.ACCESS_NOTIFICATION_POLICY
diff --git a/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessDetails.java b/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessDetails.java
index ffe13e6..74903c0 100644
--- a/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessDetails.java
+++ b/src/com/android/settings/applications/specialaccess/zenaccess/ZenAccessDetails.java
@@ -16,9 +16,11 @@
package com.android.settings.applications.specialaccess.zenaccess;
+import android.app.Flags;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
+import android.os.UserManager;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.TwoStatePreference;
@@ -42,6 +44,9 @@
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.zen_access_permission_details);
+ requireActivity().setTitle(Flags.modesApi() && Flags.modesUi()
+ ? R.string.manage_zen_modes_access_title
+ : R.string.manage_zen_access_title);
getSettingsLifecycle().addObserver(
new ZenAccessSettingObserverMixin(getContext(), this /* listener */));
}
@@ -49,6 +54,11 @@
@Override
protected boolean refreshUi() {
final Context context = getContext();
+ // don't show for managed profiles
+ if (UserManager.get(context).isManagedProfile(context.getUserId())
+ && !ZenAccessController.hasAccess(context, mPackageName)) {
+ finish();
+ }
// If this app didn't declare this permission in their manifest, don't bother showing UI.
final Set<String> needAccessApps =
ZenAccessController.getPackagesRequestingNotificationPolicyAccess();
@@ -74,6 +84,9 @@
preference.setSummary(getString(R.string.zen_access_disabled_package_warning));
return;
}
+ preference.setTitle(Flags.modesApi() && Flags.modesUi()
+ ? R.string.zen_modes_access_detail_switch
+ : R.string.zen_access_detail_switch);
preference.setChecked(ZenAccessController.hasAccess(context, mPackageName));
preference.setOnPreferenceChangeListener((p, newValue) -> {
final boolean access = (Boolean) newValue;
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
index bd762a1..76bff57 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -48,6 +48,7 @@
import androidx.annotation.VisibleForTesting;
import com.android.settings.R;
+import com.android.settings.bluetooth.ui.model.FragmentTypeModel;
import com.android.settings.bluetooth.ui.view.DeviceDetailsFragmentFormatter;
import com.android.settings.connecteddevice.stylus.StylusDevicesController;
import com.android.settings.core.SettingsUIDeviceConfig;
@@ -255,8 +256,17 @@
public void onDetach() {
super.onDetach();
mManager.getEventManager().unregisterCallback(mBluetoothCallback);
- mBluetoothAdapter.removeOnMetadataChangedListener(
- mCachedDevice.getDevice(), mExtraControlMetadataListener);
+ BluetoothDevice device = mCachedDevice.getDevice();
+ try {
+ mBluetoothAdapter.removeOnMetadataChangedListener(
+ device, mExtraControlMetadataListener);
+ } catch (IllegalArgumentException e) {
+ Log.w(
+ TAG,
+ "Unable to unregister metadata change callback for "
+ + mCachedDevice,
+ e);
+ }
}
private void updateExtraControlUri(int viewWidth) {
@@ -343,7 +353,7 @@
public void onCreatePreferences(@NonNull Bundle savedInstanceState, @NonNull String rootKey) {
super.onCreatePreferences(savedInstanceState, rootKey);
if (Flags.enableBluetoothDeviceDetailsPolish()) {
- mFormatter.updateLayout();
+ mFormatter.updateLayout(FragmentTypeModel.DeviceDetailsMainFragment.INSTANCE);
}
}
@@ -400,7 +410,9 @@
@Override
protected void addPreferenceController(AbstractPreferenceController controller) {
if (Flags.enableBluetoothDeviceDetailsPolish()) {
- List<String> keys = mFormatter.getVisiblePreferenceKeysForMainPage();
+ List<String> keys =
+ mFormatter.getVisiblePreferenceKeys(
+ FragmentTypeModel.DeviceDetailsMainFragment.INSTANCE);
Lifecycle lifecycle = getSettingsLifecycle();
if (keys == null || keys.contains(controller.getPreferenceKey())) {
super.addPreferenceController(controller);
diff --git a/src/com/android/settings/bluetooth/ui/composable/MultiTogglePreferenceGroup.kt b/src/com/android/settings/bluetooth/ui/composable/MultiTogglePreferenceGroup.kt
index 8fe3c25..d29795e 100644
--- a/src/com/android/settings/bluetooth/ui/composable/MultiTogglePreferenceGroup.kt
+++ b/src/com/android/settings/bluetooth/ui/composable/MultiTogglePreferenceGroup.kt
@@ -66,15 +66,14 @@
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.DialogProperties
import com.android.settings.R
+import com.android.settings.bluetooth.ui.model.DeviceSettingPreferenceModel
import com.android.settings.bluetooth.ui.composable.Icon as DeviceSettingComposeIcon
-import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingModel
-import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingStateModel
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.widget.dialog.getDialogWidth
@Composable
fun MultiTogglePreferenceGroup(
- preferenceModels: List<DeviceSettingModel.MultiTogglePreference>,
+ preferenceModels: List<DeviceSettingPreferenceModel.MultiTogglePreference>,
) {
var settingIdForPopUp by remember { mutableStateOf<Int?>(null) }
@@ -115,7 +114,7 @@
colors = getButtonColors(preferenceModel.isActive),
contentPadding = PaddingValues(0.dp)) {
DeviceSettingComposeIcon(
- preferenceModel.toggles[preferenceModel.state.selectedIndex]
+ preferenceModel.toggles[preferenceModel.selectedIndex]
.icon,
modifier = Modifier.size(24.dp))
}
@@ -144,7 +143,7 @@
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun dialog(
- multiTogglePreference: DeviceSettingModel.MultiTogglePreference,
+ multiTogglePreference: DeviceSettingPreferenceModel.MultiTogglePreference,
onDismiss: () -> Unit
) {
BasicAlertDialog(
@@ -179,7 +178,7 @@
}
@Composable
-private fun dialogContent(multiTogglePreference: DeviceSettingModel.MultiTogglePreference) {
+private fun dialogContent(multiTogglePreference: DeviceSettingPreferenceModel.MultiTogglePreference) {
Column {
Row(
modifier = Modifier.fillMaxWidth().height(24.dp),
@@ -219,7 +218,7 @@
}
Row {
for ((idx, toggle) in multiTogglePreference.toggles.withIndex()) {
- val selected = idx == multiTogglePreference.state.selectedIndex
+ val selected = idx == multiTogglePreference.selectedIndex
Column(
modifier =
Modifier.weight(1f)
@@ -237,8 +236,7 @@
) {
Button(
onClick = {
- multiTogglePreference.updateState(
- DeviceSettingStateModel.MultiTogglePreferenceState(idx))
+ multiTogglePreference.onSelectedChange(idx)
},
modifier = Modifier.fillMaxSize(),
colors =
diff --git a/src/com/android/settings/bluetooth/ui/model/DeviceSettingPreferenceModel.kt b/src/com/android/settings/bluetooth/ui/model/DeviceSettingPreferenceModel.kt
new file mode 100644
index 0000000..6612591
--- /dev/null
+++ b/src/com/android/settings/bluetooth/ui/model/DeviceSettingPreferenceModel.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2024 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.bluetooth.ui.model
+
+import com.android.settingslib.bluetooth.devicesettings.DeviceSettingId
+import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingIcon
+import com.android.settingslib.bluetooth.devicesettings.shared.model.ToggleModel
+
+/** Models a device setting preference. */
+sealed interface DeviceSettingPreferenceModel {
+ @DeviceSettingId
+ val id: Int
+
+ /** Models a plain preference. */
+ data class PlainPreference(
+ @DeviceSettingId override val id: Int,
+ val title: String,
+ val summary: String? = null,
+ val icon: DeviceSettingIcon? = null,
+ val onClick: (() -> Unit)? = null,
+ ) : DeviceSettingPreferenceModel
+
+ /** Models a switch preference. */
+ data class SwitchPreference(
+ @DeviceSettingId override val id: Int,
+ val title: String,
+ val summary: String? = null,
+ val icon: DeviceSettingIcon? = null,
+ val checked: Boolean,
+ val onCheckedChange: ((Boolean) -> Unit),
+ val onPrimaryClick: (() -> Unit)? = null,
+ ) : DeviceSettingPreferenceModel
+
+ /** Models a multi-toggle preference. */
+ data class MultiTogglePreference(
+ @DeviceSettingId override val id: Int,
+ val title: String,
+ val toggles: List<ToggleModel>,
+ val isActive: Boolean,
+ val selectedIndex: Int,
+ val isAllowedChangingState: Boolean,
+ val onSelectedChange: (Int) -> Unit,
+ ) : DeviceSettingPreferenceModel
+
+ /** Models a footer preference. */
+ data class FooterPreference(
+ @DeviceSettingId override val id: Int,
+ val footerText: String,
+ ) : DeviceSettingPreferenceModel
+
+ /** Models a preference which could navigate to more settings fragment. */
+ data class MoreSettingsPreference(
+ @DeviceSettingId override val id: Int,
+ ) : DeviceSettingPreferenceModel
+}
diff --git a/src/com/android/settings/bluetooth/ui/model/FragmentTypeModel.kt b/src/com/android/settings/bluetooth/ui/model/FragmentTypeModel.kt
new file mode 100644
index 0000000..19858c4
--- /dev/null
+++ b/src/com/android/settings/bluetooth/ui/model/FragmentTypeModel.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2024 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.bluetooth.ui.model
+
+/** Models a device details fragment type. */
+sealed interface FragmentTypeModel {
+ /** Device details main page. */
+ data object DeviceDetailsMainFragment : FragmentTypeModel
+ /** Device details more settings page. */
+ data object DeviceDetailsMoreSettingsFragment : FragmentTypeModel
+}
diff --git a/src/com/android/settings/bluetooth/ui/view/DeviceDetailsFragmentFormatter.kt b/src/com/android/settings/bluetooth/ui/view/DeviceDetailsFragmentFormatter.kt
index b75579d..c933c75 100644
--- a/src/com/android/settings/bluetooth/ui/view/DeviceDetailsFragmentFormatter.kt
+++ b/src/com/android/settings/bluetooth/ui/view/DeviceDetailsFragmentFormatter.kt
@@ -19,47 +19,52 @@
import android.bluetooth.BluetoothAdapter
import android.content.Context
import android.media.AudioManager
-import android.util.Log
+import android.os.Bundle
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
+import com.android.settings.R
import com.android.settings.SettingsPreferenceFragment
import com.android.settings.bluetooth.ui.composable.Icon
import com.android.settings.bluetooth.ui.composable.MultiTogglePreferenceGroup
import com.android.settings.bluetooth.ui.layout.DeviceSettingLayout
+import com.android.settings.bluetooth.ui.model.DeviceSettingPreferenceModel
+import com.android.settings.bluetooth.ui.model.FragmentTypeModel
+import com.android.settings.bluetooth.ui.view.DeviceDetailsMoreSettingsFragment.Companion.KEY_DEVICE_ADDRESS
import com.android.settings.bluetooth.ui.viewmodel.BluetoothDeviceDetailsViewModel
+import com.android.settings.core.SubSettingLauncher
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settings.spa.preference.ComposePreference
import com.android.settingslib.bluetooth.CachedBluetoothDevice
import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel
-import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingModel
-import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingStateModel
+import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingIcon
import com.android.settingslib.spa.framework.theme.SettingsDimension
+import com.android.settingslib.spa.widget.preference.Preference as SpaPreference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
import com.android.settingslib.spa.widget.preference.TwoTargetSwitchPreference
+import com.android.settingslib.spa.widget.ui.Footer
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
-import com.android.settingslib.spa.widget.preference.Preference as SpaPreference
-
/** Handles device details fragment layout according to config. */
interface DeviceDetailsFragmentFormatter {
/** Gets keys of visible preferences in built-in preference in xml. */
- fun getVisiblePreferenceKeysForMainPage(): List<String>?
+ fun getVisiblePreferenceKeys(fragmentType: FragmentTypeModel): List<String>?
/** Updates device details fragment layout. */
- fun updateLayout()
+ fun updateLayout(fragmentType: FragmentTypeModel)
}
@OptIn(ExperimentalCoroutinesApi::class)
@@ -79,23 +84,25 @@
ViewModelProvider(
fragment,
BluetoothDeviceDetailsViewModel.Factory(
+ fragment.requireActivity().application,
repository,
spatialAudioInteractor,
cachedDevice,
))
.get(BluetoothDeviceDetailsViewModel::class.java)
- override fun getVisiblePreferenceKeysForMainPage(): List<String>? = runBlocking {
- viewModel
- .getItems()
- ?.filterIsInstance<DeviceSettingConfigItemModel.BuiltinItem>()
- ?.mapNotNull { it.preferenceKey }
- }
+ override fun getVisiblePreferenceKeys(fragmentType: FragmentTypeModel): List<String>? =
+ runBlocking {
+ viewModel
+ .getItems(fragmentType)
+ ?.filterIsInstance<DeviceSettingConfigItemModel.BuiltinItem>()
+ ?.mapNotNull { it.preferenceKey }
+ }
/** Updates bluetooth device details fragment layout. */
- override fun updateLayout() = runBlocking {
- val items = viewModel.getItems() ?: return@runBlocking
- val layout = viewModel.getLayout() ?: return@runBlocking
+ override fun updateLayout(fragmentType: FragmentTypeModel) = runBlocking {
+ val items = viewModel.getItems(fragmentType) ?: return@runBlocking
+ val layout = viewModel.getLayout(fragmentType) ?: return@runBlocking
val prefKeyToSettingId =
items
.filterIsInstance<DeviceSettingConfigItemModel.BuiltinItem>()
@@ -124,6 +131,8 @@
fragment.preferenceScreen.addPreference(pref)
}
}
+ // TODO(b/343317785): figure out how to remove the foot preference.
+ fragment.preferenceScreen.addPreference(Preference(context).apply { order = 10000 })
}
@Composable
@@ -132,7 +141,7 @@
remember(row) {
layout.rows[row].settingIds.flatMapLatest { settingIds ->
if (settingIds.isEmpty()) {
- flowOf(emptyList<DeviceSettingModel>())
+ flowOf(emptyList<DeviceSettingPreferenceModel>())
} else {
combine(
settingIds.map { settingId ->
@@ -150,72 +159,104 @@
0 -> {}
1 -> {
when (val setting = settings[0]) {
- is DeviceSettingModel.ActionSwitchPreference -> {
- buildActionSwitchPreference(setting)
+ is DeviceSettingPreferenceModel.PlainPreference -> {
+ buildPlainPreference(setting)
}
- is DeviceSettingModel.MultiTogglePreference -> {
+ is DeviceSettingPreferenceModel.SwitchPreference -> {
+ buildSwitchPreference(setting)
+ }
+ is DeviceSettingPreferenceModel.MultiTogglePreference -> {
buildMultiTogglePreference(listOf(setting))
}
- null -> {}
- else -> {
- Log.w(TAG, "Unknown preference type ${setting.id}, skip.")
+ is DeviceSettingPreferenceModel.FooterPreference -> {
+ buildFooterPreference(setting)
}
+ is DeviceSettingPreferenceModel.MoreSettingsPreference -> {
+ buildMoreSettingsPreference()
+ }
+ null -> {}
}
}
else -> {
- if (!settings.all { it is DeviceSettingModel.MultiTogglePreference }) {
+ if (!settings.all { it is DeviceSettingPreferenceModel.MultiTogglePreference }) {
return
}
buildMultiTogglePreference(
- settings.filterIsInstance<DeviceSettingModel.MultiTogglePreference>())
+ settings.filterIsInstance<DeviceSettingPreferenceModel.MultiTogglePreference>())
}
}
}
@Composable
- private fun buildMultiTogglePreference(prefs: List<DeviceSettingModel.MultiTogglePreference>) {
+ private fun buildMultiTogglePreference(
+ prefs: List<DeviceSettingPreferenceModel.MultiTogglePreference>
+ ) {
MultiTogglePreferenceGroup(prefs)
}
@Composable
- private fun buildActionSwitchPreference(model: DeviceSettingModel.ActionSwitchPreference) {
- if (model.switchState != null) {
- val switchPrefModel =
- object : SwitchPreferenceModel {
- override val title = model.title
- override val summary = { model.summary ?: "" }
- override val checked = { model.switchState?.checked }
- override val onCheckedChange = { newChecked: Boolean ->
- model.updateState?.invoke(
- DeviceSettingStateModel.ActionSwitchPreferenceState(newChecked))
- Unit
- }
- override val icon = @Composable { deviceSettingIcon(model) }
+ private fun buildSwitchPreference(model: DeviceSettingPreferenceModel.SwitchPreference) {
+ val switchPrefModel =
+ object : SwitchPreferenceModel {
+ override val title = model.title
+ override val summary = { model.summary ?: "" }
+ override val checked = { model.checked }
+ override val onCheckedChange = { newChecked: Boolean ->
+ model.onCheckedChange(newChecked)
}
- if (model.intent != null) {
- TwoTargetSwitchPreference(switchPrefModel) { context.startActivity(model.intent) }
- } else {
- SwitchPreference(switchPrefModel)
+ override val icon = @Composable { deviceSettingIcon(model.icon) }
}
+ if (model.onPrimaryClick != null) {
+ TwoTargetSwitchPreference(
+ switchPrefModel, primaryOnClick = model.onPrimaryClick::invoke)
} else {
- SpaPreference(
- object : PreferenceModel {
- override val title = model.title
- override val summary = { model.summary ?: "" }
- override val onClick = {
- model.intent?.let { context.startActivity(it) }
- Unit
- }
- override val icon = @Composable { deviceSettingIcon(model) }
- })
+ SwitchPreference(switchPrefModel)
}
}
@Composable
- private fun deviceSettingIcon(model: DeviceSettingModel.ActionSwitchPreference) {
- model.icon?.let { icon ->
- Icon(icon, modifier = Modifier.size(SettingsDimension.itemIconSize))
- }
+ private fun buildPlainPreference(model: DeviceSettingPreferenceModel.PlainPreference) {
+ SpaPreference(
+ object : PreferenceModel {
+ override val title = model.title
+ override val summary = { model.summary ?: "" }
+ override val onClick = {
+ model.onClick?.invoke()
+ Unit
+ }
+ override val icon = @Composable { deviceSettingIcon(model.icon) }
+ })
+ }
+
+ @Composable
+ fun buildMoreSettingsPreference() {
+ SpaPreference(
+ object : PreferenceModel {
+ override val title =
+ stringResource(R.string.bluetooth_device_more_settings_preference_title)
+ override val summary = {
+ context.getString(R.string.bluetooth_device_more_settings_preference_summary)
+ }
+ override val onClick = {
+ SubSettingLauncher(context)
+ .setDestination(DeviceDetailsMoreSettingsFragment::class.java.name)
+ .setSourceMetricsCategory(fragment.getMetricsCategory())
+ .setArguments(
+ Bundle().apply { putString(KEY_DEVICE_ADDRESS, cachedDevice.address) })
+ .launch()
+ }
+ override val icon = @Composable { deviceSettingIcon(null) }
+ })
+ }
+
+ @Composable
+ fun buildFooterPreference(model: DeviceSettingPreferenceModel.FooterPreference) {
+ Footer(footerText = model.footerText)
+ }
+
+ @Composable
+ private fun deviceSettingIcon(icon: DeviceSettingIcon?) {
+ icon?.let { Icon(it, modifier = Modifier.size(SettingsDimension.itemIconSize)) }
}
private fun getPreferenceKey(settingId: Int) = "DEVICE_SETTING_${settingId}"
diff --git a/src/com/android/settings/bluetooth/ui/view/DeviceDetailsMoreSettingsFragment.kt b/src/com/android/settings/bluetooth/ui/view/DeviceDetailsMoreSettingsFragment.kt
new file mode 100644
index 0000000..c648a3e
--- /dev/null
+++ b/src/com/android/settings/bluetooth/ui/view/DeviceDetailsMoreSettingsFragment.kt
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2024 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.bluetooth.ui.view
+
+import android.bluetooth.BluetoothDevice
+import android.bluetooth.BluetoothManager
+import android.content.Context
+import android.os.Bundle
+import com.android.settings.R
+import com.android.settings.bluetooth.BluetoothDetailsProfilesController
+import com.android.settings.bluetooth.Utils
+import com.android.settings.bluetooth.ui.model.FragmentTypeModel
+import com.android.settings.dashboard.DashboardFragment
+import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.settingslib.core.AbstractPreferenceController
+import com.android.settingslib.core.lifecycle.LifecycleObserver
+
+class DeviceDetailsMoreSettingsFragment : DashboardFragment() {
+ private lateinit var formatter: DeviceDetailsFragmentFormatter
+ private lateinit var localBluetoothManager: LocalBluetoothManager
+ private lateinit var cachedDevice: CachedBluetoothDevice
+
+ // TODO(b/343317785): add metrics category
+ override fun getMetricsCategory(): Int = 0
+
+ override fun getPreferenceScreenResId(): Int {
+ return R.xml.bluetooth_device_more_settings_fragment
+ }
+
+ override fun addPreferenceController(controller: AbstractPreferenceController) {
+ val keys: List<String>? =
+ formatter.getVisiblePreferenceKeys(FragmentTypeModel.DeviceDetailsMoreSettingsFragment)
+ val lifecycle = settingsLifecycle
+ if (keys == null || keys.contains(controller.preferenceKey)) {
+ super.addPreferenceController(controller)
+ } else if (controller is LifecycleObserver) {
+ lifecycle.removeObserver((controller as LifecycleObserver))
+ }
+ }
+
+ private fun getCachedDevice(): CachedBluetoothDevice? {
+ val bluetoothAddress = arguments?.getString(KEY_DEVICE_ADDRESS) ?: return null
+ localBluetoothManager = Utils.getLocalBtManager(context) ?: return null
+ val remoteDevice: BluetoothDevice =
+ localBluetoothManager.bluetoothAdapter.getRemoteDevice(bluetoothAddress) ?: return null
+ return Utils.getLocalBtManager(context).cachedDeviceManager.findDevice(remoteDevice)
+ }
+
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ super.onCreatePreferences(savedInstanceState, rootKey)
+ formatter.updateLayout(FragmentTypeModel.DeviceDetailsMoreSettingsFragment)
+ }
+
+ override fun createPreferenceControllers(context: Context): List<AbstractPreferenceController> {
+ val bluetoothManager = context.getSystemService(BluetoothManager::class.java)
+ cachedDevice =
+ getCachedDevice()
+ ?: run {
+ finish()
+ return emptyList()
+ }
+ formatter =
+ featureFactory.bluetoothFeatureProvider.getDeviceDetailsFragmentFormatter(
+ requireContext(), this, bluetoothManager.adapter, cachedDevice)
+ return listOf(
+ BluetoothDetailsProfilesController(
+ context, this, localBluetoothManager, cachedDevice, settingsLifecycle))
+ }
+
+ override fun getLogTag(): String = TAG
+
+ companion object {
+ const val TAG: String = "DeviceMoreSettingsFrg"
+ const val KEY_DEVICE_ADDRESS: String = "device_address"
+ }
+}
diff --git a/src/com/android/settings/bluetooth/ui/viewmodel/BluetoothDeviceDetailsViewModel.kt b/src/com/android/settings/bluetooth/ui/viewmodel/BluetoothDeviceDetailsViewModel.kt
index befff83..c85015c 100644
--- a/src/com/android/settings/bluetooth/ui/viewmodel/BluetoothDeviceDetailsViewModel.kt
+++ b/src/com/android/settings/bluetooth/ui/viewmodel/BluetoothDeviceDetailsViewModel.kt
@@ -16,17 +16,22 @@
package com.android.settings.bluetooth.ui.viewmodel
+import android.app.Application
+import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.android.settings.bluetooth.domain.interactor.SpatialAudioInteractor
import com.android.settings.bluetooth.ui.layout.DeviceSettingLayout
import com.android.settings.bluetooth.ui.layout.DeviceSettingLayoutRow
+import com.android.settings.bluetooth.ui.model.DeviceSettingPreferenceModel
+import com.android.settings.bluetooth.ui.model.FragmentTypeModel
import com.android.settingslib.bluetooth.CachedBluetoothDevice
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingId
import com.android.settingslib.bluetooth.devicesettings.data.repository.DeviceSettingRepository
import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel
import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingModel
+import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingStateModel
import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
@@ -38,30 +43,81 @@
import kotlinx.coroutines.flow.stateIn
class BluetoothDeviceDetailsViewModel(
+ private val application: Application,
private val deviceSettingRepository: DeviceSettingRepository,
private val spatialAudioInteractor: SpatialAudioInteractor,
private val cachedDevice: CachedBluetoothDevice,
-) : ViewModel() {
+) : AndroidViewModel(application){
+
private val items =
viewModelScope.async(Dispatchers.IO, start = CoroutineStart.LAZY) {
deviceSettingRepository.getDeviceSettingsConfig(cachedDevice)
}
- suspend fun getItems(): List<DeviceSettingConfigItemModel>? = items.await()?.mainItems
+ suspend fun getItems(fragment: FragmentTypeModel): List<DeviceSettingConfigItemModel>? =
+ when (fragment) {
+ is FragmentTypeModel.DeviceDetailsMainFragment -> items.await()?.mainItems
+ is FragmentTypeModel.DeviceDetailsMoreSettingsFragment ->
+ items.await()?.moreSettingsItems
+ }
fun getDeviceSetting(
cachedDevice: CachedBluetoothDevice,
@DeviceSettingId settingId: Int
- ): Flow<DeviceSettingModel?> {
+ ): Flow<DeviceSettingPreferenceModel?> {
+ if (settingId == DeviceSettingId.DEVICE_SETTING_ID_MORE_SETTINGS) {
+ return flowOf(DeviceSettingPreferenceModel.MoreSettingsPreference(settingId))
+ }
return when (settingId) {
DeviceSettingId.DEVICE_SETTING_ID_SPATIAL_AUDIO_MULTI_TOGGLE ->
spatialAudioInteractor.getDeviceSetting(cachedDevice)
else -> deviceSettingRepository.getDeviceSetting(cachedDevice, settingId)
+ }.map { it?.toPreferenceModel() }
+ }
+
+ private fun DeviceSettingModel.toPreferenceModel(): DeviceSettingPreferenceModel? {
+ return when (this) {
+ is DeviceSettingModel.ActionSwitchPreference -> {
+ if (switchState != null) {
+ DeviceSettingPreferenceModel.SwitchPreference(
+ id = id,
+ title = title,
+ summary = summary,
+ icon = icon,
+ checked = switchState?.checked ?: false,
+ onCheckedChange = { newState ->
+ updateState?.invoke(
+ DeviceSettingStateModel.ActionSwitchPreferenceState(newState))
+ },
+ onPrimaryClick = { intent?.let { application.startActivity(it) } })
+ } else {
+ DeviceSettingPreferenceModel.PlainPreference(
+ id = id,
+ title = title,
+ summary = summary,
+ icon = icon,
+ onClick = { intent?.let { application.startActivity(it) } })
+ }
+ }
+ is DeviceSettingModel.FooterPreference ->
+ DeviceSettingPreferenceModel.FooterPreference(id = id, footerText = footerText)
+ is DeviceSettingModel.MultiTogglePreference ->
+ DeviceSettingPreferenceModel.MultiTogglePreference(
+ id = id,
+ title = title,
+ toggles = toggles,
+ isActive = isActive,
+ selectedIndex = state.selectedIndex,
+ isAllowedChangingState = isAllowedChangingState,
+ onSelectedChange = { newState ->
+ updateState(DeviceSettingStateModel.MultiTogglePreferenceState(newState))
+ })
+ is DeviceSettingModel.Unknown -> null
}
}
- suspend fun getLayout(): DeviceSettingLayout? {
- val configItems = getItems() ?: return null
+ suspend fun getLayout(fragment: FragmentTypeModel): DeviceSettingLayout? {
+ val configItems = getItems(fragment) ?: return null
val idToDeviceSetting =
configItems
.filterIsInstance<DeviceSettingConfigItemModel.AppProvidedItem>()
@@ -80,7 +136,7 @@
if (!isXmlPreference && setting == null) {
continue
}
- if (setting !is DeviceSettingModel.MultiTogglePreference) {
+ if (setting !is DeviceSettingPreferenceModel.MultiTogglePreference) {
multiToggleSettingIds = null
positionMapping[i] = listOf(configItem.settingId)
continue
@@ -103,6 +159,7 @@
}
class Factory(
+ private val application: Application,
private val deviceSettingRepository: DeviceSettingRepository,
private val spatialAudioInteractor: SpatialAudioInteractor,
private val cachedDevice: CachedBluetoothDevice,
@@ -110,7 +167,7 @@
override fun <T : ViewModel> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return BluetoothDeviceDetailsViewModel(
- deviceSettingRepository, spatialAudioInteractor, cachedDevice)
+ application, deviceSettingRepository, spatialAudioInteractor, cachedDevice)
as T
}
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java
index 8396e48..a802132 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java
@@ -43,6 +43,7 @@
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
+import com.android.settings.R;
import com.android.settings.bluetooth.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
@@ -128,6 +129,8 @@
+ ", broadcastId = "
+ broadcastId);
updateSwitch();
+ AudioSharingUtils.toastMessage(
+ mContext, mContext.getString(R.string.audio_sharing_sharing_label));
mListener.onAudioSharingStateChanged();
}
@@ -161,6 +164,9 @@
+ ", broadcastId = "
+ broadcastId);
updateSwitch();
+ AudioSharingUtils.toastMessage(
+ mContext,
+ mContext.getString(R.string.audio_sharing_sharing_stopped_label));
mListener.onAudioSharingStateChanged();
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialog.java b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialog.java
index 4c17a7c..958740b 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialog.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialog.java
@@ -129,6 +129,10 @@
private Dialog getUnsupportedDialog() {
return new AudioStreamsDialogFragment.DialogBuilder(getActivity())
.setTitle(getString(R.string.audio_streams_dialog_cannot_listen))
+ .setSubTitle1(
+ mBroadcastMetadata != null
+ ? AudioStreamsHelper.getBroadcastName(mBroadcastMetadata)
+ : "")
.setSubTitle2(getString(R.string.audio_streams_dialog_unsupported_device_subtitle))
.setRightButtonText(getString(R.string.audio_streams_dialog_close))
.setRightButtonOnClickListener(
diff --git a/src/com/android/settings/development/TouchpadVisualizerPreferenceController.java b/src/com/android/settings/development/TouchpadVisualizerPreferenceController.java
index f918d26..04ae92b 100644
--- a/src/com/android/settings/development/TouchpadVisualizerPreferenceController.java
+++ b/src/com/android/settings/development/TouchpadVisualizerPreferenceController.java
@@ -17,8 +17,10 @@
package com.android.settings.development;
import android.content.Context;
-import android.provider.Settings;
+import android.hardware.input.InputSettings;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;
@@ -26,23 +28,13 @@
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import android.hardware.input.InputSettings;
-
-/** PreferenceController that controls the "Touchpad visualizer" developer option. */
+/** PreferenceController that controls the "Show touchpad input" developer option. */
public class TouchpadVisualizerPreferenceController extends
DeveloperOptionsPreferenceController implements
Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
private static final String TOUCHPAD_VISUALIZER_KEY = "touchpad_visualizer";
- @VisibleForTesting
- static final int SETTING_VALUE_ON = 1;
- @VisibleForTesting
- static final int SETTING_VALUE_OFF = 0;
-
public TouchpadVisualizerPreferenceController(@NonNull Context context) {
super(context);
}
@@ -60,24 +52,22 @@
@Override
public boolean onPreferenceChange(@NonNull Preference preference, @Nullable Object newValue) {
final boolean isEnabled = newValue != null ? (Boolean) newValue : false;
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.TOUCHPAD_VISUALIZER,
- isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
+ InputSettings.setTouchpadVisualizer(mContext, isEnabled);
+
return true;
}
@Override
public void updateState(@NonNull Preference preference) {
- int touchpadVisualizer = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.TOUCHPAD_VISUALIZER, SETTING_VALUE_OFF);
- ((SwitchPreference) mPreference).setChecked(touchpadVisualizer != SETTING_VALUE_OFF);
+ boolean touchpadVisualizerEnabled = InputSettings.useTouchpadVisualizer(mContext);
+ ((SwitchPreference) mPreference).setChecked(touchpadVisualizerEnabled);
}
@Override
protected void onDeveloperOptionsSwitchDisabled() {
super.onDeveloperOptionsSwitchDisabled();
- Settings.System.putInt(mContext.getContentResolver(), Settings.System.TOUCHPAD_VISUALIZER,
- SETTING_VALUE_OFF);
+ InputSettings.setTouchpadVisualizer(mContext, false);
+
((SwitchPreference) mPreference).setChecked(false);
}
}
\ No newline at end of file
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 7bbb06a..e922f70 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -278,16 +278,17 @@
super.onPause();
final int currentOptimizeMode = mBatteryOptimizeUtils.getAppOptimizationMode();
+ final Context applicationContext = requireContext().getApplicationContext();
mLogStringBuilder.append(", onPause mode = ").append(currentOptimizeMode);
logMetricCategory(currentOptimizeMode);
mExecutor.execute(
() -> {
if (currentOptimizeMode != mOptimizationMode) {
AppOptModeSharedPreferencesUtils.deleteAppOptimizationModeEventByUid(
- getContext(), mBatteryOptimizeUtils.getUid());
+ applicationContext, mBatteryOptimizeUtils.getUid());
}
BatteryOptimizeLogUtils.writeLog(
- getContext().getApplicationContext(),
+ applicationContext,
Action.LEAVE,
BatteryOptimizeLogUtils.getPackageNameWithUserId(
mBatteryOptimizeUtils.getPackageName(), UserHandle.myUserId()),
diff --git a/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java b/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java
index 2d2c838..e59cc4ad 100644
--- a/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java
@@ -117,17 +117,17 @@
super.onPause();
final int currentOptimizeMode = mBatteryOptimizeUtils.getAppOptimizationMode();
+ final Context applicationContext = requireContext().getApplicationContext();
mLogStringBuilder.append(", onPause mode = ").append(currentOptimizeMode);
logMetricCategory(currentOptimizeMode);
-
mExecutor.execute(
() -> {
if (currentOptimizeMode != mOptimizationMode) {
AppOptModeSharedPreferencesUtils.deleteAppOptimizationModeEventByUid(
- getContext(), mBatteryOptimizeUtils.getUid());
+ applicationContext, mBatteryOptimizeUtils.getUid());
}
BatteryOptimizeLogUtils.writeLog(
- getContext().getApplicationContext(),
+ applicationContext,
Action.LEAVE,
BatteryOptimizeLogUtils.getPackageNameWithUserId(
mBatteryOptimizeUtils.getPackageName(), UserHandle.myUserId()),
diff --git a/src/com/android/settings/network/ims/ImsQueryProvisioningStat.java b/src/com/android/settings/network/ims/ImsQueryProvisioningStat.java
index 44c4519..a43fda0 100644
--- a/src/com/android/settings/network/ims/ImsQueryProvisioningStat.java
+++ b/src/com/android/settings/network/ims/ImsQueryProvisioningStat.java
@@ -56,7 +56,7 @@
final ProvisioningManager privisionManager =
ProvisioningManager.createForSubscriptionId(mSubId);
return privisionManager.getProvisioningStatusForCapability(mCapability, mTech);
- } catch (IllegalArgumentException exception) {
+ } catch (UnsupportedOperationException exception) {
Log.w(LOG_TAG, "fail to get Provisioning stat. subId=" + mSubId, exception);
}
return false;
diff --git a/src/com/android/settings/network/telephony/CarrierConfigRepository.kt b/src/com/android/settings/network/telephony/CarrierConfigRepository.kt
index 3ec529d..3f5c06e 100644
--- a/src/com/android/settings/network/telephony/CarrierConfigRepository.kt
+++ b/src/com/android/settings/network/telephony/CarrierConfigRepository.kt
@@ -199,7 +199,7 @@
}
@VisibleForTesting
- fun setStringForTest(subId: Int, key: String, value: String) {
+ fun setStringForTest(subId: Int, key: String, value: String?) {
check(key.endsWith("_string")) { "String key should ends with _string" }
getPerSubCache(subId)[key] = StringConfigValue(value)
}
diff --git a/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.java b/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.java
deleted file mode 100644
index 575d19c..0000000
--- a/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2019 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.network.telephony;
-
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.text.TextUtils;
-
-import com.android.settings.core.BasePreferenceController;
-import com.android.settings.network.CarrierConfigCache;
-
-public class CarrierSettingsVersionPreferenceController extends BasePreferenceController {
-
- private int mSubscriptionId;
- private CarrierConfigCache mCarrierConfigCache;
-
- public CarrierSettingsVersionPreferenceController(Context context, String preferenceKey) {
- super(context, preferenceKey);
- mCarrierConfigCache = CarrierConfigCache.getInstance(context);
- mSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
- }
-
- public void init(int subscriptionId) {
- mSubscriptionId = subscriptionId;
- }
-
- @Override
- public CharSequence getSummary() {
- final PersistableBundle config = mCarrierConfigCache.getConfigForSubId(mSubscriptionId);
- if (config == null) {
- return null;
- }
- return config.getString(CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING);
- }
-
- @Override
- public int getAvailabilityStatus() {
- return TextUtils.isEmpty(getSummary()) ? UNSUPPORTED_ON_DEVICE : AVAILABLE;
- }
-}
diff --git a/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.kt b/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.kt
new file mode 100644
index 0000000..f949ab8
--- /dev/null
+++ b/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2024 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.network.telephony
+
+import android.content.Context
+import android.telephony.CarrierConfigManager
+import android.telephony.SubscriptionManager
+import com.android.settings.R
+import com.android.settings.core.BasePreferenceController
+import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem
+import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchResult
+
+class CarrierSettingsVersionPreferenceController(context: Context, preferenceKey: String) :
+ BasePreferenceController(context, preferenceKey) {
+
+ private var subId: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ private val searchItem = CarrierSettingsVersionSearchItem(context)
+
+ fun init(subId: Int) {
+ this.subId = subId
+ }
+
+ override fun getSummary() = searchItem.getSummary(subId)
+
+ override fun getAvailabilityStatus() =
+ if (searchItem.isAvailable(subId)) AVAILABLE else CONDITIONALLY_UNAVAILABLE
+
+ companion object {
+ class CarrierSettingsVersionSearchItem(private val context: Context) :
+ MobileNetworkSettingsSearchItem {
+ private val carrierConfigRepository = CarrierConfigRepository(context)
+
+ fun getSummary(subId: Int): String? =
+ carrierConfigRepository.getString(
+ subId, CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING)
+
+ fun isAvailable(subId: Int): Boolean = !getSummary(subId).isNullOrEmpty()
+
+ override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? {
+ if (!isAvailable(subId)) return null
+ return MobileNetworkSettingsSearchResult(
+ key = "carrier_settings_version_key",
+ title = context.getString(R.string.carrier_settings_version),
+ )
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt b/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt
index 55cb1fa..c63e7d2 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt
@@ -21,6 +21,7 @@
import android.telephony.SubscriptionInfo
import com.android.settings.R
import com.android.settings.network.SubscriptionUtil
+import com.android.settings.network.telephony.CarrierSettingsVersionPreferenceController.Companion.CarrierSettingsVersionSearchItem
import com.android.settings.network.telephony.DataUsagePreferenceController.Companion.DataUsageSearchItem
import com.android.settings.network.telephony.MmsMessagePreferenceController.Companion.MmsMessageSearchItem
import com.android.settings.network.telephony.NrAdvancedCallingPreferenceController.Companion.NrAdvancedCallingSearchItem
@@ -115,6 +116,7 @@
fun createSearchItems(context: Context): List<MobileNetworkSettingsSearchItem> =
listOf(
+ CarrierSettingsVersionSearchItem(context),
DataUsageSearchItem(context),
MmsMessageSearchItem(context),
NrAdvancedCallingSearchItem(context),
diff --git a/src/com/android/settings/network/telephony/ims/ImsFeatureRepository.kt b/src/com/android/settings/network/telephony/ims/ImsFeatureRepository.kt
new file mode 100644
index 0000000..ba33257
--- /dev/null
+++ b/src/com/android/settings/network/telephony/ims/ImsFeatureRepository.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 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.network.telephony.ims
+
+import android.content.Context
+import android.telephony.AccessNetworkConstants.TransportType
+import android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability
+import android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationTech
+import com.android.settings.network.telephony.subscriptionsChangedFlow
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.flatMapLatest
+
+/**
+ * A repository for the IMS feature.
+ *
+ * @throws IllegalArgumentException if the [subId] is invalid.
+ */
+@OptIn(ExperimentalCoroutinesApi::class)
+class ImsFeatureRepository(
+ private val context: Context,
+ private val subId: Int,
+ private val provisioningRepository: ProvisioningRepository = ProvisioningRepository(context),
+ private val imsMmTelRepository: ImsMmTelRepository = ImsMmTelRepositoryImpl(context, subId)
+) {
+ /**
+ * A cold flow that determines the provisioning status for the specified IMS MmTel capability,
+ * and whether or not the requested MmTel capability is supported by the carrier on the
+ * specified network transport.
+ *
+ * @return true if the feature is provisioned and supported, false otherwise.
+ */
+ fun isReadyFlow(
+ @MmTelCapability capability: Int,
+ @ImsRegistrationTech tech: Int,
+ @TransportType transportType: Int,
+ ): Flow<Boolean> =
+ context.subscriptionsChangedFlow().flatMapLatest {
+ combine(
+ provisioningRepository.imsFeatureProvisionedFlow(subId, capability, tech),
+ imsMmTelRepository.isSupportedFlow(capability, transportType),
+ ) { imsFeatureProvisioned, isSupported ->
+ imsFeatureProvisioned && isSupported
+ }
+ }
+}
diff --git a/src/com/android/settings/network/telephony/ims/ImsMmTelRepository.kt b/src/com/android/settings/network/telephony/ims/ImsMmTelRepository.kt
index 9bc10e5..c5d1200 100644
--- a/src/com/android/settings/network/telephony/ims/ImsMmTelRepository.kt
+++ b/src/com/android/settings/network/telephony/ims/ImsMmTelRepository.kt
@@ -36,6 +36,7 @@
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.map
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext
@@ -47,6 +48,11 @@
fun imsReadyFlow(): Flow<Boolean>
+ fun isSupportedFlow(
+ @MmTelFeature.MmTelCapabilities.MmTelCapability capability: Int,
+ @AccessNetworkConstants.TransportType transportType: Int,
+ ): Flow<Boolean>
+
suspend fun isSupported(
@MmTelFeature.MmTelCapabilities.MmTelCapability capability: Int,
@AccessNetworkConstants.TransportType transportType: Int,
@@ -55,6 +61,11 @@
suspend fun setCrossSimCallingEnabled(enabled: Boolean)
}
+/**
+ * A repository for the IMS MMTel.
+ *
+ * @throws IllegalArgumentException if the [subId] is invalid.
+ */
class ImsMmTelRepositoryImpl(
context: Context,
private val subId: Int,
@@ -126,8 +137,12 @@
awaitClose { imsMmTelManager.unregisterImsStateCallback(callback) }
}.catch { e ->
Log.w(TAG, "[$subId] error while imsReadyFlow", e)
+ emit(false)
}.conflate().flowOn(Dispatchers.Default)
+ override fun isSupportedFlow(capability: Int, transportType: Int): Flow<Boolean> =
+ imsReadyFlow().map { imsReady -> imsReady && isSupported(capability, transportType) }
+
override suspend fun isSupported(
@MmTelFeature.MmTelCapabilities.MmTelCapability capability: Int,
@AccessNetworkConstants.TransportType transportType: Int,
diff --git a/src/com/android/settings/network/telephony/wificalling/WifiCallingRepository.kt b/src/com/android/settings/network/telephony/wificalling/WifiCallingRepository.kt
index 04e687c..6af0559 100644
--- a/src/com/android/settings/network/telephony/wificalling/WifiCallingRepository.kt
+++ b/src/com/android/settings/network/telephony/wificalling/WifiCallingRepository.kt
@@ -20,24 +20,17 @@
import android.telephony.AccessNetworkConstants
import android.telephony.CarrierConfigManager
import android.telephony.CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL
-import android.telephony.SubscriptionManager
import android.telephony.ims.ImsMmTelManager.WiFiCallingMode
import android.telephony.ims.feature.MmTelFeature
import android.telephony.ims.stub.ImsRegistrationImplBase
import androidx.lifecycle.LifecycleOwner
+import com.android.settings.network.telephony.ims.ImsFeatureRepository
import com.android.settings.network.telephony.ims.ImsMmTelRepository
import com.android.settings.network.telephony.ims.ImsMmTelRepositoryImpl
-import com.android.settings.network.telephony.ims.ProvisioningRepository
-import com.android.settings.network.telephony.subscriptionsChangedFlow
import com.android.settings.network.telephony.telephonyManager
import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.flatMapLatest
-import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
interface IWifiCallingRepository {
@@ -50,11 +43,11 @@
constructor(
private val context: Context,
private val subId: Int,
- private val imsMmTelRepository: ImsMmTelRepository = ImsMmTelRepositoryImpl(context, subId)
+ private val imsFeatureRepository: ImsFeatureRepository = ImsFeatureRepository(context, subId),
+ private val imsMmTelRepository: ImsMmTelRepository = ImsMmTelRepositoryImpl(context, subId),
) : IWifiCallingRepository {
private val telephonyManager = context.telephonyManager(subId)
- private val provisioningRepository = ProvisioningRepository(context)
private val carrierConfigManager = context.getSystemService(CarrierConfigManager::class.java)!!
@WiFiCallingMode
@@ -76,28 +69,12 @@
wifiCallingReadyFlow().collectLatestWithLifecycle(lifecycleOwner, action = action)
}
- @OptIn(ExperimentalCoroutinesApi::class)
- fun wifiCallingReadyFlow(): Flow<Boolean> {
- if (!SubscriptionManager.isValidSubscriptionId(subId)) return flowOf(false)
- return context.subscriptionsChangedFlow().flatMapLatest {
- combine(
- provisioningRepository.imsFeatureProvisionedFlow(
- subId = subId,
- capability = MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
- tech = ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN,
- ),
- isWifiCallingSupportedFlow(),
- ) { imsFeatureProvisioned, isWifiCallingSupported ->
- imsFeatureProvisioned && isWifiCallingSupported
- }
- }
- }
-
- private fun isWifiCallingSupportedFlow(): Flow<Boolean> {
- return imsMmTelRepository.imsReadyFlow().map { imsReady ->
- imsReady && isWifiCallingSupported()
- }
- }
+ fun wifiCallingReadyFlow(): Flow<Boolean> =
+ imsFeatureRepository.isReadyFlow(
+ capability = MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+ tech = ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN,
+ transportType = AccessNetworkConstants.TRANSPORT_TYPE_WLAN,
+ )
suspend fun isWifiCallingSupported(): Boolean = withContext(Dispatchers.Default) {
imsMmTelRepository.isSupported(
diff --git a/src/com/android/settings/notification/modes/InterruptionFilterPreferenceController.java b/src/com/android/settings/notification/modes/InterruptionFilterPreferenceController.java
index 9d4a172..d69b317 100644
--- a/src/com/android/settings/notification/modes/InterruptionFilterPreferenceController.java
+++ b/src/com/android/settings/notification/modes/InterruptionFilterPreferenceController.java
@@ -45,20 +45,21 @@
@Override
public void updateState(Preference preference, @NonNull ZenMode zenMode) {
preference.setEnabled(zenMode.isEnabled());
- boolean filteringNotifications = zenMode.getRule().getInterruptionFilter()
- != INTERRUPTION_FILTER_ALL;
- ((TwoStatePreference) preference).setChecked(filteringNotifications);
- preference.setSummary(filteringNotifications ? "" :
- mContext.getResources().getString(R.string.mode_no_notification_filter));
+ boolean allowingAll = zenMode.getRule().getInterruptionFilter() == INTERRUPTION_FILTER_ALL;
+
+ ((TwoStatePreference) preference).setChecked(allowingAll);
+ preference.setSummary(allowingAll
+ ? mContext.getString(R.string.zen_mode_all_notifications_allowed)
+ : "");
}
@Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- final boolean filterNotifications = ((Boolean) newValue);
+ public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
+ final boolean allowAll = ((Boolean) newValue);
return saveMode(zenMode -> {
- zenMode.getRule().setInterruptionFilter(filterNotifications
- ? INTERRUPTION_FILTER_PRIORITY
- : INTERRUPTION_FILTER_ALL);
+ zenMode.getRule().setInterruptionFilter(allowAll
+ ? INTERRUPTION_FILTER_ALL
+ : INTERRUPTION_FILTER_PRIORITY);
return zenMode;
});
}
diff --git a/src/com/android/settings/notification/modes/ZenModeFragment.java b/src/com/android/settings/notification/modes/ZenModeFragment.java
index 3777299..6889cac 100644
--- a/src/com/android/settings/notification/modes/ZenModeFragment.java
+++ b/src/com/android/settings/notification/modes/ZenModeFragment.java
@@ -77,7 +77,7 @@
new ZenModeTriggerAddPreferenceController(context, "zen_add_automatic_trigger",
this, mBackend));
prefControllers.add(new InterruptionFilterPreferenceController(
- context, "allow_filtering", mBackend));
+ context, "allow_all", mBackend));
prefControllers.add(new ManualDurationPreferenceController(
context, "mode_manual_duration", this, mBackend));
return prefControllers;
@@ -110,9 +110,10 @@
if (mode == null || mode.getStatus() != DISABLED_BY_OTHER) {
return false;
}
+
+ mContext.startActivity(SetupInterstitialActivity.getIntent(mContext, mode));
// don't come back here from the interstitial
finish();
- mContext.startActivity(SetupInterstitialActivity.getIntent(mContext, mode));
return true;
}
diff --git a/src/com/android/settings/notification/zen/ZenAccessSettings.java b/src/com/android/settings/notification/zen/ZenAccessSettings.java
index f765d6d..4b598db 100644
--- a/src/com/android/settings/notification/zen/ZenAccessSettings.java
+++ b/src/com/android/settings/notification/zen/ZenAccessSettings.java
@@ -16,6 +16,7 @@
package com.android.settings.notification.zen;
+import android.app.Flags;
import android.app.NotificationManager;
import android.app.settings.SettingsEnums;
import android.content.Context;
@@ -68,6 +69,9 @@
mContext = getActivity();
mPkgMan = mContext.getPackageManager();
mNoMan = mContext.getSystemService(NotificationManager.class);
+ requireActivity().setTitle(Flags.modesApi() && Flags.modesUi()
+ ? R.string.manage_zen_modes_access_title
+ : R.string.manage_zen_access_title);
getSettingsLifecycle().addObserver(
new ZenAccessSettingObserverMixin(getContext(), this /* listener */));
}
@@ -75,7 +79,9 @@
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- setEmptyText(R.string.zen_access_empty_text);
+ setEmptyText(Flags.modesApi() && Flags.modesUi()
+ ? R.string.zen_modes_access_empty_text
+ : R.string.zen_access_empty_text);
}
@Override
@@ -139,7 +145,9 @@
pref.setOnPreferenceClickListener(preference -> {
AppInfoBase.startAppInfoFragment(
ZenAccessDetails.class /* fragment */,
- getString(R.string.manage_zen_access_title) /* titleRes */,
+ getString(Flags.modesApi() && Flags.modesUi()
+ ? R.string.manage_zen_modes_access_title
+ : R.string.manage_zen_access_title),
pkg,
app.uid,
this /* source */,
@@ -154,7 +162,7 @@
/**
* @return the summary for the current state of whether the app associated with the given
- * {@param packageName} is allowed to enter picture-in-picture.
+ * {@param packageName} is allowed to manage DND / Priority Modes.
*/
private int getPreferenceSummary(String packageName) {
final boolean enabled = ZenAccessController.hasAccess(getContext(), packageName);
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
index 19d0edd..c84d42c 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
@@ -50,6 +50,7 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.bluetooth.ui.model.FragmentTypeModel;
import com.android.settings.bluetooth.ui.view.DeviceDetailsFragmentFormatter;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -117,7 +118,9 @@
FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest();
when(fakeFeatureFactory.mBluetoothFeatureProvider.getDeviceDetailsFragmentFormatter(any(),
any(), any(), eq(mCachedDevice))).thenReturn(mFormatter);
- when(mFormatter.getVisiblePreferenceKeysForMainPage()).thenReturn(null);
+ when(mFormatter.getVisiblePreferenceKeys(
+ FragmentTypeModel.DeviceDetailsMainFragment.INSTANCE))
+ .thenReturn(null);
mFragment = setupFragment();
mFragment.onAttach(mContext);
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ui/view/DeviceDetailsFragmentFormatterTest.kt b/tests/robotests/src/com/android/settings/bluetooth/ui/view/DeviceDetailsFragmentFormatterTest.kt
index 609d767..251b814 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/ui/view/DeviceDetailsFragmentFormatterTest.kt
+++ b/tests/robotests/src/com/android/settings/bluetooth/ui/view/DeviceDetailsFragmentFormatterTest.kt
@@ -26,6 +26,7 @@
import androidx.preference.PreferenceScreen
import androidx.test.core.app.ApplicationProvider
import com.android.settings.bluetooth.domain.interactor.SpatialAudioInteractor
+import com.android.settings.bluetooth.ui.model.FragmentTypeModel
import com.android.settings.dashboard.DashboardFragment
import com.android.settings.testutils.FakeFeatureFactory
import com.android.settingslib.bluetooth.CachedBluetoothDevice
@@ -45,7 +46,6 @@
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito.any
@@ -111,10 +111,9 @@
DeviceSettingConfigItemModel.BuiltinItem(
DeviceSettingId.DEVICE_SETTING_ID_ACTION_BUTTONS, "action_buttons"),
),
- listOf(),
- "footer"))
+ listOf()))
- val keys = underTest.getVisiblePreferenceKeysForMainPage()
+ val keys = underTest.getVisiblePreferenceKeys(FragmentTypeModel.DeviceDetailsMainFragment)
assertThat(keys).containsExactly("bluetooth_device_header", "action_buttons")
}
@@ -125,7 +124,7 @@
testScope.runTest {
`when`(repository.getDeviceSettingsConfig(cachedDevice)).thenReturn(null)
- val keys = underTest.getVisiblePreferenceKeysForMainPage()
+ val keys = underTest.getVisiblePreferenceKeys(FragmentTypeModel.DeviceDetailsMainFragment)
assertThat(keys).isNull()
}
@@ -136,9 +135,9 @@
testScope.runTest {
`when`(repository.getDeviceSettingsConfig(cachedDevice)).thenReturn(null)
- underTest.updateLayout()
+ underTest.updateLayout(FragmentTypeModel.DeviceDetailsMainFragment)
- assertThat(getDisplayedPreferences().map { it.key })
+ assertThat(getDisplayedPreferences().mapNotNull { it.key })
.containsExactly("bluetooth_device_header", "action_buttons", "keyboard_settings")
}
}
@@ -157,12 +156,11 @@
DeviceSettingId.DEVICE_SETTING_ID_KEYBOARD_SETTINGS,
"keyboard_settings"),
),
- listOf(),
- "footer"))
+ listOf()))
- underTest.updateLayout()
+ underTest.updateLayout(FragmentTypeModel.DeviceDetailsMainFragment)
- assertThat(getDisplayedPreferences().map { it.key })
+ assertThat(getDisplayedPreferences().mapNotNull { it.key })
.containsExactly("bluetooth_device_header", "keyboard_settings")
}
}
@@ -183,8 +181,7 @@
DeviceSettingId.DEVICE_SETTING_ID_KEYBOARD_SETTINGS,
"keyboard_settings"),
),
- listOf(),
- "footer"))
+ listOf()))
`when`(repository.getDeviceSetting(cachedDevice, DeviceSettingId.DEVICE_SETTING_ID_ANC))
.thenReturn(
flowOf(
@@ -209,9 +206,9 @@
isAllowedChangingState = true,
updateState = {})))
- underTest.updateLayout()
+ underTest.updateLayout(FragmentTypeModel.DeviceDetailsMainFragment)
- assertThat(getDisplayedPreferences().map { it.key })
+ assertThat(getDisplayedPreferences().mapNotNull { it.key })
.containsExactly(
"bluetooth_device_header",
"DEVICE_SETTING_${DeviceSettingId.DEVICE_SETTING_ID_ANC}",
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ui/viewmodel/BluetoothDeviceDetailsViewModelTest.kt b/tests/robotests/src/com/android/settings/bluetooth/ui/viewmodel/BluetoothDeviceDetailsViewModelTest.kt
index a1fadb8..378f363 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/ui/viewmodel/BluetoothDeviceDetailsViewModelTest.kt
+++ b/tests/robotests/src/com/android/settings/bluetooth/ui/viewmodel/BluetoothDeviceDetailsViewModelTest.kt
@@ -16,12 +16,14 @@
package com.android.settings.bluetooth.ui.viewmodel
+import android.app.Application
import android.bluetooth.BluetoothAdapter
-import android.content.Context
import android.graphics.Bitmap
import androidx.test.core.app.ApplicationProvider
import com.android.settings.bluetooth.domain.interactor.SpatialAudioInteractor
import com.android.settings.bluetooth.ui.layout.DeviceSettingLayout
+import com.android.settings.bluetooth.ui.model.DeviceSettingPreferenceModel
+import com.android.settings.bluetooth.ui.model.FragmentTypeModel
import com.android.settings.testutils.FakeFeatureFactory
import com.android.settingslib.bluetooth.CachedBluetoothDevice
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingId
@@ -44,8 +46,6 @@
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.any
-import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
@@ -73,26 +73,23 @@
@Before
fun setUp() {
- val context = ApplicationProvider.getApplicationContext<Context>()
+ val application = ApplicationProvider.getApplicationContext<Application>()
featureFactory = FakeFeatureFactory.setupForTest()
- `when`(
- featureFactory.bluetoothFeatureProvider.getDeviceSettingRepository(
- eq(context), eq(bluetoothAdapter), any()))
- .thenReturn(repository)
underTest =
- BluetoothDeviceDetailsViewModel(repository, spatialAudioInteractor, cachedDevice)
+ BluetoothDeviceDetailsViewModel(
+ application, repository, spatialAudioInteractor, cachedDevice)
}
@Test
- fun getItems_returnConfigMainItems() {
+ fun getItems_returnConfigMainMainItems() {
testScope.runTest {
`when`(repository.getDeviceSettingsConfig(cachedDevice))
.thenReturn(
DeviceSettingConfigModel(
- listOf(BUILTIN_SETTING_ITEM_1, BUILDIN_SETTING_ITEM_2), listOf(), "footer"))
+ listOf(BUILTIN_SETTING_ITEM_1, BUILDIN_SETTING_ITEM_2), listOf()))
- val keys = underTest.getItems()
+ val keys = underTest.getItems(FragmentTypeModel.DeviceDetailsMainFragment)
assertThat(keys).containsExactly(BUILTIN_SETTING_ITEM_1, BUILDIN_SETTING_ITEM_2)
}
@@ -110,19 +107,18 @@
BUILTIN_SETTING_ITEM_1,
buildRemoteSettingItem(remoteSettingId1),
),
- listOf(),
- "footer"))
+ listOf()))
`when`(repository.getDeviceSetting(cachedDevice, remoteSettingId1))
.thenReturn(flowOf(pref))
- var deviceSetting: DeviceSettingModel? = null
+ var deviceSettingPreference: DeviceSettingPreferenceModel? = null
underTest
.getDeviceSetting(cachedDevice, remoteSettingId1)
- .onEach { deviceSetting = it }
+ .onEach { deviceSettingPreference = it }
.launchIn(testScope.backgroundScope)
runCurrent()
- assertThat(deviceSetting).isSameInstanceAs(pref)
+ assertThat(deviceSettingPreference?.id).isEqualTo(pref.id)
verify(repository, times(1)).getDeviceSetting(cachedDevice, remoteSettingId1)
}
}
@@ -141,19 +137,18 @@
buildRemoteSettingItem(
DeviceSettingId.DEVICE_SETTING_ID_SPATIAL_AUDIO_MULTI_TOGGLE),
),
- listOf(),
- "footer"))
+ listOf()))
`when`(spatialAudioInteractor.getDeviceSetting(cachedDevice)).thenReturn(flowOf(pref))
- var deviceSetting: DeviceSettingModel? = null
+ var deviceSettingPreference: DeviceSettingPreferenceModel? = null
underTest
.getDeviceSetting(
cachedDevice, DeviceSettingId.DEVICE_SETTING_ID_SPATIAL_AUDIO_MULTI_TOGGLE)
- .onEach { deviceSetting = it }
+ .onEach { deviceSettingPreference = it }
.launchIn(testScope.backgroundScope)
runCurrent()
- assertThat(deviceSetting).isSameInstanceAs(pref)
+ assertThat(deviceSettingPreference?.id).isEqualTo(pref.id)
verify(spatialAudioInteractor, times(1)).getDeviceSetting(cachedDevice)
}
}
@@ -164,9 +159,9 @@
`when`(repository.getDeviceSettingsConfig(cachedDevice))
.thenReturn(
DeviceSettingConfigModel(
- listOf(BUILTIN_SETTING_ITEM_1, BUILDIN_SETTING_ITEM_2), listOf(), "footer"))
+ listOf(BUILTIN_SETTING_ITEM_1, BUILDIN_SETTING_ITEM_2), listOf()))
- val layout = underTest.getLayout()!!
+ val layout = underTest.getLayout(FragmentTypeModel.DeviceDetailsMainFragment)!!
assertThat(getLatestLayout(layout))
.isEqualTo(
@@ -191,8 +186,7 @@
buildRemoteSettingItem(remoteSettingId2),
buildRemoteSettingItem(remoteSettingId3),
),
- listOf(),
- "footer"))
+ listOf()))
`when`(repository.getDeviceSetting(cachedDevice, remoteSettingId1))
.thenReturn(flowOf(buildMultiTogglePreference(remoteSettingId1)))
`when`(repository.getDeviceSetting(cachedDevice, remoteSettingId2))
@@ -200,7 +194,7 @@
`when`(repository.getDeviceSetting(cachedDevice, remoteSettingId3))
.thenReturn(flowOf(buildActionSwitchPreference(remoteSettingId3)))
- val layout = underTest.getLayout()!!
+ val layout = underTest.getLayout(FragmentTypeModel.DeviceDetailsMainFragment)!!
assertThat(getLatestLayout(layout))
.isEqualTo(
diff --git a/tests/robotests/src/com/android/settings/development/TouchpadVisualizerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/TouchpadVisualizerPreferenceControllerTest.java
index 98c774e..826bae9 100644
--- a/tests/robotests/src/com/android/settings/development/TouchpadVisualizerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/TouchpadVisualizerPreferenceControllerTest.java
@@ -22,22 +22,35 @@
import static org.mockito.Mockito.when;
import android.content.Context;
-import android.provider.Settings;
+import android.hardware.input.InputSettings;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
+import com.android.hardware.input.Flags;
+import com.android.settings.testutils.shadow.ShadowSystemSettings;
+
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {
+ ShadowSystemSettings.class,
+})
public class TouchpadVisualizerPreferenceControllerTest {
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
@Mock
private PreferenceScreen mScreen;
@Mock
@@ -57,55 +70,52 @@
}
@Test
+ @EnableFlags({Flags.FLAG_TOUCHPAD_VISUALIZER})
public void updateState_touchpadVisualizerEnabled_shouldCheckedPreference() {
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.TOUCHPAD_VISUALIZER, ShowTapsPreferenceController.SETTING_VALUE_ON);
-
+ InputSettings.setTouchpadVisualizer(mContext, true);
mController.updateState(mPreference);
verify(mPreference).setChecked(true);
}
@Test
+ @EnableFlags({Flags.FLAG_TOUCHPAD_VISUALIZER})
public void updateState_touchpadVisualizerDisabled_shouldUncheckedPreference() {
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.TOUCHPAD_VISUALIZER,
- ShowTapsPreferenceController.SETTING_VALUE_OFF);
-
+ InputSettings.setTouchpadVisualizer(mContext, false);
mController.updateState(mPreference);
verify(mPreference).setChecked(false);
}
@Test
+ @EnableFlags({Flags.FLAG_TOUCHPAD_VISUALIZER})
public void onPreferenceChange_preferenceChecked_shouldEnableTouchpadVisualizer() {
mController.onPreferenceChange(mPreference, true /* new value */);
- final int touchpadVisualizer = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.TOUCHPAD_VISUALIZER, -1 /* default */);
+ final boolean touchpadVisualizer = InputSettings.useTouchpadVisualizer(mContext);
- assertThat(touchpadVisualizer).isEqualTo(ShowTapsPreferenceController.SETTING_VALUE_ON);
+ assertThat(touchpadVisualizer).isTrue();
}
@Test
+ @EnableFlags({Flags.FLAG_TOUCHPAD_VISUALIZER})
public void onPreferenceChange_preferenceUnchecked_shouldDisableTouchpadVisualizer() {
mController.onPreferenceChange(mPreference, false /* new value */);
- final int showTapsMode = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.TOUCHPAD_VISUALIZER, -1 /* default */);
+ final boolean touchpadVisualizer = InputSettings.useTouchpadVisualizer(mContext);
- assertThat(showTapsMode).isEqualTo(ShowTapsPreferenceController.SETTING_VALUE_OFF);
+ assertThat(touchpadVisualizer).isFalse();
}
@Test
+ @EnableFlags({Flags.FLAG_TOUCHPAD_VISUALIZER})
public void onDeveloperOptionsSwitchDisabled_preferenceShouldBeEnabled() {
mController.onDeveloperOptionsSwitchDisabled();
- final int showTapsMode = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.TOUCHPAD_VISUALIZER, -1 /* default */);
+ final boolean touchpadVisualizer = InputSettings.useTouchpadVisualizer(mContext);
- assertThat(showTapsMode).isEqualTo(ShowTapsPreferenceController.SETTING_VALUE_OFF);
+ assertThat(touchpadVisualizer).isFalse();
verify(mPreference).setEnabled(false);
verify(mPreference).setChecked(false);
}
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/notification/modes/InterruptionFilterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/InterruptionFilterPreferenceControllerTest.java
index 0c3f8e1..777d213 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/InterruptionFilterPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/InterruptionFilterPreferenceControllerTest.java
@@ -87,7 +87,7 @@
.build();
mController.updateZenMode(preference, zenMode);
- verify(preference).setChecked(false);
+ verify(preference).setChecked(true);
}
@Test
@@ -99,7 +99,7 @@
mController.updateZenMode(preference, zenMode);
- mController.onPreferenceChange(preference, true);
+ mController.onPreferenceChange(preference, false);
ArgumentCaptor<ZenMode> captor = ArgumentCaptor.forClass(ZenMode.class);
verify(mBackend).updateMode(captor.capture());
@@ -118,7 +118,7 @@
.build();
mController.updateZenMode(preference, zenMode);
- verify(preference).setChecked(true);
+ verify(preference).setChecked(false);
}
@Test
@@ -131,7 +131,7 @@
mController.updateZenMode(preference, zenMode);
- mController.onPreferenceChange(preference, false);
+ mController.onPreferenceChange(preference, true);
ArgumentCaptor<ZenMode> captor = ArgumentCaptor.forClass(ZenMode.class);
verify(mBackend).updateMode(captor.capture());
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ManualDurationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ManualDurationPreferenceControllerTest.java
index 29fdfdd..4edb0d5 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ManualDurationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ManualDurationPreferenceControllerTest.java
@@ -18,11 +18,9 @@
import static com.google.common.truth.Truth.assertThat;
-import android.app.AutomaticZenRule;
import android.app.Flags;
import android.content.ContentResolver;
import android.content.Context;
-import android.net.Uri;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
@@ -31,7 +29,6 @@
import androidx.preference.Preference;
import com.android.settingslib.notification.modes.TestModeBuilder;
-import com.android.settingslib.notification.modes.ZenMode;
import com.android.settingslib.notification.modes.ZenModesBackend;
import org.junit.Before;
@@ -73,10 +70,8 @@
@Test
public void testIsAvailable_onlyForManualDnd() {
assertThat(mPrefController.isAvailable(TestModeBuilder.EXAMPLE)).isFalse();
-
- ZenMode manualDnd = ZenMode.manualDndMode(
- new AutomaticZenRule.Builder("id", Uri.EMPTY).build(), false);
- assertThat(mPrefController.isAvailable(manualDnd)).isTrue();
+ assertThat(mPrefController.isAvailable(TestModeBuilder.MANUAL_DND_ACTIVE)).isTrue();
+ assertThat(mPrefController.isAvailable(TestModeBuilder.MANUAL_DND_INACTIVE)).isTrue();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeButtonPreferenceControllerTest.java
index 47078b0..159dada 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeButtonPreferenceControllerTest.java
@@ -23,11 +23,9 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.app.AutomaticZenRule;
import android.app.Flags;
import android.content.ContentResolver;
import android.content.Context;
-import android.net.Uri;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
@@ -192,8 +190,7 @@
Button button = new Button(mContext);
LayoutPreference pref = mock(LayoutPreference.class);
when(pref.findViewById(anyInt())).thenReturn(button);
- ZenMode zenMode = ZenMode.manualDndMode(
- new AutomaticZenRule.Builder("manual", Uri.EMPTY).build(), false);
+ ZenMode zenMode = TestModeBuilder.MANUAL_DND_INACTIVE;
mController.updateZenMode(pref, zenMode);
button.callOnClick();
@@ -207,8 +204,7 @@
Button button = new Button(mContext);
LayoutPreference pref = mock(LayoutPreference.class);
when(pref.findViewById(anyInt())).thenReturn(button);
- ZenMode zenMode = ZenMode.manualDndMode(
- new AutomaticZenRule.Builder("manual", Uri.EMPTY).build(), false);
+ ZenMode zenMode = TestModeBuilder.MANUAL_DND_INACTIVE;
mController.updateZenMode(pref, zenMode);
button.callOnClick();
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerAddPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerAddPreferenceControllerTest.java
index a56e723..0d20b19 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerAddPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerAddPreferenceControllerTest.java
@@ -19,7 +19,6 @@
import static android.app.AutomaticZenRule.TYPE_OTHER;
import static android.app.AutomaticZenRule.TYPE_SCHEDULE_CALENDAR;
import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME;
-import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY;
import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
import static com.android.settings.notification.modes.CharSequenceTruth.assertThat;
@@ -28,7 +27,6 @@
import static org.mockito.Mockito.verify;
-import android.app.AutomaticZenRule;
import android.app.Flags;
import android.content.Context;
import android.net.Uri;
@@ -125,12 +123,7 @@
@Test
public void isAvailable_manualDND_false() {
- ZenMode manualMode = ZenMode.manualDndMode(new AutomaticZenRule.Builder("Do Not Disturb",
- Uri.parse("manual"))
- .setInterruptionFilter(INTERRUPTION_FILTER_PRIORITY)
- .build(), /* isActive= */ false);
-
- mController.setZenMode(manualMode);
+ mController.setZenMode(TestModeBuilder.MANUAL_DND_INACTIVE);
assertThat(mController.isAvailable()).isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerCategoryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerCategoryPreferenceControllerTest.java
index 4510e20..bcafe47 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerCategoryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerCategoryPreferenceControllerTest.java
@@ -18,15 +18,12 @@
import static android.app.AutomaticZenRule.TYPE_OTHER;
import static android.app.AutomaticZenRule.TYPE_SCHEDULE_CALENDAR;
-import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY;
import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
import static com.google.common.truth.Truth.assertThat;
-import android.app.AutomaticZenRule;
import android.app.Flags;
import android.content.Context;
-import android.net.Uri;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.service.notification.SystemZenRules;
@@ -116,12 +113,7 @@
@Test
public void isAvailable_manualDND_false() {
- ZenMode manualMode = ZenMode.manualDndMode(new AutomaticZenRule.Builder("Do Not Disturb",
- Uri.parse("manual"))
- .setInterruptionFilter(INTERRUPTION_FILTER_PRIORITY)
- .build(), /* isActive= */ false);
-
- mController.setZenMode(manualMode);
+ mController.setZenMode(TestModeBuilder.MANUAL_DND_INACTIVE);
assertThat(mController.isAvailable()).isFalse();
}
}
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerUpdatePreferenceControllerTest.java
index 80d314c..b7af71b 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerUpdatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeTriggerUpdatePreferenceControllerTest.java
@@ -19,7 +19,6 @@
import static android.app.AutomaticZenRule.TYPE_OTHER;
import static android.app.AutomaticZenRule.TYPE_SCHEDULE_CALENDAR;
import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME;
-import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY;
import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
import static com.android.settings.notification.modes.CharSequenceTruth.assertThat;
@@ -35,13 +34,11 @@
import static org.robolectric.Shadows.shadowOf;
import android.app.AlertDialog;
-import android.app.AutomaticZenRule;
import android.app.Flags;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.net.Uri;
import android.os.Looper;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
@@ -149,12 +146,7 @@
@Test
public void isAvailable_manualDND_false() {
- ZenMode manualMode = ZenMode.manualDndMode(new AutomaticZenRule.Builder("Do Not Disturb",
- Uri.parse("manual"))
- .setInterruptionFilter(INTERRUPTION_FILTER_PRIORITY)
- .build(), /* isActive= */ false);
-
- mController.setZenMode(manualMode);
+ mController.setZenMode(TestModeBuilder.MANUAL_DND_INACTIVE);
assertThat(mController.isAvailable()).isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java
index 4c16f26..4fa8b8a 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java
@@ -18,6 +18,8 @@
import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY;
+import static com.android.settingslib.notification.modes.TestModeBuilder.MANUAL_DND_INACTIVE;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
@@ -71,13 +73,6 @@
.build())
.build();
- private static final ZenMode TEST_MANUAL_MODE = ZenMode.manualDndMode(
- new AutomaticZenRule.Builder("Do Not Disturb", Uri.EMPTY)
- .setInterruptionFilter(INTERRUPTION_FILTER_PRIORITY)
- .setZenPolicy(new ZenPolicy.Builder().allowAllSounds().build())
- .build(),
- false);
-
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(
SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT);
@@ -152,7 +147,7 @@
@DisableFlags(Flags.FLAG_MODES_UI)
public void testModesUiOff_notAvailableAndNoSearchData() {
// There exist modes
- when(mBackend.getModes()).thenReturn(List.of(TEST_MANUAL_MODE, TEST_MODE));
+ when(mBackend.getModes()).thenReturn(List.of(MANUAL_DND_INACTIVE, TEST_MODE));
assertThat(mPrefController.isAvailable()).isFalse();
List<SearchIndexableRaw> data = new ArrayList<>();
@@ -187,20 +182,20 @@
// Changing mode data so there's a different one mode doesn't keep any previous data
// (and setting that state up in the caller)
- when(mBackend.getModes()).thenReturn(List.of(TEST_MANUAL_MODE));
+ when(mBackend.getModes()).thenReturn(List.of(MANUAL_DND_INACTIVE));
List<SearchIndexableRaw> newData = new ArrayList<>();
mPrefController.updateDynamicRawDataToIndex(newData);
assertThat(newData).hasSize(1);
SearchIndexableRaw newItem = newData.get(0);
- assertThat(newItem.key).isEqualTo(TEST_MANUAL_MODE.getId());
+ assertThat(newItem.key).isEqualTo(MANUAL_DND_INACTIVE.getId());
assertThat(newItem.title).isEqualTo("Do Not Disturb"); // set above
}
@Test
@EnableFlags(Flags.FLAG_MODES_UI)
public void testUpdateDynamicRawDataToIndex_multipleModes() {
- when(mBackend.getModes()).thenReturn(List.of(TEST_MANUAL_MODE, TEST_MODE));
+ when(mBackend.getModes()).thenReturn(List.of(MANUAL_DND_INACTIVE, TEST_MODE));
List<SearchIndexableRaw> data = new ArrayList<>();
mPrefController.updateDynamicRawDataToIndex(data);
@@ -208,7 +203,7 @@
// Should keep the order presented by getModes()
SearchIndexableRaw item0 = data.get(0);
- assertThat(item0.key).isEqualTo(TEST_MANUAL_MODE.getId());
+ assertThat(item0.key).isEqualTo(MANUAL_DND_INACTIVE.getId());
assertThat(item0.title).isEqualTo("Do Not Disturb"); // set above
SearchIndexableRaw item1 = data.get(1);
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.kt
new file mode 100644
index 0000000..ed6c027
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2024 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.network.telephony
+
+import android.content.Context
+import android.telephony.CarrierConfigManager
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class CarrierSettingsVersionPreferenceControllerTest {
+
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ private val controller =
+ CarrierSettingsVersionPreferenceController(context, TEST_KEY).apply { init(SUB_ID) }
+
+ @Before
+ fun setUp() {
+ CarrierConfigRepository.resetForTest()
+ }
+
+ @Test
+ fun getSummary_nullConfig_noCrash() {
+ controller.getSummary()
+ }
+
+ @Test
+ fun getSummary_nullVersionString_returnNull() {
+ CarrierConfigRepository.setStringForTest(
+ SUB_ID, CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING, null)
+
+ val summary = controller.getSummary()
+
+ assertThat(summary).isNull()
+ }
+
+ @Test
+ fun getSummary_hasVersionString_returnCorrectSummary() {
+ CarrierConfigRepository.setStringForTest(
+ SUB_ID, CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING, "test_version_123")
+
+ val summary = controller.getSummary()
+
+ assertThat(summary).isEqualTo("test_version_123")
+ }
+
+ private companion object {
+ const val TEST_KEY = "test_key"
+ const val SUB_ID = 10
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/ims/ImsFeatureRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/ims/ImsFeatureRepositoryTest.kt
new file mode 100644
index 0000000..3f72b2c
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/ims/ImsFeatureRepositoryTest.kt
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2024 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.network.telephony.ims
+
+import android.content.Context
+import android.telephony.AccessNetworkConstants
+import android.telephony.ims.feature.MmTelFeature
+import android.telephony.ims.stub.ImsRegistrationImplBase
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.stub
+
+@RunWith(AndroidJUnit4::class)
+class ImsFeatureRepositoryTest {
+
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ private val mockProvisioningRepository = mock<ProvisioningRepository>()
+ private val mockImsMmTelRepository = mock<ImsMmTelRepository>()
+
+ @Test
+ fun isReadyFlow_notProvisioned_returnFalse() = runBlocking {
+ mockProvisioningRepository.stub {
+ onBlocking { imsFeatureProvisionedFlow(SUB_ID, CAPABILITY, TECH) } doReturn
+ flowOf(false)
+ }
+
+ val repository =
+ ImsFeatureRepository(
+ context = context,
+ subId = SUB_ID,
+ provisioningRepository = mockProvisioningRepository,
+ )
+
+ val isReady = repository.isReadyFlow(CAPABILITY, TECH, TRANSPORT_TYPE).first()
+
+ assertThat(isReady).isFalse()
+ }
+
+ @Test
+ fun isReadyFlow_notSupported_returnFalse() = runBlocking {
+ mockImsMmTelRepository.stub {
+ onBlocking { isSupportedFlow(CAPABILITY, TRANSPORT_TYPE) } doReturn flowOf(false)
+ }
+
+ val repository =
+ ImsFeatureRepository(
+ context = context,
+ subId = SUB_ID,
+ imsMmTelRepository = mockImsMmTelRepository,
+ )
+
+ val isReady = repository.isReadyFlow(CAPABILITY, TECH, TRANSPORT_TYPE).first()
+
+ assertThat(isReady).isFalse()
+ }
+
+ @Test
+ fun isReadyFlow_provisionedAndSupported_returnFalse() = runBlocking {
+ mockProvisioningRepository.stub {
+ onBlocking { imsFeatureProvisionedFlow(SUB_ID, CAPABILITY, TECH) } doReturn flowOf(true)
+ }
+ mockImsMmTelRepository.stub {
+ onBlocking { isSupportedFlow(CAPABILITY, TRANSPORT_TYPE) } doReturn flowOf(true)
+ }
+
+ val repository =
+ ImsFeatureRepository(
+ context = context,
+ subId = SUB_ID,
+ provisioningRepository = mockProvisioningRepository,
+ imsMmTelRepository = mockImsMmTelRepository,
+ )
+
+ val isReady = repository.isReadyFlow(CAPABILITY, TECH, TRANSPORT_TYPE).first()
+
+ assertThat(isReady).isTrue()
+ }
+
+ private companion object {
+ const val SUB_ID = 10
+ const val CAPABILITY = MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE
+ const val TECH = ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN
+ const val TRANSPORT_TYPE = AccessNetworkConstants.TRANSPORT_TYPE_WLAN
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/wificalling/WifiCallingRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/wificalling/WifiCallingRepositoryTest.kt
index 0144f66..f0a23eb 100644
--- a/tests/spa_unit/src/com/android/settings/network/telephony/wificalling/WifiCallingRepositoryTest.kt
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/wificalling/WifiCallingRepositoryTest.kt
@@ -55,7 +55,8 @@
on { getWiFiCallingMode(any()) } doReturn ImsMmTelManager.WIFI_MODE_UNKNOWN
}
- private val repository = WifiCallingRepository(context, SUB_ID, mockImsMmTelRepository)
+ private val repository =
+ WifiCallingRepository(context, SUB_ID, imsMmTelRepository = mockImsMmTelRepository)
@Test
fun getWiFiCallingMode_roamingAndNotUseWfcHomeModeForRoaming_returnRoamingSetting() {
diff --git a/tests/unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.java
deleted file mode 100644
index 40be07f..0000000
--- a/tests/unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2020 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.network.telephony;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.network.CarrierConfigCache;
-
-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 CarrierSettingsVersionPreferenceControllerTest {
- @Mock
- private CarrierConfigCache mCarrierConfigCache;
-
- private CarrierSettingsVersionPreferenceController mController;
- private int mSubscriptionId = 1234;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- Context context = spy(ApplicationProvider.getApplicationContext());
- CarrierConfigCache.setTestInstance(context, mCarrierConfigCache);
- mController = new CarrierSettingsVersionPreferenceController(context, "mock_key");
- mController.init(mSubscriptionId);
- }
-
- @Test
- public void getSummary_nullConfig_noCrash() {
- doReturn(null).when(mCarrierConfigCache).getConfigForSubId(mSubscriptionId);
-
- assertThat(mController.getSummary()).isNull();
- }
-
- @Test
- public void getSummary_nullVersionString_noCrash() {
- doReturn(new PersistableBundle()).when(mCarrierConfigCache)
- .getConfigForSubId(mSubscriptionId);
- assertThat(mController.getSummary()).isNull();
- }
-
- @Test
- public void getSummary_hasVersionString_correctSummary() {
- final PersistableBundle bundle = new PersistableBundle();
- bundle.putString(CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING,
- "test_version_123");
- doReturn(bundle).when(mCarrierConfigCache).getConfigForSubId(mSubscriptionId);
-
- assertThat(mController.getSummary()).isEqualTo("test_version_123");
- }
-}